summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorultima-soul <akshayjhanji@hotmail.com>2020-03-13 00:32:04 -0700
committerultima-soul <akshayjhanji@hotmail.com>2020-03-13 00:32:04 -0700
commit99e4de062ae43aa978ad4f1a8cd70bc739c64c9d (patch)
tree1164d31577e6ebddc1cb313d40bb69ce0d426170 /src
parent339c2914affc3c62ac9a5725aa1a0c7ccc3161ca (diff)
parent6af8c04d8fa6aaeaeb6c8b919e7770a65b9a883d (diff)
Merge branch 'master' into event_object_movement
Diffstat (limited to 'src')
-rw-r--r--src/AgbRfu_LinkManager.c1398
-rw-r--r--src/bag.c2
-rw-r--r--src/battle_anim_effects_1.c6
-rw-r--r--src/battle_anim_effects_2.c1
-rw-r--r--src/battle_anim_sound_tasks.c4
-rw-r--r--src/battle_bg.c1076
-rw-r--r--src/battle_controller_link_opponent.c15
-rw-r--r--src/battle_controller_link_partner.c8
-rw-r--r--src/battle_controller_opponent.c8
-rw-r--r--src/battle_controller_player.c6
-rw-r--r--src/battle_controller_pokedude.c110
-rw-r--r--src/battle_controller_safari.c4
-rw-r--r--src/battle_controllers.c4
-rw-r--r--src/battle_gfx_sfx_util.c4
-rw-r--r--src/battle_interface.c1
-rw-r--r--src/battle_main.c25
-rw-r--r--src/battle_message.c26
-rw-r--r--src/battle_records.c8
-rw-r--r--src/battle_script_commands.c5
-rw-r--r--src/battle_setup.c43
-rw-r--r--src/battle_tower.c22
-rw-r--r--src/battle_transition.c6
-rw-r--r--src/battle_util2.c1
-rw-r--r--src/berry_crush.c228
-rw-r--r--src/berry_crush_2.c1480
-rw-r--r--src/berry_crush_3.c1386
-rw-r--r--src/berry_fix_program.c5
-rw-r--r--src/berry_pouch.c4
-rw-r--r--src/berry_powder.c4
-rw-r--r--src/cable_club.c964
-rw-r--r--src/cereader_tool.c34
-rw-r--r--src/clear_save_data_screen.c224
-rw-r--r--src/coins.c3
-rw-r--r--src/credits.c7
-rw-r--r--src/data/dodrio_berry_picking.h247
-rw-r--r--src/data/graphics/battle_terrain.h30
-rw-r--r--src/data/graphics/interface_pokeballs.h37
-rw-r--r--src/data/graphics/items.h672
-rw-r--r--src/data/graphics/mail.h38
-rw-r--r--src/data/graphics/pokemon.h2833
-rw-r--r--src/data/graphics/trainers.h456
-rw-r--r--src/data/pokemon/trainer_class_lookups.h16
-rw-r--r--src/data/pokemon_graphics/palette_table.h3
-rw-r--r--src/data/text/quest_log.h125
-rw-r--r--src/data/text/teachy_tv.h198
-rw-r--r--src/data/trainers.h1484
-rw-r--r--src/daycare.c7
-rw-r--r--src/decompress.c1
-rw-r--r--src/digit_obj_util.c452
-rw-r--r--src/diploma.c2
-rw-r--r--src/dodrio_berry_picking.c2902
-rw-r--r--src/dodrio_berry_picking_2.c1620
-rw-r--r--src/dodrio_berry_picking_3.c241
-rw-r--r--src/dynamic_placeholder_text_util.c86
-rw-r--r--src/easy_chat.c17
-rw-r--r--src/easy_chat_2.c1363
-rw-r--r--src/easy_chat_3.c2298
-rw-r--r--src/ereader_helpers.c159
-rw-r--r--src/event_data.c8
-rw-r--r--src/event_object_80688E4.c653
-rw-r--r--src/event_object_lock.c8
-rw-r--r--src/event_object_movement.c292
-rw-r--r--src/evolution_scene.c2
-rw-r--r--src/fame_checker.c4
-rw-r--r--src/field_camera.c572
-rw-r--r--src/field_door.c512
-rw-r--r--src/field_effect.c3909
-rw-r--r--src/field_effect_helpers.c1411
-rw-r--r--src/field_fadetransition.c133
-rw-r--r--src/field_message_box.c140
-rw-r--r--src/field_poison.c25
-rw-r--r--src/field_screen_effect.c6
-rw-r--r--src/field_special_scene.c3
-rw-r--r--src/field_specials.c359
-rw-r--r--src/field_tasks.c46
-rw-r--r--src/fieldmap.c118
-rw-r--r--src/fldeff_berrytree.c4
-rw-r--r--src/fldeff_cut.c299
-rw-r--r--src/fldeff_dig.c4
-rw-r--r--src/fldeff_flash.c479
-rw-r--r--src/fldeff_rocksmash.c58
-rw-r--r--src/fldeff_softboiled.c1
-rw-r--r--src/fldeff_strength.c21
-rw-r--r--src/fldeff_sweetscent.c3
-rw-r--r--src/fldeff_teleport.c2
-rw-r--r--src/flying.c2
-rw-r--r--src/graphics.c1419
-rw-r--r--src/heal_location.c8
-rw-r--r--src/help_system.c68
-rw-r--r--src/help_system_812B1E0.c3127
-rw-r--r--src/hof_pc.c3
-rw-r--r--src/ice.c2
-rw-r--r--src/intro.c4
-rw-r--r--src/item.c2
-rw-r--r--src/item_menu.c10
-rw-r--r--src/item_pc.c6
-rw-r--r--src/item_use.c19
-rw-r--r--src/itemfinder.c1
-rw-r--r--src/keyboard_text.c61
-rw-r--r--src/learn_move.c2
-rw-r--r--src/librfu_intr.c402
-rw-r--r--src/librfu_rfu.c1790
-rw-r--r--src/librfu_sio32id.c142
-rw-r--r--src/librfu_stwi.c81
-rw-r--r--src/link.c142
-rw-r--r--src/link_rfu.c1381
-rw-r--r--src/link_rfu_2.c1535
-rw-r--r--src/link_rfu_3.c207
-rw-r--r--src/list_menu.c14
-rw-r--r--src/load_save.c5
-rw-r--r--src/mail.c6
-rw-r--r--src/main.c9
-rw-r--r--src/map_preview_screen.c144
-rw-r--r--src/menews_jisan.c2
-rw-r--r--src/menu.c8
-rw-r--r--src/menu_indicators.c1
-rw-r--r--src/metatile_behavior.c41
-rw-r--r--src/mevent.c449
-rw-r--r--src/mevent_8145654.c793
-rw-r--r--src/mevent_client.c9
-rw-r--r--src/mevent_server.c8
-rw-r--r--src/mevent_server_helpers.c7
-rw-r--r--src/mevent_show_card.c456
-rw-r--r--src/mevent_show_news.c357
-rw-r--r--src/minigame_countdown.c (renamed from src/unk_815F138.c)171
-rw-r--r--src/mystery_event_script.c1
-rw-r--r--src/mystery_gift_menu.c17
-rw-r--r--src/naming_screen.c2401
-rw-r--r--src/new_game.c3
-rw-r--r--src/new_menu_helpers.c4
-rw-r--r--src/oak_speech.c8
-rw-r--r--src/option_menu.c2
-rw-r--r--src/palette.c2
-rw-r--r--src/party_menu.c25
-rw-r--r--src/party_menu_specials.c15
-rw-r--r--src/player_pc.c53
-rw-r--r--src/pokeball.c1
-rw-r--r--src/pokedex_screen.c10
-rw-r--r--src/pokemon.c15
-rw-r--r--src/pokemon_jump.c254
-rw-r--r--src/pokemon_jump_2.c2035
-rw-r--r--src/pokemon_jump_3.c167
-rw-r--r--src/pokemon_jump_4.c922
-rw-r--r--src/pokemon_jump_5.c637
-rw-r--r--src/pokemon_jump_6.c140
-rw-r--r--src/pokemon_size_record.c1
-rw-r--r--src/post_battle_event_funcs.c4
-rw-r--r--src/prof_pc.c78
-rw-r--r--src/quest_log.c504
-rw-r--r--src/quest_log_objects.c75
-rw-r--r--src/quest_log_player.c20
-rw-r--r--src/random.c1
-rw-r--r--src/region_map.c14
-rw-r--r--src/renewable_hidden_items.c6
-rw-r--r--src/reshow_battle_screen.c11
-rw-r--r--src/rfu_union_tool.c248
-rw-r--r--src/roamer.c5
-rw-r--r--src/rock.c2
-rw-r--r--src/safari_zone.c1
-rw-r--r--src/save.c6
-rw-r--r--src/save_failed_screen.c1
-rw-r--r--src/scanline_effect.c1
-rw-r--r--src/scrcmd.c450
-rw-r--r--src/script.c4
-rw-r--r--src/script_menu.c18
-rw-r--r--src/script_movement.c226
-rw-r--r--src/script_pokemon_util.c4
-rw-r--r--src/sea_cottage_special_anim.c264
-rw-r--r--src/seagallop.c4
-rw-r--r--src/shop.c11
-rw-r--r--src/slot_machine.c1
-rw-r--r--src/sound.c30
-rw-r--r--src/special_field_anim.c341
-rw-r--r--src/sprite.c120
-rw-r--r--src/ss_anne.c2
-rw-r--r--src/start_menu.c21
-rw-r--r--src/strings.c1335
-rw-r--r--src/teachy_tv.c2
-rw-r--r--src/text.c4
-rw-r--r--src/text_window.c1
-rw-r--r--src/tileset_anims.c18
-rw-r--r--src/title_screen.c2
-rw-r--r--src/tm_case.c7
-rw-r--r--src/trade.c59
-rw-r--r--src/trade_scene.c20
-rw-r--r--src/trainer_card.c1142
-rw-r--r--src/trainer_pokemon_sprites.c5
-rw-r--r--src/trainer_see.c751
-rw-r--r--src/trainer_tower.c841
-rw-r--r--src/trig.c1
-rw-r--r--src/union_room.c2647
-rw-r--r--src/union_room_battle.c53
-rw-r--r--src/union_room_chat.c16
-rw-r--r--src/union_room_message.c72
-rw-r--r--src/unk_815C980.c437
-rw-r--r--src/util.c1
-rw-r--r--src/vs_seeker.c133
-rw-r--r--src/wild_encounter.c44
-rw-r--r--src/wild_pokemon_area.c4
-rw-r--r--src/wireless_communication_status_screen.c280
200 files changed, 48983 insertions, 12453 deletions
diff --git a/src/AgbRfu_LinkManager.c b/src/AgbRfu_LinkManager.c
new file mode 100644
index 000000000..e4127ee09
--- /dev/null
+++ b/src/AgbRfu_LinkManager.c
@@ -0,0 +1,1398 @@
+#include "global.h"
+#include "librfu.h"
+#include "link_rfu.h"
+
+#define RN_ACCEPT 0x01
+#define RN_NAME_TIMER_CLEAR 0x02
+#define RN_DISCONNECT 0x04
+
+#define LINK_RECOVERY_OFF 0x00
+#define LINK_RECOVERY_START 0x01
+#define LINK_RECOVERY_EXE 0x02
+#define LINK_RECOVERY_IMPOSSIBLE 0x04
+
+#define FSP_ON 0x01
+#define FSP_START 0x02
+
+LINK_MANAGER lman;
+
+static void rfu_LMAN_clearVariables(void);
+static void rfu_LMAN_settingPCSWITCH(u32 rand);
+static void rfu_LMAN_REQ_callback(u16 reqCommandId, u16 reqResult);
+static void rfu_LMAN_MSC_callback(u16 reqCommandId);
+static void rfu_LMAN_PARENT_checkRecvChildName(void);
+static void rfu_LMAN_CHILD_checkSendChildName(void);
+static void rfu_LMAN_CHILD_checkSendChildName2(void);
+static void rfu_LMAN_CHILD_linkRecoveryProcess(void);
+static u8 rfu_LMAN_CHILD_checkEnableParentCandidate(void);
+static void rfu_LMAN_occureCallback(u8 msg, u8 param_count);
+static void rfu_LMAN_disconnect(u8 bmDisconnectSlot);
+static void rfu_LMAN_reflectCommunicationStatus(u8 bm_disconnectedSlot);
+static void rfu_LMAN_checkNICommunicateStatus(void);
+static void rfu_LMAN_managerChangeAgbClockMaster(void);
+
+u32 rfu_LMAN_REQBN_softReset_and_checkID(void)
+{
+ u32 id = rfu_REQBN_softReset_and_checkID();
+ if (id == RFU_ID)
+ lman.RFU_powerOn_flag = 1;
+ if (lman.state != LMAN_FORCED_STOP_AND_RFU_RESET && lman.state != LMAN_STATE_SOFT_RESET_AND_CHECK_ID)
+ {
+ lman.state = lman.next_state = LMAN_STATE_READY;
+ }
+ lman.pcswitch_flag = 0;
+ lman.reserveDisconnectSlot_flag = 0;
+ lman.acceptCount = 0;
+ lman.acceptSlot_flag = 0;
+ lman.parent_child = MODE_NEUTRAL;
+ rfu_LMAN_managerChangeAgbClockMaster();
+ return id;
+}
+
+void rfu_LMAN_REQ_sendData(u8 clockChangeFlag)
+{
+ if (gRfuLinkStatus->parentChild == MODE_CHILD)
+ {
+ if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_ON)
+ clockChangeFlag = TRUE;
+ else
+ clockChangeFlag = FALSE;
+ }
+ else
+ lman.parentAck_flag = 0;
+ rfu_REQ_sendData(clockChangeFlag);
+}
+
+u8 rfu_LMAN_initializeManager(void (*LMAN_callback_p)(u8, u8), void (*MSC_callback_p)(u16))
+{
+ if (LMAN_callback_p == NULL)
+ {
+ return LMAN_ERROR_ILLEGAL_PARAMETER;
+ }
+ CpuFill16(0, &lman, sizeof(struct linkManagerTag));
+ lman.parent_child = MODE_NEUTRAL;
+ lman.LMAN_callback = LMAN_callback_p;
+ lman.MSC_callback = MSC_callback_p;
+ rfu_setMSCCallback(rfu_LMAN_MSC_callback);
+ rfu_setREQCallback(rfu_LMAN_REQ_callback);
+ return 0;
+}
+
+static void rfu_LMAN_endManager(void)
+{
+ CpuFill16(0, &lman, sizeof(struct linkManagerTag) - 8);
+ lman.parent_child = MODE_NEUTRAL;
+}
+
+void rfu_LMAN_initializeRFU(INIT_PARAM *init_parameters)
+{
+ rfu_LMAN_clearVariables();
+ lman.state = LMAN_STATE_SOFT_RESET_AND_CHECK_ID;
+ lman.next_state = LMAN_STATE_RESET;
+ lman.init_param = init_parameters;
+ lman.linkRecovery_enable = init_parameters->linkRecovery_enable;
+ lman.linkRecoveryTimer.count_max = init_parameters->linkRecovery_period;
+ lman.NI_failCounter_limit = init_parameters->NI_failCounter_limit;
+ if (init_parameters->fastSearchParent_flag)
+ {
+ lman.fastSearchParent_flag = FSP_ON;
+ }
+}
+
+static void rfu_LMAN_clearVariables(void)
+{
+ u8 i;
+
+ lman.state = lman.next_state = LMAN_STATE_READY;
+ lman.parent_child = MODE_NEUTRAL;
+ lman.pcswitch_flag = 0;
+ lman.child_slot = 0;
+ lman.connectSlot_flag_old = 0;
+ lman.nameAcceptTimer.active = 0;
+ lman.linkRecoveryTimer.active = 0;
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ {
+ lman.nameAcceptTimer.count[i] = 0;
+ lman.linkRecoveryTimer.count[i] = 0;
+ }
+}
+
+void rfu_LMAN_powerDownRFU(void)
+{
+ lman.state = LMAN_STATE_STOP_MODE;
+}
+
+u8 rfu_LMAN_establishConnection(u8 parent_child, u16 connect_period, u16 name_accept_period, u16 *acceptable_serialNo_list)
+{
+ u8 i;
+ u16 *serial_list;
+
+ if (lman.state != LMAN_STATE_READY && (lman.state != LMAN_STATE_WAIT_RECV_CHILD_NAME || parent_child != MODE_PARENT))
+ {
+ lman.param[0] = 1;
+ rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1);
+ return LMAN_ERROR_MANAGER_BUSY;
+ }
+ if (rfu_getMasterSlave() == AGB_CLK_SLAVE)
+ {
+ lman.param[0] = 2;
+ rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1);
+ return LMAN_ERROR_AGB_CLK_SLAVE;
+ }
+ for (i = 0, serial_list = acceptable_serialNo_list; i < 16; i++)
+ {
+ if (*serial_list++ == 0xFFFF)
+ {
+ break;
+ }
+ }
+ if (i == 16)
+ {
+ lman.param[0] = 4;
+ rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1);
+ return LMAN_ERROR_ILLEGAL_PARAMETER;
+ }
+ if (parent_child > MODE_PARENT)
+ {
+ lman.pcswitch_flag = PCSWITCH_1ST_SC_START;
+ parent_child = MODE_PARENT;
+ connect_period = 0;
+ }
+ else
+ {
+ lman.pcswitch_flag = 0;
+ }
+ if (parent_child != MODE_CHILD)
+ {
+ lman.state = LMAN_STATE_START_SEARCH_CHILD;
+ }
+ else
+ {
+ lman.state = LMAN_STATE_START_SEARCH_PARENT;
+ if (lman.fastSearchParent_flag)
+ {
+ lman.fastSearchParent_flag = FSP_START;
+ }
+ }
+ lman.parent_child = parent_child;
+ lman.connect_period = connect_period;
+ lman.nameAcceptTimer.count_max = name_accept_period;
+ lman.acceptable_serialNo_list = acceptable_serialNo_list;
+ return 0;
+}
+
+u8 rfu_LMAN_CHILD_connectParent(u16 parentId, u16 connect_period)
+{
+ u8 i;
+
+ if (lman.state != LMAN_STATE_READY && (lman.state < 9 || lman.state > 11))
+ {
+ lman.param[0] = 1;
+ rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1);
+ return LMAN_ERROR_MANAGER_BUSY;
+ }
+ if (rfu_getMasterSlave() == AGB_CLK_SLAVE)
+ {
+ lman.param[0] = 2;
+ rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1);
+ return LMAN_ERROR_AGB_CLK_SLAVE;
+ }
+ for (i = 0; i < gRfuLinkStatus->findParentCount; i++)
+ {
+ if (gRfuLinkStatus->partner[i].id == parentId)
+ {
+ break;
+ }
+ }
+ if (gRfuLinkStatus->findParentCount == 0 || i == gRfuLinkStatus->findParentCount)
+ {
+ lman.param[0] = 3;
+ rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1);
+ return LMAN_ERROR_PID_NOT_FOUND;
+ }
+ if (lman.state == LMAN_STATE_READY || lman.state == LMAN_STATE_START_SEARCH_PARENT)
+ {
+ lman.state = LMAN_STATE_START_CONNECT_PARENT;
+ lman.next_state = LMAN_STATE_POLL_CONNECT_PARENT;
+ }
+ else
+ {
+ lman.state = LMAN_STATE_END_SEARCH_PARENT;
+ lman.next_state = LMAN_STATE_START_CONNECT_PARENT;
+ }
+ lman.work = parentId;
+ lman.connect_period = connect_period;
+ if (lman.pcswitch_flag != 0)
+ {
+ lman.pcswitch_flag = PCSWITCH_CP;
+ }
+ return 0;
+}
+
+static void rfu_LMAN_PARENT_stopWaitLinkRecoveryAndDisconnect(u8 bm_targetSlot)
+{
+ u8 i;
+
+ if ((bm_targetSlot & lman.linkRecoveryTimer.active) == 0)
+ return;
+ lman.linkRecoveryTimer.active &= ~bm_targetSlot;
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ {
+ if ((bm_targetSlot >> i) & 1)
+ {
+ lman.linkRecoveryTimer.count[i] = 0;
+ }
+ }
+ i = gRfuLinkStatus->linkLossSlotFlag & bm_targetSlot;
+ if (i)
+ {
+ rfu_LMAN_disconnect(i);
+ }
+ lman.param[0] = i;
+ rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, i);
+}
+
+void rfu_LMAN_stopManager(u8 forced_stop_and_RFU_reset_flag)
+{
+ u8 msg = 0;
+ lman.pcswitch_flag = 0;
+ if (forced_stop_and_RFU_reset_flag)
+ {
+ rfu_LMAN_clearVariables();
+ lman.state = LMAN_FORCED_STOP_AND_RFU_RESET;
+ return;
+ }
+ switch (lman.state)
+ {
+ case LMAN_STATE_START_SEARCH_CHILD:
+ lman.state = LMAN_STATE_WAIT_RECV_CHILD_NAME;
+ lman.next_state = LMAN_STATE_READY;
+ msg = LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED;
+ break;
+ case LMAN_STATE_POLL_SEARCH_CHILD:
+ lman.state = LMAN_STATE_END_SEARCH_CHILD;
+ lman.next_state = LMAN_STATE_WAIT_RECV_CHILD_NAME;
+ break;
+ case LMAN_STATE_END_SEARCH_CHILD:
+ lman.state = LMAN_STATE_END_SEARCH_CHILD;
+ lman.next_state = LMAN_STATE_WAIT_RECV_CHILD_NAME;
+ break;
+ case LMAN_STATE_WAIT_RECV_CHILD_NAME:
+ break;
+ case LMAN_STATE_START_SEARCH_PARENT:
+ lman.state = lman.next_state = LMAN_STATE_READY;
+ msg = LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED;
+ break;
+ case LMAN_STATE_POLL_SEARCH_PARENT:
+ lman.state = LMAN_STATE_END_SEARCH_PARENT;
+ lman.next_state = LMAN_STATE_READY;
+ break;
+ case LMAN_STATE_END_SEARCH_PARENT:
+ lman.state = LMAN_STATE_END_SEARCH_PARENT;
+ lman.next_state = LMAN_STATE_READY;
+ break;
+ case LMAN_STATE_START_CONNECT_PARENT:
+ lman.state = lman.next_state = LMAN_STATE_READY;
+ msg = LMAN_MSG_CONNECT_PARENT_FAILED;
+ break;
+ case LMAN_STATE_POLL_CONNECT_PARENT:
+ lman.state = LMAN_STATE_END_CONNECT_PARENT;
+ break;
+ case LMAN_STATE_END_CONNECT_PARENT:
+ lman.state = LMAN_STATE_END_CONNECT_PARENT;
+ break;
+ case LMAN_STATE_SEND_CHILD_NAME:
+ break;
+ case LMAN_STATE_START_LINK_RECOVERY:
+ lman.state = lman.state_bak[0];
+ lman.next_state = lman.state_bak[1];
+ rfu_LMAN_disconnect(gRfuLinkStatus->linkLossSlotFlag);
+ lman.param[0] = gRfuLinkStatus->linkLossSlotFlag;
+ rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, 1);
+ return;
+ case LMAN_STATE_POLL_LINK_RECOVERY:
+ lman.state = LMAN_STATE_END_LINK_RECOVERY;
+ break;
+ case LMAN_STATE_END_LINK_RECOVERY:
+ lman.state = LMAN_STATE_END_LINK_RECOVERY;
+ break;
+ default:
+ lman.state = lman.next_state = LMAN_STATE_READY;
+ msg = LMAN_MSG_MANAGER_STOPPED;
+ break;
+ }
+ if (lman.state == LMAN_STATE_READY)
+ {
+ rfu_LMAN_occureCallback(msg, 0);
+ }
+}
+
+static bool8 rfu_LMAN_linkWatcher(u16 REQ_commandID)
+{
+ u8 i;
+ u8 bm_linkLossSlot;
+ u8 reason;
+ u8 bm_linkRecoverySlot;
+ u8 bm_disconnectSlot;
+
+ bool8 disconnect_occure_flag = FALSE;
+ rfu_REQBN_watchLink(REQ_commandID, &bm_linkLossSlot, &reason, &bm_linkRecoverySlot);
+ if (bm_linkLossSlot)
+ {
+ lman.param[0] = bm_linkLossSlot;
+ lman.param[1] = reason;
+ if (lman.linkRecovery_enable)
+ {
+ lman.linkRecovery_start_flag = LINK_RECOVERY_START;
+ if (lman.parent_child == MODE_CHILD && reason == REASON_DISCONNECTED)
+ {
+ lman.linkRecovery_start_flag = LINK_RECOVERY_IMPOSSIBLE;
+ }
+ if (lman.linkRecovery_start_flag == LINK_RECOVERY_START)
+ {
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ {
+ if ((bm_linkLossSlot >> i) & 1)
+ {
+ lman.linkRecoveryTimer.active |= (1 << i);
+ lman.linkRecoveryTimer.count[i] = lman.linkRecoveryTimer.count_max;
+ }
+ }
+ rfu_LMAN_occureCallback(LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY, 1);
+ }
+ else
+ {
+ lman.linkRecovery_start_flag = 0;
+ rfu_LMAN_disconnect(bm_linkLossSlot);
+ disconnect_occure_flag = TRUE;
+ rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, 1);
+ }
+ }
+ else
+ {
+ rfu_LMAN_disconnect(bm_linkLossSlot);
+ disconnect_occure_flag = TRUE;
+ rfu_LMAN_occureCallback(LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED, 2);
+ }
+ rfu_LMAN_managerChangeAgbClockMaster();
+ }
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
+ {
+ if (bm_linkRecoverySlot)
+ {
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ {
+ if ((lman.linkRecoveryTimer.active >> i) & 1 && (bm_linkRecoverySlot >> i) & 1)
+ {
+ lman.linkRecoveryTimer.count[i] = 0;
+ }
+ }
+ lman.linkRecoveryTimer.active &= ~bm_linkRecoverySlot;
+ lman.param[0] = bm_linkRecoverySlot;
+ rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_SUCCESSED, 1);
+ }
+ if (lman.linkRecoveryTimer.active)
+ {
+ bm_disconnectSlot = 0;
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ {
+ if ((lman.linkRecoveryTimer.active >> i) & 1 && lman.linkRecoveryTimer.count[i] && --lman.linkRecoveryTimer.count[i] == 0)
+ {
+ lman.linkRecoveryTimer.active &= ~(1 << i);
+ bm_disconnectSlot |= (1 << i);
+ }
+ }
+ if (bm_disconnectSlot)
+ {
+ rfu_LMAN_disconnect(bm_disconnectSlot);
+ disconnect_occure_flag = TRUE;
+ lman.param[0] = bm_disconnectSlot;
+ rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, 1);
+ }
+ }
+ if (!lman.linkRecoveryTimer.active)
+ {
+ lman.linkRecovery_start_flag = 0;
+ }
+ }
+ return disconnect_occure_flag;
+}
+
+void rfu_LMAN_syncVBlank(void)
+{
+ if (rfu_syncVBlank())
+ {
+ rfu_LMAN_occureCallback(LMAN_MSG_WATCH_DOG_TIMER_ERROR, 0);
+ rfu_LMAN_managerChangeAgbClockMaster();
+ }
+}
+
+void rfu_LMAN_manager_entity(u32 rand)
+{
+ u8 msg;
+
+ if (lman.LMAN_callback == NULL && lman.state != LMAN_STATE_READY)
+ {
+ lman.state = LMAN_STATE_READY;
+ return;
+ }
+ if (lman.pcswitch_flag)
+ {
+ rfu_LMAN_settingPCSWITCH(rand);
+ }
+ while (1)
+ {
+ if (lman.state != LMAN_STATE_READY)
+ {
+ rfu_waitREQComplete();
+ lman.active = 1;
+ switch (lman.state)
+ {
+ case LMAN_FORCED_STOP_AND_RFU_RESET:
+ if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID)
+ {
+ msg=LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET;
+ }
+ else
+ {
+ msg=LMAN_MSG_RFU_FATAL_ERROR;
+ }
+ lman.state = lman.next_state = LMAN_STATE_READY;
+ rfu_LMAN_occureCallback(msg, 0);
+ break;
+ case LMAN_STATE_SOFT_RESET_AND_CHECK_ID:
+ if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID)
+ {
+ lman.state = lman.next_state;
+ lman.next_state = LMAN_STATE_CONFIG_SYSTEM;
+ }
+ else
+ {
+ lman.state = lman.next_state = LMAN_STATE_READY;
+ rfu_LMAN_occureCallback(LMAN_MSG_RFU_FATAL_ERROR, 0);
+ }
+ break;
+ case LMAN_STATE_RESET:
+ rfu_REQ_reset();
+ break;
+ case LMAN_STATE_CONFIG_SYSTEM:
+ rfu_REQ_configSystem(lman.init_param->availSlot_flag, lman.init_param->maxMFrame, lman.init_param->MC_TimerCount);
+ break;
+ case LMAN_STATE_CONFIG_GAME_DATA:
+ rfu_REQ_configGameData(lman.init_param->mboot_flag, lman.init_param->serialNo, (const u8 *)lman.init_param->gameName, lman.init_param->userName);
+ break;
+ case LMAN_STATE_START_SEARCH_CHILD:
+ rfu_REQ_startSearchChild();
+ break;
+ case LMAN_STATE_POLL_SEARCH_CHILD:
+ rfu_REQ_pollSearchChild();
+ break;
+ case LMAN_STATE_END_SEARCH_CHILD:
+ rfu_REQ_endSearchChild();
+ break;
+ case LMAN_STATE_WAIT_RECV_CHILD_NAME:
+ break;
+ case LMAN_STATE_START_SEARCH_PARENT:
+ rfu_REQ_startSearchParent();
+ break;
+ case LMAN_STATE_POLL_SEARCH_PARENT:
+ rfu_REQ_pollSearchParent();
+ break;
+ case LMAN_STATE_END_SEARCH_PARENT:
+ rfu_REQ_endSearchParent();
+ break;
+ case LMAN_STATE_START_CONNECT_PARENT:
+ rfu_REQ_startConnectParent(lman.work);
+ break;
+ case LMAN_STATE_POLL_CONNECT_PARENT:
+ rfu_REQ_pollConnectParent();
+ break;
+ case LMAN_STATE_END_CONNECT_PARENT:
+ rfu_REQ_endConnectParent();
+ break;
+ case LMAN_STATE_SEND_CHILD_NAME:
+ break;
+ case LMAN_STATE_START_LINK_RECOVERY:
+ rfu_REQ_CHILD_startConnectRecovery(gRfuLinkStatus->linkLossSlotFlag);
+ break;
+ case LMAN_STATE_POLL_LINK_RECOVERY:
+ rfu_REQ_CHILD_pollConnectRecovery();
+ break;
+ case LMAN_STATE_END_LINK_RECOVERY:
+ rfu_REQ_CHILD_endConnectRecovery();
+ break;
+ case LMAN_STATE_MS_CHANGE:
+ rfu_REQ_changeMasterSlave();
+ break;
+ case LMAN_STATE_WAIT_CLOCK_MASTER:
+ break;
+ case LMAN_STATE_STOP_MODE:
+ rfu_REQ_stopMode();
+ break;
+ case LMAN_STATE_BACK_STATE:
+ break;
+ default:
+ break;
+ }
+ rfu_waitREQComplete();
+ lman.active = 0;
+ }
+ if (lman.state == LMAN_STATE_END_LINK_RECOVERY || lman.state == LMAN_STATE_MS_CHANGE)
+ ;
+ else
+ break;
+ }
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
+ {
+ if (rfu_LMAN_linkWatcher(0))
+ return;
+ }
+ rfu_LMAN_PARENT_checkRecvChildName();
+ rfu_LMAN_CHILD_checkSendChildName();
+ rfu_LMAN_CHILD_linkRecoveryProcess();
+ rfu_LMAN_checkNICommunicateStatus();
+}
+
+static void rfu_LMAN_settingPCSWITCH(u32 rand)
+{
+ if (lman.pcswitch_flag == PCSWITCH_3RD_SC_START)
+ {
+ lman.parent_child = MODE_PARENT;
+ lman.state = LMAN_STATE_START_SEARCH_CHILD;
+ lman.connect_period = lman.pcswitch_period_bak;
+ if (lman.connect_period)
+ {
+ lman.pcswitch_flag = PCSWITCH_3RD_SC;
+ }
+ else
+ {
+ lman.pcswitch_flag = PCSWITCH_1ST_SC_START;
+ }
+ }
+ if (lman.pcswitch_flag == PCSWITCH_1ST_SC_START)
+ {
+ lman.parent_child = MODE_PARENT;
+ lman.state = LMAN_STATE_START_SEARCH_CHILD;
+ lman.connect_period = rand % 140;
+ lman.pcswitch_period_bak = 140 - lman.connect_period;
+ if (lman.connect_period)
+ {
+ lman.pcswitch_flag = PCSWITCH_1ST_SC;
+ }
+ else
+ {
+ lman.pcswitch_flag = PCSWITCH_2ND_SP_START;
+ }
+ }
+ if (lman.pcswitch_flag == PCSWITCH_2ND_SP_START)
+ {
+ lman.parent_child = MODE_CHILD;
+ lman.connect_period = PCSWITCH_SP_PERIOD;
+ lman.pcswitch_flag = PCSWITCH_2ND_SP;
+ lman.state = LMAN_STATE_START_SEARCH_PARENT;
+ }
+}
+
+static void rfu_LMAN_REQ_callback(u16 reqCommandId, u16 reqResult)
+{
+ u8 status;
+ u8 *stwiRecvBuffer;
+ u8 i;
+
+ if (lman.active != 0)
+ {
+ lman.active = 0;
+ switch (reqCommandId)
+ {
+ case ID_RESET_REQ:
+ if (reqResult == 0)
+ {
+ lman.state = lman.next_state;
+ lman.next_state = LMAN_STATE_CONFIG_GAME_DATA;
+ }
+ break;
+ case ID_SYSTEM_CONFIG_REQ:
+ if (reqResult == 0)
+ {
+ lman.state = lman.next_state;
+ lman.next_state = LMAN_STATE_READY;
+ }
+ break;
+ case ID_GAME_CONFIG_REQ:
+ if (reqResult == 0)
+ {
+ lman.state = lman.next_state = LMAN_STATE_READY;
+ rfu_LMAN_occureCallback(LMAN_MSG_INITIALIZE_COMPLETED, 0);
+ }
+ break;
+ case ID_SC_START_REQ:
+ if (reqResult == 0)
+ {
+ lman.state = lman.next_state = LMAN_STATE_POLL_SEARCH_CHILD;
+ }
+ break;
+ case ID_SC_POLL_REQ:
+ if (lman.connect_period && --lman.connect_period == 0)
+ {
+ lman.state = LMAN_STATE_END_SEARCH_CHILD;
+ lman.next_state = LMAN_STATE_WAIT_RECV_CHILD_NAME;
+ }
+ break;
+ case ID_SC_END_REQ:
+ if (reqResult == 0)
+ {
+ lman.state = lman.next_state;
+ lman.next_state = LMAN_STATE_READY;
+ if (lman.pcswitch_flag == 0)
+ {
+ rfu_LMAN_occureCallback(LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED, 0);
+ }
+ }
+ break;
+ case ID_SP_START_REQ:
+ if (reqResult == 0)
+ {
+ if (lman.fastSearchParent_flag == FSP_ON)
+ {
+ if (lman.connect_period > 1)
+ {
+ lman.connect_period--;
+ }
+ }
+ lman.state = lman.next_state = LMAN_STATE_POLL_SEARCH_PARENT;
+ }
+ break;
+ case ID_SP_POLL_REQ:
+ if (reqResult == 0)
+ {
+ status = rfu_LMAN_CHILD_checkEnableParentCandidate();
+ lman.param[0] = status;
+ if (status)
+ {
+ rfu_LMAN_occureCallback(LMAN_MSG_PARENT_FOUND, 1);
+ }
+ if (lman.fastSearchParent_flag && lman.connect_period != 1 && gRfuLinkStatus->findParentCount == RFU_CHILD_MAX)
+ {
+ rfu_REQ_endSearchParent();
+ rfu_waitREQComplete();
+ lman.state = LMAN_STATE_START_SEARCH_PARENT;
+ lman.fastSearchParent_flag = FSP_ON;
+ }
+ }
+ if (lman.connect_period && --lman.connect_period == 0)
+ {
+ lman.state = LMAN_STATE_END_SEARCH_PARENT;
+ lman.next_state = LMAN_STATE_READY;
+ }
+ break;
+ case ID_SP_END_REQ:
+ if (reqResult == 0)
+ {
+ lman.state = lman.next_state;
+ if (lman.pcswitch_flag == 0)
+ {
+ if (lman.state == LMAN_STATE_READY)
+ {
+ rfu_LMAN_occureCallback(LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED, 0);
+ }
+ }
+ else if (lman.pcswitch_flag != PCSWITCH_CP)
+ {
+ lman.state = LMAN_STATE_START_SEARCH_CHILD;
+ lman.pcswitch_flag = PCSWITCH_3RD_SC_START;
+ }
+ }
+ break;
+ case ID_CP_START_REQ:
+ if (reqResult == 0)
+ {
+ lman.state = lman.next_state = LMAN_STATE_POLL_CONNECT_PARENT;
+ }
+ break;
+ case ID_CP_POLL_REQ:
+ if (reqResult == 0 && !rfu_getConnectParentStatus(&status, &lman.child_slot) && !status)
+ {
+ lman.state = LMAN_STATE_END_CONNECT_PARENT;
+ }
+ if (lman.connect_period && --lman.connect_period == 0)
+ {
+ lman.state = LMAN_STATE_END_CONNECT_PARENT;
+ }
+ break;
+ case ID_CP_END_REQ:
+ if (reqResult == 0 && !rfu_getConnectParentStatus(&status, &lman.child_slot))
+ {
+ if (!status)
+ {
+ lman.state = LMAN_STATE_MS_CHANGE;
+ lman.next_state = LMAN_STATE_SEND_CHILD_NAME;
+ lman.work = 0x22;
+ lman.param[0] = lman.child_slot;
+ }
+ else
+ {
+ lman.state = lman.next_state = LMAN_STATE_READY;
+ lman.work = 0x23;
+ lman.param[0] = status;
+ if (lman.pcswitch_flag)
+ {
+ lman.pcswitch_flag = PCSWITCH_2ND_SP_START;
+ lman.state = LMAN_STATE_START_SEARCH_PARENT;
+ }
+ }
+ rfu_LMAN_occureCallback(lman.work, 0x01);
+ lman.work = 0;
+ }
+ break;
+ case ID_CPR_START_REQ:
+ if (reqResult == 0)
+ {
+ lman.param[0] = gRfuLinkStatus->linkLossSlotFlag;
+ lman.state = lman.next_state = LMAN_STATE_POLL_LINK_RECOVERY;
+ for (lman.child_slot = 0; lman.child_slot < RFU_CHILD_MAX; lman.child_slot++)
+ {
+ if ((gRfuLinkStatus->linkLossSlotFlag >> lman.child_slot) & 1)
+ {
+ break;
+ }
+ }
+ }
+ break;
+ case ID_CPR_POLL_REQ:
+ if (reqResult == 0 && !rfu_CHILD_getConnectRecoveryStatus(&status) && status < 2)
+ {
+ lman.state = LMAN_STATE_END_LINK_RECOVERY;
+ }
+ if (lman.linkRecoveryTimer.count[lman.child_slot] && --lman.linkRecoveryTimer.count[lman.child_slot] == 0)
+ {
+ lman.state = LMAN_STATE_END_LINK_RECOVERY;
+ }
+ break;
+ case ID_CPR_END_REQ:
+ if (reqResult == 0 && !rfu_CHILD_getConnectRecoveryStatus(&status))
+ {
+ if (!status)
+ {
+ lman.state = LMAN_STATE_MS_CHANGE;
+ lman.next_state = LMAN_STATE_BACK_STATE;
+ lman.work = 0x32;
+ }
+ else
+ {
+ lman.state = lman.next_state = LMAN_STATE_READY;
+ rfu_LMAN_disconnect(gRfuLinkStatus->linkLossSlotFlag);
+ lman.work = 0x33;
+ }
+ lman.linkRecoveryTimer.count[lman.child_slot] = 0;
+ lman.linkRecoveryTimer.active = 0;
+ lman.linkRecovery_start_flag = 0;
+ rfu_LMAN_occureCallback(lman.work, 0x01);
+ lman.work = 0;
+ }
+ break;
+ case ID_MS_CHANGE_REQ:
+ if (reqResult == 0)
+ {
+ if (lman.next_state == LMAN_STATE_BACK_STATE)
+ {
+ lman.state = lman.state_bak[0];
+ lman.next_state = lman.state_bak[1];
+ lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_ON;
+ rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_SLAVE, 0);
+ }
+ else if (lman.next_state == LMAN_STATE_SEND_CHILD_NAME)
+ {
+ lman.state = lman.next_state;
+ lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_ON;
+ rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_SLAVE, 0);
+ lman.nameAcceptTimer.active |= 1 << lman.child_slot;
+ lman.nameAcceptTimer.count[lman.child_slot] = lman.nameAcceptTimer.count_max;
+ rfu_clearSlot(TYPE_NI_SEND, lman.child_slot);
+ status = rfu_NI_CHILD_setSendGameName(lman.child_slot, 0x0e);
+ if (status)
+ {
+ lman.state = lman.next_state = LMAN_STATE_READY;
+ rfu_LMAN_managerChangeAgbClockMaster();
+ rfu_LMAN_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag);
+ lman.param[0] = status;
+ rfu_LMAN_occureCallback(LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED, 1);
+ }
+ }
+ }
+ break;
+ case ID_STOP_MODE_REQ:
+ if (reqResult == 0)
+ {
+ lman.state = lman.next_state = LMAN_STATE_READY;
+ rfu_LMAN_occureCallback(LMAN_MSG_RFU_POWER_DOWN, 0);
+ }
+ break;
+ }
+ lman.active = 1;
+ }
+ else if (reqResult == 3 && lman.msc_exe_flag && (reqCommandId == ID_DATA_TX_REQ || reqCommandId == ID_DATA_RX_REQ || reqCommandId == ID_MS_CHANGE_REQ))
+ {
+ rfu_REQ_RFUStatus();
+ rfu_waitREQComplete();
+ rfu_getRFUStatus(&status);
+ if (status == 0 && gRfuLinkStatus->parentChild == MODE_CHILD)
+ {
+ stwiRecvBuffer = rfu_getSTWIRecvBuffer() + 4;
+ *stwiRecvBuffer++ = gRfuLinkStatus->connSlotFlag;
+ *stwiRecvBuffer = REASON_LINK_LOSS;
+ rfu_LMAN_linkWatcher(ID_DISCONNECTED_AND_CHANGE_REQ);
+ reqResult = 0;
+ }
+ }
+ switch (reqCommandId)
+ {
+ case ID_DISCONNECT_REQ:
+ if (reqResult == 0)
+ {
+ lman.param[0] = *(rfu_getSTWIRecvBuffer() + 8);
+ rfu_LMAN_reflectCommunicationStatus(lman.param[0]);
+ if (lman.linkRecoveryTimer.active)
+ {
+ lman.linkRecoveryTimer.active &= ~lman.param[0];
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ {
+ if ((lman.param[0] >> i) & 1)
+ {
+ lman.linkRecoveryTimer.count[i] = 0;
+ }
+ }
+ if (lman.parent_child == MODE_CHILD)
+ {
+ lman.state = lman.next_state = LMAN_STATE_READY;
+ }
+ }
+ status = lman.acceptSlot_flag & lman.param[0];
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ {
+ if ((status >> i) & 1 && lman.acceptCount)
+ {
+ lman.acceptCount--;
+ }
+ }
+ lman.acceptSlot_flag &= ~lman.param[0];
+ if (lman.pcswitch_flag)
+ {
+ if (gRfuLinkStatus->parentChild == MODE_NEUTRAL)
+ {
+ if (lman.pcswitch_flag == PCSWITCH_SC_LOCK)
+ {
+ lman.connect_period = lman.pcswitch_period_bak;
+ lman.pcswitch_flag = PCSWITCH_3RD_SC;
+ lman.state = LMAN_STATE_POLL_SEARCH_CHILD;
+ }
+ else if (lman.state != LMAN_STATE_POLL_SEARCH_CHILD && lman.state != LMAN_STATE_END_SEARCH_CHILD)
+ {
+ lman.pcswitch_flag = PCSWITCH_1ST_SC_START;
+ lman.state = LMAN_STATE_START_SEARCH_CHILD;
+ }
+ }
+ }
+ if (gRfuLinkStatus->parentChild == MODE_NEUTRAL)
+ {
+ if (lman.state == LMAN_STATE_READY)
+ {
+ lman.parent_child = MODE_NEUTRAL;
+ }
+ }
+ if (lman.active == 0)
+ {
+ rfu_LMAN_occureCallback(LMAN_MSG_LINK_DISCONNECTED_BY_USER, 1);
+ }
+ }
+ break;
+ case ID_DATA_RX_REQ:
+ rfu_LMAN_CHILD_checkSendChildName2();
+ if (gRfuLinkStatus->parentChild != MODE_NEUTRAL)
+ {
+ rfu_LMAN_occureCallback(LMAN_MSG_RECV_DATA_REQ_COMPLETED, 0);
+ }
+ break;
+ case ID_RESET_REQ:
+ case ID_STOP_MODE_REQ:
+ if (reqResult == 0)
+ {
+ lman.reserveDisconnectSlot_flag = 0;
+ lman.acceptCount = 0;
+ lman.acceptSlot_flag = 0;;
+ lman.parent_child = MODE_NEUTRAL;
+ rfu_LMAN_managerChangeAgbClockMaster();
+ if (reqCommandId == ID_STOP_MODE_REQ)
+ {
+ rfu_LMAN_endManager();
+ }
+ }
+ break;
+ }
+ if (reqResult != 0)
+ {
+ if (reqCommandId == ID_SP_START_REQ && reqResult != 0 && lman.pcswitch_flag == PCSWITCH_2ND_SP)
+ {
+ gRfuLinkStatus->parentChild = MODE_PARENT;
+ gRfuLinkStatus->connSlotFlag = 0xF;
+ rfu_LMAN_disconnect(15);
+ rfu_waitREQComplete();
+ return;
+ }
+ else
+ {
+ lman.param[0] = reqCommandId;
+ lman.param[1] = reqResult;
+ if (lman.active)
+ {
+ lman.state = lman.next_state = LMAN_STATE_READY;
+ }
+ rfu_LMAN_occureCallback(LMAN_MSG_REQ_API_ERROR, 2);
+ rfu_LMAN_managerChangeAgbClockMaster();
+ }
+ }
+ if (reqCommandId == ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ)
+ {
+ rfu_LMAN_occureCallback(LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA, 0);
+ rfu_LMAN_managerChangeAgbClockMaster();
+ }
+}
+
+static void rfu_LMAN_MSC_callback(u16 reqCommandId)
+{
+ u8 active_bak;
+ u8 thisAck_flag;
+
+ active_bak = lman.active;
+ lman.active = 0;
+ lman.msc_exe_flag = 1;
+ if (gRfuLinkStatus->parentChild == MODE_CHILD)
+ {
+ rfu_LMAN_linkWatcher(reqCommandId);
+ if (lman.childClockSlave_flag != RFU_CHILD_CLOCK_SLAVE_ON)
+ {
+ rfu_LMAN_managerChangeAgbClockMaster();
+ lman.msc_exe_flag = 0;
+ lman.active = active_bak;
+ return;
+ }
+ }
+ else
+ {
+ if (!rfu_UNI_PARENT_getDRAC_ACK(&thisAck_flag))
+ {
+ lman.parentAck_flag |= thisAck_flag;
+ }
+ }
+ if (lman.MSC_callback != NULL)
+ {
+ lman.MSC_callback(reqCommandId);
+ rfu_waitREQComplete();
+ if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_OFF_REQ)
+ {
+ rfu_LMAN_managerChangeAgbClockMaster();
+ }
+ }
+ lman.msc_exe_flag = 0;
+ lman.active = active_bak;
+}
+
+static void rfu_LMAN_PARENT_checkRecvChildName(void)
+{
+ u8 newSlot;
+ u8 newAcceptSlot;
+ u8 i;
+ u8 flags;
+ u8 tgtSlot;
+ const u16 *ptr;
+
+ if (lman.state == LMAN_STATE_START_SEARCH_CHILD || lman.state == LMAN_STATE_POLL_SEARCH_CHILD || lman.state == LMAN_STATE_END_SEARCH_CHILD || lman.state == LMAN_STATE_WAIT_RECV_CHILD_NAME)
+ {
+ newSlot = ((gRfuLinkStatus->connSlotFlag ^ lman.connectSlot_flag_old) & gRfuLinkStatus->connSlotFlag) & ~gRfuLinkStatus->getNameFlag;
+ lman.connectSlot_flag_old = gRfuLinkStatus->connSlotFlag;
+ if (newSlot)
+ {
+ lman.param[0] = newSlot;
+ rfu_LMAN_occureCallback(LMAN_MSG_NEW_CHILD_CONNECT_DETECTED, 1);
+ }
+ newAcceptSlot = 0x00;
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ {
+ tgtSlot = 1 << i;
+ flags = 0x00;
+ if (newSlot & tgtSlot)
+ {
+ lman.nameAcceptTimer.count[i] = lman.nameAcceptTimer.count_max;
+ lman.nameAcceptTimer.active |= tgtSlot;
+ }
+ else if (lman.nameAcceptTimer.active & tgtSlot)
+ {
+ if (gRfuSlotStatusNI[i]->recv.state == SLOT_STATE_RECV_SUCCESS)
+ {
+ if (gRfuSlotStatusNI[i]->recv.dataType == 1)
+ {
+ flags = RN_NAME_TIMER_CLEAR;
+ for (ptr = lman.acceptable_serialNo_list; *ptr != 0xFFFF; ptr++)
+ {
+ if (gRfuLinkStatus->partner[i].serialNo == *ptr)
+ {
+ lman.acceptSlot_flag |= tgtSlot;
+ lman.acceptCount++;
+ newAcceptSlot |= tgtSlot;
+ flags |= RN_ACCEPT;
+ break;
+ }
+ }
+ if (!(flags & RN_ACCEPT))
+ {
+ flags |= RN_DISCONNECT;
+ }
+ }
+ }
+ else if (--lman.nameAcceptTimer.count[i] == 0)
+ {
+ flags = RN_NAME_TIMER_CLEAR | RN_DISCONNECT;
+ }
+ if (flags & RN_NAME_TIMER_CLEAR)
+ {
+ lman.nameAcceptTimer.active &= ~tgtSlot;
+ lman.nameAcceptTimer.count[i] = 0;
+ rfu_clearSlot(TYPE_NI_RECV, i);
+ }
+ if (flags & RN_DISCONNECT)
+ {
+ lman.reserveDisconnectSlot_flag |= tgtSlot;
+ }
+ }
+ }
+ if (newAcceptSlot)
+ {
+ lman.param[0] = newAcceptSlot;
+ rfu_LMAN_occureCallback(LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED, 1);
+ }
+ if (lman.reserveDisconnectSlot_flag)
+ {
+ flags = 1;
+ if (gRfuLinkStatus->sendSlotUNIFlag)
+ {
+ if (((lman.parentAck_flag & lman.acceptSlot_flag) != lman.acceptSlot_flag))
+ {
+ flags = 0;
+ }
+ }
+ if (flags)
+ {
+ rfu_LMAN_disconnect(lman.reserveDisconnectSlot_flag);
+ lman.param[0] = lman.reserveDisconnectSlot_flag;
+ lman.reserveDisconnectSlot_flag = 0;
+ rfu_LMAN_occureCallback(LMAN_MSG_NEW_CHILD_CONNECT_REJECTED, 1);
+ }
+ }
+ if (lman.nameAcceptTimer.active == 0 && lman.state == LMAN_STATE_WAIT_RECV_CHILD_NAME)
+ {
+ if (lman.pcswitch_flag == 0)
+ {
+ lman.state = lman.next_state = LMAN_STATE_READY;
+ rfu_LMAN_occureCallback(LMAN_MSG_END_WAIT_CHILD_NAME, 0);
+ }
+ else
+ {
+ if (lman.pcswitch_flag == PCSWITCH_1ST_SC)
+ {
+ lman.pcswitch_flag = PCSWITCH_2ND_SP_START;
+ lman.state = LMAN_STATE_START_SEARCH_PARENT;
+ }
+ else
+ {
+ lman.pcswitch_flag = PCSWITCH_1ST_SC_START;
+ lman.state = LMAN_STATE_START_SEARCH_CHILD;
+ }
+ if (lman.acceptSlot_flag)
+ {
+ lman.connect_period = 0;
+ lman.pcswitch_flag = PCSWITCH_SC_LOCK;
+ lman.state = LMAN_STATE_START_SEARCH_CHILD;
+ }
+ }
+ }
+ }
+}
+
+static void rfu_LMAN_CHILD_checkSendChildName(void)
+{
+ u16 imeBak = REG_IME;
+ REG_IME = 0;
+ if (lman.state == LMAN_STATE_SEND_CHILD_NAME)
+ {
+ if (--lman.nameAcceptTimer.count[lman.child_slot] == 0 || gRfuSlotStatusNI[lman.child_slot]->send.state == SLOT_STATE_SEND_FAILED)
+ {
+ rfu_LMAN_requestChangeAgbClockMaster();
+ lman.state = LMAN_STATE_WAIT_CHANGE_CLOCK_MASTER;
+ rfu_clearSlot(TYPE_NI_SEND, lman.child_slot);
+ lman.nameAcceptTimer.active &= ~(1 << lman.child_slot);
+ lman.nameAcceptTimer.count[lman.child_slot] = 0;
+ }
+ }
+ REG_IME = imeBak;
+ if (lman.state == LMAN_STATE_WAIT_CHANGE_CLOCK_MASTER)
+ {
+ if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_ON)
+ {
+ rfu_LMAN_requestChangeAgbClockMaster();
+ }
+ if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_OFF)
+ {
+ lman.state = lman.next_state = LMAN_STATE_READY;
+ rfu_LMAN_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag);
+ lman.param[0] = 0;
+ rfu_LMAN_occureCallback(LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED, 1);
+ }
+ }
+}
+
+static void rfu_LMAN_CHILD_checkSendChildName2(void)
+{
+ if (lman.state == LMAN_STATE_SEND_CHILD_NAME && gRfuSlotStatusNI[lman.child_slot]->send.state == SLOT_STATE_SEND_SUCCESS)
+ {
+ lman.state = lman.next_state = LMAN_STATE_READY;
+ rfu_clearSlot(TYPE_NI_SEND, lman.child_slot);
+ lman.nameAcceptTimer.active &= ~(1 << lman.child_slot);
+ lman.nameAcceptTimer.count[lman.child_slot] = 0;
+ rfu_LMAN_occureCallback(LMAN_MSG_CHILD_NAME_SEND_COMPLETED, 0);
+ }
+}
+
+static void rfu_LMAN_CHILD_linkRecoveryProcess(void)
+{
+ if (lman.parent_child == MODE_CHILD && lman.linkRecovery_start_flag == LINK_RECOVERY_START)
+ {
+ lman.state_bak[0] = lman.state;
+ lman.state_bak[1] = lman.next_state;
+ lman.state = LMAN_STATE_START_LINK_RECOVERY;
+ lman.next_state = LMAN_STATE_POLL_LINK_RECOVERY;
+ lman.linkRecovery_start_flag = LINK_RECOVERY_EXE;
+ }
+}
+
+static u8 rfu_LMAN_CHILD_checkEnableParentCandidate(void)
+{
+ u8 i;
+ u16 *serialNo;
+ u8 flags = 0x00;
+
+ for (i = 0; i < gRfuLinkStatus->findParentCount; i++)
+ {
+ for (serialNo = lman.acceptable_serialNo_list; *serialNo != 0xFFFF; serialNo++)
+ {
+ if (gRfuLinkStatus->partner[i].serialNo == *serialNo)
+ {
+ flags |= (1 << i);
+ }
+ }
+ }
+ return flags;
+}
+
+static void rfu_LMAN_occureCallback(u8 msg, u8 param_count)
+{
+ if (lman.LMAN_callback != NULL)
+ {
+ lman.LMAN_callback(msg, param_count);
+ }
+ lman.param[0] = lman.param[1] = 0;
+}
+
+static void rfu_LMAN_disconnect(u8 bm_disconnectedSlot)
+{
+ u8 active_bak = lman.active;
+ lman.active = 1;
+ rfu_REQ_disconnect(bm_disconnectedSlot);
+ rfu_waitREQComplete();
+ lman.active = active_bak;
+}
+
+static void rfu_LMAN_reflectCommunicationStatus(u8 bm_disconnectedSlot)
+{
+ u8 i;
+
+ if (gRfuLinkStatus->sendSlotNIFlag)
+ {
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ {
+ if (gRfuSlotStatusNI[i]->send.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->send.bmSlot & bm_disconnectedSlot)
+ {
+ rfu_changeSendTarget(TYPE_NI, i, gRfuSlotStatusNI[i]->send.bmSlot & ~bm_disconnectedSlot);
+ }
+ }
+ }
+ if (gRfuLinkStatus->recvSlotNIFlag)
+ {
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ {
+ if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->recv.bmSlot & bm_disconnectedSlot)
+ {
+ rfu_NI_stopReceivingData(i);
+ }
+ }
+ }
+ if (gRfuLinkStatus->sendSlotUNIFlag)
+ {
+ gRfuLinkStatus->sendSlotUNIFlag &= ~bm_disconnectedSlot;
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ {
+ if (gRfuSlotStatusUNI[i]->send.state == SLOT_STATE_SEND_UNI && bm_disconnectedSlot & gRfuSlotStatusUNI[i]->send.bmSlot)
+ {
+ gRfuSlotStatusUNI[i]->send.bmSlot &= ~bm_disconnectedSlot;
+ }
+ }
+ }
+}
+
+static void rfu_LMAN_checkNICommunicateStatus(void)
+{
+ u8 i;
+ u8 j;
+ u8 flags;
+
+ if (lman.NI_failCounter_limit)
+ {
+ if (gRfuLinkStatus->sendSlotNIFlag)
+ {
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ {
+ if (gRfuSlotStatusNI[i]->send.state & SLOT_BUSY_FLAG)
+ {
+ flags = 0;
+ for (j = 0; j < RFU_CHILD_MAX; j++)
+ {
+ if ((gRfuSlotStatusNI[i]->send.bmSlot >> j) & 1 && gRfuSlotStatusNI[j]->send.failCounter > lman.NI_failCounter_limit)
+ {
+ flags |= (1 << j);
+ }
+ if (flags)
+ {
+ rfu_changeSendTarget(TYPE_NI, i, flags ^ gRfuSlotStatusNI[i]->send.bmSlot);
+ }
+ }
+ }
+ }
+ }
+ if (gRfuLinkStatus->recvSlotNIFlag)
+ {
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ {
+ if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->recv.failCounter > lman.NI_failCounter_limit)
+ {
+ rfu_NI_stopReceivingData(i);
+ }
+ }
+ }
+ }
+}
+
+void rfu_LMAN_setMSCCallback(void (*MSC_callback_p)(u16))
+{
+ lman.MSC_callback = MSC_callback_p;
+ rfu_setMSCCallback(rfu_LMAN_MSC_callback);
+}
+
+static void rfu_LMAN_setLMANCallback(void (*func)(u8, u8))
+{
+ lman.LMAN_callback = func;
+}
+
+u8 rfu_LMAN_setLinkRecovery(u8 enable_flag, u16 recovery_period)
+{
+ u16 imeBak;
+ if (lman.linkRecovery_enable && enable_flag == 0 && lman.linkRecoveryTimer.active)
+ {
+ return LMAN_ERROR_NOW_LINK_RECOVERY;
+ }
+ imeBak = REG_IME;
+ REG_IME = 0;
+ lman.linkRecovery_enable = enable_flag;
+ lman.linkRecoveryTimer.count_max = recovery_period;
+ REG_IME = imeBak;
+ return 0;
+}
+
+static u8 rfu_LMAN_setNIFailCounterLimit(u16 NI_failCounter_limit)
+{
+ if (gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag)
+ {
+ lman.param[0] = 6;
+ rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1);
+ return LMAN_ERROR_NOW_COMMUNICATION;
+ }
+ lman.NI_failCounter_limit = NI_failCounter_limit;
+ return 0;
+}
+
+static u8 rfu_LMAN_setFastSearchParent(u8 enable_flag)
+{
+ if (lman.state == LMAN_STATE_START_SEARCH_PARENT || lman.state == LMAN_STATE_POLL_SEARCH_PARENT || lman.state == LMAN_STATE_END_SEARCH_PARENT)
+ {
+ lman.param[0] = 7;
+ rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1);
+ return LMAN_ERROR_NOW_SEARCH_PARENT;
+ }
+ if (enable_flag)
+ {
+ lman.fastSearchParent_flag = FSP_ON;
+ }
+ else
+ {
+ lman.fastSearchParent_flag = 0;
+ }
+ return 0;
+}
+
+static void rfu_LMAN_managerChangeAgbClockMaster(void)
+{
+ if (lman.childClockSlave_flag != RFU_CHILD_CLOCK_SLAVE_OFF)
+ {
+ lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_OFF;
+ rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_MASTER, 0);
+ }
+}
+
+void rfu_LMAN_requestChangeAgbClockMaster(void)
+{
+ if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_OFF)
+ {
+ rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_MASTER, 0);
+ }
+ else if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_ON)
+ {
+ lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_OFF_REQ;
+ }
+}
+
+void rfu_LMAN_forceChangeSP(void)
+{
+ if (lman.pcswitch_flag)
+ {
+ switch (lman.state)
+ {
+ case LMAN_STATE_START_SEARCH_CHILD:
+ lman.pcswitch_flag = PCSWITCH_2ND_SP_START;
+ lman.state = LMAN_STATE_START_SEARCH_PARENT;
+ break;
+ case LMAN_STATE_POLL_SEARCH_CHILD:
+ lman.pcswitch_flag = PCSWITCH_1ST_SC;
+ lman.connect_period = 1;
+ break;
+ case LMAN_STATE_END_SEARCH_CHILD:
+ case LMAN_STATE_WAIT_RECV_CHILD_NAME:
+ lman.pcswitch_flag = PCSWITCH_1ST_SC;
+ break;
+ case LMAN_STATE_START_SEARCH_PARENT:
+ case LMAN_STATE_POLL_SEARCH_PARENT:
+ lman.connect_period = PCSWITCH_SP_PERIOD;
+ break;
+ case LMAN_STATE_END_SEARCH_PARENT:
+ lman.connect_period = PCSWITCH_SP_PERIOD;
+ lman.state = LMAN_STATE_POLL_SEARCH_PARENT;
+ break;
+ }
+ }
+}
diff --git a/src/bag.c b/src/bag.c
index 049aa9f8f..2ca62a3b4 100644
--- a/src/bag.c
+++ b/src/bag.c
@@ -1,5 +1,4 @@
#include "global.h"
-#include "task.h"
#include "palette.h"
#include "item_menu.h"
#include "text.h"
@@ -9,7 +8,6 @@
#include "new_menu_helpers.h"
#include "menu.h"
#include "money.h"
-#include "bag.h"
#include "strings.h"
static const u16 sBagWindowPalF[] = INCBIN_U16("data/bag/bag_window_pal.gbapal");
diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c
index 647d2f367..33b5ceacc 100644
--- a/src/battle_anim_effects_1.c
+++ b/src/battle_anim_effects_1.c
@@ -1,15 +1,9 @@
#include "global.h"
-#include "malloc.h"
#include "battle_anim.h"
#include "battle_interface.h"
-#include "decompress.h"
#include "gpu_regs.h"
-#include "graphics.h"
-#include "main.h"
-#include "math_util.h"
#include "palette.h"
#include "random.h"
-#include "scanline_effect.h"
#include "sound.h"
#include "trig.h"
#include "util.h"
diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c
index 23be07785..093660389 100644
--- a/src/battle_anim_effects_2.c
+++ b/src/battle_anim_effects_2.c
@@ -5,7 +5,6 @@
#include "decompress.h"
#include "gpu_regs.h"
#include "graphics.h"
-#include "main.h"
#include "math_util.h"
#include "palette.h"
#include "random.h"
diff --git a/src/battle_anim_sound_tasks.c b/src/battle_anim_sound_tasks.c
index d74b743e8..f2740a1a5 100644
--- a/src/battle_anim_sound_tasks.c
+++ b/src/battle_anim_sound_tasks.c
@@ -178,7 +178,7 @@ void sub_80DD148(u8 taskId)
gTasks[taskId].data[2] = pan;
if (species != SPECIES_NONE)
{
- if (gBattleAnimArgs[1] == TASK_NONE)
+ if (gBattleAnimArgs[1] == TAIL_SENTINEL)
PlayCry3(species, pan, 9);
else
PlayCry3(species, pan, 7);
@@ -199,7 +199,7 @@ static void sub_80DD270(u8 taskId)
{
++gTasks[taskId].data[9];
}
- else if (gTasks[taskId].data[0] == TASK_NONE)
+ else if (gTasks[taskId].data[0] == TAIL_SENTINEL)
{
if (!IsCryPlaying())
{
diff --git a/src/battle_bg.c b/src/battle_bg.c
new file mode 100644
index 000000000..1c0b41bb4
--- /dev/null
+++ b/src/battle_bg.c
@@ -0,0 +1,1076 @@
+#include "global.h"
+#include "gflib.h"
+#include "battle.h"
+#include "battle_bg.h"
+#include "battle_message.h"
+#include "decompress.h"
+#include "graphics.h"
+#include "link.h"
+#include "new_menu_helpers.h"
+#include "overworld.h"
+#include "text_window.h"
+#include "trig.h"
+#include "constants/maps.h"
+#include "constants/songs.h"
+#include "constants/trainer_classes.h"
+
+#define TAG_VS_LETTERS 10000
+
+struct BattleBackground
+{
+ const void *tileset;
+ const void *tilemap;
+ const void *entryTileset;
+ const void *entryTilemap;
+ const void *palette;
+};
+
+static void CB2_unused(void);
+static u8 GetBattleTerrainOverride(void);
+
+static const u8 gUnknown_824829C[] = {1, 2};
+
+static const struct OamData gOamData_82482A0 = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x64),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(64x64),
+ .tileNum = 0x000,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData gOamData_82482A8 = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x64),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(64x64),
+ .tileNum = 0x040,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AffineAnimCmd gUnknown_82482B0[] = {
+ AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd gUnknown_82482C0[] = {
+ AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0),
+ AFFINEANIMCMD_FRAME(0x18, 0x18, 0x0, 0x80),
+ AFFINEANIMCMD_FRAME(0x18, 0x18, 0x0, 0x80),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const gAffineAnimTable_82482E0[] = {
+ gUnknown_82482B0,
+ gUnknown_82482C0
+};
+
+static const struct SpriteTemplate sVsLetter_V_SpriteTemplate = {
+ .tileTag = TAG_VS_LETTERS,
+ .paletteTag = TAG_VS_LETTERS,
+ .oam = &gOamData_82482A0,
+ .anims = gDummySpriteAnimTable,
+ .affineAnims = gAffineAnimTable_82482E0,
+ .callback = nullsub_9
+};
+
+static const struct SpriteTemplate sVsLetter_S_SpriteTemplate = {
+ .tileTag = TAG_VS_LETTERS,
+ .paletteTag = TAG_VS_LETTERS,
+ .oam = &gOamData_82482A8,
+ .anims = gDummySpriteAnimTable,
+ .affineAnims = gAffineAnimTable_82482E0,
+ .callback = nullsub_9
+};
+
+static const struct CompressedSpriteSheet sVsLettersSpriteSheet = {
+ gVsLettersGfx,
+ 0x1000,
+ TAG_VS_LETTERS
+};
+
+const struct BgTemplate gBattleBgTemplates[4] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 24,
+ .screenSize = 2,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0x000
+ }, {
+ .bg = 1,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 28,
+ .screenSize = 2,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0x000
+ }, {
+ .bg = 2,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 30,
+ .screenSize = 1,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0x000
+ }, {
+ .bg = 3,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 26,
+ .screenSize = 1,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0x000
+ }
+};
+
+static const struct WindowTemplate gUnknown_8248330[] = {
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 15,
+ .width = 28,
+ .height = 4,
+ .paletteNum = 0,
+ .baseBlock = 0x090
+ }, {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 35,
+ .width = 14,
+ .height = 4,
+ .paletteNum = 0,
+ .baseBlock = 0x1c0
+ }, {
+ .bg = 0,
+ .tilemapLeft = 17,
+ .tilemapTop = 35,
+ .width = 12,
+ .height = 4,
+ .paletteNum = 5,
+ .baseBlock = 0x190
+ }, {
+ .bg = 0,
+ .tilemapLeft = 2,
+ .tilemapTop = 55,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 5,
+ .baseBlock = 0x300
+ }, {
+ .bg = 0,
+ .tilemapLeft = 11,
+ .tilemapTop = 55,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 5,
+ .baseBlock = 0x310
+ }, {
+ .bg = 0,
+ .tilemapLeft = 2,
+ .tilemapTop = 57,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 5,
+ .baseBlock = 0x320
+ }, {
+ .bg = 0,
+ .tilemapLeft = 11,
+ .tilemapTop = 57,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 5,
+ .baseBlock = 0x330
+ }, {
+ .bg = 0,
+ .tilemapLeft = 21,
+ .tilemapTop = 55,
+ .width = 3,
+ .height = 2,
+ .paletteNum = 5,
+ .baseBlock = 0x290
+ }, {
+ .bg = 0,
+ .tilemapLeft = 21,
+ .tilemapTop = 57,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 5,
+ .baseBlock = 0x296
+ }, {
+ .bg = 0,
+ .tilemapLeft = 24,
+ .tilemapTop = 55,
+ .width = 5,
+ .height = 2,
+ .paletteNum = 5,
+ .baseBlock = 0x2a6
+ }, {
+ .bg = 0,
+ .tilemapLeft = 25,
+ .tilemapTop = 57,
+ .width = 0,
+ .height = 0,
+ .paletteNum = 5,
+ .baseBlock = 0x2b0
+ }, {
+ .bg = 0,
+ .tilemapLeft = 21,
+ .tilemapTop = 55,
+ .width = 8,
+ .height = 4,
+ .paletteNum = 5,
+ .baseBlock = 0x2b0
+ }, {
+ .bg = 1,
+ .tilemapLeft = 19,
+ .tilemapTop = 8,
+ .width = 10,
+ .height = 11,
+ .paletteNum = 5,
+ .baseBlock = 0x100
+ }, {
+ .bg = 2,
+ .tilemapLeft = 18,
+ .tilemapTop = 0,
+ .width = 12,
+ .height = 3,
+ .paletteNum = 6,
+ .baseBlock = 0x16e
+ }, {
+ .bg = 0,
+ .tilemapLeft = 25,
+ .tilemapTop = 9,
+ .width = 4,
+ .height = 4,
+ .paletteNum = 5,
+ .baseBlock = 0x100
+ }, {
+ .bg = 1,
+ .tilemapLeft = 2,
+ .tilemapTop = 3,
+ .width = 7,
+ .height = 2,
+ .paletteNum = 5,
+ .baseBlock = 0x020
+ }, {
+ .bg = 2,
+ .tilemapLeft = 2,
+ .tilemapTop = 3,
+ .width = 7,
+ .height = 2,
+ .paletteNum = 5,
+ .baseBlock = 0x040
+ }, {
+ .bg = 1,
+ .tilemapLeft = 2,
+ .tilemapTop = 2,
+ .width = 7,
+ .height = 2,
+ .paletteNum = 5,
+ .baseBlock = 0x020
+ }, {
+ .bg = 2,
+ .tilemapLeft = 2,
+ .tilemapTop = 2,
+ .width = 7,
+ .height = 2,
+ .paletteNum = 5,
+ .baseBlock = 0x040
+ }, {
+ .bg = 1,
+ .tilemapLeft = 2,
+ .tilemapTop = 6,
+ .width = 7,
+ .height = 2,
+ .paletteNum = 5,
+ .baseBlock = 0x060
+ }, {
+ .bg = 2,
+ .tilemapLeft = 2,
+ .tilemapTop = 6,
+ .width = 7,
+ .height = 2,
+ .paletteNum = 5,
+ .baseBlock = 0x080
+ }, {
+ .bg = 0,
+ .tilemapLeft = 11,
+ .tilemapTop = 2,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 0,
+ .baseBlock = 0x0a0
+ }, {
+ .bg = 0,
+ .tilemapLeft = 4,
+ .tilemapTop = 2,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 0,
+ .baseBlock = 0x0a0
+ }, {
+ .bg = 0,
+ .tilemapLeft = 19,
+ .tilemapTop = 2,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 0,
+ .baseBlock = 0x0b0
+ }, {
+ .bg = 0,
+ .tilemapLeft = 2,
+ .tilemapTop = 15,
+ .width = 26,
+ .height = 4,
+ .paletteNum = 7,
+ .baseBlock = 0x090
+ }, DUMMY_WIN_TEMPLATE
+};
+
+static const u32 sBattleTerrainPalette_Grass[] = INCBIN_U32("graphics/battle/unk_8248400.gbapal.lz");
+static const u32 sBattleTerrainTiles_Grass[] = INCBIN_U32("graphics/battle/unk_824844C.4bpp.lz");
+static const u32 sBattleTerrainTilemap_Grass[] = INCBIN_U32("graphics/battle/unk_82489A8.bin.lz");
+static const u32 sBattleTerrainAnimTiles_Grass[] = INCBIN_U32("graphics/battle/unk_8248C68.4bpp.lz");
+static const u32 sBattleTerrainAnimTilemap_Grass[] = INCBIN_U32("graphics/battle/unk_8248F58.bin.lz");
+static const u32 sBattleTerrainPalette_LongGrass[] = INCBIN_U32("graphics/battle/unk_8249074.gbapal.lz");
+static const u32 sBattleTerrainTiles_LongGrass[] = INCBIN_U32("graphics/battle/unk_82490C4.4bpp.lz");
+static const u32 sBattleTerrainTilemap_LongGrass[] = INCBIN_U32("graphics/battle/unk_8249620.bin.lz");
+static const u32 sBattleTerrainAnimTiles_LongGrass[] = INCBIN_U32("graphics/battle/unk_82498DC.4bpp.lz");
+static const u32 sBattleTerrainAnimTilemap_LongGrass[] = INCBIN_U32("graphics/battle/unk_8249E10.bin.lz");
+static const u32 sBattleTerrainPalette_Sand[] = INCBIN_U32("graphics/battle/unk_8249F98.gbapal.lz");
+static const u32 sBattleTerrainTiles_Sand[] = INCBIN_U32("graphics/battle/unk_8249FE4.4bpp.lz");
+static const u32 sBattleTerrainTilemap_Sand[] = INCBIN_U32("graphics/battle/unk_824A37C.bin.lz");
+static const u32 sBattleTerrainAnimTiles_Sand[] = INCBIN_U32("graphics/battle/unk_824A618.4bpp.lz");
+static const u32 sBattleTerrainAnimTilemap_Sand[] = INCBIN_U32("graphics/battle/unk_824A844.bin.lz");
+static const u32 sBattleTerrainPalette_Underwater[] = INCBIN_U32("graphics/battle/unk_824A940.gbapal.lz");
+static const u32 sBattleTerrainTiles_Underwater[] = INCBIN_U32("graphics/battle/unk_824A990.4bpp.lz");
+static const u32 sBattleTerrainTilemap_Underwater[] = INCBIN_U32("graphics/battle/unk_824ACD0.bin.lz");
+static const u32 sBattleTerrainAnimTiles_Underwater[] = INCBIN_U32("graphics/battle/unk_824AF70.4bpp.lz");
+static const u32 sBattleTerrainAnimTilemap_Underwater[] = INCBIN_U32("graphics/battle/unk_824B0DC.bin.lz");
+static const u32 sBattleTerrainPalette_Water[] = INCBIN_U32("graphics/battle/unk_824B19C.gbapal.lz");
+static const u32 sBattleTerrainTiles_Water[] = INCBIN_U32("graphics/battle/unk_824B1EC.4bpp.lz");
+static const u32 sBattleTerrainTilemap_Water[] = INCBIN_U32("graphics/battle/unk_824B608.bin.lz");
+static const u32 sBattleTerrainAnimTiles_Water[] = INCBIN_U32("graphics/battle/unk_824B8A8.4bpp.lz");
+static const u32 sBattleTerrainAnimTilemap_Water[] = INCBIN_U32("graphics/battle/unk_824BBE0.bin.lz");
+static const u32 sBattleTerrainPalette_Pond[] = INCBIN_U32("graphics/battle/unk_824BCE0.gbapal.lz");
+static const u32 sBattleTerrainTiles_Pond[] = INCBIN_U32("graphics/battle/unk_824BD38.4bpp.lz");
+static const u32 sBattleTerrainTilemap_Pond[] = INCBIN_U32("graphics/battle/unk_824C07C.bin.lz");
+static const u32 sBattleTerrainAnimTiles_Pond[] = INCBIN_U32("graphics/battle/unk_824C314.4bpp.lz");
+static const u32 sBattleTerrainAnimTilemap_Pond[] = INCBIN_U32("graphics/battle/unk_824C520.bin.lz");
+static const u32 sBattleTerrainPalette_Mountain[] = INCBIN_U32("graphics/battle/unk_824C5D8.gbapal.lz");
+static const u32 sBattleTerrainTiles_Mountain[] = INCBIN_U32("graphics/battle/unk_824C624.4bpp.lz");
+static const u32 sBattleTerrainTilemap_Mountain[] = INCBIN_U32("graphics/battle/unk_824C958.bin.lz");
+static const u32 sBattleTerrainAnimTiles_Mountain[] = INCBIN_U32("graphics/battle/unk_824CBF8.4bpp.lz");
+static const u32 sBattleTerrainAnimTilemap_Mountain[] = INCBIN_U32("graphics/battle/unk_824CEC8.bin.lz");
+static const u32 sBattleTerrainPalette_Cave[] = INCBIN_U32("graphics/battle/unk_824CF98.gbapal.lz");
+static const u32 sBattleTerrainTiles_Cave[] = INCBIN_U32("graphics/battle/unk_824CFEC.4bpp.lz");
+static const u32 sBattleTerrainTilemap_Cave[] = INCBIN_U32("graphics/battle/unk_824D418.bin.lz");
+static const u32 sBattleTerrainAnimTiles_Cave[] = INCBIN_U32("graphics/battle/unk_824D6B8.4bpp.lz");
+static const u32 sBattleTerrainAnimTilemap_Cave[] = INCBIN_U32("graphics/battle/unk_824DC98.bin.lz");
+static const u32 sBattleTerrainPalette_Building[] = INCBIN_U32("graphics/battle/unk_824DDF0.gbapal.lz");
+static const u32 sBattleTerrainTiles_Building[] = INCBIN_U32("graphics/battle/unk_824DE34.4bpp.lz");
+static const u32 sBattleTerrainTilemap_Building[] = INCBIN_U32("graphics/battle/unk_824E16C.bin.lz");
+static const u32 sBattleTerrainAnimTiles_Building[] = INCBIN_U32("graphics/battle/unk_824E410.4bpp.lz");
+static const u32 sBattleTerrainAnimTilemap_Building[] = INCBIN_U32("graphics/battle/unk_824E490.bin.lz");
+static const u32 sBattleTerrainPalette_Link[] = INCBIN_U32("graphics/battle/unk_824E528.gbapal.lz");
+static const u32 sBattleTerrainPalette_Gym[] = INCBIN_U32("graphics/battle/unk_824E56C.gbapal.lz");
+static const u32 sBattleTerrainPalette_Leader[] = INCBIN_U32("graphics/battle/unk_824E5B8.gbapal.lz");
+static const u32 sBattleTerrainPalette_Indoor2[] = INCBIN_U32("graphics/battle/unk_824E604.gbapal.lz");
+static const u32 sBattleTerrainPalette_Indoor1[] = INCBIN_U32("graphics/battle/unk_824E650.gbapal.lz");
+static const u32 sBattleTerrainPalette_Lorelei[] = INCBIN_U32("graphics/battle/unk_824E6A4.gbapal.lz");
+static const u32 sBattleTerrainPalette_Bruno[] = INCBIN_U32("graphics/battle/unk_824E6F0.gbapal.lz");
+static const u32 sBattleTerrainPalette_Agatha[] = INCBIN_U32("graphics/battle/unk_824E740.gbapal.lz");
+static const u32 sBattleTerrainPalette_Lance[] = INCBIN_U32("graphics/battle/unk_824E78C.gbapal.lz");
+static const u32 sBattleTerrainPalette_Champion[] = INCBIN_U32("graphics/battle/unk_824E7DC.gbapal.lz");
+static const u32 sBattleTerrainPalette_Plain[] = INCBIN_U32("graphics/battle/unk_824E81C.gbapal.lz");
+static const u32 sBattleTerrainTiles_Indoor2[] = INCBIN_U32("graphics/battle/unk_824E858.4bpp.lz");
+static const u32 sBattleTerrainTilemap_Indoor2[] = INCBIN_U32("graphics/battle/unk_824EB90.bin.lz");
+
+static const struct BattleBackground sBattleTerrainTable[] = {
+ [BATTLE_TERRAIN_GRASS] =
+ {
+ .tileset = sBattleTerrainTiles_Grass,
+ .tilemap = sBattleTerrainTilemap_Grass,
+ .entryTileset = sBattleTerrainAnimTiles_Grass,
+ .entryTilemap = sBattleTerrainAnimTilemap_Grass,
+ .palette = sBattleTerrainPalette_Grass
+ },
+ [BATTLE_TERRAIN_LONG_GRASS] =
+ {
+ .tileset = sBattleTerrainTiles_LongGrass,
+ .tilemap = sBattleTerrainTilemap_LongGrass,
+ .entryTileset = sBattleTerrainAnimTiles_LongGrass,
+ .entryTilemap = sBattleTerrainAnimTilemap_LongGrass,
+ .palette = sBattleTerrainPalette_LongGrass
+ },
+ [BATTLE_TERRAIN_SAND] =
+ {
+ .tileset = sBattleTerrainTiles_Sand,
+ .tilemap = sBattleTerrainTilemap_Sand,
+ .entryTileset = sBattleTerrainAnimTiles_Sand,
+ .entryTilemap = sBattleTerrainAnimTilemap_Sand,
+ .palette = sBattleTerrainPalette_Sand
+ },
+ [BATTLE_TERRAIN_UNDERWATER] =
+ {
+ .tileset = sBattleTerrainTiles_Underwater,
+ .tilemap = sBattleTerrainTilemap_Underwater,
+ .entryTileset = sBattleTerrainAnimTiles_Underwater,
+ .entryTilemap = sBattleTerrainAnimTilemap_Underwater,
+ .palette = sBattleTerrainPalette_Underwater
+ },
+ [BATTLE_TERRAIN_WATER] =
+ {
+ .tileset = sBattleTerrainTiles_Water,
+ .tilemap = sBattleTerrainTilemap_Water,
+ .entryTileset = sBattleTerrainAnimTiles_Water,
+ .entryTilemap = sBattleTerrainAnimTilemap_Water,
+ .palette = sBattleTerrainPalette_Water
+ },
+ [BATTLE_TERRAIN_POND] =
+ {
+ .tileset = sBattleTerrainTiles_Pond,
+ .tilemap = sBattleTerrainTilemap_Pond,
+ .entryTileset = sBattleTerrainAnimTiles_Pond,
+ .entryTilemap = sBattleTerrainAnimTilemap_Pond,
+ .palette = sBattleTerrainPalette_Pond
+ },
+ [BATTLE_TERRAIN_MOUNTAIN] =
+ {
+ .tileset = sBattleTerrainTiles_Mountain,
+ .tilemap = sBattleTerrainTilemap_Mountain,
+ .entryTileset = sBattleTerrainAnimTiles_Mountain,
+ .entryTilemap = sBattleTerrainAnimTilemap_Mountain,
+ .palette = sBattleTerrainPalette_Mountain
+ },
+ [BATTLE_TERRAIN_CAVE] =
+ {
+ .tileset = sBattleTerrainTiles_Cave,
+ .tilemap = sBattleTerrainTilemap_Cave,
+ .entryTileset = sBattleTerrainAnimTiles_Cave,
+ .entryTilemap = sBattleTerrainAnimTilemap_Cave,
+ .palette = sBattleTerrainPalette_Cave
+ },
+ [BATTLE_TERRAIN_BUILDING] =
+ {
+ .tileset = sBattleTerrainTiles_Building,
+ .tilemap = sBattleTerrainTilemap_Building,
+ .entryTileset = sBattleTerrainAnimTiles_Building,
+ .entryTilemap = sBattleTerrainAnimTilemap_Building,
+ .palette = sBattleTerrainPalette_Building
+ },
+ [BATTLE_TERRAIN_PLAIN] =
+ {
+ .tileset = sBattleTerrainTiles_Building,
+ .tilemap = sBattleTerrainTilemap_Building,
+ .entryTileset = sBattleTerrainAnimTiles_Building,
+ .entryTilemap = sBattleTerrainAnimTilemap_Building,
+ .palette = sBattleTerrainPalette_Plain
+ },
+ [BATTLE_TERRAIN_LINK] =
+ {
+ .tileset = sBattleTerrainTiles_Building,
+ .tilemap = sBattleTerrainTilemap_Building,
+ .entryTileset = sBattleTerrainAnimTiles_Building,
+ .entryTilemap = sBattleTerrainAnimTilemap_Building,
+ .palette = sBattleTerrainPalette_Link
+ },
+ [BATTLE_TERRAIN_GYM] =
+ {
+ .tileset = sBattleTerrainTiles_Building,
+ .tilemap = sBattleTerrainTilemap_Building,
+ .entryTileset = sBattleTerrainAnimTiles_Building,
+ .entryTilemap = sBattleTerrainAnimTilemap_Building,
+ .palette = sBattleTerrainPalette_Gym
+ },
+ [BATTLE_TERRAIN_LEADER] =
+ {
+ .tileset = sBattleTerrainTiles_Building,
+ .tilemap = sBattleTerrainTilemap_Building,
+ .entryTileset = sBattleTerrainAnimTiles_Building,
+ .entryTilemap = sBattleTerrainAnimTilemap_Building,
+ .palette = sBattleTerrainPalette_Leader
+ },
+ [BATTLE_TERRAIN_INDOOR_2] =
+ {
+ .tileset = sBattleTerrainTiles_Indoor2,
+ .tilemap = sBattleTerrainTilemap_Indoor2,
+ .entryTileset = sBattleTerrainAnimTiles_Building,
+ .entryTilemap = sBattleTerrainAnimTilemap_Building,
+ .palette = sBattleTerrainPalette_Indoor2
+ },
+ [BATTLE_TERRAIN_INDOOR_1] =
+ {
+ .tileset = sBattleTerrainTiles_Indoor2,
+ .tilemap = sBattleTerrainTilemap_Indoor2,
+ .entryTileset = sBattleTerrainAnimTiles_Building,
+ .entryTilemap = sBattleTerrainAnimTilemap_Building,
+ .palette = sBattleTerrainPalette_Indoor1
+ },
+ [BATTLE_TERRAIN_LORELEI] =
+ {
+ .tileset = sBattleTerrainTiles_Indoor2,
+ .tilemap = sBattleTerrainTilemap_Indoor2,
+ .entryTileset = sBattleTerrainAnimTiles_Building,
+ .entryTilemap = sBattleTerrainAnimTilemap_Building,
+ .palette = sBattleTerrainPalette_Lorelei
+ },
+ [BATTLE_TERRAIN_BRUNO] =
+ {
+ .tileset = sBattleTerrainTiles_Indoor2,
+ .tilemap = sBattleTerrainTilemap_Indoor2,
+ .entryTileset = sBattleTerrainAnimTiles_Building,
+ .entryTilemap = sBattleTerrainAnimTilemap_Building,
+ .palette = sBattleTerrainPalette_Bruno
+ },
+ [BATTLE_TERRAIN_AGATHA] =
+ {
+ .tileset = sBattleTerrainTiles_Indoor2,
+ .tilemap = sBattleTerrainTilemap_Indoor2,
+ .entryTileset = sBattleTerrainAnimTiles_Building,
+ .entryTilemap = sBattleTerrainAnimTilemap_Building,
+ .palette = sBattleTerrainPalette_Agatha
+ },
+ [BATTLE_TERRAIN_LANCE] =
+ {
+ .tileset = sBattleTerrainTiles_Indoor2,
+ .tilemap = sBattleTerrainTilemap_Indoor2,
+ .entryTileset = sBattleTerrainAnimTiles_Building,
+ .entryTilemap = sBattleTerrainAnimTilemap_Building,
+ .palette = sBattleTerrainPalette_Lance
+ },
+ [BATTLE_TERRAIN_CHAMPION] =
+ {
+ .tileset = sBattleTerrainTiles_Indoor2,
+ .tilemap = sBattleTerrainTilemap_Indoor2,
+ .entryTileset = sBattleTerrainAnimTiles_Building,
+ .entryTilemap = sBattleTerrainAnimTilemap_Building,
+ .palette = sBattleTerrainPalette_Champion
+ }
+};
+
+static const struct {
+ u8 mapScene;
+ u8 battleTerrain;
+} sMapBattleSceneMapping[] = {
+ {MAP_BATTLE_SCENE_GYM, BATTLE_TERRAIN_GYM},
+ {MAP_BATTLE_SCENE_INDOOR_1, BATTLE_TERRAIN_INDOOR_1},
+ {MAP_BATTLE_SCENE_INDOOR_2, BATTLE_TERRAIN_INDOOR_2},
+ {MAP_BATTLE_SCENE_LORELEI, BATTLE_TERRAIN_LORELEI},
+ {MAP_BATTLE_SCENE_BRUNO, BATTLE_TERRAIN_BRUNO},
+ {MAP_BATTLE_SCENE_AGATHA, BATTLE_TERRAIN_AGATHA},
+ {MAP_BATTLE_SCENE_LANCE, BATTLE_TERRAIN_LANCE},
+ {MAP_BATTLE_SCENE_LINK, BATTLE_TERRAIN_LINK}
+};
+
+UNUSED void CreateUnknownDebugSprite(void)
+{
+ u8 spriteId;
+
+ ResetSpriteData();
+ spriteId = CreateSprite(&gUnknown_824EFF0, 0, 0, 0);
+ gSprites[spriteId].invisible = TRUE;
+ SetMainCallback2(CB2_unused);
+}
+
+static void CB2_unused(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+static u8 GetBattleTerrainByMapScene(u8 mapBattleScene)
+{
+ int i;
+ for (i = 0; i < NELEMS(sMapBattleSceneMapping); i++)
+ {
+ if (mapBattleScene == sMapBattleSceneMapping[i].mapScene)
+ return sMapBattleSceneMapping[i].battleTerrain;
+ }
+ return 9;
+}
+
+static void LoadBattleTerrainGfx(u16 terrain)
+{
+ if (terrain >= NELEMS(sBattleTerrainTable))
+ terrain = 9;
+ // Copy to bg3
+ LZDecompressVram(sBattleTerrainTable[terrain].tileset, (void *)BG_CHAR_ADDR(2));
+ LZDecompressVram(sBattleTerrainTable[terrain].tilemap, (void *)BG_SCREEN_ADDR(26));
+ LoadCompressedPalette(sBattleTerrainTable[terrain].palette, 0x20, 0x60);
+}
+
+static void LoadBattleTerrainEntryGfx(u16 terrain)
+{
+ if (terrain >= NELEMS(sBattleTerrainTable))
+ terrain = 9;
+ // Copy to bg1
+ LZDecompressVram(sBattleTerrainTable[terrain].entryTileset, (void *)BG_CHAR_ADDR(1));
+ LZDecompressVram(sBattleTerrainTable[terrain].entryTilemap, (void *)BG_SCREEN_ADDR(28));
+}
+
+UNUSED void GetBattleTerrainGfxPtrs(u8 terrain, const u32 **tilesPtr, const u32 **mapPtr, const u32 **palPtr)
+{
+ if (terrain > 9)
+ terrain = 9;
+ *tilesPtr = sBattleTerrainTable[terrain].tileset;
+ *mapPtr = sBattleTerrainTable[terrain].tilemap;
+ *palPtr = sBattleTerrainTable[terrain].palette;
+}
+
+void sub_800F324(void)
+{
+ ResetBgsAndClearDma3BusyFlags(FALSE);
+ InitBgsFromTemplates(0, gBattleBgTemplates, NELEMS(gBattleBgTemplates));
+ InitWindows(gUnknown_8248330);
+ DeactivateAllTextPrinters();
+}
+
+void InitBattleBgsVideo(void)
+{
+ EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
+ sub_800F324();
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_OBJWIN_ON);
+}
+
+void LoadBattleMenuWindowGfx(void)
+{
+ TextWindow_SetUserSelectedFrame(2, 0x012, 0x10);
+ TextWindow_SetUserSelectedFrame(2, 0x022, 0x10);
+ gPlttBufferUnfaded[0x5C] = RGB( 9, 9, 9);
+ gPlttBufferUnfaded[0x5D] = RGB( 9, 9, 9);
+ gPlttBufferUnfaded[0x5E] = RGB(31, 31, 31);
+ gPlttBufferUnfaded[0x5F] = RGB( 26, 26, 25);
+ CpuCopy16(&gPlttBufferUnfaded[0x5C], &gPlttBufferFaded[0x5C], 8);
+ if (gBattleTypeFlags & (BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_POKEDUDE))
+ {
+ Menu_LoadStdPalAt(0x70);
+ TextWindow_LoadResourcesStdFrame0(0, 0x030, 0x70);
+ gPlttBufferUnfaded[0x76] = RGB( 0, 0, 0);
+ CpuCopy16(&gPlttBufferUnfaded[0x76], &gPlttBufferFaded[0x76], 2);
+ }
+}
+
+void DrawMainBattleBackground(void)
+{
+ LoadBattleTerrainGfx(GetBattleTerrainOverride());
+}
+
+void LoadBattleTextboxAndBackground(void)
+{
+ LZDecompressVram(gBattleTextboxTiles, (void *)BG_CHAR_ADDR(0));
+ CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0x000);
+ CopyBgTilemapBufferToVram(0);
+ LoadCompressedPalette(gBattleTextboxPalette, 0x00, 0x40);
+ LoadBattleMenuWindowGfx();
+ DrawMainBattleBackground();
+}
+
+static void DrawLinkBattleParticipantPokeballs(u8 taskId, u8 multiplayerId, u8 bgId, u8 destX, u8 destY)
+{
+ s32 i;
+ u16 pokeballStatuses = 0;
+ u16 tiles[6];
+
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ if (gTasks[taskId].data[5] != 0)
+ {
+ switch (multiplayerId)
+ {
+ case 0:
+ pokeballStatuses = 0x3F & gTasks[taskId].data[3];
+ break;
+ case 1:
+ pokeballStatuses = (0xFC0 & gTasks[taskId].data[4]) >> 6;
+ break;
+ case 2:
+ pokeballStatuses = (0xFC0 & gTasks[taskId].data[3]) >> 6;
+ break;
+ case 3:
+ pokeballStatuses = 0x3F & gTasks[taskId].data[4];
+ break;
+ }
+ }
+ else
+ {
+ switch (multiplayerId)
+ {
+ case 0:
+ pokeballStatuses = 0x3F & gTasks[taskId].data[3];
+ break;
+ case 1:
+ pokeballStatuses = 0x3F & gTasks[taskId].data[4];
+ break;
+ case 2:
+ pokeballStatuses = (0xFC0 & gTasks[taskId].data[3]) >> 6;
+ break;
+ case 3:
+ pokeballStatuses = (0xFC0 & gTasks[taskId].data[4]) >> 6;
+ break;
+ }
+ }
+
+ for (i = 0; i < 3; i++)
+ tiles[i] = ((pokeballStatuses & (3 << (i * 2))) >> (i * 2)) + 0x6001;
+
+ CopyToBgTilemapBufferRect_ChangePalette(bgId, tiles, destX, destY, 3, 1, 0x11);
+ CopyBgTilemapBufferToVram(bgId);
+ }
+ else
+ {
+ if (multiplayerId == gBattleStruct->multiplayerId)
+ pokeballStatuses = gTasks[taskId].data[3];
+ else
+ pokeballStatuses = gTasks[taskId].data[4];
+
+ for (i = 0; i < 6; i++)
+ tiles[i] = ((pokeballStatuses & (3 << (i * 2))) >> (i * 2)) + 0x6001;
+
+ CopyToBgTilemapBufferRect_ChangePalette(bgId, tiles, destX, destY, 6, 1, 0x11);
+ CopyBgTilemapBufferToVram(bgId);
+ }
+}
+
+static void DrawLinkBattleVsScreenOutcomeText(void)
+{
+ if (gBattleOutcome == B_OUTCOME_DREW)
+ {
+ BattlePutTextOnWindow(gText_Draw, 0x15);
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ if (gBattleOutcome == B_OUTCOME_WON)
+ {
+ switch (gLinkPlayers[gBattleStruct->multiplayerId].id)
+ {
+ case 0:
+ BattlePutTextOnWindow(gText_Win, 0x16);
+ BattlePutTextOnWindow(gText_Loss, 0x17);
+ break;
+ case 1:
+ BattlePutTextOnWindow(gText_Win, 0x17);
+ BattlePutTextOnWindow(gText_Loss, 0x16);
+ break;
+ case 2:
+ BattlePutTextOnWindow(gText_Win, 0x16);
+ BattlePutTextOnWindow(gText_Loss, 0x17);
+ break;
+ case 3:
+ BattlePutTextOnWindow(gText_Win, 0x17);
+ BattlePutTextOnWindow(gText_Loss, 0x16);
+ break;
+ }
+ }
+ else
+ {
+ switch (gLinkPlayers[gBattleStruct->multiplayerId].id)
+ {
+ case 0:
+ BattlePutTextOnWindow(gText_Win, 0x17);
+ BattlePutTextOnWindow(gText_Loss, 0x16);
+ break;
+ case 1:
+ BattlePutTextOnWindow(gText_Win, 0x16);
+ BattlePutTextOnWindow(gText_Loss, 0x17);
+ break;
+ case 2:
+ BattlePutTextOnWindow(gText_Win, 0x17);
+ BattlePutTextOnWindow(gText_Loss, 0x16);
+ break;
+ case 3:
+ BattlePutTextOnWindow(gText_Win, 0x16);
+ BattlePutTextOnWindow(gText_Loss, 0x17);
+ break;
+ }
+ }
+ }
+ else if (gBattleOutcome == B_OUTCOME_WON)
+ {
+ if (gLinkPlayers[gBattleStruct->multiplayerId].id != 0)
+ {
+ BattlePutTextOnWindow(gText_Win, 0x17);
+ BattlePutTextOnWindow(gText_Loss, 0x16);
+ }
+ else
+ {
+ BattlePutTextOnWindow(gText_Win, 0x16);
+ BattlePutTextOnWindow(gText_Loss, 0x17);
+ }
+ }
+ else
+ {
+ if (gLinkPlayers[gBattleStruct->multiplayerId].id != 0)
+ {
+ BattlePutTextOnWindow(gText_Win, 0x16);
+ BattlePutTextOnWindow(gText_Loss, 0x17);
+ }
+ else
+ {
+ BattlePutTextOnWindow(gText_Win, 0x17);
+ BattlePutTextOnWindow(gText_Loss, 0x16);
+ }
+ }
+}
+
+void InitLinkBattleVsScreen(u8 taskId)
+{
+ struct LinkPlayer *linkPlayer;
+ u8 *name;
+ s32 i, palId;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
+ {
+ name = gLinkPlayers[i].name;
+ linkPlayer = &gLinkPlayers[i];
+
+ switch (linkPlayer->id)
+ {
+ case 0:
+ BattlePutTextOnWindow(name, 0x11);
+ DrawLinkBattleParticipantPokeballs(taskId, linkPlayer->id, 1, 2, 4);
+ break;
+ case 1:
+ BattlePutTextOnWindow(name, 0x12);
+ DrawLinkBattleParticipantPokeballs(taskId, linkPlayer->id, 2, 2, 4);
+ break;
+ case 2:
+ BattlePutTextOnWindow(name, 0x13);
+ DrawLinkBattleParticipantPokeballs(taskId, linkPlayer->id, 1, 2, 8);
+ break;
+ case 3:
+ BattlePutTextOnWindow(name, 0x14);
+ DrawLinkBattleParticipantPokeballs(taskId, linkPlayer->id, 2, 2, 8);
+ break;
+ }
+ }
+ }
+ else
+ {
+ u8 playerId = gBattleStruct->multiplayerId;
+ u8 opponentId = playerId ^ BIT_SIDE;
+ u8 opponentId_copy = opponentId;
+
+ if (gLinkPlayers[playerId].id != 0)
+ opponentId = playerId, playerId = opponentId_copy;
+
+ name = gLinkPlayers[playerId].name;
+ BattlePutTextOnWindow(name, 0xF);
+
+ name = gLinkPlayers[opponentId].name;
+ BattlePutTextOnWindow(name, 0x10);
+
+ DrawLinkBattleParticipantPokeballs(taskId, playerId, 1, 2, 7);
+ DrawLinkBattleParticipantPokeballs(taskId, opponentId, 2, 2, 7);
+ }
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ palId = AllocSpritePalette(TAG_VS_LETTERS);
+ gPlttBufferUnfaded[palId * 16 + 0x10F] = gPlttBufferFaded[palId * 16 + 0x10F] = RGB(31, 31, 31);
+ gBattleStruct->linkBattleVsSpriteId_V = CreateSprite(&sVsLetter_V_SpriteTemplate, 108, 80, 0);
+ gBattleStruct->linkBattleVsSpriteId_S = CreateSprite(&sVsLetter_S_SpriteTemplate, 132, 80, 0);
+ gSprites[gBattleStruct->linkBattleVsSpriteId_V].invisible = TRUE;
+ gSprites[gBattleStruct->linkBattleVsSpriteId_S].invisible = TRUE;
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ if (gTasks[taskId].data[5] != 0)
+ {
+ gBattle_BG1_X = -(20) - (Sin2(gTasks[taskId].data[1]) / 32);
+ gBattle_BG2_X = -(140) - (Sin2(gTasks[taskId].data[2]) / 32);
+ gBattle_BG1_Y = -36;
+ gBattle_BG2_Y = -36;
+ }
+ else
+ {
+ gBattle_BG1_X = -(20) - (Sin2(gTasks[taskId].data[1]) / 32);
+ gBattle_BG1_Y = (Cos2(gTasks[taskId].data[1]) / 32) - 164;
+ gBattle_BG2_X = -(140) - (Sin2(gTasks[taskId].data[2]) / 32);
+ gBattle_BG2_Y = (Cos2(gTasks[taskId].data[2]) / 32) - 164;
+ }
+
+ if (gTasks[taskId].data[2] != 0)
+ {
+ gTasks[taskId].data[2] -= 2;
+ gTasks[taskId].data[1] += 2;
+ }
+ else
+ {
+ if (gTasks[taskId].data[5] != 0)
+ DrawLinkBattleVsScreenOutcomeText();
+
+ PlaySE(SE_W231);
+ DestroyTask(taskId);
+ gSprites[gBattleStruct->linkBattleVsSpriteId_V].invisible = FALSE;
+ gSprites[gBattleStruct->linkBattleVsSpriteId_S].invisible = FALSE;
+ gSprites[gBattleStruct->linkBattleVsSpriteId_S].oam.tileNum += 0x40;
+ gSprites[gBattleStruct->linkBattleVsSpriteId_V].data[0] = 0;
+ gSprites[gBattleStruct->linkBattleVsSpriteId_S].data[0] = 1;
+ gSprites[gBattleStruct->linkBattleVsSpriteId_V].data[1] = gSprites[gBattleStruct->linkBattleVsSpriteId_V].pos1.x;
+ gSprites[gBattleStruct->linkBattleVsSpriteId_S].data[1] = gSprites[gBattleStruct->linkBattleVsSpriteId_S].pos1.x;
+ gSprites[gBattleStruct->linkBattleVsSpriteId_V].data[2] = 0;
+ gSprites[gBattleStruct->linkBattleVsSpriteId_S].data[2] = 0;
+ }
+ break;
+ }
+}
+
+void DrawBattleEntryBackground(void)
+{
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ LZDecompressVram(gFile_graphics_battle_transitions_vs_frame_sheet, (void*)(BG_CHAR_ADDR(1)));
+ LZDecompressVram(gVsLettersGfx, (void*)(VRAM + 0x10000));
+ LoadCompressedPalette(gFile_graphics_battle_transitions_vs_frame_palette, 0x60, 0x20);
+ SetBgAttribute(1, BG_ATTR_SCREENSIZE, 1);
+ SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(1) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT512x256);
+ CopyToBgTilemapBuffer(1, gFile_graphics_battle_transitions_vs_frame_tilemap, 0, 0);
+ CopyToBgTilemapBuffer(2, gFile_graphics_battle_transitions_vs_frame_tilemap, 0, 0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_OBJ | WININ_WIN0_CLR);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
+ gBattle_BG1_Y = -164;
+ gBattle_BG2_Y = -164;
+ LoadCompressedSpriteSheetUsingHeap(&sVsLettersSpriteSheet);
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE)
+ {
+ LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_GRASS);
+ }
+ else if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))
+ {
+ LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_BUILDING);
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON)
+ {
+ if (gGameVersion == VERSION_FIRE_RED)
+ {
+ LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_CAVE);
+ }
+ else
+ {
+ LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_WATER);
+ }
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ {
+ u8 trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
+ if (trainerClass == CLASS_LEADER_2)
+ {
+ LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_BUILDING);
+ return;
+ }
+ else if (trainerClass == CLASS_CHAMPION_2)
+ {
+ LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_BUILDING);
+ return;
+ }
+ }
+
+ if (GetCurrentMapBattleScene() == MAP_BATTLE_SCENE_NORMAL)
+ {
+ LoadBattleTerrainEntryGfx(gBattleTerrain);
+ }
+ else
+ {
+ LoadBattleTerrainEntryGfx(BATTLE_TERRAIN_BUILDING);
+ }
+ }
+}
+
+static u8 GetBattleTerrainOverride(void)
+{
+ u8 battleScene;
+ if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))
+ {
+ return BATTLE_TERRAIN_LINK;
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE)
+ {
+ gBattleTerrain = BATTLE_TERRAIN_GRASS;
+ return BATTLE_TERRAIN_GRASS;
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ {
+ if (gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_LEADER_2)
+ {
+ return BATTLE_TERRAIN_LEADER;
+ }
+ else if (gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_CHAMPION_2)
+ {
+ return BATTLE_TERRAIN_CHAMPION;
+ }
+ }
+ battleScene = GetCurrentMapBattleScene();
+ if (battleScene == MAP_BATTLE_SCENE_NORMAL)
+ {
+ return gBattleTerrain;
+ }
+ return GetBattleTerrainByMapScene(battleScene);
+}
+
+bool8 LoadChosenBattleElement(u8 caseId)
+{
+ bool8 ret = FALSE;
+ u8 battleScene;
+ switch (caseId)
+ {
+ case 0:
+ LZDecompressVram(gBattleTextboxTiles, (void *)BG_CHAR_ADDR(0));
+ break;
+ case 1:
+ CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0x000);
+ CopyBgTilemapBufferToVram(0);
+ break;
+ case 2:
+ LoadCompressedPalette(gBattleTextboxPalette, 0x00, 0x40);
+ break;
+ case 3:
+ battleScene = GetBattleTerrainOverride();
+ LZDecompressVram(sBattleTerrainTable[battleScene].tileset, (void *)BG_CHAR_ADDR(2));
+ // fallthrough
+ case 4:
+ battleScene = GetBattleTerrainOverride();
+ LZDecompressVram(sBattleTerrainTable[battleScene].tilemap, (void *)BG_SCREEN_ADDR(26));
+ break;
+ case 5:
+ battleScene = GetBattleTerrainOverride();
+ LoadCompressedPalette(sBattleTerrainTable[battleScene].palette, 0x20, 0x60);
+ break;
+ case 6:
+ LoadBattleMenuWindowGfx();
+ break;
+ default:
+ ret = TRUE;
+ break;
+ }
+ return ret;
+}
diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c
index 7df93e170..a80e79bf4 100644
--- a/src/battle_controller_link_opponent.c
+++ b/src/battle_controller_link_opponent.c
@@ -1,27 +1,20 @@
#include "global.h"
-#include "bg.h"
#include "data.h"
#include "link.h"
-#include "main.h"
#include "m4a.h"
#include "palette.h"
#include "pokeball.h"
#include "pokemon.h"
-#include "reshow_battle_screen.h"
#include "sound.h"
#include "string_util.h"
#include "task.h"
#include "text.h"
#include "util.h"
-#include "window.h"
#include "battle.h"
-#include "battle_ai_script_commands.h"
#include "battle_anim.h"
#include "battle_controllers.h"
#include "battle_interface.h"
#include "battle_message.h"
-#include "battle_setup.h"
-#include "battle_tower.h"
#include "constants/battle_anim.h"
#include "constants/songs.h"
#include "constants/facility_trainer_classes.h"
@@ -1134,11 +1127,11 @@ static void LinkOpponentHandleDrawTrainerPic(void)
}
else if (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender != MALE)
{
- trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PLAYER_4];
+ trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_LEAF];
}
else
{
- trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PLAYER_3];
+ trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_RED];
}
}
else
@@ -1159,11 +1152,11 @@ static void LinkOpponentHandleDrawTrainerPic(void)
}
else if (gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].gender != MALE)
{
- trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PLAYER_4];
+ trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_LEAF];
}
else
{
- trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PLAYER_3];
+ trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_RED];
}
}
DecompressTrainerFrontPic(trainerPicId, gActiveBattler);
diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c
index 96130f049..5ac4f1abc 100644
--- a/src/battle_controller_link_partner.c
+++ b/src/battle_controller_link_partner.c
@@ -1,9 +1,6 @@
#include "global.h"
-#include "bg.h"
#include "data.h"
#include "link.h"
-#include "main.h"
-#include "m4a.h"
#include "palette.h"
#include "pokeball.h"
#include "pokemon.h"
@@ -12,16 +9,11 @@
#include "task.h"
#include "text.h"
#include "util.h"
-#include "window.h"
#include "battle.h"
-#include "battle_ai_script_commands.h"
#include "battle_anim.h"
#include "battle_controllers.h"
#include "battle_interface.h"
#include "battle_message.h"
-#include "battle_setup.h"
-#include "battle_tower.h"
-#include "reshow_battle_screen.h"
#include "constants/battle_anim.h"
#include "constants/songs.h"
diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c
index 3cb6d1432..26e35ae65 100644
--- a/src/battle_controller_opponent.c
+++ b/src/battle_controller_opponent.c
@@ -1,15 +1,10 @@
#include "global.h"
-#include "bg.h"
#include "data.h"
-#include "item.h"
-#include "link.h"
#include "main.h"
#include "m4a.h"
#include "task.h"
#include "text.h"
#include "util.h"
-#include "window.h"
-#include "palette.h"
#include "pokeball.h"
#include "pokemon.h"
#include "random.h"
@@ -20,15 +15,12 @@
#include "battle_controllers.h"
#include "battle_message.h"
#include "battle_interface.h"
-#include "battle_setup.h"
#include "battle_tower.h"
#include "battle_gfx_sfx_util.h"
#include "battle_ai_script_commands.h"
#include "battle_ai_switch_items.h"
#include "trainer_tower.h"
-#include "reshow_battle_screen.h"
#include "constants/battle_anim.h"
-#include "constants/items.h"
#include "constants/moves.h"
#include "constants/songs.h"
diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c
index cb9e04a50..a751c0eea 100644
--- a/src/battle_controller_player.c
+++ b/src/battle_controller_player.c
@@ -10,7 +10,6 @@
#include "party_menu.h"
#include "pokeball.h"
#include "pokemon.h"
-#include "random.h"
#include "sound.h"
#include "strings.h"
#include "string_util.h"
@@ -24,7 +23,6 @@
#include "battle_controllers.h"
#include "battle_interface.h"
#include "battle_message.h"
-#include "battle_setup.h"
#include "battle_script_commands.h"
#include "reshow_battle_screen.h"
#include "constants/battle_anim.h"
@@ -831,9 +829,9 @@ void sub_802F6A8(void)
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
if (gWirelessCommType == 0)
- sub_800AAC0();
+ Link_TryStartSend5FFF();
else
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
gBattlerControllerFuncs[gActiveBattler] = sub_802F610;
}
else
diff --git a/src/battle_controller_pokedude.c b/src/battle_controller_pokedude.c
index d8ebe5ba4..a6b3fe994 100644
--- a/src/battle_controller_pokedude.c
+++ b/src/battle_controller_pokedude.c
@@ -11,7 +11,6 @@
#include "link.h"
#include "sound.h"
#include "event_data.h"
-#include "item.h"
#include "item_menu.h"
#include "text.h"
#include "strings.h"
@@ -25,7 +24,6 @@
#include "reshow_battle_screen.h"
#include "teachy_tv.h"
#include "constants/songs.h"
-#include "constants/items.h"
#include "constants/moves.h"
#include "constants/pokemon.h"
#include "constants/trainers.h"
@@ -127,7 +125,7 @@ static void SetPokedudeMonData(u8 monId);
static void sub_8159478(u8 battlerId);
static void PokedudeDoMoveAnimation(void);
static void sub_81595EC(u8 taskId);
-static const u8 *sub_8159EF0(void);
+static const u8 *GetPokedudeText(void);
u8 *gUnknown_3005EE0[MAX_BATTLERS_COUNT];
@@ -224,10 +222,10 @@ static const u8 gUnknown_8479048[][8] =
static const u8 (*const gUnknown_8479060[])[8] =
{
- gUnknown_8479008,
- gUnknown_8479018,
- gUnknown_8479030,
- gUnknown_8479048,
+ [TTVSCR_BATTLE] = gUnknown_8479008,
+ [TTVSCR_STATUS] = gUnknown_8479018,
+ [TTVSCR_MATCHUPS] = gUnknown_8479030,
+ [TTVSCR_CATCHING] = gUnknown_8479048,
};
static const u8 gUnknown_8479070[][8] =
@@ -261,10 +259,10 @@ static const u8 gUnknown_84790C0[][8] =
static const u8 (*const gUnknown_84790D8[])[8] =
{
- gUnknown_8479070,
- gUnknown_8479080,
- gUnknown_84790A0,
- gUnknown_84790C0,
+ [TTVSCR_BATTLE] = gUnknown_8479070,
+ [TTVSCR_STATUS] = gUnknown_8479080,
+ [TTVSCR_MATCHUPS] = gUnknown_84790A0,
+ [TTVSCR_CATCHING] = gUnknown_84790C0,
};
static const struct Unk_84790E8 gUnknown_84790E8[] =
@@ -417,48 +415,48 @@ static const struct Unk_84790E8 gUnknown_8479168[] =
static const struct Unk_84790E8 *const gUnknown_8479198[] =
{
- gUnknown_84790E8,
- gUnknown_8479108,
- gUnknown_8479130,
- gUnknown_8479168,
+ [TTVSCR_BATTLE] = gUnknown_84790E8,
+ [TTVSCR_STATUS] = gUnknown_8479108,
+ [TTVSCR_MATCHUPS] = gUnknown_8479130,
+ [TTVSCR_CATCHING] = gUnknown_8479168,
};
-static const u8 *const gUnknown_84791A8[] =
+static const u8 *const sPokedudeTexts_Battle[] =
{
- gUnknown_81C5F69,
- gUnknown_81C5FA7,
- gUnknown_81C5FDC,
- gUnknown_81C601C,
+ Pokedude_Text_SpeedierBattlerGoesFirst,
+ Pokedude_Text_MyRattataFasterThanPidgey,
+ Pokedude_Text_BattlersTakeTurnsAttacking,
+ Pokedude_Text_MyRattataWonGetsEXP,
};
-static const u8 *const gUnknown_84791B8[] =
+static const u8 *const sPokedudeTexts_Status[] =
{
- gUnknown_81C60FA,
- gUnknown_81C60FA,
- gUnknown_81C615A,
- gUnknown_81C6196,
- gUnknown_81C61EA,
+ Pokedude_Text_UhOhRattataPoisoned,
+ Pokedude_Text_UhOhRattataPoisoned,
+ Pokedude_Text_HealStatusRightAway,
+ Pokedude_Text_UsingItemTakesTurn,
+ Pokedude_Text_YayWeManagedToWin,
};
-static const u8 *const gUnknown_84791CC[] =
+static const u8 *const sPokedudeTexts_TypeMatchup[] =
{
- gUnknown_81C6202,
- gUnknown_81C6301,
- gUnknown_81C63A9,
- gUnknown_81C63F9,
- gUnknown_81C6446,
- gUnknown_81C657A,
- gUnknown_81C6637,
+ Pokedude_Text_WaterNotVeryEffectiveAgainstGrass,
+ Pokedude_Text_GrassEffectiveAgainstWater,
+ Pokedude_Text_LetsTryShiftingMons,
+ Pokedude_Text_ShiftingUsesTurn,
+ Pokedude_Text_ButterfreeDoubleResistsGrass,
+ Pokedude_Text_ButterfreeGoodAgainstOddish,
+ Pokedude_Text_YeahWeWon,
};
-static const u8 *const gUnknown_84791E8[] =
+static const u8 *const sPokedudeTexts_Catching[] =
{
- gUnknown_81C6645,
- gUnknown_81C6645,
- gUnknown_81C66CF,
- gUnknown_81C6787,
- gUnknown_81C684B,
- gUnknown_81C686C,
+ Pokedude_Text_WeakenMonBeforeCatching,
+ Pokedude_Text_WeakenMonBeforeCatching,
+ Pokedude_Text_BestIfTargetStatused,
+ Pokedude_Text_CantDoubleUpOnStatus,
+ Pokedude_Text_LetMeThrowBall,
+ Pokedude_Text_PickBestKindOfBall,
};
static const struct PokedudeBattlePartyInfo sParties_Battle[] =
@@ -556,10 +554,10 @@ static const struct PokedudeBattlePartyInfo sParties_Catching[] =
static const struct PokedudeBattlePartyInfo *const sPokedudeBattlePartyPointers[] =
{
- sParties_Battle,
- sParties_Status,
- sParties_Matchups,
- sParties_Catching,
+ [TTVSCR_BATTLE] = sParties_Battle,
+ [TTVSCR_STATUS] = sParties_Status,
+ [TTVSCR_MATCHUPS] = sParties_Matchups,
+ [TTVSCR_CATCHING] = sParties_Catching,
};
static void nullsub_99(void)
@@ -2597,7 +2595,7 @@ static void sub_8159BA8(void)
break;
case 2:
gBattle_BG0_Y = 0;
- BattleStringExpandPlaceholdersToDisplayedString(sub_8159EF0());
+ BattleStringExpandPlaceholdersToDisplayedString(GetPokedudeText());
BattlePutTextOnWindow(gDisplayedStringBattle, 24);
++gUnknown_3005EE0[gActiveBattler][2];
break;
@@ -2658,7 +2656,7 @@ static void sub_8159D04(void)
}
break;
case 3:
- BattleStringExpandPlaceholdersToDisplayedString(sub_8159EF0());
+ BattleStringExpandPlaceholdersToDisplayedString(GetPokedudeText());
BattlePutTextOnWindow(gDisplayedStringBattle, 24);
++gUnknown_3005EE0[gActiveBattler][2];
break;
@@ -2698,19 +2696,19 @@ static void sub_8159D04(void)
}
}
-static const u8 *sub_8159EF0(void)
+static const u8 *GetPokedudeText(void)
{
switch (gBattleStruct->field_96)
{
- case 0:
+ case TTVSCR_BATTLE:
default:
- return gUnknown_84791A8[gBattleStruct->field_97 - 1];
- case 1:
- return gUnknown_84791B8[gBattleStruct->field_97 - 1];
- case 2:
- return gUnknown_84791CC[gBattleStruct->field_97 - 1];
- case 3:
- return gUnknown_84791E8[gBattleStruct->field_97 - 1];
+ return sPokedudeTexts_Battle[gBattleStruct->field_97 - 1];
+ case TTVSCR_STATUS:
+ return sPokedudeTexts_Status[gBattleStruct->field_97 - 1];
+ case TTVSCR_MATCHUPS:
+ return sPokedudeTexts_TypeMatchup[gBattleStruct->field_97 - 1];
+ case TTVSCR_CATCHING:
+ return sPokedudeTexts_Catching[gBattleStruct->field_97 - 1];
}
}
diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c
index 4b5153c7c..28ed4091e 100644
--- a/src/battle_controller_safari.c
+++ b/src/battle_controller_safari.c
@@ -9,16 +9,12 @@
#include "item_menu.h"
#include "link.h"
#include "main.h"
-#include "m4a.h"
#include "palette.h"
#include "pokeball.h"
#include "pokemon.h"
-#include "reshow_battle_screen.h"
#include "sound.h"
-#include "task.h"
#include "text.h"
#include "util.h"
-#include "window.h"
#include "strings.h"
#include "constants/songs.h"
#include "constants/battle_anim.h"
diff --git a/src/battle_controllers.c b/src/battle_controllers.c
index ca2ef0b22..834b9e6b6 100644
--- a/src/battle_controllers.c
+++ b/src/battle_controllers.c
@@ -35,7 +35,7 @@ void HandleLinkBattleSetup(void)
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
if (gWirelessCommType)
- sub_800B1F4();
+ SetWirelessCommType1();
if (!gReceivedRemoteLinkPlayers)
OpenLink();
CreateTask(sub_8081A90, 0);
@@ -491,7 +491,7 @@ void sub_800DD28(void)
if (gReceivedRemoteLinkPlayers && (gBattleTypeFlags & BATTLE_TYPE_20) && (gLinkPlayers[0].linkType == 0x2211))
{
- sub_80FBB4C();
+ LinkRfu_DestroyIdleTask();
for (i = 0; i < GetLinkPlayerCount(); ++i)
{
if (GetBlockReceivedStatus() & gBitTable[i])
diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c
index 60cff27be..127b0903b 100644
--- a/src/battle_gfx_sfx_util.c
+++ b/src/battle_gfx_sfx_util.c
@@ -13,8 +13,6 @@
#include "party_menu.h"
#include "battle.h"
#include "battle_main.h"
-#include "battle_controllers.h"
-#include "battle_ai_script_commands.h"
#include "battle_anim.h"
#include "battle_interface.h"
#include "constants/battle_anim.h"
@@ -546,7 +544,7 @@ bool8 BattleLoadAllHealthBoxesGfx(u8 state)
void LoadBattleBarGfx(u8 arg0)
{
- LZDecompressWram(gFile_graphics_interface_hp_numbers, gMonSpritesGfxPtr->barFontGfx);
+ LZDecompressWram(gInterfaceGfx_HPNumbers, gMonSpritesGfxPtr->barFontGfx);
}
bool8 BattleInitAllSprites(u8 *state, u8 *battlerId)
diff --git a/src/battle_interface.c b/src/battle_interface.c
index 56e9e0fad..e5145adc0 100644
--- a/src/battle_interface.c
+++ b/src/battle_interface.c
@@ -12,7 +12,6 @@
#include "safari_zone.h"
#include "sound.h"
#include "string_util.h"
-#include "strings.h"
#include "text.h"
#include "window.h"
#include "constants/songs.h"
diff --git a/src/battle_main.c b/src/battle_main.c
index 76f373f8f..bbfcf5cf9 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -8,13 +8,11 @@
#include "battle_message.h"
#include "battle_scripts.h"
#include "battle_setup.h"
-#include "battle_tower.h"
#include "battle_string_ids.h"
#include "berry.h"
#include "bg.h"
#include "data.h"
#include "decompress.h"
-#include "dma3.h"
#include "event_data.h"
#include "evolution_scene.h"
#include "graphics.h"
@@ -40,14 +38,12 @@
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
-#include "strings.h"
#include "task.h"
#include "text.h"
#include "trig.h"
#include "vs_seeker.h"
#include "util.h"
#include "window.h"
-#include "cable_club.h"
#include "constants/abilities.h"
#include "constants/battle_move_effects.h"
#include "constants/battle_setup.h"
@@ -645,17 +641,17 @@ void CB2_InitBattle(void)
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- HelpSystem_SetSomeVariable2(0x19);
+ SetHelpContext(HELPCONTEXT_TRAINER_BATTLE_DOUBLE);
else
- HelpSystem_SetSomeVariable2(0x18);
+ SetHelpContext(HELPCONTEXT_TRAINER_BATTLE_SINGLE);
}
else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
{
- HelpSystem_SetSomeVariable2(0x1A);
+ SetHelpContext(HELPCONTEXT_SAFARI_BATTLE);
}
else
{
- HelpSystem_SetSomeVariable2(0x17);
+ SetHelpContext(HELPCONTEXT_WILD_BATTLE);
}
}
}
@@ -979,7 +975,7 @@ static void CB2_HandleStartBattle(void)
ResetBlockReceivedFlags();
sub_8010414(2, playerMultiplayerId);
SetAllPlayersBerryData();
- taskId = CreateTask(sub_800F6FC, 0);
+ taskId = CreateTask(InitLinkBattleVsScreen, 0);
gTasks[taskId].data[1] = 270;
gTasks[taskId].data[2] = 90;
gTasks[taskId].data[5] = 0;
@@ -1152,9 +1148,9 @@ static void CB2_PreInitMultiBattle(void)
{
++gBattleCommunication[MULTIUSE_STATE];
if (gWirelessCommType)
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
else
- sub_800AAC0();
+ Link_TryStartSend5FFF();
}
break;
case 3:
@@ -1227,7 +1223,7 @@ static void CB2_HandleStartMultiBattle(void)
SetAllPlayersBerryData();
SetDeoxysStats();
memcpy(gDecompressionBuffer, gPlayerParty, sizeof(struct Pokemon) * 3);
- taskId = CreateTask(sub_800F6FC, 0);
+ taskId = CreateTask(InitLinkBattleVsScreen, 0);
gTasks[taskId].data[1] = 270;
gTasks[taskId].data[2] = 90;
gTasks[taskId].data[5] = 0;
@@ -1785,7 +1781,7 @@ void sub_8011A1C(void)
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 4;
SetVBlankCallback(VBlankCB_Battle);
- taskId = CreateTask(sub_800F6FC, 0);
+ taskId = CreateTask(InitLinkBattleVsScreen, 0);
gTasks[taskId].data[1] = 270;
gTasks[taskId].data[2] = 90;
gTasks[taskId].data[5] = 1;
@@ -3717,7 +3713,7 @@ static void HandleEndTurn_BattleLost(void)
}
else
{
- if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && ScrSpecial_GetTrainerBattleMode() == TRAINER_BATTLE_EARLY_RIVAL)
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && GetTrainerBattleMode() == TRAINER_BATTLE_EARLY_RIVAL)
{
if (GetRivalBattleFlags() & RIVAL_BATTLE_HEAL_AFTER)
gBattleCommunication[MULTISTRING_CHOOSER] = 1; // Dont do white out text
@@ -4164,7 +4160,6 @@ bool8 TryRunFromBattle(u8 battler)
{
bool8 effect = FALSE;
u8 holdEffect;
- u8 pyramidMultiplier;
u8 speedVar;
if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY)
diff --git a/src/battle_message.c b/src/battle_message.c
index 4f95ae364..7ca47e6fb 100644
--- a/src/battle_message.c
+++ b/src/battle_message.c
@@ -1271,9 +1271,9 @@ const u8 gUnknown_83FE860[] = _(" is");
const u8 gUnknown_83FE864[] = _(" is");
const u8 gText_BadEgg[] = _("Bad EGG");
const u8 gUnknown_83FE870[] = _("ミツル");
-const u8 gUnknown_83FE874[] = _("{HIGHLIGHT 0}Win");
-const u8 gUnknown_83FE87B[] = _("{HIGHLIGHT 0}Loss");
-const u8 gUnknown_83FE883[] = _("{HIGHLIGHT 0}Draw");
+const u8 gText_Win[] = _("{HIGHLIGHT 0}Win");
+const u8 gText_Loss[] = _("{HIGHLIGHT 0}Loss");
+const u8 gText_Draw[] = _("{HIGHLIGHT 0}Draw");
static const u8 sText_SpaceIs[] = _(" is");
static const u8 sText_ApostropheS[] = _("'s");
const u8 gUnknown_83FE892[] = _("a NORMAL move");
@@ -1294,9 +1294,9 @@ const u8 gUnknown_83FE94D[] = _("a PSYCHIC move");
const u8 gUnknown_83FE95C[] = _("an ICE move");
const u8 gUnknown_83FE968[] = _("a DRAGON move");
const u8 gUnknown_83FE976[] = _("a DARK move");
-const u8 gUnknown_83FE982[] = _("TIME BOARD");
-const u8 gUnknown_83FE98D[] = _("CLEAR TIME");
-const u8 gUnknown_83FE998[] = _("{STR_VAR_1}MIN. {STR_VAR_2}.{STR_VAR_3}SEC.");
+const u8 gText_TimeBoard[] = _("TIME BOARD");
+const u8 gText_ClearTime[] = _("CLEAR TIME"); // Unused
+const u8 gText_XMinYZSec[] = _("{STR_VAR_1}MIN. {STR_VAR_2}.{STR_VAR_3}SEC.");
const u8 gUnknown_83FE9A9[] = _("1F");
const u8 gUnknown_83FE9AC[] = _("2F");
const u8 gUnknown_83FE9AF[] = _("3F");
@@ -1306,7 +1306,7 @@ const u8 gUnknown_83FE9B8[] = _("6F");
const u8 gUnknown_83FE9BB[] = _("7F");
const u8 gUnknown_83FE9BE[] = _("8F");
-const u8 *const gUnknown_83FE9C4[] = {
+const u8 *const gTrainerTowerChallengeTypeTexts[NUM_TOWER_CHALLENGE_TYPES] = {
gOtherText_Single,
gOtherText_Double,
gOtherText_Knockout,
@@ -1990,7 +1990,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)
toCpy = gTrainerClassNames[GetBattleTowerTrainerClassNameId()];
else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)
- toCpy = gTrainerClassNames[sub_815DA10()];
+ toCpy = gTrainerClassNames[GetTrainerTowerOpponentClass()];
else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER)
toCpy = gTrainerClassNames[GetEreaderTrainerClassId()];
else
@@ -2014,7 +2014,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
}
else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)
{
- sub_815DA28(text);
+ GetTrainerTowerOpponentName(text);
toCpy = text;
}
else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER)
@@ -2054,7 +2054,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
case B_TXT_TRAINER1_LOSE_TEXT: // trainerA lose text
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)
{
- sub_815DC40(gStringVar4, 0);
+ GetTrainerTowerOpponentLoseText(gStringVar4, 0);
toCpy = gStringVar4;
}
else
@@ -2065,7 +2065,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
case B_TXT_TRAINER1_WIN_TEXT: // trainerA win text
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)
{
- sub_815DBF4(gStringVar4, 0);
+ GetTrainerTowerOpponentWinText(gStringVar4, 0);
toCpy = gStringVar4;
}
else
@@ -2074,11 +2074,11 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
}
break;
case B_TXT_TRAINER2_LOSE_TEXT:
- sub_815DC40(gStringVar4, 1);
+ GetTrainerTowerOpponentLoseText(gStringVar4, 1);
toCpy = gStringVar4;
break;
case B_TXT_TRAINER2_WIN_TEXT:
- sub_815DBF4(gStringVar4, 1);
+ GetTrainerTowerOpponentWinText(gStringVar4, 1);
toCpy = gStringVar4;
break;
case B_TXT_26: // ?
diff --git a/src/battle_records.c b/src/battle_records.c
index 07ff665d9..3196d9bad 100644
--- a/src/battle_records.c
+++ b/src/battle_records.c
@@ -88,7 +88,7 @@ static u8 *const sStringVars[3] = {
gStringVar3
};
-void Special_BattleRecords(void)
+void ShowBattleRecords(void)
{
SetVBlankCallback(NULL);
SetMainCallback2(MainCB2_SetUp);
@@ -419,7 +419,7 @@ void ClearPlayerLinkBattleRecords(void)
static void IncTrainerCardWinCount(s32 battlerId)
{
- u16 *wins = &gTrainerCards[battlerId].linkBattleWins;
+ u16 *wins = &gTrainerCards[battlerId].rse.linkBattleWins;
(*wins)++;
if (*wins > 9999)
*wins = 9999;
@@ -427,7 +427,7 @@ static void IncTrainerCardWinCount(s32 battlerId)
static void IncTrainerCardLossCount(s32 battlerId)
{
- u16 *losses = &gTrainerCards[battlerId].linkBattleLosses;
+ u16 *losses = &gTrainerCards[battlerId].rse.linkBattleLosses;
(*losses)++;
if (*losses > 9999)
*losses = 9999;
@@ -453,7 +453,7 @@ void TryRecordLinkBattleOutcome(s32 battlerId)
if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(UNION_ROOM) || gSaveBlock1Ptr->location.mapNum != MAP_NUM(UNION_ROOM))
{
UpdateBattleOutcomeOnTrainerCards(battlerId);
- AddOpponentLinkBattleRecord(&gSaveBlock2Ptr->linkBattleRecords, gTrainerCards[battlerId].playerName, gTrainerCards[battlerId].trainerId, gBattleOutcome, gLinkPlayers[battlerId].language);
+ AddOpponentLinkBattleRecord(&gSaveBlock2Ptr->linkBattleRecords, gTrainerCards[battlerId].rse.playerName, gTrainerCards[battlerId].rse.trainerId, gBattleOutcome, gLinkPlayers[battlerId].language);
}
}
diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c
index 527e32bcc..de505827f 100644
--- a/src/battle_script_commands.c
+++ b/src/battle_script_commands.c
@@ -3,7 +3,6 @@
#include "util.h"
#include "pokemon.h"
#include "random.h"
-#include "data.h"
#include "text.h"
#include "sound.h"
#include "pokedex.h"
@@ -14,7 +13,6 @@
#include "bg.h"
#include "string_util.h"
#include "pokemon_icon.h"
-#include "m4a.h"
#include "mail.h"
#include "event_data.h"
#include "strings.h"
@@ -30,7 +28,6 @@
#include "battle.h"
#include "battle_message.h"
#include "battle_anim.h"
-#include "battle_setup.h"
#include "battle_ai_script_commands.h"
#include "battle_scripts.h"
#include "battle_string_ids.h"
@@ -48,7 +45,7 @@
#include "constants/abilities.h"
#include "constants/pokemon.h"
#include "constants/trainers.h"
-#include "constants/map_types.h"
+#include "constants/maps.h"
#define DEFENDER_IS_PROTECTED ((gProtectStructs[gBattlerTarget].protected) && (gBattleMoves[gCurrentMove].flags & FLAG_PROTECT_AFFECTED))
diff --git a/src/battle_setup.c b/src/battle_setup.c
index ae6aaf8be..82a73990b 100644
--- a/src/battle_setup.c
+++ b/src/battle_setup.c
@@ -13,7 +13,7 @@
#include "strings.h"
#include "string_util.h"
#include "event_data.h"
-#include "event_object_80688E4.h"
+#include "event_object_movement.h"
#include "metatile_behavior.h"
#include "event_scripts.h"
#include "fldeff.h"
@@ -22,10 +22,8 @@
#include "field_player_avatar.h"
#include "field_screen_effect.h"
#include "field_message_box.h"
-#include "event_object_movement.h"
#include "vs_seeker.h"
#include "battle.h"
-#include "battle_setup.h"
#include "battle_transition.h"
#include "battle_controllers.h"
#include "constants/battle_setup.h"
@@ -37,7 +35,6 @@
#include "constants/pokemon.h"
#include "constants/trainers.h"
#include "constants/trainer_classes.h"
-#include "constants/map_types.h"
enum
{
@@ -224,7 +221,7 @@ static bool8 CheckSilphScopeInPokemonTower(u16 mapGroup, u16 mapNum)
return FALSE;
}
-void BattleSetup_StartWildBattle(void)
+void StartWildBattle(void)
{
if (GetSafariZoneFlag())
DoSafariBattle();
@@ -246,7 +243,7 @@ static void DoStandardWildBattle(void)
IncrementGameStat(GAME_STAT_WILD_BATTLES);
}
-void BattleSetup_StartRoamerBattle(void)
+void StartRoamerBattle(void)
{
ScriptContext2_Enable();
FreezeObjectEvents();
@@ -288,7 +285,7 @@ static void DoTrainerBattle(void)
IncrementGameStat(GAME_STAT_TRAINER_BATTLES);
}
-void ScrSpecial_StartOldManTutorialBattle(void)
+void StartOldManTutorialBattle(void)
{
CreateMaleMon(&gEnemyParty[0], SPECIES_WEEDLE, 5);
ScriptContext2_Enable();
@@ -297,7 +294,7 @@ void ScrSpecial_StartOldManTutorialBattle(void)
CreateBattleStartTask(B_TRANSITION_SLICED_SCREEN, 0);
}
-void BattleSetup_StartScriptedWildBattle(void)
+void StartScriptedWildBattle(void)
{
ScriptContext2_Enable();
gMain.savedCallback = CB2_EndScriptedWildBattle;
@@ -307,7 +304,7 @@ void BattleSetup_StartScriptedWildBattle(void)
IncrementGameStat(GAME_STAT_WILD_BATTLES);
}
-void ScrSpecial_StartMarowakBattle(void)
+void StartMarowakBattle(void)
{
ScriptContext2_Enable();
gMain.savedCallback = CB2_EndMarowakBattle;
@@ -326,7 +323,7 @@ void ScrSpecial_StartMarowakBattle(void)
IncrementGameStat(GAME_STAT_WILD_BATTLES);
}
-void ScrSpecial_StartSouthernIslandBattle(void)
+void StartSouthernIslandBattle(void)
{
ScriptContext2_Enable();
gMain.savedCallback = CB2_EndScriptedWildBattle;
@@ -336,7 +333,7 @@ void ScrSpecial_StartSouthernIslandBattle(void)
IncrementGameStat(GAME_STAT_WILD_BATTLES);
}
-void Special_StartLegendaryBattle(void)
+void StartLegendaryBattle(void)
{
u16 species;
@@ -367,7 +364,7 @@ void Special_StartLegendaryBattle(void)
IncrementGameStat(GAME_STAT_WILD_BATTLES);
}
-void Special_StartGroudonKyogreBattle(void)
+void StartGroudonKyogreBattle(void)
{
ScriptContext2_Enable();
gMain.savedCallback = CB2_EndScriptedWildBattle;
@@ -380,7 +377,7 @@ void Special_StartGroudonKyogreBattle(void)
IncrementGameStat(GAME_STAT_WILD_BATTLES);
}
-void Special_StartRegiBattle(void)
+void StartRegiBattle(void)
{
ScriptContext2_Enable();
gMain.savedCallback = CB2_EndScriptedWildBattle;
@@ -781,7 +778,7 @@ const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data)
{
case TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT:
TrainerBattleLoadArgs(sOrdinaryNoIntroBattleParams, data);
- return EventScript_DoTrainerBattle;
+ return EventScript_DoNoIntroTrainerBattle;
case TRAINER_BATTLE_DOUBLE:
TrainerBattleLoadArgs(sDoubleBattleParams, data);
SetMapVarsToTrainer();
@@ -810,7 +807,7 @@ const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data)
return EventScript_TryDoRematchBattle;
case TRAINER_BATTLE_EARLY_RIVAL:
TrainerBattleLoadArgs(sEarlyRivalBattleParams, data);
- return EventScript_DoTrainerBattle;
+ return EventScript_DoNoIntroTrainerBattle;
default:
TrainerBattleLoadArgs(sOrdinaryBattleParams, data);
SetMapVarsToTrainer();
@@ -823,7 +820,7 @@ void ConfigureAndSetUpOneTrainerBattle(u8 trainerEventObjId, const u8 *trainerSc
gSelectedObjectEvent = trainerEventObjId;
gSpecialVar_LastTalked = gObjectEvents[trainerEventObjId].localId;
BattleSetup_ConfigureTrainerBattle(trainerScript + 1);
- ScriptContext1_SetupScript(gUnknown_81A4EB4);
+ ScriptContext1_SetupScript(EventScript_DoTrainerBattleFromApproach);
ScriptContext2_Enable();
}
@@ -841,7 +838,7 @@ void SetUpTrainerMovement(void)
SetTrainerMovementType(objectEvent, GetTrainerFacingDirectionMovementType(objectEvent->facingDirection));
}
-u8 ScrSpecial_GetTrainerBattleMode(void)
+u8 GetTrainerBattleMode(void)
{
return sTrainerBattleMode;
}
@@ -851,7 +848,7 @@ u16 GetRivalBattleFlags(void)
return sRivalBattleFlags;
}
-u16 ScrSpecial_HasTrainerBeenFought(void)
+u16 Script_HasTrainerBeenFought(void)
{
return FlagGet(GetTrainerAFlag());
}
@@ -882,10 +879,10 @@ void ClearTrainerFlag(u16 trainerId)
FlagClear(FLAG_TRAINER_FLAG_START + trainerId);
}
-void BattleSetup_StartTrainerBattle(void)
+void StartTrainerBattle(void)
{
gBattleTypeFlags = BATTLE_TYPE_TRAINER;
- if (ScrSpecial_GetTrainerBattleMode() == TRAINER_BATTLE_EARLY_RIVAL && GetRivalBattleFlags() & RIVAL_BATTLE_TUTORIAL)
+ if (GetTrainerBattleMode() == TRAINER_BATTLE_EARLY_RIVAL && GetRivalBattleFlags() & RIVAL_BATTLE_TUTORIAL)
gBattleTypeFlags |= BATTLE_TYPE_FIRST_BATTLE;
gMain.savedCallback = CB2_EndTrainerBattle;
DoTrainerBattle();
@@ -959,7 +956,7 @@ static void CB2_EndRematchBattle(void)
}
}
-void ScrSpecial_StartTrainerEyeRematch(void)
+void StartRematchBattle(void)
{
gBattleTypeFlags = BATTLE_TYPE_TRAINER;
gMain.savedCallback = CB2_EndRematchBattle;
@@ -967,7 +964,7 @@ void ScrSpecial_StartTrainerEyeRematch(void)
ScriptContext1_Stop();
}
-void ScrSpecial_ShowTrainerIntroSpeech(void)
+void ShowTrainerIntroSpeech(void)
{
ShowFieldMessage(GetIntroSpeechOfApproachingTrainer());
}
@@ -988,7 +985,7 @@ const u8 *BattleSetup_GetTrainerPostBattleScript(void)
return Test_EventScript_Sign;
}
-void ScrSpecial_ShowTrainerNonBattlingSpeech(void)
+void ShowTrainerCantBattleSpeech(void)
{
ShowFieldMessage(GetTrainerCantBattleSpeech());
}
diff --git a/src/battle_tower.c b/src/battle_tower.c
index cecc05e29..818c909aa 100644
--- a/src/battle_tower.c
+++ b/src/battle_tower.c
@@ -24,7 +24,7 @@
#include "constants/moves.h"
#include "constants/pokemon.h"
#include "constants/vars.h"
-#include "constants/object_events.h"
+#include "constants/event_objects.h"
static EWRAM_DATA u16 sSpecialVar_0x8004_Copy = 0;
@@ -177,7 +177,7 @@ static const u16 sLongStreakPrizes[] = {
ITEM_CHOICE_BAND
};
-void ScrSpecial_BattleTowerMapScript2(void)
+void BattleTowerMapScript2(void)
{
u8 count = 0;
s32 levelType;
@@ -389,7 +389,7 @@ void ChooseNextBattleTowerTrainer(void)
static void SetBattleTowerTrainerGfxId(u8 trainerClass)
{
- VarSet(VAR_OBJ_GFX_ID_0, OBJECT_EVENT_GFX_YOUNGSTER);
+ VarSet(VAR_OBJ_GFX_ID_0, OBJ_EVENT_GFX_YOUNGSTER);
}
void SetEReaderTrainerGfxId(void)
@@ -825,7 +825,7 @@ void CheckPartyBattleTowerBanlist(void)
}
}
-static void PrintBattleTowerTrainerMessage(const u16 *greeting)
+static void BufferBattleTowerTrainerMessage(const u16 *greeting)
{
s32 i;
if (EC_DoesEasyChatStringFitOnLine(greeting, 3, 2, 18))
@@ -847,11 +847,11 @@ static void PrintBattleTowerTrainerMessage(const u16 *greeting)
void PrintBattleTowerTrainerGreeting(void)
{
if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
- PrintBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.greeting);
+ BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.greeting);
else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
- PrintBattleTowerTrainerMessage(gBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].greeting);
+ BufferBattleTowerTrainerMessage(gBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].greeting);
else
- PrintBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].greeting);
+ BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].greeting);
}
static void CB2_FinishEReaderBattle(void)
@@ -1395,9 +1395,9 @@ void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *ereaderTrainer)
((u32 *)ereaderTrainer)[i] = 0;
}
-void PrintEReaderTrainerGreeting(void)
+void BufferEReaderTrainerGreeting(void)
{
- PrintBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.greeting);
+ BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.greeting);
}
static void PrintEReaderTrainerFarewellMessage(void)
@@ -1405,9 +1405,9 @@ static void PrintEReaderTrainerFarewellMessage(void)
if (gBattleOutcome == B_OUTCOME_DREW)
gStringVar4[0] = EOS;
else if (gBattleOutcome == B_OUTCOME_WON)
- PrintBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.farewellPlayerWon);
+ BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.farewellPlayerWon);
else
- PrintBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.farewellPlayerLost);
+ BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.farewellPlayerLost);
}
void Dummy_TryEnableBravoTrainerBattleTower(void)
diff --git a/src/battle_transition.c b/src/battle_transition.c
index 463a3d930..b33d72f15 100644
--- a/src/battle_transition.c
+++ b/src/battle_transition.c
@@ -644,7 +644,7 @@ static bool8 BT_Phase1Blink(struct Task *task)
static bool8 BT_WaitForPhase1(struct Task *task)
{
- if (FindTaskIdByFunc(sBT_Phase1Tasks[task->tTransitionId]) == TASK_NONE)
+ if (FindTaskIdByFunc(sBT_Phase1Tasks[task->tTransitionId]) == TAIL_SENTINEL)
{
++task->tState;
return TRUE;
@@ -665,7 +665,7 @@ static bool8 BT_Phase2LaunchAnimTask(struct Task *task)
static bool8 BT_WaitForPhase2(struct Task *task)
{
task->tTransitionDone = FALSE;
- if (FindTaskIdByFunc(sBT_Phase2Tasks[task->tTransitionId]) == TASK_NONE)
+ if (FindTaskIdByFunc(sBT_Phase2Tasks[task->tTransitionId]) == TAIL_SENTINEL)
task->tTransitionDone = TRUE;
return FALSE;
}
@@ -3432,7 +3432,7 @@ static void BT_CreatePhase1SubTask(s16 fadeOutDelay, s16 fadeInDelay, s16 blinkT
static bool8 BT_IsPhase1Done(void)
{
- if (FindTaskIdByFunc(BT_Phase1SubTask) == TASK_NONE)
+ if (FindTaskIdByFunc(BT_Phase1SubTask) == TAIL_SENTINEL)
return TRUE;
else
return FALSE;
diff --git a/src/battle_util2.c b/src/battle_util2.c
index a3a748767..6de4941cb 100644
--- a/src/battle_util2.c
+++ b/src/battle_util2.c
@@ -5,7 +5,6 @@
#include "pokemon.h"
#include "malloc.h"
#include "trainer_tower.h"
-#include "battle_util2.h"
void AllocateBattleResources(void)
{
diff --git a/src/berry_crush.c b/src/berry_crush.c
new file mode 100644
index 000000000..e59cad21a
--- /dev/null
+++ b/src/berry_crush.c
@@ -0,0 +1,228 @@
+#include "global.h"
+#include "gflib.h"
+#include "berry_crush.h"
+#include "berry_pouch.h"
+#include "berry_powder.h"
+#include "item.h"
+#include "item_menu.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "math_util.h"
+#include "overworld.h"
+#include "task.h"
+#include "constants/songs.h"
+#include "constants/items.h"
+
+static EWRAM_DATA struct BerryCrushGame *gUnknown_203F3DC = NULL;
+
+static void sub_814B860(void);
+static void sub_814BA6C(void);
+static void sub_814BA80(void);
+static void sub_814BA98(u8 taskId);
+
+struct BerryCrushGame *sub_814B6F0(void)
+{
+ return gUnknown_203F3DC;
+}
+
+u32 sub_814B6FC(MainCallback callback)
+{
+ if (!gUnknown_203F3DC)
+ return 2;
+
+ if (!callback)
+ callback = gUnknown_203F3DC->unk0;
+
+ DestroyTask(gUnknown_203F3DC->unkA);
+ FREE_AND_SET_NULL(gUnknown_203F3DC);
+ SetMainCallback2(callback);
+ if (callback == CB2_ReturnToField)
+ {
+ PlayNewMapMusic(MUS_POKECEN);
+ SetMainCallback1(CB1_Overworld);
+ }
+
+ return 0;
+}
+
+void StartBerryCrush(MainCallback callback)
+{
+ u8 playerCount = 0;
+ u8 multiplayerId;
+
+ if (!gReceivedRemoteLinkPlayers || gWirelessCommType == 0)
+ {
+ SetMainCallback2(callback);
+ Rfu.linkman_param[0] = 0;
+ Rfu.linkman_param[1] = 0;
+ Rfu.errorState = 1;
+ return;
+ }
+
+ playerCount = GetLinkPlayerCount();
+ multiplayerId = GetMultiplayerId();
+ if (playerCount < 2 || multiplayerId >= playerCount)
+ {
+ SetMainCallback2(callback);
+ Rfu.linkman_param[0] = 0;
+ Rfu.linkman_param[1] = 0;
+ Rfu.errorState = 1;
+ return;
+ }
+
+ gUnknown_203F3DC = AllocZeroed(sizeof(*gUnknown_203F3DC));
+ if (!gUnknown_203F3DC)
+ {
+ SetMainCallback2(callback);
+ Rfu.linkman_param[0] = 0;
+ Rfu.linkman_param[1] = 0;
+ Rfu.errorState = 1;
+ return;
+ }
+
+ gUnknown_203F3DC->unk0 = callback;
+ gUnknown_203F3DC->unk8 = multiplayerId;
+ gUnknown_203F3DC->unk9 = playerCount;
+ sub_814BABC(gUnknown_203F3DC);
+ gUnknown_203F3DC->unk12 = 1;
+ gUnknown_203F3DC->unkE = 1;
+ gUnknown_203F3DC->unkF = 6;
+ sub_814D564(gUnknown_203F3DC->unk36, 1, -1, 0, 16, 0, 0);
+ sub_814BB4C(4, 1, gUnknown_203F3DC->unk36);
+ SetMainCallback2(sub_814BA80);
+ gUnknown_203F3DC->unkA = CreateTask(sub_814BA98, 8);
+}
+
+static void sub_814B860(void)
+{
+ if (gSpecialVar_ItemId < FIRST_BERRY_INDEX || gSpecialVar_ItemId > LAST_BERRY_INDEX + 1)
+ gSpecialVar_ItemId = ITEM_CHERI_BERRY;
+ else
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+
+ gUnknown_203F3DC->unk68.as_four_players.others[gUnknown_203F3DC->unk8].unk0 = gSpecialVar_ItemId - FIRST_BERRY_INDEX;
+ gUnknown_203F3DC->unkE = 1;
+ gUnknown_203F3DC->unkF = 9;
+ sub_814D564(gUnknown_203F3DC->unk36, 0, -1, 0, 16, 0, 0);
+ sub_814BB4C(4, 1, gUnknown_203F3DC->unk36);
+ gUnknown_203F3DC->unkA = CreateTask(sub_814BA98, 8);
+ SetMainCallback2(sub_814BA80);
+}
+
+void sub_814B8F0(void)
+{
+ DestroyTask(gUnknown_203F3DC->unkA);
+ InitBerryPouch(BERRYPOUCH_FROMBERRYCRUSH, sub_814B860, FALSE);
+}
+
+void sub_814B914(void)
+{
+ SetVBlankCallback(sub_814BA6C);
+}
+
+void sub_814B924(void)
+{
+ SetVBlankCallback(NULL);
+}
+
+void sub_814B930(void)
+{
+ u32 var0, var1;
+
+ var0 = gUnknown_203F3DC->unk68.as_four_players.unk00.unk04;
+ var0 <<= 8;
+ var0 = sub_80D8B68(var0, 60 << 8);
+ var1 = gUnknown_203F3DC->unk68.as_four_players.unk00.unk0A;
+ var1 <<= 8;
+ var1 = sub_80D8B68(var1, var0) & 0xFFFF;
+ gUnknown_203F3DC->unk16 = var1;
+ switch (gUnknown_203F3DC->unk9)
+ {
+ case 2:
+ if (gUnknown_203F3DC->unk16 > gSaveBlock2Ptr->berryCrush.berryCrushResults[0])
+ {
+ gUnknown_203F3DC->unk25_1 = 1;
+ gSaveBlock2Ptr->berryCrush.berryCrushResults[0] = gUnknown_203F3DC->unk16;
+ }
+ break;
+ case 3:
+ if (gUnknown_203F3DC->unk16 > gSaveBlock2Ptr->berryCrush.berryCrushResults[1])
+ {
+ gUnknown_203F3DC->unk25_1 = 1;
+ gSaveBlock2Ptr->berryCrush.berryCrushResults[1] = gUnknown_203F3DC->unk16;
+ }
+ break;
+ case 4:
+ if (gUnknown_203F3DC->unk16 > gSaveBlock2Ptr->berryCrush.berryCrushResults[2])
+ {
+ gUnknown_203F3DC->unk25_1 = 1;
+ gSaveBlock2Ptr->berryCrush.berryCrushResults[2] = gUnknown_203F3DC->unk16;
+ }
+ break;
+ case 5:
+ if (gUnknown_203F3DC->unk16 > gSaveBlock2Ptr->berryCrush.berryCrushResults[3])
+ {
+ gUnknown_203F3DC->unk25_1 = 1;
+ gSaveBlock2Ptr->berryCrush.berryCrushResults[3] = gUnknown_203F3DC->unk16;
+ }
+ break;
+ }
+
+ gUnknown_203F3DC->unk1C = gUnknown_203F3DC->unk68.as_four_players.unk00.unk00;
+ if (GiveBerryPowder(gUnknown_203F3DC->unk1C))
+ return;
+
+ gUnknown_203F3DC->unk25_0 = 1;
+}
+
+static void sub_814BA6C(void)
+{
+ TransferPlttBuffer();
+ LoadOam();
+ ProcessSpriteCopyRequests();
+}
+
+static void sub_814BA80(void)
+{
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+static void sub_814BA98(u8 taskId)
+{
+ if (gUnknown_203F3DC->unk4)
+ gUnknown_203F3DC->unk4(gUnknown_203F3DC, gUnknown_203F3DC->unk36);
+
+ sub_814D9CC(gUnknown_203F3DC);
+}
+
+void sub_814BABC(struct BerryCrushGame *arg0)
+{
+ u8 i;
+
+ for (i = 0; i < arg0->unk9; i++)
+ {
+ StringCopy(PLAYER_UNK14(arg0, i), gLinkPlayers[i].name);
+ arg0->unk68.as_five_players.unk1C[i].unk14[PLAYER_NAME_LENGTH] = EOS;
+ }
+ for (; i < 5; i++)
+ {
+ memset(PLAYER_UNK14(arg0, i), 1, PLAYER_NAME_LENGTH);
+ arg0->unk68.as_five_players.unk1C[i].unk14[PLAYER_NAME_LENGTH] = EOS;
+ }
+
+ switch (gSaveBlock2Ptr->optionsTextSpeed)
+ {
+ case OPTIONS_TEXT_SPEED_SLOW:
+ arg0->unkB = 8;
+ break;
+ case OPTIONS_TEXT_SPEED_MID:
+ arg0->unkB = 4;
+ break;
+ case OPTIONS_TEXT_SPEED_FAST:
+ arg0->unkB = 1;
+ break;
+ }
+}
diff --git a/src/berry_crush_2.c b/src/berry_crush_2.c
new file mode 100644
index 000000000..e76f33988
--- /dev/null
+++ b/src/berry_crush_2.c
@@ -0,0 +1,1480 @@
+#include "global.h"
+#include "gflib.h"
+#include "berry.h"
+#include "berry_crush.h"
+#include "berry_powder.h"
+#include "item.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "math_util.h"
+#include "menu.h"
+#include "minigame_countdown.h"
+#include "new_menu_helpers.h"
+#include "overworld.h"
+#include "random.h"
+#include "save.h"
+#include "strings.h"
+#include "constants/songs.h"
+
+static u32 sub_814BBB8(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BC10(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BC74(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BD7C(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BD9C(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BDBC(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BE0C(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BE64(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BE7C(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814BFD0(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814C118(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814C24C(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814C850(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814C8F8(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814C990(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814CB20(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814CC0C(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814CFA8(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814D094(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814D188(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814D240(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814D31C(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814D3A4(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814D468(struct BerryCrushGame * berryCrushGame, u8 *params);
+static u32 sub_814D4C8(struct BerryCrushGame * berryCrushGame, u8 *params);
+void sub_814D4D8(struct BerryCrushGame * r4);
+void sub_814D5A4(u8 *r0, u32 r1, u32 r2, u32 r3, u32 r5);
+
+static const u8 gUnknown_846E2E0[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
+static const u8 gUnknown_846E2E8[] = {0x00, 0x01, 0x02, 0x03, 0x05, 0x00, 0x00, 0x00};
+
+static const s8 gUnknown_846E2F0[][7] = {
+ {0x04, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00},
+ {0x04, 0x02, 0x00, 0xff, 0x00, 0x00, 0x00},
+ {0x04, 0x02, 0x00, 0xfe, 0x00, 0x00, 0x00},
+ {0x06, 0x03, 0x01, 0xff, 0xfd, 0xff, 0x00},
+ {0x06, 0x04, 0x01, 0xfe, 0xfc, 0xfe, 0x00},
+};
+
+ALIGNED(4) const u8 gUnknown_846E314[][4] = {
+ {0x03, 0x02, 0x01, 0x00},
+ {0x03, 0x03, 0x01, 0x00},
+ {0x03, 0x03, 0x02, 0x00},
+ {0x03, 0x04, 0x02, 0x00},
+ {0x03, 0x05, 0x03, 0x00}
+};
+
+static const u8 *const gUnknown_846E328[] = {
+ gUnknown_841CE3C,
+ gUnknown_841CE78,
+ gUnknown_841CEA8,
+ gUnknown_841CF14,
+ gUnknown_841CF50,
+ gUnknown_841CF70,
+ gUnknown_841CFA0,
+ gUnknown_841CFD4,
+ gUnknown_841D008
+};
+
+static u32 (*const gUnknown_846E34C[])(struct BerryCrushGame * berryCrushGame, u8 *params) = {
+ NULL,
+ sub_814BBB8,
+ sub_814BC10,
+ sub_814BC74,
+ sub_814BD7C,
+ sub_814BD9C,
+ sub_814BDBC,
+ sub_814BE0C,
+ sub_814BE64,
+ sub_814BE7C,
+ sub_814BFD0,
+ sub_814C118,
+ sub_814C24C,
+ sub_814C850,
+ sub_814C8F8,
+ sub_814C990,
+ sub_814CB20,
+ sub_814CC0C,
+ sub_814CFA8,
+ sub_814D094,
+ sub_814D188,
+ sub_814D240,
+ sub_814D31C,
+ sub_814D3A4,
+ sub_814D468,
+ sub_814D4C8
+};
+
+static const u8 gUnknown_846E3B4[][4] = {
+ {0x02, 0x04, 0x06, 0x07},
+ {0x03, 0x05, 0x08, 0x0b},
+ {0x03, 0x07, 0x0b, 0x0f},
+ {0x04, 0x08, 0x0c, 0x11}
+};
+
+static const u8 gUnknown_846E3C4[] = {0x05, 0x07, 0x09, 0x0c};
+
+static const u8 gUnknown_846E3C8[] = {0x03, 0x07, 0x0F, 0x1F};
+
+void sub_814BB4C(u16 r5, u8 r4, u8 *r7)
+{
+ struct BerryCrushGame * r6 = sub_814B6F0();
+
+ if (r5 > 25)
+ r5 = 0;
+ switch (r4)
+ {
+ case 0:
+ if (r5 != 0)
+ gUnknown_846E34C[r5](r6, r7);
+ if (r6->unkE > 25)
+ r6->unkE = r4;
+ r6->unk4 = gUnknown_846E34C[r6->unkE];
+ break;
+ case 1:
+ r6->unk4 = gUnknown_846E34C[r5];
+ break;
+ }
+}
+
+static u32 sub_814BBB8(struct BerryCrushGame * r6, u8 *r1)
+{
+ u16 r4;
+ u32 r0;
+#ifndef NONMATCHING // fake match, nobody can write such code
+ register u32 r2 asm("r2");
+ register u32 r3 asm("r3");
+
+ r2 = r1[0];
+ r3 = r1[1];
+ r3 <<= 8;
+ r2 |= r3;
+ r3 = r1[2];
+ r3 <<= 16;
+ r2 |= r3;
+ r3 = r1[3];
+ r3 <<= 24;
+ r0 = r2;
+ r0 |= r3;
+#else
+ u32 r2;
+
+ r0 = T1_READ_32(r1);
+#endif
+ r2 = r1[9];
+ r1[0] = r2;
+ r4 = r1[8] << 8;
+ r2 = r1[7];
+ r4 |= r2;
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ BeginNormalPaletteFade(r0, r1[4], r1[5], r1[6], r4);
+ UpdatePaletteFade();
+ r6->unkE = 2;
+ return 0;
+}
+
+static u32 sub_814BC10(struct BerryCrushGame * r4, u8 *r5)
+{
+ switch (r4->unkC)
+ {
+ case 0:
+ if (UpdatePaletteFade())
+ return 0;
+ if(r5[0] != 0)
+ ++r4->unkC;
+ else
+ r4->unkC = 3;
+ return 0;
+ case 1:
+ LinkRfu_SetRfuFuncToSend6600();
+ ++r4->unkC;
+ return 0;
+ case 2:
+ if (IsLinkTaskFinished())
+ {
+ ++r4->unkC;
+ return 0;
+ }
+ return 0;
+ case 3:
+ sub_814BB4C(r4->unkF, 1, NULL);
+ r4->unkC = 0;
+ return 0;
+ default:
+ ++r4->unkC;
+ return 0;
+ }
+}
+
+static u32 sub_814BC74(struct BerryCrushGame * r7, u8 *r5)
+{
+ u16 r4 = r5[3];
+
+ r4 <<= 8;
+ r4 |= r5[2];
+ switch (r7->unkC)
+ {
+ case 0:
+ DrawDialogueFrame(0, 0);
+ if (r5[1] & 2)
+ {
+ StringExpandPlaceholders(gStringVar4, gUnknown_846E328[r5[0]]);
+ AddTextPrinterParameterized2(0, 2, gStringVar4, r7->unkB, 0, 2, 1, 3);
+ }
+ else
+ {
+ AddTextPrinterParameterized2(0, 2, gUnknown_846E328[r5[0]], r7->unkB, 0, 2, 1, 3);
+ }
+ CopyWindowToVram(0, 3);
+ break;
+ case 1:
+ if (!IsTextPrinterActive(0))
+ {
+ if (r4 == 0)
+ ++r7->unkC;
+ break;
+ }
+ return 0;
+ case 2:
+ if (!(r4 & gMain.newKeys))
+ return 0;
+ break;
+ case 3:
+ if (r5[1] & 1)
+ ClearDialogWindowAndFrame(0, TRUE);
+ sub_814BB4C(r7->unkE, 1, NULL);
+ r7->unkC = r5[4];
+ return 0;
+ }
+ ++r7->unkC;
+ return 0;
+}
+
+static u32 sub_814BD7C(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ if (sub_814D5C8() != 0)
+ sub_814BB4C(r4->unkE, 0, r4->unk36);
+ return 0;
+}
+
+static u32 sub_814BD9C(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ if (sub_814D888() != 0)
+ sub_814BB4C(r4->unkE, 0, r4->unk36);
+ return 0;
+}
+
+static u32 sub_814BDBC(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ switch (r4->unkC)
+ {
+ case 0:
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 1:
+ if (IsLinkTaskFinished())
+ {
+ PlayNewMapMusic(MUS_SLOT);
+ sub_814BB4C(7, 1, NULL);
+ r4->unk12 = 3;
+ r4->unkC = 0;
+ }
+ return 0;
+ }
+ ++r4->unkC;
+ return 0;
+}
+
+static u32 sub_814BE0C(struct BerryCrushGame * r4, u8 *r5)
+{
+ switch (r4->unkC)
+ {
+ default:
+ ++r4->unkC;
+ break;
+ case 0:
+ sub_814D4D8(r4);
+ sub_814D5A4(r5, 0, 1, 0, 1);
+ r4->unkE = 7;
+ sub_814BB4C(3, 1, NULL);
+ break;
+ case 1:
+ r4->unkE = 8;
+ sub_814BB4C(5, 1, NULL);
+ r4->unkC = 2;
+ break;
+ }
+ return 0;
+}
+
+static u32 sub_814BE64(struct BerryCrushGame * r0, UNUSED u8 *r1)
+{
+ r0->unk4 = NULL;
+ SetMainCallback2(sub_814B8F0);
+ return 0;
+}
+
+static u32 sub_814BE7C(struct BerryCrushGame * r5, u8 *r2)
+{
+ u8 r3;
+
+ switch (r5->unkC)
+ {
+ case 0:
+ sub_814D5A4(r2, 1, 0, 0, 1);
+ r5->unkE = 9;
+ sub_814BB4C(3, 1, NULL);
+ return 0;
+ case 1:
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 2:
+ if (!IsLinkTaskFinished())
+ return 0;
+ memset(r5->unk40.unk2, 0, sizeof(r5->unk40.unk2));
+ r5->unk40.unk2[0] = r5->unk68.as_four_players.others[r5->unk8].unk0;
+ SendBlock(0, r5->unk40.unk2, 2);
+ break;
+ case 3:
+ if (!IsLinkTaskFinished())
+ return 0;
+ r5->unk10 = 0;
+ break;
+ case 4:
+ if (GetBlockReceivedStatus() != gUnknown_846E3C8[r5->unk9 - 2])
+ return 0;
+ for (r3 = 0; r3 < r5->unk9; ++r3)
+ {
+ r5->unk68.as_four_players.others[r3].unk0 = gBlockRecvBuffer[r3][0];
+ if (r5->unk68.as_four_players.others[r3].unk0 > 0xB0)
+ r5->unk68.as_four_players.others[r3].unk0 = 0;
+ r5->unk18 += gUnknown_83DFC9C[r5->unk68.as_four_players.others[r3].unk0].unk0;
+ r5->unk1C += gUnknown_83DFC9C[r5->unk68.as_four_players.others[r3].unk0].unk1;
+ }
+ r5->unk10 = 0;
+ ResetBlockReceivedFlags();
+ r5->unk20 = sub_80D8B68(r5->unk18 << 8, 0x2000);
+ break;
+ case 5:
+ ClearDialogWindowAndFrame(0, 1);
+ sub_814BB4C(10, 1, NULL);
+ r5->unk12 = 4;
+ r5->unkC = 0;
+ return 0;
+ }
+ ++r5->unkC;
+ return 0;
+}
+
+static u32 sub_814BFD0(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ switch (r4->unkC)
+ {
+ case 0:
+ sub_814DA24(r4, &r4->unk138);
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 1:
+ if (!IsLinkTaskFinished())
+ return 0;
+ r4->unk138.unk0 = 0;
+ r4->unk138.unk1 = 0;
+ r4->unk138.unk2 = 0;
+ r4->unk138.unk3 = 0;
+ break;
+ case 2:
+ r4->unk138.unk38[r4->unk138.unk0]->callback = sub_814DB84;
+ r4->unk138.unk38[r4->unk138.unk0]->affineAnimPaused = FALSE;
+ PlaySE(SE_NAGERU);
+ break;
+ case 3:
+ if (r4->unk138.unk38[r4->unk138.unk0]->callback == sub_814DB84)
+ return 0;
+ r4->unk138.unk38[r4->unk138.unk0] = NULL;
+ ++r4->unk138.unk0;
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 4:
+ if (!IsLinkTaskFinished())
+ return 0;
+ if (r4->unk138.unk0 < r4->unk9)
+ {
+ r4->unkC = 2;
+ return 0;
+ }
+ r4->unk138.unk0 = 0;
+ break;
+ case 5:
+ sub_814DC24(r4, &r4->unk138);
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 6:
+ if (!IsLinkTaskFinished())
+ return 0;
+ PlaySE(SE_RU_HYUU);
+ sub_814BB4C(11, 1, NULL);
+ r4->unk12 = 5;
+ r4->unkC = 0;
+ return 0;
+ }
+ ++r4->unkC;
+ return 0;
+}
+
+static u32 sub_814C118(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ switch (r4->unkC)
+ {
+ case 0:
+ r4->unk2A += 4;
+ if (r4->unk2A < 0)
+ return 0;
+ r4->unk2A = 0;
+ r4->unk138.unk1 = 4;
+ r4->unk138.unk0 = 0;
+ r4->unk138.unk2 = gUnknown_846E2F0[r4->unk138.unk1][0];
+ PlaySE(SE_W070);
+ break;
+ case 1:
+ r4->unk2C = gUnknown_846E2F0[r4->unk138.unk1][r4->unk138.unk0];
+ SetGpuReg(REG_OFFSET_BG0VOFS, -r4->unk2C);
+ SetGpuReg(REG_OFFSET_BG2VOFS, -r4->unk2C);
+ SetGpuReg(REG_OFFSET_BG3VOFS, -r4->unk2C);
+ ++r4->unk138.unk0;
+ if (r4->unk138.unk0 < r4->unk138.unk2)
+ return 0;
+ if (r4->unk138.unk1 == 0)
+ break;
+ --r4->unk138.unk1;
+ r4->unk138.unk2 = gUnknown_846E2F0[r4->unk138.unk1][0];
+ r4->unk138.unk0 = 0;
+ return 0;
+ case 2:
+ r4->unk2C = 0;
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 3:
+ if (!IsLinkTaskFinished())
+ return 0;
+ sub_814BB4C(12, 1, NULL);
+ r4->unk12 = 6;
+ r4->unkC = 0;
+ return 0;
+ }
+ ++r4->unkC;
+ return 0;
+}
+
+static u32 sub_814C24C(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ switch (r4-> unkC)
+ {
+ case 1:
+ if (!IsLinkTaskFinished())
+ return 0;
+ StartMinigameCountdown(0x1000, 0x1000, 120, 80, 0);
+ break;
+ case 2:
+ if (IsMinigameCountdownRunning())
+ return 0;
+ // fallthrough
+ case 0:
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 3:
+ if (!IsLinkTaskFinished())
+ return 0;
+ r4->unk138.unk0 = 0;
+ r4->unk138.unk1 = 0;
+ r4->unk138.unk2 = 0;
+ r4->unk138.unk3 = 0;
+ r4->unk10 = 0;
+ if (r4->unk8 == 0)
+ sub_814BB4C(13, 1, NULL);
+ else
+ sub_814BB4C(14, 1, NULL);
+ r4->unk12 = 7;
+ r4->unkC = 0;
+ return 0;
+ }
+ ++r4->unkC;
+ return 0;
+}
+
+void sub_814C2FC(struct BerryCrushGame * r4)
+{
+ u8 r8 = 0;
+ u16 r3;
+ u16 *r2;
+ u8 r7 = 0;
+ s32 r2_ = 0;
+ s32 r0;
+
+ for (r7 = 0; r7 < r4->unk9; ++r7)
+ {
+ r2 = gRecvCmds[r7];
+ if ((r2[0] & 0xFF00) == 0x2F00
+ && r2[1] == 2)
+ {
+ if ((u8)r2[2] & 4)
+ {
+ r4->unk5C.unk02_3 |= gUnknown_846E2E0[r7];
+ r4->unk68.as_four_players.others[r7].unk4.as_2d_bytes[1][5] = 1;
+ ++r4->unk68.as_four_players.others[r7].unk4.as_hwords[3];
+ ++r8;
+ r3 = r4->unk28 - r4->unk68.as_four_players.others[r7].unk2;
+ if (r3 >= r4->unk68.as_four_players.others[r7].unk4.as_hwords[1] - 1
+ && r3 <= r4->unk68.as_four_players.others[r7].unk4.as_hwords[1] + 1)
+ {
+ ++r4->unk68.as_four_players.others[r7].unk4.as_hwords[0];
+ r4->unk68.as_four_players.others[r7].unk4.as_hwords[1] = r3;
+ if (r4->unk68.as_four_players.others[r7].unk4.as_hwords[0] > r4->unk68.as_four_players.others[r7].unk4.as_hwords[2])
+ r4->unk68.as_four_players.others[r7].unk4.as_hwords[2] = r4->unk68.as_four_players.others[r7].unk4.as_hwords[0];
+ }
+ else
+ {
+ r4->unk68.as_four_players.others[r7].unk4.as_hwords[0] = 0;
+ r4->unk68.as_four_players.others[r7].unk4.as_hwords[1] = r3;
+ }
+ r4->unk68.as_four_players.others[r7].unk2 = r4->unk28;
+ if (++r4->unk68.as_four_players.others[r7].unk4.as_2d_bytes[1][4] > 2)
+ r4->unk68.as_four_players.others[r7].unk4.as_2d_bytes[1][4] = 0;
+ }
+ else
+ {
+ r4->unk68.as_four_players.others[r7].unk4.as_2d_bytes[1][5] = 0;
+ }
+ }
+ }
+ if (r8 > 1)
+ {
+ for (r7 = 0; r7 < r4->unk9; ++r7)
+ {
+ if (r4->unk68.as_four_players.others[r7].unk4.as_2d_bytes[1][5] != 0)
+ {
+ r4->unk68.as_four_players.others[r7].unk4.as_2d_bytes[1][5] |= 2;
+ ++r4->unk68.as_four_players.others[r7].unk4.as_hwords[4];
+ }
+ }
+ }
+ if (r8 != 0)
+ {
+ r4->unk2E += r8;
+ r8 += gUnknown_846E2E8[r8 - 1];
+ r4->unk34 += r8;
+ r4->unk1A += r8;
+ r0 = r4->unk18;
+ r2_ = r4->unk1A;
+ if (r0 - r2_ > 0)
+ {
+ r2_ <<= 8;
+ r2_ = sub_80D8B68(r2_, r4->unk20);
+ r2_ >>= 8;
+ r4->unk24 = r2_;
+ }
+ else
+ {
+ r4->unk24 = 32;
+ r4->unk5C.unk02_0 = 1;
+ }
+ }
+}
+
+void sub_814C4B8(struct BerryCrushGame * r3)
+{
+ u8 r6 = 0;
+ u16 r1 = 0;
+ u8 r4 = 0;
+
+ for (r4 = 0; r4 < r3->unk9; ++r4)
+ {
+ if (r3->unk68.as_four_players.others[r4].unk4.as_2d_bytes[1][5] != 0)
+ {
+ ++r6;
+ r1 = r3->unk68.as_four_players.others[r4].unk4.as_2d_bytes[1][4] + 1;
+ if (r3->unk68.as_four_players.others[r4].unk4.as_2d_bytes[1][5] & 2)
+ r1 |= 4;
+ r1 <<= 3 * r4;
+ r3->unk5C.unk08 |= r1;
+ }
+ }
+ r3->unk5C.unk04 = r3->unk24;
+ if (r6 == 0)
+ {
+ if (r3->unk138.unk3 != 0)
+ ++r3->unk138.unk0;
+ else
+ goto SET_UNK5F_0;
+ }
+ else
+ {
+ if (r3->unk138.unk3 != 0)
+ {
+ if (r6 != r3->unk138.unk1)
+ {
+ r3->unk138.unk1 = r6 - 1;
+ r3->unk138.unk2 = gUnknown_846E314[r6 - 1][0];
+ }
+ else
+ {
+ ++r3->unk138.unk0;
+ }
+ }
+ else
+ {
+ r3->unk138.unk0 = 0;
+ r3->unk138.unk1 = r6 - 1;
+ r3->unk138.unk2 = gUnknown_846E314[r6 - 1][0];
+ r3->unk138.unk3 = 1;
+ }
+ }
+ if (r3->unk138.unk3 != 0)
+ {
+ if (r3->unk138.unk0 >= r3->unk138.unk2)
+ {
+ r3->unk138.unk0 = 0;
+ r3->unk138.unk1 = 0;
+ r3->unk138.unk2 = 0;
+ r3->unk138.unk3 = 0;
+ r1 = 0;
+ }
+ else
+ {
+ r1 = gUnknown_846E314[r3->unk138.unk1][r3->unk138.unk0 + 1];
+ }
+ r3->unk5C.unk03 = r1;
+ }
+ else
+ {
+ SET_UNK5F_0:
+ r3->unk5C.unk03 = 0;
+ }
+ r3->unk5C.unk06 = r3->unk26;
+}
+
+void sub_814C618(struct BerryCrushGame * r5)
+{
+ if (gMain.newKeys & A_BUTTON)
+ r5->unk5C.unk02_2 = 1;
+ if (gMain.heldKeys & A_BUTTON)
+ {
+ if (r5->unk68.as_four_players.others[r5->unk8].unk4.as_hwords[5] < r5->unk28)
+ ++r5->unk68.as_four_players.others[r5->unk8].unk4.as_hwords[5];
+ }
+ if (r5->unk8 != 0 && r5->unk5C.unk02_2 == 0)
+ return;
+ r5->unk5C.unk00 = 2;
+ if (r5->unk28 % 30 == 0)
+ {
+ if (r5->unk2E > gUnknown_846E3C4[r5->unk9 - 2])
+ {
+ ++r5->unk30;
+ r5->unk25_4 = 1;
+ }
+ else
+ {
+ r5->unk25_4 = 0;
+ }
+ r5->unk2E = 0;
+ ++r5->unk32;
+ }
+ if (r5->unk28 % 15 == 0)
+ {
+ if (r5->unk34 < gUnknown_846E3B4[r5->unk9 - 2][0])
+ r5->unk25_5 = 0;
+ else if (r5->unk34 < gUnknown_846E3B4[r5->unk9 - 2][1])
+ r5->unk25_5 = 1;
+ else if (r5->unk34 < gUnknown_846E3B4[r5->unk9 - 2][2])
+ r5->unk34 = 2; // typo since r5->unk34 will be reset?
+ else if (r5->unk34 < gUnknown_846E3B4[r5->unk9 - 2][3])
+ r5->unk34 = 3; // typo since r5->unk34 will be reset?
+ else
+ r5->unk25_5 = 4;
+ r5->unk34 = 0;
+ }
+ else
+ {
+ ++r5->unk10;
+ if (r5->unk10 > 60)
+ {
+ if (r5->unk10 > 70)
+ {
+ sub_80FBA44();
+ r5->unk10 = 0;
+ }
+ else if (r5->unk5C.unk02_3 == 0)
+ {
+ sub_80FBA44();
+ r5->unk10 = 0;
+ }
+ }
+
+ }
+ if (r5->unk28 >= 36000)
+ r5->unk5C.unk02_0 = 1;
+ r5->unk5C.unk02_1 = r5->unk25_4;
+ r5->unk5C.unk0A = r5->unk25_5;
+ memcpy(r5->unk40.unk2, &r5->unk5C, sizeof(r5->unk40.unk2));
+ RfuPrepareSend0x2f00(r5->unk40.unk2);
+}
+
+void sub_814C7BC(struct BerryCrushGame * r5)
+{
+ struct BerryCrushGame_4E * r4_;
+#ifndef NONMATCHING
+ register u32 r4 asm("r4");
+ register u32 r0 asm("r0");
+
+ for (r4 = 0; r4 < r5->unk9; r4 = (u8)r0)
+ {
+ r5->unk68.as_four_players.others[r4].unk4.as_2d_bytes[1][5] = 0;
+ r0 = r4 + 1;
+ }
+#else
+ u8 r4;
+
+ for (r4 = 0; r4 < r5->unk9; ++r4)
+ r5->unk68.as_four_players.others[r4].unk4.as_2d_bytes[1][5] = 0;
+#endif
+ if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00
+ || gRecvCmds[0][1] != 2)
+ {
+ r5->unk25_2 = 0;
+ }
+ else
+ {
+ r4_ = &r5->unk40.unkE;
+ memcpy(r4_, gRecvCmds, sizeof(struct BerryCrushGame_4E));
+ r5->unk2A = r4_->unk6;
+ r5->unk2C = r4_->unk5;
+ r5->unk28 = r4_->unk8;
+ sub_814DC5C(r5, &r5->unk138);
+ if (r4_->unk4_0)
+ r5->unk25_3 = 1;
+ }
+}
+
+static u32 sub_814C850(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ memset(&r4->unk5C, 0, sizeof(r4->unk5C));
+ memset(&r4->unk40.unkE, 0, sizeof(r4->unk40.unkE));
+ sub_814C7BC(r4);
+ SetGpuReg(REG_OFFSET_BG0VOFS, -r4->unk2C);
+ SetGpuReg(REG_OFFSET_BG2VOFS, -r4->unk2C);
+ SetGpuReg(REG_OFFSET_BG3VOFS, -r4->unk2C);
+ if (r4->unk25_3)
+ {
+ if (r4->unk28 >= 36000)
+ {
+ r4->unk28 = 36000;
+ sub_814BB4C(16, 1, NULL);
+ }
+ else
+ {
+ sub_814BB4C(15, 1, NULL);
+ }
+ r4->unk10 = 0;
+ r4->unkC = 0;
+ return 0;
+ }
+ else
+ {
+ ++r4->unk26;
+ sub_814C2FC(r4);
+ sub_814C4B8(r4);
+ sub_814C618(r4);
+ return 0;
+ }
+}
+
+static u32 sub_814C8F8(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ memset(&r4->unk5C, 0, sizeof(r4->unk5C));
+ memset(&r4->unk40.unkE, 0, sizeof(r4->unk40.unkE));
+ sub_814C7BC(r4);
+ SetGpuReg(REG_OFFSET_BG0VOFS, -r4->unk2C);
+ SetGpuReg(REG_OFFSET_BG2VOFS, -r4->unk2C);
+ SetGpuReg(REG_OFFSET_BG3VOFS, -r4->unk2C);
+ if (r4->unk25_3)
+ {
+ if (r4->unk28 >= 36000)
+ {
+ r4->unk28 = 36000;
+ sub_814BB4C(16, 1, NULL);
+ }
+ else
+ {
+ sub_814BB4C(15, 1, NULL);
+ }
+ r4->unk10 = 0;
+ r4->unkC = 0;
+ return 0;
+ }
+ else
+ {
+ sub_814C618(r4);
+ return 0;
+ }
+}
+
+static u32 sub_814C990(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ switch (r4->unkC)
+ {
+ case 0:
+ r4->unk12 = 8;
+ PlaySE(SE_W070);
+ BlendPalettes(0xFFFFFFFF, 8, RGB(31, 31, 0));
+ r4->unk138.unk0 = 2;
+ break;
+ case 1:
+ if (--r4->unk138.unk0 != 255)
+ return 0;
+ BlendPalettes(0xFFFFFFFF, 0, RGB(31, 31, 0));
+ r4->unk138.unk1 = 4;
+ r4->unk138.unk0 = 0;
+ r4->unk138.unk2 = gUnknown_846E2F0[r4->unk138.unk1][0];
+ break;
+ case 2:
+ r4->unk2C = gUnknown_846E2F0[r4->unk138.unk1][r4->unk138.unk0];
+ SetGpuReg(REG_OFFSET_BG0VOFS, -r4->unk2C);
+ SetGpuReg(REG_OFFSET_BG2VOFS, -r4->unk2C);
+ SetGpuReg(REG_OFFSET_BG3VOFS, -r4->unk2C);
+ if (++r4->unk138.unk0 < r4->unk138.unk2)
+ return 0;
+ if (r4->unk138.unk1 != 0)
+ {
+ --r4->unk138.unk1;
+ r4->unk138.unk2 = gUnknown_846E2F0[r4->unk138.unk1][0];
+ r4->unk138.unk0 = 0;
+ return 0;
+ }
+ break;
+ case 3:
+ r4->unk2C = 0;
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ break;
+ case 4:
+ if (!sub_814DE50(r4, &r4->unk138))
+ return 0;
+ LinkRfu_SetRfuFuncToSend6600();
+ r4->unk10 = 0;
+ break;
+ case 5:
+ if (!IsLinkTaskFinished())
+ return 0;
+ sub_814BB4C(17, 1, NULL);
+ r4->unk10 = 0;
+ r4->unkC = 0;
+ return 0;
+ }
+ ++r4->unkC;
+ return 0;
+}
+
+static u32 sub_814CB20(struct BerryCrushGame * r5, u8 *r6)
+{
+ switch (r5->unkC)
+ {
+ case 0:
+ r5->unk12 = 9;
+ PlaySE(SE_HAZURE);
+ BlendPalettes(0xFFFFFFFF, 8, RGB(31, 0, 0));
+ r5->unk138.unk0 = 4;
+ break;
+ case 1:
+ if (--r5->unk138.unk0 != 255)
+ return 0;
+ BlendPalettes(0xFFFFFFFF, 0, RGB(31, 0, 0));
+ r5->unk138.unk0 = 0;
+ break;
+ case 2:
+ if (!sub_814DE50(r5, &r5->unk138))
+ return 0;
+ LinkRfu_SetRfuFuncToSend6600();
+ r5->unk10 = 0;
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ break;
+ case 3:
+ if (!IsLinkTaskFinished())
+ return 0;
+ ConvertIntToDecimalStringN(gStringVar1, r5->unk1C, STR_CONV_MODE_LEFT_ALIGN, 6);
+ sub_814D5A4(r6, 7, 1, 0, 0);
+ r5->unkE = 19;
+ sub_814BB4C(3, 1, NULL);
+ r5->unk10 = 0;
+ r5->unkC = 0;
+ return 0;
+ }
+ ++r5->unkC;
+ return 0;
+}
+
+static u32 sub_814CC0C(struct BerryCrushGame * r7, UNUSED u8 *r1)
+{
+ u8 r8, r4_;
+ s32 r2;
+ s32 r4;
+ u8 r6; // ???
+
+ switch (r7->unkC)
+ {
+ case 0:
+ memset(r7->unk40.unk2, 0, 2 * sizeof(u16));
+ if (r7->unk68.as_four_players.others[r7->unk8].unk4.as_hwords[5] > r7->unk28)
+ r7->unk68.as_four_players.others[r7->unk8].unk4.as_hwords[5] = r7->unk28;
+ r7->unk40.unk2[0] = r7->unk68.as_four_players.others[r7->unk8].unk4.as_hwords[5];
+ SendBlock(0, r7->unk40.unk2, 2);
+ break;
+ case 1:
+ if (!IsLinkTaskFinished())
+ return 0;
+ r7->unk10 = 0;
+ break;
+ case 2:
+ if (GetBlockReceivedStatus() != gUnknown_846E3C8[r7->unk9 - 2])
+ return 0;
+ for (r8 = 0; r8 < r7->unk9; ++r8)
+ r7->unk68.as_four_players.others[r8].unk4.as_hwords[5] = gBlockRecvBuffer[r8][0];
+ r7->unk10 = 0;
+ r7->unk40.unk2[0] = 0;
+ ResetBlockReceivedFlags();
+ if (r7->unk8 == 0)
+ r7->unkC = 3;
+ else
+ r7->unkC = 6;
+ return 0;
+ case 3:
+ memset(
+ &r7->unk68,
+ 0,
+ sizeof(struct BerryCrushGame_68_x_SubStruct)
+ );
+ r7->unk68.as_four_players.unk00.unk04 = r7->unk28;
+ r7->unk68.as_four_players.unk00.unk06 = r7->unk18 / (r7->unk28 / 60);
+ r2 = sub_80D8AE0(r7->unk30 << 8, 0x3200);
+ r2 = sub_80D8B68(r2, r7->unk32 << 8) + 0x3200;
+ r2 >>= 8;
+ r7->unk68.as_four_players.unk00.unk08 = r2 & 0x7F;
+ r2 <<= 8;
+ r2 = sub_80D8B68(r2, 0x6400);
+ r4 = (r7->unk1C * r7->unk9) << 8;
+ r4 = sub_80D8AE0(r4, r2);
+ r7->unk68.as_four_players.unk00.unk00 = r4 >> 8;
+ r7->unk68.as_five_players.unk1C[0].unk4.as_2d_bytes[0][7] = Random() % 3;
+ for (r6 = 0, r8 = 0; r8 < r7->unk9; ++r8)
+ {
+ r7->unk68.as_five_players.unk1C[0].unk4.as_2d_bytes[0][r8] = r8;
+ r7->unk68.as_five_players.unk1C[0].unk4.as_2d_bytes[1][r8] = r8;
+ r7->unk68.as_four_players.unk00.unk0C[0][r8] = r7->unk68.as_four_players.others[r8].unk4.as_hwords[3];
+ r7->unk68.as_four_players.unk00.unk0A += r7->unk68.as_four_players.unk00.unk0C[0][r8];
+ switch (r7->unk68.as_five_players.unk1C[0].unk4.as_2d_bytes[0][7])
+ {
+ case 0:
+ if (r7->unk68.as_four_players.others[r8].unk4.as_hwords[3] != 0)
+ {
+ r2 = r7->unk68.as_four_players.others[r8].unk4.as_hwords[2];
+ r2 <<= 8;
+ r2 = sub_80D8AE0(r2, 0x6400);
+ r4 = r7->unk68.as_four_players.others[r8].unk4.as_hwords[3];
+ r4 <<= 8;
+ r4 = sub_80D8B68(r2, r4);
+ }
+ else
+ {
+ r4 = 0;
+ }
+ break;
+ case 1:
+ if (r7->unk68.as_four_players.others[r8].unk4.as_hwords[3] != 0)
+ {
+ r2 = r7->unk68.as_four_players.others[r8].unk4.as_hwords[4];
+ r2 <<= 8;
+ r2 = sub_80D8AE0(r2, 0x6400);
+ r4 = r7->unk68.as_four_players.others[r8].unk4.as_hwords[3];
+ r4 <<= 8;
+ r4 = sub_80D8B68(r2, r4);
+ }
+ else
+ {
+ r4 = 0;
+ }
+ break;
+ case 2:
+ if (r7->unk68.as_four_players.others[r8].unk4.as_hwords[3] == 0)
+ {
+ r4 = 0;
+ }
+ else if (r7->unk68.as_four_players.others[r8].unk4.as_hwords[5] >= r7->unk28)
+ {
+ r4 = 0x6400;
+ }
+ else
+ {
+ r2 = r7->unk68.as_four_players.others[r8].unk4.as_hwords[5];
+ r2 <<= 8;
+ r2 = sub_80D8AE0(r2, 0x6400);
+ r4 = r7->unk28;
+ r4 <<= 8;
+ r4 = sub_80D8B68(r2, r4);
+ }
+ break;
+ }
+ r4 >>= 4;
+ r7->unk68.as_four_players.unk00.unk0C[1][r8] = r4;
+ }
+ break;
+ case 4:
+ for (r6 = 0, r8 = 0; r8 < r7->unk9 - 1; ++r8)
+ {
+ for (r4_ = r7->unk9 - 1; r4_ > r8; --r4_)
+ {
+ u16 r0;
+ u8 r3;
+ u16 *sp00 = r7->unk68.as_four_players.unk00.unk0C[0];
+ u8 *sp04 = r7->unk68.as_five_players.unk1C[0].unk4.as_2d_bytes[0];
+ u8 *r10 = r7->unk68.as_five_players.unk1C[0].unk4.as_2d_bytes[1];
+ u16 *r9 = r7->unk68.as_four_players.unk00.unk0C[1];
+ s32 r12 = r4_ - 1;
+ u16 *p1 = sp00 + r12; // these have to be here
+ u16 *p2 = sp00 + r4_; // to swap operands. macro?
+
+ if (*p1 < *p2)
+ {
+ r0 = sp00[r4_];
+ sp00[r4_] = sp00[r12];
+ sp00[r12] = r0;
+ r3 = sp04[r4_];
+ sp04[r4_] = sp04[r12];
+ sp04[r12] = r3;
+ }
+ p1 = r9 + r12;
+ p2 = r9 + r4_;
+ if (*p1 < *p2)
+ {
+ r0 = r9[r4_];
+ r9[r4_] = r9[r12];
+ r9[r12] = r0;
+ r3 = r10[r4_];
+ r10[r4_] = r10[r12];
+ r10[r12] = r3;
+ }
+ }
+ }
+ SendBlock(
+ 0,
+ &r7->unk68,
+ sizeof(struct BerryCrushGame_68_x_SubStruct)
+ );
+ break;
+ case 5:
+ if (!IsLinkTaskFinished())
+ return 0;
+ r7->unk10 = 0;
+ break;
+ case 6:
+ if (GetBlockReceivedStatus() != 1)
+ return 0;
+ memset(
+ &r7->unk68,
+ 0,
+ sizeof(struct BerryCrushGame_68_x_SubStruct)
+ );
+ memcpy(
+ &r7->unk68,
+ gBlockRecvBuffer,
+ sizeof(struct BerryCrushGame_68_x_SubStruct)
+ );
+ ResetBlockReceivedFlags();
+ r7->unk10 = 0;
+ break;
+ case 7:
+ sub_814B930();
+ sub_814BB4C(18, 1, NULL);
+ r7->unk12 = 11;
+ r7->unkC = 0;
+ r7->unk24 = 0;
+ return 0;
+ }
+ ++r7->unkC;
+ return 0;
+}
+
+static u32 sub_814CFA8(struct BerryCrushGame * r5, u8 *r6)
+{
+ switch (r5->unkC)
+ {
+ case 0:
+ if (!sub_814E644(r5, &r5->unk138))
+ return 0;
+ break;
+ case 1:
+ CopyBgTilemapBufferToVram(0);
+ r5->unk138.unk0 = 30;
+ break;
+ case 2:
+ if (r5->unk138.unk0 != 0)
+ {
+ --r5->unk138.unk0;
+ return 0;
+ }
+ if (!(gMain.newKeys & A_BUTTON))
+ return 0;
+ PlaySE(SE_SELECT);
+ sub_814E80C(r5);
+ break;
+ case 3:
+ if (r5->unk12 <= 12)
+ {
+ ++r5->unk12;
+ r5->unkC = 0;
+ return 0;
+ }
+ break;
+ case 4:
+ ConvertIntToDecimalStringN(gStringVar1, r5->unk1C, STR_CONV_MODE_LEFT_ALIGN, 6);
+ ConvertIntToDecimalStringN(gStringVar2, GetBerryPowder(), STR_CONV_MODE_LEFT_ALIGN, 6);
+ sub_814D5A4(r6, 2, 3, 0, 0);
+ r5->unkE = 19;
+ sub_814BB4C(3, 1, NULL);
+ r5->unkC = 0;
+ return 0;
+ }
+ ++r5->unkC;
+ return 0;
+}
+
+static u32 sub_814D094(struct BerryCrushGame * r5, u8 *r4)
+{
+ switch (r5->unkC)
+ {
+ case 0:
+ if (r5->unk28 >= 36000)
+ sub_814EB04(&r5->unk138);
+ sub_814D5A4(r4, 8, 0, 0, 1);
+ r5->unkE = 19;
+ sub_814BB4C(3, 1, NULL);
+ r5->unkC = 0;
+ return 0;
+ case 1:
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 2:
+ if (!IsLinkTaskFinished())
+ return 0;
+ DrawDialogueFrame(0, 0);
+ AddTextPrinterParameterized2(0, 2, gText_SavingDontTurnOffThePower2, 0, 0, 2, 1, 3);
+ CopyWindowToVram(0, 3);
+ CreateTask(sub_80DA634, 0);
+ break;
+ case 3:
+ if (FuncIsActiveTask(sub_80DA634))
+ return 0;
+ break;
+ case 4:
+ sub_814BB4C(20, 1, NULL);
+ r5->unk12 = 15;
+ r5->unkC = 0;
+ return 0;
+ }
+ ++r5->unkC;
+ return 0;
+}
+
+static u32 sub_814D188(struct BerryCrushGame * r5, u8 *r6)
+{
+ s32 r4;
+#ifndef NONMATCHING
+ register s32 r0 asm("r0");
+#else
+ s32 r0;
+#endif
+
+ switch (r5->unkC)
+ {
+ case 0:
+ sub_814D5A4(r6, 4, 0, 0, 1);
+ r5->unkE = 20;
+ sub_814BB4C(3, 1, NULL);
+ r0 = 0;
+ r5->unkC = r0; // dunno what it's doing because it's already in case 0
+ return 0;
+ case 1:
+ DisplayYesNoMenuDefaultYes();
+ break;
+ case 2:
+ if ((r4 = Menu_ProcessInputNoWrapClearOnChoose()) != -2)
+ {
+ memset(r5->unk40.unk2, 0, sizeof(r5->unk40.unk2));
+ if (r4 == 0)
+ {
+ if (CheckHasAtLeastOneBerry())
+ r5->unk14 = 0;
+ else
+ r5->unk14 = 3;
+ }
+ else
+ {
+ r5->unk14 = 1;
+ }
+ ClearDialogWindowAndFrame(0, 1);
+ sub_814D5A4(r6, 8, 0, 0, 0);
+ r5->unkE = 21;
+ sub_814BB4C(3, 1, NULL);
+ r5->unkC = 0;
+ }
+ return 0;
+ }
+ ++r5->unkC;
+ return 0;
+}
+
+static u32 sub_814D240(struct BerryCrushGame * r4, UNUSED u8 *r1)
+{
+ u8 r5 = 0;
+
+ switch (r4->unkC)
+ {
+ case 0:
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 1:
+ if (!IsLinkTaskFinished())
+ return 0;
+ r4->unk40.unk2[0] = r4->unk14;
+ r4->unk40.unkE.unk0 = 0;
+ SendBlock(0, r4->unk40.unk2, sizeof(u16));
+ break;
+ case 2:
+ if (!IsLinkTaskFinished())
+ return 0;
+ r4->unk10 = 0;
+ break;
+ case 3:
+ if (GetBlockReceivedStatus() != gUnknown_846E3C8[r4->unk9 - 2])
+ return 0;
+ for (; r5 < r4->unk9; ++r5)
+ r4->unk40.unkE.unk0 += gBlockRecvBuffer[r5][0];
+ if (r4->unk40.unkE.unk0 != 0)
+ sub_814BB4C(23, 1, NULL);
+ else
+ sub_814BB4C(22, 1, NULL);
+ ResetBlockReceivedFlags();
+ r4->unk40.unk2[0] = 0;
+ r4->unk40.unkE.unk0 = 0;
+ r4->unk10 = 0;
+ r4->unkC = 0;
+ return 0;
+ }
+ ++r4->unkC;
+ return 0;
+}
+
+static u32 sub_814D31C(struct BerryCrushGame * r5, UNUSED u8 *r1)
+{
+ switch (r5->unkC)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 1, 0, 0x10, RGB_BLACK);
+ UpdatePaletteFade();
+ break;
+ case 1:
+ if (UpdatePaletteFade())
+ return 0;
+ break;
+ case 2:
+ ClearDialogWindowAndFrame(0, 1);
+ sub_814DA04(r5);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
+ UpdatePaletteFade();
+ break;
+ case 3:
+ if (UpdatePaletteFade())
+ return 0;
+ sub_814BB4C(7, 1, NULL);
+ r5->unk12 = 3;
+ r5->unkC = 0;
+ return 0;
+ }
+ ++r5->unkC;
+ return 0;
+}
+
+static u32 sub_814D3A4(struct BerryCrushGame * r5, UNUSED u8 *r1)
+{
+ switch (r5->unkC)
+ {
+ case 0:
+ DrawDialogueFrame(0, 0);
+ if (r5->unk14 == 3)
+ AddTextPrinterParameterized2(0, 2, gUnknown_846E328[5], r5->unkB, 0, 2, 1, 3);
+ else
+ AddTextPrinterParameterized2(0, 2, gUnknown_846E328[6], r5->unkB, 0, 2, 1, 3);
+ CopyWindowToVram(0, 3);
+ break;
+ case 1:
+ if (IsTextPrinterActive(0))
+ return 0;
+ r5->unk138.unk0 = 120;
+ break;
+ case 2:
+ if (r5->unk138.unk0 != 0)
+ --r5->unk138.unk0;
+ else
+ {
+ sub_814BB4C(24, 1, NULL);
+ r5->unkC = 0;
+ }
+ return 0;
+ }
+ ++r5->unkC;
+ return 0;
+}
+
+static u32 sub_814D468(struct BerryCrushGame * r5, UNUSED u8 *r1)
+{
+ switch (r5->unkC)
+ {
+ case 0:
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 1:
+ if (!IsLinkTaskFinished())
+ return 0;
+ Link_TryStartSend5FFF();
+ break;
+ case 2:
+ if (gReceivedRemoteLinkPlayers != 0)
+ return 0;
+ r5->unkE = 25;
+ sub_814BB4C(5, 1, NULL);
+ r5->unkC = 2; // ???
+ return 0;
+ }
+ ++r5->unkC;
+ return 0;
+}
+
+static u32 sub_814D4C8(UNUSED struct BerryCrushGame * r0, UNUSED u8 *r1)
+{
+ sub_814B6FC(NULL);
+ return 0;
+}
+
+void sub_814D4D8(struct BerryCrushGame * r4)
+{
+ u8 r5 = 0;
+
+ IncrementGameStat(GAME_STAT_BERRY_CRUSH_POINTS);
+ r4->unkD = 0;
+ r4->unk10 = 0;
+ r4->unk12 = 2;
+ r4->unk14 = 0;
+ r4->unk1C = 0;
+ r4->unk18 = 0;
+ r4->unk1A = 0;
+ r4->unk20 = 0;
+ r4->unk24 = 0;
+ r4->unk25_0 = 0;
+ r4->unk25_1 = 0;
+ r4->unk25_2 = 0;
+ r4->unk25_3 = 0;
+ r4->unk25_4 = 0;
+ r4->unk25_5 = 0;
+ r4->unk26 = 0;
+ r4->unk28 = 0;
+ r4->unk2E = 0;
+ r4->unk32 = -1;
+ r4->unk30 = 0;
+ r4->unk34 = 0;
+ for (; r5 < 5; ++r5) // why is it 5 instead of 4? fillerBC isn't sufficient for one player
+ {
+ r4->unk68.as_four_players.others[r5].unk0 = -1;
+ r4->unk68.as_four_players.others[r5].unk2 = 0;
+ r4->unk68.as_four_players.others[r5].unk4.as_hwords[0] = 0;
+ r4->unk68.as_four_players.others[r5].unk4.as_hwords[1] = 1;
+ r4->unk68.as_four_players.others[r5].unk4.as_hwords[2] = 0;
+ r4->unk68.as_four_players.others[r5].unk4.as_hwords[3] = 0;
+ r4->unk68.as_four_players.others[r5].unk4.as_hwords[4] = 0;
+ r4->unk68.as_four_players.others[r5].unk4.as_hwords[5] = 0;
+ r4->unk68.as_four_players.others[r5].unk4.as_2d_bytes[1][4] = 0;
+ r4->unk68.as_four_players.others[r5].unk4.as_2d_bytes[1][5] = 0;
+ }
+}
+
+#ifdef NONMATCHING
+void sub_814D564(u8 *r0, u32 r1, s32 r2, u32 r3, u32 r5, u32 r6, u32 r4)
+{
+ u8 sp[8];
+ u8 *p;
+
+ 1[(u32 *)sp] = r2;
+ 0[(u16 *)sp] = r4;
+ p = &sp[4];
+ r0[0] = p[0];
+ r0[1] = p[1];
+ r0[2] = p[2];
+ r0[3] = p[3];
+ r0[4] = r3;
+ r0[5] = r5;
+ r0[6] = r6;
+ r0[7] = sp[0];
+ r0[8] = sp[1];
+ r0[9] = r1;
+}
+#else
+NAKED
+void sub_814D564(u8 *r0, u32 r1, s32 r2, u32 r3, u32 r5, u32 r6, u32 r4)
+{
+ asm_unified("\n\
+ push {r4-r6,lr}\n\
+ sub sp, 0x8\n\
+ str r2, [sp, 0x4]\n\
+ ldr r5, [sp, 0x18]\n\
+ ldr r6, [sp, 0x1C]\n\
+ ldr r4, [sp, 0x20]\n\
+ mov r2, sp\n\
+ strh r4, [r2]\n\
+ add r4, sp, 0x4\n\
+ ldrb r2, [r4]\n\
+ strb r2, [r0]\n\
+ ldrb r2, [r4, 0x1]\n\
+ strb r2, [r0, 0x1]\n\
+ ldrb r2, [r4, 0x2]\n\
+ strb r2, [r0, 0x2]\n\
+ ldrb r2, [r4, 0x3]\n\
+ strb r2, [r0, 0x3]\n\
+ strb r3, [r0, 0x4]\n\
+ strb r5, [r0, 0x5]\n\
+ strb r6, [r0, 0x6]\n\
+ mov r2, sp\n\
+ ldrb r2, [r2]\n\
+ strb r2, [r0, 0x7]\n\
+ mov r2, sp\n\
+ ldrb r2, [r2, 0x1]\n\
+ strb r2, [r0, 0x8]\n\
+ strb r1, [r0, 0x9]\n\
+ add sp, 0x8\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0");
+}
+#endif
+
+void sub_814D5A4(u8 *r0, u32 r1, u32 r2, u32 r3, u32 r5)
+{
+ u8 sp[4];
+
+ 0[(u16 *)sp] = r3;
+ r0[0] = r1;
+ r0[1] = r2;
+ r0[2] = sp[0];
+ r0[3] = sp[1];
+ r0[4] = r5;
+}
diff --git a/src/berry_crush_3.c b/src/berry_crush_3.c
new file mode 100644
index 000000000..13f392fb4
--- /dev/null
+++ b/src/berry_crush_3.c
@@ -0,0 +1,1386 @@
+#include "global.h"
+#include "gflib.h"
+#include "battle_anim.h"
+#include "berry.h"
+#include "berry_crush.h"
+#include "decompress.h"
+#include "digit_obj_util.h"
+#include "dynamic_placeholder_text_util.h"
+#include "graphics.h"
+#include "item_menu_icons.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "math_util.h"
+#include "menu.h"
+#include "new_menu_helpers.h"
+#include "scanline_effect.h"
+#include "script.h"
+#include "strings.h"
+#include "text_window.h"
+#include "trig.h"
+#include "constants/items.h"
+#include "constants/songs.h"
+
+static void sub_814DEC0(struct BerryCrushGame_138 * arg0, u16 arg1);
+static void sub_814DF44(u8 windowId, u8 left, u8 colorId, const u8 *string);
+static void sub_814DFA4(struct BerryCrushGame * sp0C, u8 sp10, u8 sp14, u8 r3);
+static void sub_814E32C(struct BerryCrushGame * r8);
+static void Task_ShowBerryCrushRankings(u8 r4);
+static void sub_814EAD4(struct BerryCrushGame_138 * r4, u16 r1);
+static void sub_814EB38(struct BerryCrushGame * r5);
+static void sub_814EBB0(struct BerryCrushGame * r6);
+static void sub_814EC80(struct BerryCrushGame * r6);
+static void sub_814ECE0(struct BerryCrushGame * r6);
+static void sub_814EF10(struct BerryCrushGame * r5);
+static void sub_814EFD0(struct Sprite * sprite);
+static void sub_814EFFC(struct Sprite * sprite);
+static void sub_814F044(struct Sprite * sprite);
+static void sub_814F0D8(struct Sprite * sprite);
+
+static const struct BgTemplate gUnknown_846E3CC[] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 15,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0x0000
+ }, {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 13,
+ .screenSize = 2,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0x0000
+ }, {
+ .bg = 2,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 12,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0x0000
+ }, {
+ .bg = 3,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 11,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0x0000
+ }
+};
+
+static const u8 sBerryCrushTextColorTable[][3] = {
+ {
+ TEXT_COLOR_WHITE,
+ TEXT_COLOR_DARK_GREY,
+ TEXT_COLOR_LIGHT_GREY
+ }, {
+ TEXT_COLOR_TRANSPARENT,
+ TEXT_COLOR_WHITE,
+ TEXT_COLOR_DARK_GREY
+ }, {
+ TEXT_COLOR_TRANSPARENT,
+ TEXT_COLOR_LIGHT_GREY,
+ TEXT_COLOR_RED
+ }, {
+ TEXT_COLOR_WHITE,
+ TEXT_COLOR_BLUE,
+ TEXT_COLOR_LIGHT_BLUE
+ }, {
+ TEXT_COLOR_WHITE,
+ TEXT_COLOR_GREEN,
+ TEXT_COLOR_LIGHT_GREEN
+ }, {
+ TEXT_COLOR_WHITE,
+ TEXT_COLOR_RED,
+ TEXT_COLOR_LIGHT_RED
+ }
+};
+
+static const struct WindowTemplate gUnknown_846E3F0 = {
+ .bg = 0,
+ .tilemapLeft = 3,
+ .tilemapTop = 4,
+ .width = 24,
+ .height = 13,
+ .paletteNum = 0xF,
+ .baseBlock = 0x001
+};
+
+static const struct WindowTemplate gUnknown_846E3F8[] = {
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 0,
+ .width = 9,
+ .height = 2,
+ .paletteNum = 0x8,
+ .baseBlock = 0x3ed
+ }, {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 3,
+ .width = 9,
+ .height = 2,
+ .paletteNum = 0x8,
+ .baseBlock = 0x3db
+ }, {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 6,
+ .width = 9,
+ .height = 2,
+ .paletteNum = 0x8,
+ .baseBlock = 0x3c9
+ }, {
+ .bg = 0,
+ .tilemapLeft = 21,
+ .tilemapTop = 3,
+ .width = 9,
+ .height = 2,
+ .paletteNum = 0x8,
+ .baseBlock = 0x3b7
+ }, {
+ .bg = 0,
+ .tilemapLeft = 21,
+ .tilemapTop = 6,
+ .width = 9,
+ .height = 2,
+ .paletteNum = 0x8,
+ .baseBlock = 0x3a5
+ }, DUMMY_WIN_TEMPLATE
+};
+
+static const struct WindowTemplate gUnknown_846E428[] = {
+ {
+ .bg = 0,
+ .tilemapLeft = 4,
+ .tilemapTop = 2,
+ .width = 22,
+ .height = 16,
+ .paletteNum = 0xF,
+ .baseBlock = 0x001
+ }, {
+ .bg = 0,
+ .tilemapLeft = 4,
+ .tilemapTop = 2,
+ .width = 22,
+ .height = 16,
+ .paletteNum = 0xF,
+ .baseBlock = 0x001
+ }, {
+ .bg = 0,
+ .tilemapLeft = 3,
+ .tilemapTop = 2,
+ .width = 24,
+ .height = 16,
+ .paletteNum = 0xF,
+ .baseBlock = 0x001
+ }, DUMMY_WIN_TEMPLATE
+};
+
+static const u8 gUnknown_846E448[][4] = {
+ { 6, 8, 9, 11 },
+ { 12, 14, 15, 16}
+};
+
+static const u32 gUnknown_846E450[] = {
+ 50000000,
+ 25000000,
+ 12500000,
+ 6250000,
+ 3125000,
+ 1562500,
+ 781250,
+ 390625
+};
+
+static const u16 gUnknown_846E470[] = INCBIN_U16("graphics/link_games/unk_846E4D0.gbapal");
+static const u16 gUnknown_846E490[] = INCBIN_U16("graphics/link_games/unk_846E7FC.gbapal");
+static const u16 gUnknown_846E4B0[] = INCBIN_U16("graphics/link_games/unk_846ECC4.gbapal");
+
+static const u32 gUnknown_846E4D0[] = INCBIN_U32("graphics/link_games/unk_846E4D0.4bpp.lz");
+static const u32 gUnknown_846E7FC[] = INCBIN_U32("graphics/link_games/unk_846E7FC.4bpp.lz");
+static const u32 gUnknown_846EB78[] = INCBIN_U32("graphics/link_games/unk_846EB78.4bpp.lz");
+static const u32 gUnknown_846ECC4[] = INCBIN_U32("graphics/link_games/unk_846ECC4.4bpp.lz");
+
+static const u32 gBerryCrushGrinderTopTilemap[] = INCBIN_U32("graphics/link_games/unk_846ED90.bin.lz");
+static const u32 gBerryCrushContainerCapTilemap[] = INCBIN_U32("graphics/link_games/unk_846EEC0.bin.lz");
+static const u32 gBerryCrushBackgroundTilemap[] = INCBIN_U32("graphics/link_games/unk_846F058.bin.lz");
+
+static const u8 gUnknown_846F280[][5] = {
+ {1, 3},
+ {0, 1, 3},
+ {1, 3, 2, 4},
+ {0, 1, 3, 2, 4}
+};
+
+static const struct BerryCrushGame_138_C gUnknown_846F294[] = {
+ {0x00, 0x00, 0x00, 0x0000, 0xfff0, 0x0000, 0x0000},
+ {0x01, 0x00, 0x03, 0xffe4, 0xfffc, 0xffe8, 0x0010},
+ {0x02, 0x00, 0x06, 0xfff0, 0x0014, 0xfff8, 0x0010},
+ {0x03, 0x14, 0x03, 0x001c, 0xfffc, 0x0020, 0xfff8},
+ {0x04, 0x14, 0x06, 0x0010, 0x0014, 0x0010, 0xfff8}
+};
+
+static const s8 gUnknown_846F2D0[][2] = {
+ {0x00, 0x00},
+ {0xff, 0x00},
+ {0x01, 0x01}
+};
+
+static const s8 gUnknown_846F2D6[][2] = {
+ {0x00, 0x00},
+ {0xf0, 0xfc},
+ {0x10, 0xfc},
+ {0xf8, 0xfe},
+ {0x08, 0xfe},
+ {0xe8, 0xf8},
+ {0x18, 0xf8},
+ {0xe0, 0xf4},
+ {0x20, 0xf4},
+ {0xd8, 0xf0},
+ {0x28, 0xf0}
+};
+
+static const u16 gUnknown_846F2EC[] = {
+ 5, 6, 7, 8, 9
+};
+
+static const struct CompressedSpriteSheet gUnknown_846F2F8[] = {
+ {gUnknown_846E4D0, 0x0800, 1},
+ {gUnknown_846E7FC, 0x0e00, 2},
+ {gUnknown_846EB78, 0x0700, 3},
+ {gUnknown_846ECC4, 0x02c0, 4},
+ {}
+};
+
+static const struct SpritePalette gUnknown_846F320[] = {
+ {gUnknown_846E470, 1},
+ {gUnknown_846E490, 2},
+ {gUnknown_846E4B0, 4},
+ {}
+};
+
+static const union AnimCmd gUnknown_846F340[] = {
+ ANIMCMD_FRAME(0x00, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846F348[] = {
+ ANIMCMD_FRAME(0x00, 4),
+ ANIMCMD_FRAME(0x10, 4),
+ ANIMCMD_FRAME(0x20, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846F358[] = {
+ ANIMCMD_FRAME(0x30, 2),
+ ANIMCMD_FRAME(0x40, 2),
+ ANIMCMD_FRAME(0x50, 2),
+ ANIMCMD_FRAME(0x60, 2),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846F36C[] = {
+ ANIMCMD_FRAME(0x00, 2),
+ ANIMCMD_FRAME(0x04, 2),
+ ANIMCMD_FRAME(0x08, 2),
+ ANIMCMD_FRAME(0x0c, 2),
+ ANIMCMD_FRAME(0x10, 2),
+ ANIMCMD_FRAME(0x14, 2),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gUnknown_846F388[] = {
+ ANIMCMD_FRAME(0x18, 4),
+ ANIMCMD_FRAME(0x1c, 4),
+ ANIMCMD_FRAME(0x20, 4),
+ ANIMCMD_FRAME(0x24, 4),
+ ANIMCMD_FRAME(0x28, 4),
+ ANIMCMD_FRAME(0x2c, 4),
+ ANIMCMD_FRAME(0x30, 4),
+ ANIMCMD_FRAME(0x34, 4),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gUnknown_846F3AC[] = {
+ ANIMCMD_FRAME(0x14, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846F3B4[] = {
+ ANIMCMD_FRAME(0x00, 0),
+ ANIMCMD_END
+};
+
+static const union AffineAnimCmd gUnknown_846F3BC[] = {
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 2, 1),
+ AFFINEANIMCMD_JUMP(1)
+};
+
+static const union AffineAnimCmd gUnknown_846F3D4[] = {
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, -2, 1),
+ AFFINEANIMCMD_JUMP(1)
+};
+
+static const union AnimCmd *const gUnknown_846F3EC[] = {
+ gUnknown_846F340
+};
+
+static const union AnimCmd *const gUnknown_846F3F0[] = {
+ gUnknown_846F348,
+ gUnknown_846F358
+};
+
+static const union AnimCmd *const gUnknown_846F3F8[] = {
+ gUnknown_846F36C,
+ gUnknown_846F388
+};
+
+static const union AnimCmd *const gUnknown_846F400[] = {
+ gUnknown_846F3AC
+};
+
+static const union AnimCmd *const gUnknown_846F404[] = {
+ gUnknown_846F3B4
+};
+
+static const union AffineAnimCmd *const gUnknown_846F408[] = {
+ gUnknown_846F3BC,
+ gUnknown_846F3D4
+};
+
+
+static const struct SpriteTemplate gUnknown_846F410 = {
+ .tileTag = 1,
+ .paletteTag = 1,
+ .oam = &gOamData_AffineOff_ObjNormal_64x64,
+ .anims = gUnknown_846F3EC,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_846F428 = {
+ .tileTag = 2,
+ .paletteTag = 2,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gUnknown_846F3F0,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_814EFD0
+};
+
+static const struct SpriteTemplate gUnknown_846F440 = {
+ .tileTag = 3,
+ .paletteTag = 2,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gUnknown_846F3F8,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_846F458 = {
+ .tileTag = 4,
+ .paletteTag = 4,
+ .oam = &gOamData_AffineOff_ObjNormal_8x16,
+ .anims = gUnknown_846F400,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_846F470 = {
+ .tileTag = 5,
+ .paletteTag = 5,
+ .oam = &gOamData_AffineDouble_ObjNormal_32x32,
+ .anims = gUnknown_846F404,
+ .affineAnims = gUnknown_846F408,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct DigitObjUtilTemplate gUnknown_846F488[] = {
+ {
+ .strConvMode = 1,
+ .shape = SPRITE_SHAPE(8x16),
+ .size = SPRITE_SIZE(8x16),
+ .priority = 0,
+ .oamCount = 2,
+ .xDelta = 8,
+ .x = 156,
+ .y = 0,
+ .spriteSheet = {.compressed = &gUnknown_846F2F8[3]},
+ .spritePal = &gUnknown_846F320[2],
+ }, {
+ .strConvMode = 0,
+ .shape = SPRITE_SHAPE(8x16),
+ .size = SPRITE_SIZE(8x16),
+ .priority = 0,
+ .oamCount = 2,
+ .xDelta = 8,
+ .x = 180,
+ .y = 0,
+ .spriteSheet = {.compressed = &gUnknown_846F2F8[3]},
+ .spritePal = &gUnknown_846F320[2],
+ }, {
+ .strConvMode = 0,
+ .shape = SPRITE_SHAPE(8x16),
+ .size = SPRITE_SIZE(8x16),
+ .priority = 0,
+ .oamCount = 2,
+ .xDelta = 8,
+ .x = 204,
+ .y = 0,
+ .spriteSheet = {.compressed = &gUnknown_846F2F8[3]},
+ .spritePal = &gUnknown_846F320[2],
+ }
+};
+
+static const u8 *const gUnknown_846F4B8[] = {
+ gText_SpaceTimes,
+ gText_XDotY,
+ gText_StrVar1Berry,
+ gText_NeatnessRankings,
+ gText_CooperativeRankings,
+ gText_PressingPowerRankings
+};
+
+int sub_814D5C8(void)
+{
+ struct BerryCrushGame * var0 = sub_814B6F0();
+ if (!var0)
+ return -1;
+
+ switch (var0->unkC)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ SetHBlankCallback(NULL);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ ScanlineEffect_Stop();
+ ResetTempTileDataBuffers();
+ break;
+ case 1:
+ CpuFill16(0, (void *)OAM, OAM_SIZE);
+ gReservedSpritePaletteCount = 0;
+ DigitObjUtil_Init(3);
+ break;
+ case 2:
+ ResetPaletteFade();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ break;
+ case 3:
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_846E3CC, NELEMS(gUnknown_846E3CC));
+ SetBgTilemapBuffer(1, var0->unk1C0);
+ SetBgTilemapBuffer(2, var0->unk21C0);
+ SetBgTilemapBuffer(3, var0->unk31C0);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ break;
+ case 4:
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);
+ FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 64);
+ FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 32, 32);
+ FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32);
+ break;
+ case 5:
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ DecompressAndCopyTileDataToVram(1, gUnknown_8EAFFC0, 0, 0, 0);
+ break;
+ case 6:
+ if (FreeTempTileDataBuffersIfPossible())
+ return 0;
+
+ InitStandardTextBoxWindows();
+ ResetBg0();
+ sub_814EB38(var0);
+ sub_814EBB0(var0);
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ break;
+ case 7:
+ LoadPalette(gUnknown_8EAFEA0, 0, 0x180);
+ CopyToBgTilemapBuffer(1, gBerryCrushGrinderTopTilemap, 0, 0);
+ CopyToBgTilemapBuffer(2, gBerryCrushContainerCapTilemap, 0, 0);
+ CopyToBgTilemapBuffer(3, gBerryCrushBackgroundTilemap, 0, 0);
+ sub_814EC80(var0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ break;
+ case 8:
+ LoadWirelessStatusIndicatorSpriteGfx();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ sub_814ECE0(var0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, -gSpriteCoordOffsetY);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ break;
+ case 9:
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ sub_814B914();
+ var0->unkC = 0;
+ return 1;
+ }
+
+ var0->unkC++;
+ return 0;
+}
+
+int sub_814D888(void)
+{
+ struct BerryCrushGame * var0 = sub_814B6F0();
+ if (!var0)
+ return -1;
+
+ switch (var0->unkC)
+ {
+ case 0:
+ LinkRfu_SetRfuFuncToSend6600();
+ break;
+ case 1:
+ if (!IsLinkTaskFinished())
+ return 0;
+ // fall through. The original author forgot to use "break" here
+ // because this will call BeginNormalPaletteFade() twice.
+ case 2:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ UpdatePaletteFade();
+ break;
+ case 3:
+ if (UpdatePaletteFade())
+ return 0;
+ break;
+ case 4:
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);
+ FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 32);
+ FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 32, 32);
+ FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32);
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ break;
+ case 5:
+ FreeAllWindowBuffers();
+ HideBg(0);
+ UnsetBgTilemapBuffer(0);
+ HideBg(1);
+ UnsetBgTilemapBuffer(1);
+ HideBg(2);
+ UnsetBgTilemapBuffer(2);
+ HideBg(3);
+ UnsetBgTilemapBuffer(3);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ break;
+ case 6:
+ DestroyWirelessStatusIndicatorSprite();
+ sub_814EF10(var0);
+ DigitObjUtil_Teardown();
+ break;
+ case 7:
+ var0->unkC = 0;
+ return 1;
+ }
+
+ var0->unkC++;
+ return 0;
+}
+
+int sub_814D9CC(struct BerryCrushGame * arg0)
+{
+ gSpriteCoordOffsetY = arg0->unk2A + arg0->unk2C;
+ SetGpuReg(REG_OFFSET_BG1VOFS, -gSpriteCoordOffsetY);
+ if (arg0->unk12 == 7)
+ {
+ sub_814EAD4(&arg0->unk138, arg0->unk28);
+ }
+
+ return 0;
+}
+
+void sub_814DA04(struct BerryCrushGame * arg0)
+{
+ arg0->unk2A = -104;
+ arg0->unk2C = 0;
+ gSpriteCoordOffsetX = 0;
+ gSpriteCoordOffsetY = -104;
+}
+
+void sub_814DA24(struct BerryCrushGame * arg0, struct BerryCrushGame_138 * arg1)
+{
+ u8 i;
+ u8 spriteId;
+ s16 var0, var1;
+ s16 *data;
+ int var3;
+ s16 var5;
+ u32 var6;
+
+ for (i = 0; i < arg0->unk9; i++)
+ {
+ spriteId = AddItemIconObjectWithCustomObjectTemplate(
+ &gUnknown_846F470,
+ gUnknown_846F2EC[i],
+ gUnknown_846F2EC[i],
+ arg0->unk68.as_four_players.others[i].unk0 + FIRST_BERRY_INDEX);
+ arg1->unk38[i] = &gSprites[spriteId];
+ arg1->unk38[i]->oam.priority = 3;
+ arg1->unk38[i]->affineAnimPaused = TRUE;
+ arg1->unk38[i]->pos1.x = arg1->unkC[i]->unk8 + 120;
+ arg1->unk38[i]->pos1.y = -16;
+ data = arg1->unk38[i]->data;
+ var5 = 512;
+ data[1] = var5;
+ data[2] = 32;
+ data[7] = 112;
+ var0 = arg1->unkC[i]->unkA - arg1->unkC[i]->unk8;
+ var3 = var0;
+ if (var0 < 0)
+ var3 += 3;
+
+ data[6] = var3 >> 2;
+ var0 *= 128;
+ var6 = var5 + 32;
+ var6 = var6 / 2;
+ var1 = sub_80D8B40(7, 0x3F80, var6);
+ data[0] = (u16)arg1->unk38[i]->pos1.x * 128;
+ data[3] = sub_80D8B40(7, var0, var1);
+ var1 = sub_80D8ABC(7, var1, 85);
+ data[4] = 0;
+ data[5] = sub_80D8B40(7, 0x3F80, var1);
+ data[7] |= 0x8000;
+ if (arg1->unkC[i]->unk8 < 0)
+ StartSpriteAffineAnim(arg1->unk38[i], 1);
+ }
+}
+
+void sub_814DB84(struct Sprite * sprite)
+{
+ s16 *data = sprite->data;
+
+ data[1] += data[2];
+ sprite->pos2.y += data[1] >> 8;
+ if (data[7] & 0x8000)
+ {
+ sprite->data[0] += data[3];
+ data[4] += data[5];
+ sprite->pos2.x = Sin(data[4] >> 7, data[6]);
+ if ((data[7] & 0x8000) && (data[4] >> 7) > 126)
+ {
+ sprite->pos2.x = 0;
+ data[7] &= 0x7FFF;
+ }
+ }
+
+ sprite->pos1.x = data[0] >> 7;
+ if (sprite->pos1.y + sprite->pos2.y >= (data[7] & 0x7FFF))
+ {
+ sprite->callback = SpriteCallbackDummy;
+ FreeSpriteOamMatrix(sprite);
+ DestroySprite(sprite);
+ }
+}
+
+void sub_814DC24(struct BerryCrushGame * arg0, UNUSED struct BerryCrushGame_138 * arg1)
+{
+ u8 i;
+ for (i = 0; i < arg0->unk9; i++)
+ {
+ FreeSpritePaletteByTag(gUnknown_846F2EC[i]);
+ FreeSpriteTilesByTag(gUnknown_846F2EC[i]);
+ }
+}
+
+void sub_814DC5C(struct BerryCrushGame * arg0, struct BerryCrushGame_138 * arg1)
+{
+ u8 sp4;
+ struct BerryCrushGame_4E * var4E;
+ u8 i;
+ u16 var, var2;
+
+ sp4 = 0;
+ var4E = &arg0->unk40.unkE;
+ for (i = 0; i < arg0->unk9; i++)
+ {
+ var = var4E->unkA >> (i * 3);
+ var &= 7;
+ if (var)
+ {
+ sp4++;
+ if (var & 0x4)
+ StartSpriteAnim(arg1->unk24[i], 1);
+ else
+ StartSpriteAnim(arg1->unk24[i], 0);
+
+ arg1->unk24[i]->invisible = FALSE;
+ arg1->unk24[i]->animPaused = FALSE;
+ arg1->unk24[i]->pos2.x = gUnknown_846F2D0[(var % 4) - 1][0];
+ arg1->unk24[i]->pos2.y = gUnknown_846F2D0[(var % 4) - 1][1];
+ }
+ }
+
+ if (sp4 == 0)
+ {
+ arg0->unk25_2 = 0;
+ }
+ else
+ {
+ var = (u8)(arg0->unk28 % 3);
+ var2 = var;
+ for (i = 0; i < var4E->unkC * 2 + 3; i++)
+ {
+ if (arg1->unk4C[i]->invisible)
+ {
+ arg1->unk4C[i]->callback = sub_814F0D8;
+ arg1->unk4C[i]->pos1.x = gUnknown_846F2D6[i][0] + 120;
+ arg1->unk4C[i]->pos1.y = gUnknown_846F2D6[i][1] + 136 - (var * 4);
+ arg1->unk4C[i]->pos2.x = gUnknown_846F2D6[i][0] + (gUnknown_846F2D6[i][0] / (var2 * 4));
+ arg1->unk4C[i]->pos2.y = gUnknown_846F2D6[i][1];
+ if (var4E->unk4_1)
+ StartSpriteAnim(arg1->unk4C[i], 1);
+ else
+ StartSpriteAnim(arg1->unk4C[i], 0);
+
+ var++;
+ if (var > 3)
+ var = 0;
+ }
+ }
+
+ if (arg0->unk25_2)
+ {
+ arg0->unk25_2 = 0;
+ }
+ else
+ {
+ if (sp4 == 1)
+ PlaySE(SE_TOY_DANGO);
+ else
+ PlaySE(SE_TOY_KABE);
+
+ arg0->unk25_2 = 1;
+ }
+ }
+}
+
+bool32 sub_814DE50(struct BerryCrushGame * arg0, struct BerryCrushGame_138 * arg1)
+{
+ u8 i;
+
+ for (i = 0; i < arg0->unk9; i++)
+ {
+ if (!arg1->unk24[i]->invisible)
+ return FALSE;
+ }
+
+ for (i = 0; i < 11; i++)
+ {
+ if (!arg1->unk4C[i]->invisible)
+ return FALSE;
+ }
+
+ if (arg0->unk2C != 0)
+ arg0->unk2C = 0;
+
+ return TRUE;
+}
+
+static void sub_814DEC0(struct BerryCrushGame_138 * arg0, u16 arg1)
+{
+ u8 i = 0;
+ u32 r7 = 0;
+ s16 r3 = 0;
+
+ arg0->unk4 = arg1 / 3600;
+ arg0->unk6 = (arg1 % 3600) / 60;
+ r3 = sub_80D8AA0((arg1 % 60) << 8, 4);
+
+ for (i = 0; i < 8; i++)
+ {
+ if ((r3 >> (7 - i)) & 1)
+ r7 += gUnknown_846E450[i];
+ }
+
+ arg0->unk8 = r7 / 1000000;
+}
+
+static void sub_814DF44(u8 windowId, u8 left, u8 colorId, const u8 *string)
+{
+ left = (left * 4) - (GetStringWidth(2, string, -1) / 2u);
+ AddTextPrinterParameterized3(windowId, 2, left, 0, sBerryCrushTextColorTable[colorId], 0, string);
+}
+
+static void sub_814DFA4(struct BerryCrushGame * sp0C, u8 sp10, u8 sp14, u8 sp18)
+{
+ u8 r8 = 0;
+ u8 sp1C = 0;
+ u8 sp20 = 0;
+ u8 r2;
+ s32 r3;
+ u8 r7;
+ union BerryCrushGame_68 * sp24 = &sp0C->unk68;
+ s32 sp30;
+
+ for (; r8 < sp0C->unk9; r8++)
+ {
+ DynamicPlaceholderTextUtil_Reset();
+ switch (sp10)
+ {
+ case 0:
+ sp1C = sp24->as_five_players.unk1C[0].unk4.as_2d_bytes[sp10][r8];
+ if (r8 != 0 && sp24->as_four_players.unk00.unk0C[sp10][r8] != sp24->as_four_players.unk00.unk0C[sp10][r8 - 1])
+ {
+ sp20 = r8;
+ }
+ ConvertIntToDecimalStringN(gStringVar1, sp24->as_four_players.unk00.unk0C[sp10][r8], STR_CONV_MODE_RIGHT_ALIGN, 4);
+ r7 = sp14 - GetStringWidth(2, gUnknown_846F4B8[sp10], -1) - 4;
+ AddTextPrinterParameterized3(sp0C->unk138.unk82, 2, r7, sp18 + 14 * r8, sBerryCrushTextColorTable[0], 0, gUnknown_846F4B8[sp10]);
+ AddTextPrinterParameterized3(sp0C->unk138.unk82, 2, r7 - 24, sp18 + 14 * r8, sBerryCrushTextColorTable[0], 0, gStringVar1);
+ break;
+ case 1:
+ sp1C = sp24->as_five_players.unk1C[0].unk4.as_2d_bytes[sp10][r8];
+ if (r8 != 0 && sp24->as_four_players.unk00.unk0C[sp10][r8] != sp24->as_four_players.unk00.unk0C[sp10][r8 - 1])
+ {
+ sp20 = r8;
+ }
+ ConvertIntToDecimalStringN(gStringVar1, sp24->as_four_players.unk00.unk0C[sp10][r8] >> 4, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ r3 = 0;
+ r7 = sp24->as_four_players.unk00.unk0C[sp10][r8] & 15;
+ for (r2 = 0; r2 < 4; r2++)
+ {
+ if ((r7 >> (3 - r2)) & 1)
+ r3 += gUnknown_846E450[r2];
+ }
+ r7 = r3 / 1000000u;
+ ConvertIntToDecimalStringN(gStringVar2, r7, STR_CONV_MODE_LEADING_ZEROS, 2);
+ StringExpandPlaceholders(gStringVar4, gUnknown_846F4B8[sp10]);
+ sp30 = sp14 - 4;
+ AddTextPrinterParameterized3(sp0C->unk138.unk82, 2, sp30 - GetStringWidth(2, gStringVar4, 0), sp18 + 14 * r8, sBerryCrushTextColorTable[0], 0, gStringVar4);
+ break;
+ case 2:
+ sp1C = r8;
+ sp20 = r8;
+ r2 = sp0C->unk68.as_five_players.unk1C[r8].unk14[12];
+ if (r2 >= LAST_BERRY_INDEX - FIRST_BERRY_INDEX + 2)
+ r2 = 0;
+ StringCopy(gStringVar1, gBerries[r2].name);
+ StringExpandPlaceholders(gStringVar4, gUnknown_846F4B8[sp10]);
+ AddTextPrinterParameterized3(sp0C->unk138.unk82, 2, sp14 - GetStringWidth(2, gStringVar4, -1) - 4, sp18 + 14 * r8, sBerryCrushTextColorTable[0], 0, gStringVar4);
+ break;
+ }
+ if (sp1C == sp0C->unk8)
+ StringCopy(gStringVar3, gText_1_ClrLtGryShdwBlk_Dynamic0);
+ else
+ StringCopy(gStringVar3, gText_1_Dynamic0);
+ gStringVar3[0] = sp20 + CHAR_1;
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, PLAYER_UNK14(sp0C, sp1C));
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gStringVar3);
+ AddTextPrinterParameterized3(sp0C->unk138.unk82, 2, 4, sp18 + 14 * r8, sBerryCrushTextColorTable[0], 0, gStringVar4);
+ }
+}
+
+static void sub_814E32C(struct BerryCrushGame * r8)
+{
+ u8 r10 = 0;
+ u8 r6 = 0;
+ u32 sp0C = 0;
+ union BerryCrushGame_68 *sp10 = &r8->unk68;
+ u8 r7 = GetWindowAttribute(r8->unk138.unk82, WINDOW_HEIGHT) * 8 - 42;
+
+ sub_814DEC0(&r8->unk138, sp10->as_four_players.unk00.unk04);
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, 2, r7, sBerryCrushTextColorTable[0], 0, gText_TimeColon);
+
+ r6 = 190 - (u8)GetStringWidth(2, gText_SpaceSec, 0);
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gText_SpaceSec);
+
+ r6 -= 32;
+ ConvertIntToDecimalStringN(gStringVar1, r8->unk138.unk6, STR_CONV_MODE_LEADING_ZEROS, 2);
+ ConvertIntToDecimalStringN(gStringVar2, r8->unk138.unk8, STR_CONV_MODE_LEADING_ZEROS, 2);
+ StringExpandPlaceholders(gStringVar4, gText_XDotY2);
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gStringVar4);
+
+ r6 -= (u8)GetStringWidth(2, gText_SpaceMin, 0) + 3;
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gText_SpaceMin);
+
+ r6 -= 9;
+ ConvertIntToDecimalStringN(gStringVar1, r8->unk138.unk4, STR_CONV_MODE_LEADING_ZEROS, 1);
+ StringExpandPlaceholders(gStringVar4, gText_StrVar1);
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gStringVar4);
+
+ r7 += 14;
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, 2, r7, sBerryCrushTextColorTable[0], 0, gText_PressingSpeed);
+
+ r6 = 190 - (u8)GetStringWidth(2, gText_TimesPerSec, 0);
+ AddTextPrinterParameterized3(r8->unk138.unk82, 3, r6, r7, sBerryCrushTextColorTable[0], 0, gText_TimesPerSec);
+
+ for (r10 = 0; r10 < 8; ++r10)
+ if (((u8)r8->unk16 >> (7 - r10)) & 1)
+ sp0C += *(r10 + gUnknown_846E450); // It's accessed in a different way here for unknown reason
+ ConvertIntToDecimalStringN(gStringVar1, r8->unk16 >> 8, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ ConvertIntToDecimalStringN(gStringVar2, sp0C / 1000000, STR_CONV_MODE_LEADING_ZEROS, 2);
+ StringExpandPlaceholders(gStringVar4, gText_XDotY3);
+ r6 -= 38;
+ if (r8->unk25_1)
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[5], 0, gStringVar4);
+ else
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gStringVar4);
+
+ r7 += 14;
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, 2, r7, sBerryCrushTextColorTable[0], 0, gText_Silkiness);
+
+ ConvertIntToDecimalStringN(gStringVar1, sp10->as_four_players.unk00.unk08, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ StringExpandPlaceholders(gStringVar4, gText_Var1Percent);
+ r6 = 190 - (u8)GetStringWidth(2, gStringVar4, 0);
+ AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gStringVar4);
+}
+
+bool32 sub_814E644(struct BerryCrushGame * r4, struct BerryCrushGame_138 * r6)
+{
+ u8 r5;
+ struct WindowTemplate template;
+
+ switch (r6->unk80)
+ {
+ case 0:
+ r5 = r4->unk9 - 2;
+ sub_814EB04(r6);
+ memcpy(&template, &gUnknown_846E428[r4->unk12 - 11], sizeof(struct WindowTemplate));
+ if (r4->unk12 == 13)
+ template.height = gUnknown_846E448[1][r5];
+ else
+ template.height = gUnknown_846E448[0][r5];
+ r6->unk82 = AddWindow(&template);
+ break;
+ case 1:
+ PutWindowTilemap(r6->unk82);
+ FillWindowPixelBuffer(r6->unk82, PIXEL_FILL(0));
+ break;
+ case 2:
+ TextWindow_SetStdFrame0_WithPal(r6->unk82, 0x21D, 0xD0);
+ DrawStdFrameWithCustomTileAndPalette(r6->unk82, 0, 541, 13);
+ break;
+ case 3:
+ r5 = r4->unk9 - 2;
+ switch (r4->unk12)
+ {
+ case 11:
+ sub_814DF44(r6->unk82, 22, 3, gText_PressesRankings);
+ sub_814DFA4(r4, 0, 0xB0, 8 * gUnknown_846E448[0][r5] - r4->unk9 * 14);
+ r6->unk80 = 5;
+ return FALSE;
+ case 12:
+ sub_814DF44(r6->unk82, 22, 4, gUnknown_846F4B8[r4->unk68.as_five_players.unk1C[0].unk4.as_2d_bytes[0][7] + 3]);
+ sub_814DFA4(r4, 1, 0xB0, 8 * gUnknown_846E448[0][r5] - r4->unk9 * 14);
+ r6->unk80 = 5;
+ return FALSE;
+ case 13:
+ sub_814DF44(r6->unk82, 24, 3, gText_CrushingResults);
+ sub_814DFA4(r4, 2, 0xC0, 0x10);
+ break;
+ }
+ break;
+ case 4:
+ sub_814E32C(r4);
+ break;
+ case 5:
+ CopyWindowToVram(r6->unk82, 3);
+ r6->unk80 = 0;
+ return TRUE;
+ }
+ ++r6->unk80;
+ return FALSE;
+}
+
+void sub_814E80C(struct BerryCrushGame * r4)
+{
+ ClearStdWindowAndFrameToTransparent(r4->unk138.unk82, 1);
+ RemoveWindow(r4->unk138.unk82);
+ sub_814EBB0(r4);
+}
+
+static void Task_ShowBerryCrushRankings(u8 taskId)
+{
+ u8 i = 0, j, xPos, yPos;
+ u32 score = 0;
+ s16 *data = gTasks[taskId].data;
+ u8 *str;
+
+ switch (data[0])
+ {
+ case 0:
+ data[1] = AddWindow(&gUnknown_846E3F0);
+ PutWindowTilemap(data[1]);
+ FillWindowPixelBuffer(data[1], PIXEL_FILL(0));
+ TextWindow_SetStdFrame0_WithPal(data[1], 0x21D, 0xD0);
+ DrawStdFrameWithCustomTileAndPalette(data[1], 0, 0x21D, 0xD);
+ break;
+ case 1:
+ xPos = 96 - GetStringWidth(2, gText_BerryCrush2, -1) / 2u;
+ AddTextPrinterParameterized3(
+ data[1],
+ 2,
+ xPos,
+ 2,
+ sBerryCrushTextColorTable[3],
+ 0,
+ gText_BerryCrush2
+ );
+ xPos = 96 - GetStringWidth(2, gText_PressingSpeedRankings, -1) / 2u;
+ AddTextPrinterParameterized3(
+ data[1],
+ 2,
+ xPos,
+ 18,
+ sBerryCrushTextColorTable[3],
+ 0,
+ gText_PressingSpeedRankings
+ );
+ yPos = 42;
+ for (i = 0; i < 4; ++i)
+ {
+ ConvertIntToDecimalStringN(gStringVar1, i + 2, STR_CONV_MODE_LEFT_ALIGN, 1);
+ StringExpandPlaceholders(gStringVar4, gText_Var1Players);
+ AddTextPrinterParameterized3(
+ data[1],
+ 2,
+ 4,
+ yPos,
+ sBerryCrushTextColorTable[0],
+ 0,
+ gStringVar4
+ );
+ for (j = 0; j < 8; ++j)
+ {
+ if (((data[i + 2] & 0xFF) >> (7 - j)) & 1)
+ score += gUnknown_846E450[j];
+ }
+ ConvertIntToDecimalStringN(gStringVar1, (u16)data[i + 2] >> 8, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ ConvertIntToDecimalStringN(gStringVar2, score / 1000000, STR_CONV_MODE_LEADING_ZEROS, 2);
+ str = StringExpandPlaceholders(gStringVar4, gText_XDotY3);
+ *str++ = CHAR_SPACE;
+ StringCopy(str, gText_TimesPerSec);
+ xPos = 192 - (u8)GetStringWidth(3, gStringVar4, 0);
+ AddTextPrinterParameterized3(
+ data[1],
+ 3,
+ xPos,
+ yPos,
+ sBerryCrushTextColorTable[0],
+ 0,
+ gStringVar4
+ );
+ yPos += 14;
+ score = 0;
+ }
+ CopyWindowToVram(data[1], 3);
+ break;
+ case 2:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ break;
+ else
+ return;
+ case 3:
+ ClearStdWindowAndFrameToTransparent(data[1], 1);
+ ClearWindowTilemap(data[1]);
+ RemoveWindow(data[1]);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ ScriptContext2_Disable();
+ data[0] = 0;
+ return;
+ }
+ ++data[0];
+}
+
+void ShowBerryCrushRankings(void)
+{
+ u8 taskId;
+
+ ScriptContext2_Enable();
+ taskId = CreateTask(Task_ShowBerryCrushRankings, 0);
+ gTasks[taskId].data[2] = gSaveBlock2Ptr->berryCrush.berryCrushResults[0];
+ gTasks[taskId].data[3] = gSaveBlock2Ptr->berryCrush.berryCrushResults[1];
+ gTasks[taskId].data[4] = gSaveBlock2Ptr->berryCrush.berryCrushResults[2];
+ gTasks[taskId].data[5] = gSaveBlock2Ptr->berryCrush.berryCrushResults[3];
+}
+
+static void sub_814EAD4(struct BerryCrushGame_138 * r4, u16 r1)
+{
+ sub_814DEC0(r4, r1);
+ DigitObjUtil_PrintNumOn(0, r4->unk4);
+ DigitObjUtil_PrintNumOn(1, r4->unk6);
+ DigitObjUtil_PrintNumOn(2, r4->unk8);
+}
+
+void sub_814EB04(struct BerryCrushGame_138 * r0)
+{
+ r0->unk78[0]->invisible = TRUE;
+ r0->unk78[1]->invisible = TRUE;
+ DigitObjUtil_HideOrShow(2, 1);
+ DigitObjUtil_HideOrShow(1, 1);
+ DigitObjUtil_HideOrShow(0, 1);
+}
+
+static void sub_814EB38(struct BerryCrushGame * r5)
+{
+ u8 r6;
+
+ for (r6 = 0; r6 < r5->unk9; ++r6)
+ {
+ r5->unk138.unkC[r6] = &gUnknown_846F294[gUnknown_846F280[r5->unk9 - 2][r6]];
+ r5->unk138.unk83[r6] = AddWindow(&gUnknown_846E3F8[r5->unk138.unkC[r6]->unk0]);
+ PutWindowTilemap(r5->unk138.unk83[r6]);
+ FillWindowPixelBuffer(r5->unk138.unk83[r6], 0);
+ }
+}
+
+static void sub_814EBB0(struct BerryCrushGame * r6)
+{
+ u8 r7, r2;
+ u8 *r4;
+
+ for (r7 = 0; r7 < r6->unk9; ++r7)
+ {
+ PutWindowTilemap(r6->unk138.unk83[r7]);
+ if (r7 == r6->unk8)
+ {
+ AddTextPrinterParameterized4(
+ r6->unk138.unk83[r7],
+ 2,
+ 36 - GetStringWidth(2, PLAYER_UNK14(r6, r7), 0) / 2u,
+ 1,
+ 0,
+ 0,
+ sBerryCrushTextColorTable[1],
+ 0,
+ PLAYER_UNK14(r6, r7)
+ );
+ }
+ else
+ {
+ AddTextPrinterParameterized4(
+ r6->unk138.unk83[r7],
+ 2,
+ 36 - GetStringWidth(2, PLAYER_UNK14(r6, r7), 0) / 2u,
+ 1,
+ 0,
+ 0,
+ sBerryCrushTextColorTable[2],
+ 0,
+ PLAYER_UNK14(r6, r7)
+ );
+ }
+ CopyWindowToVram(r6->unk138.unk83[r7], 3);
+ }
+ CopyBgTilemapBufferToVram(0);
+}
+
+static void sub_814EC80(struct BerryCrushGame * r6)
+{
+ u8 r5 = 0;
+ const u32 *r0 = gUnknown_8EB0ADC;
+#ifndef NONMATCHING // r4, r5, r6 register roulette
+ register u8 *r4 asm("r4") = gDecompressionBuffer;
+ register u32 r0_ asm("r0");
+#else
+ u8 *r4 = gDecompressionBuffer;
+ u32 r0_;
+#endif
+
+ LZ77UnCompWram(r0, r4);
+ for (; r5 < r6->unk9; ++r5)
+ {
+ r0_ = r6->unk138.unkC[r5]->unk0;
+ CopyToBgTilemapBufferRect(
+ 3,
+ &r4[r0_ * 40],
+ r6->unk138.unkC[r5]->unk1,
+ r6->unk138.unkC[r5]->unk2,
+ 10,
+ 2
+ );
+ }
+ CopyBgTilemapBufferToVram(3);
+}
+
+static void sub_814ECE0(struct BerryCrushGame * r6)
+{
+ u8 r5 = 0;
+ u8 r2;
+
+ r6->unk2A = -104;
+ r6->unk2C = 0;
+ gSpriteCoordOffsetX = 0;
+ gSpriteCoordOffsetY = -104;
+ for (; r5 < 4; ++r5)
+ LoadCompressedSpriteSheet(&gUnknown_846F2F8[r5]);
+ LoadSpritePalettes(gUnknown_846F320);
+ r2 = CreateSprite(&gUnknown_846F410, 120, 88, 5);
+ r6->unk138.unk20 = &gSprites[r2];
+ r6->unk138.unk20->oam.priority = 3;
+ r6->unk138.unk20->coordOffsetEnabled = TRUE;
+ r6->unk138.unk20->animPaused = TRUE;
+ for (r5 = 0; r5 < r6->unk9; ++r5)
+ {
+ r2 = CreateSprite(
+ &gUnknown_846F428,
+ r6->unk138.unkC[r5]->unk4 + 120,
+ r6->unk138.unkC[r5]->unk6 + 32,
+ 0
+ );
+ r6->unk138.unk24[r5] = &gSprites[r2];
+ r6->unk138.unk24[r5]->oam.priority = 1;
+ r6->unk138.unk24[r5]->invisible = TRUE;
+ r6->unk138.unk24[r5]->coordOffsetEnabled = TRUE;
+ r6->unk138.unk24[r5]->animPaused = TRUE;
+ }
+ for (r5 = 0; r5 < NELEMS(r6->unk138.unk4C); ++r5)
+ {
+ r2 = CreateSprite(
+ &gUnknown_846F440,
+ gUnknown_846F2D6[r5][0] + 120,
+ gUnknown_846F2D6[r5][1] + 136,
+ 6
+ );
+ r6->unk138.unk4C[r5] = &gSprites[r2];
+ r6->unk138.unk4C[r5]->oam.priority = 3;
+ r6->unk138.unk4C[r5]->invisible = TRUE;
+ r6->unk138.unk4C[r5]->animPaused = TRUE;
+ r6->unk138.unk4C[r5]->data[0] = r5;
+ }
+ for (r5 = 0; r5 < NELEMS(r6->unk138.unk78); ++r5)
+ {
+ r2 = CreateSprite(
+ &gUnknown_846F458,
+ 24 * r5 + 176,
+ 8,
+ 0
+ );
+ r6->unk138.unk78[r5] = &gSprites[r2];
+ r6->unk138.unk78[r5]->oam.priority = 0;
+ r6->unk138.unk78[r5]->invisible = FALSE;
+ r6->unk138.unk78[r5]->animPaused = FALSE;
+ }
+ DigitObjUtil_CreatePrinter(0, 0, &gUnknown_846F488[0]);
+ DigitObjUtil_CreatePrinter(1, 0, &gUnknown_846F488[1]);
+ DigitObjUtil_CreatePrinter(2, 0, &gUnknown_846F488[2]);
+ if (r6->unk12 == 1)
+ sub_814EB04(&r6->unk138);
+}
+
+static void sub_814EF10(struct BerryCrushGame * r5)
+{
+ u8 r4 = 0;
+
+ FreeSpriteTilesByTag(4);
+ FreeSpriteTilesByTag(3);
+ FreeSpriteTilesByTag(2);
+ FreeSpriteTilesByTag(1);
+ FreeSpritePaletteByTag(4);
+ FreeSpritePaletteByTag(2);
+ FreeSpritePaletteByTag(1);
+ for (; r4 < NELEMS(r5->unk138.unk78); ++r4)
+ DestroySprite(r5->unk138.unk78[r4]);
+ DigitObjUtil_DeletePrinter(2);
+ DigitObjUtil_DeletePrinter(1);
+ DigitObjUtil_DeletePrinter(0);
+ for (r4 = 0; r4 < NELEMS(r5->unk138.unk4C); ++r4)
+ DestroySprite(r5->unk138.unk4C[r4]);
+ for (r4 = 0; r4 < r5->unk9; ++r4)
+ DestroySprite(r5->unk138.unk24[r4]);
+ if (r5->unk138.unk20->inUse)
+ DestroySprite(r5->unk138.unk20);
+}
+
+static void sub_814EFD0(struct Sprite * sprite)
+{
+ if (sprite->animEnded)
+ {
+ sprite->invisible = TRUE;
+ sprite->animPaused = TRUE;
+ }
+}
+
+static void sub_814EFFC(struct Sprite * sprite)
+{
+ u8 r1 = 0;
+ SpriteCallback r5 = SpriteCallbackDummy;
+
+ for (; r1 < NELEMS(sprite->data); ++r1)
+ sprite->data[r1] = 0;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->invisible = TRUE;
+ sprite->animPaused = TRUE;
+ sprite->callback = r5;
+}
+
+static void sub_814F044(struct Sprite * sprite)
+{
+ s16 *r4 = sprite->data;
+
+ r4[1] += r4[2];
+ sprite->pos2.y += r4[1] >> 8;
+ if (r4[7] & 0x8000)
+ {
+ sprite->data[0] += r4[3];
+ r4[4] += r4[5];
+ sprite->pos2.x = Sin(r4[4] >> 7, r4[6]);
+ if (r4[7] & 0x8000 && r4[4] >> 7 > 126)
+ {
+ sprite->pos2.x = 0;
+ r4[7] &= 0x7FFF;
+ }
+ }
+ sprite->pos1.x = r4[0] >> 7;
+ if (sprite->pos1.y + sprite->pos2.y > (r4[7] & 0x7FFF))
+ sprite->callback = sub_814EFFC;
+}
+
+static void sub_814F0D8(struct Sprite * sprite)
+{
+ s16 *r7 = sprite->data;
+ s16 r4, r5;
+ s32 r2;
+ u32 r8 = 0;
+
+ r2 = 640;
+ r7[1] = r2;
+ r7[2] = 32;
+ r7[7] = 168;
+ r4 = sprite->pos2.x * 128;
+ r5 = sub_80D8B40(7, (168 - sprite->pos1.y) << 7, (r2 + 32) >> 1);
+ sprite->data[0] = sprite->pos1.x << 7;
+ r7[3] = sub_80D8B40(7, r4, r5);
+ r2 = sub_80D8ABC(7, r5, 85);
+ r7[4] = r8;
+ r7[5] = sub_80D8B40(7, 0x3F80, r2);
+ r7[6] = sprite->pos2.x / 4;
+ r7[7] |= 0x8000;
+ sprite->pos2.y = r8;
+ sprite->pos2.x = r8;
+ sprite->callback = sub_814F044;
+ sprite->animPaused = FALSE;
+ sprite->invisible = FALSE;
+}
diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c
index e60a53ef9..2e0bf8256 100644
--- a/src/berry_fix_program.c
+++ b/src/berry_fix_program.c
@@ -1,17 +1,12 @@
#include "global.h"
#include "gpu_regs.h"
#include "multiboot.h"
-#include "malloc.h"
-#include "bg.h"
#include "graphics.h"
#include "main.h"
#include "sprite.h"
#include "task.h"
#include "scanline_effect.h"
-#include "window.h"
-#include "text.h"
#include "help_system.h"
-#include "menu.h"
#include "m4a.h"
// Static type declarations
diff --git a/src/berry_pouch.c b/src/berry_pouch.c
index 63677574b..a0b2c03a3 100644
--- a/src/berry_pouch.c
+++ b/src/berry_pouch.c
@@ -748,7 +748,7 @@ static void BerryPouchSetArrowCursorAt(u8 y, u8 colorIdx)
}
else
{
- BerryPouchPrint(0, 2, gFameCheckerText_ListMenuCursor, 1, y, 0, 0, 0, colorIdx);
+ BerryPouchPrint(0, 2, gText_SelectorArrow2, 1, y, 0, 0, 0, colorIdx);
}
}
@@ -1027,7 +1027,7 @@ static void CreateNormalContextMenu(u8 taskId)
Menu_InitCursor(windowId, 2, 0, 2, GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) + 2, sContextMenuNumOptions, 0);
windowId2 = GetOrCreateVariableWindow(6);
CopySelectedListMenuItemName(data[1], gStringVar1);
- StringExpandPlaceholders(gStringVar4, gOtherText_StrVar1);
+ StringExpandPlaceholders(gStringVar4, gText_Var1IsSelected);
BerryPouchPrint(windowId2, 2, gStringVar4, 0, 2, 1, 2, 0, 1);
}
diff --git a/src/berry_powder.c b/src/berry_powder.c
index 2eff23802..3ebffed48 100644
--- a/src/berry_powder.c
+++ b/src/berry_powder.c
@@ -36,7 +36,7 @@ static bool8 HasEnoughBerryPowder(u32 cost)
return TRUE;
}
-bool8 Special_HasEnoughBerryPowder(void)
+bool8 Script_HasEnoughBerryPowder(void)
{
if (DecryptBerryPowder(&gSaveBlock2Ptr->berryCrush.berryPowderAmount) < gSpecialVar_0x8004)
return FALSE;
@@ -73,7 +73,7 @@ static bool8 TakeBerryPowder(u32 cost)
}
}
-bool8 Special_TakeBerryPowder(void)
+bool8 Script_TakeBerryPowder(void)
{
u32 *powder = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;
if (!HasEnoughBerryPowder(gSpecialVar_0x8004))
diff --git a/src/cable_club.c b/src/cable_club.c
new file mode 100644
index 000000000..b7f9b9114
--- /dev/null
+++ b/src/cable_club.c
@@ -0,0 +1,964 @@
+#include "global.h"
+#include "gflib.h"
+#include "battle.h"
+#include "battle_records.h"
+#include "cable_club.h"
+#include "event_data.h"
+#include "event_scripts.h"
+#include "field_message_box.h"
+#include "field_weather.h"
+#include "link.h"
+#include "load_save.h"
+#include "m4a.h"
+#include "mevent.h"
+#include "new_menu_helpers.h"
+#include "overworld.h"
+#include "quest_log.h"
+#include "script.h"
+#include "script_pokemon_util.h"
+#include "start_menu.h"
+#include "strings.h"
+#include "task.h"
+#include "trade.h"
+#include "trainer_card.h"
+#include "union_room.h"
+#include "constants/songs.h"
+#include "constants/cable_club.h"
+#include "constants/field_weather.h"
+
+u32 UnusedVarNeededToMatch[8];
+
+static void Task_Linkup0(u8 taskId);
+static void Task_Linkup1(u8 taskId);
+static void Task_LinkupMaster_2(u8 taskId);
+static void Task_LinkupMaster_3(u8 taskId);
+static void Task_LinkupMaster_4(u8 taskId);
+static void Task_LinkupMaster_5(u8 taskId);
+static void Task_LinkupSlave_2(u8 taskId);
+static void Task_LinkupMaster_6(u8 taskId);
+static void Task_Linkup_6a(u8 taskId);
+static void Task_Linkup_7(u8 taskId);
+static void Task_Linkup_Canceled(u8 taskId);
+static void Task_Linkup_ErroredOut(u8 taskId);
+static bool8 Task_Linkup_TimedOut(u8 taskId);
+static void Task_ReestablishLinkInCableClubRoom_0(u8 taskId);
+static void Task_ReestablishLinkInCableClubRoom_1(u8 taskId);
+static void Task_ReestablishLinkInCableClubRoom_Master(u8 taskId);
+static void Task_ReestablishLinkInCableClubRoom_2(u8 taskId);
+
+static const struct WindowTemplate gUnknown_83C6AB0 = {
+ .bg = 0,
+ .tilemapLeft = 16,
+ .tilemapTop = 11,
+ .width = 11,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x125
+};
+
+static const u8 *const sStarsMessagePtrs[] = {
+ gUnknown_841DF8B,
+ gUnknown_841DF92,
+ gUnknown_841DF99,
+ gUnknown_841DFA0
+};
+
+static void CreateLinkupTask(u8 lower, u8 higher)
+{
+ u8 taskId;
+ if (FindTaskIdByFunc(Task_Linkup0) == 0xFF)
+ {
+ taskId = CreateTask(Task_Linkup0, 80);
+ gTasks[taskId].data[1] = lower;
+ gTasks[taskId].data[2] = higher;
+ }
+}
+
+static void PrintNewCountOnLinkPlayerCountDisplayWindow(u16 windowId, s32 num)
+{
+ ConvertIntToDecimalStringN(gStringVar1, num, STR_CONV_MODE_LEFT_ALIGN, 1);
+ SetStdWindowBorderStyle(windowId, FALSE);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841DF82);
+ AddTextPrinterParameterized(windowId, 2, gStringVar4, 0, 0, TEXT_SPEED_FF, NULL);
+ CopyWindowToVram(windowId, 3);
+}
+
+static void DestroyLinkPlayerCountDisplayWindow(u16 windowId)
+{
+ ClearStdWindowAndFrame(windowId, FALSE);
+ CopyWindowToVram(windowId, 3);
+}
+
+static void UpdateLinkPlayerCountDisplay(u8 taskId, u8 num)
+{
+ s16 *data = gTasks[taskId].data;
+ if (num != data[3])
+ {
+ if (num < 2)
+ DestroyLinkPlayerCountDisplayWindow(data[5]);
+ else
+ PrintNewCountOnLinkPlayerCountDisplayWindow(data[5], num);
+ data[3] = num;
+ }
+}
+
+static u16 sub_8080844(u8 lower, u8 higher)
+{
+ switch (GetLinkPlayerDataExchangeStatusTimed(lower, higher))
+ {
+ case EXCHANGE_COMPLETE:
+ return 1;
+ case EXCHANGE_IN_PROGRESS:
+ return 3;
+ case EXCHANGE_STAT_4:
+ return 7;
+ case EXCHANGE_STAT_5:
+ return 9;
+ case EXCHANGE_STAT_6:
+ ConvertIntToDecimalStringN(gStringVar1, GetLinkPlayerCount_2(), STR_CONV_MODE_LEFT_ALIGN, 1);
+ return 4;
+ default:
+ return 0;
+ }
+}
+
+static bool32 sub_80808BC(u8 taskId)
+{
+ if (HasLinkErrorOccurred() == TRUE)
+ {
+ gTasks[taskId].func = Task_Linkup_ErroredOut;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool32 sub_80808F0(u8 taskId)
+{
+ if (JOY_NEW(B_BUTTON) && !IsLinkConnectionEstablished())
+ {
+ gLinkType = 0;
+ gTasks[taskId].func = Task_Linkup_Canceled;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool32 sub_808093C(u8 taskId)
+{
+ if (IsLinkConnectionEstablished())
+ {
+ SetSuppressLinkErrorMessage(TRUE);
+ }
+ if (JOY_NEW(B_BUTTON))
+ {
+ gLinkType = 0;
+ gTasks[taskId].func = Task_Linkup_Canceled;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool32 sub_8080990(u8 taskId)
+{
+ if (GetSioMultiSI() == TRUE)
+ {
+ gTasks[taskId].func = Task_Linkup_ErroredOut;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_80809C4(u8 taskId)
+{
+ gTasks[taskId].data[0]++;
+ if (gTasks[taskId].data[0] == 10)
+ {
+ sub_800A474(2);
+ DestroyTask(taskId);
+ }
+}
+
+static void Task_Linkup0(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (data[0] == 0)
+ {
+ OpenLinkTimed();
+ sub_800AA24();
+ ResetLinkPlayers();
+ data[5] = AddWindow(&gUnknown_83C6AB0);
+ }
+ else if (data[0] > 9)
+ {
+ gTasks[taskId].func = Task_Linkup1;
+ }
+ data[0]++;
+}
+
+static void Task_Linkup1(u8 taskId)
+{
+ u8 linkPlayerCount = GetLinkPlayerCount_2();
+ if (sub_80808F0(taskId) != TRUE && sub_808093C(taskId) != TRUE && linkPlayerCount >= 2)
+ {
+ SetSuppressLinkErrorMessage(TRUE);
+ gTasks[taskId].data[3] = 0;
+ if (IsLinkMaster() == TRUE)
+ {
+ PlaySE(SE_PIN);
+ ShowFieldAutoScrollMessage(CableClub_Text_WhenAllPlayersReadyAConfirmBCancel);
+ gTasks[taskId].func = Task_LinkupMaster_2;
+ }
+ else
+ {
+ PlaySE(SE_BOO);
+ ShowFieldAutoScrollMessage(CableClub_Text_AwaitingLinkupBCancel);
+ gTasks[taskId].func = Task_LinkupSlave_2;
+ }
+ }
+}
+
+static void Task_LinkupMaster_2(u8 taskId)
+{
+ if (sub_80808F0(taskId) != TRUE && sub_8080990(taskId) != TRUE && sub_80808BC(taskId) != TRUE && !textbox_any_visible())
+ {
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].func = Task_LinkupMaster_3;
+ }
+}
+
+static void Task_LinkupMaster_3(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ s32 linkPlayerCount = GetLinkPlayerCount_2();
+ if (sub_80808F0(taskId) != TRUE && sub_8080990(taskId) != TRUE && sub_80808BC(taskId) != TRUE)
+ {
+ UpdateLinkPlayerCountDisplay(taskId, linkPlayerCount);
+ if (JOY_NEW(A_BUTTON) && linkPlayerCount >= data[1])
+ {
+ sub_800A900(linkPlayerCount);
+ DestroyLinkPlayerCountDisplayWindow(data[5]);
+ ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1);
+ ShowFieldAutoScrollMessage(CableClub_Text_StartLinkWithXPlayersAConfirmBCancel);
+ gTasks[taskId].func = Task_LinkupMaster_4;
+ }
+ }
+}
+
+static void Task_LinkupMaster_4(u8 taskId)
+{
+ if (sub_80808F0(taskId) != TRUE && sub_8080990(taskId) != TRUE && sub_80808BC(taskId) != TRUE && !textbox_any_visible())
+ {
+ if (GetSavedPlayerCount() != GetLinkPlayerCount_2())
+ {
+ ShowFieldAutoScrollMessage(CableClub_Text_WhenAllPlayersReadyAConfirmBCancel);
+ gTasks[taskId].func = Task_LinkupMaster_2;
+ }
+ else if (JOY_HELD(B_BUTTON))
+ {
+ ShowFieldAutoScrollMessage(CableClub_Text_WhenAllPlayersReadyAConfirmBCancel);
+ gTasks[taskId].func = Task_LinkupMaster_2;
+ }
+ else if (JOY_HELD(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ CheckShouldAdvanceLinkState();
+ gTasks[taskId].func = Task_LinkupMaster_5;
+ }
+ }
+}
+
+static void Task_LinkupMaster_5(u8 taskId)
+{
+ u8 lower = gTasks[taskId].data[1];
+ u8 higher = gTasks[taskId].data[2];
+ u16 *res;
+ if (sub_80808BC(taskId) != TRUE && Task_Linkup_TimedOut(taskId) != TRUE)
+ {
+ if (GetLinkPlayerCount_2() != GetSavedPlayerCount())
+ {
+ gTasks[taskId].func = Task_Linkup_ErroredOut;
+ }
+ else
+ {
+ res = &gSpecialVar_Result;
+ *res = sub_8080844(lower, higher);
+ if (*res)
+ gTasks[taskId].func = Task_LinkupMaster_6;
+ }
+ }
+}
+
+static void Task_LinkupSlave_2(u8 taskId)
+{
+ u8 lower = gTasks[taskId].data[1];
+ u8 higher = gTasks[taskId].data[2];
+ u16 *res;
+ if (sub_80808F0(taskId) != TRUE && sub_80808BC(taskId) != TRUE)
+ {
+ res = &gSpecialVar_Result;
+ *res = sub_8080844(lower, higher);
+ if (*res)
+ {
+ if (*res == 3 || *res == 4)
+ {
+ Link_TryStartSend5FFF();
+ HideFieldMessageBox();
+ gTasks[taskId].func = Task_Linkup_7;
+ }
+ else if (*res == 7 || *res == 9)
+ {
+ CloseLink();
+ HideFieldMessageBox();
+ gTasks[taskId].func = Task_Linkup_7;
+ }
+ else
+ {
+ gFieldLinkPlayerCount = GetLinkPlayerCount_2();
+ gLocalLinkPlayerId = GetMultiplayerId();
+ sub_800A900(gFieldLinkPlayerCount);
+ TrainerCard_GenerateCardForLinkPlayer((void*)gBlockSendBuffer);
+ gTasks[taskId].func = Task_Linkup_6a;
+ }
+ }
+ }
+}
+
+static bool32 AnyConnectedPartnersPlayingRS(void)
+{
+ int i;
+ u16 version;
+
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ version = gLinkPlayers[i].version & 0xFF;
+ if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void Task_LinkupMaster_6(u8 taskId)
+{
+ if (sub_80808BC(taskId) != TRUE)
+ {
+ if (gSpecialVar_Result == 4)
+ {
+ if (AnyConnectedPartnersPlayingRS() == TRUE)
+ CloseLink();
+ else
+ Link_TryStartSend5FFF();
+ HideFieldMessageBox();
+ gTasks[taskId].func = Task_Linkup_7;
+ }
+ else if (gSpecialVar_Result == 3)
+ {
+ Link_TryStartSend5FFF();
+ HideFieldMessageBox();
+ gTasks[taskId].func = Task_Linkup_7;
+ }
+ else if (gSpecialVar_Result == 7 || gSpecialVar_Result == 9)
+ {
+ CloseLink();
+ HideFieldMessageBox();
+ gTasks[taskId].func = Task_Linkup_7;
+ }
+ else
+ {
+ gFieldLinkPlayerCount = GetLinkPlayerCount_2();
+ gLocalLinkPlayerId = GetMultiplayerId();
+ sub_800A900(gFieldLinkPlayerCount);
+ TrainerCard_GenerateCardForLinkPlayer((void*)gBlockSendBuffer);
+ gTasks[taskId].func = Task_Linkup_6a;
+ sub_800A474(2);
+ }
+ }
+}
+
+static void Task_Linkup_6a(u8 taskId)
+{
+ u8 i;
+ u16 version;
+ u8 * dest;
+ if (sub_80808BC(taskId) != TRUE && GetBlockReceivedStatus() == sub_800A8A4())
+ {
+ for(i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ version = gLinkPlayers[i].version & 0xFF;
+ if (version != VERSION_FIRE_RED && version != VERSION_LEAF_GREEN)
+ {
+ const struct TrainerCardRSE * src = (const struct TrainerCardRSE *)gBlockRecvBuffer[i];
+ gTrainerCards[i].rse = *src;
+ gTrainerCards[i].version = gLinkPlayers[i].version;
+ }
+ else
+ {
+ const struct TrainerCard * src = (const struct TrainerCard *)gBlockRecvBuffer[i];
+ gTrainerCards[i] = *src;
+ }
+ }
+ SetSuppressLinkErrorMessage(FALSE);
+ ResetBlockReceivedFlags();
+ HideFieldMessageBox();
+ if (gSpecialVar_Result == 1)
+ {
+ // Dumb trick required to match
+ if (gLinkType == LINKTYPE_0x4411)
+ *UnusedVarNeededToMatch += 0;
+ DestroyLinkPlayerCountDisplayWindow(gTasks[taskId].data[5]);
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+ else
+ {
+ Link_TryStartSend5FFF();
+ gTasks[taskId].func = Task_Linkup_7;
+ }
+ }
+}
+
+static void Task_Linkup_7(u8 taskId)
+{
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ DestroyLinkPlayerCountDisplayWindow(gTasks[taskId].data[5]);
+ EnableBothScriptContexts();
+ RemoveWindow(gTasks[taskId].data[5]);
+ DestroyTask(taskId);
+ }
+}
+
+static void Task_Linkup_Canceled(u8 taskId)
+{
+ gSpecialVar_Result = 5;
+ DestroyLinkPlayerCountDisplayWindow(gTasks[taskId].data[5]);
+ HideFieldMessageBox();
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+}
+
+static void Task_Linkup_ErroredOut(u8 taskId)
+{
+ gSpecialVar_Result = 6;
+ DestroyLinkPlayerCountDisplayWindow(gTasks[taskId].data[5]);
+ HideFieldMessageBox();
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+}
+
+static bool8 Task_Linkup_TimedOut(u8 taskId)
+{
+ gTasks[taskId].data[4]++;
+ if (gTasks[taskId].data[4] > 600)
+ {
+ gTasks[taskId].func = Task_Linkup_ErroredOut;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void TryBattleLinkup(void)
+{
+ u8 lower, higher;
+ higher = lower = 2;
+ switch (gSpecialVar_0x8004)
+ {
+ case USING_SINGLE_BATTLE:
+ higher = lower = 2;
+ gLinkType = LINKTYPE_SINGLE_BATTLE;
+ break;
+ case USING_DOUBLE_BATTLE:
+ higher = lower = 2;
+ gLinkType = LINKTYPE_DOUBLE_BATTLE;
+ break;
+ case USING_MULTI_BATTLE:
+ higher = lower = 4;
+ gLinkType = LINKTYPE_MULTI_BATTLE;
+ break;
+ }
+ CreateLinkupTask(lower, higher);
+}
+
+void TryTradeLinkup(void)
+{
+ gLinkType = LINKTYPE_0x1133;
+ gBattleTypeFlags = 0;
+ CreateLinkupTask(2, 2);
+}
+
+void TryRecordMixLinkup(void)
+{
+ gSpecialVar_Result = 0;
+ gLinkType = LINKTYPE_0x3311;
+ gBattleTypeFlags = 0;
+ CreateLinkupTask(2, 4);
+}
+
+void sub_8081128(void)
+{
+ gLinkType = LINKTYPE_0x6601;
+ gBattleTypeFlags = 0;
+ CreateLinkupTask(4, 4);
+}
+
+u8 CreateTask_ReestablishLinkInCableClubRoom(void)
+{
+ if (FuncIsActiveTask(Task_ReestablishLinkInCableClubRoom_0))
+ return 0xFF;
+ switch (gSpecialVar_0x8004)
+ {
+ case USING_SINGLE_BATTLE:
+ gLinkType = LINKTYPE_SINGLE_BATTLE;
+ break;
+ case USING_DOUBLE_BATTLE:
+ gLinkType = LINKTYPE_DOUBLE_BATTLE;
+ break;
+ case USING_MULTI_BATTLE:
+ gLinkType = LINKTYPE_MULTI_BATTLE;
+ break;
+ case USING_TRADE_CENTER:
+ gLinkType = LINKTYPE_0x1111;
+ break;
+ case USING_RECORD_CORNER:
+ gLinkType = LINKTYPE_0x3322;
+ break;
+ }
+ return CreateTask(Task_ReestablishLinkInCableClubRoom_0, 80);
+}
+
+static void Task_ReestablishLinkInCableClubRoom_0(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (data[0] == 0)
+ {
+ OpenLink();
+ ResetLinkPlayers();
+ CreateTask(sub_8081A90, 80);
+ }
+ else if (data[0] > 9)
+ gTasks[taskId].func = Task_ReestablishLinkInCableClubRoom_1;
+ data[0]++;
+}
+
+static void Task_ReestablishLinkInCableClubRoom_1(u8 taskId)
+{
+ if (GetLinkPlayerCount_2() >= 2)
+ {
+ if (IsLinkMaster() == TRUE)
+ {
+ gTasks[taskId].func = Task_ReestablishLinkInCableClubRoom_Master;
+ }
+ else
+ {
+ gTasks[taskId].func = Task_ReestablishLinkInCableClubRoom_2;
+ }
+ }
+}
+
+static void Task_ReestablishLinkInCableClubRoom_Master(u8 taskId)
+{
+ if (GetSavedPlayerCount() == GetLinkPlayerCount_2())
+ {
+ CheckShouldAdvanceLinkState();
+ gTasks[taskId].func = Task_ReestablishLinkInCableClubRoom_2;
+ }
+}
+
+static void Task_ReestablishLinkInCableClubRoom_2(u8 taskId)
+{
+ if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE)
+ {
+ sub_800A9A4();
+ sub_8009FE8();
+ DestroyTask(taskId);
+ }
+}
+
+void CableClub_AskSaveTheGame(void)
+{
+ Field_AskSaveTheGame();
+}
+
+static void Task_StartWiredCableClubBattle(u8 taskId)
+{
+ struct Task * task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ case 0:
+ FadeScreen(FADE_TO_BLACK, 0);
+ gLinkType = LINKTYPE_BATTLE;
+ ClearLinkCallback_2();
+ task->data[0]++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ task->data[0]++;
+ break;
+ case 2:
+ task->data[1]++;
+ if (task->data[1] > 20)
+ task->data[0]++;
+ break;
+ case 3:
+ Link_TryStartSend5FFF();
+ task->data[0]++;
+ break;
+ case 4:
+ if (!gReceivedRemoteLinkPlayers)
+ task->data[0]++;
+ break;
+ case 5:
+ if (gLinkPlayers[0].trainerId & 1)
+ PlayMapChosenOrBattleBGM(MUS_BATTLE32);
+ else
+ PlayMapChosenOrBattleBGM(MUS_BATTLE20);
+ switch (gSpecialVar_0x8004)
+ {
+ case USING_SINGLE_BATTLE:
+ gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK;
+ break;
+ case USING_DOUBLE_BATTLE:
+ gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE;
+ break;
+ case USING_MULTI_BATTLE:
+ ReducePlayerPartyToThree();
+ gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI;
+ break;
+ }
+ CleanupOverworldWindowsAndTilemaps();
+ gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT;
+ SetMainCallback2(CB2_InitBattle);
+ gMain.savedCallback = CB2_ReturnFromCableClubBattle;
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static void Task_StartWirelessCableClubBattle(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ int i;
+ switch (data[0])
+ {
+ case 0:
+ FadeScreen(FADE_TO_BLACK, 0);
+ gLinkType = LINKTYPE_BATTLE;
+ ClearLinkCallback_2();
+ data[0] = 1;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ data[0] = 2;
+ break;
+ case 2:
+ SendBlock(0, &gLocalLinkPlayer, sizeof(struct LinkPlayer));
+ data[0] = 3;
+ break;
+ case 3:
+ if (GetBlockReceivedStatus() == sub_800A8D4())
+ {
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ gLinkPlayers[i] = *(struct LinkPlayer *)gBlockRecvBuffer[i];
+ IntlConvertLinkPlayerName(&gLinkPlayers[i]);
+ ResetBlockReceivedFlag(i);
+ }
+ data[0] = 4;
+ }
+ break;
+ case 4:
+ data[1]++;
+ if (data[1] > 20)
+ data[0] = 5;
+ break;
+ case 5:
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
+ data[0] = 6;
+ break;
+ case 6:
+ if (IsLinkTaskFinished())
+ data[0] = 7;
+ break;
+ case 7:
+ if (gLinkPlayers[0].trainerId & 1)
+ PlayMapChosenOrBattleBGM(MUS_BATTLE32);
+ else
+ PlayMapChosenOrBattleBGM(MUS_BATTLE20);
+ gLinkPlayers[0].linkType = LINKTYPE_BATTLE;
+ switch (gSpecialVar_0x8004)
+ {
+ case USING_SINGLE_BATTLE:
+ gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK;
+ break;
+ case USING_DOUBLE_BATTLE:
+ gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE;
+ break;
+ case USING_MULTI_BATTLE:
+ ReducePlayerPartyToThree();
+ gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI;
+ break;
+ }
+ CleanupOverworldWindowsAndTilemaps();
+ gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT;
+ SetMainCallback2(CB2_InitBattle);
+ gMain.savedCallback = CB2_ReturnFromCableClubBattle;
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static void sub_8081624(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ Link_TryStartSend5FFF();
+ gMain.state++;
+ break;
+ case 1:
+ if (IsLinkTaskFinished())
+ SetMainCallback2(CB2_ReturnToField);
+ break;
+ }
+}
+
+void CB2_ReturnFromCableClubBattle(void)
+{
+ gBattleTypeFlags &= (u16)~BATTLE_TYPE_20;
+ sub_8055DB8();
+ LoadPlayerParty();
+ SavePlayerBag();
+ Special_UpdateTrainerFansAfterLinkBattle();
+ if (gSpecialVar_0x8004 != USING_MULTI_BATTLE)
+ {
+ TryRecordLinkBattleOutcome(gLocalLinkPlayerId ^ 1);
+ if (gWirelessCommType != 0)
+ {
+ switch (gBattleOutcome)
+ {
+ case B_OUTCOME_WON:
+ MEvent_RecordIdOfWonderCardSenderByEventType(0, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
+ break;
+ case B_OUTCOME_LOST:
+ MEvent_RecordIdOfWonderCardSenderByEventType(1, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
+ break;
+ }
+ }
+ }
+ if (InUnionRoom() == TRUE)
+ {
+ gMain.savedCallback = sub_8081624;
+ }
+ else
+ {
+ gMain.savedCallback = c2_8056854;
+ }
+ SetMainCallback2(CB2_SetUpSaveAfterLinkBattle);
+}
+
+void CleanupLinkRoomState(void)
+{
+ if (gSpecialVar_0x8004 == USING_SINGLE_BATTLE || gSpecialVar_0x8004 == USING_DOUBLE_BATTLE || gSpecialVar_0x8004 == USING_MULTI_BATTLE)
+ {
+ LoadPlayerParty();
+ SavePlayerBag();
+ }
+ copy_saved_warp2_bank_and_enter_x_to_warp1(127);
+}
+
+void ExitLinkRoom(void)
+{
+ sub_8057F5C();
+}
+
+static void Task_EnterCableClubSeat(u8 taskId)
+{
+ struct Task * task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ case 0:
+ ShowFieldMessage(CableClub_Text_PleaseWaitBCancel);
+ task->data[0] = 1;
+ break;
+ case 1:
+ if (IsFieldMessageBoxHidden())
+ {
+ sub_8057F34();
+ SetLocalLinkPlayerId(gSpecialVar_0x8005);
+ task->data[0] = 2;
+ }
+ break;
+ case 2:
+ switch (sub_8057EC0())
+ {
+ case 0:
+ break;
+ case 1:
+ HideFieldMessageBox();
+ task->data[0] = 0;
+ sub_8057F70();
+ SwitchTaskToFollowupFunc(taskId);
+ break;
+ case 2:
+ task->data[0] = 3;
+ break;
+ }
+ break;
+ case 3:
+ sub_8057F48();
+ sub_80F771C(TRUE);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ break;
+ }
+}
+
+static void CreateEnterCableClubSeatTaskWithFollowupFunc(TaskFunc followUpFunc)
+{
+ u8 taskId = CreateTask(Task_EnterCableClubSeat, 80);
+ SetTaskFuncWithFollowupFunc(taskId, Task_EnterCableClubSeat, followUpFunc);
+ ScriptContext1_Stop();
+}
+
+static void Task_StartWiredCableClubTrade(u8 taskId)
+{
+ struct Task * task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ case 0:
+ ScriptContext2_Enable();
+ FadeScreen(FADE_TO_BLACK, 0);
+ ClearLinkCallback_2();
+ task->data[0]++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ task->data[0]++;
+ break;
+ case 2:
+ gSelectedTradeMonPositions[0] = 0;
+ gSelectedTradeMonPositions[1] = 0;
+ m4aMPlayAllStop();
+ Link_TryStartSend5FFF();
+ task->data[0]++;
+ break;
+ case 3:
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ SetMainCallback2(CB2_ReturnFromLinkTrade);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void Task_StartWirelessCableClubTrade(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ switch (data[0])
+ {
+ case 0:
+ ScriptContext2_Enable();
+ FadeScreen(FADE_TO_BLACK, 0);
+ Rfu_set_zero();
+ data[0]++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ data[0]++;
+ break;
+ case 2:
+ gSelectedTradeMonPositions[0] = 0;
+ gSelectedTradeMonPositions[1] = 0;
+ m4aMPlayAllStop();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
+ data[0]++;
+ break;
+ case 3:
+ if (IsLinkTaskFinished())
+ {
+ UnionRoom_CreateTask_CallCB2ReturnFromLinkTrade();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void EnterTradeSeat(void)
+{
+ if (gWirelessCommType)
+ CreateEnterCableClubSeatTaskWithFollowupFunc(Task_StartWirelessCableClubTrade);
+ else
+ CreateEnterCableClubSeatTaskWithFollowupFunc(Task_StartWiredCableClubTrade);
+}
+
+static void CreateTask_StartWiredCableClubTrade(void)
+{
+ CreateTask(Task_StartWiredCableClubTrade, 80);
+}
+
+void StartWiredCableClubTrade(void)
+{
+ CreateTask_StartWiredCableClubTrade();
+ ScriptContext1_Stop();
+}
+
+void EnterColosseumPlayerSpot(void)
+{
+ gLinkType = LINKTYPE_BATTLE;
+ if (gWirelessCommType)
+ CreateEnterCableClubSeatTaskWithFollowupFunc(Task_StartWirelessCableClubBattle);
+ else
+ CreateEnterCableClubSeatTaskWithFollowupFunc(Task_StartWiredCableClubBattle);
+}
+
+static void Debug_CreateTaskEnterCableClubSeat(void)
+{
+ CreateTask(Task_EnterCableClubSeat, 80);
+ ScriptContext1_Stop();
+}
+
+void Script_ShowLinkTrainerCard(void)
+{
+ ShowTrainerCardInLink(gSpecialVar_0x8006, CB2_ReturnToFieldContinueScriptPlayMapMusic);
+}
+
+bool32 GetSeeingLinkPlayerCardMsg(u8 who)
+{
+ u8 stars;
+ gSpecialVar_0x8006 = who;
+ StringCopy(gStringVar1, gLinkPlayers[who].name);
+ stars = GetTrainerCardStars(who);
+ if (stars == 0)
+ return FALSE;
+ StringCopy(gStringVar2, sStarsMessagePtrs[stars - 1]);
+ return TRUE;
+}
+
+void sub_8081A90(u8 taskId)
+{
+ struct Task * task = &gTasks[taskId];
+ task->data[0]++;
+ if (task->data[0] > 300)
+ {
+ CloseLink();
+ SetMainCallback2(CB2_LinkError);
+ DestroyTask(taskId);
+ }
+ if (gReceivedRemoteLinkPlayers)
+ DestroyTask(taskId);
+}
+
+static void sub_8081AE4(u8 taskId)
+{
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_8081B08(u8 taskId)
+{
+ Link_TryStartSend5FFF();
+ gTasks[taskId].func = sub_8081AE4;
+}
diff --git a/src/cereader_tool.c b/src/cereader_tool.c
index 2c5d05018..c6e0c9a99 100644
--- a/src/cereader_tool.c
+++ b/src/cereader_tool.c
@@ -6,40 +6,40 @@
u8 sub_815D654(void)
{
- return (gSaveBlock1Ptr->unkArray[0].unk9 + 1) % 256;
+ return (gSaveBlock1Ptr->trainerTower[0].unk9 + 1) % 256;
}
static bool32 ValidateTrainerTowerTrainer(struct TrainerTowerFloor * floor)
{
- if (floor->floorIdx < 1 || floor->floorIdx > 8)
+ if (floor->floorIdx < 1 || floor->floorIdx > MAX_TRAINER_TOWER_FLOORS)
return FALSE;
- if (floor->challengeType > 2)
+ if (floor->challengeType > CHALLENGE_TYPE_KNOCKOUT)
return FALSE;
if (CalcByteArraySum((const u8 *)floor, offsetof(typeof(*floor), checksum)) != floor->checksum)
return FALSE;
return TRUE;
}
-bool32 ValidateTrainerTowerData(struct EReaderTrainerHillSet * ttdata)
+bool32 ValidateTrainerTowerData(struct EReaderTrainerTowerSet * ttdata)
{
- u32 count = ttdata->count;
+ u32 numFloors = ttdata->numFloors;
s32 i;
- if (count < 1 || count > 8)
+ if (numFloors < 1 || numFloors > MAX_TRAINER_TOWER_FLOORS)
return FALSE;
- for (i = 0; i < count; i++)
+ for (i = 0; i < numFloors; i++)
{
if (!ValidateTrainerTowerTrainer(&ttdata->floors[i]))
return FALSE;
}
- if (CalcByteArraySum((const u8 *)ttdata->floors, count * sizeof(ttdata->floors[0])) != ttdata->checksum)
+ if (CalcByteArraySum((const u8 *)ttdata->floors, numFloors * sizeof(ttdata->floors[0])) != ttdata->checksum)
return FALSE;
return TRUE;
}
-#define SEC30_SIZE (offsetof(struct EReaderTrainerHillSet, floors[4]))
-#define SEC31_SIZE (sizeof(struct EReaderTrainerHillSet) - SEC30_SIZE)
+#define SEC30_SIZE (offsetof(struct EReaderTrainerTowerSet, floors[4]))
+#define SEC31_SIZE (sizeof(struct EReaderTrainerTowerSet) - SEC30_SIZE)
-static bool32 CEReaderTool_SaveTrainerTower_r(struct EReaderTrainerHillSet * ttdata, u8 * buffer)
+static bool32 CEReaderTool_SaveTrainerTower_r(struct EReaderTrainerTowerSet * ttdata, u8 * buffer)
{
AGB_ASSERT_EX(ttdata->dummy == 0, ABSPATH("cereader_tool.c"), 198);
AGB_ASSERT_EX(ttdata->id == 0, ABSPATH("cereader_tool.c"), 199)
@@ -56,7 +56,7 @@ static bool32 CEReaderTool_SaveTrainerTower_r(struct EReaderTrainerHillSet * ttd
return TRUE;
}
-bool32 CEReaderTool_SaveTrainerTower(struct EReaderTrainerHillSet * ttdata)
+bool32 CEReaderTool_SaveTrainerTower(struct EReaderTrainerTowerSet * ttdata)
{
u8 * buffer = AllocZeroed(0x1000);
bool32 result = CEReaderTool_SaveTrainerTower_r(ttdata, buffer);
@@ -64,7 +64,7 @@ bool32 CEReaderTool_SaveTrainerTower(struct EReaderTrainerHillSet * ttdata)
return result;
}
-static bool32 CEReaderTool_LoadTrainerTower_r(struct EReaderTrainerHillSet * ttdata, void * buffer)
+static bool32 CEReaderTool_LoadTrainerTower_r(struct EReaderTrainerTowerSet * ttdata, void * buffer)
{
if (TryCopySpecialSaveSection(SECTOR_TTOWER(0), buffer) != 1)
return FALSE;
@@ -79,10 +79,16 @@ static bool32 CEReaderTool_LoadTrainerTower_r(struct EReaderTrainerHillSet * ttd
return TRUE;
}
-bool32 CEReaderTool_LoadTrainerTower(struct EReaderTrainerHillSet * ttdata)
+bool32 CEReaderTool_LoadTrainerTower(struct EReaderTrainerTowerSet * ttdata)
{
void * buffer = AllocZeroed(0x1000);
bool32 success = CEReaderTool_LoadTrainerTower_r(ttdata, buffer);
Free(buffer);
return success;
}
+
+bool32 ReadTrainerTowerAndValidate(void)
+{
+ // Stubbed out. Populated in Emerald
+ return FALSE;
+}
diff --git a/src/clear_save_data_screen.c b/src/clear_save_data_screen.c
new file mode 100644
index 000000000..b6f8b83e9
--- /dev/null
+++ b/src/clear_save_data_screen.c
@@ -0,0 +1,224 @@
+#include "global.h"
+#include "gflib.h"
+#include "menu.h"
+#include "save.h"
+#include "strings.h"
+#include "task.h"
+#include "text_window.h"
+#include "constants/songs.h"
+
+struct ClearSaveDataStruct {
+ u8 unk0;
+ u8 unk1;
+ u8 unk2;
+};
+
+static EWRAM_DATA struct ClearSaveDataStruct * sClearSaveDataState = NULL;
+
+static void Task_DrawClearSaveDataScreen(u8 taskId);
+static void Task_HandleYesNoMenu(u8 taskId);
+static void Task_CleanUpAndSoftReset(u8 taskId);
+static void CB2_Sub_SaveClearScreen_Init(void);
+static void SaveClearScreen_GpuInit(void);
+
+static const struct BgTemplate sBgTemplates[] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0x000
+ }
+};
+
+static const struct WindowTemplate sWindowTemplates[] = {
+ {
+ .bg = 0,
+ .tilemapLeft = 3,
+ .tilemapTop = 5,
+ .width = 6,
+ .height = 4,
+ .paletteNum = 0xF,
+ .baseBlock = 0x00A
+ }, {
+ .bg = 0,
+ .tilemapLeft = 3,
+ .tilemapTop = 15,
+ .width = 23,
+ .height = 4,
+ .paletteNum = 0xF,
+ .baseBlock = 0x022
+ }, DUMMY_WIN_TEMPLATE
+};
+
+static const u8 sTextColor[] = {
+ TEXT_COLOR_WHITE,
+ TEXT_COLOR_DARK_GREY,
+ TEXT_COLOR_LIGHT_GREY
+};
+
+static void CB2_RunClearSaveDataScreen(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void VBlankCB_WaitYesNo(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void CB2_SaveClearScreen_Init(void)
+{
+ sClearSaveDataState = AllocZeroed(sizeof(struct ClearSaveDataStruct));
+ sClearSaveDataState->unk1 = 0;
+ sClearSaveDataState->unk0 = 0;
+ sClearSaveDataState->unk2 = 0;
+ CB2_Sub_SaveClearScreen_Init();
+ CreateTask(Task_DrawClearSaveDataScreen, 0);
+ SetMainCallback2(CB2_RunClearSaveDataScreen);
+}
+
+static void Task_DrawClearSaveDataScreen(u8 taskId)
+{
+ switch (sClearSaveDataState->unk1)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ break;
+ case 1:
+ if (gPaletteFade.active)
+ return;
+ SetVBlankCallback(NULL);
+ break;
+ case 2:
+ SaveClearScreen_GpuInit();
+ break;
+ case 3:
+ TextWindow_SetStdFrame0_WithPal(0, 0x001, 0xF0);
+ TextWindow_SetStdFrame0_WithPal(1, 0x001, 0xF0);
+ break;
+ case 4:
+ DrawStdFrameWithCustomTileAndPalette(1, TRUE, 0x001, 0xF);
+ AddTextPrinterParameterized4(1, 2, 0, 3, 1, 1, sTextColor, 0, gUnknown_841B69E);
+ CopyWindowToVram(1, 2);
+ break;
+ case 5:
+ CreateYesNoMenu(&sWindowTemplates[0], 2, 0, 2, 0x001, 0xF, 1);
+ CopyBgTilemapBufferToVram(0);
+ break;
+ default:
+ BeginNormalPaletteFade(0xFFFF, 0, 16, 0, RGB_WHITEALPHA);
+ SetVBlankCallback(VBlankCB_WaitYesNo);
+ gTasks[taskId].func = Task_HandleYesNoMenu;
+ break;
+ }
+ sClearSaveDataState->unk1++;
+}
+
+static void Task_HandleYesNoMenu(u8 taskId)
+{
+ // agbcc refuses to keep &sClearSaveDataState in a register
+ // unless explicitly told to do so as such:
+ struct ClearSaveDataStruct ** r5 = &sClearSaveDataState;
+ if ((*r5)->unk0 == 0)
+ {
+ switch (Menu_ProcessInputNoWrapClearOnChoose())
+ {
+ case MENU_B_PRESSED:
+ case 1:
+ PlaySE(SE_SELECT);
+ break;
+ case 0:
+ PlaySE(SE_SELECT);
+ FillWindowPixelBuffer(1, PIXEL_FILL(1));
+ AddTextPrinterParameterized4(1, 2, 0, 3, 1, 1, sTextColor, 0, gUnknown_841B6B9);
+ CopyWindowToVram(1, 3);
+ ClearSaveData();
+ break;
+ case MENU_NOTHING_CHOSEN:
+ default:
+ return;
+ }
+ (*r5)->unk0++;
+ }
+ else
+ {
+ Task_CleanUpAndSoftReset(taskId);
+ }
+}
+
+static void Task_CleanUpAndSoftReset(u8 taskId)
+{
+ switch (sClearSaveDataState->unk2)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFF, 0, 0, 16, RGB_WHITEALPHA);
+ sClearSaveDataState->unk2++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ DestroyYesNoMenu();
+ DestroyTask(taskId);
+ FreeAllWindowBuffers();
+ FREE_AND_SET_NULL(sClearSaveDataState);
+ DoSoftReset();
+ // noreturn
+ }
+ break;
+ }
+}
+
+static void CB2_Sub_SaveClearScreen_Init(void)
+{
+ ResetSpriteData();
+ ResetPaletteFade();
+ ResetTasks();
+}
+
+static void SaveClearScreen_GpuInit(void)
+{
+ DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000);
+
+#ifndef NONMATCHING
+ asm("":::"ip");
+#endif
+
+ do
+ {
+ void * dest = (void *)OAM;
+ size_t size = OAM_SIZE;
+ DmaClear32(3, dest, size);
+ } while (0);
+
+ do
+ {
+ void * dest = (void *)PLTT;
+ size_t size = PLTT_SIZE;
+ DmaClear16(3, dest, size);
+ } while (0);
+
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ ResetBgsAndClearDma3BusyFlags(FALSE);
+ InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ InitWindows(sWindowTemplates);
+ DeactivateAllTextPrinters();
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ ShowBg(0);
+}
diff --git a/src/coins.c b/src/coins.c
index 0f1828a96..fd5000fbd 100644
--- a/src/coins.c
+++ b/src/coins.c
@@ -4,11 +4,10 @@
#include "menu.h"
#include "text_window.h"
#include "strings.h"
+#include "constants/coins.h"
EWRAM_DATA static u8 sCoinsWindowId = 0;
-#define MAX_COINS 9999
-
u16 GetCoins(void)
{
return gSaveBlock1Ptr->coins ^ gSaveBlock2Ptr->encryptionKey;
diff --git a/src/credits.c b/src/credits.c
index ceb2028f9..e0d57a2a4 100644
--- a/src/credits.c
+++ b/src/credits.c
@@ -11,12 +11,11 @@
#include "decompress.h"
#include "graphics.h"
#include "strings.h"
-#include "menu.h"
-#include "field_weather.h"
#include "trainer_pokemon_sprites.h"
#include "sound.h"
#include "constants/species.h"
#include "constants/maps.h"
+#include "constants/field_weather.h"
#if defined(FIRERED)
#define TITLE_TEXT gString_PokemonFireRed_Staff
@@ -716,7 +715,7 @@ static const struct CreditsTextHeader sCreditsTexts[] = {
{ gString_Dummy, gString_Dummy, FALSE }
};
-void Special_Credits(void)
+void DoCredits(void)
{
sCreditsMgr = AllocZeroed(sizeof(*sCreditsMgr));
ResetTasks();
@@ -920,7 +919,7 @@ static s32 RollCredits(void)
case CREDITSSCRCMD_MON:
sCreditsMgr->mainseqno = CREDITSSCENE_MON_DESTROY_ASSETS;
sCreditsMgr->whichMon = sCreditsScript[sCreditsMgr->scrcmdidx].param;
- FadeScreen(1, 0);
+ FadeScreen(FADE_TO_BLACK, 0);
break;
case CREDITSSCRCMD_THEENDGFX:
sCreditsMgr->mainseqno = CREDITSSCENE_THEEND_DESTROY_ASSETS;
diff --git a/src/data/dodrio_berry_picking.h b/src/data/dodrio_berry_picking.h
new file mode 100644
index 000000000..e71ce13cf
--- /dev/null
+++ b/src/data/dodrio_berry_picking.h
@@ -0,0 +1,247 @@
+#ifndef GUARD_DATA_DODRIO_BERRY_PICKING_H
+#define GUARD_DATA_DODRIO_BERRY_PICKING_H
+
+static const struct BgTemplate sUnknown_847565C[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 12,
+ .screenSize = 1,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 14,
+ .screenSize = 1,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+};
+
+// Unknown unreferenced data, feel free to remove.
+static const u32 sUnused[] = {255, 0};
+
+static const struct WindowTemplate sUnknown_8475674[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 1,
+ .width = 28,
+ .height = 3,
+ .paletteNum = 13,
+ .baseBlock = 0x13,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 6,
+ .width = 28,
+ .height = 13,
+ .paletteNum = 13,
+ .baseBlock = 0x67,
+ }
+};
+
+static const struct WindowTemplate sUnknown_8475684 =
+{
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 6,
+ .width = 28,
+ .height = 7,
+ .paletteNum = 13,
+ .baseBlock = 0x67,
+};
+
+static const struct WindowTemplate sUnknown_847568C[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 8,
+ .width = 19,
+ .height = 3,
+ .paletteNum = 13,
+ .baseBlock = 0x13,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 22,
+ .tilemapTop = 7,
+ .width = 6,
+ .height = 4,
+ .paletteNum = 13,
+ .baseBlock = 0x4C,
+ }
+};
+
+static const struct WindowTemplate sUnknown_847569C =
+{
+ .bg = 0,
+ .tilemapLeft = 4,
+ .tilemapTop = 6,
+ .width = 22,
+ .height = 5,
+ .paletteNum = 13,
+ .baseBlock = 0x13,
+};
+
+static const struct WindowTemplate sUnknown_84756A4 =
+{
+ .bg = 0,
+ .tilemapLeft = 5,
+ .tilemapTop = 8,
+ .width = 19,
+ .height = 3,
+ .paletteNum = 13,
+ .baseBlock = 0x13,
+};
+
+static const u8 sUnknown_8471F50[5][5][11] =
+{
+ {
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
+ },
+ {
+ {0, 1, 2, 3, 4, 5, 6, 3, 8, 9, 0},
+ {0, 1, 2, 5, 6, 3, 4, 5, 8, 9, 0},
+ },
+ {
+ {0, 1, 2, 3, 4, 5, 6, 7, 2, 9, 0},
+ {0, 1, 4, 5, 6, 7, 2, 3, 4, 9, 0},
+ {0, 1, 6, 7, 2, 3, 4, 5, 6, 9, 0},
+ },
+ {
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 0},
+ {0, 3, 4, 5, 6, 7, 8, 1, 2, 3, 0},
+ {0, 5, 6, 7, 8, 1, 2, 3, 4, 5, 0},
+ {0, 7, 8, 1, 2, 3, 4, 5, 6, 7, 0},
+ },
+ {
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
+ {2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2},
+ {4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4},
+ {6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6},
+ {8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8},
+ },
+};
+
+static const u8 sUnknown_8472063[5][5][3] =
+{
+ {
+ {4, 5, 6},
+ },
+ {
+ {3, 4, 5},
+ {5, 6, 3},
+ },
+ {
+ {4, 5, 6},
+ {6, 7, 2},
+ {2, 3, 4},
+ },
+ {
+ {3, 4, 5},
+ {5, 6, 7},
+ {7, 8, 1},
+ {1, 2, 3},
+ },
+ {
+ {4, 5, 6},
+ {6, 7, 8},
+ {8, 9, 0},
+ {0, 1, 2},
+ {2, 3, 4},
+ },
+};
+
+static const u8 sUnknown_84720AE[5][5][3] =
+{
+ {
+ {1, 0, 1},
+ },
+ {
+ {1, 0, 1},
+ {0, 1, 0},
+ },
+ {
+ {2, 0, 1},
+ {0, 1, 2},
+ {1, 2, 0},
+ },
+ {
+ {3, 0, 1},
+ {0, 1, 2},
+ {1, 2, 3},
+ {2, 3, 0},
+ },
+ {
+ {4, 0, 1},
+ {0, 1, 2},
+ {1, 2, 3},
+ {2, 3, 4},
+ {3, 4, 0},
+ },
+};
+
+ALIGNED(4)
+static const u8 sUnknown_84720FC[5][11] =
+{
+ {9, 9, 9, 9, 1, 1, 1, 9, 9, 9, 9},
+ {9, 9, 9, 0, 0, 1, 1, 0, 9, 9, 9},
+ {9, 9, 2, 2, 0, 0, 1, 1, 1, 9, 9},
+ {9, 3, 3, 0, 0, 1, 1, 2, 2, 3, 9},
+ {3, 3, 4, 4, 0, 0, 1, 1, 2, 2, 3},
+};
+
+static const u8 sUnknown_8472133[5][5] =
+{
+ {5},
+ {4, 6},
+ {3, 5, 7},
+ {2, 4, 6, 8},
+ {1, 3, 5, 6, 9},
+};
+
+static const u16 sDodrioBerryBgPal1[] = INCBIN_U16("graphics/link_games/dodrioberry_bg1.gbapal",
+ "graphics/link_games/dodrioberry_bg2.gbapal");
+static const u16 sDodrioBerryPkmnPal[] = INCBIN_U16("graphics/link_games/dodrioberry_pkmn.gbapal");
+static const u16 sDodrioBerryShinyPal[] = INCBIN_U16("graphics/link_games/dodrioberry_shiny.gbapal");
+static const u16 sDodrioBerryStatusPal[] = INCBIN_U16("graphics/link_games/dodrioberry_status.gbapal");
+static const u16 sDodrioBerrySpritesPal[] = INCBIN_U16("graphics/link_games/dodrioberry_berrysprites.gbapal");
+static const u32 sDodrioBerrySpritesGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_berrysprites.4bpp.lz");
+static const u16 sDodrioBerryPlatformPal[] = INCBIN_U16("graphics/link_games/dodrioberry_platform.gbapal");
+static const u32 sDodrioBerryBgGfx1[] = INCBIN_U32("graphics/link_games/dodrioberry_bg1.4bpp.lz");
+static const u32 sDodrioBerryBgGfx2[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2.4bpp.lz");
+static const u32 sDodrioBerryStatusGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_status.4bpp.lz");
+static const u32 sDodrioBerryPlatformGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_platform.4bpp.lz");
+static const u32 sDodrioBerryPkmnGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_pkmn.4bpp.lz");
+static const u32 sDodrioBerryBgTilemap1[] = INCBIN_U32("graphics/link_games/dodrioberry_bg1.bin.lz");
+static const u32 sDodrioBerryBgTilemap2Right[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2right.bin.lz");
+static const u32 sDodrioBerryBgTilemap2Left[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2left.bin.lz");
+
+#endif //GUARD_DATA_DODRIO_BERRY_PICKING_H
diff --git a/src/data/graphics/battle_terrain.h b/src/data/graphics/battle_terrain.h
new file mode 100644
index 000000000..f91c2d0d9
--- /dev/null
+++ b/src/data/graphics/battle_terrain.h
@@ -0,0 +1,30 @@
+
+const u32 gFile_graphics_battle_terrain_plain_palette_palette[] = INCBIN_U32("graphics/battle_terrain/plain/palette.gbapal.lz");
+
+const u32 gFile_graphics_battle_terrain_building_tiles_sheet[] = INCBIN_U32("graphics/battle_terrain/building/tiles.4bpp.lz");
+
+const u32 gFile_graphics_battle_terrain_stadium_battle_frontier_palette[] = INCBIN_U32("graphics/battle_terrain/stadium/battle_frontier.gbapal.lz");
+
+const u32 gFile_graphics_battle_terrain_building_map_tilemap[] = INCBIN_U32("graphics/battle_terrain/building/map.bin.lz");
+
+const u32 gFile_graphics_battle_terrain_stadium_tiles_sheet[] = INCBIN_U32("graphics/battle_terrain/stadium/tiles.4bpp.lz");
+const u32 gFile_graphics_battle_terrain_stadium_map_tilemap[] = INCBIN_U32("graphics/battle_terrain/stadium/map.bin.lz");
+
+const u32 gFile_graphics_battle_terrain_building_palette_palette[] = INCBIN_U32("graphics/battle_terrain/building/palette.gbapal.lz");
+
+const u32 gFile_graphics_battle_terrain_water_kyogre_palette[] = INCBIN_U32("graphics/battle_terrain/water/kyogre.gbapal.lz");
+const u32 gFile_graphics_battle_terrain_cave_groudon_palette[] = INCBIN_U32("graphics/battle_terrain/cave/groudon.gbapal.lz");
+
+const u32 gFile_graphics_battle_terrain_building_palette2_palette[] = INCBIN_U32("graphics/battle_terrain/building/palette2.gbapal.lz");
+const u32 gFile_graphics_battle_terrain_building_palette3_palette[] = INCBIN_U32("graphics/battle_terrain/building/palette3.gbapal.lz");
+
+const u32 gFile_graphics_battle_terrain_stadium_palette1_palette[] = INCBIN_U32("graphics/battle_terrain/stadium/palette1.gbapal.lz");
+const u32 gFile_graphics_battle_terrain_stadium_palette2_palette[] = INCBIN_U32("graphics/battle_terrain/stadium/palette2.gbapal.lz");
+const u32 gFile_graphics_battle_terrain_stadium_palette3_palette[] = INCBIN_U32("graphics/battle_terrain/stadium/palette3.gbapal.lz");
+const u32 gFile_graphics_battle_terrain_stadium_palette4_palette[] = INCBIN_U32("graphics/battle_terrain/stadium/palette4.gbapal.lz");
+const u32 gFile_graphics_battle_terrain_stadium_palette5_palette[] = INCBIN_U32("graphics/battle_terrain/stadium/palette5.gbapal.lz");
+const u32 gFile_graphics_battle_terrain_stadium_palette6_palette[] = INCBIN_U32("graphics/battle_terrain/stadium/palette6.gbapal.lz");
+const u32 gFile_graphics_battle_terrain_stadium_palette7_palette[] = INCBIN_U32("graphics/battle_terrain/stadium/palette7.gbapal.lz");
+
+const u32 gFile_graphics_battle_terrain_building_anim_tiles_sheet[] = INCBIN_U32("graphics/battle_terrain/building/anim_tiles.4bpp.lz");
+const u32 gFile_graphics_battle_terrain_building_anim_map_tilemap[] = INCBIN_U32("graphics/battle_terrain/building/anim_map.bin.lz");
diff --git a/src/data/graphics/interface_pokeballs.h b/src/data/graphics/interface_pokeballs.h
new file mode 100644
index 000000000..fe9a4e5be
--- /dev/null
+++ b/src/data/graphics/interface_pokeballs.h
@@ -0,0 +1,37 @@
+const u32 gInterfaceGfx_PokeBall[] = INCBIN_U32("graphics/interface/ball/poke.4bpp.lz");
+const u32 gInterfacePal_PokeBall[] = INCBIN_U32("graphics/interface/ball/poke.gbapal.lz");
+
+const u32 gInterfaceGfx_GreatBall[] = INCBIN_U32("graphics/interface/ball/great.4bpp.lz");
+const u32 gInterfacePal_GreatBall[] = INCBIN_U32("graphics/interface/ball/great.gbapal.lz");
+
+const u32 gInterfaceGfx_SafariBall[] = INCBIN_U32("graphics/interface/ball/safari.4bpp.lz");
+const u32 gInterfacePal_SafariBall[] = INCBIN_U32("graphics/interface/ball/safari.gbapal.lz");
+
+const u32 gInterfaceGfx_UltraBall[] = INCBIN_U32("graphics/interface/ball/ultra.4bpp.lz");
+const u32 gInterfacePal_UltraBall[] = INCBIN_U32("graphics/interface/ball/ultra.gbapal.lz");
+
+const u32 gInterfaceGfx_MasterBall[] = INCBIN_U32("graphics/interface/ball/master.4bpp.lz");
+const u32 gInterfacePal_MasterBall[] = INCBIN_U32("graphics/interface/ball/master.gbapal.lz");
+
+const u32 gInterfaceGfx_NetBall[] = INCBIN_U32("graphics/interface/ball/net.4bpp.lz");
+const u32 gInterfacePal_NetBall[] = INCBIN_U32("graphics/interface/ball/net.gbapal.lz");
+
+const u32 gInterfaceGfx_DiveBall[] = INCBIN_U32("graphics/interface/ball/dive.4bpp.lz");
+const u32 gInterfacePal_DiveBall[] = INCBIN_U32("graphics/interface/ball/dive.gbapal.lz");
+
+const u32 gInterfaceGfx_NestBall[] = INCBIN_U32("graphics/interface/ball/nest.4bpp.lz");
+const u32 gInterfacePal_NestBall[] = INCBIN_U32("graphics/interface/ball/nest.gbapal.lz");
+
+const u32 gInterfaceGfx_RepeatBall[] = INCBIN_U32("graphics/interface/ball/repeat.4bpp.lz");
+const u32 gInterfacePal_RepeatBall[] = INCBIN_U32("graphics/interface/ball/repeat.gbapal.lz");
+
+const u32 gInterfaceGfx_TimerBall[] = INCBIN_U32("graphics/interface/ball/timer.4bpp.lz");
+const u32 gInterfacePal_TimerBall[] = INCBIN_U32("graphics/interface/ball/timer.gbapal.lz");
+
+const u32 gInterfaceGfx_LuxuryBall[] = INCBIN_U32("graphics/interface/ball/luxury.4bpp.lz");
+const u32 gInterfacePal_LuxuryBall[] = INCBIN_U32("graphics/interface/ball/luxury.gbapal.lz");
+
+const u32 gInterfaceGfx_PremierBall[] = INCBIN_U32("graphics/interface/ball/premier.4bpp.lz");
+const u32 gInterfacePal_PremierBall[] = INCBIN_U32("graphics/interface/ball/premier.gbapal.lz");
+
+const u32 gOpenPokeballGfx[] = INCBIN_U32("graphics/interface/ball_open.4bpp.lz");
diff --git a/src/data/graphics/items.h b/src/data/graphics/items.h
new file mode 100644
index 000000000..ee86b454c
--- /dev/null
+++ b/src/data/graphics/items.h
@@ -0,0 +1,672 @@
+const u32 gFile_graphics_items_icons_question_mark_sheet[] = INCBIN_U32("graphics/items/icons/question_mark.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_question_mark_palette[] = INCBIN_U32("graphics/items/icon_palettes/question_mark.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_return_to_field_arrow_sheet[] = INCBIN_U32("graphics/items/icons/return_to_field_arrow.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_return_to_field_arrow_palette[] = INCBIN_U32("graphics/items/icon_palettes/return_to_field_arrow.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_master_ball_sheet[] = INCBIN_U32("graphics/items/icons/master_ball.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_master_ball_palette[] = INCBIN_U32("graphics/items/icon_palettes/master_ball.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_ultra_ball_sheet[] = INCBIN_U32("graphics/items/icons/ultra_ball.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_ultra_ball_palette[] = INCBIN_U32("graphics/items/icon_palettes/ultra_ball.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_great_ball_sheet[] = INCBIN_U32("graphics/items/icons/great_ball.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_great_ball_palette[] = INCBIN_U32("graphics/items/icon_palettes/great_ball.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_poke_ball_sheet[] = INCBIN_U32("graphics/items/icons/poke_ball.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_poke_ball_palette[] = INCBIN_U32("graphics/items/icon_palettes/poke_ball.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_safari_ball_sheet[] = INCBIN_U32("graphics/items/icons/safari_ball.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_safari_ball_palette[] = INCBIN_U32("graphics/items/icon_palettes/safari_ball.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_net_ball_sheet[] = INCBIN_U32("graphics/items/icons/net_ball.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_net_ball_palette[] = INCBIN_U32("graphics/items/icon_palettes/net_ball.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_dive_ball_sheet[] = INCBIN_U32("graphics/items/icons/dive_ball.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_dive_ball_palette[] = INCBIN_U32("graphics/items/icon_palettes/dive_ball.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_nest_ball_sheet[] = INCBIN_U32("graphics/items/icons/nest_ball.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_nest_ball_palette[] = INCBIN_U32("graphics/items/icon_palettes/nest_ball.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_repeat_ball_sheet[] = INCBIN_U32("graphics/items/icons/repeat_ball.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_repeat_ball_palette[] = INCBIN_U32("graphics/items/icon_palettes/repeat_ball.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_timer_ball_sheet[] = INCBIN_U32("graphics/items/icons/timer_ball.4bpp.lz");
+
+const u32 gFile_graphics_items_icons_luxury_ball_sheet[] = INCBIN_U32("graphics/items/icons/luxury_ball.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_luxury_ball_palette[] = INCBIN_U32("graphics/items/icon_palettes/luxury_ball.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_premier_ball_sheet[] = INCBIN_U32("graphics/items/icons/premier_ball.4bpp.lz");
+
+const u32 gFile_graphics_items_icons_potion_sheet[] = INCBIN_U32("graphics/items/icons/potion.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_potion_palette[] = INCBIN_U32("graphics/items/icon_palettes/potion.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_antidote_sheet[] = INCBIN_U32("graphics/items/icons/antidote.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_antidote_palette[] = INCBIN_U32("graphics/items/icon_palettes/antidote.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_burn_heal_palette[] = INCBIN_U32("graphics/items/icon_palettes/burn_heal.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_ice_heal_palette[] = INCBIN_U32("graphics/items/icon_palettes/ice_heal.gbapal.lz");
+const u32 gFile_graphics_items_icons_status_heal_sheet[] = INCBIN_U32("graphics/items/icons/status_heal.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_awakening_palette[] = INCBIN_U32("graphics/items/icon_palettes/awakening.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_paralyze_heal_palette[] = INCBIN_U32("graphics/items/icon_palettes/paralyze_heal.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_large_potion_sheet[] = INCBIN_U32("graphics/items/icons/large_potion.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_full_restore_palette[] = INCBIN_U32("graphics/items/icon_palettes/full_restore.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_max_potion_palette[] = INCBIN_U32("graphics/items/icon_palettes/max_potion.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_hyper_potion_palette[] = INCBIN_U32("graphics/items/icon_palettes/hyper_potion.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_super_potion_palette[] = INCBIN_U32("graphics/items/icon_palettes/super_potion.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_full_heal_sheet[] = INCBIN_U32("graphics/items/icons/full_heal.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_full_heal_palette[] = INCBIN_U32("graphics/items/icon_palettes/full_heal.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_revive_sheet[] = INCBIN_U32("graphics/items/icons/revive.4bpp.lz");
+const u32 gFile_graphics_items_icons_max_revive_sheet[] = INCBIN_U32("graphics/items/icons/max_revive.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_revive_palette[] = INCBIN_U32("graphics/items/icon_palettes/revive.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_fresh_water_sheet[] = INCBIN_U32("graphics/items/icons/fresh_water.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_fresh_water_palette[] = INCBIN_U32("graphics/items/icon_palettes/fresh_water.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_soda_pop_sheet[] = INCBIN_U32("graphics/items/icons/soda_pop.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_soda_pop_palette[] = INCBIN_U32("graphics/items/icon_palettes/soda_pop.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_lemonade_sheet[] = INCBIN_U32("graphics/items/icons/lemonade.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_lemonade_palette[] = INCBIN_U32("graphics/items/icon_palettes/lemonade.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_moomoo_milk_sheet[] = INCBIN_U32("graphics/items/icons/moomoo_milk.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_moomoo_milk_palette[] = INCBIN_U32("graphics/items/icon_palettes/moomoo_milk.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_powder_sheet[] = INCBIN_U32("graphics/items/icons/powder.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_energy_powder_palette[] = INCBIN_U32("graphics/items/icon_palettes/energy_powder.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_energy_root_sheet[] = INCBIN_U32("graphics/items/icons/energy_root.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_energy_root_palette[] = INCBIN_U32("graphics/items/icon_palettes/energy_root.gbapal.lz");
+
+const u32 gFile_graphics_items_icon_palettes_heal_powder_palette[] = INCBIN_U32("graphics/items/icon_palettes/heal_powder.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_revival_herb_sheet[] = INCBIN_U32("graphics/items/icons/revival_herb.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_revival_herb_palette[] = INCBIN_U32("graphics/items/icon_palettes/revival_herb.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_ether_sheet[] = INCBIN_U32("graphics/items/icons/ether.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_ether_palette[] = INCBIN_U32("graphics/items/icon_palettes/ether.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_max_ether_palette[] = INCBIN_U32("graphics/items/icon_palettes/max_ether.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_elixir_palette[] = INCBIN_U32("graphics/items/icon_palettes/elixir.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_max_elixir_palette[] = INCBIN_U32("graphics/items/icon_palettes/max_elixir.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_lava_cookie_sheet[] = INCBIN_U32("graphics/items/icons/lava_cookie.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_lava_cookie_and_letter_palette[] = INCBIN_U32("graphics/items/icon_palettes/lava_cookie_and_letter.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_flute_sheet[] = INCBIN_U32("graphics/items/icons/flute.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_blue_flute_palette[] = INCBIN_U32("graphics/items/icon_palettes/blue_flute.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_yellow_flute_palette[] = INCBIN_U32("graphics/items/icon_palettes/yellow_flute.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_red_flute_palette[] = INCBIN_U32("graphics/items/icon_palettes/red_flute.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_black_flute_palette[] = INCBIN_U32("graphics/items/icon_palettes/black_flute.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_white_flute_palette[] = INCBIN_U32("graphics/items/icon_palettes/white_flute.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_berry_juice_sheet[] = INCBIN_U32("graphics/items/icons/berry_juice.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_berry_juice_palette[] = INCBIN_U32("graphics/items/icon_palettes/berry_juice.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_sacred_ash_sheet[] = INCBIN_U32("graphics/items/icons/sacred_ash.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_sacred_ash_palette[] = INCBIN_U32("graphics/items/icon_palettes/sacred_ash.gbapal.lz");
+
+const u32 gFile_graphics_items_icon_palettes_shoal_salt_palette[] = INCBIN_U32("graphics/items/icon_palettes/shoal_salt.gbapal.lz");
+const u32 gFile_graphics_items_icons_shoal_shell_sheet[] = INCBIN_U32("graphics/items/icons/shoal_shell.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_shell_palette[] = INCBIN_U32("graphics/items/icon_palettes/shell.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_shard_sheet[] = INCBIN_U32("graphics/items/icons/shard.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_red_shard_palette[] = INCBIN_U32("graphics/items/icon_palettes/red_shard.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_blue_shard_palette[] = INCBIN_U32("graphics/items/icon_palettes/blue_shard.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_yellow_shard_palette[] = INCBIN_U32("graphics/items/icon_palettes/yellow_shard.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_green_shard_palette[] = INCBIN_U32("graphics/items/icon_palettes/green_shard.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_hp_up_sheet[] = INCBIN_U32("graphics/items/icons/hp_up.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_hp_up_palette[] = INCBIN_U32("graphics/items/icon_palettes/hp_up.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_vitamin_sheet[] = INCBIN_U32("graphics/items/icons/vitamin.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_protein_palette[] = INCBIN_U32("graphics/items/icon_palettes/protein.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_iron_palette[] = INCBIN_U32("graphics/items/icon_palettes/iron.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_carbos_palette[] = INCBIN_U32("graphics/items/icon_palettes/carbos.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_calcium_palette[] = INCBIN_U32("graphics/items/icon_palettes/calcium.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_rare_candy_sheet[] = INCBIN_U32("graphics/items/icons/rare_candy.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_rare_candy_palette[] = INCBIN_U32("graphics/items/icon_palettes/rare_candy.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_pp_up_sheet[] = INCBIN_U32("graphics/items/icons/pp_up.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_pp_up_palette[] = INCBIN_U32("graphics/items/icon_palettes/pp_up.gbapal.lz");
+
+const u32 gFile_graphics_items_icon_palettes_zinc_palette[] = INCBIN_U32("graphics/items/icon_palettes/zinc.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_pp_max_sheet[] = INCBIN_U32("graphics/items/icons/pp_max.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_pp_max_palette[] = INCBIN_U32("graphics/items/icon_palettes/pp_max.gbapal.lz");
+
+const u32 gFile_graphics_items_icon_palettes_guard_spec_palette[] = INCBIN_U32("graphics/items/icon_palettes/guard_spec.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_dire_hit_palette[] = INCBIN_U32("graphics/items/icon_palettes/dire_hit.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_x_attack_palette[] = INCBIN_U32("graphics/items/icon_palettes/x_attack.gbapal.lz");
+const u32 gFile_graphics_items_icons_battle_stat_item_sheet[] = INCBIN_U32("graphics/items/icons/battle_stat_item.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_x_defend_palette[] = INCBIN_U32("graphics/items/icon_palettes/x_defend.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_x_speed_palette[] = INCBIN_U32("graphics/items/icon_palettes/x_speed.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_x_accuracy_palette[] = INCBIN_U32("graphics/items/icon_palettes/x_accuracy.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_x_special_palette[] = INCBIN_U32("graphics/items/icon_palettes/x_special.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_poke_doll_sheet[] = INCBIN_U32("graphics/items/icons/poke_doll.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_poke_doll_palette[] = INCBIN_U32("graphics/items/icon_palettes/poke_doll.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_fluffy_tail_sheet[] = INCBIN_U32("graphics/items/icons/fluffy_tail.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_fluffy_tail_palette[] = INCBIN_U32("graphics/items/icon_palettes/fluffy_tail.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_repel_sheet[] = INCBIN_U32("graphics/items/icons/repel.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_super_repel_palette[] = INCBIN_U32("graphics/items/icon_palettes/super_repel.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_max_repel_palette[] = INCBIN_U32("graphics/items/icon_palettes/max_repel.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_escape_rope_sheet[] = INCBIN_U32("graphics/items/icons/escape_rope.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_escape_rope_palette[] = INCBIN_U32("graphics/items/icon_palettes/escape_rope.gbapal.lz");
+
+const u32 gFile_graphics_items_icon_palettes_repel_palette[] = INCBIN_U32("graphics/items/icon_palettes/repel.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_sun_stone_sheet[] = INCBIN_U32("graphics/items/icons/sun_stone.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_sun_stone_palette[] = INCBIN_U32("graphics/items/icon_palettes/sun_stone.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_moon_stone_sheet[] = INCBIN_U32("graphics/items/icons/moon_stone.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_moon_stone_palette[] = INCBIN_U32("graphics/items/icon_palettes/moon_stone.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_fire_stone_sheet[] = INCBIN_U32("graphics/items/icons/fire_stone.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_fire_stone_palette[] = INCBIN_U32("graphics/items/icon_palettes/fire_stone.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_thunder_stone_sheet[] = INCBIN_U32("graphics/items/icons/thunder_stone.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_thunder_stone_palette[] = INCBIN_U32("graphics/items/icon_palettes/thunder_stone.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_water_stone_sheet[] = INCBIN_U32("graphics/items/icons/water_stone.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_water_stone_palette[] = INCBIN_U32("graphics/items/icon_palettes/water_stone.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_leaf_stone_sheet[] = INCBIN_U32("graphics/items/icons/leaf_stone.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_leaf_stone_palette[] = INCBIN_U32("graphics/items/icon_palettes/leaf_stone.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_tiny_mushroom_sheet[] = INCBIN_U32("graphics/items/icons/tiny_mushroom.4bpp.lz");
+const u32 gFile_graphics_items_icons_big_mushroom_sheet[] = INCBIN_U32("graphics/items/icons/big_mushroom.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_mushroom_palette[] = INCBIN_U32("graphics/items/icon_palettes/mushroom.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_pearl_sheet[] = INCBIN_U32("graphics/items/icons/pearl.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_pearl_palette[] = INCBIN_U32("graphics/items/icon_palettes/pearl.gbapal.lz");
+const u32 gFile_graphics_items_icons_big_pearl_sheet[] = INCBIN_U32("graphics/items/icons/big_pearl.4bpp.lz");
+
+const u32 gFile_graphics_items_icons_stardust_sheet[] = INCBIN_U32("graphics/items/icons/stardust.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_star_palette[] = INCBIN_U32("graphics/items/icon_palettes/star.gbapal.lz");
+const u32 gFile_graphics_items_icons_star_piece_sheet[] = INCBIN_U32("graphics/items/icons/star_piece.4bpp.lz");
+
+const u32 gFile_graphics_items_icons_nugget_sheet[] = INCBIN_U32("graphics/items/icons/nugget.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_nugget_palette[] = INCBIN_U32("graphics/items/icon_palettes/nugget.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_heart_scale_sheet[] = INCBIN_U32("graphics/items/icons/heart_scale.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_heart_scale_palette[] = INCBIN_U32("graphics/items/icon_palettes/heart_scale.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_orange_mail_sheet[] = INCBIN_U32("graphics/items/icons/orange_mail.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_orange_mail_palette[] = INCBIN_U32("graphics/items/icon_palettes/orange_mail.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_harbor_mail_sheet[] = INCBIN_U32("graphics/items/icons/harbor_mail.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_harbor_mail_palette[] = INCBIN_U32("graphics/items/icon_palettes/harbor_mail.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_glitter_mail_sheet[] = INCBIN_U32("graphics/items/icons/glitter_mail.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_glitter_mail_palette[] = INCBIN_U32("graphics/items/icon_palettes/glitter_mail.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_mech_mail_sheet[] = INCBIN_U32("graphics/items/icons/mech_mail.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_mech_mail_palette[] = INCBIN_U32("graphics/items/icon_palettes/mech_mail.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_wood_mail_sheet[] = INCBIN_U32("graphics/items/icons/wood_mail.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_wood_mail_palette[] = INCBIN_U32("graphics/items/icon_palettes/wood_mail.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_wave_mail_sheet[] = INCBIN_U32("graphics/items/icons/wave_mail.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_wave_mail_palette[] = INCBIN_U32("graphics/items/icon_palettes/wave_mail.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_bead_mail_sheet[] = INCBIN_U32("graphics/items/icons/bead_mail.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_bead_mail_palette[] = INCBIN_U32("graphics/items/icon_palettes/bead_mail.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_shadow_mail_sheet[] = INCBIN_U32("graphics/items/icons/shadow_mail.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_shadow_mail_palette[] = INCBIN_U32("graphics/items/icon_palettes/shadow_mail.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_tropic_mail_sheet[] = INCBIN_U32("graphics/items/icons/tropic_mail.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_tropic_mail_palette[] = INCBIN_U32("graphics/items/icon_palettes/tropic_mail.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_dream_mail_sheet[] = INCBIN_U32("graphics/items/icons/dream_mail.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_dream_mail_palette[] = INCBIN_U32("graphics/items/icon_palettes/dream_mail.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_fab_mail_sheet[] = INCBIN_U32("graphics/items/icons/fab_mail.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_fab_mail_palette[] = INCBIN_U32("graphics/items/icon_palettes/fab_mail.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_retro_mail_sheet[] = INCBIN_U32("graphics/items/icons/retro_mail.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_retro_mail_palette[] = INCBIN_U32("graphics/items/icon_palettes/retro_mail.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_cheri_berry_sheet[] = INCBIN_U32("graphics/items/icons/cheri_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_cheri_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/cheri_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_chesto_berry_sheet[] = INCBIN_U32("graphics/items/icons/chesto_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_chesto_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/chesto_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_pecha_berry_sheet[] = INCBIN_U32("graphics/items/icons/pecha_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_pecha_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/pecha_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_rawst_berry_sheet[] = INCBIN_U32("graphics/items/icons/rawst_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_rawst_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/rawst_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_aspear_berry_sheet[] = INCBIN_U32("graphics/items/icons/aspear_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_aspear_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/aspear_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_leppa_berry_sheet[] = INCBIN_U32("graphics/items/icons/leppa_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_leppa_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/leppa_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_oran_berry_sheet[] = INCBIN_U32("graphics/items/icons/oran_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_oran_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/oran_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_persim_berry_sheet[] = INCBIN_U32("graphics/items/icons/persim_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_persim_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/persim_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_lum_berry_sheet[] = INCBIN_U32("graphics/items/icons/lum_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_lum_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/lum_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_sitrus_berry_sheet[] = INCBIN_U32("graphics/items/icons/sitrus_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_sitrus_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/sitrus_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_figy_berry_sheet[] = INCBIN_U32("graphics/items/icons/figy_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_figy_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/figy_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_wiki_berry_sheet[] = INCBIN_U32("graphics/items/icons/wiki_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_wiki_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/wiki_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_mago_berry_sheet[] = INCBIN_U32("graphics/items/icons/mago_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_mago_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/mago_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_aguav_berry_sheet[] = INCBIN_U32("graphics/items/icons/aguav_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_aguav_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/aguav_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_iapapa_berry_sheet[] = INCBIN_U32("graphics/items/icons/iapapa_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_iapapa_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/iapapa_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_razz_berry_sheet[] = INCBIN_U32("graphics/items/icons/razz_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_razz_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/razz_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_bluk_berry_sheet[] = INCBIN_U32("graphics/items/icons/bluk_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_bluk_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/bluk_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_nanab_berry_sheet[] = INCBIN_U32("graphics/items/icons/nanab_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_nanab_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/nanab_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_wepear_berry_sheet[] = INCBIN_U32("graphics/items/icons/wepear_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_wepear_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/wepear_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_pinap_berry_sheet[] = INCBIN_U32("graphics/items/icons/pinap_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_pinap_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/pinap_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_pomeg_berry_sheet[] = INCBIN_U32("graphics/items/icons/pomeg_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_pomeg_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/pomeg_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_kelpsy_berry_sheet[] = INCBIN_U32("graphics/items/icons/kelpsy_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_kelpsy_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/kelpsy_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_qualot_berry_sheet[] = INCBIN_U32("graphics/items/icons/qualot_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_qualot_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/qualot_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_hondew_berry_sheet[] = INCBIN_U32("graphics/items/icons/hondew_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_hondew_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/hondew_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_grepa_berry_sheet[] = INCBIN_U32("graphics/items/icons/grepa_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_grepa_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/grepa_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_tamato_berry_sheet[] = INCBIN_U32("graphics/items/icons/tamato_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_tamato_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/tamato_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_cornn_berry_sheet[] = INCBIN_U32("graphics/items/icons/cornn_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_cornn_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/cornn_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_magost_berry_sheet[] = INCBIN_U32("graphics/items/icons/magost_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_magost_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/magost_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_rabuta_berry_sheet[] = INCBIN_U32("graphics/items/icons/rabuta_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_rabuta_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/rabuta_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_nomel_berry_sheet[] = INCBIN_U32("graphics/items/icons/nomel_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_nomel_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/nomel_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_spelon_berry_sheet[] = INCBIN_U32("graphics/items/icons/spelon_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_spelon_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/spelon_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_pamtre_berry_sheet[] = INCBIN_U32("graphics/items/icons/pamtre_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_pamtre_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/pamtre_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_watmel_berry_sheet[] = INCBIN_U32("graphics/items/icons/watmel_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_watmel_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/watmel_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_durin_berry_sheet[] = INCBIN_U32("graphics/items/icons/durin_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_durin_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/durin_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_belue_berry_sheet[] = INCBIN_U32("graphics/items/icons/belue_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_belue_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/belue_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_liechi_berry_sheet[] = INCBIN_U32("graphics/items/icons/liechi_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_liechi_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/liechi_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_ganlon_berry_sheet[] = INCBIN_U32("graphics/items/icons/ganlon_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_ganlon_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/ganlon_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_salac_berry_sheet[] = INCBIN_U32("graphics/items/icons/salac_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_salac_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/salac_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_petaya_berry_sheet[] = INCBIN_U32("graphics/items/icons/petaya_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_petaya_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/petaya_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_apicot_berry_sheet[] = INCBIN_U32("graphics/items/icons/apicot_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_apicot_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/apicot_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_lansat_berry_sheet[] = INCBIN_U32("graphics/items/icons/lansat_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_lansat_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/lansat_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_starf_berry_sheet[] = INCBIN_U32("graphics/items/icons/starf_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_starf_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/starf_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_enigma_berry_sheet[] = INCBIN_U32("graphics/items/icons/enigma_berry.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_enigma_berry_palette[] = INCBIN_U32("graphics/items/icon_palettes/enigma_berry.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_bright_powder_sheet[] = INCBIN_U32("graphics/items/icons/bright_powder.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_bright_powder_palette[] = INCBIN_U32("graphics/items/icon_palettes/bright_powder.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_in_battle_herb_sheet[] = INCBIN_U32("graphics/items/icons/in_battle_herb.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_white_herb_palette[] = INCBIN_U32("graphics/items/icon_palettes/white_herb.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_macho_brace_sheet[] = INCBIN_U32("graphics/items/icons/macho_brace.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_macho_brace_palette[] = INCBIN_U32("graphics/items/icon_palettes/macho_brace.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_exp_share_sheet[] = INCBIN_U32("graphics/items/icons/exp_share.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_exp_share_palette[] = INCBIN_U32("graphics/items/icon_palettes/exp_share.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_quick_claw_sheet[] = INCBIN_U32("graphics/items/icons/quick_claw.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_quick_claw_palette[] = INCBIN_U32("graphics/items/icon_palettes/quick_claw.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_soothe_bell_sheet[] = INCBIN_U32("graphics/items/icons/soothe_bell.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_soothe_bell_palette[] = INCBIN_U32("graphics/items/icon_palettes/soothe_bell.gbapal.lz");
+
+const u32 gFile_graphics_items_icon_palettes_mental_herb_palette[] = INCBIN_U32("graphics/items/icon_palettes/mental_herb.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_choice_band_sheet[] = INCBIN_U32("graphics/items/icons/choice_band.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_choice_band_palette[] = INCBIN_U32("graphics/items/icon_palettes/choice_band.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_kings_rock_sheet[] = INCBIN_U32("graphics/items/icons/kings_rock.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_kings_rock_palette[] = INCBIN_U32("graphics/items/icon_palettes/kings_rock.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_silver_powder_sheet[] = INCBIN_U32("graphics/items/icons/silver_powder.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_silver_powder_palette[] = INCBIN_U32("graphics/items/icon_palettes/silver_powder.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_amulet_coin_sheet[] = INCBIN_U32("graphics/items/icons/amulet_coin.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_amulet_coin_palette[] = INCBIN_U32("graphics/items/icon_palettes/amulet_coin.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_cleanse_tag_sheet[] = INCBIN_U32("graphics/items/icons/cleanse_tag.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_cleanse_tag_palette[] = INCBIN_U32("graphics/items/icon_palettes/cleanse_tag.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_soul_dew_sheet[] = INCBIN_U32("graphics/items/icons/soul_dew.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_soul_dew_palette[] = INCBIN_U32("graphics/items/icon_palettes/soul_dew.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_deep_sea_tooth_sheet[] = INCBIN_U32("graphics/items/icons/deep_sea_tooth.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_deep_sea_tooth_palette[] = INCBIN_U32("graphics/items/icon_palettes/deep_sea_tooth.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_deep_sea_scale_sheet[] = INCBIN_U32("graphics/items/icons/deep_sea_scale.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_deep_sea_scale_palette[] = INCBIN_U32("graphics/items/icon_palettes/deep_sea_scale.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_smoke_ball_sheet[] = INCBIN_U32("graphics/items/icons/smoke_ball.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_smoke_ball_palette[] = INCBIN_U32("graphics/items/icon_palettes/smoke_ball.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_everstone_sheet[] = INCBIN_U32("graphics/items/icons/everstone.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_everstone_palette[] = INCBIN_U32("graphics/items/icon_palettes/everstone.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_focus_band_sheet[] = INCBIN_U32("graphics/items/icons/focus_band.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_focus_band_palette[] = INCBIN_U32("graphics/items/icon_palettes/focus_band.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_lucky_egg_sheet[] = INCBIN_U32("graphics/items/icons/lucky_egg.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_lucky_egg_palette[] = INCBIN_U32("graphics/items/icon_palettes/lucky_egg.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_scope_lens_sheet[] = INCBIN_U32("graphics/items/icons/scope_lens.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_scope_lens_palette[] = INCBIN_U32("graphics/items/icon_palettes/scope_lens.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_metal_coat_sheet[] = INCBIN_U32("graphics/items/icons/metal_coat.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_metal_coat_palette[] = INCBIN_U32("graphics/items/icon_palettes/metal_coat.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_leftovers_sheet[] = INCBIN_U32("graphics/items/icons/leftovers.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_leftovers_palette[] = INCBIN_U32("graphics/items/icon_palettes/leftovers.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_dragon_scale_sheet[] = INCBIN_U32("graphics/items/icons/dragon_scale.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_dragon_scale_palette[] = INCBIN_U32("graphics/items/icon_palettes/dragon_scale.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_light_ball_sheet[] = INCBIN_U32("graphics/items/icons/light_ball.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_light_ball_palette[] = INCBIN_U32("graphics/items/icon_palettes/light_ball.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_soft_sand_sheet[] = INCBIN_U32("graphics/items/icons/soft_sand.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_soft_sand_palette[] = INCBIN_U32("graphics/items/icon_palettes/soft_sand.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_hard_stone_sheet[] = INCBIN_U32("graphics/items/icons/hard_stone.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_hard_stone_palette[] = INCBIN_U32("graphics/items/icon_palettes/hard_stone.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_miracle_seed_sheet[] = INCBIN_U32("graphics/items/icons/miracle_seed.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_miracle_seed_palette[] = INCBIN_U32("graphics/items/icon_palettes/miracle_seed.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_black_glasses_sheet[] = INCBIN_U32("graphics/items/icons/black_glasses.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_black_type_enhancing_item_palette[] = INCBIN_U32("graphics/items/icon_palettes/black_type_enhancing_item.gbapal.lz");
+const u32 gFile_graphics_items_icons_black_belt_sheet[] = INCBIN_U32("graphics/items/icons/black_belt.4bpp.lz");
+
+const u32 gFile_graphics_items_icons_magnet_sheet[] = INCBIN_U32("graphics/items/icons/magnet.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_magnet_palette[] = INCBIN_U32("graphics/items/icon_palettes/magnet.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_mystic_water_sheet[] = INCBIN_U32("graphics/items/icons/mystic_water.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_mystic_water_palette[] = INCBIN_U32("graphics/items/icon_palettes/mystic_water.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_sharp_beak_sheet[] = INCBIN_U32("graphics/items/icons/sharp_beak.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_sharp_beak_palette[] = INCBIN_U32("graphics/items/icon_palettes/sharp_beak.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_poison_barb_sheet[] = INCBIN_U32("graphics/items/icons/poison_barb.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_poison_barb_palette[] = INCBIN_U32("graphics/items/icon_palettes/poison_barb.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_never_melt_ice_sheet[] = INCBIN_U32("graphics/items/icons/never_melt_ice.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_never_melt_ice_palette[] = INCBIN_U32("graphics/items/icon_palettes/never_melt_ice.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_spell_tag_sheet[] = INCBIN_U32("graphics/items/icons/spell_tag.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_spell_tag_palette[] = INCBIN_U32("graphics/items/icon_palettes/spell_tag.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_twisted_spoon_sheet[] = INCBIN_U32("graphics/items/icons/twisted_spoon.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_twisted_spoon_palette[] = INCBIN_U32("graphics/items/icon_palettes/twisted_spoon.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_charcoal_sheet[] = INCBIN_U32("graphics/items/icons/charcoal.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_charcoal_palette[] = INCBIN_U32("graphics/items/icon_palettes/charcoal.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_dragon_fang_sheet[] = INCBIN_U32("graphics/items/icons/dragon_fang.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_dragon_fang_palette[] = INCBIN_U32("graphics/items/icon_palettes/dragon_fang.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_silk_scarf_sheet[] = INCBIN_U32("graphics/items/icons/silk_scarf.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_silk_scarf_palette[] = INCBIN_U32("graphics/items/icon_palettes/silk_scarf.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_up_grade_sheet[] = INCBIN_U32("graphics/items/icons/up_grade.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_up_grade_palette[] = INCBIN_U32("graphics/items/icon_palettes/up_grade.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_shell_bell_sheet[] = INCBIN_U32("graphics/items/icons/shell_bell.4bpp.lz");
+
+const u32 gFile_graphics_items_icons_sea_incense_sheet[] = INCBIN_U32("graphics/items/icons/sea_incense.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_sea_incense_palette[] = INCBIN_U32("graphics/items/icon_palettes/sea_incense.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_lax_incense_sheet[] = INCBIN_U32("graphics/items/icons/lax_incense.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_lax_incense_palette[] = INCBIN_U32("graphics/items/icon_palettes/lax_incense.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_lucky_punch_sheet[] = INCBIN_U32("graphics/items/icons/lucky_punch.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_lucky_punch_palette[] = INCBIN_U32("graphics/items/icon_palettes/lucky_punch.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_metal_powder_sheet[] = INCBIN_U32("graphics/items/icons/metal_powder.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_metal_powder_palette[] = INCBIN_U32("graphics/items/icon_palettes/metal_powder.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_thick_club_sheet[] = INCBIN_U32("graphics/items/icons/thick_club.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_thick_club_palette[] = INCBIN_U32("graphics/items/icon_palettes/thick_club.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_stick_sheet[] = INCBIN_U32("graphics/items/icons/stick.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_stick_palette[] = INCBIN_U32("graphics/items/icon_palettes/stick.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_scarf_sheet[] = INCBIN_U32("graphics/items/icons/scarf.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_red_scarf_palette[] = INCBIN_U32("graphics/items/icon_palettes/red_scarf.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_blue_scarf_palette[] = INCBIN_U32("graphics/items/icon_palettes/blue_scarf.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_pink_scarf_palette[] = INCBIN_U32("graphics/items/icon_palettes/pink_scarf.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_green_scarf_palette[] = INCBIN_U32("graphics/items/icon_palettes/green_scarf.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_yellow_scarf_palette[] = INCBIN_U32("graphics/items/icon_palettes/yellow_scarf.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_mach_bike_sheet[] = INCBIN_U32("graphics/items/icons/mach_bike.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_mach_bike_palette[] = INCBIN_U32("graphics/items/icon_palettes/mach_bike.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_coin_case_sheet[] = INCBIN_U32("graphics/items/icons/coin_case.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_coin_case_palette[] = INCBIN_U32("graphics/items/icon_palettes/coin_case.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_itemfinder_sheet[] = INCBIN_U32("graphics/items/icons/itemfinder.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_itemfinder_palette[] = INCBIN_U32("graphics/items/icon_palettes/itemfinder.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_old_rod_sheet[] = INCBIN_U32("graphics/items/icons/old_rod.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_old_rod_palette[] = INCBIN_U32("graphics/items/icon_palettes/old_rod.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_good_rod_sheet[] = INCBIN_U32("graphics/items/icons/good_rod.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_good_rod_palette[] = INCBIN_U32("graphics/items/icon_palettes/good_rod.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_super_rod_sheet[] = INCBIN_U32("graphics/items/icons/super_rod.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_super_rod_palette[] = INCBIN_U32("graphics/items/icon_palettes/super_rod.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_ss_ticket_sheet[] = INCBIN_U32("graphics/items/icons/ss_ticket.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_ss_ticket_palette[] = INCBIN_U32("graphics/items/icon_palettes/ss_ticket.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_contest_pass_sheet[] = INCBIN_U32("graphics/items/icons/contest_pass.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_contest_pass_palette[] = INCBIN_U32("graphics/items/icon_palettes/contest_pass.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_wailmer_pail_sheet[] = INCBIN_U32("graphics/items/icons/wailmer_pail.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_wailmer_pail_palette[] = INCBIN_U32("graphics/items/icon_palettes/wailmer_pail.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_devon_goods_sheet[] = INCBIN_U32("graphics/items/icons/devon_goods.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_devon_goods_palette[] = INCBIN_U32("graphics/items/icon_palettes/devon_goods.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_soot_sack_sheet[] = INCBIN_U32("graphics/items/icons/soot_sack.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_soot_sack_palette[] = INCBIN_U32("graphics/items/icon_palettes/soot_sack.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_basement_key_sheet[] = INCBIN_U32("graphics/items/icons/basement_key.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_old_key_palette[] = INCBIN_U32("graphics/items/icon_palettes/old_key.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_acro_bike_sheet[] = INCBIN_U32("graphics/items/icons/acro_bike.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_acro_bike_palette[] = INCBIN_U32("graphics/items/icon_palettes/acro_bike.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_pokeblock_case_sheet[] = INCBIN_U32("graphics/items/icons/pokeblock_case.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_pokeblock_case_palette[] = INCBIN_U32("graphics/items/icon_palettes/pokeblock_case.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_letter_sheet[] = INCBIN_U32("graphics/items/icons/letter.4bpp.lz");
+
+const u32 gFile_graphics_items_icons_eon_ticket_sheet[] = INCBIN_U32("graphics/items/icons/eon_ticket.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_eon_ticket_palette[] = INCBIN_U32("graphics/items/icon_palettes/eon_ticket.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_orb_sheet[] = INCBIN_U32("graphics/items/icons/orb.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_red_orb_palette[] = INCBIN_U32("graphics/items/icon_palettes/red_orb.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_blue_orb_palette[] = INCBIN_U32("graphics/items/icon_palettes/blue_orb.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_scanner_sheet[] = INCBIN_U32("graphics/items/icons/scanner.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_scanner_palette[] = INCBIN_U32("graphics/items/icon_palettes/scanner.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_go_goggles_sheet[] = INCBIN_U32("graphics/items/icons/go_goggles.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_go_goggles_palette[] = INCBIN_U32("graphics/items/icon_palettes/go_goggles.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_meteorite_sheet[] = INCBIN_U32("graphics/items/icons/meteorite.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_meteorite_palette[] = INCBIN_U32("graphics/items/icon_palettes/meteorite.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_room1_key_sheet[] = INCBIN_U32("graphics/items/icons/room1_key.4bpp.lz");
+const u32 gFile_graphics_items_icons_room2_key_sheet[] = INCBIN_U32("graphics/items/icons/room2_key.4bpp.lz");
+const u32 gFile_graphics_items_icons_room4_key_sheet[] = INCBIN_U32("graphics/items/icons/room4_key.4bpp.lz");
+const u32 gFile_graphics_items_icons_room6_key_sheet[] = INCBIN_U32("graphics/items/icons/room6_key.4bpp.lz");
+const u32 gFile_graphics_items_icons_storage_key_sheet[] = INCBIN_U32("graphics/items/icons/storage_key.4bpp.lz");
+
+const u32 gFile_graphics_items_icons_root_fossil_sheet[] = INCBIN_U32("graphics/items/icons/root_fossil.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_hoenn_fossil_palette[] = INCBIN_U32("graphics/items/icon_palettes/hoenn_fossil.gbapal.lz");
+const u32 gFile_graphics_items_icons_claw_fossil_sheet[] = INCBIN_U32("graphics/items/icons/claw_fossil.4bpp.lz");
+
+const u32 gFile_graphics_items_icons_devon_scope_sheet[] = INCBIN_U32("graphics/items/icons/devon_scope.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_devon_scope_palette[] = INCBIN_U32("graphics/items/icon_palettes/devon_scope.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_tm_sheet[] = INCBIN_U32("graphics/items/icons/tm.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_fighting_tm_hm_palette[] = INCBIN_U32("graphics/items/icon_palettes/fighting_tm_hm.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_dragon_tm_hm_palette[] = INCBIN_U32("graphics/items/icon_palettes/dragon_tm_hm.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_water_tm_hm_palette[] = INCBIN_U32("graphics/items/icon_palettes/water_tm_hm.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_psychic_tm_hm_palette[] = INCBIN_U32("graphics/items/icon_palettes/psychic_tm_hm.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_normal_tm_hm_palette[] = INCBIN_U32("graphics/items/icon_palettes/normal_tm_hm.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_poison_tm_hm_palette[] = INCBIN_U32("graphics/items/icon_palettes/poison_tm_hm.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_ice_tm_hm_palette[] = INCBIN_U32("graphics/items/icon_palettes/ice_tm_hm.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_grass_tm_hm_palette[] = INCBIN_U32("graphics/items/icon_palettes/grass_tm_hm.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_fire_tm_hm_palette[] = INCBIN_U32("graphics/items/icon_palettes/fire_tm_hm.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_dark_tm_hm_palette[] = INCBIN_U32("graphics/items/icon_palettes/dark_tm_hm.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_steel_tm_hm_palette[] = INCBIN_U32("graphics/items/icon_palettes/steel_tm_hm.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_electric_tm_hm_palette[] = INCBIN_U32("graphics/items/icon_palettes/electric_tm_hm.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_ground_tm_hm_palette[] = INCBIN_U32("graphics/items/icon_palettes/ground_tm_hm.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_ghost_tm_hm_palette[] = INCBIN_U32("graphics/items/icon_palettes/ghost_tm_hm.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_rock_tm_hm_palette[] = INCBIN_U32("graphics/items/icon_palettes/rock_tm_hm.gbapal.lz");
+const u32 gFile_graphics_items_icon_palettes_flying_tm_hm_palette[] = INCBIN_U32("graphics/items/icon_palettes/flying_tm_hm.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_oaks_parcel_sheet[] = INCBIN_U32("graphics/items/icons/oaks_parcel.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_oaks_parcel_palette[] = INCBIN_U32("graphics/items/icon_palettes/oaks_parcel.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_poke_flute_sheet[] = INCBIN_U32("graphics/items/icons/poke_flute.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_poke_flute_palette[] = INCBIN_U32("graphics/items/icon_palettes/poke_flute.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_secret_key_sheet[] = INCBIN_U32("graphics/items/icons/secret_key.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_secret_key_palette[] = INCBIN_U32("graphics/items/icon_palettes/secret_key.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_bike_voucher_sheet[] = INCBIN_U32("graphics/items/icons/bike_voucher.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_bike_voucher_palette[] = INCBIN_U32("graphics/items/icon_palettes/bike_voucher.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_gold_teeth_sheet[] = INCBIN_U32("graphics/items/icons/gold_teeth.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_gold_teeth_palette[] = INCBIN_U32("graphics/items/icon_palettes/gold_teeth.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_old_amber_sheet[] = INCBIN_U32("graphics/items/icons/old_amber.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_old_amber_palette[] = INCBIN_U32("graphics/items/icon_palettes/old_amber.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_card_key_sheet[] = INCBIN_U32("graphics/items/icons/card_key.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_card_key_palette[] = INCBIN_U32("graphics/items/icon_palettes/card_key.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_lift_key_sheet[] = INCBIN_U32("graphics/items/icons/lift_key.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_key_palette[] = INCBIN_U32("graphics/items/icon_palettes/key.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_helix_fossil_sheet[] = INCBIN_U32("graphics/items/icons/helix_fossil.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_kanto_fossil_palette[] = INCBIN_U32("graphics/items/icon_palettes/kanto_fossil.gbapal.lz");
+const u32 gFile_graphics_items_icons_dome_fossil_sheet[] = INCBIN_U32("graphics/items/icons/dome_fossil.4bpp.lz");
+
+const u32 gFile_graphics_items_icons_silph_scope_sheet[] = INCBIN_U32("graphics/items/icons/silph_scope.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_silph_scope_palette[] = INCBIN_U32("graphics/items/icon_palettes/silph_scope.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_bicycle_sheet[] = INCBIN_U32("graphics/items/icons/bicycle.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_bicycle_palette[] = INCBIN_U32("graphics/items/icon_palettes/bicycle.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_town_map_sheet[] = INCBIN_U32("graphics/items/icons/town_map.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_town_map_palette[] = INCBIN_U32("graphics/items/icon_palettes/town_map.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_vs_seeker_sheet[] = INCBIN_U32("graphics/items/icons/vs_seeker.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_vs_seeker_palette[] = INCBIN_U32("graphics/items/icon_palettes/vs_seeker.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_fame_checker_sheet[] = INCBIN_U32("graphics/items/icons/fame_checker.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_fame_checker_palette[] = INCBIN_U32("graphics/items/icon_palettes/fame_checker.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_tm_case_sheet[] = INCBIN_U32("graphics/items/icons/tm_case.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_tm_case_palette[] = INCBIN_U32("graphics/items/icon_palettes/tm_case.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_berry_pouch_sheet[] = INCBIN_U32("graphics/items/icons/berry_pouch.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_berry_pouch_palette[] = INCBIN_U32("graphics/items/icon_palettes/berry_pouch.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_teachy_tv_sheet[] = INCBIN_U32("graphics/items/icons/teachy_tv.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_teachy_tv_palette[] = INCBIN_U32("graphics/items/icon_palettes/teachy_tv.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_tri_pass_sheet[] = INCBIN_U32("graphics/items/icons/tri_pass.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_tri_pass_palette[] = INCBIN_U32("graphics/items/icon_palettes/tri_pass.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_rainbow_pass_sheet[] = INCBIN_U32("graphics/items/icons/rainbow_pass.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_rainbow_pass_palette[] = INCBIN_U32("graphics/items/icon_palettes/rainbow_pass.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_tea_sheet[] = INCBIN_U32("graphics/items/icons/tea.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_tea_palette[] = INCBIN_U32("graphics/items/icon_palettes/tea.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_mystic_ticket_sheet[] = INCBIN_U32("graphics/items/icons/mystic_ticket.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_mystic_ticket_palette[] = INCBIN_U32("graphics/items/icon_palettes/mystic_ticket.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_aurora_ticket_sheet[] = INCBIN_U32("graphics/items/icons/aurora_ticket.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_aurora_ticket_palette[] = INCBIN_U32("graphics/items/icon_palettes/aurora_ticket.gbapal.lz");
+
+const u32 gFile_graphics_items_icons_powder_jar_sheet[] = INCBIN_U32("graphics/items/icons/powder_jar.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_powder_jar_palette[] = INCBIN_U32("graphics/items/icon_palettes/powder_jar.gbapal.lz");
+
+const u32 gFile_graphics_items_icon_palettes_ruby_palette[] = INCBIN_U32("graphics/items/icon_palettes/ruby.gbapal.lz");
+const u32 gFile_graphics_items_icons_gem_sheet[] = INCBIN_U32("graphics/items/icons/gem.4bpp.lz");
+const u32 gFile_graphics_items_icon_palettes_sapphire_palette[] = INCBIN_U32("graphics/items/icon_palettes/sapphire.gbapal.lz");
diff --git a/src/data/graphics/mail.h b/src/data/graphics/mail.h
new file mode 100644
index 000000000..86d827b49
--- /dev/null
+++ b/src/data/graphics/mail.h
@@ -0,0 +1,38 @@
+const u16 gFile_graphics_mail_orange_palette_pal[] = INCBIN_U16("graphics/mail/orange/palette.gbapal");
+const u16 gFile_graphics_mail_harbor_palette_pal[] = INCBIN_U16("graphics/mail/harbor/palette.gbapal");
+const u16 gFile_graphics_mail_glitter_palette_pal[] = INCBIN_U16("graphics/mail/glitter/palette.gbapal");
+const u16 gFile_graphics_mail_mech_palette_pal[] = INCBIN_U16("graphics/mail/mech/palette.gbapal");
+const u16 gFile_graphics_mail_wood_palette_pal[] = INCBIN_U16("graphics/mail/wood/palette.gbapal");
+const u16 gFile_graphics_mail_wave_palette_pal[] = INCBIN_U16("graphics/mail/wave/palette.gbapal");
+const u16 gFile_graphics_mail_bead_palette_pal[] = INCBIN_U16("graphics/mail/bead/palette.gbapal");
+const u16 gFile_graphics_mail_shadow_palette_pal[] = INCBIN_U16("graphics/mail/shadow/palette.gbapal");
+const u16 gFile_graphics_mail_tropic_palette_pal[] = INCBIN_U16("graphics/mail/tropic/palette.gbapal");
+const u16 gFile_graphics_mail_dream_palette_pal[] = INCBIN_U16("graphics/mail/dream/palette.gbapal");
+const u16 gFile_graphics_mail_fab_palette_pal[] = INCBIN_U16("graphics/mail/fab/palette.gbapal");
+const u16 gFile_graphics_mail_retro_palette_pal[] = INCBIN_U16("graphics/mail/retro/palette.gbapal");
+
+const u32 gFile_graphics_mail_orange_tiles_sheet[] = INCBIN_U32("graphics/mail/orange/tiles.4bpp.lz");
+const u32 gFile_graphics_mail_harbor_tiles_sheet[] = INCBIN_U32("graphics/mail/harbor/tiles.4bpp.lz");
+const u32 gFile_graphics_mail_glitter_tiles_sheet[] = INCBIN_U32("graphics/mail/glitter/tiles.4bpp.lz");
+const u32 gFile_graphics_mail_mech_tiles_sheet[] = INCBIN_U32("graphics/mail/mech/tiles.4bpp.lz");
+const u32 gFile_graphics_mail_wood_tiles_sheet[] = INCBIN_U32("graphics/mail/wood/tiles.4bpp.lz");
+const u32 gFile_graphics_mail_wave_tiles_sheet[] = INCBIN_U32("graphics/mail/wave/tiles.4bpp.lz");
+const u32 gFile_graphics_mail_bead_tiles_sheet[] = INCBIN_U32("graphics/mail/bead/tiles.4bpp.lz");
+const u32 gFile_graphics_mail_shadow_tiles_sheet[] = INCBIN_U32("graphics/mail/shadow/tiles.4bpp.lz");
+const u32 gFile_graphics_mail_tropic_tiles_sheet[] = INCBIN_U32("graphics/mail/tropic/tiles.4bpp.lz");
+const u32 gFile_graphics_mail_dream_tiles_sheet[] = INCBIN_U32("graphics/mail/dream/tiles.4bpp.lz");
+const u32 gFile_graphics_mail_fab_tiles_sheet[] = INCBIN_U32("graphics/mail/fab/tiles.4bpp.lz");
+const u32 gFile_graphics_mail_retro_tiles_sheet[] = INCBIN_U32("graphics/mail/retro/tiles.4bpp.lz");
+
+const u32 gFile_graphics_mail_orange_map_tilemap[] = INCBIN_U32("graphics/mail/orange/map.bin.lz");
+const u32 gFile_graphics_mail_harbor_map_tilemap[] = INCBIN_U32("graphics/mail/harbor/map.bin.lz");
+const u32 gFile_graphics_mail_glitter_map_tilemap[] = INCBIN_U32("graphics/mail/glitter/map.bin.lz");
+const u32 gFile_graphics_mail_mech_map_tilemap[] = INCBIN_U32("graphics/mail/mech/map.bin.lz");
+const u32 gFile_graphics_mail_wood_map_tilemap[] = INCBIN_U32("graphics/mail/wood/map.bin.lz");
+const u32 gFile_graphics_mail_wave_map_tilemap[] = INCBIN_U32("graphics/mail/wave/map.bin.lz");
+const u32 gFile_graphics_mail_bead_map_tilemap[] = INCBIN_U32("graphics/mail/bead/map.bin.lz");
+const u32 gFile_graphics_mail_shadow_map_tilemap[] = INCBIN_U32("graphics/mail/shadow/map.bin.lz");
+const u32 gFile_graphics_mail_tropic_map_tilemap[] = INCBIN_U32("graphics/mail/tropic/map.bin.lz");
+const u32 gFile_graphics_mail_dream_map_tilemap[] = INCBIN_U32("graphics/mail/dream/map.bin.lz");
+const u32 gFile_graphics_mail_fab_map_tilemap[] = INCBIN_U32("graphics/mail/fab/map.bin.lz");
+const u32 gFile_graphics_mail_retro_map_tilemap[] = INCBIN_U32("graphics/mail/retro/map.bin.lz");
diff --git a/src/data/graphics/pokemon.h b/src/data/graphics/pokemon.h
new file mode 100644
index 000000000..edb7e982d
--- /dev/null
+++ b/src/data/graphics/pokemon.h
@@ -0,0 +1,2833 @@
+const u32 gMonFrontPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/front.4bpp.lz");
+const u32 gMonPalette_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/normal.gbapal.lz");
+const u32 gMonBackPic_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/back.4bpp.lz");
+const u32 gMonShinyPalette_Bulbasaur[] = INCBIN_U32("graphics/pokemon/bulbasaur/shiny.gbapal.lz");
+const u8 gMonIcon_Bulbasaur[] = INCBIN_U8("graphics/pokemon/bulbasaur/icon.4bpp");
+const u8 gMonFootprint_Bulbasaur[] = INCBIN_U8("graphics/pokemon/bulbasaur/footprint.1bpp");
+
+const u32 gMonFrontPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/front.4bpp.lz");
+const u32 gMonPalette_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/normal.gbapal.lz");
+const u32 gMonBackPic_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/back.4bpp.lz");
+const u32 gMonShinyPalette_Ivysaur[] = INCBIN_U32("graphics/pokemon/ivysaur/shiny.gbapal.lz");
+const u8 gMonIcon_Ivysaur[] = INCBIN_U8("graphics/pokemon/ivysaur/icon.4bpp");
+const u8 gMonFootprint_Ivysaur[] = INCBIN_U8("graphics/pokemon/ivysaur/footprint.1bpp");
+
+const u32 gMonFrontPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/front.4bpp.lz");
+const u32 gMonPalette_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/normal.gbapal.lz");
+const u32 gMonBackPic_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/back.4bpp.lz");
+const u32 gMonShinyPalette_Venusaur[] = INCBIN_U32("graphics/pokemon/venusaur/shiny.gbapal.lz");
+const u8 gMonIcon_Venusaur[] = INCBIN_U8("graphics/pokemon/venusaur/icon.4bpp");
+const u8 gMonFootprint_Venusaur[] = INCBIN_U8("graphics/pokemon/venusaur/footprint.1bpp");
+
+const u32 gMonFrontPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/front.4bpp.lz");
+const u32 gMonPalette_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/normal.gbapal.lz");
+const u32 gMonBackPic_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/back.4bpp.lz");
+const u32 gMonShinyPalette_Charmander[] = INCBIN_U32("graphics/pokemon/charmander/shiny.gbapal.lz");
+const u8 gMonIcon_Charmander[] = INCBIN_U8("graphics/pokemon/charmander/icon.4bpp");
+const u8 gMonFootprint_Charmander[] = INCBIN_U8("graphics/pokemon/charmander/footprint.1bpp");
+
+const u32 gMonFrontPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/front.4bpp.lz");
+const u32 gMonPalette_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/normal.gbapal.lz");
+const u32 gMonBackPic_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/back.4bpp.lz");
+const u32 gMonShinyPalette_Charmeleon[] = INCBIN_U32("graphics/pokemon/charmeleon/shiny.gbapal.lz");
+const u8 gMonIcon_Charmeleon[] = INCBIN_U8("graphics/pokemon/charmeleon/icon.4bpp");
+const u8 gMonFootprint_Charmeleon[] = INCBIN_U8("graphics/pokemon/charmeleon/footprint.1bpp");
+
+const u32 gMonFrontPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/front.4bpp.lz");
+const u32 gMonPalette_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/normal.gbapal.lz");
+const u32 gMonBackPic_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/back.4bpp.lz");
+const u32 gMonShinyPalette_Charizard[] = INCBIN_U32("graphics/pokemon/charizard/shiny.gbapal.lz");
+const u8 gMonIcon_Charizard[] = INCBIN_U8("graphics/pokemon/charizard/icon.4bpp");
+const u8 gMonFootprint_Charizard[] = INCBIN_U8("graphics/pokemon/charizard/footprint.1bpp");
+
+const u32 gMonFrontPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/front.4bpp.lz");
+const u32 gMonPalette_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/normal.gbapal.lz");
+const u32 gMonBackPic_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/back.4bpp.lz");
+const u32 gMonShinyPalette_Squirtle[] = INCBIN_U32("graphics/pokemon/squirtle/shiny.gbapal.lz");
+const u8 gMonIcon_Squirtle[] = INCBIN_U8("graphics/pokemon/squirtle/icon.4bpp");
+const u8 gMonFootprint_Squirtle[] = INCBIN_U8("graphics/pokemon/squirtle/footprint.1bpp");
+
+const u32 gMonFrontPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/front.4bpp.lz");
+const u32 gMonPalette_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/normal.gbapal.lz");
+const u32 gMonBackPic_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/back.4bpp.lz");
+const u32 gMonShinyPalette_Wartortle[] = INCBIN_U32("graphics/pokemon/wartortle/shiny.gbapal.lz");
+const u8 gMonIcon_Wartortle[] = INCBIN_U8("graphics/pokemon/wartortle/icon.4bpp");
+const u8 gMonFootprint_Wartortle[] = INCBIN_U8("graphics/pokemon/wartortle/footprint.1bpp");
+
+const u32 gMonFrontPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/front.4bpp.lz");
+const u32 gMonPalette_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/normal.gbapal.lz");
+const u32 gMonBackPic_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/back.4bpp.lz");
+const u32 gMonShinyPalette_Blastoise[] = INCBIN_U32("graphics/pokemon/blastoise/shiny.gbapal.lz");
+const u8 gMonIcon_Blastoise[] = INCBIN_U8("graphics/pokemon/blastoise/icon.4bpp");
+const u8 gMonFootprint_Blastoise[] = INCBIN_U8("graphics/pokemon/blastoise/footprint.1bpp");
+
+const u32 gMonFrontPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/front.4bpp.lz");
+const u32 gMonPalette_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/normal.gbapal.lz");
+const u32 gMonBackPic_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/back.4bpp.lz");
+const u32 gMonShinyPalette_Caterpie[] = INCBIN_U32("graphics/pokemon/caterpie/shiny.gbapal.lz");
+const u8 gMonIcon_Caterpie[] = INCBIN_U8("graphics/pokemon/caterpie/icon.4bpp");
+const u8 gMonFootprint_Caterpie[] = INCBIN_U8("graphics/pokemon/caterpie/footprint.1bpp");
+
+const u32 gMonFrontPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/front.4bpp.lz");
+const u32 gMonPalette_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/normal.gbapal.lz");
+const u32 gMonBackPic_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/back.4bpp.lz");
+const u32 gMonShinyPalette_Metapod[] = INCBIN_U32("graphics/pokemon/metapod/shiny.gbapal.lz");
+const u8 gMonIcon_Metapod[] = INCBIN_U8( "graphics/pokemon/metapod/icon.4bpp");
+const u8 gMonFootprint_Metapod[] = INCBIN_U8("graphics/pokemon/metapod/footprint.1bpp");
+
+const u32 gMonFrontPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/front.4bpp.lz");
+const u32 gMonPalette_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/normal.gbapal.lz");
+const u32 gMonBackPic_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/back.4bpp.lz");
+const u32 gMonShinyPalette_Butterfree[] = INCBIN_U32("graphics/pokemon/butterfree/shiny.gbapal.lz");
+const u8 gMonIcon_Butterfree[] = INCBIN_U8("graphics/pokemon/butterfree/icon.4bpp");
+const u8 gMonFootprint_Butterfree[] = INCBIN_U8("graphics/pokemon/butterfree/footprint.1bpp");
+
+const u32 gMonFrontPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/front.4bpp.lz");
+const u32 gMonPalette_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/normal.gbapal.lz");
+const u32 gMonBackPic_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/back.4bpp.lz");
+const u32 gMonShinyPalette_Weedle[] = INCBIN_U32("graphics/pokemon/weedle/shiny.gbapal.lz");
+const u8 gMonIcon_Weedle[] = INCBIN_U8("graphics/pokemon/weedle/icon.4bpp");
+const u8 gMonFootprint_Weedle[] = INCBIN_U8("graphics/pokemon/weedle/footprint.1bpp");
+
+const u32 gMonFrontPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/front.4bpp.lz");
+const u32 gMonPalette_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/normal.gbapal.lz");
+const u32 gMonBackPic_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/back.4bpp.lz");
+const u32 gMonShinyPalette_Kakuna[] = INCBIN_U32("graphics/pokemon/kakuna/shiny.gbapal.lz");
+const u8 gMonIcon_Kakuna[] = INCBIN_U8("graphics/pokemon/kakuna/icon.4bpp");
+const u8 gMonFootprint_Kakuna[] = INCBIN_U8("graphics/pokemon/kakuna/footprint.1bpp");
+
+const u32 gMonFrontPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/front.4bpp.lz");
+const u32 gMonPalette_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/normal.gbapal.lz");
+const u32 gMonBackPic_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/back.4bpp.lz");
+const u32 gMonShinyPalette_Beedrill[] = INCBIN_U32("graphics/pokemon/beedrill/shiny.gbapal.lz");
+const u8 gMonIcon_Beedrill[] = INCBIN_U8("graphics/pokemon/beedrill/icon.4bpp");
+const u8 gMonFootprint_Beedrill[] = INCBIN_U8("graphics/pokemon/beedrill/footprint.1bpp");
+
+const u32 gMonFrontPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/front.4bpp.lz");
+const u32 gMonPalette_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/normal.gbapal.lz");
+const u32 gMonBackPic_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/back.4bpp.lz");
+const u32 gMonShinyPalette_Pidgey[] = INCBIN_U32("graphics/pokemon/pidgey/shiny.gbapal.lz");
+const u8 gMonIcon_Pidgey[] = INCBIN_U8("graphics/pokemon/pidgey/icon.4bpp");
+const u8 gMonFootprint_Pidgey[] = INCBIN_U8("graphics/pokemon/pidgey/footprint.1bpp");
+
+const u32 gMonFrontPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/front.4bpp.lz");
+const u32 gMonPalette_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/normal.gbapal.lz");
+const u32 gMonBackPic_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/back.4bpp.lz");
+const u32 gMonShinyPalette_Pidgeotto[] = INCBIN_U32("graphics/pokemon/pidgeotto/shiny.gbapal.lz");
+const u8 gMonIcon_Pidgeotto[] = INCBIN_U8("graphics/pokemon/pidgeotto/icon.4bpp");
+const u8 gMonFootprint_Pidgeotto[] = INCBIN_U8("graphics/pokemon/pidgeotto/footprint.1bpp");
+
+const u32 gMonFrontPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/front.4bpp.lz");
+const u32 gMonPalette_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/normal.gbapal.lz");
+const u32 gMonBackPic_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/back.4bpp.lz");
+const u32 gMonShinyPalette_Pidgeot[] = INCBIN_U32("graphics/pokemon/pidgeot/shiny.gbapal.lz");
+const u8 gMonIcon_Pidgeot[] = INCBIN_U8("graphics/pokemon/pidgeot/icon.4bpp");
+const u8 gMonFootprint_Pidgeot[] = INCBIN_U8("graphics/pokemon/pidgeot/footprint.1bpp");
+
+const u32 gMonFrontPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/front.4bpp.lz");
+const u32 gMonPalette_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/normal.gbapal.lz");
+const u32 gMonBackPic_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/back.4bpp.lz");
+const u32 gMonShinyPalette_Rattata[] = INCBIN_U32("graphics/pokemon/rattata/shiny.gbapal.lz");
+const u8 gMonIcon_Rattata[] = INCBIN_U8("graphics/pokemon/rattata/icon.4bpp");
+const u8 gMonFootprint_Rattata[] = INCBIN_U8("graphics/pokemon/rattata/footprint.1bpp");
+
+const u32 gMonFrontPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/front.4bpp.lz");
+const u32 gMonPalette_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/normal.gbapal.lz");
+const u32 gMonBackPic_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/back.4bpp.lz");
+const u32 gMonShinyPalette_Raticate[] = INCBIN_U32("graphics/pokemon/raticate/shiny.gbapal.lz");
+const u8 gMonIcon_Raticate[] = INCBIN_U8("graphics/pokemon/raticate/icon.4bpp");
+const u8 gMonFootprint_Raticate[] = INCBIN_U8("graphics/pokemon/raticate/footprint.1bpp");
+
+const u32 gMonFrontPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/front.4bpp.lz");
+const u32 gMonPalette_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/normal.gbapal.lz");
+const u32 gMonBackPic_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/back.4bpp.lz");
+const u32 gMonShinyPalette_Spearow[] = INCBIN_U32("graphics/pokemon/spearow/shiny.gbapal.lz");
+const u8 gMonIcon_Spearow[] = INCBIN_U8("graphics/pokemon/spearow/icon.4bpp");
+const u8 gMonFootprint_Spearow[] = INCBIN_U8("graphics/pokemon/spearow/footprint.1bpp");
+
+const u32 gMonFrontPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/front.4bpp.lz");
+const u32 gMonPalette_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/normal.gbapal.lz");
+const u32 gMonBackPic_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/back.4bpp.lz");
+const u32 gMonShinyPalette_Fearow[] = INCBIN_U32("graphics/pokemon/fearow/shiny.gbapal.lz");
+const u8 gMonIcon_Fearow[] = INCBIN_U8("graphics/pokemon/fearow/icon.4bpp");
+const u8 gMonFootprint_Fearow[] = INCBIN_U8("graphics/pokemon/fearow/footprint.1bpp");
+
+const u32 gMonFrontPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/front.4bpp.lz");
+const u32 gMonPalette_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/normal.gbapal.lz");
+const u32 gMonBackPic_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/back.4bpp.lz");
+const u32 gMonShinyPalette_Ekans[] = INCBIN_U32("graphics/pokemon/ekans/shiny.gbapal.lz");
+const u8 gMonIcon_Ekans[] = INCBIN_U8("graphics/pokemon/ekans/icon.4bpp");
+const u8 gMonFootprint_Ekans[] = INCBIN_U8("graphics/pokemon/ekans/footprint.1bpp");
+
+const u32 gMonFrontPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/front.4bpp.lz");
+const u32 gMonPalette_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/normal.gbapal.lz");
+const u32 gMonBackPic_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/back.4bpp.lz");
+const u32 gMonShinyPalette_Arbok[] = INCBIN_U32("graphics/pokemon/arbok/shiny.gbapal.lz");
+const u8 gMonIcon_Arbok[] = INCBIN_U8("graphics/pokemon/arbok/icon.4bpp");
+const u8 gMonFootprint_Arbok[] = INCBIN_U8("graphics/pokemon/arbok/footprint.1bpp");
+
+const u32 gMonFrontPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/front.4bpp.lz");
+const u32 gMonPalette_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/normal.gbapal.lz");
+const u32 gMonBackPic_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/back.4bpp.lz");
+const u32 gMonShinyPalette_Pikachu[] = INCBIN_U32("graphics/pokemon/pikachu/shiny.gbapal.lz");
+const u8 gMonIcon_Pikachu[] = INCBIN_U8("graphics/pokemon/pikachu/icon.4bpp");
+const u8 gMonFootprint_Pikachu[] = INCBIN_U8("graphics/pokemon/pikachu/footprint.1bpp");
+
+const u32 gMonFrontPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/front.4bpp.lz");
+const u32 gMonPalette_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/normal.gbapal.lz");
+const u32 gMonBackPic_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/back.4bpp.lz");
+const u32 gMonShinyPalette_Raichu[] = INCBIN_U32("graphics/pokemon/raichu/shiny.gbapal.lz");
+const u8 gMonIcon_Raichu[] = INCBIN_U8("graphics/pokemon/raichu/icon.4bpp");
+const u8 gMonFootprint_Raichu[] = INCBIN_U8("graphics/pokemon/raichu/footprint.1bpp");
+
+const u32 gMonFrontPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/front.4bpp.lz");
+const u32 gMonPalette_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/normal.gbapal.lz");
+const u32 gMonBackPic_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/back.4bpp.lz");
+const u32 gMonShinyPalette_Sandshrew[] = INCBIN_U32("graphics/pokemon/sandshrew/shiny.gbapal.lz");
+const u8 gMonIcon_Sandshrew[] = INCBIN_U8("graphics/pokemon/sandshrew/icon.4bpp");
+const u8 gMonFootprint_Sandshrew[] = INCBIN_U8("graphics/pokemon/sandshrew/footprint.1bpp");
+
+const u32 gMonFrontPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/front.4bpp.lz");
+const u32 gMonPalette_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/normal.gbapal.lz");
+const u32 gMonBackPic_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/back.4bpp.lz");
+const u32 gMonShinyPalette_Sandslash[] = INCBIN_U32("graphics/pokemon/sandslash/shiny.gbapal.lz");
+const u8 gMonIcon_Sandslash[] = INCBIN_U8("graphics/pokemon/sandslash/icon.4bpp");
+const u8 gMonFootprint_Sandslash[] = INCBIN_U8("graphics/pokemon/sandslash/footprint.1bpp");
+
+const u32 gMonFrontPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/front.4bpp.lz");
+const u32 gMonPalette_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/normal.gbapal.lz");
+const u32 gMonBackPic_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/back.4bpp.lz");
+const u32 gMonShinyPalette_NidoranF[] = INCBIN_U32("graphics/pokemon/nidoran_f/shiny.gbapal.lz");
+const u8 gMonIcon_NidoranF[] = INCBIN_U8("graphics/pokemon/nidoran_f/icon.4bpp");
+const u8 gMonFootprint_NidoranF[] = INCBIN_U8("graphics/pokemon/nidoran_f/footprint.1bpp");
+
+const u32 gMonFrontPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/front.4bpp.lz");
+const u32 gMonPalette_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/normal.gbapal.lz");
+const u32 gMonBackPic_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/back.4bpp.lz");
+const u32 gMonShinyPalette_Nidorina[] = INCBIN_U32("graphics/pokemon/nidorina/shiny.gbapal.lz");
+const u8 gMonIcon_Nidorina[] = INCBIN_U8("graphics/pokemon/nidorina/icon.4bpp");
+const u8 gMonFootprint_Nidorina[] = INCBIN_U8("graphics/pokemon/nidorina/footprint.1bpp");
+
+const u32 gMonFrontPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/front.4bpp.lz");
+const u32 gMonPalette_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/normal.gbapal.lz");
+const u32 gMonBackPic_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/back.4bpp.lz");
+const u32 gMonShinyPalette_Nidoqueen[] = INCBIN_U32("graphics/pokemon/nidoqueen/shiny.gbapal.lz");
+const u8 gMonIcon_Nidoqueen[] = INCBIN_U8("graphics/pokemon/nidoqueen/icon.4bpp");
+const u8 gMonFootprint_Nidoqueen[] = INCBIN_U8("graphics/pokemon/nidoqueen/footprint.1bpp");
+
+const u32 gMonFrontPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/front.4bpp.lz");
+const u32 gMonPalette_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/normal.gbapal.lz");
+const u32 gMonBackPic_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/back.4bpp.lz");
+const u32 gMonShinyPalette_NidoranM[] = INCBIN_U32("graphics/pokemon/nidoran_m/shiny.gbapal.lz");
+const u8 gMonIcon_NidoranM[] = INCBIN_U8("graphics/pokemon/nidoran_m/icon.4bpp");
+const u8 gMonFootprint_NidoranM[] = INCBIN_U8("graphics/pokemon/nidoran_m/footprint.1bpp");
+
+const u32 gMonFrontPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/front.4bpp.lz");
+const u32 gMonPalette_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/normal.gbapal.lz");
+const u32 gMonBackPic_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/back.4bpp.lz");
+const u32 gMonShinyPalette_Nidorino[] = INCBIN_U32("graphics/pokemon/nidorino/shiny.gbapal.lz");
+const u8 gMonIcon_Nidorino[] = INCBIN_U8("graphics/pokemon/nidorino/icon.4bpp");
+const u8 gMonFootprint_Nidorino[] = INCBIN_U8("graphics/pokemon/nidorino/footprint.1bpp");
+
+const u32 gMonFrontPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/front.4bpp.lz");
+const u32 gMonPalette_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/normal.gbapal.lz");
+const u32 gMonBackPic_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/back.4bpp.lz");
+const u32 gMonShinyPalette_Nidoking[] = INCBIN_U32("graphics/pokemon/nidoking/shiny.gbapal.lz");
+const u8 gMonIcon_Nidoking[] = INCBIN_U8("graphics/pokemon/nidoking/icon.4bpp");
+const u8 gMonFootprint_Nidoking[] = INCBIN_U8("graphics/pokemon/nidoking/footprint.1bpp");
+
+const u32 gMonFrontPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/front.4bpp.lz");
+const u32 gMonPalette_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/normal.gbapal.lz");
+const u32 gMonBackPic_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/back.4bpp.lz");
+const u32 gMonShinyPalette_Clefairy[] = INCBIN_U32("graphics/pokemon/clefairy/shiny.gbapal.lz");
+const u8 gMonIcon_Clefairy[] = INCBIN_U8("graphics/pokemon/clefairy/icon.4bpp");
+const u8 gMonFootprint_Clefairy[] = INCBIN_U8("graphics/pokemon/clefairy/footprint.1bpp");
+
+const u32 gMonFrontPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/front.4bpp.lz");
+const u32 gMonPalette_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/normal.gbapal.lz");
+const u32 gMonBackPic_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/back.4bpp.lz");
+const u32 gMonShinyPalette_Clefable[] = INCBIN_U32("graphics/pokemon/clefable/shiny.gbapal.lz");
+const u8 gMonIcon_Clefable[] = INCBIN_U8("graphics/pokemon/clefable/icon.4bpp");
+const u8 gMonFootprint_Clefable[] = INCBIN_U8("graphics/pokemon/clefable/footprint.1bpp");
+
+const u32 gMonFrontPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/front.4bpp.lz");
+const u32 gMonPalette_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/normal.gbapal.lz");
+const u32 gMonBackPic_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/back.4bpp.lz");
+const u32 gMonShinyPalette_Vulpix[] = INCBIN_U32("graphics/pokemon/vulpix/shiny.gbapal.lz");
+const u8 gMonIcon_Vulpix[] = INCBIN_U8("graphics/pokemon/vulpix/icon.4bpp");
+const u8 gMonFootprint_Vulpix[] = INCBIN_U8("graphics/pokemon/vulpix/footprint.1bpp");
+
+const u32 gMonFrontPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/front.4bpp.lz");
+const u32 gMonPalette_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/normal.gbapal.lz");
+const u32 gMonBackPic_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/back.4bpp.lz");
+const u32 gMonShinyPalette_Ninetales[] = INCBIN_U32("graphics/pokemon/ninetales/shiny.gbapal.lz");
+const u8 gMonIcon_Ninetales[] = INCBIN_U8("graphics/pokemon/ninetales/icon.4bpp");
+const u8 gMonFootprint_Ninetales[] = INCBIN_U8("graphics/pokemon/ninetales/footprint.1bpp");
+
+const u32 gMonFrontPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/front.4bpp.lz");
+const u32 gMonPalette_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/normal.gbapal.lz");
+const u32 gMonBackPic_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/back.4bpp.lz");
+const u32 gMonShinyPalette_Jigglypuff[] = INCBIN_U32("graphics/pokemon/jigglypuff/shiny.gbapal.lz");
+const u8 gMonIcon_Jigglypuff[] = INCBIN_U8("graphics/pokemon/jigglypuff/icon.4bpp");
+const u8 gMonFootprint_Jigglypuff[] = INCBIN_U8("graphics/pokemon/jigglypuff/footprint.1bpp");
+
+const u32 gMonFrontPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/front.4bpp.lz");
+const u32 gMonPalette_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/normal.gbapal.lz");
+const u32 gMonBackPic_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/back.4bpp.lz");
+const u32 gMonShinyPalette_Wigglytuff[] = INCBIN_U32("graphics/pokemon/wigglytuff/shiny.gbapal.lz");
+const u8 gMonIcon_Wigglytuff[] = INCBIN_U8("graphics/pokemon/wigglytuff/icon.4bpp");
+const u8 gMonFootprint_Wigglytuff[] = INCBIN_U8("graphics/pokemon/wigglytuff/footprint.1bpp");
+
+const u32 gMonFrontPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/front.4bpp.lz");
+const u32 gMonPalette_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/normal.gbapal.lz");
+const u32 gMonBackPic_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/back.4bpp.lz");
+const u32 gMonShinyPalette_Zubat[] = INCBIN_U32("graphics/pokemon/zubat/shiny.gbapal.lz");
+const u8 gMonIcon_Zubat[] = INCBIN_U8("graphics/pokemon/zubat/icon.4bpp");
+const u8 gMonFootprint_Zubat[] = INCBIN_U8("graphics/pokemon/zubat/footprint.1bpp");
+
+const u32 gMonFrontPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/front.4bpp.lz");
+const u32 gMonPalette_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/normal.gbapal.lz");
+const u32 gMonBackPic_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/back.4bpp.lz");
+const u32 gMonShinyPalette_Golbat[] = INCBIN_U32("graphics/pokemon/golbat/shiny.gbapal.lz");
+const u8 gMonIcon_Golbat[] = INCBIN_U8("graphics/pokemon/golbat/icon.4bpp");
+const u8 gMonFootprint_Golbat[] = INCBIN_U8("graphics/pokemon/golbat/footprint.1bpp");
+
+const u32 gMonFrontPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/front.4bpp.lz");
+const u32 gMonPalette_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/normal.gbapal.lz");
+const u32 gMonBackPic_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/back.4bpp.lz");
+const u32 gMonShinyPalette_Oddish[] = INCBIN_U32("graphics/pokemon/oddish/shiny.gbapal.lz");
+const u8 gMonIcon_Oddish[] = INCBIN_U8("graphics/pokemon/oddish/icon.4bpp");
+const u8 gMonFootprint_Oddish[] = INCBIN_U8("graphics/pokemon/oddish/footprint.1bpp");
+
+const u32 gMonFrontPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/front.4bpp.lz");
+const u32 gMonPalette_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/normal.gbapal.lz");
+const u32 gMonBackPic_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/back.4bpp.lz");
+const u32 gMonShinyPalette_Gloom[] = INCBIN_U32("graphics/pokemon/gloom/shiny.gbapal.lz");
+const u8 gMonIcon_Gloom[] = INCBIN_U8("graphics/pokemon/gloom/icon.4bpp");
+const u8 gMonFootprint_Gloom[] = INCBIN_U8("graphics/pokemon/gloom/footprint.1bpp");
+
+const u32 gMonFrontPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/front.4bpp.lz");
+const u32 gMonPalette_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/normal.gbapal.lz");
+const u32 gMonBackPic_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/back.4bpp.lz");
+const u32 gMonShinyPalette_Vileplume[] = INCBIN_U32("graphics/pokemon/vileplume/shiny.gbapal.lz");
+const u8 gMonIcon_Vileplume[] = INCBIN_U8("graphics/pokemon/vileplume/icon.4bpp");
+const u8 gMonFootprint_Vileplume[] = INCBIN_U8("graphics/pokemon/vileplume/footprint.1bpp");
+
+const u32 gMonFrontPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/front.4bpp.lz");
+const u32 gMonPalette_Paras[] = INCBIN_U32("graphics/pokemon/paras/normal.gbapal.lz");
+const u32 gMonBackPic_Paras[] = INCBIN_U32("graphics/pokemon/paras/back.4bpp.lz");
+const u32 gMonShinyPalette_Paras[] = INCBIN_U32("graphics/pokemon/paras/shiny.gbapal.lz");
+const u8 gMonIcon_Paras[] = INCBIN_U8("graphics/pokemon/paras/icon.4bpp");
+const u8 gMonFootprint_Paras[] = INCBIN_U8("graphics/pokemon/paras/footprint.1bpp");
+
+const u32 gMonFrontPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/front.4bpp.lz");
+const u32 gMonPalette_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/normal.gbapal.lz");
+const u32 gMonBackPic_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/back.4bpp.lz");
+const u32 gMonShinyPalette_Parasect[] = INCBIN_U32("graphics/pokemon/parasect/shiny.gbapal.lz");
+const u8 gMonIcon_Parasect[] = INCBIN_U8("graphics/pokemon/parasect/icon.4bpp");
+const u8 gMonFootprint_Parasect[] = INCBIN_U8("graphics/pokemon/parasect/footprint.1bpp");
+
+const u32 gMonFrontPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/front.4bpp.lz");
+const u32 gMonPalette_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/normal.gbapal.lz");
+const u32 gMonBackPic_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/back.4bpp.lz");
+const u32 gMonShinyPalette_Venonat[] = INCBIN_U32("graphics/pokemon/venonat/shiny.gbapal.lz");
+const u8 gMonIcon_Venonat[] = INCBIN_U8("graphics/pokemon/venonat/icon.4bpp");
+const u8 gMonFootprint_Venonat[] = INCBIN_U8("graphics/pokemon/venonat/footprint.1bpp");
+
+const u32 gMonFrontPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/front.4bpp.lz");
+const u32 gMonPalette_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/normal.gbapal.lz");
+const u32 gMonBackPic_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/back.4bpp.lz");
+const u32 gMonShinyPalette_Venomoth[] = INCBIN_U32("graphics/pokemon/venomoth/shiny.gbapal.lz");
+const u8 gMonIcon_Venomoth[] = INCBIN_U8("graphics/pokemon/venomoth/icon.4bpp");
+const u8 gMonFootprint_Venomoth[] = INCBIN_U8("graphics/pokemon/venomoth/footprint.1bpp");
+
+const u32 gMonFrontPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/front.4bpp.lz");
+const u32 gMonPalette_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/normal.gbapal.lz");
+const u32 gMonBackPic_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/back.4bpp.lz");
+const u32 gMonShinyPalette_Diglett[] = INCBIN_U32("graphics/pokemon/diglett/shiny.gbapal.lz");
+const u8 gMonIcon_Diglett[] = INCBIN_U8("graphics/pokemon/diglett/icon.4bpp");
+const u8 gMonFootprint_Diglett[] = INCBIN_U8("graphics/pokemon/diglett/footprint.1bpp");
+
+const u32 gMonFrontPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/front.4bpp.lz");
+const u32 gMonPalette_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/normal.gbapal.lz");
+const u32 gMonBackPic_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/back.4bpp.lz");
+const u32 gMonShinyPalette_Dugtrio[] = INCBIN_U32("graphics/pokemon/dugtrio/shiny.gbapal.lz");
+const u8 gMonIcon_Dugtrio[] = INCBIN_U8("graphics/pokemon/dugtrio/icon.4bpp");
+const u8 gMonFootprint_Dugtrio[] = INCBIN_U8("graphics/pokemon/dugtrio/footprint.1bpp");
+
+const u32 gMonFrontPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/front.4bpp.lz");
+const u32 gMonPalette_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/normal.gbapal.lz");
+const u32 gMonBackPic_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/back.4bpp.lz");
+const u32 gMonShinyPalette_Meowth[] = INCBIN_U32("graphics/pokemon/meowth/shiny.gbapal.lz");
+const u8 gMonIcon_Meowth[] = INCBIN_U8("graphics/pokemon/meowth/icon.4bpp");
+const u8 gMonFootprint_Meowth[] = INCBIN_U8("graphics/pokemon/meowth/footprint.1bpp");
+
+const u32 gMonFrontPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/front.4bpp.lz");
+const u32 gMonPalette_Persian[] = INCBIN_U32("graphics/pokemon/persian/normal.gbapal.lz");
+const u32 gMonBackPic_Persian[] = INCBIN_U32("graphics/pokemon/persian/back.4bpp.lz");
+const u32 gMonShinyPalette_Persian[] = INCBIN_U32("graphics/pokemon/persian/shiny.gbapal.lz");
+const u8 gMonIcon_Persian[] = INCBIN_U8("graphics/pokemon/persian/icon.4bpp");
+const u8 gMonFootprint_Persian[] = INCBIN_U8("graphics/pokemon/persian/footprint.1bpp");
+
+const u32 gMonFrontPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/front.4bpp.lz");
+const u32 gMonPalette_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/normal.gbapal.lz");
+const u32 gMonBackPic_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/back.4bpp.lz");
+const u32 gMonShinyPalette_Psyduck[] = INCBIN_U32("graphics/pokemon/psyduck/shiny.gbapal.lz");
+const u8 gMonIcon_Psyduck[] = INCBIN_U8("graphics/pokemon/psyduck/icon.4bpp");
+const u8 gMonFootprint_Psyduck[] = INCBIN_U8("graphics/pokemon/psyduck/footprint.1bpp");
+
+const u32 gMonFrontPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/front.4bpp.lz");
+const u32 gMonPalette_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/normal.gbapal.lz");
+const u32 gMonBackPic_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/back.4bpp.lz");
+const u32 gMonShinyPalette_Golduck[] = INCBIN_U32("graphics/pokemon/golduck/shiny.gbapal.lz");
+const u8 gMonIcon_Golduck[] = INCBIN_U8("graphics/pokemon/golduck/icon.4bpp");
+const u8 gMonFootprint_Golduck[] = INCBIN_U8("graphics/pokemon/golduck/footprint.1bpp");
+
+const u32 gMonFrontPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/front.4bpp.lz");
+const u32 gMonPalette_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/normal.gbapal.lz");
+const u32 gMonBackPic_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/back.4bpp.lz");
+const u32 gMonShinyPalette_Mankey[] = INCBIN_U32("graphics/pokemon/mankey/shiny.gbapal.lz");
+const u8 gMonIcon_Mankey[] = INCBIN_U8("graphics/pokemon/mankey/icon.4bpp");
+const u8 gMonFootprint_Mankey[] = INCBIN_U8("graphics/pokemon/mankey/footprint.1bpp");
+
+const u32 gMonFrontPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/front.4bpp.lz");
+const u32 gMonPalette_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/normal.gbapal.lz");
+const u32 gMonBackPic_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/back.4bpp.lz");
+const u32 gMonShinyPalette_Primeape[] = INCBIN_U32("graphics/pokemon/primeape/shiny.gbapal.lz");
+const u8 gMonIcon_Primeape[] = INCBIN_U8("graphics/pokemon/primeape/icon.4bpp");
+const u8 gMonFootprint_Primeape[] = INCBIN_U8("graphics/pokemon/primeape/footprint.1bpp");
+
+const u32 gMonFrontPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/front.4bpp.lz");
+const u32 gMonPalette_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/normal.gbapal.lz");
+const u32 gMonBackPic_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/back.4bpp.lz");
+const u32 gMonShinyPalette_Growlithe[] = INCBIN_U32("graphics/pokemon/growlithe/shiny.gbapal.lz");
+const u8 gMonIcon_Growlithe[] = INCBIN_U8("graphics/pokemon/growlithe/icon.4bpp");
+const u8 gMonFootprint_Growlithe[] = INCBIN_U8("graphics/pokemon/growlithe/footprint.1bpp");
+
+const u32 gMonFrontPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/front.4bpp.lz");
+const u32 gMonPalette_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/normal.gbapal.lz");
+const u32 gMonBackPic_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/back.4bpp.lz");
+const u32 gMonShinyPalette_Arcanine[] = INCBIN_U32("graphics/pokemon/arcanine/shiny.gbapal.lz");
+const u8 gMonIcon_Arcanine[] = INCBIN_U8("graphics/pokemon/arcanine/icon.4bpp");
+const u8 gMonFootprint_Arcanine[] = INCBIN_U8("graphics/pokemon/arcanine/footprint.1bpp");
+
+const u32 gMonFrontPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/front.4bpp.lz");
+const u32 gMonPalette_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/normal.gbapal.lz");
+const u32 gMonBackPic_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/back.4bpp.lz");
+const u32 gMonShinyPalette_Poliwag[] = INCBIN_U32("graphics/pokemon/poliwag/shiny.gbapal.lz");
+const u8 gMonIcon_Poliwag[] = INCBIN_U8("graphics/pokemon/poliwag/icon.4bpp");
+const u8 gMonFootprint_Poliwag[] = INCBIN_U8("graphics/pokemon/poliwag/footprint.1bpp");
+
+const u32 gMonFrontPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/front.4bpp.lz");
+const u32 gMonPalette_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/normal.gbapal.lz");
+const u32 gMonBackPic_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/back.4bpp.lz");
+const u32 gMonShinyPalette_Poliwhirl[] = INCBIN_U32("graphics/pokemon/poliwhirl/shiny.gbapal.lz");
+const u8 gMonIcon_Poliwhirl[] = INCBIN_U8("graphics/pokemon/poliwhirl/icon.4bpp");
+const u8 gMonFootprint_Poliwhirl[] = INCBIN_U8("graphics/pokemon/poliwhirl/footprint.1bpp");
+
+const u32 gMonFrontPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/front.4bpp.lz");
+const u32 gMonPalette_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/normal.gbapal.lz");
+const u32 gMonBackPic_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/back.4bpp.lz");
+const u32 gMonShinyPalette_Poliwrath[] = INCBIN_U32("graphics/pokemon/poliwrath/shiny.gbapal.lz");
+const u8 gMonIcon_Poliwrath[] = INCBIN_U8("graphics/pokemon/poliwrath/icon.4bpp");
+const u8 gMonFootprint_Poliwrath[] = INCBIN_U8("graphics/pokemon/poliwrath/footprint.1bpp");
+
+const u32 gMonFrontPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/front.4bpp.lz");
+const u32 gMonPalette_Abra[] = INCBIN_U32("graphics/pokemon/abra/normal.gbapal.lz");
+const u32 gMonBackPic_Abra[] = INCBIN_U32("graphics/pokemon/abra/back.4bpp.lz");
+const u32 gMonShinyPalette_Abra[] = INCBIN_U32("graphics/pokemon/abra/shiny.gbapal.lz");
+const u8 gMonIcon_Abra[] = INCBIN_U8("graphics/pokemon/abra/icon.4bpp");
+const u8 gMonFootprint_Abra[] = INCBIN_U8("graphics/pokemon/abra/footprint.1bpp");
+
+const u32 gMonFrontPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/front.4bpp.lz");
+const u32 gMonPalette_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/normal.gbapal.lz");
+const u32 gMonBackPic_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/back.4bpp.lz");
+const u32 gMonShinyPalette_Kadabra[] = INCBIN_U32("graphics/pokemon/kadabra/shiny.gbapal.lz");
+const u8 gMonIcon_Kadabra[] = INCBIN_U8("graphics/pokemon/kadabra/icon.4bpp");
+const u8 gMonFootprint_Kadabra[] = INCBIN_U8("graphics/pokemon/kadabra/footprint.1bpp");
+
+const u32 gMonFrontPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/front.4bpp.lz");
+const u32 gMonPalette_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/normal.gbapal.lz");
+const u32 gMonBackPic_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/back.4bpp.lz");
+const u32 gMonShinyPalette_Alakazam[] = INCBIN_U32("graphics/pokemon/alakazam/shiny.gbapal.lz");
+const u8 gMonIcon_Alakazam[] = INCBIN_U8("graphics/pokemon/alakazam/icon.4bpp");
+const u8 gMonFootprint_Alakazam[] = INCBIN_U8("graphics/pokemon/alakazam/footprint.1bpp");
+
+const u32 gMonFrontPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/front.4bpp.lz");
+const u32 gMonPalette_Machop[] = INCBIN_U32("graphics/pokemon/machop/normal.gbapal.lz");
+const u32 gMonBackPic_Machop[] = INCBIN_U32("graphics/pokemon/machop/back.4bpp.lz");
+const u32 gMonShinyPalette_Machop[] = INCBIN_U32("graphics/pokemon/machop/shiny.gbapal.lz");
+const u8 gMonIcon_Machop[] = INCBIN_U8("graphics/pokemon/machop/icon.4bpp");
+const u8 gMonFootprint_Machop[] = INCBIN_U8("graphics/pokemon/machop/footprint.1bpp");
+
+const u32 gMonFrontPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/front.4bpp.lz");
+const u32 gMonPalette_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/normal.gbapal.lz");
+const u32 gMonBackPic_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/back.4bpp.lz");
+const u32 gMonShinyPalette_Machoke[] = INCBIN_U32("graphics/pokemon/machoke/shiny.gbapal.lz");
+const u8 gMonIcon_Machoke[] = INCBIN_U8("graphics/pokemon/machoke/icon.4bpp");
+const u8 gMonFootprint_Machoke[] = INCBIN_U8("graphics/pokemon/machoke/footprint.1bpp");
+
+const u32 gMonFrontPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/front.4bpp.lz");
+const u32 gMonPalette_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/normal.gbapal.lz");
+const u32 gMonBackPic_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/back.4bpp.lz");
+const u32 gMonShinyPalette_Machamp[] = INCBIN_U32("graphics/pokemon/machamp/shiny.gbapal.lz");
+const u8 gMonIcon_Machamp[] = INCBIN_U8("graphics/pokemon/machamp/icon.4bpp");
+const u8 gMonFootprint_Machamp[] = INCBIN_U8("graphics/pokemon/machamp/footprint.1bpp");
+
+const u32 gMonFrontPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/front.4bpp.lz");
+const u32 gMonPalette_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/normal.gbapal.lz");
+const u32 gMonBackPic_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/back.4bpp.lz");
+const u32 gMonShinyPalette_Bellsprout[] = INCBIN_U32("graphics/pokemon/bellsprout/shiny.gbapal.lz");
+const u8 gMonIcon_Bellsprout[] = INCBIN_U8("graphics/pokemon/bellsprout/icon.4bpp");
+const u8 gMonFootprint_Bellsprout[] = INCBIN_U8("graphics/pokemon/bellsprout/footprint.1bpp");
+
+const u32 gMonFrontPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/front.4bpp.lz");
+const u32 gMonPalette_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/normal.gbapal.lz");
+const u32 gMonBackPic_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/back.4bpp.lz");
+const u32 gMonShinyPalette_Weepinbell[] = INCBIN_U32("graphics/pokemon/weepinbell/shiny.gbapal.lz");
+const u8 gMonIcon_Weepinbell[] = INCBIN_U8("graphics/pokemon/weepinbell/icon.4bpp");
+const u8 gMonFootprint_Weepinbell[] = INCBIN_U8("graphics/pokemon/weepinbell/footprint.1bpp");
+
+const u32 gMonFrontPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/front.4bpp.lz");
+const u32 gMonPalette_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/normal.gbapal.lz");
+const u32 gMonBackPic_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/back.4bpp.lz");
+const u32 gMonShinyPalette_Victreebel[] = INCBIN_U32("graphics/pokemon/victreebel/shiny.gbapal.lz");
+const u8 gMonIcon_Victreebel[] = INCBIN_U8("graphics/pokemon/victreebel/icon.4bpp");
+const u8 gMonFootprint_Victreebel[] = INCBIN_U8("graphics/pokemon/victreebel/footprint.1bpp");
+
+const u32 gMonFrontPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/front.4bpp.lz");
+const u32 gMonPalette_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/normal.gbapal.lz");
+const u32 gMonBackPic_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/back.4bpp.lz");
+const u32 gMonShinyPalette_Tentacool[] = INCBIN_U32("graphics/pokemon/tentacool/shiny.gbapal.lz");
+const u8 gMonIcon_Tentacool[] = INCBIN_U8("graphics/pokemon/tentacool/icon.4bpp");
+const u8 gMonFootprint_Tentacool[] = INCBIN_U8("graphics/pokemon/tentacool/footprint.1bpp");
+
+const u32 gMonFrontPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/front.4bpp.lz");
+const u32 gMonPalette_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/normal.gbapal.lz");
+const u32 gMonBackPic_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/back.4bpp.lz");
+const u32 gMonShinyPalette_Tentacruel[] = INCBIN_U32("graphics/pokemon/tentacruel/shiny.gbapal.lz");
+const u8 gMonIcon_Tentacruel[] = INCBIN_U8("graphics/pokemon/tentacruel/icon.4bpp");
+const u8 gMonFootprint_Tentacruel[] = INCBIN_U8("graphics/pokemon/tentacruel/footprint.1bpp");
+
+const u32 gMonFrontPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/front.4bpp.lz");
+const u32 gMonPalette_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/normal.gbapal.lz");
+const u32 gMonBackPic_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/back.4bpp.lz");
+const u32 gMonShinyPalette_Geodude[] = INCBIN_U32("graphics/pokemon/geodude/shiny.gbapal.lz");
+const u8 gMonIcon_Geodude[] = INCBIN_U8("graphics/pokemon/geodude/icon.4bpp");
+const u8 gMonFootprint_Geodude[] = INCBIN_U8("graphics/pokemon/geodude/footprint.1bpp");
+
+const u32 gMonFrontPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/front.4bpp.lz");
+const u32 gMonPalette_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/normal.gbapal.lz");
+const u32 gMonBackPic_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/back.4bpp.lz");
+const u32 gMonShinyPalette_Graveler[] = INCBIN_U32("graphics/pokemon/graveler/shiny.gbapal.lz");
+const u8 gMonIcon_Graveler[] = INCBIN_U8("graphics/pokemon/graveler/icon.4bpp");
+const u8 gMonFootprint_Graveler[] = INCBIN_U8("graphics/pokemon/graveler/footprint.1bpp");
+
+const u32 gMonFrontPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/front.4bpp.lz");
+const u32 gMonPalette_Golem[] = INCBIN_U32("graphics/pokemon/golem/normal.gbapal.lz");
+const u32 gMonBackPic_Golem[] = INCBIN_U32("graphics/pokemon/golem/back.4bpp.lz");
+const u32 gMonShinyPalette_Golem[] = INCBIN_U32("graphics/pokemon/golem/shiny.gbapal.lz");
+const u8 gMonIcon_Golem[] = INCBIN_U8("graphics/pokemon/golem/icon.4bpp");
+const u8 gMonFootprint_Golem[] = INCBIN_U8("graphics/pokemon/golem/footprint.1bpp");
+
+const u32 gMonFrontPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/front.4bpp.lz");
+const u32 gMonPalette_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/normal.gbapal.lz");
+const u32 gMonBackPic_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/back.4bpp.lz");
+const u32 gMonShinyPalette_Ponyta[] = INCBIN_U32("graphics/pokemon/ponyta/shiny.gbapal.lz");
+const u8 gMonIcon_Ponyta[] = INCBIN_U8("graphics/pokemon/ponyta/icon.4bpp");
+const u8 gMonFootprint_Ponyta[] = INCBIN_U8("graphics/pokemon/ponyta/footprint.1bpp");
+
+const u32 gMonFrontPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/front.4bpp.lz");
+const u32 gMonPalette_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/normal.gbapal.lz");
+const u32 gMonBackPic_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/back.4bpp.lz");
+const u32 gMonShinyPalette_Rapidash[] = INCBIN_U32("graphics/pokemon/rapidash/shiny.gbapal.lz");
+const u8 gMonIcon_Rapidash[] = INCBIN_U8("graphics/pokemon/rapidash/icon.4bpp");
+const u8 gMonFootprint_Rapidash[] = INCBIN_U8("graphics/pokemon/rapidash/footprint.1bpp");
+
+const u32 gMonFrontPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/front.4bpp.lz");
+const u32 gMonPalette_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/normal.gbapal.lz");
+const u32 gMonBackPic_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/back.4bpp.lz");
+const u32 gMonShinyPalette_Slowpoke[] = INCBIN_U32("graphics/pokemon/slowpoke/shiny.gbapal.lz");
+const u8 gMonIcon_Slowpoke[] = INCBIN_U8("graphics/pokemon/slowpoke/icon.4bpp");
+const u8 gMonFootprint_Slowpoke[] = INCBIN_U8("graphics/pokemon/slowpoke/footprint.1bpp");
+
+const u32 gMonFrontPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/front.4bpp.lz");
+const u32 gMonPalette_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/normal.gbapal.lz");
+const u32 gMonBackPic_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/back.4bpp.lz");
+const u32 gMonShinyPalette_Slowbro[] = INCBIN_U32("graphics/pokemon/slowbro/shiny.gbapal.lz");
+const u8 gMonIcon_Slowbro[] = INCBIN_U8("graphics/pokemon/slowbro/icon.4bpp");
+const u8 gMonFootprint_Slowbro[] = INCBIN_U8("graphics/pokemon/slowbro/footprint.1bpp");
+
+const u32 gMonFrontPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/front.4bpp.lz");
+const u32 gMonPalette_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/normal.gbapal.lz");
+const u32 gMonBackPic_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/back.4bpp.lz");
+const u32 gMonShinyPalette_Magnemite[] = INCBIN_U32("graphics/pokemon/magnemite/shiny.gbapal.lz");
+const u8 gMonIcon_Magnemite[] = INCBIN_U8("graphics/pokemon/magnemite/icon.4bpp");
+const u8 gMonFootprint_Magnemite[] = INCBIN_U8("graphics/pokemon/magnemite/footprint.1bpp");
+
+const u32 gMonFrontPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/front.4bpp.lz");
+const u32 gMonPalette_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/normal.gbapal.lz");
+const u32 gMonBackPic_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/back.4bpp.lz");
+const u32 gMonShinyPalette_Magneton[] = INCBIN_U32("graphics/pokemon/magneton/shiny.gbapal.lz");
+const u8 gMonIcon_Magneton[] = INCBIN_U8("graphics/pokemon/magneton/icon.4bpp");
+const u8 gMonFootprint_Magneton[] = INCBIN_U8("graphics/pokemon/magneton/footprint.1bpp");
+
+const u32 gMonFrontPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetch_d/front.4bpp.lz");
+const u32 gMonPalette_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetch_d/normal.gbapal.lz");
+const u32 gMonBackPic_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetch_d/back.4bpp.lz");
+const u32 gMonShinyPalette_Farfetchd[] = INCBIN_U32("graphics/pokemon/farfetch_d/shiny.gbapal.lz");
+const u8 gMonIcon_Farfetchd[] = INCBIN_U8("graphics/pokemon/farfetch_d/icon.4bpp");
+const u8 gMonFootprint_Farfetchd[] = INCBIN_U8("graphics/pokemon/farfetch_d/footprint.1bpp");
+
+const u32 gMonFrontPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/front.4bpp.lz");
+const u32 gMonPalette_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/normal.gbapal.lz");
+const u32 gMonBackPic_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/back.4bpp.lz");
+const u32 gMonShinyPalette_Doduo[] = INCBIN_U32("graphics/pokemon/doduo/shiny.gbapal.lz");
+const u8 gMonIcon_Doduo[] = INCBIN_U8("graphics/pokemon/doduo/icon.4bpp");
+const u8 gMonFootprint_Doduo[] = INCBIN_U8("graphics/pokemon/doduo/footprint.1bpp");
+
+const u32 gMonFrontPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/front.4bpp.lz");
+const u32 gMonPalette_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/normal.gbapal.lz");
+const u32 gMonBackPic_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/back.4bpp.lz");
+const u32 gMonShinyPalette_Dodrio[] = INCBIN_U32("graphics/pokemon/dodrio/shiny.gbapal.lz");
+const u8 gMonIcon_Dodrio[] = INCBIN_U8("graphics/pokemon/dodrio/icon.4bpp");
+const u8 gMonFootprint_Dodrio[] = INCBIN_U8("graphics/pokemon/dodrio/footprint.1bpp");
+
+const u32 gMonFrontPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/front.4bpp.lz");
+const u32 gMonPalette_Seel[] = INCBIN_U32("graphics/pokemon/seel/normal.gbapal.lz");
+const u32 gMonBackPic_Seel[] = INCBIN_U32("graphics/pokemon/seel/back.4bpp.lz");
+const u32 gMonShinyPalette_Seel[] = INCBIN_U32("graphics/pokemon/seel/shiny.gbapal.lz");
+const u8 gMonIcon_Seel[] = INCBIN_U8("graphics/pokemon/seel/icon.4bpp");
+const u8 gMonFootprint_Seel[] = INCBIN_U8("graphics/pokemon/seel/footprint.1bpp");
+
+const u32 gMonFrontPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/front.4bpp.lz");
+const u32 gMonPalette_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/normal.gbapal.lz");
+const u32 gMonBackPic_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/back.4bpp.lz");
+const u32 gMonShinyPalette_Dewgong[] = INCBIN_U32("graphics/pokemon/dewgong/shiny.gbapal.lz");
+const u8 gMonIcon_Dewgong[] = INCBIN_U8("graphics/pokemon/dewgong/icon.4bpp");
+const u8 gMonFootprint_Dewgong[] = INCBIN_U8("graphics/pokemon/dewgong/footprint.1bpp");
+
+const u32 gMonFrontPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/front.4bpp.lz");
+const u32 gMonPalette_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/normal.gbapal.lz");
+const u32 gMonBackPic_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/back.4bpp.lz");
+const u32 gMonShinyPalette_Grimer[] = INCBIN_U32("graphics/pokemon/grimer/shiny.gbapal.lz");
+const u8 gMonIcon_Grimer[] = INCBIN_U8("graphics/pokemon/grimer/icon.4bpp");
+const u8 gMonFootprint_Grimer[] = INCBIN_U8("graphics/pokemon/grimer/footprint.1bpp");
+
+const u32 gMonFrontPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/front.4bpp.lz");
+const u32 gMonPalette_Muk[] = INCBIN_U32("graphics/pokemon/muk/normal.gbapal.lz");
+const u32 gMonBackPic_Muk[] = INCBIN_U32("graphics/pokemon/muk/back.4bpp.lz");
+const u32 gMonShinyPalette_Muk[] = INCBIN_U32("graphics/pokemon/muk/shiny.gbapal.lz");
+const u8 gMonIcon_Muk[] = INCBIN_U8("graphics/pokemon/muk/icon.4bpp");
+const u8 gMonFootprint_Muk[] = INCBIN_U8("graphics/pokemon/muk/footprint.1bpp");
+
+const u32 gMonFrontPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/front.4bpp.lz");
+const u32 gMonPalette_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/normal.gbapal.lz");
+const u32 gMonBackPic_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/back.4bpp.lz");
+const u32 gMonShinyPalette_Shellder[] = INCBIN_U32("graphics/pokemon/shellder/shiny.gbapal.lz");
+const u8 gMonIcon_Shellder[] = INCBIN_U8("graphics/pokemon/shellder/icon.4bpp");
+const u8 gMonFootprint_Shellder[] = INCBIN_U8("graphics/pokemon/shellder/footprint.1bpp");
+
+const u32 gMonFrontPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/front.4bpp.lz");
+const u32 gMonPalette_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/normal.gbapal.lz");
+const u32 gMonBackPic_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/back.4bpp.lz");
+const u32 gMonShinyPalette_Cloyster[] = INCBIN_U32("graphics/pokemon/cloyster/shiny.gbapal.lz");
+const u8 gMonIcon_Cloyster[] = INCBIN_U8("graphics/pokemon/cloyster/icon.4bpp");
+const u8 gMonFootprint_Cloyster[] = INCBIN_U8("graphics/pokemon/cloyster/footprint.1bpp");
+
+const u32 gMonFrontPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/front.4bpp.lz");
+const u32 gMonPalette_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/normal.gbapal.lz");
+const u32 gMonBackPic_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/back.4bpp.lz");
+const u32 gMonShinyPalette_Gastly[] = INCBIN_U32("graphics/pokemon/gastly/shiny.gbapal.lz");
+const u8 gMonIcon_Gastly[] = INCBIN_U8("graphics/pokemon/gastly/icon.4bpp");
+const u8 gMonFootprint_Gastly[] = INCBIN_U8("graphics/pokemon/gastly/footprint.1bpp");
+
+const u32 gMonFrontPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/front.4bpp.lz");
+const u32 gMonPalette_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/normal.gbapal.lz");
+const u32 gMonBackPic_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/back.4bpp.lz");
+const u32 gMonShinyPalette_Haunter[] = INCBIN_U32("graphics/pokemon/haunter/shiny.gbapal.lz");
+const u8 gMonIcon_Haunter[] = INCBIN_U8("graphics/pokemon/haunter/icon.4bpp");
+const u8 gMonFootprint_Haunter[] = INCBIN_U8("graphics/pokemon/haunter/footprint.1bpp");
+
+const u32 gMonFrontPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/front.4bpp.lz");
+const u32 gMonPalette_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/normal.gbapal.lz");
+const u32 gMonBackPic_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/back.4bpp.lz");
+const u32 gMonShinyPalette_Gengar[] = INCBIN_U32("graphics/pokemon/gengar/shiny.gbapal.lz");
+const u8 gMonIcon_Gengar[] = INCBIN_U8("graphics/pokemon/gengar/icon.4bpp");
+const u8 gMonFootprint_Gengar[] = INCBIN_U8("graphics/pokemon/gengar/footprint.1bpp");
+
+const u32 gMonFrontPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/front.4bpp.lz");
+const u32 gMonPalette_Onix[] = INCBIN_U32("graphics/pokemon/onix/normal.gbapal.lz");
+const u32 gMonBackPic_Onix[] = INCBIN_U32("graphics/pokemon/onix/back.4bpp.lz");
+const u32 gMonShinyPalette_Onix[] = INCBIN_U32("graphics/pokemon/onix/shiny.gbapal.lz");
+const u8 gMonIcon_Onix[] = INCBIN_U8("graphics/pokemon/onix/icon.4bpp");
+const u8 gMonFootprint_Onix[] = INCBIN_U8("graphics/pokemon/onix/footprint.1bpp");
+
+const u32 gMonFrontPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/front.4bpp.lz");
+const u32 gMonPalette_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/normal.gbapal.lz");
+const u32 gMonBackPic_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/back.4bpp.lz");
+const u32 gMonShinyPalette_Drowzee[] = INCBIN_U32("graphics/pokemon/drowzee/shiny.gbapal.lz");
+const u8 gMonIcon_Drowzee[] = INCBIN_U8("graphics/pokemon/drowzee/icon.4bpp");
+const u8 gMonFootprint_Drowzee[] = INCBIN_U8("graphics/pokemon/drowzee/footprint.1bpp");
+
+const u32 gMonFrontPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/front.4bpp.lz");
+const u32 gMonPalette_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/normal.gbapal.lz");
+const u32 gMonBackPic_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/back.4bpp.lz");
+const u32 gMonShinyPalette_Hypno[] = INCBIN_U32("graphics/pokemon/hypno/shiny.gbapal.lz");
+const u8 gMonIcon_Hypno[] = INCBIN_U8("graphics/pokemon/hypno/icon.4bpp");
+const u8 gMonFootprint_Hypno[] = INCBIN_U8("graphics/pokemon/hypno/footprint.1bpp");
+
+const u32 gMonFrontPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/front.4bpp.lz");
+const u32 gMonPalette_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/normal.gbapal.lz");
+const u32 gMonBackPic_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/back.4bpp.lz");
+const u32 gMonShinyPalette_Krabby[] = INCBIN_U32("graphics/pokemon/krabby/shiny.gbapal.lz");
+const u8 gMonIcon_Krabby[] = INCBIN_U8("graphics/pokemon/krabby/icon.4bpp");
+const u8 gMonFootprint_Krabby[] = INCBIN_U8("graphics/pokemon/krabby/footprint.1bpp");
+
+const u32 gMonFrontPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/front.4bpp.lz");
+const u32 gMonPalette_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/normal.gbapal.lz");
+const u32 gMonBackPic_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/back.4bpp.lz");
+const u32 gMonShinyPalette_Kingler[] = INCBIN_U32("graphics/pokemon/kingler/shiny.gbapal.lz");
+const u8 gMonIcon_Kingler[] = INCBIN_U8("graphics/pokemon/kingler/icon.4bpp");
+const u8 gMonFootprint_Kingler[] = INCBIN_U8("graphics/pokemon/kingler/footprint.1bpp");
+
+const u32 gMonFrontPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/front.4bpp.lz");
+const u32 gMonPalette_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/normal.gbapal.lz");
+const u32 gMonBackPic_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/back.4bpp.lz");
+const u32 gMonShinyPalette_Voltorb[] = INCBIN_U32("graphics/pokemon/voltorb/shiny.gbapal.lz");
+const u8 gMonIcon_Voltorb[] = INCBIN_U8("graphics/pokemon/voltorb/icon.4bpp");
+const u8 gMonFootprint_Voltorb[] = INCBIN_U8("graphics/pokemon/voltorb/footprint.1bpp");
+
+const u32 gMonFrontPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/front.4bpp.lz");
+const u32 gMonPalette_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/normal.gbapal.lz");
+const u32 gMonBackPic_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/back.4bpp.lz");
+const u32 gMonShinyPalette_Electrode[] = INCBIN_U32("graphics/pokemon/electrode/shiny.gbapal.lz");
+const u8 gMonIcon_Electrode[] = INCBIN_U8("graphics/pokemon/electrode/icon.4bpp");
+const u8 gMonFootprint_Electrode[] = INCBIN_U8("graphics/pokemon/electrode/footprint.1bpp");
+
+const u32 gMonFrontPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/front.4bpp.lz");
+const u32 gMonPalette_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/normal.gbapal.lz");
+const u32 gMonBackPic_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/back.4bpp.lz");
+const u32 gMonShinyPalette_Exeggcute[] = INCBIN_U32("graphics/pokemon/exeggcute/shiny.gbapal.lz");
+const u8 gMonIcon_Exeggcute[] = INCBIN_U8("graphics/pokemon/exeggcute/icon.4bpp");
+const u8 gMonFootprint_Exeggcute[] = INCBIN_U8("graphics/pokemon/exeggcute/footprint.1bpp");
+
+const u32 gMonFrontPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/front.4bpp.lz");
+const u32 gMonPalette_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/normal.gbapal.lz");
+const u32 gMonBackPic_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/back.4bpp.lz");
+const u32 gMonShinyPalette_Exeggutor[] = INCBIN_U32("graphics/pokemon/exeggutor/shiny.gbapal.lz");
+const u8 gMonIcon_Exeggutor[] = INCBIN_U8("graphics/pokemon/exeggutor/icon.4bpp");
+const u8 gMonFootprint_Exeggutor[] = INCBIN_U8("graphics/pokemon/exeggutor/footprint.1bpp");
+
+const u32 gMonFrontPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/front.4bpp.lz");
+const u32 gMonPalette_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/normal.gbapal.lz");
+const u32 gMonBackPic_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/back.4bpp.lz");
+const u32 gMonShinyPalette_Cubone[] = INCBIN_U32("graphics/pokemon/cubone/shiny.gbapal.lz");
+const u8 gMonIcon_Cubone[] = INCBIN_U8("graphics/pokemon/cubone/icon.4bpp");
+const u8 gMonFootprint_Cubone[] = INCBIN_U8("graphics/pokemon/cubone/footprint.1bpp");
+
+const u32 gMonFrontPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/front.4bpp.lz");
+const u32 gMonPalette_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/normal.gbapal.lz");
+const u32 gMonBackPic_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/back.4bpp.lz");
+const u32 gMonShinyPalette_Marowak[] = INCBIN_U32("graphics/pokemon/marowak/shiny.gbapal.lz");
+const u8 gMonIcon_Marowak[] = INCBIN_U8("graphics/pokemon/marowak/icon.4bpp");
+const u8 gMonFootprint_Marowak[] = INCBIN_U8("graphics/pokemon/marowak/footprint.1bpp");
+
+const u32 gMonFrontPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/front.4bpp.lz");
+const u32 gMonPalette_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/normal.gbapal.lz");
+const u32 gMonBackPic_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/back.4bpp.lz");
+const u32 gMonShinyPalette_Hitmonlee[] = INCBIN_U32("graphics/pokemon/hitmonlee/shiny.gbapal.lz");
+const u8 gMonIcon_Hitmonlee[] = INCBIN_U8("graphics/pokemon/hitmonlee/icon.4bpp");
+const u8 gMonFootprint_Hitmonlee[] = INCBIN_U8("graphics/pokemon/hitmonlee/footprint.1bpp");
+
+const u32 gMonFrontPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/front.4bpp.lz");
+const u32 gMonPalette_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/normal.gbapal.lz");
+const u32 gMonBackPic_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/back.4bpp.lz");
+const u32 gMonShinyPalette_Hitmonchan[] = INCBIN_U32("graphics/pokemon/hitmonchan/shiny.gbapal.lz");
+const u8 gMonIcon_Hitmonchan[] = INCBIN_U8("graphics/pokemon/hitmonchan/icon.4bpp");
+const u8 gMonFootprint_Hitmonchan[] = INCBIN_U8("graphics/pokemon/hitmonchan/footprint.1bpp");
+
+const u32 gMonFrontPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/front.4bpp.lz");
+const u32 gMonPalette_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/normal.gbapal.lz");
+const u32 gMonBackPic_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/back.4bpp.lz");
+const u32 gMonShinyPalette_Lickitung[] = INCBIN_U32("graphics/pokemon/lickitung/shiny.gbapal.lz");
+const u8 gMonIcon_Lickitung[] = INCBIN_U8("graphics/pokemon/lickitung/icon.4bpp");
+const u8 gMonFootprint_Lickitung[] = INCBIN_U8("graphics/pokemon/lickitung/footprint.1bpp");
+
+const u32 gMonFrontPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/front.4bpp.lz");
+const u32 gMonPalette_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/normal.gbapal.lz");
+const u32 gMonBackPic_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/back.4bpp.lz");
+const u32 gMonShinyPalette_Koffing[] = INCBIN_U32("graphics/pokemon/koffing/shiny.gbapal.lz");
+const u8 gMonIcon_Koffing[] = INCBIN_U8("graphics/pokemon/koffing/icon.4bpp");
+const u8 gMonFootprint_Koffing[] = INCBIN_U8("graphics/pokemon/koffing/footprint.1bpp");
+
+const u32 gMonFrontPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/front.4bpp.lz");
+const u32 gMonPalette_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/normal.gbapal.lz");
+const u32 gMonBackPic_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/back.4bpp.lz");
+const u32 gMonShinyPalette_Weezing[] = INCBIN_U32("graphics/pokemon/weezing/shiny.gbapal.lz");
+const u8 gMonIcon_Weezing[] = INCBIN_U8("graphics/pokemon/weezing/icon.4bpp");
+const u8 gMonFootprint_Weezing[] = INCBIN_U8("graphics/pokemon/weezing/footprint.1bpp");
+
+const u32 gMonFrontPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/front.4bpp.lz");
+const u32 gMonPalette_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/normal.gbapal.lz");
+const u32 gMonBackPic_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/back.4bpp.lz");
+const u32 gMonShinyPalette_Rhyhorn[] = INCBIN_U32("graphics/pokemon/rhyhorn/shiny.gbapal.lz");
+const u8 gMonIcon_Rhyhorn[] = INCBIN_U8("graphics/pokemon/rhyhorn/icon.4bpp");
+const u8 gMonFootprint_Rhyhorn[] = INCBIN_U8("graphics/pokemon/rhyhorn/footprint.1bpp");
+
+const u32 gMonFrontPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/front.4bpp.lz");
+const u32 gMonPalette_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/normal.gbapal.lz");
+const u32 gMonBackPic_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/back.4bpp.lz");
+const u32 gMonShinyPalette_Rhydon[] = INCBIN_U32("graphics/pokemon/rhydon/shiny.gbapal.lz");
+const u8 gMonIcon_Rhydon[] = INCBIN_U8("graphics/pokemon/rhydon/icon.4bpp");
+const u8 gMonFootprint_Rhydon[] = INCBIN_U8("graphics/pokemon/rhydon/footprint.1bpp");
+
+const u32 gMonFrontPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/front.4bpp.lz");
+const u32 gMonPalette_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/normal.gbapal.lz");
+const u32 gMonBackPic_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/back.4bpp.lz");
+const u32 gMonShinyPalette_Chansey[] = INCBIN_U32("graphics/pokemon/chansey/shiny.gbapal.lz");
+const u8 gMonIcon_Chansey[] = INCBIN_U8("graphics/pokemon/chansey/icon.4bpp");
+const u8 gMonFootprint_Chansey[] = INCBIN_U8("graphics/pokemon/chansey/footprint.1bpp");
+
+const u32 gMonFrontPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/front.4bpp.lz");
+const u32 gMonPalette_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/normal.gbapal.lz");
+const u32 gMonBackPic_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/back.4bpp.lz");
+const u32 gMonShinyPalette_Tangela[] = INCBIN_U32("graphics/pokemon/tangela/shiny.gbapal.lz");
+const u8 gMonIcon_Tangela[] = INCBIN_U8("graphics/pokemon/tangela/icon.4bpp");
+const u8 gMonFootprint_Tangela[] = INCBIN_U8("graphics/pokemon/tangela/footprint.1bpp");
+
+const u32 gMonFrontPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/front.4bpp.lz");
+const u32 gMonPalette_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/normal.gbapal.lz");
+const u32 gMonBackPic_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/back.4bpp.lz");
+const u32 gMonShinyPalette_Kangaskhan[] = INCBIN_U32("graphics/pokemon/kangaskhan/shiny.gbapal.lz");
+const u8 gMonIcon_Kangaskhan[] = INCBIN_U8("graphics/pokemon/kangaskhan/icon.4bpp");
+const u8 gMonFootprint_Kangaskhan[] = INCBIN_U8("graphics/pokemon/kangaskhan/footprint.1bpp");
+
+const u32 gMonFrontPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/front.4bpp.lz");
+const u32 gMonPalette_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/normal.gbapal.lz");
+const u32 gMonBackPic_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/back.4bpp.lz");
+const u32 gMonShinyPalette_Horsea[] = INCBIN_U32("graphics/pokemon/horsea/shiny.gbapal.lz");
+const u8 gMonIcon_Horsea[] = INCBIN_U8("graphics/pokemon/horsea/icon.4bpp");
+const u8 gMonFootprint_Horsea[] = INCBIN_U8("graphics/pokemon/horsea/footprint.1bpp");
+
+const u32 gMonFrontPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/front.4bpp.lz");
+const u32 gMonPalette_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/normal.gbapal.lz");
+const u32 gMonBackPic_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/back.4bpp.lz");
+const u32 gMonShinyPalette_Seadra[] = INCBIN_U32("graphics/pokemon/seadra/shiny.gbapal.lz");
+const u8 gMonIcon_Seadra[] = INCBIN_U8("graphics/pokemon/seadra/icon.4bpp");
+const u8 gMonFootprint_Seadra[] = INCBIN_U8("graphics/pokemon/seadra/footprint.1bpp");
+
+const u32 gMonFrontPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/front.4bpp.lz");
+const u32 gMonPalette_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/normal.gbapal.lz");
+const u32 gMonBackPic_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/back.4bpp.lz");
+const u32 gMonShinyPalette_Goldeen[] = INCBIN_U32("graphics/pokemon/goldeen/shiny.gbapal.lz");
+const u8 gMonIcon_Goldeen[] = INCBIN_U8("graphics/pokemon/goldeen/icon.4bpp");
+const u8 gMonFootprint_Goldeen[] = INCBIN_U8("graphics/pokemon/goldeen/footprint.1bpp");
+
+const u32 gMonFrontPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/front.4bpp.lz");
+const u32 gMonPalette_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/normal.gbapal.lz");
+const u32 gMonBackPic_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/back.4bpp.lz");
+const u32 gMonShinyPalette_Seaking[] = INCBIN_U32("graphics/pokemon/seaking/shiny.gbapal.lz");
+const u8 gMonIcon_Seaking[] = INCBIN_U8("graphics/pokemon/seaking/icon.4bpp");
+const u8 gMonFootprint_Seaking[] = INCBIN_U8("graphics/pokemon/seaking/footprint.1bpp");
+
+const u32 gMonFrontPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/front.4bpp.lz");
+const u32 gMonPalette_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/normal.gbapal.lz");
+const u32 gMonBackPic_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/back.4bpp.lz");
+const u32 gMonShinyPalette_Staryu[] = INCBIN_U32("graphics/pokemon/staryu/shiny.gbapal.lz");
+const u8 gMonIcon_Staryu[] = INCBIN_U8("graphics/pokemon/staryu/icon.4bpp");
+const u8 gMonFootprint_Staryu[] = INCBIN_U8("graphics/pokemon/staryu/footprint.1bpp");
+
+const u32 gMonFrontPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/front.4bpp.lz");
+const u32 gMonPalette_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/normal.gbapal.lz");
+const u32 gMonBackPic_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/back.4bpp.lz");
+const u32 gMonShinyPalette_Starmie[] = INCBIN_U32("graphics/pokemon/starmie/shiny.gbapal.lz");
+const u8 gMonIcon_Starmie[] = INCBIN_U8("graphics/pokemon/starmie/icon.4bpp");
+const u8 gMonFootprint_Starmie[] = INCBIN_U8("graphics/pokemon/starmie/footprint.1bpp");
+
+const u32 gMonFrontPic_Mrmime[] = INCBIN_U32("graphics/pokemon/mr_mime/front.4bpp.lz");
+const u32 gMonPalette_Mrmime[] = INCBIN_U32("graphics/pokemon/mr_mime/normal.gbapal.lz");
+const u32 gMonBackPic_Mrmime[] = INCBIN_U32("graphics/pokemon/mr_mime/back.4bpp.lz");
+const u32 gMonShinyPalette_Mrmime[] = INCBIN_U32("graphics/pokemon/mr_mime/shiny.gbapal.lz");
+const u8 gMonIcon_Mrmime[] = INCBIN_U8("graphics/pokemon/mr_mime/icon.4bpp");
+const u8 gMonFootprint_Mrmime[] = INCBIN_U8("graphics/pokemon/mr_mime/footprint.1bpp");
+
+const u32 gMonFrontPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/front.4bpp.lz");
+const u32 gMonPalette_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/normal.gbapal.lz");
+const u32 gMonBackPic_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/back.4bpp.lz");
+const u32 gMonShinyPalette_Scyther[] = INCBIN_U32("graphics/pokemon/scyther/shiny.gbapal.lz");
+const u8 gMonIcon_Scyther[] = INCBIN_U8("graphics/pokemon/scyther/icon.4bpp");
+const u8 gMonFootprint_Scyther[] = INCBIN_U8("graphics/pokemon/scyther/footprint.1bpp");
+
+const u32 gMonFrontPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/front.4bpp.lz");
+const u32 gMonPalette_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/normal.gbapal.lz");
+const u32 gMonBackPic_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/back.4bpp.lz");
+const u32 gMonShinyPalette_Jynx[] = INCBIN_U32("graphics/pokemon/jynx/shiny.gbapal.lz");
+const u8 gMonIcon_Jynx[] = INCBIN_U8("graphics/pokemon/jynx/icon.4bpp");
+const u8 gMonFootprint_Jynx[] = INCBIN_U8("graphics/pokemon/jynx/footprint.1bpp");
+
+const u32 gMonFrontPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/front.4bpp.lz");
+const u32 gMonPalette_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/normal.gbapal.lz");
+const u32 gMonBackPic_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/back.4bpp.lz");
+const u32 gMonShinyPalette_Electabuzz[] = INCBIN_U32("graphics/pokemon/electabuzz/shiny.gbapal.lz");
+const u8 gMonIcon_Electabuzz[] = INCBIN_U8("graphics/pokemon/electabuzz/icon.4bpp");
+const u8 gMonFootprint_Electabuzz[] = INCBIN_U8("graphics/pokemon/electabuzz/footprint.1bpp");
+
+const u32 gMonFrontPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/front.4bpp.lz");
+const u32 gMonPalette_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/normal.gbapal.lz");
+const u32 gMonBackPic_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/back.4bpp.lz");
+const u32 gMonShinyPalette_Magmar[] = INCBIN_U32("graphics/pokemon/magmar/shiny.gbapal.lz");
+const u8 gMonIcon_Magmar[] = INCBIN_U8("graphics/pokemon/magmar/icon.4bpp");
+const u8 gMonFootprint_Magmar[] = INCBIN_U8("graphics/pokemon/magmar/footprint.1bpp");
+
+const u32 gMonFrontPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/front.4bpp.lz");
+const u32 gMonPalette_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/normal.gbapal.lz");
+const u32 gMonBackPic_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/back.4bpp.lz");
+const u32 gMonShinyPalette_Pinsir[] = INCBIN_U32("graphics/pokemon/pinsir/shiny.gbapal.lz");
+const u8 gMonIcon_Pinsir[] = INCBIN_U8("graphics/pokemon/pinsir/icon.4bpp");
+const u8 gMonFootprint_Pinsir[] = INCBIN_U8("graphics/pokemon/pinsir/footprint.1bpp");
+
+const u32 gMonFrontPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/front.4bpp.lz");
+const u32 gMonPalette_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/normal.gbapal.lz");
+const u32 gMonBackPic_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/back.4bpp.lz");
+const u32 gMonShinyPalette_Tauros[] = INCBIN_U32("graphics/pokemon/tauros/shiny.gbapal.lz");
+const u8 gMonIcon_Tauros[] = INCBIN_U8("graphics/pokemon/tauros/icon.4bpp");
+const u8 gMonFootprint_Tauros[] = INCBIN_U8("graphics/pokemon/tauros/footprint.1bpp");
+
+const u32 gMonFrontPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/front.4bpp.lz");
+const u32 gMonPalette_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/normal.gbapal.lz");
+const u32 gMonBackPic_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/back.4bpp.lz");
+const u32 gMonShinyPalette_Magikarp[] = INCBIN_U32("graphics/pokemon/magikarp/shiny.gbapal.lz");
+const u8 gMonIcon_Magikarp[] = INCBIN_U8("graphics/pokemon/magikarp/icon.4bpp");
+const u8 gMonFootprint_Magikarp[] = INCBIN_U8("graphics/pokemon/magikarp/footprint.1bpp");
+
+const u32 gMonFrontPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/front.4bpp.lz");
+const u32 gMonPalette_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/normal.gbapal.lz");
+const u32 gMonBackPic_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/back.4bpp.lz");
+const u32 gMonShinyPalette_Gyarados[] = INCBIN_U32("graphics/pokemon/gyarados/shiny.gbapal.lz");
+const u8 gMonIcon_Gyarados[] = INCBIN_U8("graphics/pokemon/gyarados/icon.4bpp");
+const u8 gMonFootprint_Gyarados[] = INCBIN_U8("graphics/pokemon/gyarados/footprint.1bpp");
+
+const u32 gMonFrontPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/front.4bpp.lz");
+const u32 gMonPalette_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/normal.gbapal.lz");
+const u32 gMonBackPic_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/back.4bpp.lz");
+const u32 gMonShinyPalette_Lapras[] = INCBIN_U32("graphics/pokemon/lapras/shiny.gbapal.lz");
+const u8 gMonIcon_Lapras[] = INCBIN_U8("graphics/pokemon/lapras/icon.4bpp");
+const u8 gMonFootprint_Lapras[] = INCBIN_U8("graphics/pokemon/lapras/footprint.1bpp");
+
+const u32 gMonFrontPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/front.4bpp.lz");
+const u32 gMonPalette_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/normal.gbapal.lz");
+const u32 gMonBackPic_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/back.4bpp.lz");
+const u32 gMonShinyPalette_Ditto[] = INCBIN_U32("graphics/pokemon/ditto/shiny.gbapal.lz");
+const u8 gMonIcon_Ditto[] = INCBIN_U8("graphics/pokemon/ditto/icon.4bpp");
+const u8 gMonFootprint_Ditto[] = INCBIN_U8("graphics/pokemon/ditto/footprint.1bpp");
+
+const u32 gMonFrontPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/front.4bpp.lz");
+const u32 gMonPalette_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/normal.gbapal.lz");
+const u32 gMonBackPic_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/back.4bpp.lz");
+const u32 gMonShinyPalette_Eevee[] = INCBIN_U32("graphics/pokemon/eevee/shiny.gbapal.lz");
+const u8 gMonIcon_Eevee[] = INCBIN_U8("graphics/pokemon/eevee/icon.4bpp");
+const u8 gMonFootprint_Eevee[] = INCBIN_U8("graphics/pokemon/eevee/footprint.1bpp");
+
+const u32 gMonFrontPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/front.4bpp.lz");
+const u32 gMonPalette_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/normal.gbapal.lz");
+const u32 gMonBackPic_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/back.4bpp.lz");
+const u32 gMonShinyPalette_Vaporeon[] = INCBIN_U32("graphics/pokemon/vaporeon/shiny.gbapal.lz");
+const u8 gMonIcon_Vaporeon[] = INCBIN_U8("graphics/pokemon/vaporeon/icon.4bpp");
+const u8 gMonFootprint_Vaporeon[] = INCBIN_U8("graphics/pokemon/vaporeon/footprint.1bpp");
+
+const u32 gMonFrontPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/front.4bpp.lz");
+const u32 gMonPalette_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/normal.gbapal.lz");
+const u32 gMonBackPic_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/back.4bpp.lz");
+const u32 gMonShinyPalette_Jolteon[] = INCBIN_U32("graphics/pokemon/jolteon/shiny.gbapal.lz");
+const u8 gMonIcon_Jolteon[] = INCBIN_U8("graphics/pokemon/jolteon/icon.4bpp");
+const u8 gMonFootprint_Jolteon[] = INCBIN_U8("graphics/pokemon/jolteon/footprint.1bpp");
+
+const u32 gMonFrontPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/front.4bpp.lz");
+const u32 gMonPalette_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/normal.gbapal.lz");
+const u32 gMonBackPic_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/back.4bpp.lz");
+const u32 gMonShinyPalette_Flareon[] = INCBIN_U32("graphics/pokemon/flareon/shiny.gbapal.lz");
+const u8 gMonIcon_Flareon[] = INCBIN_U8("graphics/pokemon/flareon/icon.4bpp");
+const u8 gMonFootprint_Flareon[] = INCBIN_U8("graphics/pokemon/flareon/footprint.1bpp");
+
+const u32 gMonFrontPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/front.4bpp.lz");
+const u32 gMonPalette_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/normal.gbapal.lz");
+const u32 gMonBackPic_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/back.4bpp.lz");
+const u32 gMonShinyPalette_Porygon[] = INCBIN_U32("graphics/pokemon/porygon/shiny.gbapal.lz");
+const u8 gMonIcon_Porygon[] = INCBIN_U8("graphics/pokemon/porygon/icon.4bpp");
+const u8 gMonFootprint_Porygon[] = INCBIN_U8("graphics/pokemon/porygon/footprint.1bpp");
+
+const u32 gMonFrontPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/front.4bpp.lz");
+const u32 gMonPalette_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/normal.gbapal.lz");
+const u32 gMonBackPic_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/back.4bpp.lz");
+const u32 gMonShinyPalette_Omanyte[] = INCBIN_U32("graphics/pokemon/omanyte/shiny.gbapal.lz");
+const u8 gMonIcon_Omanyte[] = INCBIN_U8("graphics/pokemon/omanyte/icon.4bpp");
+const u8 gMonFootprint_Omanyte[] = INCBIN_U8("graphics/pokemon/omanyte/footprint.1bpp");
+
+const u32 gMonFrontPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/front.4bpp.lz");
+const u32 gMonPalette_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/normal.gbapal.lz");
+const u32 gMonBackPic_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/back.4bpp.lz");
+const u32 gMonShinyPalette_Omastar[] = INCBIN_U32("graphics/pokemon/omastar/shiny.gbapal.lz");
+const u8 gMonIcon_Omastar[] = INCBIN_U8("graphics/pokemon/omastar/icon.4bpp");
+const u8 gMonFootprint_Omastar[] = INCBIN_U8("graphics/pokemon/omastar/footprint.1bpp");
+
+const u32 gMonFrontPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/front.4bpp.lz");
+const u32 gMonPalette_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/normal.gbapal.lz");
+const u32 gMonBackPic_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/back.4bpp.lz");
+const u32 gMonShinyPalette_Kabuto[] = INCBIN_U32("graphics/pokemon/kabuto/shiny.gbapal.lz");
+const u8 gMonIcon_Kabuto[] = INCBIN_U8("graphics/pokemon/kabuto/icon.4bpp");
+const u8 gMonFootprint_Kabuto[] = INCBIN_U8("graphics/pokemon/kabuto/footprint.1bpp");
+
+const u32 gMonFrontPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/front.4bpp.lz");
+const u32 gMonPalette_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/normal.gbapal.lz");
+const u32 gMonBackPic_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/back.4bpp.lz");
+const u32 gMonShinyPalette_Kabutops[] = INCBIN_U32("graphics/pokemon/kabutops/shiny.gbapal.lz");
+const u8 gMonIcon_Kabutops[] = INCBIN_U8("graphics/pokemon/kabutops/icon.4bpp");
+const u8 gMonFootprint_Kabutops[] = INCBIN_U8("graphics/pokemon/kabutops/footprint.1bpp");
+
+const u32 gMonFrontPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/front.4bpp.lz");
+const u32 gMonPalette_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/normal.gbapal.lz");
+const u32 gMonBackPic_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/back.4bpp.lz");
+const u32 gMonShinyPalette_Aerodactyl[] = INCBIN_U32("graphics/pokemon/aerodactyl/shiny.gbapal.lz");
+const u8 gMonIcon_Aerodactyl[] = INCBIN_U8("graphics/pokemon/aerodactyl/icon.4bpp");
+const u8 gMonFootprint_Aerodactyl[] = INCBIN_U8("graphics/pokemon/aerodactyl/footprint.1bpp");
+
+const u32 gMonFrontPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/front.4bpp.lz");
+const u32 gMonPalette_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/normal.gbapal.lz");
+const u32 gMonBackPic_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/back.4bpp.lz");
+const u32 gMonShinyPalette_Snorlax[] = INCBIN_U32("graphics/pokemon/snorlax/shiny.gbapal.lz");
+const u8 gMonIcon_Snorlax[] = INCBIN_U8("graphics/pokemon/snorlax/icon.4bpp");
+const u8 gMonFootprint_Snorlax[] = INCBIN_U8("graphics/pokemon/snorlax/footprint.1bpp");
+
+const u32 gMonFrontPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/front.4bpp.lz");
+const u32 gMonPalette_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/normal.gbapal.lz");
+const u32 gMonBackPic_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/back.4bpp.lz");
+const u32 gMonShinyPalette_Articuno[] = INCBIN_U32("graphics/pokemon/articuno/shiny.gbapal.lz");
+const u8 gMonIcon_Articuno[] = INCBIN_U8("graphics/pokemon/articuno/icon.4bpp");
+const u8 gMonFootprint_Articuno[] = INCBIN_U8("graphics/pokemon/articuno/footprint.1bpp");
+
+const u32 gMonFrontPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/front.4bpp.lz");
+const u32 gMonPalette_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/normal.gbapal.lz");
+const u32 gMonBackPic_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/back.4bpp.lz");
+const u32 gMonShinyPalette_Zapdos[] = INCBIN_U32("graphics/pokemon/zapdos/shiny.gbapal.lz");
+const u8 gMonIcon_Zapdos[] = INCBIN_U8("graphics/pokemon/zapdos/icon.4bpp");
+const u8 gMonFootprint_Zapdos[] = INCBIN_U8("graphics/pokemon/zapdos/footprint.1bpp");
+
+const u32 gMonFrontPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/front.4bpp.lz");
+const u32 gMonPalette_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/normal.gbapal.lz");
+const u32 gMonBackPic_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/back.4bpp.lz");
+const u32 gMonShinyPalette_Moltres[] = INCBIN_U32("graphics/pokemon/moltres/shiny.gbapal.lz");
+const u8 gMonIcon_Moltres[] = INCBIN_U8("graphics/pokemon/moltres/icon.4bpp");
+const u8 gMonFootprint_Moltres[] = INCBIN_U8("graphics/pokemon/moltres/footprint.1bpp");
+
+const u32 gMonFrontPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/front.4bpp.lz");
+const u32 gMonPalette_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/normal.gbapal.lz");
+const u32 gMonBackPic_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/back.4bpp.lz");
+const u32 gMonShinyPalette_Dratini[] = INCBIN_U32("graphics/pokemon/dratini/shiny.gbapal.lz");
+const u8 gMonIcon_Dratini[] = INCBIN_U8("graphics/pokemon/dratini/icon.4bpp");
+const u8 gMonFootprint_Dratini[] = INCBIN_U8("graphics/pokemon/dratini/footprint.1bpp");
+
+const u32 gMonFrontPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/front.4bpp.lz");
+const u32 gMonPalette_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/normal.gbapal.lz");
+const u32 gMonBackPic_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/back.4bpp.lz");
+const u32 gMonShinyPalette_Dragonair[] = INCBIN_U32("graphics/pokemon/dragonair/shiny.gbapal.lz");
+const u8 gMonIcon_Dragonair[] = INCBIN_U8("graphics/pokemon/dragonair/icon.4bpp");
+const u8 gMonFootprint_Dragonair[] = INCBIN_U8("graphics/pokemon/dragonair/footprint.1bpp");
+
+const u32 gMonFrontPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/front.4bpp.lz");
+const u32 gMonPalette_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/normal.gbapal.lz");
+const u32 gMonBackPic_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/back.4bpp.lz");
+const u32 gMonShinyPalette_Dragonite[] = INCBIN_U32("graphics/pokemon/dragonite/shiny.gbapal.lz");
+const u8 gMonIcon_Dragonite[] = INCBIN_U8("graphics/pokemon/dragonite/icon.4bpp");
+const u8 gMonFootprint_Dragonite[] = INCBIN_U8("graphics/pokemon/dragonite/footprint.1bpp");
+
+const u32 gMonFrontPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/front.4bpp.lz");
+const u32 gMonPalette_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/normal.gbapal.lz");
+const u32 gMonBackPic_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/back.4bpp.lz");
+const u32 gMonShinyPalette_Mewtwo[] = INCBIN_U32("graphics/pokemon/mewtwo/shiny.gbapal.lz");
+const u8 gMonIcon_Mewtwo[] = INCBIN_U8("graphics/pokemon/mewtwo/icon.4bpp");
+const u8 gMonFootprint_Mewtwo[] = INCBIN_U8("graphics/pokemon/mewtwo/footprint.1bpp");
+
+const u32 gMonFrontPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/front.4bpp.lz");
+const u32 gMonPalette_Mew[] = INCBIN_U32("graphics/pokemon/mew/normal.gbapal.lz");
+const u32 gMonBackPic_Mew[] = INCBIN_U32("graphics/pokemon/mew/back.4bpp.lz");
+const u32 gMonShinyPalette_Mew[] = INCBIN_U32("graphics/pokemon/mew/shiny.gbapal.lz");
+const u8 gMonIcon_Mew[] = INCBIN_U8("graphics/pokemon/mew/icon.4bpp");
+const u8 gMonFootprint_Mew[] = INCBIN_U8("graphics/pokemon/mew/footprint.1bpp");
+
+const u32 gMonFrontPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/front.4bpp.lz");
+const u32 gMonPalette_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/normal.gbapal.lz");
+const u32 gMonBackPic_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/back.4bpp.lz");
+const u32 gMonShinyPalette_Chikorita[] = INCBIN_U32("graphics/pokemon/chikorita/shiny.gbapal.lz");
+const u8 gMonIcon_Chikorita[] = INCBIN_U8("graphics/pokemon/chikorita/icon.4bpp");
+const u8 gMonFootprint_Chikorita[] = INCBIN_U8("graphics/pokemon/chikorita/footprint.1bpp");
+
+const u32 gMonFrontPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/front.4bpp.lz");
+const u32 gMonPalette_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/normal.gbapal.lz");
+const u32 gMonBackPic_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/back.4bpp.lz");
+const u32 gMonShinyPalette_Bayleef[] = INCBIN_U32("graphics/pokemon/bayleef/shiny.gbapal.lz");
+const u8 gMonIcon_Bayleef[] = INCBIN_U8("graphics/pokemon/bayleef/icon.4bpp");
+const u8 gMonFootprint_Bayleef[] = INCBIN_U8("graphics/pokemon/bayleef/footprint.1bpp");
+
+const u32 gMonFrontPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/front.4bpp.lz");
+const u32 gMonPalette_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/normal.gbapal.lz");
+const u32 gMonBackPic_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/back.4bpp.lz");
+const u32 gMonShinyPalette_Meganium[] = INCBIN_U32("graphics/pokemon/meganium/shiny.gbapal.lz");
+const u8 gMonIcon_Meganium[] = INCBIN_U8("graphics/pokemon/meganium/icon.4bpp");
+const u8 gMonFootprint_Meganium[] = INCBIN_U8("graphics/pokemon/meganium/footprint.1bpp");
+
+const u32 gMonFrontPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/front.4bpp.lz");
+const u32 gMonPalette_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/normal.gbapal.lz");
+const u32 gMonBackPic_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/back.4bpp.lz");
+const u32 gMonShinyPalette_Cyndaquil[] = INCBIN_U32("graphics/pokemon/cyndaquil/shiny.gbapal.lz");
+const u8 gMonIcon_Cyndaquil[] = INCBIN_U8("graphics/pokemon/cyndaquil/icon.4bpp");
+const u8 gMonFootprint_Cyndaquil[] = INCBIN_U8("graphics/pokemon/cyndaquil/footprint.1bpp");
+
+const u32 gMonFrontPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/front.4bpp.lz");
+const u32 gMonPalette_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/normal.gbapal.lz");
+const u32 gMonBackPic_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/back.4bpp.lz");
+const u32 gMonShinyPalette_Quilava[] = INCBIN_U32("graphics/pokemon/quilava/shiny.gbapal.lz");
+const u8 gMonIcon_Quilava[] = INCBIN_U8("graphics/pokemon/quilava/icon.4bpp");
+const u8 gMonFootprint_Quilava[] = INCBIN_U8("graphics/pokemon/quilava/footprint.1bpp");
+
+const u32 gMonFrontPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/front.4bpp.lz");
+const u32 gMonPalette_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/normal.gbapal.lz");
+const u32 gMonBackPic_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/back.4bpp.lz");
+const u32 gMonShinyPalette_Typhlosion[] = INCBIN_U32("graphics/pokemon/typhlosion/shiny.gbapal.lz");
+const u8 gMonIcon_Typhlosion[] = INCBIN_U8("graphics/pokemon/typhlosion/icon.4bpp");
+const u8 gMonFootprint_Typhlosion[] = INCBIN_U8("graphics/pokemon/typhlosion/footprint.1bpp");
+
+const u32 gMonFrontPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/front.4bpp.lz");
+const u32 gMonPalette_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/normal.gbapal.lz");
+const u32 gMonBackPic_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/back.4bpp.lz");
+const u32 gMonShinyPalette_Totodile[] = INCBIN_U32("graphics/pokemon/totodile/shiny.gbapal.lz");
+const u8 gMonIcon_Totodile[] = INCBIN_U8("graphics/pokemon/totodile/icon.4bpp");
+const u8 gMonFootprint_Totodile[] = INCBIN_U8("graphics/pokemon/totodile/footprint.1bpp");
+
+const u32 gMonFrontPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/front.4bpp.lz");
+const u32 gMonPalette_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/normal.gbapal.lz");
+const u32 gMonBackPic_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/back.4bpp.lz");
+const u32 gMonShinyPalette_Croconaw[] = INCBIN_U32("graphics/pokemon/croconaw/shiny.gbapal.lz");
+const u8 gMonIcon_Croconaw[] = INCBIN_U8("graphics/pokemon/croconaw/icon.4bpp");
+const u8 gMonFootprint_Croconaw[] = INCBIN_U8("graphics/pokemon/croconaw/footprint.1bpp");
+
+const u32 gMonFrontPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/front.4bpp.lz");
+const u32 gMonPalette_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/normal.gbapal.lz");
+const u32 gMonBackPic_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/back.4bpp.lz");
+const u32 gMonShinyPalette_Feraligatr[] = INCBIN_U32("graphics/pokemon/feraligatr/shiny.gbapal.lz");
+const u8 gMonIcon_Feraligatr[] = INCBIN_U8("graphics/pokemon/feraligatr/icon.4bpp");
+const u8 gMonFootprint_Feraligatr[] = INCBIN_U8("graphics/pokemon/feraligatr/footprint.1bpp");
+
+const u32 gMonFrontPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/front.4bpp.lz");
+const u32 gMonPalette_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/normal.gbapal.lz");
+const u32 gMonBackPic_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/back.4bpp.lz");
+const u32 gMonShinyPalette_Sentret[] = INCBIN_U32("graphics/pokemon/sentret/shiny.gbapal.lz");
+const u8 gMonIcon_Sentret[] = INCBIN_U8("graphics/pokemon/sentret/icon.4bpp");
+const u8 gMonFootprint_Sentret[] = INCBIN_U8("graphics/pokemon/sentret/footprint.1bpp");
+
+const u32 gMonFrontPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/front.4bpp.lz");
+const u32 gMonPalette_Furret[] = INCBIN_U32("graphics/pokemon/furret/normal.gbapal.lz");
+const u32 gMonBackPic_Furret[] = INCBIN_U32("graphics/pokemon/furret/back.4bpp.lz");
+const u32 gMonShinyPalette_Furret[] = INCBIN_U32("graphics/pokemon/furret/shiny.gbapal.lz");
+const u8 gMonIcon_Furret[] = INCBIN_U8("graphics/pokemon/furret/icon.4bpp");
+const u8 gMonFootprint_Furret[] = INCBIN_U8("graphics/pokemon/furret/footprint.1bpp");
+
+const u32 gMonFrontPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/front.4bpp.lz");
+const u32 gMonPalette_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/normal.gbapal.lz");
+const u32 gMonBackPic_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/back.4bpp.lz");
+const u32 gMonShinyPalette_Hoothoot[] = INCBIN_U32("graphics/pokemon/hoothoot/shiny.gbapal.lz");
+const u8 gMonIcon_Hoothoot[] = INCBIN_U8("graphics/pokemon/hoothoot/icon.4bpp");
+const u8 gMonFootprint_Hoothoot[] = INCBIN_U8("graphics/pokemon/hoothoot/footprint.1bpp");
+
+const u32 gMonFrontPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/front.4bpp.lz");
+const u32 gMonPalette_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/normal.gbapal.lz");
+const u32 gMonBackPic_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/back.4bpp.lz");
+const u32 gMonShinyPalette_Noctowl[] = INCBIN_U32("graphics/pokemon/noctowl/shiny.gbapal.lz");
+const u8 gMonIcon_Noctowl[] = INCBIN_U8("graphics/pokemon/noctowl/icon.4bpp");
+const u8 gMonFootprint_Noctowl[] = INCBIN_U8("graphics/pokemon/noctowl/footprint.1bpp");
+
+const u32 gMonFrontPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/front.4bpp.lz");
+const u32 gMonPalette_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/normal.gbapal.lz");
+const u32 gMonBackPic_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/back.4bpp.lz");
+const u32 gMonShinyPalette_Ledyba[] = INCBIN_U32("graphics/pokemon/ledyba/shiny.gbapal.lz");
+const u8 gMonIcon_Ledyba[] = INCBIN_U8("graphics/pokemon/ledyba/icon.4bpp");
+const u8 gMonFootprint_Ledyba[] = INCBIN_U8("graphics/pokemon/ledyba/footprint.1bpp");
+
+const u32 gMonFrontPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/front.4bpp.lz");
+const u32 gMonPalette_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/normal.gbapal.lz");
+const u32 gMonBackPic_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/back.4bpp.lz");
+const u32 gMonShinyPalette_Ledian[] = INCBIN_U32("graphics/pokemon/ledian/shiny.gbapal.lz");
+const u8 gMonIcon_Ledian[] = INCBIN_U8("graphics/pokemon/ledian/icon.4bpp");
+const u8 gMonFootprint_Ledian[] = INCBIN_U8("graphics/pokemon/ledian/footprint.1bpp");
+
+const u32 gMonFrontPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/front.4bpp.lz");
+const u32 gMonPalette_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/normal.gbapal.lz");
+const u32 gMonBackPic_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/back.4bpp.lz");
+const u32 gMonShinyPalette_Spinarak[] = INCBIN_U32("graphics/pokemon/spinarak/shiny.gbapal.lz");
+const u8 gMonIcon_Spinarak[] = INCBIN_U8("graphics/pokemon/spinarak/icon.4bpp");
+const u8 gMonFootprint_Spinarak[] = INCBIN_U8("graphics/pokemon/spinarak/footprint.1bpp");
+
+const u32 gMonFrontPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/front.4bpp.lz");
+const u32 gMonPalette_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/normal.gbapal.lz");
+const u32 gMonBackPic_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/back.4bpp.lz");
+const u32 gMonShinyPalette_Ariados[] = INCBIN_U32("graphics/pokemon/ariados/shiny.gbapal.lz");
+const u8 gMonIcon_Ariados[] = INCBIN_U8("graphics/pokemon/ariados/icon.4bpp");
+const u8 gMonFootprint_Ariados[] = INCBIN_U8("graphics/pokemon/ariados/footprint.1bpp");
+
+const u32 gMonFrontPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/front.4bpp.lz");
+const u32 gMonPalette_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/normal.gbapal.lz");
+const u32 gMonBackPic_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/back.4bpp.lz");
+const u32 gMonShinyPalette_Crobat[] = INCBIN_U32("graphics/pokemon/crobat/shiny.gbapal.lz");
+const u8 gMonIcon_Crobat[] = INCBIN_U8("graphics/pokemon/crobat/icon.4bpp");
+const u8 gMonFootprint_Crobat[] = INCBIN_U8("graphics/pokemon/crobat/footprint.1bpp");
+
+const u32 gMonFrontPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/front.4bpp.lz");
+const u32 gMonPalette_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/normal.gbapal.lz");
+const u32 gMonBackPic_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/back.4bpp.lz");
+const u32 gMonShinyPalette_Chinchou[] = INCBIN_U32("graphics/pokemon/chinchou/shiny.gbapal.lz");
+const u8 gMonIcon_Chinchou[] = INCBIN_U8("graphics/pokemon/chinchou/icon.4bpp");
+const u8 gMonFootprint_Chinchou[] = INCBIN_U8("graphics/pokemon/chinchou/footprint.1bpp");
+
+const u32 gMonFrontPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/front.4bpp.lz");
+const u32 gMonPalette_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/normal.gbapal.lz");
+const u32 gMonBackPic_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/back.4bpp.lz");
+const u32 gMonShinyPalette_Lanturn[] = INCBIN_U32("graphics/pokemon/lanturn/shiny.gbapal.lz");
+const u8 gMonIcon_Lanturn[] = INCBIN_U8("graphics/pokemon/lanturn/icon.4bpp");
+const u8 gMonFootprint_Lanturn[] = INCBIN_U8("graphics/pokemon/lanturn/footprint.1bpp");
+
+const u32 gMonFrontPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/front.4bpp.lz");
+const u32 gMonPalette_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/normal.gbapal.lz");
+const u32 gMonBackPic_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/back.4bpp.lz");
+const u32 gMonShinyPalette_Pichu[] = INCBIN_U32("graphics/pokemon/pichu/shiny.gbapal.lz");
+const u8 gMonIcon_Pichu[] = INCBIN_U8("graphics/pokemon/pichu/icon.4bpp");
+const u8 gMonFootprint_Pichu[] = INCBIN_U8("graphics/pokemon/pichu/footprint.1bpp");
+
+const u32 gMonFrontPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/front.4bpp.lz");
+const u32 gMonPalette_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/normal.gbapal.lz");
+const u32 gMonBackPic_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/back.4bpp.lz");
+const u32 gMonShinyPalette_Cleffa[] = INCBIN_U32("graphics/pokemon/cleffa/shiny.gbapal.lz");
+const u8 gMonIcon_Cleffa[] = INCBIN_U8("graphics/pokemon/cleffa/icon.4bpp");
+const u8 gMonFootprint_Cleffa[] = INCBIN_U8("graphics/pokemon/cleffa/footprint.1bpp");
+
+const u32 gMonFrontPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/front.4bpp.lz");
+const u32 gMonPalette_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/normal.gbapal.lz");
+const u32 gMonBackPic_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/back.4bpp.lz");
+const u32 gMonShinyPalette_Igglybuff[] = INCBIN_U32("graphics/pokemon/igglybuff/shiny.gbapal.lz");
+const u8 gMonIcon_Igglybuff[] = INCBIN_U8("graphics/pokemon/igglybuff/icon.4bpp");
+const u8 gMonFootprint_Igglybuff[] = INCBIN_U8("graphics/pokemon/igglybuff/footprint.1bpp");
+
+const u32 gMonFrontPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/front.4bpp.lz");
+const u32 gMonPalette_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/normal.gbapal.lz");
+const u32 gMonBackPic_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/back.4bpp.lz");
+const u32 gMonShinyPalette_Togepi[] = INCBIN_U32("graphics/pokemon/togepi/shiny.gbapal.lz");
+const u8 gMonIcon_Togepi[] = INCBIN_U8("graphics/pokemon/togepi/icon.4bpp");
+const u8 gMonFootprint_Togepi[] = INCBIN_U8("graphics/pokemon/togepi/footprint.1bpp");
+
+const u32 gMonFrontPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/front.4bpp.lz");
+const u32 gMonPalette_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/normal.gbapal.lz");
+const u32 gMonBackPic_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/back.4bpp.lz");
+const u32 gMonShinyPalette_Togetic[] = INCBIN_U32("graphics/pokemon/togetic/shiny.gbapal.lz");
+const u8 gMonIcon_Togetic[] = INCBIN_U8("graphics/pokemon/togetic/icon.4bpp");
+const u8 gMonFootprint_Togetic[] = INCBIN_U8("graphics/pokemon/togetic/footprint.1bpp");
+
+const u32 gMonFrontPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/front.4bpp.lz");
+const u32 gMonPalette_Natu[] = INCBIN_U32("graphics/pokemon/natu/normal.gbapal.lz");
+const u32 gMonBackPic_Natu[] = INCBIN_U32("graphics/pokemon/natu/back.4bpp.lz");
+const u32 gMonShinyPalette_Natu[] = INCBIN_U32("graphics/pokemon/natu/shiny.gbapal.lz");
+const u8 gMonIcon_Natu[] = INCBIN_U8("graphics/pokemon/natu/icon.4bpp");
+const u8 gMonFootprint_Natu[] = INCBIN_U8("graphics/pokemon/natu/footprint.1bpp");
+
+const u32 gMonFrontPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/front.4bpp.lz");
+const u32 gMonPalette_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/normal.gbapal.lz");
+const u32 gMonBackPic_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/back.4bpp.lz");
+const u32 gMonShinyPalette_Xatu[] = INCBIN_U32("graphics/pokemon/xatu/shiny.gbapal.lz");
+const u8 gMonIcon_Xatu[] = INCBIN_U8("graphics/pokemon/xatu/icon.4bpp");
+const u8 gMonFootprint_Xatu[] = INCBIN_U8("graphics/pokemon/xatu/footprint.1bpp");
+
+const u32 gMonFrontPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/front.4bpp.lz");
+const u32 gMonPalette_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/normal.gbapal.lz");
+const u32 gMonBackPic_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/back.4bpp.lz");
+const u32 gMonShinyPalette_Mareep[] = INCBIN_U32("graphics/pokemon/mareep/shiny.gbapal.lz");
+const u8 gMonIcon_Mareep[] = INCBIN_U8("graphics/pokemon/mareep/icon.4bpp");
+const u8 gMonFootprint_Mareep[] = INCBIN_U8("graphics/pokemon/mareep/footprint.1bpp");
+
+const u32 gMonFrontPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/front.4bpp.lz");
+const u32 gMonPalette_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/normal.gbapal.lz");
+const u32 gMonBackPic_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/back.4bpp.lz");
+const u32 gMonShinyPalette_Flaaffy[] = INCBIN_U32("graphics/pokemon/flaaffy/shiny.gbapal.lz");
+const u8 gMonIcon_Flaaffy[] = INCBIN_U8("graphics/pokemon/flaaffy/icon.4bpp");
+const u8 gMonFootprint_Flaaffy[] = INCBIN_U8("graphics/pokemon/flaaffy/footprint.1bpp");
+
+const u32 gMonFrontPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/front.4bpp.lz");
+const u32 gMonPalette_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/normal.gbapal.lz");
+const u32 gMonBackPic_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/back.4bpp.lz");
+const u32 gMonShinyPalette_Ampharos[] = INCBIN_U32("graphics/pokemon/ampharos/shiny.gbapal.lz");
+const u8 gMonIcon_Ampharos[] = INCBIN_U8("graphics/pokemon/ampharos/icon.4bpp");
+const u8 gMonFootprint_Ampharos[] = INCBIN_U8("graphics/pokemon/ampharos/footprint.1bpp");
+
+const u32 gMonFrontPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/front.4bpp.lz");
+const u32 gMonPalette_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/normal.gbapal.lz");
+const u32 gMonBackPic_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/back.4bpp.lz");
+const u32 gMonShinyPalette_Bellossom[] = INCBIN_U32("graphics/pokemon/bellossom/shiny.gbapal.lz");
+const u8 gMonIcon_Bellossom[] = INCBIN_U8("graphics/pokemon/bellossom/icon.4bpp");
+const u8 gMonFootprint_Bellossom[] = INCBIN_U8("graphics/pokemon/bellossom/footprint.1bpp");
+
+const u32 gMonFrontPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/front.4bpp.lz");
+const u32 gMonPalette_Marill[] = INCBIN_U32("graphics/pokemon/marill/normal.gbapal.lz");
+const u32 gMonBackPic_Marill[] = INCBIN_U32("graphics/pokemon/marill/back.4bpp.lz");
+const u32 gMonShinyPalette_Marill[] = INCBIN_U32("graphics/pokemon/marill/shiny.gbapal.lz");
+const u8 gMonIcon_Marill[] = INCBIN_U8("graphics/pokemon/marill/icon.4bpp");
+const u8 gMonFootprint_Marill[] = INCBIN_U8("graphics/pokemon/marill/footprint.1bpp");
+
+const u32 gMonFrontPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/front.4bpp.lz");
+const u32 gMonPalette_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/normal.gbapal.lz");
+const u32 gMonBackPic_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/back.4bpp.lz");
+const u32 gMonShinyPalette_Azumarill[] = INCBIN_U32("graphics/pokemon/azumarill/shiny.gbapal.lz");
+const u8 gMonIcon_Azumarill[] = INCBIN_U8("graphics/pokemon/azumarill/icon.4bpp");
+const u8 gMonFootprint_Azumarill[] = INCBIN_U8("graphics/pokemon/azumarill/footprint.1bpp");
+
+const u32 gMonFrontPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/front.4bpp.lz");
+const u32 gMonPalette_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/normal.gbapal.lz");
+const u32 gMonBackPic_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/back.4bpp.lz");
+const u32 gMonShinyPalette_Sudowoodo[] = INCBIN_U32("graphics/pokemon/sudowoodo/shiny.gbapal.lz");
+const u8 gMonIcon_Sudowoodo[] = INCBIN_U8("graphics/pokemon/sudowoodo/icon.4bpp");
+const u8 gMonFootprint_Sudowoodo[] = INCBIN_U8("graphics/pokemon/sudowoodo/footprint.1bpp");
+
+const u32 gMonFrontPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/front.4bpp.lz");
+const u32 gMonPalette_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/normal.gbapal.lz");
+const u32 gMonBackPic_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/back.4bpp.lz");
+const u32 gMonShinyPalette_Politoed[] = INCBIN_U32("graphics/pokemon/politoed/shiny.gbapal.lz");
+const u8 gMonIcon_Politoed[] = INCBIN_U8("graphics/pokemon/politoed/icon.4bpp");
+const u8 gMonFootprint_Politoed[] = INCBIN_U8("graphics/pokemon/politoed/footprint.1bpp");
+
+const u32 gMonFrontPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/front.4bpp.lz");
+const u32 gMonPalette_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/normal.gbapal.lz");
+const u32 gMonBackPic_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/back.4bpp.lz");
+const u32 gMonShinyPalette_Hoppip[] = INCBIN_U32("graphics/pokemon/hoppip/shiny.gbapal.lz");
+const u8 gMonIcon_Hoppip[] = INCBIN_U8("graphics/pokemon/hoppip/icon.4bpp");
+const u8 gMonFootprint_Hoppip[] = INCBIN_U8("graphics/pokemon/hoppip/footprint.1bpp");
+
+const u32 gMonFrontPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/front.4bpp.lz");
+const u32 gMonPalette_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/normal.gbapal.lz");
+const u32 gMonBackPic_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/back.4bpp.lz");
+const u32 gMonShinyPalette_Skiploom[] = INCBIN_U32("graphics/pokemon/skiploom/shiny.gbapal.lz");
+const u8 gMonIcon_Skiploom[] = INCBIN_U8("graphics/pokemon/skiploom/icon.4bpp");
+const u8 gMonFootprint_Skiploom[] = INCBIN_U8("graphics/pokemon/skiploom/footprint.1bpp");
+
+const u32 gMonFrontPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/front.4bpp.lz");
+const u32 gMonPalette_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/normal.gbapal.lz");
+const u32 gMonBackPic_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/back.4bpp.lz");
+const u32 gMonShinyPalette_Jumpluff[] = INCBIN_U32("graphics/pokemon/jumpluff/shiny.gbapal.lz");
+const u8 gMonIcon_Jumpluff[] = INCBIN_U8("graphics/pokemon/jumpluff/icon.4bpp");
+const u8 gMonFootprint_Jumpluff[] = INCBIN_U8("graphics/pokemon/jumpluff/footprint.1bpp");
+
+const u32 gMonFrontPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/front.4bpp.lz");
+const u32 gMonPalette_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/normal.gbapal.lz");
+const u32 gMonBackPic_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/back.4bpp.lz");
+const u32 gMonShinyPalette_Aipom[] = INCBIN_U32("graphics/pokemon/aipom/shiny.gbapal.lz");
+const u8 gMonIcon_Aipom[] = INCBIN_U8("graphics/pokemon/aipom/icon.4bpp");
+const u8 gMonFootprint_Aipom[] = INCBIN_U8("graphics/pokemon/aipom/footprint.1bpp");
+
+const u32 gMonFrontPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/front.4bpp.lz");
+const u32 gMonPalette_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/normal.gbapal.lz");
+const u32 gMonBackPic_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/back.4bpp.lz");
+const u32 gMonShinyPalette_Sunkern[] = INCBIN_U32("graphics/pokemon/sunkern/shiny.gbapal.lz");
+const u8 gMonIcon_Sunkern[] = INCBIN_U8("graphics/pokemon/sunkern/icon.4bpp");
+const u8 gMonFootprint_Sunkern[] = INCBIN_U8("graphics/pokemon/sunkern/footprint.1bpp");
+
+const u32 gMonFrontPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/front.4bpp.lz");
+const u32 gMonPalette_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/normal.gbapal.lz");
+const u32 gMonBackPic_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/back.4bpp.lz");
+const u32 gMonShinyPalette_Sunflora[] = INCBIN_U32("graphics/pokemon/sunflora/shiny.gbapal.lz");
+const u8 gMonIcon_Sunflora[] = INCBIN_U8("graphics/pokemon/sunflora/icon.4bpp");
+const u8 gMonFootprint_Sunflora[] = INCBIN_U8("graphics/pokemon/sunflora/footprint.1bpp");
+
+const u32 gMonFrontPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/front.4bpp.lz");
+const u32 gMonPalette_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/normal.gbapal.lz");
+const u32 gMonBackPic_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/back.4bpp.lz");
+const u32 gMonShinyPalette_Yanma[] = INCBIN_U32("graphics/pokemon/yanma/shiny.gbapal.lz");
+const u8 gMonIcon_Yanma[] = INCBIN_U8("graphics/pokemon/yanma/icon.4bpp");
+const u8 gMonFootprint_Yanma[] = INCBIN_U8("graphics/pokemon/yanma/footprint.1bpp");
+
+const u32 gMonFrontPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/front.4bpp.lz");
+const u32 gMonPalette_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/normal.gbapal.lz");
+const u32 gMonBackPic_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/back.4bpp.lz");
+const u32 gMonShinyPalette_Wooper[] = INCBIN_U32("graphics/pokemon/wooper/shiny.gbapal.lz");
+const u8 gMonIcon_Wooper[] = INCBIN_U8("graphics/pokemon/wooper/icon.4bpp");
+const u8 gMonFootprint_Wooper[] = INCBIN_U8("graphics/pokemon/wooper/footprint.1bpp");
+
+const u32 gMonFrontPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/front.4bpp.lz");
+const u32 gMonPalette_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/normal.gbapal.lz");
+const u32 gMonBackPic_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/back.4bpp.lz");
+const u32 gMonShinyPalette_Quagsire[] = INCBIN_U32("graphics/pokemon/quagsire/shiny.gbapal.lz");
+const u8 gMonIcon_Quagsire[] = INCBIN_U8("graphics/pokemon/quagsire/icon.4bpp");
+const u8 gMonFootprint_Quagsire[] = INCBIN_U8("graphics/pokemon/quagsire/footprint.1bpp");
+
+const u32 gMonFrontPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/front.4bpp.lz");
+const u32 gMonPalette_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/normal.gbapal.lz");
+const u32 gMonBackPic_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/back.4bpp.lz");
+const u32 gMonShinyPalette_Espeon[] = INCBIN_U32("graphics/pokemon/espeon/shiny.gbapal.lz");
+const u8 gMonIcon_Espeon[] = INCBIN_U8("graphics/pokemon/espeon/icon.4bpp");
+const u8 gMonFootprint_Espeon[] = INCBIN_U8("graphics/pokemon/espeon/footprint.1bpp");
+
+const u32 gMonFrontPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/front.4bpp.lz");
+const u32 gMonPalette_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/normal.gbapal.lz");
+const u32 gMonBackPic_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/back.4bpp.lz");
+const u32 gMonShinyPalette_Umbreon[] = INCBIN_U32("graphics/pokemon/umbreon/shiny.gbapal.lz");
+const u8 gMonIcon_Umbreon[] = INCBIN_U8("graphics/pokemon/umbreon/icon.4bpp");
+const u8 gMonFootprint_Umbreon[] = INCBIN_U8("graphics/pokemon/umbreon/footprint.1bpp");
+
+const u32 gMonFrontPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/front.4bpp.lz");
+const u32 gMonPalette_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/normal.gbapal.lz");
+const u32 gMonBackPic_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/back.4bpp.lz");
+const u32 gMonShinyPalette_Murkrow[] = INCBIN_U32("graphics/pokemon/murkrow/shiny.gbapal.lz");
+const u8 gMonIcon_Murkrow[] = INCBIN_U8("graphics/pokemon/murkrow/icon.4bpp");
+const u8 gMonFootprint_Murkrow[] = INCBIN_U8("graphics/pokemon/murkrow/footprint.1bpp");
+
+const u32 gMonFrontPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/front.4bpp.lz");
+const u32 gMonPalette_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/normal.gbapal.lz");
+const u32 gMonBackPic_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/back.4bpp.lz");
+const u32 gMonShinyPalette_Slowking[] = INCBIN_U32("graphics/pokemon/slowking/shiny.gbapal.lz");
+const u8 gMonIcon_Slowking[] = INCBIN_U8("graphics/pokemon/slowking/icon.4bpp");
+const u8 gMonFootprint_Slowking[] = INCBIN_U8("graphics/pokemon/slowking/footprint.1bpp");
+
+const u32 gMonFrontPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/front.4bpp.lz");
+const u32 gMonPalette_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/normal.gbapal.lz");
+const u32 gMonBackPic_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/back.4bpp.lz");
+const u32 gMonShinyPalette_Misdreavus[] = INCBIN_U32("graphics/pokemon/misdreavus/shiny.gbapal.lz");
+const u8 gMonIcon_Misdreavus[] = INCBIN_U8("graphics/pokemon/misdreavus/icon.4bpp");
+const u8 gMonFootprint_Misdreavus[] = INCBIN_U8("graphics/pokemon/misdreavus/footprint.1bpp");
+
+const u32 gMonFrontPic_UnownA[] = INCBIN_U32("graphics/pokemon/unown/a/front.4bpp.lz");
+const u32 gMonPalette_Unown[] = INCBIN_U32("graphics/pokemon/unown/normal.gbapal.lz");
+const u32 gMonBackPic_UnownA[] = INCBIN_U32("graphics/pokemon/unown/a/back.4bpp.lz");
+const u32 gMonShinyPalette_Unown[] = INCBIN_U32("graphics/pokemon/unown/shiny.gbapal.lz");
+const u8 gMonIcon_UnownA[] = INCBIN_U8("graphics/pokemon/unown/a/icon.4bpp");
+const u8 gMonFootprint_Unown[] = INCBIN_U8("graphics/pokemon/unown/footprint.1bpp");
+
+const u32 gMonFrontPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/front.4bpp.lz");
+const u32 gMonPalette_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/normal.gbapal.lz");
+const u32 gMonBackPic_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/back.4bpp.lz");
+const u32 gMonShinyPalette_Wobbuffet[] = INCBIN_U32("graphics/pokemon/wobbuffet/shiny.gbapal.lz");
+const u8 gMonIcon_Wobbuffet[] = INCBIN_U8("graphics/pokemon/wobbuffet/icon.4bpp");
+const u8 gMonFootprint_Wobbuffet[] = INCBIN_U8("graphics/pokemon/wobbuffet/footprint.1bpp");
+
+const u32 gMonFrontPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/front.4bpp.lz");
+const u32 gMonPalette_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/normal.gbapal.lz");
+const u32 gMonBackPic_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/back.4bpp.lz");
+const u32 gMonShinyPalette_Girafarig[] = INCBIN_U32("graphics/pokemon/girafarig/shiny.gbapal.lz");
+const u8 gMonIcon_Girafarig[] = INCBIN_U8("graphics/pokemon/girafarig/icon.4bpp");
+const u8 gMonFootprint_Girafarig[] = INCBIN_U8("graphics/pokemon/girafarig/footprint.1bpp");
+
+const u32 gMonFrontPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/front.4bpp.lz");
+const u32 gMonPalette_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/normal.gbapal.lz");
+const u32 gMonBackPic_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/back.4bpp.lz");
+const u32 gMonShinyPalette_Pineco[] = INCBIN_U32("graphics/pokemon/pineco/shiny.gbapal.lz");
+const u8 gMonIcon_Pineco[] = INCBIN_U8("graphics/pokemon/pineco/icon.4bpp");
+const u8 gMonFootprint_Pineco[] = INCBIN_U8("graphics/pokemon/pineco/footprint.1bpp");
+
+const u32 gMonFrontPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/front.4bpp.lz");
+const u32 gMonPalette_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/normal.gbapal.lz");
+const u32 gMonBackPic_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/back.4bpp.lz");
+const u32 gMonShinyPalette_Forretress[] = INCBIN_U32("graphics/pokemon/forretress/shiny.gbapal.lz");
+const u8 gMonIcon_Forretress[] = INCBIN_U8("graphics/pokemon/forretress/icon.4bpp");
+const u8 gMonFootprint_Forretress[] = INCBIN_U8("graphics/pokemon/forretress/footprint.1bpp");
+
+const u32 gMonFrontPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/front.4bpp.lz");
+const u32 gMonPalette_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/normal.gbapal.lz");
+const u32 gMonBackPic_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/back.4bpp.lz");
+const u32 gMonShinyPalette_Dunsparce[] = INCBIN_U32("graphics/pokemon/dunsparce/shiny.gbapal.lz");
+const u8 gMonIcon_Dunsparce[] = INCBIN_U8("graphics/pokemon/dunsparce/icon.4bpp");
+const u8 gMonFootprint_Dunsparce[] = INCBIN_U8("graphics/pokemon/dunsparce/footprint.1bpp");
+
+const u32 gMonFrontPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/front.4bpp.lz");
+const u32 gMonPalette_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/normal.gbapal.lz");
+const u32 gMonBackPic_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/back.4bpp.lz");
+const u32 gMonShinyPalette_Gligar[] = INCBIN_U32("graphics/pokemon/gligar/shiny.gbapal.lz");
+const u8 gMonIcon_Gligar[] = INCBIN_U8("graphics/pokemon/gligar/icon.4bpp");
+const u8 gMonFootprint_Gligar[] = INCBIN_U8("graphics/pokemon/gligar/footprint.1bpp");
+
+const u32 gMonFrontPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/front.4bpp.lz");
+const u32 gMonPalette_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/normal.gbapal.lz");
+const u32 gMonBackPic_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/back.4bpp.lz");
+const u32 gMonShinyPalette_Steelix[] = INCBIN_U32("graphics/pokemon/steelix/shiny.gbapal.lz");
+const u8 gMonIcon_Steelix[] = INCBIN_U8("graphics/pokemon/steelix/icon.4bpp");
+const u8 gMonFootprint_Steelix[] = INCBIN_U8("graphics/pokemon/steelix/footprint.1bpp");
+
+const u32 gMonFrontPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/front.4bpp.lz");
+const u32 gMonPalette_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/normal.gbapal.lz");
+const u32 gMonBackPic_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/back.4bpp.lz");
+const u32 gMonShinyPalette_Snubbull[] = INCBIN_U32("graphics/pokemon/snubbull/shiny.gbapal.lz");
+const u8 gMonIcon_Snubbull[] = INCBIN_U8("graphics/pokemon/snubbull/icon.4bpp");
+const u8 gMonFootprint_Snubbull[] = INCBIN_U8("graphics/pokemon/snubbull/footprint.1bpp");
+
+const u32 gMonFrontPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/front.4bpp.lz");
+const u32 gMonPalette_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/normal.gbapal.lz");
+const u32 gMonBackPic_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/back.4bpp.lz");
+const u32 gMonShinyPalette_Granbull[] = INCBIN_U32("graphics/pokemon/granbull/shiny.gbapal.lz");
+const u8 gMonIcon_Granbull[] = INCBIN_U8("graphics/pokemon/granbull/icon.4bpp");
+const u8 gMonFootprint_Granbull[] = INCBIN_U8("graphics/pokemon/granbull/footprint.1bpp");
+
+const u32 gMonFrontPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/front.4bpp.lz");
+const u32 gMonPalette_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/normal.gbapal.lz");
+const u32 gMonBackPic_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/back.4bpp.lz");
+const u32 gMonShinyPalette_Qwilfish[] = INCBIN_U32("graphics/pokemon/qwilfish/shiny.gbapal.lz");
+const u8 gMonIcon_Qwilfish[] = INCBIN_U8("graphics/pokemon/qwilfish/icon.4bpp");
+const u8 gMonFootprint_Qwilfish[] = INCBIN_U8("graphics/pokemon/qwilfish/footprint.1bpp");
+
+const u32 gMonFrontPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/front.4bpp.lz");
+const u32 gMonPalette_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/normal.gbapal.lz");
+const u32 gMonBackPic_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/back.4bpp.lz");
+const u32 gMonShinyPalette_Scizor[] = INCBIN_U32("graphics/pokemon/scizor/shiny.gbapal.lz");
+const u8 gMonIcon_Scizor[] = INCBIN_U8("graphics/pokemon/scizor/icon.4bpp");
+const u8 gMonFootprint_Scizor[] = INCBIN_U8("graphics/pokemon/scizor/footprint.1bpp");
+
+const u32 gMonFrontPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/front.4bpp.lz");
+const u32 gMonPalette_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/normal.gbapal.lz");
+const u32 gMonBackPic_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/back.4bpp.lz");
+const u32 gMonShinyPalette_Shuckle[] = INCBIN_U32("graphics/pokemon/shuckle/shiny.gbapal.lz");
+const u8 gMonIcon_Shuckle[] = INCBIN_U8("graphics/pokemon/shuckle/icon.4bpp");
+const u8 gMonFootprint_Shuckle[] = INCBIN_U8("graphics/pokemon/shuckle/footprint.1bpp");
+
+const u32 gMonFrontPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/front.4bpp.lz");
+const u32 gMonPalette_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/normal.gbapal.lz");
+const u32 gMonBackPic_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/back.4bpp.lz");
+const u32 gMonShinyPalette_Heracross[] = INCBIN_U32("graphics/pokemon/heracross/shiny.gbapal.lz");
+const u8 gMonIcon_Heracross[] = INCBIN_U8("graphics/pokemon/heracross/icon.4bpp");
+const u8 gUnknown_heracross_icon[] = INCBIN_U8("graphics/pokemon/heracross/unk_icon.4bpp");
+const u8 gMonFootprint_Heracross[] = INCBIN_U8("graphics/pokemon/heracross/footprint.1bpp");
+
+const u32 gMonFrontPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/front.4bpp.lz");
+const u32 gMonPalette_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/normal.gbapal.lz");
+const u32 gMonBackPic_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/back.4bpp.lz");
+const u32 gMonShinyPalette_Sneasel[] = INCBIN_U32("graphics/pokemon/sneasel/shiny.gbapal.lz");
+const u8 gMonIcon_Sneasel[] = INCBIN_U8("graphics/pokemon/sneasel/icon.4bpp");
+const u8 gMonFootprint_Sneasel[] = INCBIN_U8("graphics/pokemon/sneasel/footprint.1bpp");
+
+const u32 gMonFrontPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/front.4bpp.lz");
+const u32 gMonPalette_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/normal.gbapal.lz");
+const u32 gMonBackPic_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/back.4bpp.lz");
+const u32 gMonShinyPalette_Teddiursa[] = INCBIN_U32("graphics/pokemon/teddiursa/shiny.gbapal.lz");
+const u8 gMonIcon_Teddiursa[] = INCBIN_U8("graphics/pokemon/teddiursa/icon.4bpp");
+const u8 gMonFootprint_Teddiursa[] = INCBIN_U8("graphics/pokemon/teddiursa/footprint.1bpp");
+
+const u32 gMonFrontPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/front.4bpp.lz");
+const u32 gMonPalette_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/normal.gbapal.lz");
+const u32 gMonBackPic_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/back.4bpp.lz");
+const u32 gMonShinyPalette_Ursaring[] = INCBIN_U32("graphics/pokemon/ursaring/shiny.gbapal.lz");
+const u8 gMonIcon_Ursaring[] = INCBIN_U8("graphics/pokemon/ursaring/icon.4bpp");
+const u8 gMonFootprint_Ursaring[] = INCBIN_U8("graphics/pokemon/ursaring/footprint.1bpp");
+
+const u32 gMonFrontPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/front.4bpp.lz");
+const u32 gMonPalette_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/normal.gbapal.lz");
+const u32 gMonBackPic_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/back.4bpp.lz");
+const u32 gMonShinyPalette_Slugma[] = INCBIN_U32("graphics/pokemon/slugma/shiny.gbapal.lz");
+const u8 gMonIcon_Slugma[] = INCBIN_U8("graphics/pokemon/slugma/icon.4bpp");
+const u8 gMonFootprint_Slugma[] = INCBIN_U8("graphics/pokemon/slugma/footprint.1bpp");
+
+const u32 gMonFrontPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/front.4bpp.lz");
+const u32 gMonPalette_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/normal.gbapal.lz");
+const u32 gMonBackPic_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/back.4bpp.lz");
+const u32 gMonShinyPalette_Magcargo[] = INCBIN_U32("graphics/pokemon/magcargo/shiny.gbapal.lz");
+const u8 gMonIcon_Magcargo[] = INCBIN_U8("graphics/pokemon/magcargo/icon.4bpp");
+const u8 gMonFootprint_Magcargo[] = INCBIN_U8("graphics/pokemon/magcargo/footprint.1bpp");
+
+const u32 gMonFrontPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/front.4bpp.lz");
+const u32 gMonPalette_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/normal.gbapal.lz");
+const u32 gMonBackPic_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/back.4bpp.lz");
+const u32 gMonShinyPalette_Swinub[] = INCBIN_U32("graphics/pokemon/swinub/shiny.gbapal.lz");
+const u8 gMonIcon_Swinub[] = INCBIN_U8("graphics/pokemon/swinub/icon.4bpp");
+const u8 gMonFootprint_Swinub[] = INCBIN_U8("graphics/pokemon/swinub/footprint.1bpp");
+
+const u32 gMonFrontPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/front.4bpp.lz");
+const u32 gMonPalette_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/normal.gbapal.lz");
+const u32 gMonBackPic_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/back.4bpp.lz");
+const u32 gMonShinyPalette_Piloswine[] = INCBIN_U32("graphics/pokemon/piloswine/shiny.gbapal.lz");
+const u8 gMonIcon_Piloswine[] = INCBIN_U8("graphics/pokemon/piloswine/icon.4bpp");
+const u8 gMonFootprint_Piloswine[] = INCBIN_U8("graphics/pokemon/piloswine/footprint.1bpp");
+
+const u32 gMonFrontPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/front.4bpp.lz");
+const u32 gMonPalette_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/normal.gbapal.lz");
+const u32 gMonBackPic_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/back.4bpp.lz");
+const u32 gMonShinyPalette_Corsola[] = INCBIN_U32("graphics/pokemon/corsola/shiny.gbapal.lz");
+const u8 gMonIcon_Corsola[] = INCBIN_U8("graphics/pokemon/corsola/icon.4bpp");
+const u8 gMonFootprint_Corsola[] = INCBIN_U8("graphics/pokemon/corsola/footprint.1bpp");
+
+const u32 gMonFrontPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/front.4bpp.lz");
+const u32 gMonPalette_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/normal.gbapal.lz");
+const u32 gMonBackPic_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/back.4bpp.lz");
+const u32 gMonShinyPalette_Remoraid[] = INCBIN_U32("graphics/pokemon/remoraid/shiny.gbapal.lz");
+const u8 gMonIcon_Remoraid[] = INCBIN_U8("graphics/pokemon/remoraid/icon.4bpp");
+const u8 gMonFootprint_Remoraid[] = INCBIN_U8("graphics/pokemon/remoraid/footprint.1bpp");
+
+const u32 gMonFrontPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/front.4bpp.lz");
+const u32 gMonPalette_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/normal.gbapal.lz");
+const u32 gMonBackPic_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/back.4bpp.lz");
+const u32 gMonShinyPalette_Octillery[] = INCBIN_U32("graphics/pokemon/octillery/shiny.gbapal.lz");
+const u8 gMonIcon_Octillery[] = INCBIN_U8("graphics/pokemon/octillery/icon.4bpp");
+const u8 gMonFootprint_Octillery[] = INCBIN_U8("graphics/pokemon/octillery/footprint.1bpp");
+
+const u32 gMonFrontPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/front.4bpp.lz");
+const u32 gMonPalette_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/normal.gbapal.lz");
+const u32 gMonBackPic_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/back.4bpp.lz");
+const u32 gMonShinyPalette_Delibird[] = INCBIN_U32("graphics/pokemon/delibird/shiny.gbapal.lz");
+const u8 gMonIcon_Delibird[] = INCBIN_U8("graphics/pokemon/delibird/icon.4bpp");
+const u8 gMonFootprint_Delibird[] = INCBIN_U8("graphics/pokemon/delibird/footprint.1bpp");
+
+const u32 gMonFrontPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/front.4bpp.lz");
+const u32 gMonPalette_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/normal.gbapal.lz");
+const u32 gMonBackPic_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/back.4bpp.lz");
+const u32 gMonShinyPalette_Mantine[] = INCBIN_U32("graphics/pokemon/mantine/shiny.gbapal.lz");
+const u8 gMonIcon_Mantine[] = INCBIN_U8("graphics/pokemon/mantine/icon.4bpp");
+const u8 gMonFootprint_Mantine[] = INCBIN_U8("graphics/pokemon/mantine/footprint.1bpp");
+
+const u32 gMonFrontPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/front.4bpp.lz");
+const u32 gMonPalette_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/normal.gbapal.lz");
+const u32 gMonBackPic_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/back.4bpp.lz");
+const u32 gMonShinyPalette_Skarmory[] = INCBIN_U32("graphics/pokemon/skarmory/shiny.gbapal.lz");
+const u8 gMonIcon_Skarmory[] = INCBIN_U8("graphics/pokemon/skarmory/icon.4bpp");
+const u8 gMonFootprint_Skarmory[] = INCBIN_U8("graphics/pokemon/skarmory/footprint.1bpp");
+
+const u32 gMonFrontPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/front.4bpp.lz");
+const u32 gMonPalette_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/normal.gbapal.lz");
+const u32 gMonBackPic_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/back.4bpp.lz");
+const u32 gMonShinyPalette_Houndour[] = INCBIN_U32("graphics/pokemon/houndour/shiny.gbapal.lz");
+const u8 gMonIcon_Houndour[] = INCBIN_U8("graphics/pokemon/houndour/icon.4bpp");
+const u8 gMonFootprint_Houndour[] = INCBIN_U8("graphics/pokemon/houndour/footprint.1bpp");
+
+const u32 gMonFrontPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/front.4bpp.lz");
+const u32 gMonPalette_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/normal.gbapal.lz");
+const u32 gMonBackPic_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/back.4bpp.lz");
+const u32 gMonShinyPalette_Houndoom[] = INCBIN_U32("graphics/pokemon/houndoom/shiny.gbapal.lz");
+const u8 gMonIcon_Houndoom[] = INCBIN_U8("graphics/pokemon/houndoom/icon.4bpp");
+const u8 gMonFootprint_Houndoom[] = INCBIN_U8("graphics/pokemon/houndoom/footprint.1bpp");
+
+const u32 gMonFrontPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/front.4bpp.lz");
+const u32 gMonPalette_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/normal.gbapal.lz");
+const u32 gMonBackPic_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/back.4bpp.lz");
+const u32 gMonShinyPalette_Kingdra[] = INCBIN_U32("graphics/pokemon/kingdra/shiny.gbapal.lz");
+const u8 gMonIcon_Kingdra[] = INCBIN_U8("graphics/pokemon/kingdra/icon.4bpp");
+const u8 gMonFootprint_Kingdra[] = INCBIN_U8("graphics/pokemon/kingdra/footprint.1bpp");
+
+const u32 gMonFrontPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/front.4bpp.lz");
+const u32 gMonPalette_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/normal.gbapal.lz");
+const u32 gMonBackPic_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/back.4bpp.lz");
+const u32 gMonShinyPalette_Phanpy[] = INCBIN_U32("graphics/pokemon/phanpy/shiny.gbapal.lz");
+const u8 gMonIcon_Phanpy[] = INCBIN_U8("graphics/pokemon/phanpy/icon.4bpp");
+const u8 gMonFootprint_Phanpy[] = INCBIN_U8("graphics/pokemon/phanpy/footprint.1bpp");
+
+const u32 gMonFrontPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/front.4bpp.lz");
+const u32 gMonPalette_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/normal.gbapal.lz");
+const u32 gMonBackPic_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/back.4bpp.lz");
+const u32 gMonShinyPalette_Donphan[] = INCBIN_U32("graphics/pokemon/donphan/shiny.gbapal.lz");
+const u8 gMonIcon_Donphan[] = INCBIN_U8("graphics/pokemon/donphan/icon.4bpp");
+const u8 gMonFootprint_Donphan[] = INCBIN_U8("graphics/pokemon/donphan/footprint.1bpp");
+
+const u32 gMonFrontPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/front.4bpp.lz");
+const u32 gMonPalette_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/normal.gbapal.lz");
+const u32 gMonBackPic_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/back.4bpp.lz");
+const u32 gMonShinyPalette_Porygon2[] = INCBIN_U32("graphics/pokemon/porygon2/shiny.gbapal.lz");
+const u8 gMonIcon_Porygon2[] = INCBIN_U8("graphics/pokemon/porygon2/icon.4bpp");
+const u8 gMonFootprint_Porygon2[] = INCBIN_U8("graphics/pokemon/porygon2/footprint.1bpp");
+
+const u32 gMonFrontPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/front.4bpp.lz");
+const u32 gMonPalette_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/normal.gbapal.lz");
+const u32 gMonBackPic_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/back.4bpp.lz");
+const u32 gMonShinyPalette_Stantler[] = INCBIN_U32("graphics/pokemon/stantler/shiny.gbapal.lz");
+const u8 gMonIcon_Stantler[] = INCBIN_U8("graphics/pokemon/stantler/icon.4bpp");
+const u8 gMonFootprint_Stantler[] = INCBIN_U8("graphics/pokemon/stantler/footprint.1bpp");
+
+const u32 gMonFrontPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/front.4bpp.lz");
+const u32 gMonPalette_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/normal.gbapal.lz");
+const u32 gMonBackPic_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/back.4bpp.lz");
+const u32 gMonShinyPalette_Smeargle[] = INCBIN_U32("graphics/pokemon/smeargle/shiny.gbapal.lz");
+const u8 gMonIcon_Smeargle[] = INCBIN_U8("graphics/pokemon/smeargle/icon.4bpp");
+const u8 gMonFootprint_Smeargle[] = INCBIN_U8("graphics/pokemon/smeargle/footprint.1bpp");
+
+const u32 gMonFrontPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/front.4bpp.lz");
+const u32 gMonPalette_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/normal.gbapal.lz");
+const u32 gMonBackPic_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/back.4bpp.lz");
+const u32 gMonShinyPalette_Tyrogue[] = INCBIN_U32("graphics/pokemon/tyrogue/shiny.gbapal.lz");
+const u8 gMonIcon_Tyrogue[] = INCBIN_U8("graphics/pokemon/tyrogue/icon.4bpp");
+const u8 gMonFootprint_Tyrogue[] = INCBIN_U8("graphics/pokemon/tyrogue/footprint.1bpp");
+
+const u32 gMonFrontPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/front.4bpp.lz");
+const u32 gMonPalette_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/normal.gbapal.lz");
+const u32 gMonBackPic_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/back.4bpp.lz");
+const u32 gMonShinyPalette_Hitmontop[] = INCBIN_U32("graphics/pokemon/hitmontop/shiny.gbapal.lz");
+const u8 gMonIcon_Hitmontop[] = INCBIN_U8("graphics/pokemon/hitmontop/icon.4bpp");
+
+// This might be undefined memory garbage. Its all 00s except for 1 0F. Its also not referenced.
+const u32 gUndefined_8DD1E90[] = INCBIN_U32("data/garbage_8DD2290.bin");
+
+const u8 gMonFootprint_Hitmontop[] = INCBIN_U8("graphics/pokemon/hitmontop/footprint.1bpp");
+
+const u32 gMonFrontPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/front.4bpp.lz");
+const u32 gMonPalette_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/normal.gbapal.lz");
+const u32 gMonBackPic_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/back.4bpp.lz");
+const u32 gMonShinyPalette_Smoochum[] = INCBIN_U32("graphics/pokemon/smoochum/shiny.gbapal.lz");
+const u8 gMonIcon_Smoochum[] = INCBIN_U8("graphics/pokemon/smoochum/icon.4bpp");
+const u8 gMonFootprint_Smoochum[] = INCBIN_U8("graphics/pokemon/smoochum/footprint.1bpp");
+
+const u32 gMonFrontPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/front.4bpp.lz");
+const u32 gMonPalette_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/normal.gbapal.lz");
+const u32 gMonBackPic_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/back.4bpp.lz");
+const u32 gMonShinyPalette_Elekid[] = INCBIN_U32("graphics/pokemon/elekid/shiny.gbapal.lz");
+const u8 gMonIcon_Elekid[] = INCBIN_U8("graphics/pokemon/elekid/icon.4bpp");
+const u8 gMonFootprint_Elekid[] = INCBIN_U8("graphics/pokemon/elekid/footprint.1bpp");
+
+const u32 gMonFrontPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/front.4bpp.lz");
+const u32 gMonPalette_Magby[] = INCBIN_U32("graphics/pokemon/magby/normal.gbapal.lz");
+const u32 gMonBackPic_Magby[] = INCBIN_U32("graphics/pokemon/magby/back.4bpp.lz");
+const u32 gMonShinyPalette_Magby[] = INCBIN_U32("graphics/pokemon/magby/shiny.gbapal.lz");
+const u8 gMonIcon_Magby[] = INCBIN_U8("graphics/pokemon/magby/icon.4bpp");
+const u8 gMonFootprint_Magby[] = INCBIN_U8("graphics/pokemon/magby/footprint.1bpp");
+
+const u32 gMonFrontPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/front.4bpp.lz");
+const u32 gMonPalette_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/normal.gbapal.lz");
+const u32 gMonBackPic_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/back.4bpp.lz");
+const u32 gMonShinyPalette_Miltank[] = INCBIN_U32("graphics/pokemon/miltank/shiny.gbapal.lz");
+const u8 gMonIcon_Miltank[] = INCBIN_U8("graphics/pokemon/miltank/icon.4bpp");
+const u8 gMonFootprint_Miltank[] = INCBIN_U8("graphics/pokemon/miltank/footprint.1bpp");
+
+const u32 gMonFrontPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/front.4bpp.lz");
+const u32 gMonPalette_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/normal.gbapal.lz");
+const u32 gMonBackPic_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/back.4bpp.lz");
+const u32 gMonShinyPalette_Blissey[] = INCBIN_U32("graphics/pokemon/blissey/shiny.gbapal.lz");
+const u8 gMonIcon_Blissey[] = INCBIN_U8("graphics/pokemon/blissey/icon.4bpp");
+const u8 gMonFootprint_Blissey[] = INCBIN_U8("graphics/pokemon/blissey/footprint.1bpp");
+
+const u32 gMonFrontPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/front.4bpp.lz");
+const u32 gMonPalette_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/normal.gbapal.lz");
+const u32 gMonBackPic_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/back.4bpp.lz");
+const u32 gMonShinyPalette_Raikou[] = INCBIN_U32("graphics/pokemon/raikou/shiny.gbapal.lz");
+const u8 gMonIcon_Raikou[] = INCBIN_U8("graphics/pokemon/raikou/icon.4bpp");
+const u8 gMonFootprint_Raikou[] = INCBIN_U8("graphics/pokemon/raikou/footprint.1bpp");
+
+const u32 gMonFrontPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/front.4bpp.lz");
+const u32 gMonPalette_Entei[] = INCBIN_U32("graphics/pokemon/entei/normal.gbapal.lz");
+const u32 gMonBackPic_Entei[] = INCBIN_U32("graphics/pokemon/entei/back.4bpp.lz");
+const u32 gMonShinyPalette_Entei[] = INCBIN_U32("graphics/pokemon/entei/shiny.gbapal.lz");
+const u8 gMonIcon_Entei[] = INCBIN_U8("graphics/pokemon/entei/icon.4bpp");
+const u8 gMonFootprint_Entei[] = INCBIN_U8("graphics/pokemon/entei/footprint.1bpp");
+
+const u32 gMonFrontPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/front.4bpp.lz");
+const u32 gMonPalette_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/normal.gbapal.lz");
+const u32 gMonBackPic_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/back.4bpp.lz");
+const u32 gMonShinyPalette_Suicune[] = INCBIN_U32("graphics/pokemon/suicune/shiny.gbapal.lz");
+const u8 gMonIcon_Suicune[] = INCBIN_U8("graphics/pokemon/suicune/icon.4bpp");
+const u8 gMonFootprint_Suicune[] = INCBIN_U8("graphics/pokemon/suicune/footprint.1bpp");
+
+const u32 gMonFrontPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/front.4bpp.lz");
+const u32 gMonPalette_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/normal.gbapal.lz");
+const u32 gMonBackPic_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/back.4bpp.lz");
+const u32 gMonShinyPalette_Larvitar[] = INCBIN_U32("graphics/pokemon/larvitar/shiny.gbapal.lz");
+const u8 gMonIcon_Larvitar[] = INCBIN_U8("graphics/pokemon/larvitar/icon.4bpp");
+const u8 gMonFootprint_Larvitar[] = INCBIN_U8("graphics/pokemon/larvitar/footprint.1bpp");
+
+const u32 gMonFrontPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/front.4bpp.lz");
+const u32 gMonPalette_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/normal.gbapal.lz");
+const u32 gMonBackPic_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/back.4bpp.lz");
+const u32 gMonShinyPalette_Pupitar[] = INCBIN_U32("graphics/pokemon/pupitar/shiny.gbapal.lz");
+const u8 gMonIcon_Pupitar[] = INCBIN_U8("graphics/pokemon/pupitar/icon.4bpp");
+const u8 gMonFootprint_Pupitar[] = INCBIN_U8("graphics/pokemon/pupitar/footprint.1bpp");
+
+const u32 gMonFrontPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/front.4bpp.lz");
+const u32 gMonPalette_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/normal.gbapal.lz");
+const u32 gMonBackPic_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/back.4bpp.lz");
+const u32 gMonShinyPalette_Tyranitar[] = INCBIN_U32("graphics/pokemon/tyranitar/shiny.gbapal.lz");
+const u8 gMonIcon_Tyranitar[] = INCBIN_U8("graphics/pokemon/tyranitar/icon.4bpp");
+const u8 gMonFootprint_Tyranitar[] = INCBIN_U8("graphics/pokemon/tyranitar/footprint.1bpp");
+
+const u32 gMonFrontPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/front.4bpp.lz");
+const u32 gMonPalette_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/normal.gbapal.lz");
+const u32 gMonBackPic_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/back.4bpp.lz");
+const u32 gMonShinyPalette_Lugia[] = INCBIN_U32("graphics/pokemon/lugia/shiny.gbapal.lz");
+const u8 gMonIcon_Lugia[] = INCBIN_U8("graphics/pokemon/lugia/icon.4bpp");
+const u8 gMonFootprint_Lugia[] = INCBIN_U8("graphics/pokemon/lugia/footprint.1bpp");
+
+const u32 gMonFrontPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/front.4bpp.lz");
+const u32 gMonPalette_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/normal.gbapal.lz");
+const u32 gMonBackPic_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/back.4bpp.lz");
+const u32 gMonShinyPalette_HoOh[] = INCBIN_U32("graphics/pokemon/ho_oh/shiny.gbapal.lz");
+const u8 gMonIcon_HoOh[] = INCBIN_U8("graphics/pokemon/ho_oh/icon.4bpp");
+const u8 gMonFootprint_HoOh[] = INCBIN_U8("graphics/pokemon/ho_oh/footprint.1bpp");
+
+const u32 gMonFrontPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/front.4bpp.lz");
+const u32 gMonPalette_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/normal.gbapal.lz");
+const u32 gMonBackPic_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/back.4bpp.lz");
+const u32 gMonShinyPalette_Celebi[] = INCBIN_U32("graphics/pokemon/celebi/shiny.gbapal.lz");
+const u8 gMonIcon_Celebi[] = INCBIN_U8("graphics/pokemon/celebi/icon.4bpp");
+const u8 gMonFootprint_Celebi[] = INCBIN_U8("graphics/pokemon/celebi/footprint.1bpp");
+
+const u32 gMonFrontPic_DoubleQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/double/front.4bpp.lz");
+const u32 gMonPalette_DoubleQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/double/normal.gbapal.lz");
+const u32 gMonBackPic_DoubleQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/double/back.4bpp.lz");
+const u32 gMonShinyPalette_DoubleQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/double/shiny.gbapal.lz");
+
+const u32 gMonFrontPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/front.4bpp.lz");
+const u32 gMonPalette_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/normal.gbapal.lz");
+const u32 gMonBackPic_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/back.4bpp.lz");
+const u32 gMonShinyPalette_Treecko[] = INCBIN_U32("graphics/pokemon/treecko/shiny.gbapal.lz");
+const u8 gMonIcon_Treecko[] = INCBIN_U8("graphics/pokemon/treecko/icon.4bpp");
+const u8 gMonFootprint_Treecko[] = INCBIN_U8("graphics/pokemon/treecko/footprint.1bpp");
+
+const u32 gMonFrontPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/front.4bpp.lz");
+const u32 gMonPalette_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/normal.gbapal.lz");
+const u32 gMonBackPic_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/back.4bpp.lz");
+const u32 gMonShinyPalette_Grovyle[] = INCBIN_U32("graphics/pokemon/grovyle/shiny.gbapal.lz");
+const u8 gMonIcon_Grovyle[] = INCBIN_U8("graphics/pokemon/grovyle/icon.4bpp");
+const u8 gMonFootprint_Grovyle[] = INCBIN_U8("graphics/pokemon/grovyle/footprint.1bpp");
+
+const u32 gMonFrontPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/front.4bpp.lz");
+const u32 gMonPalette_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/normal.gbapal.lz");
+const u32 gMonBackPic_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/back.4bpp.lz");
+const u32 gMonShinyPalette_Sceptile[] = INCBIN_U32("graphics/pokemon/sceptile/shiny.gbapal.lz");
+const u8 gMonIcon_Sceptile[] = INCBIN_U8("graphics/pokemon/sceptile/icon.4bpp");
+const u8 gMonFootprint_Sceptile[] = INCBIN_U8("graphics/pokemon/sceptile/footprint.1bpp");
+
+const u32 gMonFrontPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/front.4bpp.lz");
+const u32 gMonPalette_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/normal.gbapal.lz");
+const u32 gMonBackPic_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/back.4bpp.lz");
+const u32 gMonShinyPalette_Torchic[] = INCBIN_U32("graphics/pokemon/torchic/shiny.gbapal.lz");
+const u8 gMonIcon_Torchic[] = INCBIN_U8("graphics/pokemon/torchic/icon.4bpp");
+const u8 gMonFootprint_Torchic[] = INCBIN_U8("graphics/pokemon/torchic/footprint.1bpp");
+
+const u32 gMonFrontPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/front.4bpp.lz");
+const u32 gMonPalette_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/normal.gbapal.lz");
+const u32 gMonBackPic_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/back.4bpp.lz");
+const u32 gMonShinyPalette_Combusken[] = INCBIN_U32("graphics/pokemon/combusken/shiny.gbapal.lz");
+const u8 gMonIcon_Combusken[] = INCBIN_U8("graphics/pokemon/combusken/icon.4bpp");
+const u8 gMonFootprint_Combusken[] = INCBIN_U8("graphics/pokemon/combusken/footprint.1bpp");
+
+const u32 gMonFrontPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/front.4bpp.lz");
+const u32 gMonPalette_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/normal.gbapal.lz");
+const u32 gMonBackPic_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/back.4bpp.lz");
+const u32 gMonShinyPalette_Blaziken[] = INCBIN_U32("graphics/pokemon/blaziken/shiny.gbapal.lz");
+const u8 gMonIcon_Blaziken[] = INCBIN_U8("graphics/pokemon/blaziken/icon.4bpp");
+const u8 gMonFootprint_Blaziken[] = INCBIN_U8("graphics/pokemon/blaziken/footprint.1bpp");
+
+const u32 gMonFrontPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/front.4bpp.lz");
+const u32 gMonPalette_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/normal.gbapal.lz");
+const u32 gMonBackPic_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/back.4bpp.lz");
+const u32 gMonShinyPalette_Mudkip[] = INCBIN_U32("graphics/pokemon/mudkip/shiny.gbapal.lz");
+const u8 gMonIcon_Mudkip[] = INCBIN_U8("graphics/pokemon/mudkip/icon.4bpp");
+const u8 gMonFootprint_Mudkip[] = INCBIN_U8("graphics/pokemon/mudkip/footprint.1bpp");
+
+const u32 gMonFrontPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/front.4bpp.lz");
+const u32 gMonPalette_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/normal.gbapal.lz");
+const u32 gMonBackPic_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/back.4bpp.lz");
+const u32 gMonShinyPalette_Marshtomp[] = INCBIN_U32("graphics/pokemon/marshtomp/shiny.gbapal.lz");
+const u8 gMonIcon_Marshtomp[] = INCBIN_U8("graphics/pokemon/marshtomp/icon.4bpp");
+const u8 gMonFootprint_Marshtomp[] = INCBIN_U8("graphics/pokemon/marshtomp/footprint.1bpp");
+
+const u32 gMonFrontPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/front.4bpp.lz");
+const u32 gMonPalette_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/normal.gbapal.lz");
+const u32 gMonBackPic_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/back.4bpp.lz");
+const u32 gMonShinyPalette_Swampert[] = INCBIN_U32("graphics/pokemon/swampert/shiny.gbapal.lz");
+const u8 gMonIcon_Swampert[] = INCBIN_U8("graphics/pokemon/swampert/icon.4bpp");
+const u8 gMonFootprint_Swampert[] = INCBIN_U8("graphics/pokemon/swampert/footprint.1bpp");
+
+const u32 gMonFrontPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/front.4bpp.lz");
+const u32 gMonPalette_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/normal.gbapal.lz");
+const u32 gMonBackPic_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/back.4bpp.lz");
+const u32 gMonShinyPalette_Poochyena[] = INCBIN_U32("graphics/pokemon/poochyena/shiny.gbapal.lz");
+const u8 gMonIcon_Poochyena[] = INCBIN_U8("graphics/pokemon/poochyena/icon.4bpp");
+const u8 gMonFootprint_Poochyena[] = INCBIN_U8("graphics/pokemon/poochyena/footprint.1bpp");
+
+const u32 gMonFrontPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/front.4bpp.lz");
+const u32 gMonPalette_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/normal.gbapal.lz");
+const u32 gMonBackPic_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/back.4bpp.lz");
+const u32 gMonShinyPalette_Mightyena[] = INCBIN_U32("graphics/pokemon/mightyena/shiny.gbapal.lz");
+const u8 gMonIcon_Mightyena[] = INCBIN_U8("graphics/pokemon/mightyena/icon.4bpp");
+const u8 gMonFootprint_Mightyena[] = INCBIN_U8("graphics/pokemon/mightyena/footprint.1bpp");
+
+const u32 gMonFrontPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/front.4bpp.lz");
+const u32 gMonPalette_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/normal.gbapal.lz");
+const u32 gMonBackPic_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/back.4bpp.lz");
+const u32 gMonShinyPalette_Zigzagoon[] = INCBIN_U32("graphics/pokemon/zigzagoon/shiny.gbapal.lz");
+const u8 gMonIcon_Zigzagoon[] = INCBIN_U8("graphics/pokemon/zigzagoon/icon.4bpp");
+const u8 gMonFootprint_Zigzagoon[] = INCBIN_U8("graphics/pokemon/zigzagoon/footprint.1bpp");
+
+const u32 gMonFrontPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/front.4bpp.lz");
+const u32 gMonPalette_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/normal.gbapal.lz");
+const u32 gMonBackPic_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/back.4bpp.lz");
+const u32 gMonShinyPalette_Linoone[] = INCBIN_U32("graphics/pokemon/linoone/shiny.gbapal.lz");
+const u8 gMonIcon_Linoone[] = INCBIN_U8("graphics/pokemon/linoone/icon.4bpp");
+const u8 gMonFootprint_Linoone[] = INCBIN_U8("graphics/pokemon/linoone/footprint.1bpp");
+
+const u32 gMonFrontPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/front.4bpp.lz");
+const u32 gMonPalette_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/normal.gbapal.lz");
+const u32 gMonBackPic_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/back.4bpp.lz");
+const u32 gMonShinyPalette_Wurmple[] = INCBIN_U32("graphics/pokemon/wurmple/shiny.gbapal.lz");
+const u8 gMonIcon_Wurmple[] = INCBIN_U8("graphics/pokemon/wurmple/icon.4bpp");
+const u8 gMonFootprint_Wurmple[] = INCBIN_U8("graphics/pokemon/wurmple/footprint.1bpp");
+
+const u32 gMonFrontPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/front.4bpp.lz");
+const u32 gMonPalette_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/normal.gbapal.lz");
+const u32 gMonBackPic_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/back.4bpp.lz");
+const u32 gMonShinyPalette_Silcoon[] = INCBIN_U32("graphics/pokemon/silcoon/shiny.gbapal.lz");
+const u8 gMonIcon_Silcoon[] = INCBIN_U8("graphics/pokemon/silcoon/icon.4bpp");
+const u8 gMonFootprint_Silcoon[] = INCBIN_U8("graphics/pokemon/silcoon/footprint.1bpp");
+
+const u32 gMonFrontPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/front.4bpp.lz");
+const u32 gMonPalette_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/normal.gbapal.lz");
+const u32 gMonBackPic_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/back.4bpp.lz");
+const u32 gMonShinyPalette_Beautifly[] = INCBIN_U32("graphics/pokemon/beautifly/shiny.gbapal.lz");
+const u8 gMonIcon_Beautifly[] = INCBIN_U8("graphics/pokemon/beautifly/icon.4bpp");
+const u8 gMonFootprint_Beautifly[] = INCBIN_U8("graphics/pokemon/beautifly/footprint.1bpp");
+
+const u32 gMonFrontPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/front.4bpp.lz");
+const u32 gMonPalette_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/normal.gbapal.lz");
+const u32 gMonBackPic_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/back.4bpp.lz");
+const u32 gMonShinyPalette_Cascoon[] = INCBIN_U32("graphics/pokemon/cascoon/shiny.gbapal.lz");
+const u8 gMonIcon_Cascoon[] = INCBIN_U8("graphics/pokemon/cascoon/icon.4bpp");
+const u8 gMonFootprint_Cascoon[] = INCBIN_U8("graphics/pokemon/cascoon/footprint.1bpp");
+
+const u32 gMonFrontPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/front.4bpp.lz");
+const u32 gMonPalette_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/normal.gbapal.lz");
+const u32 gMonBackPic_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/back.4bpp.lz");
+const u32 gMonShinyPalette_Dustox[] = INCBIN_U32("graphics/pokemon/dustox/shiny.gbapal.lz");
+const u8 gMonIcon_Dustox[] = INCBIN_U8("graphics/pokemon/dustox/icon.4bpp");
+const u8 gMonFootprint_Dustox[] = INCBIN_U8("graphics/pokemon/dustox/footprint.1bpp");
+
+const u32 gMonFrontPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/front.4bpp.lz");
+const u32 gMonPalette_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/normal.gbapal.lz");
+const u32 gMonBackPic_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/back.4bpp.lz");
+const u32 gMonShinyPalette_Lotad[] = INCBIN_U32("graphics/pokemon/lotad/shiny.gbapal.lz");
+const u8 gMonIcon_Lotad[] = INCBIN_U8("graphics/pokemon/lotad/icon.4bpp");
+const u8 gMonFootprint_Lotad[] = INCBIN_U8("graphics/pokemon/lotad/footprint.1bpp");
+
+const u32 gMonFrontPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/front.4bpp.lz");
+const u32 gMonPalette_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/normal.gbapal.lz");
+const u32 gMonBackPic_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/back.4bpp.lz");
+const u32 gMonShinyPalette_Lombre[] = INCBIN_U32("graphics/pokemon/lombre/shiny.gbapal.lz");
+const u8 gMonIcon_Lombre[] = INCBIN_U8("graphics/pokemon/lombre/icon.4bpp");
+const u8 gMonFootprint_Lombre[] = INCBIN_U8("graphics/pokemon/lombre/footprint.1bpp");
+
+const u32 gMonFrontPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/front.4bpp.lz");
+const u32 gMonPalette_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/normal.gbapal.lz");
+const u32 gMonBackPic_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/back.4bpp.lz");
+const u32 gMonShinyPalette_Ludicolo[] = INCBIN_U32("graphics/pokemon/ludicolo/shiny.gbapal.lz");
+const u8 gMonIcon_Ludicolo[] = INCBIN_U8("graphics/pokemon/ludicolo/icon.4bpp");
+const u8 gMonFootprint_Ludicolo[] = INCBIN_U8("graphics/pokemon/ludicolo/footprint.1bpp");
+
+const u32 gMonFrontPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/front.4bpp.lz");
+const u32 gMonPalette_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/normal.gbapal.lz");
+const u32 gMonBackPic_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/back.4bpp.lz");
+const u32 gMonShinyPalette_Seedot[] = INCBIN_U32("graphics/pokemon/seedot/shiny.gbapal.lz");
+const u8 gMonIcon_Seedot[] = INCBIN_U8("graphics/pokemon/seedot/icon.4bpp");
+const u8 gMonFootprint_Seedot[] = INCBIN_U8("graphics/pokemon/seedot/footprint.1bpp");
+
+const u32 gMonFrontPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/front.4bpp.lz");
+const u32 gMonPalette_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/normal.gbapal.lz");
+const u32 gMonBackPic_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/back.4bpp.lz");
+const u32 gMonShinyPalette_Nuzleaf[] = INCBIN_U32("graphics/pokemon/nuzleaf/shiny.gbapal.lz");
+const u8 gMonIcon_Nuzleaf[] = INCBIN_U8("graphics/pokemon/nuzleaf/icon.4bpp");
+const u8 gMonFootprint_Nuzleaf[] = INCBIN_U8("graphics/pokemon/nuzleaf/footprint.1bpp");
+
+const u32 gMonFrontPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/front.4bpp.lz");
+const u32 gMonPalette_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/normal.gbapal.lz");
+const u32 gMonBackPic_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/back.4bpp.lz");
+const u32 gMonShinyPalette_Shiftry[] = INCBIN_U32("graphics/pokemon/shiftry/shiny.gbapal.lz");
+const u8 gMonIcon_Shiftry[] = INCBIN_U8("graphics/pokemon/shiftry/icon.4bpp");
+const u8 gMonFootprint_Shiftry[] = INCBIN_U8("graphics/pokemon/shiftry/footprint.1bpp");
+
+const u32 gMonFrontPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/front.4bpp.lz");
+const u32 gMonPalette_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/normal.gbapal.lz");
+const u32 gMonBackPic_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/back.4bpp.lz");
+const u32 gMonShinyPalette_Nincada[] = INCBIN_U32("graphics/pokemon/nincada/shiny.gbapal.lz");
+const u8 gMonIcon_Nincada[] = INCBIN_U8("graphics/pokemon/nincada/icon.4bpp");
+const u8 gMonFootprint_Nincada[] = INCBIN_U8("graphics/pokemon/nincada/footprint.1bpp");
+
+const u32 gMonFrontPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/front.4bpp.lz");
+const u32 gMonPalette_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/normal.gbapal.lz");
+const u32 gMonBackPic_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/back.4bpp.lz");
+const u32 gMonShinyPalette_Ninjask[] = INCBIN_U32("graphics/pokemon/ninjask/shiny.gbapal.lz");
+const u8 gMonIcon_Ninjask[] = INCBIN_U8("graphics/pokemon/ninjask/icon.4bpp");
+const u8 gMonFootprint_Ninjask[] = INCBIN_U8("graphics/pokemon/ninjask/footprint.1bpp");
+
+const u32 gMonFrontPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/front.4bpp.lz");
+const u32 gMonPalette_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/normal.gbapal.lz");
+const u32 gMonBackPic_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/back.4bpp.lz");
+const u32 gMonShinyPalette_Shedinja[] = INCBIN_U32("graphics/pokemon/shedinja/shiny.gbapal.lz");
+const u8 gMonIcon_Shedinja[] = INCBIN_U8("graphics/pokemon/shedinja/icon.4bpp");
+const u8 gMonFootprint_Shedinja[] = INCBIN_U8("graphics/pokemon/shedinja/footprint.1bpp");
+
+const u32 gMonFrontPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/front.4bpp.lz");
+const u32 gMonPalette_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/normal.gbapal.lz");
+const u32 gMonBackPic_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/back.4bpp.lz");
+const u32 gMonShinyPalette_Taillow[] = INCBIN_U32("graphics/pokemon/taillow/shiny.gbapal.lz");
+const u8 gMonIcon_Taillow[] = INCBIN_U8("graphics/pokemon/taillow/icon.4bpp");
+const u8 gMonFootprint_Taillow[] = INCBIN_U8("graphics/pokemon/taillow/footprint.1bpp");
+
+const u32 gMonFrontPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/front.4bpp.lz");
+const u32 gMonPalette_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/normal.gbapal.lz");
+const u32 gMonBackPic_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/back.4bpp.lz");
+const u32 gMonShinyPalette_Swellow[] = INCBIN_U32("graphics/pokemon/swellow/shiny.gbapal.lz");
+const u8 gMonIcon_Swellow[] = INCBIN_U8("graphics/pokemon/swellow/icon.4bpp");
+const u8 gMonFootprint_Swellow[] = INCBIN_U8("graphics/pokemon/swellow/footprint.1bpp");
+
+const u32 gMonFrontPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/front.4bpp.lz");
+const u32 gMonPalette_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/normal.gbapal.lz");
+const u32 gMonBackPic_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/back.4bpp.lz");
+const u32 gMonShinyPalette_Shroomish[] = INCBIN_U32("graphics/pokemon/shroomish/shiny.gbapal.lz");
+const u8 gMonIcon_Shroomish[] = INCBIN_U8("graphics/pokemon/shroomish/icon.4bpp");
+const u8 gMonFootprint_Shroomish[] = INCBIN_U8("graphics/pokemon/shroomish/footprint.1bpp");
+
+const u32 gMonFrontPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/front.4bpp.lz");
+const u32 gMonPalette_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/normal.gbapal.lz");
+const u32 gMonBackPic_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/back.4bpp.lz");
+const u32 gMonShinyPalette_Breloom[] = INCBIN_U32("graphics/pokemon/breloom/shiny.gbapal.lz");
+const u8 gMonIcon_Breloom[] = INCBIN_U8("graphics/pokemon/breloom/icon.4bpp");
+const u8 gMonFootprint_Breloom[] = INCBIN_U8("graphics/pokemon/breloom/footprint.1bpp");
+
+const u32 gMonFrontPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/front.4bpp.lz");
+const u32 gMonPalette_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/normal.gbapal.lz");
+const u32 gMonBackPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/back.4bpp.lz");
+const u32 gMonShinyPalette_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/shiny.gbapal.lz");
+const u8 gMonIcon_Spinda[] = INCBIN_U8("graphics/pokemon/spinda/icon.4bpp");
+const u8 gMonFootprint_Spinda[] = INCBIN_U8("graphics/pokemon/spinda/footprint.1bpp");
+
+const u32 gMonFrontPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/front.4bpp.lz");
+const u32 gMonPalette_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/normal.gbapal.lz");
+const u32 gMonBackPic_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/back.4bpp.lz");
+const u32 gMonShinyPalette_Wingull[] = INCBIN_U32("graphics/pokemon/wingull/shiny.gbapal.lz");
+const u8 gMonIcon_Wingull[] = INCBIN_U8("graphics/pokemon/wingull/icon.4bpp");
+const u8 gMonFootprint_Wingull[] = INCBIN_U8("graphics/pokemon/wingull/footprint.1bpp");
+
+const u32 gMonFrontPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/front.4bpp.lz");
+const u32 gMonPalette_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/normal.gbapal.lz");
+const u32 gMonBackPic_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/back.4bpp.lz");
+const u32 gMonShinyPalette_Pelipper[] = INCBIN_U32("graphics/pokemon/pelipper/shiny.gbapal.lz");
+const u8 gMonIcon_Pelipper[] = INCBIN_U8("graphics/pokemon/pelipper/icon.4bpp");
+const u8 gMonFootprint_Pelipper[] = INCBIN_U8("graphics/pokemon/pelipper/footprint.1bpp");
+
+const u32 gMonFrontPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/front.4bpp.lz");
+const u32 gMonPalette_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/normal.gbapal.lz");
+const u32 gMonBackPic_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/back.4bpp.lz");
+const u32 gMonShinyPalette_Surskit[] = INCBIN_U32("graphics/pokemon/surskit/shiny.gbapal.lz");
+const u8 gMonIcon_Surskit[] = INCBIN_U8("graphics/pokemon/surskit/icon.4bpp");
+const u8 gMonFootprint_Surskit[] = INCBIN_U8("graphics/pokemon/surskit/footprint.1bpp");
+
+const u32 gMonFrontPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/front.4bpp.lz");
+const u32 gMonPalette_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/normal.gbapal.lz");
+const u32 gMonBackPic_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/back.4bpp.lz");
+const u32 gMonShinyPalette_Masquerain[] = INCBIN_U32("graphics/pokemon/masquerain/shiny.gbapal.lz");
+const u8 gMonIcon_Masquerain[] = INCBIN_U8("graphics/pokemon/masquerain/icon.4bpp");
+const u8 gMonFootprint_Masquerain[] = INCBIN_U8("graphics/pokemon/masquerain/footprint.1bpp");
+
+const u32 gMonFrontPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/front.4bpp.lz");
+const u32 gMonPalette_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/normal.gbapal.lz");
+const u32 gMonBackPic_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/back.4bpp.lz");
+const u32 gMonShinyPalette_Wailmer[] = INCBIN_U32("graphics/pokemon/wailmer/shiny.gbapal.lz");
+const u8 gMonIcon_Wailmer[] = INCBIN_U8("graphics/pokemon/wailmer/icon.4bpp");
+const u8 gMonFootprint_Wailmer[] = INCBIN_U8("graphics/pokemon/wailmer/footprint.1bpp");
+
+const u32 gMonFrontPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/front.4bpp.lz");
+const u32 gMonPalette_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/normal.gbapal.lz");
+const u32 gMonBackPic_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/back.4bpp.lz");
+const u32 gMonShinyPalette_Wailord[] = INCBIN_U32("graphics/pokemon/wailord/shiny.gbapal.lz");
+const u8 gMonIcon_Wailord[] = INCBIN_U8("graphics/pokemon/wailord/icon.4bpp");
+const u8 gMonFootprint_Wailord[] = INCBIN_U8("graphics/pokemon/wailord/footprint.1bpp");
+
+const u32 gMonFrontPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/front.4bpp.lz");
+const u32 gMonPalette_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/normal.gbapal.lz");
+const u32 gMonBackPic_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/back.4bpp.lz");
+const u32 gMonShinyPalette_Skitty[] = INCBIN_U32("graphics/pokemon/skitty/shiny.gbapal.lz");
+const u8 gMonIcon_Skitty[] = INCBIN_U8("graphics/pokemon/skitty/icon.4bpp");
+const u8 gMonFootprint_Skitty[] = INCBIN_U8("graphics/pokemon/skitty/footprint.1bpp");
+
+const u32 gMonFrontPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/front.4bpp.lz");
+const u32 gMonPalette_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/normal.gbapal.lz");
+const u32 gMonBackPic_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/back.4bpp.lz");
+const u32 gMonShinyPalette_Delcatty[] = INCBIN_U32("graphics/pokemon/delcatty/shiny.gbapal.lz");
+const u8 gMonIcon_Delcatty[] = INCBIN_U8("graphics/pokemon/delcatty/icon.4bpp");
+const u8 gMonFootprint_Delcatty[] = INCBIN_U8("graphics/pokemon/delcatty/footprint.1bpp");
+
+const u32 gMonFrontPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/front.4bpp.lz");
+const u32 gMonPalette_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/normal.gbapal.lz");
+const u32 gMonBackPic_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/back.4bpp.lz");
+const u32 gMonShinyPalette_Kecleon[] = INCBIN_U32("graphics/pokemon/kecleon/shiny.gbapal.lz");
+const u8 gMonIcon_Kecleon[] = INCBIN_U8("graphics/pokemon/kecleon/icon.4bpp");
+const u8 gMonFootprint_Kecleon[] = INCBIN_U8("graphics/pokemon/kecleon/footprint.1bpp");
+
+const u32 gMonFrontPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/front.4bpp.lz");
+const u32 gMonPalette_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/normal.gbapal.lz");
+const u32 gMonBackPic_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/back.4bpp.lz");
+const u32 gMonShinyPalette_Baltoy[] = INCBIN_U32("graphics/pokemon/baltoy/shiny.gbapal.lz");
+const u8 gMonIcon_Baltoy[] = INCBIN_U8("graphics/pokemon/baltoy/icon.4bpp");
+const u8 gMonFootprint_Baltoy[] = INCBIN_U8("graphics/pokemon/baltoy/footprint.1bpp");
+
+const u32 gMonFrontPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/front.4bpp.lz");
+const u32 gMonPalette_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/normal.gbapal.lz");
+const u32 gMonBackPic_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/back.4bpp.lz");
+const u32 gMonShinyPalette_Claydol[] = INCBIN_U32("graphics/pokemon/claydol/shiny.gbapal.lz");
+const u8 gMonIcon_Claydol[] = INCBIN_U8("graphics/pokemon/claydol/icon.4bpp");
+const u8 gMonFootprint_Claydol[] = INCBIN_U8("graphics/pokemon/claydol/footprint.1bpp");
+
+const u32 gMonFrontPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/front.4bpp.lz");
+const u32 gMonPalette_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/normal.gbapal.lz");
+const u32 gMonBackPic_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/back.4bpp.lz");
+const u32 gMonShinyPalette_Nosepass[] = INCBIN_U32("graphics/pokemon/nosepass/shiny.gbapal.lz");
+const u8 gMonIcon_Nosepass[] = INCBIN_U8("graphics/pokemon/nosepass/icon.4bpp");
+const u8 gMonFootprint_Nosepass[] = INCBIN_U8("graphics/pokemon/nosepass/footprint.1bpp");
+
+const u32 gMonFrontPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/front.4bpp.lz");
+const u32 gMonPalette_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/normal.gbapal.lz");
+const u32 gMonBackPic_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/back.4bpp.lz");
+const u32 gMonShinyPalette_Torkoal[] = INCBIN_U32("graphics/pokemon/torkoal/shiny.gbapal.lz");
+const u8 gMonIcon_Torkoal[] = INCBIN_U8("graphics/pokemon/torkoal/icon.4bpp");
+const u8 gMonFootprint_Torkoal[] = INCBIN_U8("graphics/pokemon/torkoal/footprint.1bpp");
+
+const u32 gMonFrontPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/front.4bpp.lz");
+const u32 gMonPalette_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/normal.gbapal.lz");
+const u32 gMonBackPic_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/back.4bpp.lz");
+const u32 gMonShinyPalette_Sableye[] = INCBIN_U32("graphics/pokemon/sableye/shiny.gbapal.lz");
+const u8 gMonIcon_Sableye[] = INCBIN_U8("graphics/pokemon/sableye/icon.4bpp");
+const u8 gMonFootprint_Sableye[] = INCBIN_U8("graphics/pokemon/sableye/footprint.1bpp");
+
+const u32 gMonFrontPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/front.4bpp.lz");
+const u32 gMonPalette_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/normal.gbapal.lz");
+const u32 gMonBackPic_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/back.4bpp.lz");
+const u32 gMonShinyPalette_Barboach[] = INCBIN_U32("graphics/pokemon/barboach/shiny.gbapal.lz");
+const u8 gMonIcon_Barboach[] = INCBIN_U8("graphics/pokemon/barboach/icon.4bpp");
+const u8 gMonFootprint_Barboach[] = INCBIN_U8("graphics/pokemon/barboach/footprint.1bpp");
+
+const u32 gMonFrontPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/front.4bpp.lz");
+const u32 gMonPalette_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/normal.gbapal.lz");
+const u32 gMonBackPic_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/back.4bpp.lz");
+const u32 gMonShinyPalette_Whiscash[] = INCBIN_U32("graphics/pokemon/whiscash/shiny.gbapal.lz");
+const u8 gMonIcon_Whiscash[] = INCBIN_U8("graphics/pokemon/whiscash/icon.4bpp");
+const u8 gMonFootprint_Whiscash[] = INCBIN_U8("graphics/pokemon/whiscash/footprint.1bpp");
+
+const u32 gMonFrontPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/front.4bpp.lz");
+const u32 gMonPalette_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/normal.gbapal.lz");
+const u32 gMonBackPic_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/back.4bpp.lz");
+const u32 gMonShinyPalette_Luvdisc[] = INCBIN_U32("graphics/pokemon/luvdisc/shiny.gbapal.lz");
+const u8 gMonIcon_Luvdisc[] = INCBIN_U8("graphics/pokemon/luvdisc/icon.4bpp");
+const u8 gMonFootprint_Luvdisc[] = INCBIN_U8("graphics/pokemon/luvdisc/footprint.1bpp");
+
+const u32 gMonFrontPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/front.4bpp.lz");
+const u32 gMonPalette_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/normal.gbapal.lz");
+const u32 gMonBackPic_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/back.4bpp.lz");
+const u32 gMonShinyPalette_Corphish[] = INCBIN_U32("graphics/pokemon/corphish/shiny.gbapal.lz");
+const u8 gMonIcon_Corphish[] = INCBIN_U8("graphics/pokemon/corphish/icon.4bpp");
+const u8 gMonFootprint_Corphish[] = INCBIN_U8("graphics/pokemon/corphish/footprint.1bpp");
+
+const u32 gMonFrontPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/front.4bpp.lz");
+const u32 gMonPalette_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/normal.gbapal.lz");
+const u32 gMonBackPic_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/back.4bpp.lz");
+const u32 gMonShinyPalette_Crawdaunt[] = INCBIN_U32("graphics/pokemon/crawdaunt/shiny.gbapal.lz");
+const u8 gMonIcon_Crawdaunt[] = INCBIN_U8("graphics/pokemon/crawdaunt/icon.4bpp");
+const u8 gMonFootprint_Crawdaunt[] = INCBIN_U8("graphics/pokemon/crawdaunt/footprint.1bpp");
+
+const u32 gMonFrontPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/front.4bpp.lz");
+const u32 gMonPalette_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/normal.gbapal.lz");
+const u32 gMonBackPic_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/back.4bpp.lz");
+const u32 gMonShinyPalette_Feebas[] = INCBIN_U32("graphics/pokemon/feebas/shiny.gbapal.lz");
+const u8 gMonIcon_Feebas[] = INCBIN_U8("graphics/pokemon/feebas/icon.4bpp");
+const u8 gMonFootprint_Feebas[] = INCBIN_U8("graphics/pokemon/feebas/footprint.1bpp");
+
+const u32 gMonFrontPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/front.4bpp.lz");
+const u32 gMonPalette_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/normal.gbapal.lz");
+const u32 gMonBackPic_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/back.4bpp.lz");
+const u32 gMonShinyPalette_Milotic[] = INCBIN_U32("graphics/pokemon/milotic/shiny.gbapal.lz");
+const u8 gMonIcon_Milotic[] = INCBIN_U8("graphics/pokemon/milotic/icon.4bpp");
+const u8 gMonFootprint_Milotic[] = INCBIN_U8("graphics/pokemon/milotic/footprint.1bpp");
+
+const u32 gMonFrontPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/front.4bpp.lz");
+const u32 gMonPalette_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/normal.gbapal.lz");
+const u32 gMonBackPic_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/back.4bpp.lz");
+const u32 gMonShinyPalette_Carvanha[] = INCBIN_U32("graphics/pokemon/carvanha/shiny.gbapal.lz");
+const u8 gMonIcon_Carvanha[] = INCBIN_U8("graphics/pokemon/carvanha/icon.4bpp");
+const u8 gMonFootprint_Carvanha[] = INCBIN_U8("graphics/pokemon/carvanha/footprint.1bpp");
+
+const u32 gMonFrontPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/front.4bpp.lz");
+const u32 gMonPalette_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/normal.gbapal.lz");
+const u32 gMonBackPic_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/back.4bpp.lz");
+const u32 gMonShinyPalette_Sharpedo[] = INCBIN_U32("graphics/pokemon/sharpedo/shiny.gbapal.lz");
+const u8 gMonIcon_Sharpedo[] = INCBIN_U8("graphics/pokemon/sharpedo/icon.4bpp");
+const u8 gMonFootprint_Sharpedo[] = INCBIN_U8("graphics/pokemon/sharpedo/footprint.1bpp");
+
+const u32 gMonFrontPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/front.4bpp.lz");
+const u32 gMonPalette_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/normal.gbapal.lz");
+const u32 gMonBackPic_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/back.4bpp.lz");
+const u32 gMonShinyPalette_Trapinch[] = INCBIN_U32("graphics/pokemon/trapinch/shiny.gbapal.lz");
+const u8 gMonIcon_Trapinch[] = INCBIN_U8("graphics/pokemon/trapinch/icon.4bpp");
+const u8 gMonFootprint_Trapinch[] = INCBIN_U8("graphics/pokemon/trapinch/footprint.1bpp");
+
+const u32 gMonFrontPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/front.4bpp.lz");
+const u32 gMonPalette_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/normal.gbapal.lz");
+const u32 gMonBackPic_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/back.4bpp.lz");
+const u32 gMonShinyPalette_Vibrava[] = INCBIN_U32("graphics/pokemon/vibrava/shiny.gbapal.lz");
+const u8 gMonIcon_Vibrava[] = INCBIN_U8("graphics/pokemon/vibrava/icon.4bpp");
+const u8 gMonFootprint_Vibrava[] = INCBIN_U8("graphics/pokemon/vibrava/footprint.1bpp");
+
+const u32 gMonFrontPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/front.4bpp.lz");
+const u32 gMonPalette_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/normal.gbapal.lz");
+const u32 gMonBackPic_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/back.4bpp.lz");
+const u32 gMonShinyPalette_Flygon[] = INCBIN_U32("graphics/pokemon/flygon/shiny.gbapal.lz");
+const u8 gMonIcon_Flygon[] = INCBIN_U8("graphics/pokemon/flygon/icon.4bpp");
+const u8 gMonFootprint_Flygon[] = INCBIN_U8("graphics/pokemon/flygon/footprint.1bpp");
+
+const u32 gMonFrontPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/front.4bpp.lz");
+const u32 gMonPalette_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/normal.gbapal.lz");
+const u32 gMonBackPic_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/back.4bpp.lz");
+const u32 gMonShinyPalette_Makuhita[] = INCBIN_U32("graphics/pokemon/makuhita/shiny.gbapal.lz");
+const u8 gMonIcon_Makuhita[] = INCBIN_U8("graphics/pokemon/makuhita/icon.4bpp");
+const u8 gMonFootprint_Makuhita[] = INCBIN_U8("graphics/pokemon/makuhita/footprint.1bpp");
+
+const u32 gMonFrontPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/front.4bpp.lz");
+const u32 gMonPalette_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/normal.gbapal.lz");
+const u32 gMonBackPic_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/back.4bpp.lz");
+const u32 gMonShinyPalette_Hariyama[] = INCBIN_U32("graphics/pokemon/hariyama/shiny.gbapal.lz");
+const u8 gMonIcon_Hariyama[] = INCBIN_U8("graphics/pokemon/hariyama/icon.4bpp");
+const u8 gMonFootprint_Hariyama[] = INCBIN_U8("graphics/pokemon/hariyama/footprint.1bpp");
+
+const u32 gMonFrontPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/front.4bpp.lz");
+const u32 gMonPalette_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/normal.gbapal.lz");
+const u32 gMonBackPic_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/back.4bpp.lz");
+const u32 gMonShinyPalette_Electrike[] = INCBIN_U32("graphics/pokemon/electrike/shiny.gbapal.lz");
+const u8 gMonIcon_Electrike[] = INCBIN_U8("graphics/pokemon/electrike/icon.4bpp");
+const u8 gMonFootprint_Electrike[] = INCBIN_U8("graphics/pokemon/electrike/footprint.1bpp");
+
+const u32 gMonFrontPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/front.4bpp.lz");
+const u32 gMonPalette_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/normal.gbapal.lz");
+const u32 gMonBackPic_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/back.4bpp.lz");
+const u32 gMonShinyPalette_Manectric[] = INCBIN_U32("graphics/pokemon/manectric/shiny.gbapal.lz");
+const u8 gMonIcon_Manectric[] = INCBIN_U8("graphics/pokemon/manectric/icon.4bpp");
+const u8 gMonFootprint_Manectric[] = INCBIN_U8("graphics/pokemon/manectric/footprint.1bpp");
+
+const u32 gMonFrontPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/front.4bpp.lz");
+const u32 gMonPalette_Numel[] = INCBIN_U32("graphics/pokemon/numel/normal.gbapal.lz");
+const u32 gMonBackPic_Numel[] = INCBIN_U32("graphics/pokemon/numel/back.4bpp.lz");
+const u32 gMonShinyPalette_Numel[] = INCBIN_U32("graphics/pokemon/numel/shiny.gbapal.lz");
+const u8 gMonIcon_Numel[] = INCBIN_U8("graphics/pokemon/numel/icon.4bpp");
+const u8 gMonFootprint_Numel[] = INCBIN_U8("graphics/pokemon/numel/footprint.1bpp");
+
+const u32 gMonFrontPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/front.4bpp.lz");
+const u32 gMonPalette_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/normal.gbapal.lz");
+const u32 gMonBackPic_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/back.4bpp.lz");
+const u32 gMonShinyPalette_Camerupt[] = INCBIN_U32("graphics/pokemon/camerupt/shiny.gbapal.lz");
+const u8 gMonIcon_Camerupt[] = INCBIN_U8("graphics/pokemon/camerupt/icon.4bpp");
+const u8 gMonFootprint_Camerupt[] = INCBIN_U8("graphics/pokemon/camerupt/footprint.1bpp");
+
+const u32 gMonFrontPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/front.4bpp.lz");
+const u32 gMonPalette_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/normal.gbapal.lz");
+const u32 gMonBackPic_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/back.4bpp.lz");
+const u32 gMonShinyPalette_Spheal[] = INCBIN_U32("graphics/pokemon/spheal/shiny.gbapal.lz");
+const u8 gMonIcon_Spheal[] = INCBIN_U8("graphics/pokemon/spheal/icon.4bpp");
+const u8 gMonFootprint_Spheal[] = INCBIN_U8("graphics/pokemon/spheal/footprint.1bpp");
+
+const u32 gMonFrontPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/front.4bpp.lz");
+const u32 gMonPalette_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/normal.gbapal.lz");
+const u32 gMonBackPic_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/back.4bpp.lz");
+const u32 gMonShinyPalette_Sealeo[] = INCBIN_U32("graphics/pokemon/sealeo/shiny.gbapal.lz");
+const u8 gMonIcon_Sealeo[] = INCBIN_U8("graphics/pokemon/sealeo/icon.4bpp");
+const u8 gMonFootprint_Sealeo[] = INCBIN_U8("graphics/pokemon/sealeo/footprint.1bpp");
+
+const u32 gMonFrontPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/front.4bpp.lz");
+const u32 gMonPalette_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/normal.gbapal.lz");
+const u32 gMonBackPic_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/back.4bpp.lz");
+const u32 gMonShinyPalette_Walrein[] = INCBIN_U32("graphics/pokemon/walrein/shiny.gbapal.lz");
+const u8 gMonIcon_Walrein[] = INCBIN_U8("graphics/pokemon/walrein/icon.4bpp");
+const u8 gMonFootprint_Walrein[] = INCBIN_U8("graphics/pokemon/walrein/footprint.1bpp");
+
+const u32 gMonFrontPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/front.4bpp.lz");
+const u32 gMonPalette_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/normal.gbapal.lz");
+const u32 gMonBackPic_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/back.4bpp.lz");
+const u32 gMonShinyPalette_Cacnea[] = INCBIN_U32("graphics/pokemon/cacnea/shiny.gbapal.lz");
+const u8 gMonIcon_Cacnea[] = INCBIN_U8("graphics/pokemon/cacnea/icon.4bpp");
+const u8 gMonFootprint_Cacnea[] = INCBIN_U8("graphics/pokemon/cacnea/footprint.1bpp");
+
+const u32 gMonFrontPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/front.4bpp.lz");
+const u32 gMonPalette_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/normal.gbapal.lz");
+const u32 gMonBackPic_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/back.4bpp.lz");
+const u32 gMonShinyPalette_Cacturne[] = INCBIN_U32("graphics/pokemon/cacturne/shiny.gbapal.lz");
+const u8 gMonIcon_Cacturne[] = INCBIN_U8("graphics/pokemon/cacturne/icon.4bpp");
+const u8 gMonFootprint_Cacturne[] = INCBIN_U8("graphics/pokemon/cacturne/footprint.1bpp");
+
+const u32 gMonFrontPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/front.4bpp.lz");
+const u32 gMonPalette_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/normal.gbapal.lz");
+const u32 gMonBackPic_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/back.4bpp.lz");
+const u32 gMonShinyPalette_Snorunt[] = INCBIN_U32("graphics/pokemon/snorunt/shiny.gbapal.lz");
+const u8 gMonIcon_Snorunt[] = INCBIN_U8("graphics/pokemon/snorunt/icon.4bpp");
+const u8 gMonFootprint_Snorunt[] = INCBIN_U8("graphics/pokemon/snorunt/footprint.1bpp");
+
+const u32 gMonFrontPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/front.4bpp.lz");
+const u32 gMonPalette_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/normal.gbapal.lz");
+const u32 gMonBackPic_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/back.4bpp.lz");
+const u32 gMonShinyPalette_Glalie[] = INCBIN_U32("graphics/pokemon/glalie/shiny.gbapal.lz");
+const u8 gMonIcon_Glalie[] = INCBIN_U8("graphics/pokemon/glalie/icon.4bpp");
+const u8 gMonFootprint_Glalie[] = INCBIN_U8("graphics/pokemon/glalie/footprint.1bpp");
+
+const u32 gMonFrontPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/front.4bpp.lz");
+const u32 gMonPalette_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/normal.gbapal.lz");
+const u32 gMonBackPic_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/back.4bpp.lz");
+const u32 gMonShinyPalette_Lunatone[] = INCBIN_U32("graphics/pokemon/lunatone/shiny.gbapal.lz");
+const u8 gMonIcon_Lunatone[] = INCBIN_U8("graphics/pokemon/lunatone/icon.4bpp");
+const u8 gMonFootprint_Lunatone[] = INCBIN_U8("graphics/pokemon/lunatone/footprint.1bpp");
+
+const u32 gMonFrontPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/front.4bpp.lz");
+const u32 gMonPalette_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/normal.gbapal.lz");
+const u32 gMonBackPic_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/back.4bpp.lz");
+const u32 gMonShinyPalette_Solrock[] = INCBIN_U32("graphics/pokemon/solrock/shiny.gbapal.lz");
+const u8 gMonIcon_Solrock[] = INCBIN_U8("graphics/pokemon/solrock/icon.4bpp");
+const u8 gMonFootprint_Solrock[] = INCBIN_U8("graphics/pokemon/solrock/footprint.1bpp");
+
+const u32 gMonFrontPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/front.4bpp.lz");
+const u32 gMonPalette_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/normal.gbapal.lz");
+const u32 gMonBackPic_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/back.4bpp.lz");
+const u32 gMonShinyPalette_Azurill[] = INCBIN_U32("graphics/pokemon/azurill/shiny.gbapal.lz");
+const u8 gMonIcon_Azurill[] = INCBIN_U8("graphics/pokemon/azurill/icon.4bpp");
+const u8 gMonFootprint_Azurill[] = INCBIN_U8("graphics/pokemon/azurill/footprint.1bpp");
+
+const u32 gMonFrontPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/front.4bpp.lz");
+const u32 gMonPalette_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/normal.gbapal.lz");
+const u32 gMonBackPic_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/back.4bpp.lz");
+const u32 gMonShinyPalette_Spoink[] = INCBIN_U32("graphics/pokemon/spoink/shiny.gbapal.lz");
+const u8 gMonIcon_Spoink[] = INCBIN_U8("graphics/pokemon/spoink/icon.4bpp");
+const u8 gMonFootprint_Spoink[] = INCBIN_U8("graphics/pokemon/spoink/footprint.1bpp");
+
+const u32 gMonFrontPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/front.4bpp.lz");
+const u32 gMonPalette_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/normal.gbapal.lz");
+const u32 gMonBackPic_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/back.4bpp.lz");
+const u32 gMonShinyPalette_Grumpig[] = INCBIN_U32("graphics/pokemon/grumpig/shiny.gbapal.lz");
+const u8 gMonIcon_Grumpig[] = INCBIN_U8("graphics/pokemon/grumpig/icon.4bpp");
+const u8 gMonFootprint_Grumpig[] = INCBIN_U8("graphics/pokemon/grumpig/footprint.1bpp");
+
+const u32 gMonFrontPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/front.4bpp.lz");
+const u32 gMonPalette_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/normal.gbapal.lz");
+const u32 gMonBackPic_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/back.4bpp.lz");
+const u32 gMonShinyPalette_Plusle[] = INCBIN_U32("graphics/pokemon/plusle/shiny.gbapal.lz");
+const u8 gMonIcon_Plusle[] = INCBIN_U8("graphics/pokemon/plusle/icon.4bpp");
+const u8 gMonFootprint_Plusle[] = INCBIN_U8("graphics/pokemon/plusle/footprint.1bpp");
+
+const u32 gMonFrontPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/front.4bpp.lz");
+const u32 gMonPalette_Minun[] = INCBIN_U32("graphics/pokemon/minun/normal.gbapal.lz");
+const u32 gMonBackPic_Minun[] = INCBIN_U32("graphics/pokemon/minun/back.4bpp.lz");
+const u32 gMonShinyPalette_Minun[] = INCBIN_U32("graphics/pokemon/minun/shiny.gbapal.lz");
+const u8 gMonIcon_Minun[] = INCBIN_U8("graphics/pokemon/minun/icon.4bpp");
+const u8 gMonFootprint_Minun[] = INCBIN_U8("graphics/pokemon/minun/footprint.1bpp");
+
+const u32 gMonFrontPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/front.4bpp.lz");
+const u32 gMonPalette_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/normal.gbapal.lz");
+const u32 gMonBackPic_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/back.4bpp.lz");
+const u32 gMonShinyPalette_Mawile[] = INCBIN_U32("graphics/pokemon/mawile/shiny.gbapal.lz");
+const u8 gMonIcon_Mawile[] = INCBIN_U8("graphics/pokemon/mawile/icon.4bpp");
+const u8 gMonFootprint_Mawile[] = INCBIN_U8("graphics/pokemon/mawile/footprint.1bpp");
+
+const u32 gMonFrontPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/front.4bpp.lz");
+const u32 gMonPalette_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/normal.gbapal.lz");
+const u32 gMonBackPic_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/back.4bpp.lz");
+const u32 gMonShinyPalette_Meditite[] = INCBIN_U32("graphics/pokemon/meditite/shiny.gbapal.lz");
+const u8 gMonIcon_Meditite[] = INCBIN_U8("graphics/pokemon/meditite/icon.4bpp");
+const u8 gMonFootprint_Meditite[] = INCBIN_U8("graphics/pokemon/meditite/footprint.1bpp");
+
+const u32 gMonFrontPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/front.4bpp.lz");
+const u32 gMonPalette_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/normal.gbapal.lz");
+const u32 gMonBackPic_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/back.4bpp.lz");
+const u32 gMonShinyPalette_Medicham[] = INCBIN_U32("graphics/pokemon/medicham/shiny.gbapal.lz");
+const u8 gMonIcon_Medicham[] = INCBIN_U8("graphics/pokemon/medicham/icon.4bpp");
+const u8 gMonFootprint_Medicham[] = INCBIN_U8("graphics/pokemon/medicham/footprint.1bpp");
+
+const u32 gMonFrontPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/front.4bpp.lz");
+const u32 gMonPalette_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/normal.gbapal.lz");
+const u32 gMonBackPic_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/back.4bpp.lz");
+const u32 gMonShinyPalette_Swablu[] = INCBIN_U32("graphics/pokemon/swablu/shiny.gbapal.lz");
+const u8 gMonIcon_Swablu[] = INCBIN_U8("graphics/pokemon/swablu/icon.4bpp");
+const u8 gMonFootprint_Swablu[] = INCBIN_U8("graphics/pokemon/swablu/footprint.1bpp");
+
+const u32 gMonFrontPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/front.4bpp.lz");
+const u32 gMonPalette_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/normal.gbapal.lz");
+const u32 gMonBackPic_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/back.4bpp.lz");
+const u32 gMonShinyPalette_Altaria[] = INCBIN_U32("graphics/pokemon/altaria/shiny.gbapal.lz");
+const u8 gMonIcon_Altaria[] = INCBIN_U8("graphics/pokemon/altaria/icon.4bpp");
+const u8 gMonFootprint_Altaria[] = INCBIN_U8("graphics/pokemon/altaria/footprint.1bpp");
+
+const u32 gMonFrontPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/front.4bpp.lz");
+const u32 gMonPalette_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/normal.gbapal.lz");
+const u32 gMonBackPic_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/back.4bpp.lz");
+const u32 gMonShinyPalette_Wynaut[] = INCBIN_U32("graphics/pokemon/wynaut/shiny.gbapal.lz");
+const u8 gMonIcon_Wynaut[] = INCBIN_U8("graphics/pokemon/wynaut/icon.4bpp");
+const u8 gMonFootprint_Wynaut[] = INCBIN_U8("graphics/pokemon/wynaut/footprint.1bpp");
+
+const u32 gMonFrontPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/front.4bpp.lz");
+const u32 gMonPalette_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/normal.gbapal.lz");
+const u32 gMonBackPic_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/back.4bpp.lz");
+const u32 gMonShinyPalette_Duskull[] = INCBIN_U32("graphics/pokemon/duskull/shiny.gbapal.lz");
+const u8 gMonIcon_Duskull[] = INCBIN_U8("graphics/pokemon/duskull/icon.4bpp");
+const u8 gMonFootprint_Duskull[] = INCBIN_U8("graphics/pokemon/duskull/footprint.1bpp");
+
+const u32 gMonFrontPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/front.4bpp.lz");
+const u32 gMonPalette_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/normal.gbapal.lz");
+const u32 gMonBackPic_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/back.4bpp.lz");
+const u32 gMonShinyPalette_Dusclops[] = INCBIN_U32("graphics/pokemon/dusclops/shiny.gbapal.lz");
+const u8 gMonIcon_Dusclops[] = INCBIN_U8("graphics/pokemon/dusclops/icon.4bpp");
+const u8 gMonFootprint_Dusclops[] = INCBIN_U8("graphics/pokemon/dusclops/footprint.1bpp");
+
+const u32 gMonFrontPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/front.4bpp.lz");
+const u32 gMonPalette_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/normal.gbapal.lz");
+const u32 gMonBackPic_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/back.4bpp.lz");
+const u32 gMonShinyPalette_Roselia[] = INCBIN_U32("graphics/pokemon/roselia/shiny.gbapal.lz");
+const u8 gMonIcon_Roselia[] = INCBIN_U8("graphics/pokemon/roselia/icon.4bpp");
+const u8 gMonFootprint_Roselia[] = INCBIN_U8("graphics/pokemon/roselia/footprint.1bpp");
+
+const u32 gMonFrontPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/front.4bpp.lz");
+const u32 gMonPalette_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/normal.gbapal.lz");
+const u32 gMonBackPic_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/back.4bpp.lz");
+const u32 gMonShinyPalette_Slakoth[] = INCBIN_U32("graphics/pokemon/slakoth/shiny.gbapal.lz");
+const u8 gMonIcon_Slakoth[] = INCBIN_U8("graphics/pokemon/slakoth/icon.4bpp");
+const u8 gMonFootprint_Slakoth[] = INCBIN_U8("graphics/pokemon/slakoth/footprint.1bpp");
+
+const u32 gMonFrontPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/front.4bpp.lz");
+const u32 gMonPalette_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/normal.gbapal.lz");
+const u32 gMonBackPic_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/back.4bpp.lz");
+const u32 gMonShinyPalette_Vigoroth[] = INCBIN_U32("graphics/pokemon/vigoroth/shiny.gbapal.lz");
+const u8 gMonIcon_Vigoroth[] = INCBIN_U8("graphics/pokemon/vigoroth/icon.4bpp");
+const u8 gMonFootprint_Vigoroth[] = INCBIN_U8("graphics/pokemon/vigoroth/footprint.1bpp");
+
+const u32 gMonFrontPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/front.4bpp.lz");
+const u32 gMonPalette_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/normal.gbapal.lz");
+const u32 gMonBackPic_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/back.4bpp.lz");
+const u32 gMonShinyPalette_Slaking[] = INCBIN_U32("graphics/pokemon/slaking/shiny.gbapal.lz");
+const u8 gMonIcon_Slaking[] = INCBIN_U8("graphics/pokemon/slaking/icon.4bpp");
+const u8 gMonFootprint_Slaking[] = INCBIN_U8("graphics/pokemon/slaking/footprint.1bpp");
+
+const u32 gMonFrontPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/front.4bpp.lz");
+const u32 gMonPalette_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/normal.gbapal.lz");
+const u32 gMonBackPic_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/back.4bpp.lz");
+const u32 gMonShinyPalette_Gulpin[] = INCBIN_U32("graphics/pokemon/gulpin/shiny.gbapal.lz");
+const u8 gMonIcon_Gulpin[] = INCBIN_U8("graphics/pokemon/gulpin/icon.4bpp");
+const u8 gMonFootprint_Gulpin[] = INCBIN_U8("graphics/pokemon/gulpin/footprint.1bpp");
+
+const u32 gMonFrontPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/front.4bpp.lz");
+const u32 gMonPalette_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/normal.gbapal.lz");
+const u32 gMonBackPic_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/back.4bpp.lz");
+const u32 gMonShinyPalette_Swalot[] = INCBIN_U32("graphics/pokemon/swalot/shiny.gbapal.lz");
+const u8 gMonIcon_Swalot[] = INCBIN_U8("graphics/pokemon/swalot/icon.4bpp");
+const u8 gMonFootprint_Swalot[] = INCBIN_U8("graphics/pokemon/swalot/footprint.1bpp");
+
+const u32 gMonFrontPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/front.4bpp.lz");
+const u32 gMonPalette_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/normal.gbapal.lz");
+const u32 gMonBackPic_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/back.4bpp.lz");
+const u32 gMonShinyPalette_Tropius[] = INCBIN_U32("graphics/pokemon/tropius/shiny.gbapal.lz");
+const u8 gMonIcon_Tropius[] = INCBIN_U8("graphics/pokemon/tropius/icon.4bpp");
+const u8 gMonFootprint_Tropius[] = INCBIN_U8("graphics/pokemon/tropius/footprint.1bpp");
+
+const u32 gMonFrontPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/front.4bpp.lz");
+const u32 gMonPalette_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/normal.gbapal.lz");
+const u32 gMonBackPic_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/back.4bpp.lz");
+const u32 gMonShinyPalette_Whismur[] = INCBIN_U32("graphics/pokemon/whismur/shiny.gbapal.lz");
+const u8 gMonIcon_Whismur[] = INCBIN_U8("graphics/pokemon/whismur/icon.4bpp");
+const u8 gMonFootprint_Whismur[] = INCBIN_U8("graphics/pokemon/whismur/footprint.1bpp");
+
+const u32 gMonFrontPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/front.4bpp.lz");
+const u32 gMonPalette_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/normal.gbapal.lz");
+const u32 gMonBackPic_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/back.4bpp.lz");
+const u32 gMonShinyPalette_Loudred[] = INCBIN_U32("graphics/pokemon/loudred/shiny.gbapal.lz");
+const u8 gMonIcon_Loudred[] = INCBIN_U8("graphics/pokemon/loudred/icon.4bpp");
+const u8 gMonFootprint_Loudred[] = INCBIN_U8("graphics/pokemon/loudred/footprint.1bpp");
+
+const u32 gMonFrontPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/front.4bpp.lz");
+const u32 gMonPalette_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/normal.gbapal.lz");
+const u32 gMonBackPic_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/back.4bpp.lz");
+const u32 gMonShinyPalette_Exploud[] = INCBIN_U32("graphics/pokemon/exploud/shiny.gbapal.lz");
+const u8 gMonIcon_Exploud[] = INCBIN_U8("graphics/pokemon/exploud/icon.4bpp");
+const u8 gMonFootprint_Exploud[] = INCBIN_U8("graphics/pokemon/exploud/footprint.1bpp");
+
+const u32 gMonFrontPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/front.4bpp.lz");
+const u32 gMonPalette_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/normal.gbapal.lz");
+const u32 gMonBackPic_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/back.4bpp.lz");
+const u32 gMonShinyPalette_Clamperl[] = INCBIN_U32("graphics/pokemon/clamperl/shiny.gbapal.lz");
+const u8 gMonIcon_Clamperl[] = INCBIN_U8("graphics/pokemon/clamperl/icon.4bpp");
+const u8 gMonFootprint_Clamperl[] = INCBIN_U8("graphics/pokemon/clamperl/footprint.1bpp");
+
+const u32 gMonFrontPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/front.4bpp.lz");
+const u32 gMonPalette_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/normal.gbapal.lz");
+const u32 gMonBackPic_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/back.4bpp.lz");
+const u32 gMonShinyPalette_Huntail[] = INCBIN_U32("graphics/pokemon/huntail/shiny.gbapal.lz");
+const u8 gMonIcon_Huntail[] = INCBIN_U8("graphics/pokemon/huntail/icon.4bpp");
+const u8 gMonFootprint_Huntail[] = INCBIN_U8("graphics/pokemon/huntail/footprint.1bpp");
+
+const u32 gMonFrontPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/front.4bpp.lz");
+const u32 gMonPalette_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/normal.gbapal.lz");
+const u32 gMonBackPic_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/back.4bpp.lz");
+const u32 gMonShinyPalette_Gorebyss[] = INCBIN_U32("graphics/pokemon/gorebyss/shiny.gbapal.lz");
+const u8 gMonIcon_Gorebyss[] = INCBIN_U8("graphics/pokemon/gorebyss/icon.4bpp");
+const u8 gMonFootprint_Gorebyss[] = INCBIN_U8("graphics/pokemon/gorebyss/footprint.1bpp");
+
+const u32 gMonFrontPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/front.4bpp.lz");
+const u32 gMonPalette_Absol[] = INCBIN_U32("graphics/pokemon/absol/normal.gbapal.lz");
+const u32 gMonBackPic_Absol[] = INCBIN_U32("graphics/pokemon/absol/back.4bpp.lz");
+const u32 gMonShinyPalette_Absol[] = INCBIN_U32("graphics/pokemon/absol/shiny.gbapal.lz");
+const u8 gMonIcon_Absol[] = INCBIN_U8("graphics/pokemon/absol/icon.4bpp");
+const u8 gMonFootprint_Absol[] = INCBIN_U8("graphics/pokemon/absol/footprint.1bpp");
+
+const u32 gMonFrontPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/front.4bpp.lz");
+const u32 gMonPalette_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/normal.gbapal.lz");
+const u32 gMonBackPic_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/back.4bpp.lz");
+const u32 gMonShinyPalette_Shuppet[] = INCBIN_U32("graphics/pokemon/shuppet/shiny.gbapal.lz");
+const u8 gMonIcon_Shuppet[] = INCBIN_U8("graphics/pokemon/shuppet/icon.4bpp");
+const u8 gMonFootprint_Shuppet[] = INCBIN_U8("graphics/pokemon/shuppet/footprint.1bpp");
+
+const u32 gMonFrontPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/front.4bpp.lz");
+const u32 gMonPalette_Banette[] = INCBIN_U32("graphics/pokemon/banette/normal.gbapal.lz");
+const u32 gMonBackPic_Banette[] = INCBIN_U32("graphics/pokemon/banette/back.4bpp.lz");
+const u32 gMonShinyPalette_Banette[] = INCBIN_U32("graphics/pokemon/banette/shiny.gbapal.lz");
+const u8 gMonIcon_Banette[] = INCBIN_U8("graphics/pokemon/banette/icon.4bpp");
+const u8 gMonFootprint_Banette[] = INCBIN_U8("graphics/pokemon/banette/footprint.1bpp");
+
+const u32 gMonFrontPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/front.4bpp.lz");
+const u32 gMonPalette_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/normal.gbapal.lz");
+const u32 gMonBackPic_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/back.4bpp.lz");
+const u32 gMonShinyPalette_Seviper[] = INCBIN_U32("graphics/pokemon/seviper/shiny.gbapal.lz");
+const u8 gMonIcon_Seviper[] = INCBIN_U8("graphics/pokemon/seviper/icon.4bpp");
+const u8 gMonFootprint_Seviper[] = INCBIN_U8("graphics/pokemon/seviper/footprint.1bpp");
+
+const u32 gMonFrontPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/front.4bpp.lz");
+const u32 gMonPalette_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/normal.gbapal.lz");
+const u32 gMonBackPic_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/back.4bpp.lz");
+const u32 gMonShinyPalette_Zangoose[] = INCBIN_U32("graphics/pokemon/zangoose/shiny.gbapal.lz");
+const u8 gMonIcon_Zangoose[] = INCBIN_U8("graphics/pokemon/zangoose/icon.4bpp");
+const u8 gMonFootprint_Zangoose[] = INCBIN_U8("graphics/pokemon/zangoose/footprint.1bpp");
+
+const u32 gMonFrontPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/front.4bpp.lz");
+const u32 gMonPalette_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/normal.gbapal.lz");
+const u32 gMonBackPic_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/back.4bpp.lz");
+const u32 gMonShinyPalette_Relicanth[] = INCBIN_U32("graphics/pokemon/relicanth/shiny.gbapal.lz");
+const u8 gMonIcon_Relicanth[] = INCBIN_U8("graphics/pokemon/relicanth/icon.4bpp");
+const u8 gMonFootprint_Relicanth[] = INCBIN_U8("graphics/pokemon/relicanth/footprint.1bpp");
+
+const u32 gMonFrontPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/front.4bpp.lz");
+const u32 gMonPalette_Aron[] = INCBIN_U32("graphics/pokemon/aron/normal.gbapal.lz");
+const u32 gMonBackPic_Aron[] = INCBIN_U32("graphics/pokemon/aron/back.4bpp.lz");
+const u32 gMonShinyPalette_Aron[] = INCBIN_U32("graphics/pokemon/aron/shiny.gbapal.lz");
+const u8 gMonIcon_Aron[] = INCBIN_U8("graphics/pokemon/aron/icon.4bpp");
+const u8 gMonFootprint_Aron[] = INCBIN_U8("graphics/pokemon/aron/footprint.1bpp");
+
+const u32 gMonFrontPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/front.4bpp.lz");
+const u32 gMonPalette_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/normal.gbapal.lz");
+const u32 gMonBackPic_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/back.4bpp.lz");
+const u32 gMonShinyPalette_Lairon[] = INCBIN_U32("graphics/pokemon/lairon/shiny.gbapal.lz");
+const u8 gMonIcon_Lairon[] = INCBIN_U8("graphics/pokemon/lairon/icon.4bpp");
+const u8 gMonFootprint_Lairon[] = INCBIN_U8("graphics/pokemon/lairon/footprint.1bpp");
+
+const u32 gMonFrontPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/front.4bpp.lz");
+const u32 gMonPalette_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/normal.gbapal.lz");
+const u32 gMonBackPic_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/back.4bpp.lz");
+const u32 gMonShinyPalette_Aggron[] = INCBIN_U32("graphics/pokemon/aggron/shiny.gbapal.lz");
+const u8 gMonIcon_Aggron[] = INCBIN_U8("graphics/pokemon/aggron/icon.4bpp");
+const u8 gMonFootprint_Aggron[] = INCBIN_U8("graphics/pokemon/aggron/footprint.1bpp");
+
+const u32 gMonFrontPic_Castform[] = INCBIN_U32("graphics/pokemon/castform/front.4bpp.lz");
+const u32 gMonPalette_Castform[] = INCBIN_U32("graphics/pokemon/castform/normal.gbapal.lz");
+const u32 gMonBackPic_Castform[] = INCBIN_U32("graphics/pokemon/castform/back.4bpp.lz");
+const u32 gMonShinyPalette_Castform[] = INCBIN_U32("graphics/pokemon/castform/shiny.gbapal.lz");
+const u8 gMonIcon_Castform[] = INCBIN_U8("graphics/pokemon/castform/icon.4bpp");
+const u8 gMonFootprint_Castform[] = INCBIN_U8("graphics/pokemon/castform/footprint.1bpp");
+
+const u32 gMonFrontPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/front.4bpp.lz");
+const u32 gMonPalette_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/normal.gbapal.lz");
+const u32 gMonBackPic_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/back.4bpp.lz");
+const u32 gMonShinyPalette_Volbeat[] = INCBIN_U32("graphics/pokemon/volbeat/shiny.gbapal.lz");
+const u8 gMonIcon_Volbeat[] = INCBIN_U8("graphics/pokemon/volbeat/icon.4bpp");
+const u8 gMonFootprint_Volbeat[] = INCBIN_U8("graphics/pokemon/volbeat/footprint.1bpp");
+
+const u32 gMonFrontPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/front.4bpp.lz");
+const u32 gMonPalette_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/normal.gbapal.lz");
+const u32 gMonBackPic_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/back.4bpp.lz");
+const u32 gMonShinyPalette_Illumise[] = INCBIN_U32("graphics/pokemon/illumise/shiny.gbapal.lz");
+const u8 gMonIcon_Illumise[] = INCBIN_U8("graphics/pokemon/illumise/icon.4bpp");
+const u8 gMonFootprint_Illumise[] = INCBIN_U8("graphics/pokemon/illumise/footprint.1bpp");
+
+const u32 gMonFrontPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/front.4bpp.lz");
+const u32 gMonPalette_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/normal.gbapal.lz");
+const u32 gMonBackPic_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/back.4bpp.lz");
+const u32 gMonShinyPalette_Lileep[] = INCBIN_U32("graphics/pokemon/lileep/shiny.gbapal.lz");
+const u8 gMonIcon_Lileep[] = INCBIN_U8("graphics/pokemon/lileep/icon.4bpp");
+const u8 gMonFootprint_Lileep[] = INCBIN_U8("graphics/pokemon/lileep/footprint.1bpp");
+
+const u32 gMonFrontPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/front.4bpp.lz");
+const u32 gMonPalette_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/normal.gbapal.lz");
+const u32 gMonBackPic_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/back.4bpp.lz");
+const u32 gMonShinyPalette_Cradily[] = INCBIN_U32("graphics/pokemon/cradily/shiny.gbapal.lz");
+const u8 gMonIcon_Cradily[] = INCBIN_U8("graphics/pokemon/cradily/icon.4bpp");
+const u8 gMonFootprint_Cradily[] = INCBIN_U8("graphics/pokemon/cradily/footprint.1bpp");
+
+const u32 gMonFrontPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/front.4bpp.lz");
+const u32 gMonPalette_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/normal.gbapal.lz");
+const u32 gMonBackPic_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/back.4bpp.lz");
+const u32 gMonShinyPalette_Anorith[] = INCBIN_U32("graphics/pokemon/anorith/shiny.gbapal.lz");
+const u8 gMonIcon_Anorith[] = INCBIN_U8("graphics/pokemon/anorith/icon.4bpp");
+const u8 gMonFootprint_Anorith[] = INCBIN_U8("graphics/pokemon/anorith/footprint.1bpp");
+
+const u32 gMonFrontPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/front.4bpp.lz");
+const u32 gMonPalette_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/normal.gbapal.lz");
+const u32 gMonBackPic_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/back.4bpp.lz");
+const u32 gMonShinyPalette_Armaldo[] = INCBIN_U32("graphics/pokemon/armaldo/shiny.gbapal.lz");
+const u8 gMonIcon_Armaldo[] = INCBIN_U8("graphics/pokemon/armaldo/icon.4bpp");
+const u8 gMonFootprint_Armaldo[] = INCBIN_U8("graphics/pokemon/armaldo/footprint.1bpp");
+
+const u32 gMonFrontPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/front.4bpp.lz");
+const u32 gMonPalette_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/normal.gbapal.lz");
+const u32 gMonBackPic_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/back.4bpp.lz");
+const u32 gMonShinyPalette_Ralts[] = INCBIN_U32("graphics/pokemon/ralts/shiny.gbapal.lz");
+const u8 gMonIcon_Ralts[] = INCBIN_U8("graphics/pokemon/ralts/icon.4bpp");
+const u8 gMonFootprint_Ralts[] = INCBIN_U8("graphics/pokemon/ralts/footprint.1bpp");
+
+const u32 gMonFrontPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/front.4bpp.lz");
+const u32 gMonPalette_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/normal.gbapal.lz");
+const u32 gMonBackPic_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/back.4bpp.lz");
+const u32 gMonShinyPalette_Kirlia[] = INCBIN_U32("graphics/pokemon/kirlia/shiny.gbapal.lz");
+const u8 gMonIcon_Kirlia[] = INCBIN_U8("graphics/pokemon/kirlia/icon.4bpp");
+const u8 gMonFootprint_Kirlia[] = INCBIN_U8("graphics/pokemon/kirlia/footprint.1bpp");
+
+const u32 gMonFrontPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/front.4bpp.lz");
+const u32 gMonPalette_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/normal.gbapal.lz");
+const u32 gMonBackPic_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/back.4bpp.lz");
+const u32 gMonShinyPalette_Gardevoir[] = INCBIN_U32("graphics/pokemon/gardevoir/shiny.gbapal.lz");
+const u8 gMonIcon_Gardevoir[] = INCBIN_U8("graphics/pokemon/gardevoir/icon.4bpp");
+const u8 gMonFootprint_Gardevoir[] = INCBIN_U8("graphics/pokemon/gardevoir/footprint.1bpp");
+
+const u32 gMonFrontPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/front.4bpp.lz");
+const u32 gMonPalette_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/normal.gbapal.lz");
+const u32 gMonBackPic_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/back.4bpp.lz");
+const u32 gMonShinyPalette_Bagon[] = INCBIN_U32("graphics/pokemon/bagon/shiny.gbapal.lz");
+const u8 gMonIcon_Bagon[] = INCBIN_U8("graphics/pokemon/bagon/icon.4bpp");
+const u8 gMonFootprint_Bagon[] = INCBIN_U8("graphics/pokemon/bagon/footprint.1bpp");
+
+const u32 gMonFrontPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/front.4bpp.lz");
+const u32 gMonPalette_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/normal.gbapal.lz");
+const u32 gMonBackPic_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/back.4bpp.lz");
+const u32 gMonShinyPalette_Shelgon[] = INCBIN_U32("graphics/pokemon/shelgon/shiny.gbapal.lz");
+const u8 gMonIcon_Shelgon[] = INCBIN_U8("graphics/pokemon/shelgon/icon.4bpp");
+const u8 gMonFootprint_Shelgon[] = INCBIN_U8("graphics/pokemon/shelgon/footprint.1bpp");
+
+const u32 gMonFrontPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/front.4bpp.lz");
+const u32 gMonPalette_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/normal.gbapal.lz");
+const u32 gMonBackPic_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/back.4bpp.lz");
+const u32 gMonShinyPalette_Salamence[] = INCBIN_U32("graphics/pokemon/salamence/shiny.gbapal.lz");
+const u8 gMonIcon_Salamence[] = INCBIN_U8("graphics/pokemon/salamence/icon.4bpp");
+const u8 gMonFootprint_Salamence[] = INCBIN_U8("graphics/pokemon/salamence/footprint.1bpp");
+
+const u32 gMonFrontPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/front.4bpp.lz");
+const u32 gMonPalette_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/normal.gbapal.lz");
+const u32 gMonBackPic_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/back.4bpp.lz");
+const u32 gMonShinyPalette_Beldum[] = INCBIN_U32("graphics/pokemon/beldum/shiny.gbapal.lz");
+const u8 gMonIcon_Beldum[] = INCBIN_U8("graphics/pokemon/beldum/icon.4bpp");
+const u8 gMonFootprint_Beldum[] = INCBIN_U8("graphics/pokemon/beldum/footprint.1bpp");
+
+const u32 gMonFrontPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/front.4bpp.lz");
+const u32 gMonPalette_Metang[] = INCBIN_U32("graphics/pokemon/metang/normal.gbapal.lz");
+const u32 gMonBackPic_Metang[] = INCBIN_U32("graphics/pokemon/metang/back.4bpp.lz");
+const u32 gMonShinyPalette_Metang[] = INCBIN_U32("graphics/pokemon/metang/shiny.gbapal.lz");
+const u8 gMonIcon_Metang[] = INCBIN_U8("graphics/pokemon/metang/icon.4bpp");
+const u8 gMonFootprint_Metang[] = INCBIN_U8("graphics/pokemon/metang/footprint.1bpp");
+
+const u32 gMonFrontPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/front.4bpp.lz");
+const u32 gMonPalette_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/normal.gbapal.lz");
+const u32 gMonBackPic_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/back.4bpp.lz");
+const u32 gMonShinyPalette_Metagross[] = INCBIN_U32("graphics/pokemon/metagross/shiny.gbapal.lz");
+const u8 gMonIcon_Metagross[] = INCBIN_U8("graphics/pokemon/metagross/icon.4bpp");
+const u8 gMonFootprint_Metagross[] = INCBIN_U8("graphics/pokemon/metagross/footprint.1bpp");
+
+const u32 gMonFrontPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/front.4bpp.lz");
+const u32 gMonPalette_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/normal.gbapal.lz");
+const u32 gMonBackPic_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/back.4bpp.lz");
+const u32 gMonShinyPalette_Regirock[] = INCBIN_U32("graphics/pokemon/regirock/shiny.gbapal.lz");
+const u8 gMonIcon_Regirock[] = INCBIN_U8("graphics/pokemon/regirock/icon.4bpp");
+const u8 gMonFootprint_Regirock[] = INCBIN_U8("graphics/pokemon/regirock/footprint.1bpp");
+
+const u32 gMonFrontPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/front.4bpp.lz");
+const u32 gMonPalette_Regice[] = INCBIN_U32("graphics/pokemon/regice/normal.gbapal.lz");
+const u32 gMonBackPic_Regice[] = INCBIN_U32("graphics/pokemon/regice/back.4bpp.lz");
+const u32 gMonShinyPalette_Regice[] = INCBIN_U32("graphics/pokemon/regice/shiny.gbapal.lz");
+const u8 gMonIcon_Regice[] = INCBIN_U8("graphics/pokemon/regice/icon.4bpp");
+const u8 gMonFootprint_Regice[] = INCBIN_U8("graphics/pokemon/regice/footprint.1bpp");
+
+const u32 gMonFrontPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/front.4bpp.lz");
+const u32 gMonPalette_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/normal.gbapal.lz");
+const u32 gMonBackPic_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/back.4bpp.lz");
+const u32 gMonShinyPalette_Registeel[] = INCBIN_U32("graphics/pokemon/registeel/shiny.gbapal.lz");
+const u8 gMonIcon_Registeel[] = INCBIN_U8("graphics/pokemon/registeel/icon.4bpp");
+const u8 gMonFootprint_Registeel[] = INCBIN_U8("graphics/pokemon/registeel/footprint.1bpp");
+
+const u32 gMonFrontPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/front.4bpp.lz");
+const u32 gMonPalette_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/normal.gbapal.lz");
+const u32 gMonBackPic_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/back.4bpp.lz");
+const u32 gMonShinyPalette_Kyogre[] = INCBIN_U32("graphics/pokemon/kyogre/shiny.gbapal.lz");
+const u8 gMonIcon_Kyogre[] = INCBIN_U8("graphics/pokemon/kyogre/icon.4bpp");
+const u8 gMonFootprint_Kyogre[] = INCBIN_U8("graphics/pokemon/kyogre/footprint.1bpp");
+
+const u32 gMonFrontPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/front.4bpp.lz");
+const u32 gMonPalette_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/normal.gbapal.lz");
+const u32 gMonBackPic_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/back.4bpp.lz");
+const u32 gMonShinyPalette_Groudon[] = INCBIN_U32("graphics/pokemon/groudon/shiny.gbapal.lz");
+const u8 gMonIcon_Groudon[] = INCBIN_U8("graphics/pokemon/groudon/icon.4bpp");
+const u8 gMonFootprint_Groudon[] = INCBIN_U8("graphics/pokemon/groudon/footprint.1bpp");
+
+const u32 gMonFrontPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/front.4bpp.lz");
+const u32 gMonPalette_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/normal.gbapal.lz");
+const u32 gMonBackPic_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/back.4bpp.lz");
+const u32 gMonShinyPalette_Rayquaza[] = INCBIN_U32("graphics/pokemon/rayquaza/shiny.gbapal.lz");
+const u8 gMonIcon_Rayquaza[] = INCBIN_U8("graphics/pokemon/rayquaza/icon.4bpp");
+const u8 gMonFootprint_Rayquaza[] = INCBIN_U8("graphics/pokemon/rayquaza/footprint.1bpp");
+
+const u32 gMonFrontPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/front.4bpp.lz");
+const u32 gMonPalette_Latias[] = INCBIN_U32("graphics/pokemon/latias/normal.gbapal.lz");
+const u32 gMonBackPic_Latias[] = INCBIN_U32("graphics/pokemon/latias/back.4bpp.lz");
+const u32 gMonShinyPalette_Latias[] = INCBIN_U32("graphics/pokemon/latias/shiny.gbapal.lz");
+const u8 gMonIcon_Latias[] = INCBIN_U8("graphics/pokemon/latias/icon.4bpp");
+const u8 gMonFootprint_Latias[] = INCBIN_U8("graphics/pokemon/latias/footprint.1bpp");
+
+const u32 gMonFrontPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/front.4bpp.lz");
+const u32 gMonPalette_Latios[] = INCBIN_U32("graphics/pokemon/latios/normal.gbapal.lz");
+const u32 gMonBackPic_Latios[] = INCBIN_U32("graphics/pokemon/latios/back.4bpp.lz");
+const u32 gMonShinyPalette_Latios[] = INCBIN_U32("graphics/pokemon/latios/shiny.gbapal.lz");
+const u8 gMonIcon_Latios[] = INCBIN_U8("graphics/pokemon/latios/icon.4bpp");
+const u8 gMonFootprint_Latios[] = INCBIN_U8("graphics/pokemon/latios/footprint.1bpp");
+
+const u32 gMonFrontPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/front.4bpp.lz");
+const u32 gMonPalette_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/normal.gbapal.lz");
+const u32 gMonBackPic_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/back.4bpp.lz");
+const u32 gMonShinyPalette_Jirachi[] = INCBIN_U32("graphics/pokemon/jirachi/shiny.gbapal.lz");
+const u8 gMonIcon_Jirachi[] = INCBIN_U8("graphics/pokemon/jirachi/icon.4bpp");
+const u8 gMonFootprint_Jirachi[] = INCBIN_U8("graphics/pokemon/jirachi/footprint.1bpp");
+
+#ifdef FIRERED
+const u32 gMonFrontPic_Deoxys[] = INCBIN_U32("graphics/pokemon/deoxys/front.4bpp.lz");
+const u32 gMonPalette_Deoxys[] = INCBIN_U32("graphics/pokemon/deoxys/normal.gbapal.lz");
+const u32 gMonBackPic_Deoxys[] = INCBIN_U32("graphics/pokemon/deoxys/back.4bpp.lz");
+const u32 gMonShinyPalette_Deoxys[] = INCBIN_U32("graphics/pokemon/deoxys/shiny.gbapal.lz");
+const u8 gMonIcon_Deoxys[] = INCBIN_U8("graphics/pokemon/deoxys/icon.4bpp", "graphics/pokemon/deoxys/icon_attack.4bpp");
+const u8 gMonFootprint_Deoxys[] = INCBIN_U8("graphics/pokemon/deoxys/footprint.1bpp");
+#endif
+
+#ifdef LEAFGREEN
+const u32 gMonFrontPic_Deoxys[] = INCBIN_U32("graphics/pokemon/deoxys/front_def.4bpp.lz");
+const u32 gMonPalette_Deoxys[] = INCBIN_U32("graphics/pokemon/deoxys/normal.gbapal.lz");
+const u32 gMonBackPic_Deoxys[] = INCBIN_U32("graphics/pokemon/deoxys/back_def.4bpp.lz");
+const u32 gMonShinyPalette_Deoxys[] = INCBIN_U32("graphics/pokemon/deoxys/shiny.gbapal.lz");
+const u8 gMonIcon_Deoxys[] = INCBIN_U8("graphics/pokemon/deoxys/icon.4bpp", "graphics/pokemon/deoxys/icon_defense.4bpp");
+const u8 gMonFootprint_Deoxys[] = INCBIN_U8("graphics/pokemon/deoxys/footprint.1bpp");
+#endif
+
+const u32 gMonFrontPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/front.4bpp.lz");
+const u32 gMonPalette_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/normal.gbapal.lz");
+const u32 gMonBackPic_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/back.4bpp.lz");
+const u32 gMonShinyPalette_Chimecho[] = INCBIN_U32("graphics/pokemon/chimecho/shiny.gbapal.lz");
+const u8 gMonIcon_Chimecho[] = INCBIN_U8("graphics/pokemon/chimecho/icon.4bpp");
+const u8 gMonFootprint_Chimecho[] = INCBIN_U8("graphics/pokemon/chimecho/footprint.1bpp");
+
+const u32 gMonFrontPic_Egg[] = INCBIN_U32("graphics/pokemon/egg/front.4bpp.lz");
+const u32 gMonPalette_Egg[] = INCBIN_U32("graphics/pokemon/egg/normal.gbapal.lz");
+
+const u32 gMonFrontPic_UnownB[] = INCBIN_U32("graphics/pokemon/unown/b/front.4bpp.lz");
+const u32 gMonBackPic_UnownB[] = INCBIN_U32("graphics/pokemon/unown/b/back.4bpp.lz");
+const u8 gMonIcon_UnownB[] = INCBIN_U8("graphics/pokemon/unown/b/icon.4bpp");
+
+const u32 gMonFrontPic_UnownC[] = INCBIN_U32("graphics/pokemon/unown/c/front.4bpp.lz");
+const u32 gMonBackPic_UnownC[] = INCBIN_U32("graphics/pokemon/unown/c/back.4bpp.lz");
+const u8 gMonIcon_UnownC[] = INCBIN_U8("graphics/pokemon/unown/c/icon.4bpp");
+
+const u32 gMonFrontPic_UnownD[] = INCBIN_U32("graphics/pokemon/unown/d/front.4bpp.lz");
+const u32 gMonBackPic_UnownD[] = INCBIN_U32("graphics/pokemon/unown/d/back.4bpp.lz");
+const u8 gMonIcon_UnownD[] = INCBIN_U8("graphics/pokemon/unown/d/icon.4bpp");
+
+const u32 gMonFrontPic_UnownE[] = INCBIN_U32("graphics/pokemon/unown/e/front.4bpp.lz");
+const u32 gMonBackPic_UnownE[] = INCBIN_U32("graphics/pokemon/unown/e/back.4bpp.lz");
+const u8 gMonIcon_UnownE[] = INCBIN_U8("graphics/pokemon/unown/e/icon.4bpp");
+
+const u32 gMonFrontPic_UnownF[] = INCBIN_U32("graphics/pokemon/unown/f/front.4bpp.lz");
+const u32 gMonBackPic_UnownF[] = INCBIN_U32("graphics/pokemon/unown/f/back.4bpp.lz");
+const u8 gMonIcon_UnownF[] = INCBIN_U8("graphics/pokemon/unown/f/icon.4bpp");
+
+const u32 gMonFrontPic_UnownG[] = INCBIN_U32("graphics/pokemon/unown/g/front.4bpp.lz");
+const u32 gMonBackPic_UnownG[] = INCBIN_U32("graphics/pokemon/unown/g/back.4bpp.lz");
+const u8 gMonIcon_UnownG[] = INCBIN_U8("graphics/pokemon/unown/g/icon.4bpp");
+
+const u32 gMonFrontPic_UnownH[] = INCBIN_U32("graphics/pokemon/unown/h/front.4bpp.lz");
+const u32 gMonBackPic_UnownH[] = INCBIN_U32("graphics/pokemon/unown/h/back.4bpp.lz");
+const u8 gMonIcon_UnownH[] = INCBIN_U8("graphics/pokemon/unown/h/icon.4bpp");
+
+const u32 gMonFrontPic_UnownI[] = INCBIN_U32("graphics/pokemon/unown/i/front.4bpp.lz");
+const u32 gMonBackPic_UnownI[] = INCBIN_U32("graphics/pokemon/unown/i/back.4bpp.lz");
+const u8 gMonIcon_UnownI[] = INCBIN_U8("graphics/pokemon/unown/i/icon.4bpp");
+
+const u32 gMonFrontPic_UnownJ[] = INCBIN_U32("graphics/pokemon/unown/j/front.4bpp.lz");
+const u32 gMonBackPic_UnownJ[] = INCBIN_U32("graphics/pokemon/unown/j/back.4bpp.lz");
+const u8 gMonIcon_UnownJ[] = INCBIN_U8("graphics/pokemon/unown/j/icon.4bpp");
+
+const u32 gMonFrontPic_UnownK[] = INCBIN_U32("graphics/pokemon/unown/k/front.4bpp.lz");
+const u32 gMonBackPic_UnownK[] = INCBIN_U32("graphics/pokemon/unown/k/back.4bpp.lz");
+const u8 gMonIcon_UnownK[] = INCBIN_U8("graphics/pokemon/unown/k/icon.4bpp");
+
+const u32 gMonFrontPic_UnownL[] = INCBIN_U32("graphics/pokemon/unown/l/front.4bpp.lz");
+const u32 gMonBackPic_UnownL[] = INCBIN_U32("graphics/pokemon/unown/l/back.4bpp.lz");
+const u8 gMonIcon_UnownL[] = INCBIN_U8("graphics/pokemon/unown/l/icon.4bpp");
+
+const u32 gMonFrontPic_UnownM[] = INCBIN_U32("graphics/pokemon/unown/m/front.4bpp.lz");
+const u32 gMonBackPic_UnownM[] = INCBIN_U32("graphics/pokemon/unown/m/back.4bpp.lz");
+const u8 gMonIcon_UnownM[] = INCBIN_U8("graphics/pokemon/unown/m/icon.4bpp");
+
+const u32 gMonFrontPic_UnownN[] = INCBIN_U32("graphics/pokemon/unown/n/front.4bpp.lz");
+const u32 gMonBackPic_UnownN[] = INCBIN_U32("graphics/pokemon/unown/n/back.4bpp.lz");
+const u8 gMonIcon_UnownN[] = INCBIN_U8("graphics/pokemon/unown/n/icon.4bpp");
+
+const u32 gMonFrontPic_UnownO[] = INCBIN_U32("graphics/pokemon/unown/o/front.4bpp.lz");
+const u32 gMonBackPic_UnownO[] = INCBIN_U32("graphics/pokemon/unown/o/back.4bpp.lz");
+const u8 gMonIcon_UnownO[] = INCBIN_U8("graphics/pokemon/unown/o/icon.4bpp");
+
+const u32 gMonFrontPic_UnownP[] = INCBIN_U32("graphics/pokemon/unown/p/front.4bpp.lz");
+const u32 gMonBackPic_UnownP[] = INCBIN_U32("graphics/pokemon/unown/p/back.4bpp.lz");
+const u8 gMonIcon_UnownP[] = INCBIN_U8("graphics/pokemon/unown/p/icon.4bpp");
+
+const u32 gMonFrontPic_UnownQ[] = INCBIN_U32("graphics/pokemon/unown/q/front.4bpp.lz");
+const u32 gMonBackPic_UnownQ[] = INCBIN_U32("graphics/pokemon/unown/q/back.4bpp.lz");
+const u8 gMonIcon_UnownQ[] = INCBIN_U8("graphics/pokemon/unown/q/icon.4bpp");
+
+const u32 gMonFrontPic_UnownR[] = INCBIN_U32("graphics/pokemon/unown/r/front.4bpp.lz");
+const u32 gMonBackPic_UnownR[] = INCBIN_U32("graphics/pokemon/unown/r/back.4bpp.lz");
+const u8 gMonIcon_UnownR[] = INCBIN_U8("graphics/pokemon/unown/r/icon.4bpp");
+
+const u32 gMonFrontPic_UnownS[] = INCBIN_U32("graphics/pokemon/unown/s/front.4bpp.lz");
+const u32 gMonBackPic_UnownS[] = INCBIN_U32("graphics/pokemon/unown/s/back.4bpp.lz");
+const u8 gMonIcon_UnownS[] = INCBIN_U8("graphics/pokemon/unown/s/icon.4bpp");
+
+const u32 gMonFrontPic_UnownT[] = INCBIN_U32("graphics/pokemon/unown/t/front.4bpp.lz");
+const u32 gMonBackPic_UnownT[] = INCBIN_U32("graphics/pokemon/unown/t/back.4bpp.lz");
+const u8 gMonIcon_UnownT[] = INCBIN_U8("graphics/pokemon/unown/t/icon.4bpp");
+
+const u32 gMonFrontPic_UnownU[] = INCBIN_U32("graphics/pokemon/unown/u/front.4bpp.lz");
+const u32 gMonBackPic_UnownU[] = INCBIN_U32("graphics/pokemon/unown/u/back.4bpp.lz");
+const u8 gMonIcon_UnownU[] = INCBIN_U8("graphics/pokemon/unown/u/icon.4bpp");
+
+const u32 gMonFrontPic_UnownV[] = INCBIN_U32("graphics/pokemon/unown/v/front.4bpp.lz");
+const u32 gMonBackPic_UnownV[] = INCBIN_U32("graphics/pokemon/unown/v/back.4bpp.lz");
+const u8 gMonIcon_UnownV[] = INCBIN_U8("graphics/pokemon/unown/v/icon.4bpp");
+
+const u32 gMonFrontPic_UnownW[] = INCBIN_U32("graphics/pokemon/unown/w/front.4bpp.lz");
+const u32 gMonBackPic_UnownW[] = INCBIN_U32("graphics/pokemon/unown/w/back.4bpp.lz");
+const u8 gMonIcon_UnownW[] = INCBIN_U8("graphics/pokemon/unown/w/icon.4bpp");
+
+const u32 gMonFrontPic_UnownX[] = INCBIN_U32("graphics/pokemon/unown/x/front.4bpp.lz");
+const u32 gMonBackPic_UnownX[] = INCBIN_U32("graphics/pokemon/unown/x/back.4bpp.lz");
+const u8 gMonIcon_UnownX[] = INCBIN_U8("graphics/pokemon/unown/x/icon.4bpp");
+
+const u32 gMonFrontPic_UnownY[] = INCBIN_U32("graphics/pokemon/unown/y/front.4bpp.lz");
+const u32 gMonBackPic_UnownY[] = INCBIN_U32("graphics/pokemon/unown/y/back.4bpp.lz");
+const u8 gMonIcon_UnownY[] = INCBIN_U8("graphics/pokemon/unown/y/icon.4bpp");
+
+const u32 gMonFrontPic_UnownZ[] = INCBIN_U32("graphics/pokemon/unown/z/front.4bpp.lz");
+const u32 gMonBackPic_UnownZ[] = INCBIN_U32("graphics/pokemon/unown/z/back.4bpp.lz");
+const u8 gMonIcon_UnownZ[] = INCBIN_U8("graphics/pokemon/unown/z/icon.4bpp");
+
+const u32 gMonFrontPic_UnownExclamationMark[] = INCBIN_U32("graphics/pokemon/unown/exclamation_mark/front.4bpp.lz");
+const u32 gMonBackPic_UnownExclamationMark[] = INCBIN_U32("graphics/pokemon/unown/exclamation_mark/back.4bpp.lz");
+const u8 gMonIcon_UnownExclamationMark[] = INCBIN_U8("graphics/pokemon/unown/exclamation_mark/icon.4bpp");
+
+const u32 gMonFrontPic_UnownQuestionMark[] = INCBIN_U32("graphics/pokemon/unown/question_mark/front.4bpp.lz");
+const u32 gMonBackPic_UnownQuestionMark[] = INCBIN_U32("graphics/pokemon/unown/question_mark/back.4bpp.lz");
+const u8 gMonIcon_UnownQuestionMark[] = INCBIN_U8("graphics/pokemon/unown/question_mark/icon.4bpp");
diff --git a/src/data/graphics/trainers.h b/src/data/graphics/trainers.h
new file mode 100644
index 000000000..07183e288
--- /dev/null
+++ b/src/data/graphics/trainers.h
@@ -0,0 +1,456 @@
+const u32 gTrainerFrontPic_AquaLeaderArchie[] = INCBIN_U32("graphics/trainers/front_pics/aqua_leader_archie_front_pic.4bpp.lz");
+const u32 gTrainerPalette_AquaLeaderArchie[] = INCBIN_U32("graphics/trainers/palettes/aqua_leader_archie.gbapal.lz");
+
+const u32 gTrainerFrontPic_AquaGruntM[] = INCBIN_U32("graphics/trainers/front_pics/aqua_grunt_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_AquaGruntM[] = INCBIN_U32("graphics/trainers/palettes/aqua_grunt_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_AquaGruntF[] = INCBIN_U32("graphics/trainers/front_pics/aqua_grunt_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_AquaGruntF[] = INCBIN_U32("graphics/trainers/palettes/aqua_grunt_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSAromaLady[] = INCBIN_U32("graphics/trainers/front_pics/rs_aroma_lady_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSAromaLady[] = INCBIN_U32("graphics/trainers/palettes/rs_aroma_lady.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSRuinManiac[] = INCBIN_U32("graphics/trainers/front_pics/rs_ruin_maniac_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSRuinManiac[] = INCBIN_U32("graphics/trainers/palettes/rs_ruin_maniac.gbapal.lz");
+
+const u32 gTrainerFrontPic_Interviewer[] = INCBIN_U32("graphics/trainers/front_pics/interviewer_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Interviewer[] = INCBIN_U32("graphics/trainers/palettes/interviewer.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSTuberF[] = INCBIN_U32("graphics/trainers/front_pics/rs_tuber_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSTuberF[] = INCBIN_U32("graphics/trainers/palettes/rs_tuber_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_TuberM[] = INCBIN_U32("graphics/trainers/front_pics/tuber_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_TuberM[] = INCBIN_U32("graphics/trainers/palettes/tuber_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSCooltrainerM[] = INCBIN_U32("graphics/trainers/front_pics/rs_cool_trainer_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSCooltrainerM[] = INCBIN_U32("graphics/trainers/palettes/rs_cool_trainer_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSCooltrainerF[] = INCBIN_U32("graphics/trainers/front_pics/rs_cool_trainer_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSCooltrainerF[] = INCBIN_U32("graphics/trainers/palettes/rs_cool_trainer_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_HexManiac[] = INCBIN_U32("graphics/trainers/front_pics/hex_maniac_front_pic.4bpp.lz");
+const u32 gTrainerPalette_HexManiac[] = INCBIN_U32("graphics/trainers/palettes/hex_maniac.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSLady[] = INCBIN_U32("graphics/trainers/front_pics/rs_lady_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSLady[] = INCBIN_U32("graphics/trainers/palettes/rs_lady.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSBeauty[] = INCBIN_U32("graphics/trainers/front_pics/rs_beauty_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSBeauty[] = INCBIN_U32("graphics/trainers/palettes/rs_beauty.gbapal.lz");
+
+const u32 gTrainerFrontPic_RichBoy[] = INCBIN_U32("graphics/trainers/front_pics/rich_boy_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RichBoy[] = INCBIN_U32("graphics/trainers/palettes/rich_boy.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSPokeManiac[] = INCBIN_U32("graphics/trainers/front_pics/rs_pokemaniac_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSPokeManiac[] = INCBIN_U32("graphics/trainers/palettes/rs_pokemaniac.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSSwimmerM[] = INCBIN_U32("graphics/trainers/front_pics/rs_swimmer_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSSwimmerM[] = INCBIN_U32("graphics/trainers/palettes/rs_swimmer_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSBlackBelt[] = INCBIN_U32("graphics/trainers/front_pics/rs_black_belt_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSBlackBelt[] = INCBIN_U32("graphics/trainers/palettes/rs_black_belt.gbapal.lz");
+
+const u32 gTrainerFrontPic_Guitarist[] = INCBIN_U32("graphics/trainers/front_pics/guitarist_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Guitarist[] = INCBIN_U32("graphics/trainers/palettes/guitarist.gbapal.lz");
+
+const u32 gTrainerFrontPic_Kindler[] = INCBIN_U32("graphics/trainers/front_pics/kindler_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Kindler[] = INCBIN_U32("graphics/trainers/palettes/kindler.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSCamper[] = INCBIN_U32("graphics/trainers/front_pics/rs_camper_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSCamper[] = INCBIN_U32("graphics/trainers/palettes/rs_camper.gbapal.lz");
+
+const u32 gTrainerFrontPic_BugManiac[] = INCBIN_U32("graphics/trainers/front_pics/bug_maniac_front_pic.4bpp.lz");
+const u32 gTrainerPalette_BugManiac[] = INCBIN_U32("graphics/trainers/palettes/bug_maniac.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSPsychicM[] = INCBIN_U32("graphics/trainers/front_pics/rs_psychic_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSPsychicM[] = INCBIN_U32("graphics/trainers/palettes/rs_psychic_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSPsychicF[] = INCBIN_U32("graphics/trainers/front_pics/rs_psychic_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSPsychicF[] = INCBIN_U32("graphics/trainers/palettes/rs_psychic_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSGentleman[] = INCBIN_U32("graphics/trainers/front_pics/rs_gentleman_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSGentleman[] = INCBIN_U32("graphics/trainers/palettes/rs_gentleman.gbapal.lz");
+
+const u32 gTrainerFrontPic_EliteFourSidney[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_sidney_front_pic.4bpp.lz");
+const u32 gTrainerPalette_EliteFourSidney[] = INCBIN_U32("graphics/trainers/palettes/elite_four_sidney.gbapal.lz");
+
+const u32 gTrainerFrontPic_EliteFourPhoebe[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_phoebe_front_pic.4bpp.lz");
+const u32 gTrainerPalette_EliteFourPhoebe[] = INCBIN_U32("graphics/trainers/palettes/elite_four_phoebe.gbapal.lz");
+
+const u32 gTrainerFrontPic_LeaderRoxanne[] = INCBIN_U32("graphics/trainers/front_pics/leader_roxanne_front_pic.4bpp.lz");
+const u32 gTrainerPalette_LeaderRoxanne[] = INCBIN_U32("graphics/trainers/palettes/leader_roxanne.gbapal.lz");
+
+const u32 gTrainerFrontPic_LeaderBrawly[] = INCBIN_U32("graphics/trainers/front_pics/leader_brawly_front_pic.4bpp.lz");
+const u32 gTrainerPalette_LeaderBrawly[] = INCBIN_U32("graphics/trainers/palettes/leader_brawly.gbapal.lz");
+
+const u32 gTrainerFrontPic_LeaderTateAndLiza[] = INCBIN_U32("graphics/trainers/front_pics/leader_tate_and_liza_front_pic.4bpp.lz");
+const u32 gTrainerPalette_LeaderTateAndLiza[] = INCBIN_U32("graphics/trainers/palettes/leader_tate_and_liza.gbapal.lz");
+
+const u32 gTrainerFrontPic_SchoolKidM[] = INCBIN_U32("graphics/trainers/front_pics/school_kid_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_SchoolKidM[] = INCBIN_U32("graphics/trainers/palettes/school_kid_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_SchoolKidF[] = INCBIN_U32("graphics/trainers/front_pics/school_kid_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_SchoolKidF[] = INCBIN_U32("graphics/trainers/palettes/school_kid_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_SrAndJr[] = INCBIN_U32("graphics/trainers/front_pics/sr_and_jr_front_pic.4bpp.lz");
+const u32 gTrainerPalette_SrAndJr[] = INCBIN_U32("graphics/trainers/palettes/sr_and_jr.gbapal.lz");
+
+const u32 gTrainerFrontPic_PokefanM[] = INCBIN_U32("graphics/trainers/front_pics/pokefan_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_PokefanM[] = INCBIN_U32("graphics/trainers/palettes/pokefan_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_PokefanF[] = INCBIN_U32("graphics/trainers/front_pics/pokefan_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_PokefanF[] = INCBIN_U32("graphics/trainers/palettes/pokefan_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_ExpertM[] = INCBIN_U32("graphics/trainers/front_pics/expert_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_ExpertM[] = INCBIN_U32("graphics/trainers/palettes/expert_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_ExpertF[] = INCBIN_U32("graphics/trainers/front_pics/expert_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_ExpertF[] = INCBIN_U32("graphics/trainers/palettes/expert_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSYoungster[] = INCBIN_U32("graphics/trainers/front_pics/rs_youngster_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSYoungster[] = INCBIN_U32("graphics/trainers/palettes/rs_youngster.gbapal.lz");
+
+const u32 gTrainerFrontPic_ChampionSteven[] = INCBIN_U32("graphics/trainers/front_pics/champion_steven_front_pic.4bpp.lz");
+const u32 gTrainerPalette_ChampionSteven[] = INCBIN_U32("graphics/trainers/palettes/champion_steven.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSFisherman[] = INCBIN_U32("graphics/trainers/front_pics/rs_fisherman_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSFisherman[] = INCBIN_U32("graphics/trainers/palettes/rs_fisherman.gbapal.lz");
+
+const u32 gTrainerFrontPic_CyclingTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/cycling_triathlete_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_CyclingTriathleteM[] = INCBIN_U32("graphics/trainers/palettes/cycling_triathlete_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_CyclingTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/cycling_triathlete_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_CyclingTriathleteF[] = INCBIN_U32("graphics/trainers/palettes/cycling_triathlete_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_RunningTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/running_triathlete_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RunningTriathleteM[] = INCBIN_U32("graphics/trainers/palettes/running_triathlete_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_RunningTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/running_triathlete_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RunningTriathleteF[] = INCBIN_U32("graphics/trainers/palettes/running_triathlete_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_SwimmingTriathleteM[] = INCBIN_U32("graphics/trainers/front_pics/swimming_triathlete_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_SwimmingTriathleteM[] = INCBIN_U32("graphics/trainers/palettes/swimming_triathlete_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_SwimmingTriathleteF[] = INCBIN_U32("graphics/trainers/front_pics/swimming_triathlete_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_SwimmingTriathleteF[] = INCBIN_U32("graphics/trainers/palettes/swimming_triathlete_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_DragonTamer[] = INCBIN_U32("graphics/trainers/front_pics/dragon_tamer_front_pic.4bpp.lz");
+const u32 gTrainerPalette_DragonTamer[] = INCBIN_U32("graphics/trainers/palettes/dragon_tamer.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSBirdKeeper[] = INCBIN_U32("graphics/trainers/front_pics/rs_bird_keeper_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSBirdKeeper[] = INCBIN_U32("graphics/trainers/palettes/rs_bird_keeper.gbapal.lz");
+
+const u32 gTrainerFrontPic_NinjaBoy[] = INCBIN_U32("graphics/trainers/front_pics/ninja_boy_front_pic.4bpp.lz");
+const u32 gTrainerPalette_NinjaBoy[] = INCBIN_U32("graphics/trainers/palettes/ninja_boy.gbapal.lz");
+
+const u32 gTrainerFrontPic_BattleGirl[] = INCBIN_U32("graphics/trainers/front_pics/battle_girl_front_pic.4bpp.lz");
+const u32 gTrainerPalette_BattleGirl[] = INCBIN_U32("graphics/trainers/palettes/battle_girl.gbapal.lz");
+
+const u32 gTrainerFrontPic_ParasolLady[] = INCBIN_U32("graphics/trainers/front_pics/parasol_lady_front_pic.4bpp.lz");
+const u32 gTrainerPalette_ParasolLady[] = INCBIN_U32("graphics/trainers/palettes/parasol_lady.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSSwimmerF[] = INCBIN_U32("graphics/trainers/front_pics/rs_swimmer_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSSwimmerF[] = INCBIN_U32("graphics/trainers/palettes/rs_swimmer_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSPicnicker[] = INCBIN_U32("graphics/trainers/front_pics/rs_picnicker_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSPicnicker[] = INCBIN_U32("graphics/trainers/palettes/rs_picnicker.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSTwins[] = INCBIN_U32("graphics/trainers/front_pics/rs_twins_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSTwins[] = INCBIN_U32("graphics/trainers/palettes/rs_twins.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSSailor[] = INCBIN_U32("graphics/trainers/front_pics/rs_sailor_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSSailor[] = INCBIN_U32("graphics/trainers/palettes/rs_sailor.gbapal.lz");
+
+const u32 gTrainerFrontPic_Collector[] = INCBIN_U32("graphics/trainers/front_pics/collector_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Collector[] = INCBIN_U32("graphics/trainers/palettes/collector.gbapal.lz");
+
+const u32 gTrainerFrontPic_Wally[] = INCBIN_U32("graphics/trainers/front_pics/wally_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Wally[] = INCBIN_U32("graphics/trainers/palettes/wally.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSBrendan1[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire_brendan_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSBrendan1[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSMay1[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire_may_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSMay1[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_may.gbapal.lz");
+
+const u32 gTrainerFrontPic_PokemonBreederM[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_breeder_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_PokemonBreederM[] = INCBIN_U32("graphics/trainers/palettes/pokemon_breeder_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSPokemonBreederF[] = INCBIN_U32("graphics/trainers/front_pics/rs_pokemon_breeder_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSPokemonBreederF[] = INCBIN_U32("graphics/trainers/palettes/rs_pokemon_breeder_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSPokemonRangerM[] = INCBIN_U32("graphics/trainers/front_pics/rs_pokemon_ranger_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSPokemonRangerM[] = INCBIN_U32("graphics/trainers/palettes/rs_pokemon_ranger_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSPokemonRangerF[] = INCBIN_U32("graphics/trainers/front_pics/rs_pokemon_ranger_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSPokemonRangerF[] = INCBIN_U32("graphics/trainers/palettes/rs_pokemon_ranger_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_MagmaLeaderMaxie[] = INCBIN_U32("graphics/trainers/front_pics/magma_leader_maxie_front_pic.4bpp.lz");
+const u32 gTrainerPalette_MagmaLeaderMaxie[] = INCBIN_U32("graphics/trainers/palettes/magma_leader_maxie.gbapal.lz");
+
+const u32 gTrainerFrontPic_MagmaGruntM[] = INCBIN_U32("graphics/trainers/front_pics/magma_grunt_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_MagmaGruntM[] = INCBIN_U32("graphics/trainers/palettes/magma_grunt_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_MagmaGruntF[] = INCBIN_U32("graphics/trainers/front_pics/magma_grunt_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_MagmaGruntF[] = INCBIN_U32("graphics/trainers/palettes/magma_grunt_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSLass[] = INCBIN_U32("graphics/trainers/front_pics/rs_lass_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSLass[] = INCBIN_U32("graphics/trainers/palettes/rs_lass.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSBugCatcher[] = INCBIN_U32("graphics/trainers/front_pics/rs_bug_catcher_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSBugCatcher[] = INCBIN_U32("graphics/trainers/palettes/rs_bug_catcher.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSHiker[] = INCBIN_U32("graphics/trainers/front_pics/rs_hiker_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSHiker[] = INCBIN_U32("graphics/trainers/palettes/rs_hiker.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSYoungCouple[] = INCBIN_U32("graphics/trainers/front_pics/rs_young_couple_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSYoungCouple[] = INCBIN_U32("graphics/trainers/palettes/rs_young_couple.gbapal.lz");
+
+const u32 gTrainerFrontPic_OldCouple[] = INCBIN_U32("graphics/trainers/front_pics/old_couple_front_pic.4bpp.lz");
+const u32 gTrainerPalette_OldCouple[] = INCBIN_U32("graphics/trainers/palettes/old_couple.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSSisAndBro[] = INCBIN_U32("graphics/trainers/front_pics/rs_sis_and_bro_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSSisAndBro[] = INCBIN_U32("graphics/trainers/palettes/rs_sis_and_bro.gbapal.lz");
+
+const u32 gTrainerFrontPic_AquaAdminM[] = INCBIN_U32("graphics/trainers/front_pics/aqua_admin_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_AquaAdminM[] = INCBIN_U32("graphics/trainers/palettes/aqua_admin_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_AquaAdminF[] = INCBIN_U32("graphics/trainers/front_pics/aqua_admin_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_AquaAdminF[] = INCBIN_U32("graphics/trainers/palettes/aqua_admin_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_MagmaAdminM[] = INCBIN_U32("graphics/trainers/front_pics/magma_admin_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_MagmaAdminM[] = INCBIN_U32("graphics/trainers/palettes/magma_admin_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_MagmaAdminF[] = INCBIN_U32("graphics/trainers/front_pics/magma_admin_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_MagmaAdminF[] = INCBIN_U32("graphics/trainers/palettes/magma_admin_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_LeaderWattson[] = INCBIN_U32("graphics/trainers/front_pics/leader_wattson_front_pic.4bpp.lz");
+const u32 gTrainerPalette_LeaderWattson[] = INCBIN_U32("graphics/trainers/palettes/leader_wattson.gbapal.lz");
+
+const u32 gTrainerFrontPic_LeaderFlannery[] = INCBIN_U32("graphics/trainers/front_pics/leader_flannery_front_pic.4bpp.lz");
+const u32 gTrainerPalette_LeaderFlannery[] = INCBIN_U32("graphics/trainers/palettes/leader_flannery.gbapal.lz");
+
+const u32 gTrainerFrontPic_LeaderNorman[] = INCBIN_U32("graphics/trainers/front_pics/leader_norman_front_pic.4bpp.lz");
+const u32 gTrainerPalette_LeaderNorman[] = INCBIN_U32("graphics/trainers/palettes/leader_norman.gbapal.lz");
+
+const u32 gTrainerFrontPic_LeaderWinona[] = INCBIN_U32("graphics/trainers/front_pics/leader_winona_front_pic.4bpp.lz");
+const u32 gTrainerPalette_LeaderWinona[] = INCBIN_U32("graphics/trainers/palettes/leader_winona.gbapal.lz");
+
+const u32 gTrainerFrontPic_LeaderWallace[] = INCBIN_U32("graphics/trainers/front_pics/leader_wallace_front_pic.4bpp.lz");
+const u32 gTrainerPalette_LeaderWallace[] = INCBIN_U32("graphics/trainers/palettes/leader_wallace.gbapal.lz");
+
+const u32 gTrainerFrontPic_EliteFourGlacia[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_glacia_front_pic.4bpp.lz");
+const u32 gTrainerPalette_EliteFourGlacia[] = INCBIN_U32("graphics/trainers/palettes/elite_four_glacia.gbapal.lz");
+
+const u32 gTrainerFrontPic_EliteFourDrake[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_drake_front_pic.4bpp.lz");
+const u32 gTrainerPalette_EliteFourDrake[] = INCBIN_U32("graphics/trainers/palettes/elite_four_drake.gbapal.lz");
+
+const u32 gTrainerFrontPic_Youngster[] = INCBIN_U32("graphics/trainers/front_pics/youngster_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Youngster[] = INCBIN_U32("graphics/trainers/palettes/youngster.gbapal.lz");
+
+const u32 gTrainerFrontPic_BugCatcher[] = INCBIN_U32("graphics/trainers/front_pics/bug_catcher_front_pic.4bpp.lz");
+const u32 gTrainerPalette_BugCatcher[] = INCBIN_U32("graphics/trainers/palettes/bug_catcher.gbapal.lz");
+
+const u32 gTrainerFrontPic_Lass[] = INCBIN_U32("graphics/trainers/front_pics/lass_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Lass[] = INCBIN_U32("graphics/trainers/palettes/lass.gbapal.lz");
+
+const u32 gTrainerFrontPic_Sailor[] = INCBIN_U32("graphics/trainers/front_pics/sailor_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Sailor[] = INCBIN_U32("graphics/trainers/palettes/sailor.gbapal.lz");
+
+const u32 gTrainerFrontPic_Camper[] = INCBIN_U32("graphics/trainers/front_pics/camper_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Camper[] = INCBIN_U32("graphics/trainers/palettes/camper.gbapal.lz");
+
+const u32 gTrainerFrontPic_Picnicker[] = INCBIN_U32("graphics/trainers/front_pics/picnicker_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Picnicker[] = INCBIN_U32("graphics/trainers/palettes/picnicker.gbapal.lz");
+
+const u32 gTrainerFrontPic_PokeManiac[] = INCBIN_U32("graphics/trainers/front_pics/pokemaniac_front_pic.4bpp.lz");
+const u32 gTrainerPalette_PokeManiac[] = INCBIN_U32("graphics/trainers/palettes/pokemaniac.gbapal.lz");
+
+const u32 gTrainerFrontPic_SuperNerd[] = INCBIN_U32("graphics/trainers/front_pics/super_nerd_front_pic.4bpp.lz");
+const u32 gTrainerPalette_SuperNerd[] = INCBIN_U32("graphics/trainers/palettes/super_nerd.gbapal.lz");
+
+const u32 gTrainerFrontPic_Hiker[] = INCBIN_U32("graphics/trainers/front_pics/hiker_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Hiker[] = INCBIN_U32("graphics/trainers/palettes/hiker.gbapal.lz");
+
+const u32 gTrainerFrontPic_Biker[] = INCBIN_U32("graphics/trainers/front_pics/biker_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Biker[] = INCBIN_U32("graphics/trainers/palettes/biker.gbapal.lz");
+
+const u32 gTrainerFrontPic_Burglar[] = INCBIN_U32("graphics/trainers/front_pics/burglar_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Burglar[] = INCBIN_U32("graphics/trainers/palettes/burglar.gbapal.lz");
+
+const u32 gTrainerFrontPic_Engineer[] = INCBIN_U32("graphics/trainers/front_pics/engineer_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Engineer[] = INCBIN_U32("graphics/trainers/palettes/engineer.gbapal.lz");
+
+const u32 gTrainerFrontPic_Fisherman[] = INCBIN_U32("graphics/trainers/front_pics/fisherman_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Fisherman[] = INCBIN_U32("graphics/trainers/palettes/fisherman.gbapal.lz");
+
+const u32 gTrainerFrontPic_SwimmerM[] = INCBIN_U32("graphics/trainers/front_pics/swimmer_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_SwimmerM[] = INCBIN_U32("graphics/trainers/palettes/swimmer_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_CueBall[] = INCBIN_U32("graphics/trainers/front_pics/cue_ball_front_pic.4bpp.lz");
+const u32 gTrainerPalette_CueBall[] = INCBIN_U32("graphics/trainers/palettes/cue_ball.gbapal.lz");
+
+const u32 gTrainerFrontPic_Gamer[] = INCBIN_U32("graphics/trainers/front_pics/gamer_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Gamer[] = INCBIN_U32("graphics/trainers/palettes/gamer.gbapal.lz");
+
+const u32 gTrainerFrontPic_Beauty[] = INCBIN_U32("graphics/trainers/front_pics/beauty_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Beauty[] = INCBIN_U32("graphics/trainers/palettes/beauty.gbapal.lz");
+
+const u32 gTrainerFrontPic_SwimmerF[] = INCBIN_U32("graphics/trainers/front_pics/swimmer_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_SwimmerF[] = INCBIN_U32("graphics/trainers/palettes/swimmer_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_PsychicM[] = INCBIN_U32("graphics/trainers/front_pics/psychic_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_PsychicM[] = INCBIN_U32("graphics/trainers/palettes/psychic_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_Rocker[] = INCBIN_U32("graphics/trainers/front_pics/rocker_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Rocker[] = INCBIN_U32("graphics/trainers/palettes/rocker.gbapal.lz");
+
+const u32 gTrainerFrontPic_Juggler[] = INCBIN_U32("graphics/trainers/front_pics/juggler_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Juggler[] = INCBIN_U32("graphics/trainers/palettes/juggler.gbapal.lz");
+
+const u32 gTrainerFrontPic_Tamer[] = INCBIN_U32("graphics/trainers/front_pics/tamer_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Tamer[] = INCBIN_U32("graphics/trainers/palettes/tamer.gbapal.lz");
+
+const u32 gTrainerFrontPic_BirdKeeper[] = INCBIN_U32("graphics/trainers/front_pics/bird_keeper_front_pic.4bpp.lz");
+const u32 gTrainerPalette_BirdKeeper[] = INCBIN_U32("graphics/trainers/palettes/bird_keeper.gbapal.lz");
+
+const u32 gTrainerFrontPic_BlackBelt[] = INCBIN_U32("graphics/trainers/front_pics/black_belt_front_pic.4bpp.lz");
+const u32 gTrainerPalette_BlackBelt[] = INCBIN_U32("graphics/trainers/palettes/black_belt.gbapal.lz");
+
+const u32 gTrainerFrontPic_Rival1[] = INCBIN_U32("graphics/trainers/front_pics/rival_1_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Rival1[] = INCBIN_U32("graphics/trainers/palettes/rival_1.gbapal.lz");
+
+const u32 gTrainerFrontPic_Scientist[] = INCBIN_U32("graphics/trainers/front_pics/scientist_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Scientist[] = INCBIN_U32("graphics/trainers/palettes/scientist.gbapal.lz");
+
+const u32 gTrainerFrontPic_LeaderGiovanni[] = INCBIN_U32("graphics/trainers/front_pics/leader_giovanni_front_pic.4bpp.lz");
+const u32 gTrainerPalette_LeaderGiovanni[] = INCBIN_U32("graphics/trainers/palettes/leader_giovanni.gbapal.lz");
+
+const u32 gTrainerFrontPic_RocketGruntM[] = INCBIN_U32("graphics/trainers/front_pics/rocket_grunt_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RocketGruntM[] = INCBIN_U32("graphics/trainers/palettes/rocket_grunt_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_CooltrainerM[] = INCBIN_U32("graphics/trainers/front_pics/cool_trainer_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_CooltrainerM[] = INCBIN_U32("graphics/trainers/palettes/cool_trainer_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_CooltrainerF[] = INCBIN_U32("graphics/trainers/front_pics/cool_trainer_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_CooltrainerF[] = INCBIN_U32("graphics/trainers/palettes/cool_trainer_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_EliteFourLorelei[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_lorelei_front_pic.4bpp.lz");
+const u32 gTrainerPalette_EliteFourLorelei[] = INCBIN_U32("graphics/trainers/palettes/elite_four_lorelei.gbapal.lz");
+
+const u32 gTrainerFrontPic_EliteFourBruno[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_bruno_front_pic.4bpp.lz");
+const u32 gTrainerPalette_EliteFourBruno[] = INCBIN_U32("graphics/trainers/palettes/elite_four_bruno.gbapal.lz");
+
+const u32 gTrainerFrontPic_EliteFourAgatha[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_agatha_front_pic.4bpp.lz");
+const u32 gTrainerPalette_EliteFourAgatha[] = INCBIN_U32("graphics/trainers/palettes/elite_four_agatha.gbapal.lz");
+
+const u32 gTrainerFrontPic_EliteFourLance[] = INCBIN_U32("graphics/trainers/front_pics/elite_four_lance_front_pic.4bpp.lz");
+const u32 gTrainerPalette_EliteFourLance[] = INCBIN_U32("graphics/trainers/palettes/elite_four_lance.gbapal.lz");
+
+const u32 gTrainerFrontPic_LeaderBrock[] = INCBIN_U32("graphics/trainers/front_pics/leader_brock_front_pic.4bpp.lz");
+const u32 gTrainerPalette_LeaderBrock[] = INCBIN_U32("graphics/trainers/palettes/leader_brock.gbapal.lz");
+
+const u32 gTrainerFrontPic_LeaderMisty[] = INCBIN_U32("graphics/trainers/front_pics/leader_misty_front_pic.4bpp.lz");
+const u32 gTrainerPalette_LeaderMisty[] = INCBIN_U32("graphics/trainers/palettes/leader_misty.gbapal.lz");
+
+const u32 gTrainerFrontPic_LeaderLtSurge[] = INCBIN_U32("graphics/trainers/front_pics/leader_lt_surge_front_pic.4bpp.lz");
+const u32 gTrainerPalette_LeaderLtSurge[] = INCBIN_U32("graphics/trainers/palettes/leader_lt_surge.gbapal.lz");
+
+const u32 gTrainerFrontPic_LeaderErika[] = INCBIN_U32("graphics/trainers/front_pics/leader_erika_front_pic.4bpp.lz");
+const u32 gTrainerPalette_LeaderErika[] = INCBIN_U32("graphics/trainers/palettes/leader_erika.gbapal.lz");
+
+const u32 gTrainerFrontPic_LeaderKoga[] = INCBIN_U32("graphics/trainers/front_pics/leader_koga_front_pic.4bpp.lz");
+const u32 gTrainerPalette_LeaderKoga[] = INCBIN_U32("graphics/trainers/palettes/leader_koga.gbapal.lz");
+
+const u32 gTrainerFrontPic_LeaderBlaine[] = INCBIN_U32("graphics/trainers/front_pics/leader_blaine_front_pic.4bpp.lz");
+const u32 gTrainerPalette_LeaderBlaine[] = INCBIN_U32("graphics/trainers/palettes/leader_blaine.gbapal.lz");
+
+const u32 gTrainerFrontPic_LeaderSabrina[] = INCBIN_U32("graphics/trainers/front_pics/leader_sabrina_front_pic.4bpp.lz");
+const u32 gTrainerPalette_LeaderSabrina[] = INCBIN_U32("graphics/trainers/palettes/leader_sabrina.gbapal.lz");
+
+const u32 gTrainerFrontPic_Gentleman[] = INCBIN_U32("graphics/trainers/front_pics/gentleman_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Gentleman[] = INCBIN_U32("graphics/trainers/palettes/gentleman.gbapal.lz");
+
+const u32 gTrainerFrontPic_Rival2[] = INCBIN_U32("graphics/trainers/front_pics/rival_2_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Rival2[] = INCBIN_U32("graphics/trainers/palettes/rival_2.gbapal.lz");
+
+const u32 gTrainerFrontPic_ChampionRival[] = INCBIN_U32("graphics/trainers/front_pics/champion_rival_front_pic.4bpp.lz");
+const u32 gTrainerPalette_ChampionRival[] = INCBIN_U32("graphics/trainers/palettes/champion_rival.gbapal.lz");
+
+const u32 gTrainerFrontPic_Channeler[] = INCBIN_U32("graphics/trainers/front_pics/channeler_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Channeler[] = INCBIN_U32("graphics/trainers/palettes/channeler.gbapal.lz");
+
+const u32 gTrainerFrontPic_Twins[] = INCBIN_U32("graphics/trainers/front_pics/twins_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Twins[] = INCBIN_U32("graphics/trainers/palettes/twins.gbapal.lz");
+
+const u32 gTrainerFrontPic_CoolCouple[] = INCBIN_U32("graphics/trainers/front_pics/cool_couple_front_pic.4bpp.lz");
+const u32 gTrainerPalette_CoolCouple[] = INCBIN_U32("graphics/trainers/palettes/cool_couple.gbapal.lz");
+
+const u32 gTrainerFrontPic_YoungCouple[] = INCBIN_U32("graphics/trainers/front_pics/young_couple_front_pic.4bpp.lz");
+const u32 gTrainerPalette_YoungCouple[] = INCBIN_U32("graphics/trainers/palettes/young_couple.gbapal.lz");
+
+const u32 gTrainerFrontPic_CrushKin[] = INCBIN_U32("graphics/trainers/front_pics/crush_kin_front_pic.4bpp.lz");
+const u32 gTrainerPalette_CrushKin[] = INCBIN_U32("graphics/trainers/palettes/crush_kin.gbapal.lz");
+
+const u32 gTrainerFrontPic_SisAndBro[] = INCBIN_U32("graphics/trainers/front_pics/sis_and_bro_front_pic.4bpp.lz");
+const u32 gTrainerPalette_SisAndBro[] = INCBIN_U32("graphics/trainers/palettes/sis_and_bro.gbapal.lz");
+
+const u32 gTrainerFrontPic_ProfessorOak[] = INCBIN_U32("graphics/trainers/front_pics/professor_oak_front_pic.4bpp.lz");
+const u32 gTrainerPalette_ProfessorOak[] = INCBIN_U32("graphics/trainers/palettes/professor_oak.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSBrendan2[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire_brendan_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSBrendan2[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal.lz");
+
+const u32 gTrainerFrontPic_RSMay2[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire_may_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RSMay2[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_may.gbapal.lz");
+
+const u32 gTrainerFrontPic_Red[] = INCBIN_U32("graphics/trainers/front_pics/red_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Red[] = INCBIN_U32("graphics/trainers/palettes/red.gbapal.lz");
+
+const u32 gTrainerFrontPic_Leaf[] = INCBIN_U32("graphics/trainers/front_pics/leaf_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Leaf[] = INCBIN_U32("graphics/trainers/palettes/leaf.gbapal.lz");
+
+const u32 gTrainerFrontPic_RocketGruntF[] = INCBIN_U32("graphics/trainers/front_pics/rocket_grunt_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RocketGruntF[] = INCBIN_U32("graphics/trainers/palettes/rocket_grunt_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_PsychicF[] = INCBIN_U32("graphics/trainers/front_pics/psychic_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_PsychicF[] = INCBIN_U32("graphics/trainers/palettes/psychic_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_CrushGirl[] = INCBIN_U32("graphics/trainers/front_pics/crush_girl_front_pic.4bpp.lz");
+const u32 gTrainerPalette_CrushGirl[] = INCBIN_U32("graphics/trainers/palettes/crush_girl.gbapal.lz");
+
+const u32 gTrainerFrontPic_TuberF[] = INCBIN_U32("graphics/trainers/front_pics/tuber_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_TuberF[] = INCBIN_U32("graphics/trainers/palettes/tuber_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_PokemonBreederF[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_breeder_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_PokemonBreederF[] = INCBIN_U32("graphics/trainers/palettes/pokemon_breeder_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_PokemonRangerM[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_ranger_m_front_pic.4bpp.lz");
+const u32 gTrainerPalette_PokemonRangerM[] = INCBIN_U32("graphics/trainers/palettes/pokemon_ranger_m.gbapal.lz");
+
+const u32 gTrainerFrontPic_PokemonRangerF[] = INCBIN_U32("graphics/trainers/front_pics/pokemon_ranger_f_front_pic.4bpp.lz");
+const u32 gTrainerPalette_PokemonRangerF[] = INCBIN_U32("graphics/trainers/palettes/pokemon_ranger_f.gbapal.lz");
+
+const u32 gTrainerFrontPic_AromaLady[] = INCBIN_U32("graphics/trainers/front_pics/aroma_lady_front_pic.4bpp.lz");
+const u32 gTrainerPalette_AromaLady[] = INCBIN_U32("graphics/trainers/palettes/aroma_lady.gbapal.lz");
+
+const u32 gTrainerFrontPic_RuinManiac[] = INCBIN_U32("graphics/trainers/front_pics/ruin_maniac_front_pic.4bpp.lz");
+const u32 gTrainerPalette_RuinManiac[] = INCBIN_U32("graphics/trainers/palettes/ruin_maniac.gbapal.lz");
+
+const u32 gTrainerFrontPic_Lady[] = INCBIN_U32("graphics/trainers/front_pics/lady_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Lady[] = INCBIN_U32("graphics/trainers/palettes/lady.gbapal.lz");
+
+const u32 gTrainerFrontPic_Painter[] = INCBIN_U32("graphics/trainers/front_pics/painter_front_pic.4bpp.lz");
+const u32 gTrainerPalette_Painter[] = INCBIN_U32("graphics/trainers/palettes/painter.gbapal.lz");
+
+const u8 gTrainerBackPic_Red[] = INCBIN_U8("graphics/trainers/back_pics/red_back_pic.4bpp");
+const u8 gTrainerBackPic_Leaf[] = INCBIN_U8("graphics/trainers/back_pics/leaf_back_pic.4bpp");
+const u8 gTrainerBackPic_Pokedude[] = INCBIN_U8("graphics/trainers/back_pics/pokedude_back_pic.4bpp");
+const u8 gTrainerBackPic_OldMan[] = INCBIN_U8("graphics/trainers/back_pics/old_man_back_pic.4bpp");
+
+const u8 gTrainerBackPic_RSBrendan[] = INCBIN_U8("graphics/trainers/back_pics/ruby_sapphire_brendan_back_pic.4bpp");
+const u8 gTrainerBackPic_RSMay[] = INCBIN_U8("graphics/trainers/back_pics/ruby_sapphire_may_back_pic.4bpp");
+
+const u32 gTrainerPalette_RedBackPic[] = INCBIN_U32("graphics/trainers/palettes/leaf_back_pic.gbapal.lz");
+const u32 gTrainerPalette_LeafBackPic[] = INCBIN_U32("graphics/trainers/palettes/red_back_pic.gbapal.lz");
+const u32 gTrainerPalette_PokedudeBackPic[] = INCBIN_U32("graphics/trainers/palettes/pokedude_back_pic.gbapal.lz");
+const u32 gTrainerPalette_OldManBackPic[] = INCBIN_U32("graphics/trainers/palettes/old_man_back_pic.gbapal.lz");
diff --git a/src/data/pokemon/trainer_class_lookups.h b/src/data/pokemon/trainer_class_lookups.h
index faf23bf31..2309f85a1 100644
--- a/src/data/pokemon/trainer_class_lookups.h
+++ b/src/data/pokemon/trainer_class_lookups.h
@@ -133,10 +133,10 @@ const u8 gFacilityClassToPicIndex[] =
[FACILITY_CLASS_CRUSH_KIN] = 130,
[FACILITY_CLASS_SIS_AND_BRO_2] = 131,
[FACILITY_CLASS_PKMN_PROF] = 132,
- [FACILITY_CLASS_PLAYER] = 133,
- [FACILITY_CLASS_PLAYER_2] = 134,
- [FACILITY_CLASS_PLAYER_3] = 135,
- [FACILITY_CLASS_PLAYER_4] = 136,
+ [FACILITY_CLASS_BRENDAN] = TRAINER_PIC_RS_BRENDAN_2,
+ [FACILITY_CLASS_MAY] = TRAINER_PIC_RS_MAY_2,
+ [FACILITY_CLASS_RED] = TRAINER_PIC_RED,
+ [FACILITY_CLASS_LEAF] = TRAINER_PIC_LEAF,
[FACILITY_CLASS_TEAM_ROCKET_2] = 137,
[FACILITY_CLASS_PSYCHIC_4] = 138,
[FACILITY_CLASS_CRUSH_GIRL] = 139,
@@ -287,10 +287,10 @@ const u8 gFacilityClassToTrainerClass[] =
[FACILITY_CLASS_CRUSH_KIN] = CLASS_CRUSH_KIN,
[FACILITY_CLASS_SIS_AND_BRO_2] = CLASS_SIS_AND_BRO_2,
[FACILITY_CLASS_PKMN_PROF] = CLASS_PKMN_PROF,
- [FACILITY_CLASS_PLAYER] = CLASS_PLAYER,
- [FACILITY_CLASS_PLAYER_2] = CLASS_PLAYER,
- [FACILITY_CLASS_PLAYER_3] = CLASS_PLAYER,
- [FACILITY_CLASS_PLAYER_4] = CLASS_PLAYER,
+ [FACILITY_CLASS_BRENDAN] = CLASS_PLAYER,
+ [FACILITY_CLASS_MAY] = CLASS_PLAYER,
+ [FACILITY_CLASS_RED] = CLASS_PLAYER,
+ [FACILITY_CLASS_LEAF] = CLASS_PLAYER,
[FACILITY_CLASS_TEAM_ROCKET_2] = CLASS_TEAM_ROCKET,
[FACILITY_CLASS_PSYCHIC_4] = CLASS_PSYCHIC_2,
[FACILITY_CLASS_CRUSH_GIRL] = CLASS_CRUSH_GIRL,
diff --git a/src/data/pokemon_graphics/palette_table.h b/src/data/pokemon_graphics/palette_table.h
index 35edcc76c..bb4f64a07 100644
--- a/src/data/pokemon_graphics/palette_table.h
+++ b/src/data/pokemon_graphics/palette_table.h
@@ -1,4 +1,5 @@
-const struct CompressedSpritePalette gMonPaletteTable[] =
+// A dirty hack because field_effect.c requires this not be const
+__attribute__((section(".rodata"))) struct CompressedSpritePalette gMonPaletteTable[] =
{
SPECIES_PAL(NONE, gMonPalette_CircledQuestionMark),
SPECIES_PAL(BULBASAUR, gMonPalette_Bulbasaur),
diff --git a/src/data/text/quest_log.h b/src/data/text/quest_log.h
new file mode 100644
index 000000000..db65f6e47
--- /dev/null
+++ b/src/data/text/quest_log.h
@@ -0,0 +1,125 @@
+const u8 gText_QuestLog_PreviouslyOnYourQuest[] = _("Previously on your quest…");
+const u8 gText_QuestLog_SwitchMon1WithMon2[] = _("{PLAYER} switched the POKéMON\n{STR_VAR_1} with {STR_VAR_2}.");
+const u8 gText_QuestLog_SwappedHeldItemsOnMon[] = _("Took the item {STR_VAR_2} from\n{STR_VAR_1} and gave it the item\n{STR_VAR_3} to hold.");
+const u8 gText_QuestLog_TookHeldItemFromMon[] = _("Took the item {STR_VAR_2} from\n{STR_VAR_1}.");
+const u8 gText_QuestLog_UsedItemOnMonAtThisLocation[] = _("Used the item {STR_VAR_1} on {STR_VAR_2}\nat this location.");
+const u8 gText_QuestLog_UsedTheItem[] = _("{PLAYER} used the\n{STR_VAR_1}.");
+const u8 gText_QuestLog_UsedTheKeyItem[] = _("Used the item {STR_VAR_1}, which was\nin the KEY ITEMS POCKET.");
+const u8 gText_QuestLog_MonLearnedMoveFromTM[] = _("{STR_VAR_1} learned the move\n{STR_VAR_2} from a TM.");
+const u8 gText_QuestLog_MonReplacedMoveWithTM[] = _("{STR_VAR_1} learned the move\n{STR_VAR_2} from a TM and forgot\nthe move {STR_VAR_3}.");
+const u8 gText_QuestLog_MonsWereFullyRestoredAtCenter[] = _("POKéMON were fully restored\nat a POKéMON CENTER.");
+const u8 gText_QuestLog_PlayerBattledChampionRival[] = _("{DYNAMIC 0x00} had a marvelous battle\nwith the CHAMPION, {DYNAMIC 0x01}.");
+const u8 gText_QuestLog_PlayerSentOutMon1RivalSentOutMon2[] = _("In the end, {DYNAMIC 0x00} sent out {DYNAMIC 0x01}\nwhile {DYNAMIC 0x02} countered with\n{DYNAMIC 0x03}.");
+const u8 gText_QuestLog_WonTheMatchAsAResult[] = _("And, as a result of battling with every\nbit of power, {DYNAMIC 0x00} won\nthe match.");
+const u8 gText_QuestLog_StoredItemInPC[] = _("Removed the item {STR_VAR_1} from\nthe BAG's ITEMS POCKET and stored it\non the PC.");
+const u8 gText_QuestLog_WithdrewItemFromPC[] = _("{PLAYER} withdrew the item {STR_VAR_1}\nfrom the PC.");
+const u8 gText_QuestLog_TradedMon1ForPersonsMon2[] = _("Traded {STR_VAR_3} in exchange for\n{STR_VAR_1}'s {STR_VAR_2}.");
+const u8 gText_QuestLog_SingleBattleWithPersonResultedInOutcome[] = _("Took on {DYNAMIC 0x00} in a SINGLE BATTLE.\nIt was a hotly contested match that\nresulted in a {DYNAMIC 0x01}.");
+const u8 gText_QuestLog_DoubleBattleWithPersonResultedInOutcome[] = _("Took on {DYNAMIC 0x00} in a DOUBLE BATTLE.\nIt was an extended match that resulted\nin a {DYNAMIC 0x01}.");
+const u8 gText_QuestLog_MultiBattleWithPeopleResultedInOutcome[] = _("{DYNAMIC 0x00} and {DYNAMIC 0x01} took on\n{DYNAMIC 0x02} and {DYNAMIC 0x03} in a\nMULTI BATTLE and got a {DYNAMIC 0x04}.");
+const u8 gText_QuestLog_Win[] = _("win");
+const u8 gText_QuestLog_Loss[] = _("loss");
+const u8 gText_QuestLog_MingledInUnionRoom[] = _("Mingled with other TRAINERS in\nthe UNION ROOM.");
+const u8 gText_QuestLog_DepartedPlaceInTownForNextDestination[] = _("Departed {STR_VAR_2}\nin {STR_VAR_1} for the next\ndestination.");
+const u8 gText_QuestLog_SwitchedMonsBetweenBoxes[] = _("After consideration, switched\n{DYNAMIC 0x01} in {DYNAMIC 0x00} with\n{DYNAMIC 0x03} in {DYNAMIC 0x02}.");
+const u8 gText_QuestLog_MovedMonToNewBox[] = _("After deep thought, switched\n{DYNAMIC 0x01} in BOX “{DYNAMIC 0x00}” to\nthe BOX “{DYNAMIC 0x02}.”");
+const u8 gText_QuestLog_SwitchedMonsWithinBox[] = _("Switched around {DYNAMIC 0x01} and\n{DYNAMIC 0x02} in {DYNAMIC 0x00}.");
+const u8 gText_QuestLog_MovedMonWithinBox[] = _("Moved {DYNAMIC 0x01} in {DYNAMIC 0x00}.");
+const u8 gText_QuestLog_SwitchedPartyMonForPCMon[] = _("Switched {DYNAMIC 0x01} in {DYNAMIC 0x00}\nwith {DYNAMIC 0x02} in the party.");
+const u8 gText_QuestLog_WithdrewMonFromPC[] = _("Added {DYNAMIC 0x01} in {DYNAMIC 0x00}\nto the party.");
+const u8 gText_QuestLog_DepositedMonInPC[] = _("Moved {DYNAMIC 0x00} from the party\nto {DYNAMIC 0x01}.");
+const u8 gText_QuestLog_SwitchedMultipleMons[] = _("Moved a group of POKéMON in\n{DYNAMIC 0x00} to {DYNAMIC 0x01}.");
+const u8 gText_QuestLog_ADifferentSpot[] = _("a different spot");
+const u8 gText_QuestLog_GaveMonHeldItemFromPC[] = _("Removed the item {STR_VAR_1} from\n{PLAYER}'s PC and gave it to {STR_VAR_2}\nto hold.");
+const u8 gText_QuestLog_SwappedHeldItemFromPC[] = _("Removed the item {STR_VAR_1} from\na PC, gave it to {STR_VAR_2}, and put\nthe {STR_VAR_3} it held in the BAG.");
+const u8 gText_QuestLog_ChattedWithManyTrainers[] = _("Chatted with many TRAINERS.");
+const u8 gText_QuestLog_Handily[] = _("handily");
+const u8 gText_QuestLog_Tenaciously[] = _("tenaciously");
+const u8 gText_QuestLog_Somehow[] = _("somehow");
+const u8 gText_QuestLog_TradedMon1ForTrainersMon2[] = _("Met and traded with {STR_VAR_1}.\nObtained the TRAINER's {STR_VAR_2} in\nexchange for {STR_VAR_3}.");
+const u8 gText_QuestLog_BattledTrainerEndedInOutcome[] = _("Met and battled {STR_VAR_1}.\nThe match ended in a {STR_VAR_2}.");
+const u8 gText_QuestLog_BoughtItem[] = _("Went to the POKéMON MART in\n{DYNAMIC 0x00} and bought one \n{DYNAMIC 0x01}.");
+const u8 gText_QuestLog_BoughtItemsIncludingItem[] = _("Went to the POKéMON MART in\n{DYNAMIC 0x00} and spent ¥{DYNAMIC 0x02} for\nitems including {DYNAMIC 0x01}(s).");
+const u8 gText_QuestLog_SoldNumOfItem[] = _("{DYNAMIC 0x00} went to the POKéMON MART in\n{DYNAMIC 0x01} and sold {DYNAMIC 0x03} of\nthe item {DYNAMIC 0x02}.");
+const u8 gText_QuestLog_SoldItemsIncludingItem[] = _("Sold items including {DYNAMIC 0x01} at\nthe POKéMON MART in {DYNAMIC 0x00},\nworth ¥{DYNAMIC 0x02}.");
+const u8 gText_QuestLog_JustOne[] = _("just one");
+const u8 gText_QuestLog_Num[] = _("{DYNAMIC 0x04}");
+const u8 gText_QuestLog_UsedSoftboiled[] = _("{STR_VAR_1} shared its HP using the move\nSOFTBOILED.");
+const u8 gText_QuestLog_UsedMilkDrink[] = _("{STR_VAR_1} shared its HP using the move\nMILK DRINK.");
+const u8 gText_QuestLog_MonLearnedMoveFromHM[] = _("{STR_VAR_1} securely learned the move\n{STR_VAR_2} using an HM.");
+const u8 gText_QuestLog_MonReplacedMoveWithHM[] = _("{STR_VAR_1} securely learned the move\n{STR_VAR_2} using an HM and forgot\nthe move {STR_VAR_3}.");
+const u8 gText_QuestLog_DefeatedWildMon[] = _("{DYNAMIC 0x05} managed to defeat the POKéMON\n{DYNAMIC 0x01} in {DYNAMIC 0x00}.");
+const u8 gText_QuestLog_DefeatedWildMons[] = _("Defeated {DYNAMIC 0x02} wild POKéMON including\n{DYNAMIC 0x01} in {DYNAMIC 0x00}.");
+const u8 gText_QuestLog_CaughtWildMon[] = _("{DYNAMIC 0x05} managed to catch the POKéMON\n{DYNAMIC 0x03} in {DYNAMIC 0x00}.");
+const u8 gText_QuestLog_CaughtWildMons[] = _("Threw POKé BALLS in a frenzy, catching\n{DYNAMIC 0x04} POKéMON including {DYNAMIC 0x03} here\nin {DYNAMIC 0x00}.");
+const u8 gText_QuestLog_DefeatedWildMonAndCaughtWildMon[] = _("{DYNAMIC 0x05} defeated the POKéMON\n{DYNAMIC 0x01} and caught one {DYNAMIC 0x03}\nin {DYNAMIC 0x00}.");
+const u8 gText_QuestLog_DefeatedWildMonAndCaughtWildMons[] = _("Defeated the POKéMON {DYNAMIC 0x01}\nand caught {DYNAMIC 0x04} POKéMON including\n{DYNAMIC 0x03} in {DYNAMIC 0x00}.");
+const u8 gText_QuestLog_DefeatedWildMonsAndCaughtWildMon[] = _("{DYNAMIC 0x05} defeated {DYNAMIC 0x02} POKéMON including\n{DYNAMIC 0x01} and caught one {DYNAMIC 0x03}\nin {DYNAMIC 0x00}.");
+const u8 gText_QuestLog_DefeatedWildMonsAndCaughtWildMons[] = _("Defeated {DYNAMIC 0x02} POKéMON including\n{DYNAMIC 0x01} and caught {DYNAMIC 0x04} POKéMON\nincluding {DYNAMIC 0x03} in {DYNAMIC 0x00}.");
+const u8 gText_QuestLog_GaveMonHeldItem[] = _("Made {STR_VAR_1} hold the item\n{STR_VAR_2}.");
+const u8 gText_QuestLog_GaveMonHeldItem2[] = _("{PLAYER} made {STR_VAR_1} hold the item\n{STR_VAR_2}.");
+const u8 gText_QuestLog_UsedCut[] = _("{STR_VAR_1} used the Hidden Move\nCUT here.");
+const u8 gText_QuestLog_UsedFly[] = _("{STR_VAR_1} used the Hidden Move\nFLY and flew to {STR_VAR_2}.");
+const u8 gText_QuestLog_UsedSurf[] = _("{STR_VAR_1} used the Hidden Move\nSURF and rode the waves.");
+const u8 gText_QuestLog_UsedStrength[] = _("{STR_VAR_1} used the Hidden Move\nSTRENGTH here.");
+const u8 gText_QuestLog_UsedFlash[] = _("{STR_VAR_1} used the Hidden Move\nFLASH and illuminated a pitch-black\ncave.");
+const u8 gText_QuestLog_UsedRockSmash[] = _("{STR_VAR_1} used the Hidden Move\nROCK SMASH here.");
+const u8 gText_QuestLog_UsedWaterfall[] = _("{STR_VAR_1} used the Hidden Move\nWATERFALL to scale a raging torrent."); // Unused
+const u8 gText_QuestLog_UsedDive[] = _("{STR_VAR_1}は ふかい ところを めざし\nひでんわざ\nダイビングを つかった!");
+const u8 gText_QuestLog_UsedDigInLocation[] = _("{STR_VAR_1} used DIG to escape from\n{STR_VAR_2}.");
+const u8 gText_QuestLog_UsedSweetScent[] = _("{STR_VAR_1} used SWEET SCENT to attract\nwild POKéMON.");
+const u8 gText_QuestLog_UsedTeleportToLocation[] = _("{STR_VAR_1} used TELEPORT, transporting\nthe party to {STR_VAR_2}'s\n{STR_VAR_3}.");
+const u8 gText_QuestLog_LeftTownsLocationForNextDestination[] = _("{PLAYER} left {STR_VAR_1}'s\n{STR_VAR_2} for the next\ndestination.");
+const u8 gText_QuestLog_PlayedGamesAtGameCorner[] = _("Played a lot of games at the ROCKET\nGAME CORNER in {STR_VAR_1}.");
+const u8 gText_QuestLog_RestedAtHome[] = _("{PLAYER} rested comfortably at home.");
+const u8 gText_QuestLog_LeftOaksLab[] = _("{PLAYER} left PROF. OAK's POKéMON\nRESEARCH LAB.");
+const u8 gText_QuestLog_GymWasFullOfToughTrainers[] = _("The GYM in {STR_VAR_1} was full of\ntough TRAINERS…\nPreparations had to be made.");
+const u8 gText_QuestLog_DepartedGym[] = _("Departed the GYM in {STR_VAR_1}.");
+const u8 gText_QuestLog_HadGreatTimeInSafariZone[] = _("{PLAYER} had a great time with POKéMON\nin the SAFARI ZONE.");
+const u8 gText_QuestLog_ManagedToGetOutOfLocation[] = _("Managed to get out of {STR_VAR_2}\nafter wandering about.");
+const u8 gText_QuestLog_TookOnGymLeadersMonWithMonAndWon[] = _("Took on {DYNAMIC 0x00} GYM LEADER\n{DYNAMIC 0x01}'s {DYNAMIC 0x02} with {DYNAMIC 0x03}\nand won {DYNAMIC 0x04}!");
+const u8 gText_QuestLog_TookOnEliteFoursMonWithMonAndWon[] = _("Took on ELITE FOUR {DYNAMIC 0x00}'s\n{DYNAMIC 0x01} with {DYNAMIC 0x02} and\nwon {DYNAMIC 0x03}!");
+const u8 gText_QuestLog_TookOnTrainersMonWithMonAndWon[] = _("In {DYNAMIC 0x00}, took on\n{DYNAMIC 0x01}'s {DYNAMIC 0x02} with {DYNAMIC 0x03}\nand won {DYNAMIC 0x04}!");
+const u8 gText_QuestLog_Coolly[] = _("coolly");
+const u8 gText_QuestLog_Barely[] = _("barely");
+const u8 gText_QuestLog_UsedEscapeRope[] = _("{PLAYER} used an ESCAPE ROPE to get\nout from {STR_VAR_2}.");
+const u8 gText_QuestLog_Draw[] = _("draw");
+const u8 gText_QuestLog_DepartedTheLocationForNextDestination[] = _("Departed from the {STR_VAR_2}\nfor the next destination.");
+const u8 gText_QuestLog_DepartedFromLocationToNextDestination[] = _("{PLAYER} departed from\n{STR_VAR_2} and made way\nto the next destination.");
+const u8 gText_QuestLog_ObtainedItemInLocation[] = _("Here in {STR_VAR_1}, {PLAYER}\nobtained the item {STR_VAR_2}.");
+const u8 gText_QuestLog_ArrivedInLocation[] = _("Arrived in {STR_VAR_1}.");
+const u8 gText_QuestLog_SavedGameAtLocation[] = _("And {PLAYER} saved the game at this\nlocation: {STR_VAR_1}.");
+const u8 gText_QuestLog_Home[] = _("HOME");
+const u8 gText_QuestLog_OakResearchLab[] = _("OAK RESEARCH LAB");
+const u8 gText_QuestLog_Gym[] = _("GYM");
+const u8 gText_QuestLog_PokemonLeagueGate[] = _("POKéMON LEAGUE GATE");
+const u8 gText_QuestLog_ViridianForest[] = _("VIRIDIAN FOREST");
+const u8 gText_QuestLog_PewterMuseumOfScience[] = _("PEWTER MUSEUM OF SCIENCE");
+const u8 gText_QuestLog_MtMoon[] = _("MT. MOON");
+const u8 gText_QuestLog_BikeShop[] = _("BIKE SHOP");
+const u8 gText_QuestLog_BillsHouse[] = _("BILL'S HOUSE");
+const u8 gText_QuestLog_DayCare[] = _("DAY CARE");
+const u8 gText_QuestLog_UndergroundPath[] = _("UNDERGROUND PATH");
+const u8 gText_QuestLog_PokemonFanClub[] = _("POKéMON FAN CLUB");
+const u8 gText_QuestLog_SSAnne[] = _("S.S. ANNE");
+const u8 gText_QuestLog_DiglettsCave[] = _("DIGLETT'S CAVE");
+const u8 gText_QuestLog_RockTunnel[] = _("ROCK TUNNEL");
+const u8 gText_QuestLog_PowerPlant[] = _("POWER PLANT");
+const u8 gText_QuestLog_PokemonTower[] = _("POKéMON TOWER");
+const u8 gText_QuestLog_VolunteerHouse[] = _("VOLUNTEER HOUSE");
+const u8 gText_QuestLog_NameRatersHouse[] = _("NAME RATER'S HOUSE");
+const u8 gText_QuestLog_CeladonDeptStore[] = _("CELADON DEPT. STORE");
+const u8 gText_QuestLog_CeladonMansion[] = _("CELADON MANSION");
+const u8 gText_QuestLog_RocketGameCorner[] = _("ROCKET GAME CORNER");
+const u8 gText_QuestLog_Restaurant[] = _("RESTAURANT");
+const u8 gText_QuestLog_RocketHideout[] = _("ROCKET HIDEOUT");
+const u8 gText_QuestLog_SafariZone[] = _("SAFARI ZONE");
+const u8 gText_QuestLog_WardensHome[] = _("WARDEN'S HOME");
+const u8 gText_QuestLog_FightingDojo[] = _("FIGHTING DOJO");
+const u8 gText_QuestLog_SilphCo[] = _("SILPH CO.");
+const u8 gText_QuestLog_SeafoamIslands[] = _("SEAFOAM ISLANDS");
+const u8 gText_QuestLog_PokemonMansion[] = _("POKéMON MANSION");
+const u8 gText_QuestLog_PokemonResearchLab[] = _("POKéMON RESEARCH LAB");
+const u8 gText_QuestLog_VictoryRoad[] = _("VICTORY ROAD");
+const u8 gText_QuestLog_PokemonLeague[] = _("POKéMON LEAGUE");
+const u8 gText_QuestLog_CeruleanCave[] = _("CERULEAN CAVE");
diff --git a/src/data/text/teachy_tv.h b/src/data/text/teachy_tv.h
new file mode 100644
index 000000000..3cfa41ff7
--- /dev/null
+++ b/src/data/text/teachy_tv.h
@@ -0,0 +1,198 @@
+const u8 gTeachyTvString_TeachBattle[] = _("Teach me how to battle.");
+const u8 gTeachyTvString_StatusProblems[] = _("What are status problems?");
+const u8 gTeachyTvString_TypeMatchups[] = _("What are type matchups?");
+const u8 gTeachyTvString_CatchPkmn[] = _("I want to catch POKéMON.");
+const u8 gTeachyTvString_AboutTMs[] = _("Teach me about TMs.");
+const u8 gTeachyTvString_RegisterItem[] = _("How do I register an item?");
+const u8 gTeachyTvString_Cancel[] = _("CANCEL");
+const u8 gTeachyTvText_PokedudeSaysHello[] = _(
+ "Hey, all you TRAINERS out there!\n"
+ "HELLO, TRAINERS!\p"
+ "……… ……… ………\p"
+ "Come on, let me hear you!\n"
+ "HELLO, TRAINERS!\l"
+ "It's me, the POKé DUDE!\p");
+const u8 gTeachyTvText_BattleScript1[] = _(
+ "Today, the POKé DUDE's here to\n"
+ "tell you about how you can battle\l"
+ "POKéMON!\p"
+ "Say you're out for a stroll when,\n"
+ "suddenly, a wild POKéMON appears!\p"
+ "It's up to you to smartly use your\n"
+ "POKéMON and their moves to reduce\l"
+ "the opponent's HP to nothing, and\l"
+ "claim victory!\p"
+ "I'll show you how to do that in\n"
+ "person and for sure!\p"
+ "All righty, here goes!\p"
+ "Keep your eyes glued to the super\n"
+ "POKé DUDE SHOW!");
+const u8 gTeachyTvText_BattleScript2[] = _(
+ "Well, did you get that?\p"
+ "Even if your own POKéMON's HP\n"
+ "falls to zero, and it becomes\l"
+ "unable to battle, not to worry!\p"
+ "Just take it to any POKéMON\n"
+ "CENTER and heal it!\p"
+ "All righty, be seeing you!\p"
+ "Remember, TRAINERS, a good deed\n"
+ "a day brings happiness to stay!");
+const u8 gTeachyTvText_StatusScript1[] = _(
+ "Today, the POKé DUDE's here to\n"
+ "tell you about status problems!\p"
+ "Status problems include poisoning,\n"
+ "paralysis, sleep, burn…\p"
+ "There are a couple others, but\n"
+ "they really are trouble.\p"
+ "Get any one, and your POKéMON\n"
+ "may become useless in battle.\p"
+ "You know, it hurts the POKé DUDE\n"
+ "to see a POKéMON suffer…\p"
+ "So, what should you do if your\n"
+ "POKéMON gets a status problem?\p"
+ "Well, you've got me to show you!\p"
+ "All righty, here goes!\p"
+ "Keep your eyes glued to the super\n"
+ "POKé DUDE SHOW!");
+const u8 gTeachyTvText_StatusScript2[] = _(
+ "Poisoning or paralysis don't go\n"
+ "away after a battle.\p"
+ "If a POKéMON is poisoned, it loses\n"
+ "HP even while you're walking.\p"
+ "You should heal POKéMON of these\n"
+ "kinds of problems right away.\p"
+ "Use an item, or try to get to a\n"
+ "POKéMON CENTER for healing.\p"
+ "That wasn't hard, was it?\n"
+ "All righty, be seeing you!\p"
+ "Remember, TRAINERS, a good deed\n"
+ "a day brings happiness to stay!");
+const u8 gTeachyTvText_MatchupsScript1[] = _(
+ "Does everyone know about type\n"
+ "matchups?\p"
+ "POKéMON and their moves all\n"
+ "belong to certain types.\p"
+ "For example, there are such types\n"
+ "as GRASS and WATER.\p"
+ "You need to consider the type of\n"
+ "the move used to attack…\p"
+ "And, the type of the POKéMON that\n"
+ "is hit by that attack.\p"
+ "Depending on how those two types\n"
+ "match up, the damage can change.\p"
+ "You see, it depends on whether\n"
+ "the type matchup is good or bad.\p"
+ "If you don't know how matchups\n"
+ "work, battles will be tough.\p"
+ "So, let me demonstrate exactly\n"
+ "what I mean.\p"
+ "All righty, here goes!\p"
+ "Keep your eyes glued to the super\n"
+ "POKé DUDE SHOW!");
+const u8 gTeachyTvText_MatchupsScript2[] = _(
+ "Is it possible to launch an attack\n"
+ "that will inflict heavy damage?\p"
+ "Does the opposing POKéMON pose\n"
+ "a threat to your POKéMON?\p"
+ "Is there any chance that it may\n"
+ "have disastrously tough moves?\p"
+ "Watch the type matchups to gain\n"
+ "the upper hand!\p"
+ "All righty, be seeing you!\p"
+ "Oh, for the COOL-type POKé DUDE,\n"
+ "AWESOME-type kids like you match\l"
+ "up perfectly!\p"
+ "Remember, a good deed a day\n"
+ "brings happiness to stay!");
+const u8 gTeachyTvText_CatchingScript1[] = _(
+ "Today, the POKé DUDE's going to\n"
+ "show you how to catch POKéMON!\p"
+ "Just imagine… A groovy POKéMON\n"
+ "suddenly appearing in the wild!\p"
+ "Oh, you want it!\n"
+ "You just can't help it!\p"
+ "Oh, you have to catch it!\n"
+ "You gotta have it!\p"
+ "Let me show you how you can make\n"
+ "it happen!\p"
+ "All righty, here goes!\p"
+ "Keep your eyes glued to the super\n"
+ "POKé DUDE SHOW!");
+const u8 gTeachyTvText_CatchingScript2[] = _(
+ "If your first POKé BALL fails to\n"
+ "catch the POKéMON, don't give up!\p"
+ "Keep throwing POKé BALLS…\n"
+ "It's bound to work sometime!\p"
+ "All righty, be seeing you!\p"
+ "Remember, TRAINERS, a good deed\n"
+ "a day brings happiness to stay!");
+const u8 gTeachyTvText_TMsScript1[] = _(
+ "Hey, everyone!\n"
+ "Do you all have TMs?\p"
+ "A TM, Technical Machine, is an\n"
+ "amazingly great item!\p"
+ "It teaches POKéMON a move that\n"
+ "it may not learn when leveling up!\p"
+ "Isn't that just great? What a\n"
+ "convenient world we live in!\p"
+ "Open the TM CASE and check out\n"
+ "the TMs you have.\p"
+ "You can check them out in detail,\n"
+ "too.");
+const u8 gPokedudeText_TMTypes[] = _(
+ "POKé DUDE: NORMAL, WATER, GRASS…\n"
+ "TMs also come in types.\p"
+ "Check the type and teach it to\n"
+ "a POKéMON that matches up well.\p"
+ "For example, WATER PULSE is\n"
+ "suitable for WATER-type POKéMON.\p"
+ "BULLET SEED is a move that most\n"
+ "GRASS-type POKéMON can learn.\p"
+ "There's one other thing!");
+const u8 gPokedudeText_ReadTMDescription[] = _(
+ "Don't just look at the type, read\n"
+ "the description, too.\p"
+ "It will contain hints about what\n"
+ "POKéMON might learn the move.\p"
+ "For example, take a move like\n"
+ "FOCUS PUNCH.\p"
+ "It doesn't sound like anything a\n"
+ "bird or fish POKéMON can learn.\p"
+ "So, try using it on POKéMON with\n"
+ "arms that can throw punches!");
+const u8 gTeachyTvText_TMsScript2[] = _(
+ "Wow, I talked a lot today!\n"
+ "All righty, be seeing you!\p"
+ "Remember, TRAINERS, a good deed\n"
+ "a day brings happiness to stay!");
+const u8 gTeachyTvText_RegisterScript1[] = _(
+ "A TRAINER's BAG has a bunch of\n"
+ "nifty, convenient features!\p"
+ "Take stuff in the KEY ITEMS\n"
+ "POCKET, for instance.\p"
+ "You can use a key item without\n"
+ "opening the BAG every time.\p"
+ "For example, let's pretend I have\n"
+ "a TEACHY TV in my BAG.\p"
+ "I can register it for instant use,\n"
+ "and I'll show you how!\p"
+ "All righty, here goes!\p"
+ "Keep your eyes glued to the sorta\n"
+ "super POKé DUDE SHOW!");
+const u8 gTeachyTvText_RegisterScript2[] = _(
+ "And now, your TEACHY TV is\n"
+ "registered.\p"
+ "How do you use it?\n"
+ "Well, here's how it works.\p"
+ "Once an item in the KEY ITEMS\n"
+ "POKCET is registered, you can use\l"
+ "it by pressing SELECT.\p"
+ "So, you've given yourself\n"
+ "one-touch access to TEACHY TV.\p"
+ "All it takes for you to see me is\n"
+ "pressing one button!\p"
+ "That kind of attention is a little\n"
+ "embarrassing!\p"
+ "All righty, be seeing you!\p"
+ "Remember, TRAINERS, a good deed\n"
+ "a day brings happiness to stay!");
diff --git a/src/data/trainers.h b/src/data/trainers.h
index 4cb0b8443..0c3a3f1ee 100644
--- a/src/data/trainers.h
+++ b/src/data/trainers.h
@@ -22,7 +22,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A1A0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A1A0}
},
[TRAINER_TEAM_AQUA_1] = {
@@ -34,7 +34,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A1A8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A1A8}
},
[TRAINER_TEAM_AQUA_2] = {
@@ -46,7 +46,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A1B0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A1B0}
},
[TRAINER_AROMA_LADY_1] = {
@@ -58,7 +58,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A1B8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A1B8}
},
[TRAINER_RUIN_MANIAC_1] = {
@@ -70,7 +70,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A1C0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A1C0}
},
[TRAINER_INTERVIEWER_1] = {
@@ -82,7 +82,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A1C8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A1C8}
},
[TRAINER_TUBER_1] = {
@@ -94,7 +94,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A1D0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A1D0}
},
[TRAINER_TUBER_2] = {
@@ -106,7 +106,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A1D8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A1D8}
},
[TRAINER_COOLTRAINER_1] = {
@@ -118,7 +118,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A1E0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A1E0}
},
[TRAINER_COOLTRAINER_2] = {
@@ -130,7 +130,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A1E8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A1E8}
},
[TRAINER_HEX_MANIAC_1] = {
@@ -142,7 +142,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A1F0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A1F0}
},
[TRAINER_LADY_1] = {
@@ -154,7 +154,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A1F8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A1F8}
},
[TRAINER_BEAUTY_1] = {
@@ -166,7 +166,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A200),
.party = {.NoItemDefaultMoves = sTrainerMons_823A200}
},
[TRAINER_RICH_BOY_1] = {
@@ -178,7 +178,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A208),
.party = {.NoItemDefaultMoves = sTrainerMons_823A208}
},
[TRAINER_POKEMANIAC_1] = {
@@ -190,7 +190,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A210),
.party = {.NoItemDefaultMoves = sTrainerMons_823A210}
},
[TRAINER_SWIMMER_MALE_1] = {
@@ -202,7 +202,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A218),
.party = {.NoItemDefaultMoves = sTrainerMons_823A218}
},
[TRAINER_BLACK_BELT_1] = {
@@ -214,7 +214,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A220),
.party = {.NoItemDefaultMoves = sTrainerMons_823A220}
},
[TRAINER_GUITARIST_1] = {
@@ -226,7 +226,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A228),
.party = {.NoItemDefaultMoves = sTrainerMons_823A228}
},
[TRAINER_KINDLER_1] = {
@@ -238,7 +238,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A230),
.party = {.NoItemDefaultMoves = sTrainerMons_823A230}
},
[TRAINER_CAMPER_1] = {
@@ -250,7 +250,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A238),
.party = {.NoItemDefaultMoves = sTrainerMons_823A238}
},
[TRAINER_BUG_MANIAC_1] = {
@@ -262,7 +262,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A240),
.party = {.NoItemDefaultMoves = sTrainerMons_823A240}
},
[TRAINER_PSYCHIC_1] = {
@@ -274,7 +274,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A248),
.party = {.NoItemDefaultMoves = sTrainerMons_823A248}
},
[TRAINER_PSYCHIC_2] = {
@@ -286,7 +286,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A250),
.party = {.NoItemDefaultMoves = sTrainerMons_823A250}
},
[TRAINER_GENTLEMAN_1] = {
@@ -298,7 +298,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A258),
.party = {.NoItemDefaultMoves = sTrainerMons_823A258}
},
[TRAINER_ELITE_FOUR_SIDNEY] = {
@@ -310,7 +310,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A260),
.party = {.NoItemDefaultMoves = sTrainerMons_823A260}
},
[TRAINER_ELITE_FOUR_PHOEBE] = {
@@ -322,7 +322,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A268),
.party = {.NoItemDefaultMoves = sTrainerMons_823A268}
},
[TRAINER_LEADER_ROXANNE] = {
@@ -334,7 +334,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A270),
.party = {.NoItemDefaultMoves = sTrainerMons_823A270}
},
[TRAINER_LEADER_BRAWLY] = {
@@ -346,7 +346,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A278),
.party = {.NoItemDefaultMoves = sTrainerMons_823A278}
},
[TRAINER_LEADER_TATE_LIZA] = {
@@ -358,7 +358,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A280),
.party = {.NoItemDefaultMoves = sTrainerMons_823A280}
},
[TRAINER_SCHOOL_KID_1] = {
@@ -370,7 +370,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A288),
.party = {.NoItemDefaultMoves = sTrainerMons_823A288}
},
[TRAINER_SCHOOL_KID_2] = {
@@ -382,7 +382,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A290),
.party = {.NoItemDefaultMoves = sTrainerMons_823A290}
},
[TRAINER_SR_AND_JR_1] = {
@@ -394,7 +394,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A298),
.party = {.NoItemDefaultMoves = sTrainerMons_823A298}
},
[TRAINER_POKEFAN_1] = {
@@ -406,7 +406,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A2A0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A2A0}
},
[TRAINER_POKEFAN_2] = {
@@ -418,7 +418,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A2A8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A2A8}
},
[TRAINER_EXPERT_1] = {
@@ -430,7 +430,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A2B0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A2B0}
},
[TRAINER_EXPERT_2] = {
@@ -442,7 +442,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A2B8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A2B8}
},
[TRAINER_YOUNGSTER_1] = {
@@ -454,7 +454,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A2C0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A2C0}
},
[TRAINER_CHAMPION_1] = {
@@ -466,7 +466,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A2C8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A2C8}
},
[TRAINER_FISHERMAN_1] = {
@@ -478,7 +478,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A2D0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A2D0}
},
[TRAINER_TRIATHLETE_1] = {
@@ -490,7 +490,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A2D8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A2D8}
},
[TRAINER_TRIATHLETE_2] = {
@@ -502,7 +502,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A2E0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A2E0}
},
[TRAINER_TRIATHLETE_3] = {
@@ -514,7 +514,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A2E8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A2E8}
},
[TRAINER_TRIATHLETE_4] = {
@@ -526,7 +526,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A2F0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A2F0}
},
[TRAINER_TRIATHLETE_5] = {
@@ -538,7 +538,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A2F8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A2F8}
},
[TRAINER_TRIATHLETE_6] = {
@@ -550,7 +550,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A300),
.party = {.NoItemDefaultMoves = sTrainerMons_823A300}
},
[TRAINER_DRAGON_TAMER_1] = {
@@ -562,7 +562,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A308),
.party = {.NoItemDefaultMoves = sTrainerMons_823A308}
},
[TRAINER_BIRD_KEEPER_1] = {
@@ -574,7 +574,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A310),
.party = {.NoItemDefaultMoves = sTrainerMons_823A310}
},
[TRAINER_NINJA_BOY_1] = {
@@ -586,7 +586,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A318),
.party = {.NoItemDefaultMoves = sTrainerMons_823A318}
},
[TRAINER_BATTLE_GIRL_1] = {
@@ -598,7 +598,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A320),
.party = {.NoItemDefaultMoves = sTrainerMons_823A320}
},
[TRAINER_PARASOL_LADY_1] = {
@@ -610,7 +610,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A328),
.party = {.NoItemDefaultMoves = sTrainerMons_823A328}
},
[TRAINER_SWIMMER_FEMALE_1] = {
@@ -622,7 +622,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A330),
.party = {.NoItemDefaultMoves = sTrainerMons_823A330}
},
[TRAINER_PICNICKER_1] = {
@@ -634,7 +634,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A338),
.party = {.NoItemDefaultMoves = sTrainerMons_823A338}
},
[TRAINER_TWINS_1] = {
@@ -646,7 +646,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A340),
.party = {.NoItemDefaultMoves = sTrainerMons_823A340}
},
[TRAINER_SAILOR_1] = {
@@ -658,7 +658,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A348),
.party = {.NoItemDefaultMoves = sTrainerMons_823A348}
},
[TRAINER_BOARDER_1] = {
@@ -670,7 +670,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A350),
.party = {.NoItemDefaultMoves = sTrainerMons_823A350}
},
[TRAINER_BOARDER_2] = {
@@ -682,7 +682,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A358),
.party = {.NoItemDefaultMoves = sTrainerMons_823A358}
},
[TRAINER_COLLECTOR_1] = {
@@ -694,7 +694,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A360),
.party = {.NoItemDefaultMoves = sTrainerMons_823A360}
},
[TRAINER_PKMN_TRAINER_2] = {
@@ -706,7 +706,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A368),
.party = {.NoItemDefaultMoves = sTrainerMons_823A368}
},
[TRAINER_PKMN_TRAINER_3] = {
@@ -718,7 +718,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A370),
.party = {.NoItemDefaultMoves = sTrainerMons_823A370}
},
[TRAINER_PKMN_TRAINER_4] = {
@@ -730,7 +730,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A378),
.party = {.NoItemDefaultMoves = sTrainerMons_823A378}
},
[TRAINER_PKMN_TRAINER_5] = {
@@ -742,7 +742,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A380),
.party = {.NoItemDefaultMoves = sTrainerMons_823A380}
},
[TRAINER_PKMN_TRAINER_6] = {
@@ -754,7 +754,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A388),
.party = {.NoItemDefaultMoves = sTrainerMons_823A388}
},
[TRAINER_PKMN_TRAINER_7] = {
@@ -766,7 +766,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A390),
.party = {.NoItemDefaultMoves = sTrainerMons_823A390}
},
[TRAINER_PKMN_TRAINER_8] = {
@@ -778,7 +778,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A398),
.party = {.NoItemDefaultMoves = sTrainerMons_823A398}
},
[TRAINER_PKMN_BREEDER_1] = {
@@ -790,7 +790,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A3A0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A3A0}
},
[TRAINER_PKMN_BREEDER_2] = {
@@ -802,7 +802,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A3A8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A3A8}
},
[TRAINER_PKMN_RANGER_1] = {
@@ -814,7 +814,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A3B0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A3B0}
},
[TRAINER_PKMN_RANGER_2] = {
@@ -826,7 +826,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A3B8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A3B8}
},
[TRAINER_MAGMA_LEADER_1] = {
@@ -838,7 +838,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A3C0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A3C0}
},
[TRAINER_TEAM_MAGMA_1] = {
@@ -850,7 +850,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A3C8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A3C8}
},
[TRAINER_TEAM_MAGMA_2] = {
@@ -862,7 +862,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A3D0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A3D0}
},
[TRAINER_LASS_1] = {
@@ -874,7 +874,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A3D8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A3D8}
},
[TRAINER_BUG_CATCHER_1] = {
@@ -886,7 +886,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A3E0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A3E0}
},
[TRAINER_HIKER_1] = {
@@ -898,7 +898,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A3E8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A3E8}
},
[TRAINER_YOUNG_COUPLE_1] = {
@@ -910,7 +910,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A3F0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A3F0}
},
[TRAINER_OLD_COUPLE_1] = {
@@ -922,7 +922,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A400),
.party = {.NoItemDefaultMoves = sTrainerMons_823A400}
},
[TRAINER_SIS_AND_BRO_1] = {
@@ -934,7 +934,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A408),
.party = {.NoItemDefaultMoves = sTrainerMons_823A408}
},
[TRAINER_AQUA_ADMIN_MATT] = {
@@ -946,7 +946,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A410),
.party = {.NoItemDefaultMoves = sTrainerMons_823A410}
},
[TRAINER_AQUA_ADMIN_SHELLY] = {
@@ -958,7 +958,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A418),
.party = {.NoItemDefaultMoves = sTrainerMons_823A418}
},
[TRAINER_MAGMA_ADMIN_TABITHA] = {
@@ -970,7 +970,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A420),
.party = {.NoItemDefaultMoves = sTrainerMons_823A420}
},
[TRAINER_MAGMA_ADMIN_COURTNEY] = {
@@ -982,7 +982,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A428),
.party = {.NoItemDefaultMoves = sTrainerMons_823A428}
},
[TRAINER_LEADER_WATTSON] = {
@@ -994,7 +994,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A430),
.party = {.NoItemDefaultMoves = sTrainerMons_823A430}
},
[TRAINER_LEADER_FLANNERY] = {
@@ -1006,7 +1006,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A438),
.party = {.NoItemDefaultMoves = sTrainerMons_823A438}
},
[TRAINER_LEADER_NORMAN] = {
@@ -1018,7 +1018,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A440),
.party = {.NoItemDefaultMoves = sTrainerMons_823A440}
},
[TRAINER_LEADER_WINONA] = {
@@ -1030,7 +1030,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A448),
.party = {.NoItemDefaultMoves = sTrainerMons_823A448}
},
[TRAINER_LEADER_WALLACE] = {
@@ -1042,7 +1042,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A450),
.party = {.NoItemDefaultMoves = sTrainerMons_823A450}
},
[TRAINER_ELITE_FOUR_GLACIA] = {
@@ -1054,7 +1054,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A458),
.party = {.NoItemDefaultMoves = sTrainerMons_823A458}
},
[TRAINER_ELITE_FOUR_DRAKE] = {
@@ -1066,7 +1066,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A460),
.party = {.NoItemDefaultMoves = sTrainerMons_823A460}
},
[TRAINER_YOUNGSTER_BEN] = {
@@ -1078,7 +1078,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A468),
.party = {.NoItemDefaultMoves = sTrainerMons_823A468}
},
[TRAINER_YOUNGSTER_CALVIN] = {
@@ -1090,7 +1090,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A478),
.party = {.NoItemDefaultMoves = sTrainerMons_823A478}
},
[TRAINER_YOUNGSTER_JOSH] = {
@@ -1102,7 +1102,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A480),
.party = {.NoItemDefaultMoves = sTrainerMons_823A480}
},
[TRAINER_YOUNGSTER_TIMMY] = {
@@ -1114,7 +1114,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A498),
.party = {.NoItemDefaultMoves = sTrainerMons_823A498}
},
[TRAINER_YOUNGSTER_JOEY] = {
@@ -1126,7 +1126,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A4A8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A4A8}
},
[TRAINER_YOUNGSTER_DAN] = {
@@ -1138,7 +1138,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A4B8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A4B8}
},
[TRAINER_YOUNGSTER_CHAD] = {
@@ -1150,7 +1150,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A4C0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A4C0}
},
[TRAINER_YOUNGSTER_TYLER] = {
@@ -1162,7 +1162,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A4D0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A4D0}
},
[TRAINER_YOUNGSTER_EDDIE] = {
@@ -1174,7 +1174,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A4D8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A4D8}
},
[TRAINER_YOUNGSTER_DILLON] = {
@@ -1186,7 +1186,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A4E0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A4E0}
},
[TRAINER_YOUNGSTER_YASU] = {
@@ -1198,7 +1198,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A4F0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A4F0}
},
[TRAINER_YOUNGSTER_DAVE] = {
@@ -1210,7 +1210,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A508),
.party = {.NoItemDefaultMoves = sTrainerMons_823A508}
},
[TRAINER_YOUNGSTER_BEN_2] = {
@@ -1222,7 +1222,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A518),
.party = {.NoItemDefaultMoves = sTrainerMons_823A518}
},
[TRAINER_BUG_CATCHER_RICK] = {
@@ -1234,7 +1234,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A528),
.party = {.NoItemDefaultMoves = sTrainerMons_823A528}
},
[TRAINER_BUG_CATCHER_DOUG] = {
@@ -1246,7 +1246,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A538),
.party = {.NoItemDefaultMoves = sTrainerMons_823A538}
},
[TRAINER_BUG_CATCHER_SAMMY] = {
@@ -1258,7 +1258,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A550),
.party = {.NoItemDefaultMoves = sTrainerMons_823A550}
},
[TRAINER_BUG_CATCHER_COLTON] = {
@@ -1270,7 +1270,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A558),
.party = {.NoItemDefaultMoves = sTrainerMons_823A558}
},
[TRAINER_BUG_CATCHER_GREG] = {
@@ -1282,7 +1282,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823A570),
.party = {.NoItemDefaultMoves = sTrainerMons_823A570}
},
[TRAINER_BUG_CATCHER_JAMES] = {
@@ -1294,7 +1294,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A590),
.party = {.NoItemDefaultMoves = sTrainerMons_823A590}
},
[TRAINER_BUG_CATCHER_KENT] = {
@@ -1306,7 +1306,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A5A0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A5A0}
},
[TRAINER_BUG_CATCHER_ROBBY] = {
@@ -1318,7 +1318,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A5B0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A5B0}
},
[TRAINER_BUG_CATCHER_CALE] = {
@@ -1330,7 +1330,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823A5C8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A5C8}
},
[TRAINER_BUG_CATCHER_KEIGO] = {
@@ -1342,7 +1342,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A5E8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A5E8}
},
[TRAINER_BUG_CATCHER_ELIJAH] = {
@@ -1354,7 +1354,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A600),
.party = {.NoItemDefaultMoves = sTrainerMons_823A600}
},
[TRAINER_BUG_CATCHER_2] = {
@@ -1366,7 +1366,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A608),
.party = {.NoItemDefaultMoves = sTrainerMons_823A608}
},
[TRAINER_BUG_CATCHER_BRENT] = {
@@ -1378,7 +1378,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A620),
.party = {.NoItemDefaultMoves = sTrainerMons_823A620}
},
[TRAINER_BUG_CATCHER_CONNER] = {
@@ -1390,7 +1390,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A630),
.party = {.NoItemDefaultMoves = sTrainerMons_823A630}
},
[TRAINER_LASS_JANICE] = {
@@ -1402,7 +1402,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A648),
.party = {.NoItemDefaultMoves = sTrainerMons_823A648}
},
[TRAINER_LASS_SALLY] = {
@@ -1414,7 +1414,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A658),
.party = {.NoItemDefaultMoves = sTrainerMons_823A658}
},
[TRAINER_LASS_ROBIN] = {
@@ -1426,7 +1426,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A668),
.party = {.NoItemDefaultMoves = sTrainerMons_823A668}
},
[TRAINER_LASS_CRISSY] = {
@@ -1438,7 +1438,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A670),
.party = {.NoItemDefaultMoves = sTrainerMons_823A670}
},
[TRAINER_LASS_MIRIAM] = {
@@ -1450,7 +1450,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A688),
.party = {.NoItemDefaultMoves = sTrainerMons_823A688}
},
[TRAINER_LASS_IRIS] = {
@@ -1462,7 +1462,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A698),
.party = {.NoItemDefaultMoves = sTrainerMons_823A698}
},
[TRAINER_LASS_RELI] = {
@@ -1474,7 +1474,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A6A0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A6A0}
},
[TRAINER_LASS_ALI] = {
@@ -1486,7 +1486,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A6B0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A6B0}
},
[TRAINER_LASS_2] = {
@@ -1498,7 +1498,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A6C8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A6C8}
},
[TRAINER_LASS_HALEY] = {
@@ -1510,7 +1510,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A6D8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A6D8}
},
[TRAINER_LASS_ANN] = {
@@ -1522,7 +1522,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A6F0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A6F0}
},
[TRAINER_LASS_DAWN] = {
@@ -1534,7 +1534,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A700),
.party = {.NoItemDefaultMoves = sTrainerMons_823A700}
},
[TRAINER_LASS_PAIGE] = {
@@ -1546,7 +1546,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A710),
.party = {.NoItemDefaultMoves = sTrainerMons_823A710}
},
[TRAINER_LASS_ANDREA] = {
@@ -1558,7 +1558,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A720),
.party = {.NoItemDefaultMoves = sTrainerMons_823A720}
},
[TRAINER_LASS_MEGAN] = {
@@ -1570,7 +1570,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823A738),
.party = {.NoItemDefaultMoves = sTrainerMons_823A738}
},
[TRAINER_LASS_JULIA] = {
@@ -1582,7 +1582,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A760),
.party = {.NoItemDefaultMoves = sTrainerMons_823A760}
},
[TRAINER_LASS_KAY] = {
@@ -1594,7 +1594,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A770),
.party = {.NoItemDefaultMoves = sTrainerMons_823A770}
},
[TRAINER_LASS_LISA] = {
@@ -1606,7 +1606,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A780),
.party = {.NoItemDefaultMoves = sTrainerMons_823A780}
},
[TRAINER_SAILOR_EDMOND] = {
@@ -1618,7 +1618,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A790),
.party = {.NoItemDefaultMoves = sTrainerMons_823A790}
},
[TRAINER_SAILOR_TREVOR] = {
@@ -1630,7 +1630,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A7A0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A7A0}
},
[TRAINER_SAILOR_LEONARD] = {
@@ -1642,7 +1642,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A7B0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A7B0}
},
[TRAINER_SAILOR_DUNCAN] = {
@@ -1654,7 +1654,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A7B8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A7B8}
},
[TRAINER_SAILOR_HUEY] = {
@@ -1666,7 +1666,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A7D0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A7D0}
},
[TRAINER_SAILOR_DYLAN] = {
@@ -1678,7 +1678,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A7E0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A7E0}
},
[TRAINER_SAILOR_PHILLIP] = {
@@ -1690,7 +1690,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A7F8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A7F8}
},
[TRAINER_SAILOR_DWAYNE] = {
@@ -1702,7 +1702,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A800),
.party = {.NoItemDefaultMoves = sTrainerMons_823A800}
},
[TRAINER_CAMPER_LIAM] = {
@@ -1714,7 +1714,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A810),
.party = {.NoItemCustomMoves = sTrainerMons_823A810}
},
[TRAINER_CAMPER_SHANE] = {
@@ -1726,7 +1726,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A830),
.party = {.NoItemDefaultMoves = sTrainerMons_823A830}
},
[TRAINER_CAMPER_ETHAN] = {
@@ -1738,7 +1738,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A840),
.party = {.NoItemDefaultMoves = sTrainerMons_823A840}
},
[TRAINER_CAMPER_RICKY] = {
@@ -1750,7 +1750,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A848),
.party = {.NoItemDefaultMoves = sTrainerMons_823A848}
},
[TRAINER_CAMPER_JEFF] = {
@@ -1762,7 +1762,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A850),
.party = {.NoItemDefaultMoves = sTrainerMons_823A850}
},
[TRAINER_CAMPER_2] = {
@@ -1774,7 +1774,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A860),
.party = {.NoItemDefaultMoves = sTrainerMons_823A860}
},
[TRAINER_CAMPER_CHRIS] = {
@@ -1786,7 +1786,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A868),
.party = {.NoItemDefaultMoves = sTrainerMons_823A868}
},
[TRAINER_CAMPER_DREW] = {
@@ -1798,7 +1798,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823A878),
.party = {.NoItemDefaultMoves = sTrainerMons_823A878}
},
[TRAINER_PICNICKER_DIANA] = {
@@ -1810,7 +1810,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A898),
.party = {.NoItemDefaultMoves = sTrainerMons_823A898}
},
[TRAINER_PICNICKER_NANCY] = {
@@ -1822,7 +1822,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A8A0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A8A0}
},
[TRAINER_PICNICKER_ISABELLE] = {
@@ -1834,7 +1834,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A8B0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A8B0}
},
[TRAINER_PICNICKER_KELSEY] = {
@@ -1846,7 +1846,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A8C8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A8C8}
},
[TRAINER_PICNICKER_ALICIA] = {
@@ -1858,7 +1858,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823A8D8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A8D8}
},
[TRAINER_PICNICKER_CAITLIN] = {
@@ -1870,7 +1870,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A8F8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A8F8}
},
[TRAINER_PICNICKER_HEIDI] = {
@@ -1882,7 +1882,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A900),
.party = {.NoItemDefaultMoves = sTrainerMons_823A900}
},
[TRAINER_PICNICKER_CAROL] = {
@@ -1894,7 +1894,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A910),
.party = {.NoItemDefaultMoves = sTrainerMons_823A910}
},
[TRAINER_PICNICKER_SOFIA] = {
@@ -1906,7 +1906,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A920),
.party = {.NoItemDefaultMoves = sTrainerMons_823A920}
},
[TRAINER_PICNICKER_MARTHA] = {
@@ -1918,7 +1918,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A938),
.party = {.NoItemDefaultMoves = sTrainerMons_823A938}
},
[TRAINER_PICNICKER_TINA] = {
@@ -1930,7 +1930,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A948),
.party = {.NoItemDefaultMoves = sTrainerMons_823A948}
},
[TRAINER_PICNICKER_HANNAH] = {
@@ -1942,7 +1942,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823A958),
.party = {.NoItemDefaultMoves = sTrainerMons_823A958}
},
[TRAINER_POKEMANIAC_MARK] = {
@@ -1954,7 +1954,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A980),
.party = {.NoItemDefaultMoves = sTrainerMons_823A980}
},
[TRAINER_POKEMANIAC_HERMAN] = {
@@ -1966,7 +1966,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A990),
.party = {.NoItemDefaultMoves = sTrainerMons_823A990}
},
[TRAINER_POKEMANIAC_COOPER] = {
@@ -1978,7 +1978,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A9A0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A9A0}
},
[TRAINER_POKEMANIAC_STEVE] = {
@@ -1990,7 +1990,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A9B8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A9B8}
},
[TRAINER_POKEMANIAC_WINSTON] = {
@@ -2002,7 +2002,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823A9C8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A9C8}
},
[TRAINER_POKEMANIAC_DAWSON] = {
@@ -2014,7 +2014,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823A9D0),
.party = {.NoItemDefaultMoves = sTrainerMons_823A9D0}
},
[TRAINER_POKEMANIAC_ASHTON] = {
@@ -2026,7 +2026,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A9E8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A9E8}
},
[TRAINER_SUPER_NERD_JOVAN] = {
@@ -2038,7 +2038,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823A9F8),
.party = {.NoItemDefaultMoves = sTrainerMons_823A9F8}
},
[TRAINER_SUPER_NERD_MIGUEL] = {
@@ -2050,7 +2050,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823AA08),
.party = {.NoItemDefaultMoves = sTrainerMons_823AA08}
},
[TRAINER_SUPER_NERD_AIDAN] = {
@@ -2062,7 +2062,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823AA20),
.party = {.NoItemCustomMoves = sTrainerMons_823AA20}
},
[TRAINER_SUPER_NERD_GLENN] = {
@@ -2074,7 +2074,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823AA60),
.party = {.NoItemDefaultMoves = sTrainerMons_823AA60}
},
[TRAINER_SUPER_NERD_LESLIE] = {
@@ -2086,7 +2086,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823AA78),
.party = {.NoItemCustomMoves = sTrainerMons_823AA78}
},
[TRAINER_SUPER_NERD_1] = {
@@ -2098,7 +2098,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823AA88),
.party = {.NoItemDefaultMoves = sTrainerMons_823AA88}
},
[TRAINER_SUPER_NERD_2] = {
@@ -2110,7 +2110,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823AAA0),
.party = {.NoItemDefaultMoves = sTrainerMons_823AAA0}
},
[TRAINER_SUPER_NERD_3] = {
@@ -2122,7 +2122,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823AAC0),
.party = {.NoItemDefaultMoves = sTrainerMons_823AAC0}
},
[TRAINER_SUPER_NERD_ERIK] = {
@@ -2134,7 +2134,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823AAD0),
.party = {.NoItemDefaultMoves = sTrainerMons_823AAD0}
},
[TRAINER_SUPER_NERD_AVERY] = {
@@ -2146,7 +2146,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823AAE8),
.party = {.NoItemDefaultMoves = sTrainerMons_823AAE8}
},
[TRAINER_SUPER_NERD_DEREK] = {
@@ -2158,7 +2158,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823AB08),
.party = {.NoItemDefaultMoves = sTrainerMons_823AB08}
},
[TRAINER_SUPER_NERD_ZAC] = {
@@ -2170,7 +2170,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823AB10),
.party = {.NoItemDefaultMoves = sTrainerMons_823AB10}
},
[TRAINER_HIKER_MARCOS] = {
@@ -2182,7 +2182,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823AB20),
.party = {.NoItemDefaultMoves = sTrainerMons_823AB20}
},
[TRAINER_HIKER_FRANKLIN] = {
@@ -2194,7 +2194,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823AB38),
.party = {.NoItemDefaultMoves = sTrainerMons_823AB38}
},
[TRAINER_HIKER_NOB] = {
@@ -2206,7 +2206,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823AB48),
.party = {.NoItemDefaultMoves = sTrainerMons_823AB48}
},
[TRAINER_HIKER_WAYNE] = {
@@ -2218,7 +2218,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823AB68),
.party = {.NoItemDefaultMoves = sTrainerMons_823AB68}
},
[TRAINER_HIKER_ALAN] = {
@@ -2230,7 +2230,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823AB70),
.party = {.NoItemCustomMoves = sTrainerMons_823AB70}
},
[TRAINER_HIKER_BRICE] = {
@@ -2242,7 +2242,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823AB90),
.party = {.NoItemDefaultMoves = sTrainerMons_823AB90}
},
[TRAINER_HIKER_CLARK] = {
@@ -2254,7 +2254,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823ABA8),
.party = {.NoItemCustomMoves = sTrainerMons_823ABA8}
},
[TRAINER_HIKER_TRENT] = {
@@ -2266,7 +2266,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823ABC8),
.party = {.NoItemDefaultMoves = sTrainerMons_823ABC8}
},
[TRAINER_HIKER_DUDLEY] = {
@@ -2278,7 +2278,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823ABD8),
.party = {.NoItemCustomMoves = sTrainerMons_823ABD8}
},
[TRAINER_HIKER_ALLEN] = {
@@ -2290,7 +2290,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823AC08),
.party = {.NoItemCustomMoves = sTrainerMons_823AC08}
},
[TRAINER_HIKER_ERIC] = {
@@ -2302,7 +2302,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823AC18),
.party = {.NoItemDefaultMoves = sTrainerMons_823AC18}
},
[TRAINER_HIKER_LENNY] = {
@@ -2314,7 +2314,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823AC28),
.party = {.NoItemDefaultMoves = sTrainerMons_823AC28}
},
[TRAINER_HIKER_OLIVER] = {
@@ -2326,7 +2326,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823AC48),
.party = {.NoItemDefaultMoves = sTrainerMons_823AC48}
},
[TRAINER_HIKER_LUCAS] = {
@@ -2338,7 +2338,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823AC60),
.party = {.NoItemCustomMoves = sTrainerMons_823AC60}
},
[TRAINER_BIKER_JARED] = {
@@ -2350,7 +2350,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823AC80),
.party = {.NoItemCustomMoves = sTrainerMons_823AC80}
},
[TRAINER_BIKER_MALIK] = {
@@ -2362,7 +2362,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823ACB0),
.party = {.NoItemCustomMoves = sTrainerMons_823ACB0}
},
[TRAINER_BIKER_ERNEST] = {
@@ -2374,7 +2374,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823ACD0),
.party = {.NoItemCustomMoves = sTrainerMons_823ACD0}
},
[TRAINER_BIKER_ALEX] = {
@@ -2386,7 +2386,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823AD20),
.party = {.NoItemCustomMoves = sTrainerMons_823AD20}
},
[TRAINER_BIKER_LAO] = {
@@ -2398,7 +2398,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823AD50),
.party = {.NoItemCustomMoves = sTrainerMons_823AD50}
},
[TRAINER_BIKER_1] = {
@@ -2410,7 +2410,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823AD70),
.party = {.NoItemDefaultMoves = sTrainerMons_823AD70}
},
[TRAINER_BIKER_HIDEO] = {
@@ -2422,7 +2422,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823AD78),
.party = {.NoItemDefaultMoves = sTrainerMons_823AD78}
},
[TRAINER_BIKER_RUBEN] = {
@@ -2434,7 +2434,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823AD80),
.party = {.NoItemCustomMoves = sTrainerMons_823AD80}
},
[TRAINER_BIKER_BILLY] = {
@@ -2446,7 +2446,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823ADB0),
.party = {.NoItemDefaultMoves = sTrainerMons_823ADB0}
},
[TRAINER_BIKER_NIKOLAS] = {
@@ -2458,7 +2458,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823ADB8),
.party = {.NoItemCustomMoves = sTrainerMons_823ADB8}
},
[TRAINER_BIKER_JAXON] = {
@@ -2470,7 +2470,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823ADD8),
.party = {.NoItemCustomMoves = sTrainerMons_823ADD8}
},
[TRAINER_BIKER_WILLIAM] = {
@@ -2482,7 +2482,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823ADF8),
.party = {.NoItemCustomMoves = sTrainerMons_823ADF8}
},
[TRAINER_BIKER_LUKAS] = {
@@ -2494,7 +2494,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823AE48),
.party = {.NoItemCustomMoves = sTrainerMons_823AE48}
},
[TRAINER_BIKER_ISAAC] = {
@@ -2506,7 +2506,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823AE88),
.party = {.NoItemCustomMoves = sTrainerMons_823AE88}
},
[TRAINER_BIKER_GERALD] = {
@@ -2518,7 +2518,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823AEB8),
.party = {.NoItemCustomMoves = sTrainerMons_823AEB8}
},
[TRAINER_BURGLAR_1] = {
@@ -2530,7 +2530,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823AED8),
.party = {.NoItemDefaultMoves = sTrainerMons_823AED8}
},
[TRAINER_BURGLAR_2] = {
@@ -2542,7 +2542,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823AEE8),
.party = {.NoItemDefaultMoves = sTrainerMons_823AEE8}
},
[TRAINER_BURGLAR_3] = {
@@ -2554,7 +2554,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823AEF0),
.party = {.NoItemDefaultMoves = sTrainerMons_823AEF0}
},
[TRAINER_BURGLAR_QUINN] = {
@@ -2566,7 +2566,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823AF08),
.party = {.NoItemDefaultMoves = sTrainerMons_823AF08}
},
[TRAINER_BURGLAR_RAMON] = {
@@ -2578,7 +2578,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823AF20),
.party = {.NoItemDefaultMoves = sTrainerMons_823AF20}
},
[TRAINER_BURGLAR_DUSTY] = {
@@ -2590,7 +2590,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823AF28),
.party = {.NoItemDefaultMoves = sTrainerMons_823AF28}
},
[TRAINER_BURGLAR_ARNIE] = {
@@ -2602,7 +2602,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823AF38),
.party = {.NoItemDefaultMoves = sTrainerMons_823AF38}
},
[TRAINER_BURGLAR_4] = {
@@ -2614,7 +2614,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823AF48),
.party = {.NoItemDefaultMoves = sTrainerMons_823AF48}
},
[TRAINER_BURGLAR_SIMON] = {
@@ -2626,7 +2626,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823AF58),
.party = {.NoItemDefaultMoves = sTrainerMons_823AF58}
},
[TRAINER_BURGLAR_LEWIS] = {
@@ -2638,7 +2638,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823AF60),
.party = {.NoItemDefaultMoves = sTrainerMons_823AF60}
},
[TRAINER_ENGINEER_BAILY] = {
@@ -2650,7 +2650,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823AF70),
.party = {.NoItemDefaultMoves = sTrainerMons_823AF70}
},
[TRAINER_ENGINEER_BRAXTON] = {
@@ -2662,7 +2662,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823AF80),
.party = {.NoItemDefaultMoves = sTrainerMons_823AF80}
},
[TRAINER_ENGINEER_BERNIE] = {
@@ -2674,7 +2674,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823AF88),
.party = {.NoItemDefaultMoves = sTrainerMons_823AF88}
},
[TRAINER_FISHERMAN_DALE] = {
@@ -2686,7 +2686,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823AFA0),
.party = {.NoItemDefaultMoves = sTrainerMons_823AFA0}
},
[TRAINER_FISHERMAN_BARNY] = {
@@ -2698,7 +2698,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823AFB8),
.party = {.NoItemDefaultMoves = sTrainerMons_823AFB8}
},
[TRAINER_FISHERMAN_NED] = {
@@ -2710,7 +2710,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823AFD0),
.party = {.NoItemDefaultMoves = sTrainerMons_823AFD0}
},
[TRAINER_FISHERMAN_CHIP] = {
@@ -2722,7 +2722,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823AFE8),
.party = {.NoItemDefaultMoves = sTrainerMons_823AFE8}
},
[TRAINER_FISHERMAN_HANK] = {
@@ -2734,7 +2734,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823AFF8),
.party = {.NoItemDefaultMoves = sTrainerMons_823AFF8}
},
[TRAINER_FISHERMAN_ELLIOT] = {
@@ -2746,7 +2746,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B000),
.party = {.NoItemDefaultMoves = sTrainerMons_823B000}
},
[TRAINER_FISHERMAN_RONALD] = {
@@ -2758,7 +2758,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B020),
.party = {.NoItemDefaultMoves = sTrainerMons_823B020}
},
[TRAINER_FISHERMAN_CLAUDE] = {
@@ -2770,7 +2770,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B040),
.party = {.NoItemDefaultMoves = sTrainerMons_823B040}
},
[TRAINER_FISHERMAN_WADE] = {
@@ -2782,7 +2782,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 6,
+ .partySize = NELEMS(sTrainerMons_823B050),
.party = {.NoItemDefaultMoves = sTrainerMons_823B050}
},
[TRAINER_FISHERMAN_NOLAN] = {
@@ -2794,7 +2794,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B080),
.party = {.NoItemDefaultMoves = sTrainerMons_823B080}
},
[TRAINER_FISHERMAN_ANDREW] = {
@@ -2806,7 +2806,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B090),
.party = {.NoItemDefaultMoves = sTrainerMons_823B090}
},
[TRAINER_SWIMMER_MALE_LUIS] = {
@@ -2818,7 +2818,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B0A0),
.party = {.NoItemDefaultMoves = sTrainerMons_823B0A0}
},
[TRAINER_SWIMMER_MALE_RICHARD] = {
@@ -2830,7 +2830,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B0B0),
.party = {.NoItemDefaultMoves = sTrainerMons_823B0B0}
},
[TRAINER_SWIMMER_MALE_REECE] = {
@@ -2842,7 +2842,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B0C0),
.party = {.NoItemDefaultMoves = sTrainerMons_823B0C0}
},
[TRAINER_SWIMMER_MALE_MATTHEW] = {
@@ -2854,7 +2854,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B0D8),
.party = {.NoItemDefaultMoves = sTrainerMons_823B0D8}
},
[TRAINER_SWIMMER_MALE_DOUGLAS] = {
@@ -2866,7 +2866,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B0E8),
.party = {.NoItemDefaultMoves = sTrainerMons_823B0E8}
},
[TRAINER_SWIMMER_MALE_DAVID] = {
@@ -2878,7 +2878,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B108),
.party = {.NoItemDefaultMoves = sTrainerMons_823B108}
},
[TRAINER_SWIMMER_MALE_TONY] = {
@@ -2890,7 +2890,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B120),
.party = {.NoItemDefaultMoves = sTrainerMons_823B120}
},
[TRAINER_SWIMMER_MALE_AXLE] = {
@@ -2902,7 +2902,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823B130),
.party = {.NoItemDefaultMoves = sTrainerMons_823B130}
},
[TRAINER_SWIMMER_MALE_BARRY] = {
@@ -2914,7 +2914,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B158),
.party = {.NoItemDefaultMoves = sTrainerMons_823B158}
},
[TRAINER_SWIMMER_MALE_DEAN] = {
@@ -2926,7 +2926,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B168),
.party = {.NoItemDefaultMoves = sTrainerMons_823B168}
},
[TRAINER_SWIMMER_MALE_DARRIN] = {
@@ -2938,7 +2938,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B170),
.party = {.NoItemDefaultMoves = sTrainerMons_823B170}
},
[TRAINER_SWIMMER_MALE_SPENCER] = {
@@ -2950,7 +2950,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B190),
.party = {.NoItemDefaultMoves = sTrainerMons_823B190}
},
[TRAINER_SWIMMER_MALE_JACK] = {
@@ -2962,7 +2962,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B1A0),
.party = {.NoItemDefaultMoves = sTrainerMons_823B1A0}
},
[TRAINER_SWIMMER_MALE_JEROME] = {
@@ -2974,7 +2974,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B1A8),
.party = {.NoItemDefaultMoves = sTrainerMons_823B1A8}
},
[TRAINER_SWIMMER_MALE_ROLAND] = {
@@ -2986,7 +2986,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B1B8),
.party = {.NoItemDefaultMoves = sTrainerMons_823B1B8}
},
[TRAINER_CUE_BALL_KOJI] = {
@@ -2998,7 +2998,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B1D0),
.party = {.NoItemDefaultMoves = sTrainerMons_823B1D0}
},
[TRAINER_CUE_BALL_LUKE] = {
@@ -3010,7 +3010,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B1E8),
.party = {.NoItemDefaultMoves = sTrainerMons_823B1E8}
},
[TRAINER_CUE_BALL_CAMRON] = {
@@ -3022,7 +3022,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B1F8),
.party = {.NoItemDefaultMoves = sTrainerMons_823B1F8}
},
[TRAINER_CUE_BALL_RAUL] = {
@@ -3034,7 +3034,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B208),
.party = {.NoItemDefaultMoves = sTrainerMons_823B208}
},
[TRAINER_CUE_BALL_ISAIAH] = {
@@ -3046,7 +3046,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B218),
.party = {.NoItemDefaultMoves = sTrainerMons_823B218}
},
[TRAINER_CUE_BALL_ZEEK] = {
@@ -3058,7 +3058,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B228),
.party = {.NoItemDefaultMoves = sTrainerMons_823B228}
},
[TRAINER_CUE_BALL_JAMAL] = {
@@ -3070,7 +3070,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B230),
.party = {.NoItemDefaultMoves = sTrainerMons_823B230}
},
[TRAINER_CUE_BALL_COREY] = {
@@ -3082,7 +3082,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B250),
.party = {.NoItemDefaultMoves = sTrainerMons_823B250}
},
[TRAINER_CUE_BALL_CHASE] = {
@@ -3094,7 +3094,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B260),
.party = {.NoItemDefaultMoves = sTrainerMons_823B260}
},
[TRAINER_GAMER_HUGO] = {
@@ -3106,7 +3106,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B278),
.party = {.NoItemDefaultMoves = sTrainerMons_823B278}
},
[TRAINER_GAMER_JASPER] = {
@@ -3118,7 +3118,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B288),
.party = {.NoItemDefaultMoves = sTrainerMons_823B288}
},
[TRAINER_GAMER_DIRK] = {
@@ -3130,7 +3130,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B298),
.party = {.NoItemDefaultMoves = sTrainerMons_823B298}
},
[TRAINER_GAMER_DARIAN] = {
@@ -3142,7 +3142,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B2A8),
.party = {.NoItemDefaultMoves = sTrainerMons_823B2A8}
},
[TRAINER_GAMER_STAN] = {
@@ -3154,7 +3154,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B2B8),
.party = {.NoItemDefaultMoves = sTrainerMons_823B2B8}
},
[TRAINER_GAMER_1] = {
@@ -3166,7 +3166,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B2D0),
.party = {.NoItemDefaultMoves = sTrainerMons_823B2D0}
},
[TRAINER_GAMER_RICH] = {
@@ -3178,7 +3178,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B2D8),
.party = {.NoItemDefaultMoves = sTrainerMons_823B2D8}
},
[TRAINER_BEAUTY_BRIDGET] = {
@@ -3190,7 +3190,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B2E8),
.party = {.NoItemDefaultMoves = sTrainerMons_823B2E8}
},
[TRAINER_BEAUTY_TAMIA] = {
@@ -3202,7 +3202,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B308),
.party = {.NoItemDefaultMoves = sTrainerMons_823B308}
},
[TRAINER_BEAUTY_LORI] = {
@@ -3214,7 +3214,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B318),
.party = {.NoItemDefaultMoves = sTrainerMons_823B318}
},
[TRAINER_BEAUTY_LOLA] = {
@@ -3226,7 +3226,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B320),
.party = {.NoItemDefaultMoves = sTrainerMons_823B320}
},
[TRAINER_BEAUTY_SHEILA] = {
@@ -3238,7 +3238,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B338),
.party = {.NoItemDefaultMoves = sTrainerMons_823B338}
},
[TRAINER_SWIMMER_FEMALE_TIFFANY] = {
@@ -3250,7 +3250,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B348),
.party = {.NoItemDefaultMoves = sTrainerMons_823B348}
},
[TRAINER_SWIMMER_FEMALE_NORA] = {
@@ -3262,7 +3262,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B350),
.party = {.NoItemDefaultMoves = sTrainerMons_823B350}
},
[TRAINER_SWIMMER_FEMALE_MELISSA] = {
@@ -3274,7 +3274,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B368),
.party = {.NoItemDefaultMoves = sTrainerMons_823B368}
},
[TRAINER_BEAUTY_GRACE] = {
@@ -3286,7 +3286,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B378),
.party = {.NoItemDefaultMoves = sTrainerMons_823B378}
},
[TRAINER_BEAUTY_OLIVIA] = {
@@ -3298,7 +3298,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B388),
.party = {.NoItemDefaultMoves = sTrainerMons_823B388}
},
[TRAINER_BEAUTY_LAUREN] = {
@@ -3310,7 +3310,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B398),
.party = {.NoItemDefaultMoves = sTrainerMons_823B398}
},
[TRAINER_SWIMMER_FEMALE_ANYA] = {
@@ -3322,7 +3322,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823B3B0),
.party = {.NoItemDefaultMoves = sTrainerMons_823B3B0}
},
[TRAINER_SWIMMER_FEMALE_ALICE] = {
@@ -3334,7 +3334,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B3D8),
.party = {.NoItemDefaultMoves = sTrainerMons_823B3D8}
},
[TRAINER_SWIMMER_FEMALE_CONNIE] = {
@@ -3346,7 +3346,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B3E8),
.party = {.NoItemDefaultMoves = sTrainerMons_823B3E8}
},
[TRAINER_SWIMMER_FEMALE_SHIRLEY] = {
@@ -3358,7 +3358,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B400),
.party = {.NoItemDefaultMoves = sTrainerMons_823B400}
},
[TRAINER_PSYCHIC_JOHAN] = {
@@ -3370,7 +3370,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B418),
.party = {.NoItemDefaultMoves = sTrainerMons_823B418}
},
[TRAINER_PSYCHIC_TYRON] = {
@@ -3382,7 +3382,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B438),
.party = {.NoItemDefaultMoves = sTrainerMons_823B438}
},
[TRAINER_PSYCHIC_CAMERON] = {
@@ -3394,7 +3394,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B448),
.party = {.NoItemDefaultMoves = sTrainerMons_823B448}
},
[TRAINER_PSYCHIC_PRESTON] = {
@@ -3406,7 +3406,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B460),
.party = {.NoItemDefaultMoves = sTrainerMons_823B460}
},
[TRAINER_ROCKER_RANDALL] = {
@@ -3418,7 +3418,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B468),
.party = {.NoItemDefaultMoves = sTrainerMons_823B468}
},
[TRAINER_ROCKER_LUCA] = {
@@ -3430,7 +3430,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B480),
.party = {.NoItemDefaultMoves = sTrainerMons_823B480}
},
[TRAINER_JUGGLER_DALTON] = {
@@ -3442,7 +3442,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B490),
.party = {.NoItemDefaultMoves = sTrainerMons_823B490}
},
[TRAINER_JUGGLER_NELSON] = {
@@ -3454,7 +3454,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B4A0),
.party = {.NoItemDefaultMoves = sTrainerMons_823B4A0}
},
[TRAINER_JUGGLER_KIRK] = {
@@ -3466,7 +3466,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B4C0),
.party = {.NoItemDefaultMoves = sTrainerMons_823B4C0}
},
[TRAINER_JUGGLER_SHAWN] = {
@@ -3478,7 +3478,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B4E0),
.party = {.NoItemDefaultMoves = sTrainerMons_823B4E0}
},
[TRAINER_JUGGLER_GREGORY] = {
@@ -3490,7 +3490,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B4F0),
.party = {.NoItemCustomMoves = sTrainerMons_823B4F0}
},
[TRAINER_JUGGLER_EDWARD] = {
@@ -3502,7 +3502,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B500),
.party = {.NoItemCustomMoves = sTrainerMons_823B500}
},
[TRAINER_JUGGLER_KAYDEN] = {
@@ -3514,7 +3514,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B540),
.party = {.NoItemDefaultMoves = sTrainerMons_823B540}
},
[TRAINER_JUGGLER_NATE] = {
@@ -3526,7 +3526,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B548),
.party = {.NoItemDefaultMoves = sTrainerMons_823B548}
},
[TRAINER_TAMER_PHIL] = {
@@ -3538,7 +3538,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B558),
.party = {.NoItemDefaultMoves = sTrainerMons_823B558}
},
[TRAINER_TAMER_EDGAR] = {
@@ -3550,7 +3550,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B568),
.party = {.NoItemDefaultMoves = sTrainerMons_823B568}
},
[TRAINER_TAMER_JASON] = {
@@ -3562,7 +3562,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B580),
.party = {.NoItemDefaultMoves = sTrainerMons_823B580}
},
[TRAINER_TAMER_COLE] = {
@@ -3574,7 +3574,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B588),
.party = {.NoItemDefaultMoves = sTrainerMons_823B588}
},
[TRAINER_TAMER_VINCENT] = {
@@ -3586,7 +3586,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B598),
.party = {.NoItemDefaultMoves = sTrainerMons_823B598}
},
[TRAINER_TAMER_JOHN] = {
@@ -3598,7 +3598,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B5A8),
.party = {.NoItemDefaultMoves = sTrainerMons_823B5A8}
},
[TRAINER_BIRD_KEEPER_SEBASTIAN] = {
@@ -3610,7 +3610,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B5C8),
.party = {.NoItemDefaultMoves = sTrainerMons_823B5C8}
},
[TRAINER_BIRD_KEEPER_PERRY] = {
@@ -3622,7 +3622,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823B5D8),
.party = {.NoItemDefaultMoves = sTrainerMons_823B5D8}
},
[TRAINER_BIRD_KEEPER_ROBERT] = {
@@ -3634,7 +3634,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B600),
.party = {.NoItemDefaultMoves = sTrainerMons_823B600}
},
[TRAINER_BIRD_KEEPER_DONALD] = {
@@ -3646,7 +3646,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B620),
.party = {.NoItemDefaultMoves = sTrainerMons_823B620}
},
[TRAINER_BIRD_KEEPER_BENNY] = {
@@ -3658,7 +3658,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B628),
.party = {.NoItemDefaultMoves = sTrainerMons_823B628}
},
[TRAINER_BIRD_KEEPER_EDWIN] = {
@@ -3670,7 +3670,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B638),
.party = {.NoItemDefaultMoves = sTrainerMons_823B638}
},
[TRAINER_BIRD_KEEPER_CHESTER] = {
@@ -3682,7 +3682,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B658),
.party = {.NoItemDefaultMoves = sTrainerMons_823B658}
},
[TRAINER_BIRD_KEEPER_WILTON] = {
@@ -3694,7 +3694,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B670),
.party = {.NoItemDefaultMoves = sTrainerMons_823B670}
},
[TRAINER_BIRD_KEEPER_RAMIRO] = {
@@ -3706,7 +3706,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B680),
.party = {.NoItemDefaultMoves = sTrainerMons_823B680}
},
[TRAINER_BIRD_KEEPER_JACOB] = {
@@ -3718,7 +3718,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B688),
.party = {.NoItemDefaultMoves = sTrainerMons_823B688}
},
[TRAINER_BIRD_KEEPER_ROGER] = {
@@ -3730,7 +3730,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B6A8),
.party = {.NoItemDefaultMoves = sTrainerMons_823B6A8}
},
[TRAINER_BIRD_KEEPER_REED] = {
@@ -3742,7 +3742,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B6C0),
.party = {.NoItemDefaultMoves = sTrainerMons_823B6C0}
},
[TRAINER_BIRD_KEEPER_KEITH] = {
@@ -3754,7 +3754,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B6E0),
.party = {.NoItemDefaultMoves = sTrainerMons_823B6E0}
},
[TRAINER_BIRD_KEEPER_CARTER] = {
@@ -3766,7 +3766,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B6F0),
.party = {.NoItemDefaultMoves = sTrainerMons_823B6F0}
},
[TRAINER_BIRD_KEEPER_MITCH] = {
@@ -3778,7 +3778,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B708),
.party = {.NoItemDefaultMoves = sTrainerMons_823B708}
},
[TRAINER_BIRD_KEEPER_BECK] = {
@@ -3790,7 +3790,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B728),
.party = {.NoItemDefaultMoves = sTrainerMons_823B728}
},
[TRAINER_BIRD_KEEPER_MARLON] = {
@@ -3802,7 +3802,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B738),
.party = {.NoItemDefaultMoves = sTrainerMons_823B738}
},
[TRAINER_BLACK_BELT_KOICHI] = {
@@ -3814,7 +3814,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B750),
.party = {.ItemDefaultMoves = sTrainerMons_823B750}
},
[TRAINER_BLACK_BELT_MIKE] = {
@@ -3826,7 +3826,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B760),
.party = {.ItemDefaultMoves = sTrainerMons_823B760}
},
[TRAINER_BLACK_BELT_HIDEKI] = {
@@ -3838,7 +3838,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B778),
.party = {.ItemDefaultMoves = sTrainerMons_823B778}
},
[TRAINER_BLACK_BELT_AARON] = {
@@ -3850,7 +3850,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B788),
.party = {.ItemDefaultMoves = sTrainerMons_823B788}
},
[TRAINER_BLACK_BELT_HITOSHI] = {
@@ -3862,7 +3862,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B790),
.party = {.ItemDefaultMoves = sTrainerMons_823B790}
},
[TRAINER_BLACK_BELT_ATSUSHI] = {
@@ -3874,7 +3874,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B7A8),
.party = {.ItemDefaultMoves = sTrainerMons_823B7A8}
},
[TRAINER_BLACK_BELT_KIYO] = {
@@ -3886,7 +3886,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B7B8),
.party = {.ItemDefaultMoves = sTrainerMons_823B7B8}
},
[TRAINER_BLACK_BELT_TAKASHI] = {
@@ -3898,7 +3898,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B7C0),
.party = {.ItemDefaultMoves = sTrainerMons_823B7C0}
},
[TRAINER_BLACK_BELT_DAISUKE] = {
@@ -3910,7 +3910,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B7D8),
.party = {.ItemDefaultMoves = sTrainerMons_823B7D8}
},
[TRAINER_RIVAL_OAKS_LAB_SQUIRTLE] = {
@@ -3922,7 +3922,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B7F0),
.party = {.NoItemDefaultMoves = sTrainerMons_823B7F0}
},
[TRAINER_RIVAL_OAKS_LAB_BULBASAUR] = {
@@ -3934,7 +3934,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B7F8),
.party = {.NoItemDefaultMoves = sTrainerMons_823B7F8}
},
[TRAINER_RIVAL_OAKS_LAB_CHARMANDER] = {
@@ -3946,7 +3946,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B800),
.party = {.NoItemDefaultMoves = sTrainerMons_823B800}
},
[TRAINER_RIVAL_ROUTE22_EARLY_SQUIRTLE] = {
@@ -3958,7 +3958,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B808),
.party = {.NoItemCustomMoves = sTrainerMons_823B808}
},
[TRAINER_RIVAL_ROUTE22_EARLY_BULBASAUR] = {
@@ -3970,7 +3970,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B828),
.party = {.NoItemCustomMoves = sTrainerMons_823B828}
},
[TRAINER_RIVAL_ROUTE22_EARLY_CHARMANDER] = {
@@ -3982,7 +3982,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B848),
.party = {.NoItemCustomMoves = sTrainerMons_823B848}
},
[TRAINER_RIVAL_CERULEAN_SQUIRTLE] = {
@@ -3994,7 +3994,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B868),
.party = {.NoItemCustomMoves = sTrainerMons_823B868}
},
[TRAINER_RIVAL_CERULEAN_BULBASAUR] = {
@@ -4006,7 +4006,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B8A8),
.party = {.NoItemCustomMoves = sTrainerMons_823B8A8}
},
[TRAINER_RIVAL_CERULEAN_CHARMANDER] = {
@@ -4018,7 +4018,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B8E8),
.party = {.NoItemCustomMoves = sTrainerMons_823B8E8}
},
[TRAINER_SCIENTIST_TED] = {
@@ -4030,7 +4030,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B928),
.party = {.NoItemDefaultMoves = sTrainerMons_823B928}
},
[TRAINER_SCIENTIST_CONNOR] = {
@@ -4042,7 +4042,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B938),
.party = {.NoItemCustomMoves = sTrainerMons_823B938}
},
[TRAINER_SCIENTIST_JERRY] = {
@@ -4054,7 +4054,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823B978),
.party = {.NoItemDefaultMoves = sTrainerMons_823B978}
},
[TRAINER_SCIENTIST_JOSE] = {
@@ -4066,7 +4066,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823B990),
.party = {.NoItemCustomMoves = sTrainerMons_823B990}
},
[TRAINER_SCIENTIST_RODNEY] = {
@@ -4078,7 +4078,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823B9B0),
.party = {.NoItemDefaultMoves = sTrainerMons_823B9B0}
},
[TRAINER_SCIENTIST_BEAU] = {
@@ -4090,7 +4090,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823B9B8),
.party = {.NoItemCustomMoves = sTrainerMons_823B9B8}
},
[TRAINER_SCIENTIST_TAYLOR] = {
@@ -4102,7 +4102,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823B9F8),
.party = {.NoItemCustomMoves = sTrainerMons_823B9F8}
},
[TRAINER_SCIENTIST_JOSHUA] = {
@@ -4114,7 +4114,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BA48),
.party = {.NoItemDefaultMoves = sTrainerMons_823BA48}
},
[TRAINER_SCIENTIST_PARKER] = {
@@ -4126,7 +4126,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BA58),
.party = {.NoItemDefaultMoves = sTrainerMons_823BA58}
},
[TRAINER_SCIENTIST_ED] = {
@@ -4138,7 +4138,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823BA68),
.party = {.NoItemCustomMoves = sTrainerMons_823BA68}
},
[TRAINER_SCIENTIST_TRAVIS] = {
@@ -4150,7 +4150,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BA98),
.party = {.NoItemDefaultMoves = sTrainerMons_823BA98}
},
[TRAINER_SCIENTIST_BRAYDON] = {
@@ -4162,7 +4162,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823BAA8),
.party = {.NoItemDefaultMoves = sTrainerMons_823BAA8}
},
[TRAINER_SCIENTIST_IVAN] = {
@@ -4174,7 +4174,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BAC0),
.party = {.NoItemDefaultMoves = sTrainerMons_823BAC0}
},
[TRAINER_BOSS_GIOVANNI] = {
@@ -4186,7 +4186,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823BAD0),
.party = {.NoItemDefaultMoves = sTrainerMons_823BAD0}
},
[TRAINER_BOSS_GIOVANNI_2] = {
@@ -4198,7 +4198,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823BAE8),
.party = {.NoItemDefaultMoves = sTrainerMons_823BAE8}
},
[TRAINER_LEADER_GIOVANNI] = {
@@ -4210,7 +4210,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823BB08),
.party = {.NoItemCustomMoves = sTrainerMons_823BB08}
},
[TRAINER_TEAM_ROCKET_GRUNT] = {
@@ -4222,7 +4222,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BB58),
.party = {.NoItemDefaultMoves = sTrainerMons_823BB58}
},
[TRAINER_TEAM_ROCKET_GRUNT_2] = {
@@ -4234,7 +4234,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823BB68),
.party = {.NoItemDefaultMoves = sTrainerMons_823BB68}
},
[TRAINER_TEAM_ROCKET_GRUNT_3] = {
@@ -4246,7 +4246,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BB80),
.party = {.NoItemDefaultMoves = sTrainerMons_823BB80}
},
[TRAINER_TEAM_ROCKET_GRUNT_4] = {
@@ -4258,7 +4258,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BB90),
.party = {.NoItemDefaultMoves = sTrainerMons_823BB90}
},
[TRAINER_TEAM_ROCKET_GRUNT_5] = {
@@ -4270,7 +4270,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BBA0),
.party = {.NoItemDefaultMoves = sTrainerMons_823BBA0}
},
[TRAINER_TEAM_ROCKET_GRUNT_6] = {
@@ -4282,7 +4282,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BBB0),
.party = {.NoItemDefaultMoves = sTrainerMons_823BBB0}
},
[TRAINER_TEAM_ROCKET_GRUNT_7] = {
@@ -4294,7 +4294,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BBC0),
.party = {.NoItemDefaultMoves = sTrainerMons_823BBC0}
},
[TRAINER_TEAM_ROCKET_GRUNT_8] = {
@@ -4306,7 +4306,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BBD0),
.party = {.NoItemDefaultMoves = sTrainerMons_823BBD0}
},
[TRAINER_TEAM_ROCKET_GRUNT_9] = {
@@ -4318,7 +4318,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BBE0),
.party = {.NoItemDefaultMoves = sTrainerMons_823BBE0}
},
[TRAINER_TEAM_ROCKET_GRUNT_10] = {
@@ -4330,7 +4330,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823BBF0),
.party = {.NoItemCustomMoves = sTrainerMons_823BBF0}
},
[TRAINER_TEAM_ROCKET_GRUNT_11] = {
@@ -4342,7 +4342,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823BC20),
.party = {.NoItemDefaultMoves = sTrainerMons_823BC20}
},
[TRAINER_TEAM_ROCKET_GRUNT_12] = {
@@ -4354,7 +4354,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BC40),
.party = {.NoItemCustomMoves = sTrainerMons_823BC40}
},
[TRAINER_TEAM_ROCKET_GRUNT_13] = {
@@ -4366,7 +4366,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823BC60),
.party = {.NoItemCustomMoves = sTrainerMons_823BC60}
},
[TRAINER_TEAM_ROCKET_GRUNT_14] = {
@@ -4378,7 +4378,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823BCB0),
.party = {.NoItemDefaultMoves = sTrainerMons_823BCB0}
},
[TRAINER_TEAM_ROCKET_GRUNT_15] = {
@@ -4390,7 +4390,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BCC8),
.party = {.NoItemDefaultMoves = sTrainerMons_823BCC8}
},
[TRAINER_TEAM_ROCKET_GRUNT_16] = {
@@ -4402,7 +4402,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823BCD8),
.party = {.NoItemDefaultMoves = sTrainerMons_823BCD8}
},
[TRAINER_TEAM_ROCKET_GRUNT_17] = {
@@ -4414,7 +4414,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823BCF0),
.party = {.NoItemDefaultMoves = sTrainerMons_823BCF0}
},
[TRAINER_TEAM_ROCKET_GRUNT_18] = {
@@ -4426,7 +4426,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BD08),
.party = {.NoItemDefaultMoves = sTrainerMons_823BD08}
},
[TRAINER_TEAM_ROCKET_GRUNT_19] = {
@@ -4438,7 +4438,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823BD18),
.party = {.NoItemDefaultMoves = sTrainerMons_823BD18}
},
[TRAINER_TEAM_ROCKET_GRUNT_20] = {
@@ -4450,7 +4450,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BD30),
.party = {.NoItemDefaultMoves = sTrainerMons_823BD30}
},
[TRAINER_TEAM_ROCKET_GRUNT_21] = {
@@ -4462,7 +4462,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823BD40),
.party = {.NoItemDefaultMoves = sTrainerMons_823BD40}
},
[TRAINER_TEAM_ROCKET_GRUNT_22] = {
@@ -4474,7 +4474,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BD60),
.party = {.NoItemDefaultMoves = sTrainerMons_823BD60}
},
[TRAINER_TEAM_ROCKET_GRUNT_23] = {
@@ -4486,7 +4486,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BD70),
.party = {.NoItemDefaultMoves = sTrainerMons_823BD70}
},
[TRAINER_TEAM_ROCKET_GRUNT_24] = {
@@ -4498,7 +4498,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823BD80),
.party = {.NoItemDefaultMoves = sTrainerMons_823BD80}
},
[TRAINER_TEAM_ROCKET_GRUNT_25] = {
@@ -4510,7 +4510,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823BDA8),
.party = {.NoItemDefaultMoves = sTrainerMons_823BDA8}
},
[TRAINER_TEAM_ROCKET_GRUNT_26] = {
@@ -4522,7 +4522,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BDC0),
.party = {.NoItemDefaultMoves = sTrainerMons_823BDC0}
},
[TRAINER_TEAM_ROCKET_GRUNT_27] = {
@@ -4534,7 +4534,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823BDD0),
.party = {.NoItemDefaultMoves = sTrainerMons_823BDD0}
},
[TRAINER_TEAM_ROCKET_GRUNT_28] = {
@@ -4546,7 +4546,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823BDE8),
.party = {.NoItemDefaultMoves = sTrainerMons_823BDE8}
},
[TRAINER_TEAM_ROCKET_GRUNT_29] = {
@@ -4558,7 +4558,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823BDF0),
.party = {.NoItemDefaultMoves = sTrainerMons_823BDF0}
},
[TRAINER_TEAM_ROCKET_GRUNT_30] = {
@@ -4570,7 +4570,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BDF8),
.party = {.NoItemDefaultMoves = sTrainerMons_823BDF8}
},
[TRAINER_TEAM_ROCKET_GRUNT_31] = {
@@ -4582,7 +4582,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823BE08),
.party = {.NoItemDefaultMoves = sTrainerMons_823BE08}
},
[TRAINER_TEAM_ROCKET_GRUNT_32] = {
@@ -4594,7 +4594,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823BE20),
.party = {.NoItemCustomMoves = sTrainerMons_823BE20}
},
[TRAINER_TEAM_ROCKET_GRUNT_33] = {
@@ -4606,7 +4606,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BE60),
.party = {.NoItemDefaultMoves = sTrainerMons_823BE60}
},
[TRAINER_TEAM_ROCKET_GRUNT_34] = {
@@ -4618,7 +4618,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823BE70),
.party = {.NoItemDefaultMoves = sTrainerMons_823BE70}
},
[TRAINER_TEAM_ROCKET_GRUNT_35] = {
@@ -4630,7 +4630,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823BE80),
.party = {.NoItemDefaultMoves = sTrainerMons_823BE80}
},
[TRAINER_TEAM_ROCKET_GRUNT_36] = {
@@ -4642,7 +4642,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823BEA0),
.party = {.NoItemDefaultMoves = sTrainerMons_823BEA0}
},
[TRAINER_TEAM_ROCKET_GRUNT_37] = {
@@ -4654,7 +4654,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823BEB8),
.party = {.NoItemDefaultMoves = sTrainerMons_823BEB8}
},
[TRAINER_TEAM_ROCKET_GRUNT_38] = {
@@ -4666,7 +4666,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823BED0),
.party = {.NoItemDefaultMoves = sTrainerMons_823BED0}
},
[TRAINER_TEAM_ROCKET_GRUNT_39] = {
@@ -4678,7 +4678,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823BEE8),
.party = {.NoItemDefaultMoves = sTrainerMons_823BEE8}
},
[TRAINER_TEAM_ROCKET_GRUNT_40] = {
@@ -4690,7 +4690,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823BEF0),
.party = {.NoItemDefaultMoves = sTrainerMons_823BEF0}
},
[TRAINER_TEAM_ROCKET_GRUNT_41] = {
@@ -4702,7 +4702,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823BF18),
.party = {.NoItemDefaultMoves = sTrainerMons_823BF18}
},
[TRAINER_COOLTRAINER_SAMUEL] = {
@@ -4714,7 +4714,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_SUPER_POTION},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823BF30),
.party = {.NoItemCustomMoves = sTrainerMons_823BF30}
},
[TRAINER_COOLTRAINER_GEORGE] = {
@@ -4726,7 +4726,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823BF80),
.party = {.NoItemCustomMoves = sTrainerMons_823BF80}
},
[TRAINER_COOLTRAINER_COLBY] = {
@@ -4738,7 +4738,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823BFD0),
.party = {.NoItemCustomMoves = sTrainerMons_823BFD0}
},
[TRAINER_COOLTRAINER_PAUL] = {
@@ -4750,7 +4750,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C020),
.party = {.NoItemCustomMoves = sTrainerMons_823C020}
},
[TRAINER_COOLTRAINER_ROLANDO] = {
@@ -4762,7 +4762,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C070),
.party = {.NoItemCustomMoves = sTrainerMons_823C070}
},
[TRAINER_COOLTRAINER_GILBERT] = {
@@ -4774,7 +4774,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C0C0),
.party = {.NoItemCustomMoves = sTrainerMons_823C0C0}
},
[TRAINER_COOLTRAINER_OWEN] = {
@@ -4786,7 +4786,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C110),
.party = {.NoItemCustomMoves = sTrainerMons_823C110}
},
[TRAINER_COOLTRAINER_BERKE] = {
@@ -4798,7 +4798,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C160),
.party = {.NoItemCustomMoves = sTrainerMons_823C160}
},
[TRAINER_COOLTRAINER_YUJI] = {
@@ -4810,7 +4810,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C1B0),
.party = {.NoItemCustomMoves = sTrainerMons_823C1B0}
},
[TRAINER_COOLTRAINER_WARREN] = {
@@ -4822,7 +4822,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C200),
.party = {.NoItemCustomMoves = sTrainerMons_823C200}
},
[TRAINER_COOLTRAINER_MARY] = {
@@ -4834,7 +4834,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_SUPER_POTION},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C250),
.party = {.NoItemCustomMoves = sTrainerMons_823C250}
},
[TRAINER_COOLTRAINER_CAROLINE] = {
@@ -4846,7 +4846,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C2A0),
.party = {.NoItemCustomMoves = sTrainerMons_823C2A0}
},
[TRAINER_COOLTRAINER_ALEXA] = {
@@ -4858,7 +4858,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C2F0),
.party = {.NoItemCustomMoves = sTrainerMons_823C2F0}
},
[TRAINER_COOLTRAINER_SHANNON] = {
@@ -4870,7 +4870,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C340),
.party = {.NoItemCustomMoves = sTrainerMons_823C340}
},
[TRAINER_COOLTRAINER_NAOMI] = {
@@ -4882,7 +4882,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C390),
.party = {.NoItemCustomMoves = sTrainerMons_823C390}
},
[TRAINER_COOLTRAINER_BROOKE] = {
@@ -4894,7 +4894,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C3E0),
.party = {.NoItemCustomMoves = sTrainerMons_823C3E0}
},
[TRAINER_COOLTRAINER_AUSTINA] = {
@@ -4906,7 +4906,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C430),
.party = {.NoItemCustomMoves = sTrainerMons_823C430}
},
[TRAINER_COOLTRAINER_JULIE] = {
@@ -4918,7 +4918,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C480),
.party = {.NoItemCustomMoves = sTrainerMons_823C480}
},
[TRAINER_ELITE_FOUR_LORELEI] = {
@@ -4930,7 +4930,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C4D0),
.party = {.ItemCustomMoves = sTrainerMons_823C4D0}
},
[TRAINER_ELITE_FOUR_BRUNO] = {
@@ -4942,7 +4942,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C520),
.party = {.ItemCustomMoves = sTrainerMons_823C520}
},
[TRAINER_ELITE_FOUR_AGATHA] = {
@@ -4954,7 +4954,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C570),
.party = {.ItemCustomMoves = sTrainerMons_823C570}
},
[TRAINER_ELITE_FOUR_LANCE] = {
@@ -4966,7 +4966,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C5C0),
.party = {.ItemCustomMoves = sTrainerMons_823C5C0}
},
[TRAINER_LEADER_BROCK] = {
@@ -4978,7 +4978,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823C610),
.party = {.NoItemCustomMoves = sTrainerMons_823C610}
},
[TRAINER_LEADER_MISTY] = {
@@ -4990,7 +4990,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_SUPER_POTION},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823C630),
.party = {.NoItemCustomMoves = sTrainerMons_823C630}
},
[TRAINER_LEADER_LT_SURGE] = {
@@ -5002,7 +5002,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_SUPER_POTION, ITEM_FULL_HEAL},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823C650),
.party = {.NoItemCustomMoves = sTrainerMons_823C650}
},
[TRAINER_LEADER_ERIKA] = {
@@ -5014,7 +5014,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION, ITEM_FULL_HEAL},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823C680),
.party = {.NoItemCustomMoves = sTrainerMons_823C680}
},
[TRAINER_LEADER_KOGA] = {
@@ -5026,7 +5026,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823C6B0),
.party = {.NoItemCustomMoves = sTrainerMons_823C6B0}
},
[TRAINER_LEADER_BLAINE] = {
@@ -5038,7 +5038,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823C6F0),
.party = {.NoItemCustomMoves = sTrainerMons_823C6F0}
},
[TRAINER_LEADER_SABRINA] = {
@@ -5050,7 +5050,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_FULL_HEAL},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823C730),
.party = {.NoItemCustomMoves = sTrainerMons_823C730}
},
[TRAINER_GENTLEMAN_THOMAS] = {
@@ -5062,7 +5062,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823C770),
.party = {.NoItemDefaultMoves = sTrainerMons_823C770}
},
[TRAINER_GENTLEMAN_ARTHUR] = {
@@ -5074,7 +5074,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823C780),
.party = {.NoItemDefaultMoves = sTrainerMons_823C780}
},
[TRAINER_GENTLEMAN_TUCKER] = {
@@ -5086,7 +5086,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823C790),
.party = {.NoItemDefaultMoves = sTrainerMons_823C790}
},
[TRAINER_GENTLEMAN_NORTON] = {
@@ -5098,7 +5098,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823C798),
.party = {.NoItemDefaultMoves = sTrainerMons_823C798}
},
[TRAINER_GENTLEMAN_WALTER] = {
@@ -5110,7 +5110,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823C7A0),
.party = {.NoItemDefaultMoves = sTrainerMons_823C7A0}
},
[TRAINER_RIVAL_SS_ANNE_SQUIRTLE] = {
@@ -5122,7 +5122,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823C7B0),
.party = {.NoItemDefaultMoves = sTrainerMons_823C7B0}
},
[TRAINER_RIVAL_SS_ANNE_BULBASAUR] = {
@@ -5134,7 +5134,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823C7D0),
.party = {.NoItemDefaultMoves = sTrainerMons_823C7D0}
},
[TRAINER_RIVAL_SS_ANNE_CHARMANDER] = {
@@ -5146,7 +5146,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823C7F0),
.party = {.NoItemDefaultMoves = sTrainerMons_823C7F0}
},
[TRAINER_RIVAL_POKENON_TOWER_SQUIRTLE] = {
@@ -5158,7 +5158,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C810),
.party = {.NoItemDefaultMoves = sTrainerMons_823C810}
},
[TRAINER_RIVAL_POKENON_TOWER_BULBASAUR] = {
@@ -5170,7 +5170,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C838),
.party = {.NoItemDefaultMoves = sTrainerMons_823C838}
},
[TRAINER_RIVAL_POKENON_TOWER_CHARMANDER] = {
@@ -5182,7 +5182,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C860),
.party = {.NoItemDefaultMoves = sTrainerMons_823C860}
},
[TRAINER_RIVAL_SILPH_SQUIRTLE] = {
@@ -5194,7 +5194,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C888),
.party = {.NoItemDefaultMoves = sTrainerMons_823C888}
},
[TRAINER_RIVAL_SILPH_BULBASAUR] = {
@@ -5206,7 +5206,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C8B0),
.party = {.NoItemDefaultMoves = sTrainerMons_823C8B0}
},
[TRAINER_RIVAL_SILPH_CHARMANDER] = {
@@ -5218,7 +5218,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823C8D8),
.party = {.NoItemDefaultMoves = sTrainerMons_823C8D8}
},
[TRAINER_RIVAL_ROUTE22_LATE_SQUIRTLE] = {
@@ -5230,7 +5230,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 6,
+ .partySize = NELEMS(sTrainerMons_823C900),
.party = {.NoItemCustomMoves = sTrainerMons_823C900}
},
[TRAINER_RIVAL_ROUTE22_LATE_BULBASAUR] = {
@@ -5242,7 +5242,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 6,
+ .partySize = NELEMS(sTrainerMons_823C960),
.party = {.NoItemCustomMoves = sTrainerMons_823C960}
},
[TRAINER_RIVAL_ROUTE22_LATE_CHARMANDER] = {
@@ -5254,7 +5254,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 6,
+ .partySize = NELEMS(sTrainerMons_823C9C0),
.party = {.NoItemCustomMoves = sTrainerMons_823C9C0}
},
[TRAINER_CHAMPION_FIRST_SQUIRTLE] = {
@@ -5266,7 +5266,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 6,
+ .partySize = NELEMS(sTrainerMons_823CA20),
.party = {.ItemCustomMoves = sTrainerMons_823CA20}
},
[TRAINER_CHAMPION_FIRST_BULBASAUR] = {
@@ -5278,7 +5278,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 6,
+ .partySize = NELEMS(sTrainerMons_823CA80),
.party = {.ItemCustomMoves = sTrainerMons_823CA80}
},
[TRAINER_CHAMPION_FIRST_CHARMANDER] = {
@@ -5290,7 +5290,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 6,
+ .partySize = NELEMS(sTrainerMons_823CAE0),
.party = {.ItemCustomMoves = sTrainerMons_823CAE0}
},
[TRAINER_CHANNELER_PATRICIA] = {
@@ -5302,7 +5302,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CB40),
.party = {.NoItemDefaultMoves = sTrainerMons_823CB40}
},
[TRAINER_CHANNELER_CARLY] = {
@@ -5314,7 +5314,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CB48),
.party = {.NoItemDefaultMoves = sTrainerMons_823CB48}
},
[TRAINER_CHANNELER_HOPE] = {
@@ -5326,7 +5326,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CB50),
.party = {.NoItemDefaultMoves = sTrainerMons_823CB50}
},
[TRAINER_CHANNELER_PAULA] = {
@@ -5338,7 +5338,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CB58),
.party = {.NoItemDefaultMoves = sTrainerMons_823CB58}
},
[TRAINER_CHANNELER_LAUREL] = {
@@ -5350,7 +5350,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CB60),
.party = {.NoItemDefaultMoves = sTrainerMons_823CB60}
},
[TRAINER_CHANNELER_JODY] = {
@@ -5362,7 +5362,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CB70),
.party = {.NoItemDefaultMoves = sTrainerMons_823CB70}
},
[TRAINER_CHANNELER_TAMMY] = {
@@ -5374,7 +5374,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CB78),
.party = {.NoItemDefaultMoves = sTrainerMons_823CB78}
},
[TRAINER_CHANNELER_RUTH] = {
@@ -5386,7 +5386,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CB80),
.party = {.NoItemDefaultMoves = sTrainerMons_823CB80}
},
[TRAINER_CHANNELER_KARINA] = {
@@ -5398,7 +5398,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CB88),
.party = {.NoItemDefaultMoves = sTrainerMons_823CB88}
},
[TRAINER_CHANNELER_JANAE] = {
@@ -5410,7 +5410,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CB90),
.party = {.NoItemDefaultMoves = sTrainerMons_823CB90}
},
[TRAINER_CHANNELER_ANGELICA] = {
@@ -5422,7 +5422,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823CB98),
.party = {.NoItemDefaultMoves = sTrainerMons_823CB98}
},
[TRAINER_CHANNELER_EMILIA] = {
@@ -5434,7 +5434,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CBB0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CBB0}
},
[TRAINER_CHANNELER_JENNIFER] = {
@@ -5446,7 +5446,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CBB8),
.party = {.NoItemDefaultMoves = sTrainerMons_823CBB8}
},
[TRAINER_CHANNELER_1] = {
@@ -5458,7 +5458,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CBC0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CBC0}
},
[TRAINER_CHANNELER_2] = {
@@ -5470,7 +5470,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CBC8),
.party = {.NoItemDefaultMoves = sTrainerMons_823CBC8}
},
[TRAINER_CHANNELER_3] = {
@@ -5482,7 +5482,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CBD0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CBD0}
},
[TRAINER_CHANNELER_4] = {
@@ -5494,7 +5494,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CBD8),
.party = {.NoItemDefaultMoves = sTrainerMons_823CBD8}
},
[TRAINER_CHANNELER_5] = {
@@ -5506,7 +5506,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CBE0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CBE0}
},
[TRAINER_CHANNELER_6] = {
@@ -5518,7 +5518,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823CBE8),
.party = {.NoItemDefaultMoves = sTrainerMons_823CBE8}
},
[TRAINER_CHANNELER_7] = {
@@ -5530,7 +5530,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CC00),
.party = {.NoItemDefaultMoves = sTrainerMons_823CC00}
},
[TRAINER_CHANNELER_8] = {
@@ -5542,7 +5542,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CC08),
.party = {.NoItemDefaultMoves = sTrainerMons_823CC08}
},
[TRAINER_CHANNELER_AMANDA] = {
@@ -5554,7 +5554,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CC10),
.party = {.NoItemDefaultMoves = sTrainerMons_823CC10}
},
[TRAINER_CHANNELER_STACY] = {
@@ -5566,7 +5566,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CC20),
.party = {.NoItemDefaultMoves = sTrainerMons_823CC20}
},
[TRAINER_CHANNELER_TASHA] = {
@@ -5578,7 +5578,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823CC28),
.party = {.NoItemDefaultMoves = sTrainerMons_823CC28}
},
[TRAINER_HIKER_JEREMY] = {
@@ -5590,7 +5590,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CC40),
.party = {.NoItemDefaultMoves = sTrainerMons_823CC40}
},
[TRAINER_PICNICKER_ALMA] = {
@@ -5602,7 +5602,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823CC50),
.party = {.NoItemDefaultMoves = sTrainerMons_823CC50}
},
[TRAINER_PICNICKER_SUSIE] = {
@@ -5614,7 +5614,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823CC68),
.party = {.NoItemDefaultMoves = sTrainerMons_823CC68}
},
[TRAINER_PICNICKER_VALERIE] = {
@@ -5626,7 +5626,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CC90),
.party = {.NoItemDefaultMoves = sTrainerMons_823CC90}
},
[TRAINER_PICNICKER_GWEN] = {
@@ -5638,7 +5638,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823CCA0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CCA0}
},
[TRAINER_BIKER_VIRGIL] = {
@@ -5650,7 +5650,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823CCC0),
.party = {.NoItemCustomMoves = sTrainerMons_823CCC0}
},
[TRAINER_CAMPER_FLINT] = {
@@ -5662,7 +5662,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CCF0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CCF0}
},
[TRAINER_PICNICKER_MISSY] = {
@@ -5674,7 +5674,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CD00),
.party = {.NoItemDefaultMoves = sTrainerMons_823CD00}
},
[TRAINER_PICNICKER_IRENE] = {
@@ -5686,7 +5686,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823CD10),
.party = {.NoItemDefaultMoves = sTrainerMons_823CD10}
},
[TRAINER_PICNICKER_DANA] = {
@@ -5698,7 +5698,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823CD28),
.party = {.NoItemDefaultMoves = sTrainerMons_823CD28}
},
[TRAINER_PICNICKER_ARIANA] = {
@@ -5710,7 +5710,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823CD40),
.party = {.NoItemDefaultMoves = sTrainerMons_823CD40}
},
[TRAINER_PICNICKER_LEAH] = {
@@ -5722,7 +5722,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CD60),
.party = {.NoItemDefaultMoves = sTrainerMons_823CD60}
},
[TRAINER_CAMPER_JUSTIN] = {
@@ -5734,7 +5734,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CD70),
.party = {.NoItemDefaultMoves = sTrainerMons_823CD70}
},
[TRAINER_PICNICKER_YAZMIN] = {
@@ -5746,7 +5746,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823CD80),
.party = {.NoItemDefaultMoves = sTrainerMons_823CD80}
},
[TRAINER_PICNICKER_KINDRA] = {
@@ -5758,7 +5758,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823CD98),
.party = {.NoItemDefaultMoves = sTrainerMons_823CD98}
},
[TRAINER_PICNICKER_BECKY] = {
@@ -5770,7 +5770,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CDB0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CDB0}
},
[TRAINER_PICNICKER_CELIA] = {
@@ -5782,7 +5782,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CDC0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CDC0}
},
[TRAINER_GENTLEMAN_BROOKS] = {
@@ -5794,7 +5794,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CDC8),
.party = {.NoItemDefaultMoves = sTrainerMons_823CDC8}
},
[TRAINER_GENTLEMAN_LAMAR] = {
@@ -5806,7 +5806,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CDD0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CDD0}
},
[TRAINER_TWINS_ELI_ANNE] = {
@@ -5818,7 +5818,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CDE0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CDE0}
},
[TRAINER_COOL_COUPLE_RAY_TYRA] = {
@@ -5830,7 +5830,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CDF0),
.party = {.NoItemCustomMoves = sTrainerMons_823CDF0}
},
[TRAINER_YOUNG_COUPLE_GIA_JES] = {
@@ -5842,7 +5842,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CE10),
.party = {.NoItemDefaultMoves = sTrainerMons_823CE10}
},
[TRAINER_TWINS_KIRI_JAN] = {
@@ -5854,7 +5854,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CE20),
.party = {.NoItemDefaultMoves = sTrainerMons_823CE20}
},
[TRAINER_CRUSH_KIN_RON_MYA] = {
@@ -5866,7 +5866,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CE30),
.party = {.ItemDefaultMoves = sTrainerMons_823CE30}
},
[TRAINER_YOUNG_COUPLE_LEA_JED] = {
@@ -5878,7 +5878,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CE40),
.party = {.NoItemDefaultMoves = sTrainerMons_823CE40}
},
[TRAINER_SIS_AND_BRO_LIA_LUC] = {
@@ -5890,7 +5890,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CE50),
.party = {.NoItemDefaultMoves = sTrainerMons_823CE50}
},
[TRAINER_SIS_AND_BRO_LIL_IAN] = {
@@ -5902,7 +5902,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CE60),
.party = {.NoItemDefaultMoves = sTrainerMons_823CE60}
},
[TRAINER_BUG_CATCHER_3] = {
@@ -5914,7 +5914,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CE70),
.party = {.NoItemDefaultMoves = sTrainerMons_823CE70}
},
[TRAINER_BUG_CATCHER_4] = {
@@ -5926,7 +5926,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CE78),
.party = {.NoItemDefaultMoves = sTrainerMons_823CE78}
},
[TRAINER_BUG_CATCHER_5] = {
@@ -5938,7 +5938,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CE80),
.party = {.NoItemDefaultMoves = sTrainerMons_823CE80}
},
[TRAINER_BUG_CATCHER_6] = {
@@ -5950,7 +5950,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CE88),
.party = {.NoItemDefaultMoves = sTrainerMons_823CE88}
},
[TRAINER_BUG_CATCHER_7] = {
@@ -5962,7 +5962,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CE90),
.party = {.NoItemDefaultMoves = sTrainerMons_823CE90}
},
[TRAINER_BUG_CATCHER_8] = {
@@ -5974,7 +5974,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CE98),
.party = {.NoItemDefaultMoves = sTrainerMons_823CE98}
},
[TRAINER_YOUNGSTER_BEN_3] = {
@@ -5986,7 +5986,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CEA0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CEA0}
},
[TRAINER_YOUNGSTER_BEN_4] = {
@@ -5998,7 +5998,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CEB0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CEB0}
},
[TRAINER_YOUNGSTER_CHAD_2] = {
@@ -6010,7 +6010,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CEC0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CEC0}
},
[TRAINER_LASS_RELI_2] = {
@@ -6022,7 +6022,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CED0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CED0}
},
[TRAINER_LASS_RELI_3] = {
@@ -6034,7 +6034,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CEE0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CEE0}
},
[TRAINER_YOUNGSTER_TIMMY_2] = {
@@ -6046,7 +6046,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823CEF0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CEF0}
},
[TRAINER_YOUNGSTER_TIMMY_3] = {
@@ -6058,7 +6058,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823CF08),
.party = {.NoItemDefaultMoves = sTrainerMons_823CF08}
},
[TRAINER_YOUNGSTER_TIMMY_4] = {
@@ -6070,7 +6070,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823CF20),
.party = {.NoItemDefaultMoves = sTrainerMons_823CF20}
},
[TRAINER_YOUNGSTER_CHAD_3] = {
@@ -6082,7 +6082,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CF38),
.party = {.NoItemDefaultMoves = sTrainerMons_823CF38}
},
[TRAINER_LASS_JANICE_2] = {
@@ -6094,7 +6094,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CF48),
.party = {.NoItemDefaultMoves = sTrainerMons_823CF48}
},
[TRAINER_LASS_JANICE_3] = {
@@ -6106,7 +6106,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CF58),
.party = {.NoItemDefaultMoves = sTrainerMons_823CF58}
},
[TRAINER_YOUNGSTER_CHAD_4] = {
@@ -6118,7 +6118,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CF68),
.party = {.NoItemDefaultMoves = sTrainerMons_823CF68}
},
[TRAINER_HIKER_FRANKLIN_2] = {
@@ -6130,7 +6130,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CF78),
.party = {.NoItemDefaultMoves = sTrainerMons_823CF78}
},
[TRAINER_PKMN_PROF_PROF_OAK] = {
@@ -6142,7 +6142,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CF88),
.party = {.NoItemDefaultMoves = sTrainerMons_823CF88}
},
[TRAINER_PLAYER_BRENDAN] = {
@@ -6154,7 +6154,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CF90),
.party = {.NoItemDefaultMoves = sTrainerMons_823CF90}
},
[TRAINER_PLAYER_MAY] = {
@@ -6166,7 +6166,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CF98),
.party = {.NoItemDefaultMoves = sTrainerMons_823CF98}
},
[TRAINER_PLAYER_RED] = {
@@ -6178,7 +6178,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CFA0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CFA0}
},
[TRAINER_PLAYER_LEAF] = {
@@ -6190,7 +6190,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823CFA8),
.party = {.NoItemDefaultMoves = sTrainerMons_823CFA8}
},
[TRAINER_TEAM_ROCKET_GRUNT_42] = {
@@ -6202,7 +6202,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CFB0),
.party = {.NoItemDefaultMoves = sTrainerMons_823CFB0}
},
[TRAINER_PSYCHIC_JACLYN] = {
@@ -6214,7 +6214,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823CFC0),
.party = {.NoItemCustomMoves = sTrainerMons_823CFC0}
},
[TRAINER_CRUSH_GIRL_SHARON] = {
@@ -6226,7 +6226,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823CFF0),
.party = {.ItemDefaultMoves = sTrainerMons_823CFF0}
},
[TRAINER_TUBER_AMIRA] = {
@@ -6238,7 +6238,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D000),
.party = {.NoItemDefaultMoves = sTrainerMons_823D000}
},
[TRAINER_PKMN_BREEDER_ALIZE] = {
@@ -6250,7 +6250,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D018),
.party = {.NoItemDefaultMoves = sTrainerMons_823D018}
},
[TRAINER_PKMN_RANGER_NICOLAS] = {
@@ -6262,7 +6262,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D030),
.party = {.NoItemCustomMoves = sTrainerMons_823D030}
},
[TRAINER_PKMN_RANGER_MADELINE] = {
@@ -6274,7 +6274,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D050),
.party = {.NoItemCustomMoves = sTrainerMons_823D050}
},
[TRAINER_AROMA_LADY_NIKKI] = {
@@ -6286,7 +6286,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D070),
.party = {.NoItemDefaultMoves = sTrainerMons_823D070}
},
[TRAINER_RUIN_MANIAC_STANLY] = {
@@ -6298,7 +6298,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D080),
.party = {.NoItemDefaultMoves = sTrainerMons_823D080}
},
[TRAINER_LADY_JACKI] = {
@@ -6310,7 +6310,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D098),
.party = {.ItemDefaultMoves = sTrainerMons_823D098}
},
[TRAINER_PAINTER_DAISY] = {
@@ -6322,7 +6322,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D0A8),
.party = {.NoItemCustomMoves = sTrainerMons_823D0A8}
},
[TRAINER_BIKER_GOON] = {
@@ -6334,7 +6334,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D0B8),
.party = {.NoItemCustomMoves = sTrainerMons_823D0B8}
},
[TRAINER_BIKER_GOON_2] = {
@@ -6346,7 +6346,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D0D8),
.party = {.NoItemCustomMoves = sTrainerMons_823D0D8}
},
[TRAINER_BIKER_GOON_3] = {
@@ -6358,7 +6358,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D0E8),
.party = {.NoItemDefaultMoves = sTrainerMons_823D0E8}
},
[TRAINER_BIKER_2] = {
@@ -6370,7 +6370,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D0F0),
.party = {.NoItemDefaultMoves = sTrainerMons_823D0F0}
},
[TRAINER_BUG_CATCHER_ANTHONY] = {
@@ -6382,7 +6382,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D0F8),
.party = {.NoItemDefaultMoves = sTrainerMons_823D0F8}
},
[TRAINER_BUG_CATCHER_CHARLIE] = {
@@ -6394,7 +6394,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D108),
.party = {.NoItemDefaultMoves = sTrainerMons_823D108}
},
[TRAINER_TWINS_ELI_ANNE_2] = {
@@ -6406,7 +6406,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D120),
.party = {.NoItemDefaultMoves = sTrainerMons_823D120}
},
[TRAINER_YOUNGSTER_JOHNSON] = {
@@ -6418,7 +6418,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D130),
.party = {.NoItemDefaultMoves = sTrainerMons_823D130}
},
[TRAINER_BIKER_RICARDO] = {
@@ -6430,7 +6430,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D148),
.party = {.NoItemCustomMoves = sTrainerMons_823D148}
},
[TRAINER_BIKER_JAREN] = {
@@ -6442,7 +6442,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D178),
.party = {.NoItemDefaultMoves = sTrainerMons_823D178}
},
[TRAINER_TEAM_ROCKET_GRUNT_43] = {
@@ -6454,7 +6454,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D188),
.party = {.NoItemDefaultMoves = sTrainerMons_823D188}
},
[TRAINER_TEAM_ROCKET_GRUNT_44] = {
@@ -6466,7 +6466,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823D198),
.party = {.NoItemDefaultMoves = sTrainerMons_823D198}
},
[TRAINER_TEAM_ROCKET_GRUNT_45] = {
@@ -6478,7 +6478,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D1B8),
.party = {.NoItemDefaultMoves = sTrainerMons_823D1B8}
},
[TRAINER_TEAM_ROCKET_GRUNT_46] = {
@@ -6490,7 +6490,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D1D0),
.party = {.NoItemDefaultMoves = sTrainerMons_823D1D0}
},
[TRAINER_TEAM_ROCKET_GRUNT_47] = {
@@ -6502,7 +6502,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D1E8),
.party = {.NoItemDefaultMoves = sTrainerMons_823D1E8}
},
[TRAINER_TEAM_ROCKET_GRUNT_48] = {
@@ -6514,7 +6514,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D200),
.party = {.NoItemDefaultMoves = sTrainerMons_823D200}
},
[TRAINER_TEAM_ROCKET_ADMIN] = {
@@ -6526,7 +6526,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D210),
.party = {.NoItemCustomMoves = sTrainerMons_823D210}
},
[TRAINER_TEAM_ROCKET_ADMIN_2] = {
@@ -6538,7 +6538,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D240),
.party = {.NoItemCustomMoves = sTrainerMons_823D240}
},
[TRAINER_SCIENTIST_GIDEON] = {
@@ -6550,7 +6550,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823D270),
.party = {.NoItemCustomMoves = sTrainerMons_823D270}
},
[TRAINER_SWIMMER_FEMALE_AMARA] = {
@@ -6562,7 +6562,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D2C0),
.party = {.NoItemDefaultMoves = sTrainerMons_823D2C0}
},
[TRAINER_SWIMMER_FEMALE_MARIA] = {
@@ -6574,7 +6574,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D2D8),
.party = {.NoItemDefaultMoves = sTrainerMons_823D2D8}
},
[TRAINER_SWIMMER_FEMALE_ABIGAIL] = {
@@ -6586,7 +6586,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D2E8),
.party = {.NoItemDefaultMoves = sTrainerMons_823D2E8}
},
[TRAINER_SWIMMER_MALE_FINN] = {
@@ -6598,7 +6598,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D300),
.party = {.NoItemDefaultMoves = sTrainerMons_823D300}
},
[TRAINER_SWIMMER_MALE_GARRETT] = {
@@ -6610,7 +6610,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D308),
.party = {.NoItemDefaultMoves = sTrainerMons_823D308}
},
[TRAINER_FISHERMAN_TOMMY] = {
@@ -6622,7 +6622,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823D320),
.party = {.NoItemDefaultMoves = sTrainerMons_823D320}
},
[TRAINER_CRUSH_GIRL_TANYA] = {
@@ -6634,7 +6634,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D348),
.party = {.ItemDefaultMoves = sTrainerMons_823D348}
},
[TRAINER_BLACK_BELT_SHEA] = {
@@ -6646,7 +6646,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D358),
.party = {.ItemDefaultMoves = sTrainerMons_823D358}
},
[TRAINER_BLACK_BELT_HUGH] = {
@@ -6658,7 +6658,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D368),
.party = {.ItemDefaultMoves = sTrainerMons_823D368}
},
[TRAINER_CAMPER_BRYCE] = {
@@ -6670,7 +6670,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D378),
.party = {.NoItemDefaultMoves = sTrainerMons_823D378}
},
[TRAINER_PICNICKER_CLAIRE] = {
@@ -6682,7 +6682,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823D390),
.party = {.NoItemDefaultMoves = sTrainerMons_823D390}
},
[TRAINER_CRUSH_KIN_MIK_KIA] = {
@@ -6694,7 +6694,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D3B0),
.party = {.ItemDefaultMoves = sTrainerMons_823D3B0}
},
[TRAINER_AROMA_LADY_VIOLET] = {
@@ -6706,7 +6706,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D3C0),
.party = {.NoItemDefaultMoves = sTrainerMons_823D3C0}
},
[TRAINER_TUBER_ALEXIS] = {
@@ -6718,7 +6718,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823D3D8),
.party = {.NoItemDefaultMoves = sTrainerMons_823D3D8}
},
[TRAINER_TWINS_JOY_MEG] = {
@@ -6730,7 +6730,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D3F8),
.party = {.NoItemDefaultMoves = sTrainerMons_823D3F8}
},
[TRAINER_SWIMMER_FEMALE_TISHA] = {
@@ -6742,7 +6742,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D408),
.party = {.NoItemDefaultMoves = sTrainerMons_823D408}
},
[TRAINER_PAINTER_CELINA] = {
@@ -6754,7 +6754,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D410),
.party = {.NoItemCustomMoves = sTrainerMons_823D410}
},
[TRAINER_PAINTER_RAYNA] = {
@@ -6766,7 +6766,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D420),
.party = {.NoItemCustomMoves = sTrainerMons_823D420}
},
[TRAINER_LADY_GILLIAN] = {
@@ -6778,7 +6778,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D430),
.party = {.ItemDefaultMoves = sTrainerMons_823D430}
},
[TRAINER_YOUNGSTER_DESTIN] = {
@@ -6790,7 +6790,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D448),
.party = {.NoItemDefaultMoves = sTrainerMons_823D448}
},
[TRAINER_SWIMMER_MALE_TOBY] = {
@@ -6802,7 +6802,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D458),
.party = {.NoItemDefaultMoves = sTrainerMons_823D458}
},
[TRAINER_TEAM_ROCKET_GRUNT_49] = {
@@ -6814,7 +6814,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D470),
.party = {.NoItemDefaultMoves = sTrainerMons_823D470}
},
[TRAINER_TEAM_ROCKET_GRUNT_50] = {
@@ -6826,7 +6826,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D488),
.party = {.NoItemCustomMoves = sTrainerMons_823D488}
},
[TRAINER_TEAM_ROCKET_GRUNT_51] = {
@@ -6838,7 +6838,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D4A8),
.party = {.NoItemDefaultMoves = sTrainerMons_823D4A8}
},
[TRAINER_BIRD_KEEPER_MILO] = {
@@ -6850,7 +6850,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D4C0),
.party = {.NoItemDefaultMoves = sTrainerMons_823D4C0}
},
[TRAINER_BIRD_KEEPER_CHAZ] = {
@@ -6862,7 +6862,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D4D0),
.party = {.NoItemDefaultMoves = sTrainerMons_823D4D0}
},
[TRAINER_BIRD_KEEPER_HAROLD] = {
@@ -6874,7 +6874,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D4E0),
.party = {.NoItemDefaultMoves = sTrainerMons_823D4E0}
},
[TRAINER_FISHERMAN_TYLOR] = {
@@ -6886,7 +6886,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D4F0),
.party = {.NoItemDefaultMoves = sTrainerMons_823D4F0}
},
[TRAINER_SWIMMER_MALE_MYMO] = {
@@ -6898,7 +6898,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D500),
.party = {.NoItemDefaultMoves = sTrainerMons_823D500}
},
[TRAINER_SWIMMER_FEMALE_NICOLE] = {
@@ -6910,7 +6910,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D510),
.party = {.NoItemDefaultMoves = sTrainerMons_823D510}
},
[TRAINER_SIS_AND_BRO_AVA_GEB] = {
@@ -6922,7 +6922,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D518),
.party = {.NoItemDefaultMoves = sTrainerMons_823D518}
},
[TRAINER_AROMA_LADY_ROSE] = {
@@ -6934,7 +6934,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D528),
.party = {.NoItemDefaultMoves = sTrainerMons_823D528}
},
[TRAINER_SWIMMER_MALE_SAMIR] = {
@@ -6946,7 +6946,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D538),
.party = {.NoItemDefaultMoves = sTrainerMons_823D538}
},
[TRAINER_SWIMMER_FEMALE_DENISE] = {
@@ -6958,7 +6958,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D540),
.party = {.NoItemDefaultMoves = sTrainerMons_823D540}
},
[TRAINER_TWINS_MIU_MIA] = {
@@ -6970,7 +6970,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D550),
.party = {.NoItemDefaultMoves = sTrainerMons_823D550}
},
[TRAINER_HIKER_EARL] = {
@@ -6982,7 +6982,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D560),
.party = {.NoItemDefaultMoves = sTrainerMons_823D560}
},
[TRAINER_RUIN_MANIAC_FOSTER] = {
@@ -6994,7 +6994,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D570),
.party = {.NoItemDefaultMoves = sTrainerMons_823D570}
},
[TRAINER_RUIN_MANIAC_LARRY] = {
@@ -7006,7 +7006,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D578),
.party = {.NoItemDefaultMoves = sTrainerMons_823D578}
},
[TRAINER_HIKER_DARYL] = {
@@ -7018,7 +7018,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D588),
.party = {.NoItemDefaultMoves = sTrainerMons_823D588}
},
[TRAINER_POKEMANIAC_HECTOR] = {
@@ -7030,7 +7030,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D590),
.party = {.NoItemDefaultMoves = sTrainerMons_823D590}
},
[TRAINER_PSYCHIC_DARIO] = {
@@ -7042,7 +7042,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D5A0),
.party = {.NoItemCustomMoves = sTrainerMons_823D5A0}
},
[TRAINER_PSYCHIC_RODETTE] = {
@@ -7054,7 +7054,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D5B0),
.party = {.NoItemCustomMoves = sTrainerMons_823D5B0}
},
[TRAINER_AROMA_LADY_MIAH] = {
@@ -7066,7 +7066,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D5E0),
.party = {.NoItemDefaultMoves = sTrainerMons_823D5E0}
},
[TRAINER_YOUNG_COUPLE_EVE_JON] = {
@@ -7078,7 +7078,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D5F0),
.party = {.NoItemDefaultMoves = sTrainerMons_823D5F0}
},
[TRAINER_JUGGLER_MASON] = {
@@ -7090,7 +7090,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823D600),
.party = {.NoItemCustomMoves = sTrainerMons_823D600}
},
[TRAINER_CRUSH_GIRL_CYNDY] = {
@@ -7102,7 +7102,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D640),
.party = {.ItemDefaultMoves = sTrainerMons_823D640}
},
[TRAINER_CRUSH_GIRL_JOCELYN] = {
@@ -7114,7 +7114,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D658),
.party = {.ItemDefaultMoves = sTrainerMons_823D658}
},
[TRAINER_TAMER_EVAN] = {
@@ -7126,7 +7126,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D668),
.party = {.NoItemDefaultMoves = sTrainerMons_823D668}
},
[TRAINER_POKEMANIAC_MARK_2] = {
@@ -7138,7 +7138,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D680),
.party = {.NoItemDefaultMoves = sTrainerMons_823D680}
},
[TRAINER_PKMN_RANGER_LOGAN] = {
@@ -7150,7 +7150,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D690),
.party = {.NoItemCustomMoves = sTrainerMons_823D690}
},
[TRAINER_PKMN_RANGER_JACKSON] = {
@@ -7162,7 +7162,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D6B0),
.party = {.NoItemCustomMoves = sTrainerMons_823D6B0}
},
[TRAINER_PKMN_RANGER_BETH] = {
@@ -7174,7 +7174,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D6E0),
.party = {.NoItemDefaultMoves = sTrainerMons_823D6E0}
},
[TRAINER_PKMN_RANGER_KATELYN] = {
@@ -7186,7 +7186,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D6F8),
.party = {.NoItemCustomMoves = sTrainerMons_823D6F8}
},
[TRAINER_COOLTRAINER_LEROY] = {
@@ -7198,7 +7198,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823D708),
.party = {.NoItemCustomMoves = sTrainerMons_823D708}
},
[TRAINER_COOLTRAINER_MICHELLE] = {
@@ -7210,7 +7210,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823D758),
.party = {.NoItemCustomMoves = sTrainerMons_823D758}
},
[TRAINER_COOL_COUPLE_LEX_NYA] = {
@@ -7222,7 +7222,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D7A8),
.party = {.NoItemCustomMoves = sTrainerMons_823D7A8}
},
[TRAINER_RUIN_MANIAC_BRANDON] = {
@@ -7234,7 +7234,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D7C8),
.party = {.NoItemDefaultMoves = sTrainerMons_823D7C8}
},
[TRAINER_RUIN_MANIAC_BENJAMIN] = {
@@ -7246,7 +7246,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D7D0),
.party = {.NoItemCustomMoves = sTrainerMons_823D7D0}
},
[TRAINER_PAINTER_EDNA] = {
@@ -7258,7 +7258,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D800),
.party = {.NoItemCustomMoves = sTrainerMons_823D800}
},
[TRAINER_GENTLEMAN_CLIFFORD] = {
@@ -7270,7 +7270,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D810),
.party = {.NoItemDefaultMoves = sTrainerMons_823D810}
},
[TRAINER_LADY_SELPHY] = {
@@ -7282,7 +7282,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D820),
.party = {.ItemCustomMoves = sTrainerMons_823D820}
},
[TRAINER_RUIN_MANIAC_LAWSON] = {
@@ -7294,7 +7294,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D840),
.party = {.NoItemDefaultMoves = sTrainerMons_823D840}
},
[TRAINER_PSYCHIC_LAURA] = {
@@ -7306,7 +7306,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D858),
.party = {.NoItemDefaultMoves = sTrainerMons_823D858}
},
[TRAINER_PKMN_BREEDER_BETHANY] = {
@@ -7318,7 +7318,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D870),
.party = {.NoItemDefaultMoves = sTrainerMons_823D870}
},
[TRAINER_PKMN_BREEDER_ALLISON] = {
@@ -7330,7 +7330,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D878),
.party = {.NoItemDefaultMoves = sTrainerMons_823D878}
},
[TRAINER_BUG_CATCHER_GARRET] = {
@@ -7342,7 +7342,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D890),
.party = {.NoItemDefaultMoves = sTrainerMons_823D890}
},
[TRAINER_BUG_CATCHER_JONAH] = {
@@ -7354,7 +7354,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823D898),
.party = {.NoItemDefaultMoves = sTrainerMons_823D898}
},
[TRAINER_BUG_CATCHER_VANCE] = {
@@ -7366,7 +7366,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D8B8),
.party = {.NoItemDefaultMoves = sTrainerMons_823D8B8}
},
[TRAINER_YOUNGSTER_NASH] = {
@@ -7378,7 +7378,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D8C8),
.party = {.NoItemDefaultMoves = sTrainerMons_823D8C8}
},
[TRAINER_YOUNGSTER_CORDELL] = {
@@ -7390,7 +7390,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D8E0),
.party = {.NoItemDefaultMoves = sTrainerMons_823D8E0}
},
[TRAINER_LASS_DALIA] = {
@@ -7402,7 +7402,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823D8F0),
.party = {.NoItemDefaultMoves = sTrainerMons_823D8F0}
},
[TRAINER_LASS_JOANA] = {
@@ -7414,7 +7414,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D910),
.party = {.NoItemDefaultMoves = sTrainerMons_823D910}
},
[TRAINER_CAMPER_RILEY] = {
@@ -7426,7 +7426,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D918),
.party = {.NoItemDefaultMoves = sTrainerMons_823D918}
},
[TRAINER_PICNICKER_MARCY] = {
@@ -7438,7 +7438,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D928),
.party = {.NoItemDefaultMoves = sTrainerMons_823D928}
},
[TRAINER_RUIN_MANIAC_LAYTON] = {
@@ -7450,7 +7450,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D940),
.party = {.NoItemDefaultMoves = sTrainerMons_823D940}
},
[TRAINER_PICNICKER_KELSEY_2] = {
@@ -7462,7 +7462,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D958),
.party = {.NoItemDefaultMoves = sTrainerMons_823D958}
},
[TRAINER_PICNICKER_KELSEY_3] = {
@@ -7474,7 +7474,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D968),
.party = {.NoItemDefaultMoves = sTrainerMons_823D968}
},
[TRAINER_PICNICKER_KELSEY_4] = {
@@ -7486,7 +7486,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D978),
.party = {.NoItemDefaultMoves = sTrainerMons_823D978}
},
[TRAINER_CAMPER_RICKY_2] = {
@@ -7498,7 +7498,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D988),
.party = {.NoItemDefaultMoves = sTrainerMons_823D988}
},
[TRAINER_CAMPER_RICKY_3] = {
@@ -7510,7 +7510,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D990),
.party = {.NoItemDefaultMoves = sTrainerMons_823D990}
},
[TRAINER_CAMPER_RICKY_4] = {
@@ -7522,7 +7522,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823D998),
.party = {.NoItemDefaultMoves = sTrainerMons_823D998}
},
[TRAINER_CAMPER_JEFF_2] = {
@@ -7534,7 +7534,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D9A0),
.party = {.NoItemDefaultMoves = sTrainerMons_823D9A0}
},
[TRAINER_CAMPER_JEFF_3] = {
@@ -7546,7 +7546,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D9B0),
.party = {.NoItemDefaultMoves = sTrainerMons_823D9B0}
},
[TRAINER_CAMPER_JEFF_4] = {
@@ -7558,7 +7558,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823D9C0),
.party = {.NoItemDefaultMoves = sTrainerMons_823D9C0}
},
[TRAINER_PICNICKER_ISABELLE_2] = {
@@ -7570,7 +7570,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D9D0),
.party = {.NoItemDefaultMoves = sTrainerMons_823D9D0}
},
[TRAINER_PICNICKER_ISABELLE_3] = {
@@ -7582,7 +7582,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823D9E8),
.party = {.NoItemDefaultMoves = sTrainerMons_823D9E8}
},
[TRAINER_PICNICKER_ISABELLE_4] = {
@@ -7594,7 +7594,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823DA00),
.party = {.NoItemDefaultMoves = sTrainerMons_823DA00}
},
[TRAINER_YOUNGSTER_YASU_2] = {
@@ -7606,7 +7606,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823DA18),
.party = {.NoItemDefaultMoves = sTrainerMons_823DA18}
},
[TRAINER_YOUNGSTER_YASU_3] = {
@@ -7618,7 +7618,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823DA30),
.party = {.NoItemDefaultMoves = sTrainerMons_823DA30}
},
[TRAINER_ENGINEER_BERNIE_2] = {
@@ -7630,7 +7630,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823DA48),
.party = {.NoItemDefaultMoves = sTrainerMons_823DA48}
},
[TRAINER_GAMER_DARIAN_2] = {
@@ -7642,7 +7642,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DA60),
.party = {.NoItemDefaultMoves = sTrainerMons_823DA60}
},
[TRAINER_CAMPER_CHRIS_2] = {
@@ -7654,7 +7654,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DA70),
.party = {.NoItemDefaultMoves = sTrainerMons_823DA70}
},
[TRAINER_CAMPER_CHRIS_3] = {
@@ -7666,7 +7666,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DA80),
.party = {.NoItemDefaultMoves = sTrainerMons_823DA80}
},
[TRAINER_CAMPER_CHRIS_4] = {
@@ -7678,7 +7678,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DA90),
.party = {.NoItemDefaultMoves = sTrainerMons_823DA90}
},
[TRAINER_PICNICKER_ALICIA_2] = {
@@ -7690,7 +7690,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823DAA0),
.party = {.NoItemDefaultMoves = sTrainerMons_823DAA0}
},
[TRAINER_PICNICKER_ALICIA_3] = {
@@ -7702,7 +7702,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823DAA8),
.party = {.NoItemDefaultMoves = sTrainerMons_823DAA8}
},
[TRAINER_PICNICKER_ALICIA_4] = {
@@ -7714,7 +7714,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823DAB0),
.party = {.NoItemDefaultMoves = sTrainerMons_823DAB0}
},
[TRAINER_HIKER_JEREMY_2] = {
@@ -7726,7 +7726,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DAB8),
.party = {.NoItemDefaultMoves = sTrainerMons_823DAB8}
},
[TRAINER_POKEMANIAC_MARK_3] = {
@@ -7738,7 +7738,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DAC8),
.party = {.NoItemDefaultMoves = sTrainerMons_823DAC8}
},
[TRAINER_POKEMANIAC_HERMAN_2] = {
@@ -7750,7 +7750,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DAD8),
.party = {.NoItemDefaultMoves = sTrainerMons_823DAD8}
},
[TRAINER_POKEMANIAC_HERMAN_3] = {
@@ -7762,7 +7762,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DAE8),
.party = {.NoItemDefaultMoves = sTrainerMons_823DAE8}
},
[TRAINER_HIKER_TRENT_2] = {
@@ -7774,7 +7774,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DAF8),
.party = {.NoItemDefaultMoves = sTrainerMons_823DAF8}
},
[TRAINER_LASS_MEGAN_2] = {
@@ -7786,7 +7786,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823DB08),
.party = {.NoItemDefaultMoves = sTrainerMons_823DB08}
},
[TRAINER_LASS_MEGAN_3] = {
@@ -7798,7 +7798,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823DB30),
.party = {.NoItemDefaultMoves = sTrainerMons_823DB30}
},
[TRAINER_SUPER_NERD_GLENN_2] = {
@@ -7810,7 +7810,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823DB58),
.party = {.NoItemDefaultMoves = sTrainerMons_823DB58}
},
[TRAINER_GAMER_RICH_2] = {
@@ -7822,7 +7822,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DB70),
.party = {.NoItemDefaultMoves = sTrainerMons_823DB70}
},
[TRAINER_BIKER_JAREN_2] = {
@@ -7834,7 +7834,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DB80),
.party = {.NoItemDefaultMoves = sTrainerMons_823DB80}
},
[TRAINER_FISHERMAN_ELLIOT_2] = {
@@ -7846,7 +7846,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823DB90),
.party = {.NoItemDefaultMoves = sTrainerMons_823DB90}
},
[TRAINER_ROCKER_LUCA_2] = {
@@ -7858,7 +7858,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DBB0),
.party = {.NoItemDefaultMoves = sTrainerMons_823DBB0}
},
[TRAINER_BEAUTY_SHEILA_2] = {
@@ -7870,7 +7870,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DBC0),
.party = {.NoItemDefaultMoves = sTrainerMons_823DBC0}
},
[TRAINER_BIRD_KEEPER_ROBERT_2] = {
@@ -7882,7 +7882,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823DBD0),
.party = {.NoItemDefaultMoves = sTrainerMons_823DBD0}
},
[TRAINER_BIRD_KEEPER_ROBERT_3] = {
@@ -7894,7 +7894,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823DBF0),
.party = {.NoItemDefaultMoves = sTrainerMons_823DBF0}
},
[TRAINER_PICNICKER_SUSIE_2] = {
@@ -7906,7 +7906,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823DC10),
.party = {.NoItemDefaultMoves = sTrainerMons_823DC10}
},
[TRAINER_PICNICKER_SUSIE_3] = {
@@ -7918,7 +7918,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823DC38),
.party = {.NoItemDefaultMoves = sTrainerMons_823DC38}
},
[TRAINER_PICNICKER_SUSIE_4] = {
@@ -7930,7 +7930,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823DC60),
.party = {.NoItemDefaultMoves = sTrainerMons_823DC60}
},
[TRAINER_BIKER_LUKAS_2] = {
@@ -7942,7 +7942,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823DC88),
.party = {.NoItemDefaultMoves = sTrainerMons_823DC88}
},
[TRAINER_BIRD_KEEPER_BENNY_2] = {
@@ -7954,7 +7954,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DCA8),
.party = {.NoItemDefaultMoves = sTrainerMons_823DCA8}
},
[TRAINER_BIRD_KEEPER_BENNY_3] = {
@@ -7966,7 +7966,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DCB8),
.party = {.NoItemDefaultMoves = sTrainerMons_823DCB8}
},
[TRAINER_BIRD_KEEPER_MARLON_2] = {
@@ -7978,7 +7978,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823DCC8),
.party = {.NoItemDefaultMoves = sTrainerMons_823DCC8}
},
[TRAINER_BIRD_KEEPER_MARLON_3] = {
@@ -7990,7 +7990,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823DCE0),
.party = {.NoItemDefaultMoves = sTrainerMons_823DCE0}
},
[TRAINER_BEAUTY_GRACE_2] = {
@@ -8002,7 +8002,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DCF8),
.party = {.NoItemDefaultMoves = sTrainerMons_823DCF8}
},
[TRAINER_BIRD_KEEPER_CHESTER_2] = {
@@ -8014,7 +8014,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823DD08),
.party = {.NoItemDefaultMoves = sTrainerMons_823DD08}
},
[TRAINER_BIRD_KEEPER_CHESTER_3] = {
@@ -8026,7 +8026,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823DD20),
.party = {.NoItemDefaultMoves = sTrainerMons_823DD20}
},
[TRAINER_PICNICKER_BECKY_2] = {
@@ -8038,7 +8038,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DD38),
.party = {.NoItemDefaultMoves = sTrainerMons_823DD38}
},
[TRAINER_PICNICKER_BECKY_3] = {
@@ -8050,7 +8050,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DD48),
.party = {.NoItemDefaultMoves = sTrainerMons_823DD48}
},
[TRAINER_PICNICKER_BECKY_4] = {
@@ -8062,7 +8062,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DD58),
.party = {.NoItemDefaultMoves = sTrainerMons_823DD58}
},
[TRAINER_CRUSH_KIN_RON_MYA_2] = {
@@ -8074,7 +8074,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DD68),
.party = {.ItemDefaultMoves = sTrainerMons_823DD68}
},
[TRAINER_CRUSH_KIN_RON_MYA_3] = {
@@ -8086,7 +8086,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DD78),
.party = {.ItemDefaultMoves = sTrainerMons_823DD78}
},
[TRAINER_CRUSH_KIN_RON_MYA_4] = {
@@ -8098,7 +8098,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DD88),
.party = {.ItemDefaultMoves = sTrainerMons_823DD88}
},
[TRAINER_BIKER_RUBEN_2] = {
@@ -8110,7 +8110,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823DD98),
.party = {.NoItemDefaultMoves = sTrainerMons_823DD98}
},
[TRAINER_CUE_BALL_CAMRON_2] = {
@@ -8122,7 +8122,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DDB0),
.party = {.NoItemDefaultMoves = sTrainerMons_823DDB0}
},
[TRAINER_BIKER_JAXON_2] = {
@@ -8134,7 +8134,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DDC0),
.party = {.NoItemDefaultMoves = sTrainerMons_823DDC0}
},
[TRAINER_CUE_BALL_ISAIAH_2] = {
@@ -8146,7 +8146,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DDD0),
.party = {.NoItemDefaultMoves = sTrainerMons_823DDD0}
},
[TRAINER_CUE_BALL_COREY_2] = {
@@ -8158,7 +8158,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DDE0),
.party = {.NoItemDefaultMoves = sTrainerMons_823DDE0}
},
[TRAINER_BIRD_KEEPER_JACOB_2] = {
@@ -8170,7 +8170,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823DDF0),
.party = {.NoItemDefaultMoves = sTrainerMons_823DDF0}
},
[TRAINER_BIRD_KEEPER_JACOB_3] = {
@@ -8182,7 +8182,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823DE10),
.party = {.NoItemDefaultMoves = sTrainerMons_823DE10}
},
[TRAINER_SWIMMER_FEMALE_ALICE_2] = {
@@ -8194,7 +8194,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DE30),
.party = {.NoItemDefaultMoves = sTrainerMons_823DE30}
},
[TRAINER_SWIMMER_MALE_DARRIN_2] = {
@@ -8206,7 +8206,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823DE40),
.party = {.NoItemDefaultMoves = sTrainerMons_823DE40}
},
[TRAINER_PICNICKER_MISSY_2] = {
@@ -8218,7 +8218,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DE60),
.party = {.NoItemDefaultMoves = sTrainerMons_823DE60}
},
[TRAINER_PICNICKER_MISSY_3] = {
@@ -8230,7 +8230,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DE70),
.party = {.NoItemDefaultMoves = sTrainerMons_823DE70}
},
[TRAINER_FISHERMAN_WADE_2] = {
@@ -8242,7 +8242,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 6,
+ .partySize = NELEMS(sTrainerMons_823DE80),
.party = {.NoItemDefaultMoves = sTrainerMons_823DE80}
},
[TRAINER_SWIMMER_MALE_JACK_2] = {
@@ -8254,7 +8254,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823DEB0),
.party = {.NoItemDefaultMoves = sTrainerMons_823DEB0}
},
[TRAINER_SIS_AND_BRO_LIL_IAN_2] = {
@@ -8266,7 +8266,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DEB8),
.party = {.NoItemDefaultMoves = sTrainerMons_823DEB8}
},
[TRAINER_SIS_AND_BRO_LIL_IAN_3] = {
@@ -8278,7 +8278,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DEC8),
.party = {.NoItemDefaultMoves = sTrainerMons_823DEC8}
},
[TRAINER_SWIMMER_MALE_FINN_2] = {
@@ -8290,7 +8290,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823DED8),
.party = {.NoItemDefaultMoves = sTrainerMons_823DED8}
},
[TRAINER_CRUSH_GIRL_SHARON_2] = {
@@ -8302,7 +8302,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DEE0),
.party = {.ItemDefaultMoves = sTrainerMons_823DEE0}
},
[TRAINER_CRUSH_GIRL_SHARON_3] = {
@@ -8314,7 +8314,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DEF0),
.party = {.ItemDefaultMoves = sTrainerMons_823DEF0}
},
[TRAINER_CRUSH_GIRL_TANYA_2] = {
@@ -8326,7 +8326,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DF00),
.party = {.ItemDefaultMoves = sTrainerMons_823DF00}
},
[TRAINER_CRUSH_GIRL_TANYA_3] = {
@@ -8338,7 +8338,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DF10),
.party = {.ItemDefaultMoves = sTrainerMons_823DF10}
},
[TRAINER_BLACK_BELT_SHEA_2] = {
@@ -8350,7 +8350,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DF20),
.party = {.ItemDefaultMoves = sTrainerMons_823DF20}
},
[TRAINER_BLACK_BELT_SHEA_3] = {
@@ -8362,7 +8362,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DF30),
.party = {.ItemDefaultMoves = sTrainerMons_823DF30}
},
[TRAINER_BLACK_BELT_HUGH_2] = {
@@ -8374,7 +8374,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DF40),
.party = {.ItemDefaultMoves = sTrainerMons_823DF40}
},
[TRAINER_BLACK_BELT_HUGH_3] = {
@@ -8386,7 +8386,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DF50),
.party = {.ItemDefaultMoves = sTrainerMons_823DF50}
},
[TRAINER_CRUSH_KIN_MIK_KIA_2] = {
@@ -8398,7 +8398,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DF60),
.party = {.ItemDefaultMoves = sTrainerMons_823DF60}
},
[TRAINER_CRUSH_KIN_MIK_KIA_3] = {
@@ -8410,7 +8410,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DF70),
.party = {.ItemDefaultMoves = sTrainerMons_823DF70}
},
[TRAINER_TUBER_AMIRA_2] = {
@@ -8422,7 +8422,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823DF80),
.party = {.NoItemDefaultMoves = sTrainerMons_823DF80}
},
[TRAINER_TWINS_JOY_MEG_2] = {
@@ -8434,7 +8434,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DF98),
.party = {.NoItemDefaultMoves = sTrainerMons_823DF98}
},
[TRAINER_PAINTER_RAYNA_2] = {
@@ -8446,7 +8446,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823DFA8),
.party = {.NoItemCustomMoves = sTrainerMons_823DFA8}
},
[TRAINER_YOUNGSTER_DESTIN_2] = {
@@ -8458,7 +8458,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DFB8),
.party = {.NoItemDefaultMoves = sTrainerMons_823DFB8}
},
[TRAINER_PKMN_BREEDER_ALIZE_2] = {
@@ -8470,7 +8470,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823DFC8),
.party = {.NoItemDefaultMoves = sTrainerMons_823DFC8}
},
[TRAINER_YOUNG_COUPLE_GIA_JES_2] = {
@@ -8482,7 +8482,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DFE0),
.party = {.NoItemDefaultMoves = sTrainerMons_823DFE0}
},
[TRAINER_YOUNG_COUPLE_GIA_JES_3] = {
@@ -8494,7 +8494,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823DFF0),
.party = {.NoItemDefaultMoves = sTrainerMons_823DFF0}
},
[TRAINER_BIRD_KEEPER_MILO_2] = {
@@ -8506,7 +8506,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823E000),
.party = {.NoItemDefaultMoves = sTrainerMons_823E000}
},
[TRAINER_BIRD_KEEPER_CHAZ_2] = {
@@ -8518,7 +8518,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823E010),
.party = {.NoItemDefaultMoves = sTrainerMons_823E010}
},
[TRAINER_BIRD_KEEPER_HAROLD_2] = {
@@ -8530,7 +8530,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823E020),
.party = {.NoItemDefaultMoves = sTrainerMons_823E020}
},
[TRAINER_SWIMMER_FEMALE_NICOLE_2] = {
@@ -8542,7 +8542,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823E030),
.party = {.NoItemDefaultMoves = sTrainerMons_823E030}
},
[TRAINER_PSYCHIC_JACLYN_2] = {
@@ -8554,7 +8554,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823E038),
.party = {.NoItemCustomMoves = sTrainerMons_823E038}
},
[TRAINER_SWIMMER_MALE_SAMIR_2] = {
@@ -8566,7 +8566,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823E068),
.party = {.NoItemDefaultMoves = sTrainerMons_823E068}
},
[TRAINER_HIKER_EARL_2] = {
@@ -8578,7 +8578,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823E070),
.party = {.NoItemDefaultMoves = sTrainerMons_823E070}
},
[TRAINER_RUIN_MANIAC_LARRY_2] = {
@@ -8590,7 +8590,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823E080),
.party = {.NoItemDefaultMoves = sTrainerMons_823E080}
},
[TRAINER_POKEMANIAC_HECTOR_2] = {
@@ -8602,7 +8602,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823E090),
.party = {.NoItemDefaultMoves = sTrainerMons_823E090}
},
[TRAINER_PSYCHIC_DARIO_2] = {
@@ -8614,7 +8614,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823E0A0),
.party = {.NoItemCustomMoves = sTrainerMons_823E0A0}
},
[TRAINER_PSYCHIC_RODETTE_2] = {
@@ -8626,7 +8626,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823E0B0),
.party = {.NoItemCustomMoves = sTrainerMons_823E0B0}
},
[TRAINER_JUGGLER_MASON_2] = {
@@ -8638,7 +8638,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 4,
+ .partySize = NELEMS(sTrainerMons_823E0E0),
.party = {.NoItemDefaultMoves = sTrainerMons_823E0E0}
},
[TRAINER_PKMN_RANGER_NICOLAS_2] = {
@@ -8650,7 +8650,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823E100),
.party = {.NoItemCustomMoves = sTrainerMons_823E100}
},
[TRAINER_PKMN_RANGER_MADELINE_2] = {
@@ -8662,7 +8662,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823E120),
.party = {.NoItemCustomMoves = sTrainerMons_823E120}
},
[TRAINER_CRUSH_GIRL_CYNDY_2] = {
@@ -8674,7 +8674,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823E140),
.party = {.ItemDefaultMoves = sTrainerMons_823E140}
},
[TRAINER_TAMER_EVAN_2] = {
@@ -8686,7 +8686,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823E158),
.party = {.NoItemDefaultMoves = sTrainerMons_823E158}
},
[TRAINER_PKMN_RANGER_JACKSON_2] = {
@@ -8698,7 +8698,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823E170),
.party = {.NoItemCustomMoves = sTrainerMons_823E170}
},
[TRAINER_PKMN_RANGER_KATELYN_2] = {
@@ -8710,7 +8710,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 1,
+ .partySize = NELEMS(sTrainerMons_823E1A0),
.party = {.NoItemCustomMoves = sTrainerMons_823E1A0}
},
[TRAINER_COOLTRAINER_LEROY_2] = {
@@ -8722,7 +8722,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823E1B0),
.party = {.NoItemCustomMoves = sTrainerMons_823E1B0}
},
[TRAINER_COOLTRAINER_MICHELLE_2] = {
@@ -8734,7 +8734,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_HYPER_POTION},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823E200),
.party = {.NoItemCustomMoves = sTrainerMons_823E200}
},
[TRAINER_COOL_COUPLE_LEX_NYA_2] = {
@@ -8746,7 +8746,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
.doubleBattle = TRUE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823E250),
.party = {.NoItemCustomMoves = sTrainerMons_823E250}
},
[TRAINER_BUG_CATCHER_COLTON_2] = {
@@ -8758,7 +8758,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823E270),
.party = {.NoItemDefaultMoves = sTrainerMons_823E270}
},
[TRAINER_BUG_CATCHER_COLTON_3] = {
@@ -8770,7 +8770,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823E288),
.party = {.NoItemDefaultMoves = sTrainerMons_823E288}
},
[TRAINER_BUG_CATCHER_COLTON_4] = {
@@ -8782,7 +8782,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 3,
+ .partySize = NELEMS(sTrainerMons_823E2A0),
.party = {.NoItemDefaultMoves = sTrainerMons_823E2A0}
},
[TRAINER_SWIMMER_MALE_MATTHEW_2] = {
@@ -8794,7 +8794,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823E2B8),
.party = {.NoItemDefaultMoves = sTrainerMons_823E2B8}
},
[TRAINER_SWIMMER_MALE_TONY_2] = {
@@ -8806,7 +8806,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823E2C8),
.party = {.NoItemDefaultMoves = sTrainerMons_823E2C8}
},
[TRAINER_SWIMMER_FEMALE_MELISSA_2] = {
@@ -8818,7 +8818,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823E2D8),
.party = {.NoItemDefaultMoves = sTrainerMons_823E2D8}
},
[TRAINER_ELITE_FOUR_LORELEI_2] = {
@@ -8830,7 +8830,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823E2E8),
.party = {.ItemCustomMoves = sTrainerMons_823E2E8}
},
[TRAINER_ELITE_FOUR_BRUNO_2] = {
@@ -8842,7 +8842,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823E338),
.party = {.ItemCustomMoves = sTrainerMons_823E338}
},
[TRAINER_ELITE_FOUR_AGATHA_2] = {
@@ -8854,7 +8854,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823E388),
.party = {.ItemCustomMoves = sTrainerMons_823E388}
},
[TRAINER_ELITE_FOUR_LANCE_2] = {
@@ -8866,7 +8866,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 5,
+ .partySize = NELEMS(sTrainerMons_823E3D8),
.party = {.ItemCustomMoves = sTrainerMons_823E3D8}
},
[TRAINER_CHAMPION_REMATCH_SQUIRTLE] = {
@@ -8878,7 +8878,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 6,
+ .partySize = NELEMS(sTrainerMons_823E428),
.party = {.ItemCustomMoves = sTrainerMons_823E428}
},
[TRAINER_CHAMPION_REMATCH_BULBASAUR] = {
@@ -8890,7 +8890,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 6,
+ .partySize = NELEMS(sTrainerMons_823E488),
.party = {.ItemCustomMoves = sTrainerMons_823E488}
},
[TRAINER_CHAMPION_REMATCH_CHARMANDER] = {
@@ -8902,7 +8902,7 @@ const struct Trainer gTrainers[] = {
.items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY,
- .partySize = 6,
+ .partySize = NELEMS(sTrainerMons_823E4E8),
.party = {.ItemCustomMoves = sTrainerMons_823E4E8}
},
[TRAINER_CUE_BALL_PAXTON] = {
@@ -8914,7 +8914,7 @@ const struct Trainer gTrainers[] = {
.items = {},
.doubleBattle = FALSE,
.aiFlags = AI_SCRIPT_CHECK_BAD_MOVE,
- .partySize = 2,
+ .partySize = NELEMS(sTrainerMons_823E548),
.party = {.NoItemDefaultMoves = sTrainerMons_823E548}
},
};
diff --git a/src/daycare.c b/src/daycare.c
index 277a382c7..0a19c6c9b 100644
--- a/src/daycare.c
+++ b/src/daycare.c
@@ -1,7 +1,6 @@
#include "global.h"
#include "gflib.h"
#include "battle.h"
-#include "daycare.h"
#include "constants/species.h"
#include "constants/items.h"
#include "mail_data.h"
@@ -29,7 +28,7 @@
#include "field_fadetransition.h"
#include "trade.h"
#include "constants/daycare.h"
-#include "constants/region_map.h"
+#include "constants/region_map_sections.h"
// Combination of RSE's Day-Care (re-used on Four Island), FRLG's Day-Care, and egg_hatch.c
@@ -1816,7 +1815,7 @@ static void CB2_EggHatch_0(void)
break;
case 2:
DecompressAndLoadBgGfxUsingHeap(0, gBattleTextboxTiles, 0, 0, 0);
- CopyToBgTilemapBuffer(0, gFile_graphics_interface_menu_map_tilemap, 0, 0);
+ CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0);
LoadCompressedPalette(gBattleTextboxPalette, 0, 0x20);
gMain.state++;
break;
@@ -1968,7 +1967,7 @@ static void CB2_EggHatch_1(void)
species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES);
gender = GetMonGender(&gPlayerParty[sEggHatchData->eggPartyID]);
personality = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_PERSONALITY, 0);
- DoNamingScreen(3, gStringVar3, species, gender, personality, EggHatchSetMonNickname);
+ DoNamingScreen(NAMING_SCREEN_NAME_RATER, gStringVar3, species, gender, personality, EggHatchSetMonNickname);
break;
case 1:
case -1:
diff --git a/src/decompress.c b/src/decompress.c
index caeda738a..3f0c82bce 100644
--- a/src/decompress.c
+++ b/src/decompress.c
@@ -2,7 +2,6 @@
#include "malloc.h"
#include "decompress.h"
#include "pokemon.h"
-#include "text.h"
#include "constants/species.h"
extern const struct CompressedSpriteSheet gMonFrontPicTable[];
diff --git a/src/digit_obj_util.c b/src/digit_obj_util.c
new file mode 100644
index 000000000..82af5dcab
--- /dev/null
+++ b/src/digit_obj_util.c
@@ -0,0 +1,452 @@
+#include "global.h"
+#include "malloc.h"
+#include "decompress.h"
+#include "digit_obj_util.h"
+#include "main.h"
+
+struct DigitPrinterAlloc
+{
+ u32 count;
+ struct DigitPrinter
+ {
+ bool8 isActive;
+ u8 firstOamId;
+ u8 strConvMode;
+ u8 oamCount;
+ u8 palTagIndex;
+ u8 size;
+ u8 shape;
+ u8 priority;
+ u8 xDelta;
+ u8 tilesPerImage;
+ u16 tileStart;
+ s16 x;
+ s16 y;
+ u16 tileTag;
+ u16 palTag;
+ u32 pow10;
+ s32 lastPrinted;
+ } *array;
+};
+
+// this file's functions
+static u8 GetFirstOamId(u8 oamCount);
+static void CopyWorkToOam(struct DigitPrinter *objWork);
+static void DrawNumObjsLeadingZeros(struct DigitPrinter *objWork, s32 num, bool32 sign);
+static void DrawNumObjsMinusInFront(struct DigitPrinter *objWork, s32 num, bool32 sign);
+static void DrawNumObjsMinusInBack(struct DigitPrinter *objWork, s32 num, bool32 sign);
+static bool32 SharesTileWithAnyActive(u32 id);
+static bool32 SharesPalWithAnyActive(u32 id);
+static u8 GetTilesPerImage(u32 shape, u32 size);
+
+// ewram
+static EWRAM_DATA struct DigitPrinterAlloc *sOamWork = {0};
+
+// const rom data
+static const u8 sTilesPerImage[4][4] =
+{
+ [ST_OAM_SQUARE] = {
+ [ST_OAM_SIZE_0] = 0x01, // SPRITE_SIZE_8x8
+ [ST_OAM_SIZE_1] = 0x04, // SPRITE_SIZE_16x16
+ [ST_OAM_SIZE_2] = 0x10, // SPRITE_SIZE_32x32
+ [ST_OAM_SIZE_3] = 0x40 // SPRITE_SIZE_64x64
+ },
+ [ST_OAM_H_RECTANGLE] = {
+ [ST_OAM_SIZE_0] = 0x02, // SPRITE_SIZE_16x8
+ [ST_OAM_SIZE_1] = 0x04, // SPRITE_SIZE_32x8
+ [ST_OAM_SIZE_2] = 0x08, // SPRITE_SIZE_32x16
+ [ST_OAM_SIZE_3] = 0x20 // SPRITE_SIZE_64x32
+ },
+ [ST_OAM_V_RECTANGLE] = {
+ [ST_OAM_SIZE_0] = 0x02, // SPRITE_SIZE_8x16
+ [ST_OAM_SIZE_1] = 0x04, // SPRITE_SIZE_8x32
+ [ST_OAM_SIZE_2] = 0x08, // SPRITE_SIZE_16x32
+ [ST_OAM_SIZE_3] = 0x20 // SPRITE_SIZE_32x64
+ }
+};
+
+const u16 gUnknown_8479668[] = INCBIN_U16("graphics/misc/unk_8479688.gbapal");
+const u32 gUnknown_8479688[] = INCBIN_U32("graphics/misc/unk_8479688.4bpp.lz");
+const u32 gUnknown_8479748[] = INCBIN_U32("graphics/misc/unk_8479748.4bpp.lz");
+
+// code
+bool32 DigitObjUtil_Init(u32 count)
+{
+ u32 i;
+
+ if (sOamWork != NULL)
+ DigitObjUtil_Teardown();
+
+ sOamWork = Alloc(sizeof(*sOamWork));
+ if (sOamWork == NULL)
+ return FALSE;
+
+ sOamWork->array = Alloc(sizeof(struct DigitPrinter) * count);
+ if (sOamWork->array == NULL)
+ {
+ Free(sOamWork);
+ return FALSE;
+ }
+
+ sOamWork->count = count;
+ for (i = 0; i < count; i++)
+ {
+ sOamWork->array[i].isActive = FALSE;
+ sOamWork->array[i].firstOamId = 0xFF;
+ }
+
+ return TRUE;
+}
+
+void DigitObjUtil_Teardown(void)
+{
+ if (sOamWork != NULL)
+ {
+ if (sOamWork->array != NULL)
+ {
+ u32 i;
+
+ for (i = 0; i < sOamWork->count; i++)
+ DigitObjUtil_DeletePrinter(i);
+
+ Free(sOamWork->array);
+ }
+
+ FREE_AND_SET_NULL(sOamWork);
+ }
+}
+
+bool32 DigitObjUtil_CreatePrinter(u32 id, s32 num, const struct DigitObjUtilTemplate *template)
+{
+ u32 i;
+
+ if (sOamWork == NULL)
+ return FALSE;
+ if (sOamWork->array[id].isActive)
+ return FALSE;
+
+ sOamWork->array[id].firstOamId = GetFirstOamId(template->oamCount);
+ if (sOamWork->array[id].firstOamId == 0xFF)
+ return FALSE;
+
+ sOamWork->array[id].tileStart = GetSpriteTileStartByTag(template->spriteSheet.uncompressed->tag);
+ if (sOamWork->array[id].tileStart == 0xFFFF)
+ {
+ if (template->spriteSheet.uncompressed->size != 0)
+ {
+ sOamWork->array[id].tileStart = LoadSpriteSheet(template->spriteSheet.uncompressed);
+ }
+ else
+ {
+ struct CompressedSpriteSheet compObjectPic;
+
+ compObjectPic = *template->spriteSheet.compressed;
+ compObjectPic.size = GetDecompressedDataSize((const void *)template->spriteSheet.compressed->data);
+ sOamWork->array[id].tileStart = LoadCompressedSpriteSheet(&compObjectPic);
+ }
+
+ if (sOamWork->array[id].tileStart == 0xFFFF)
+ return FALSE;
+ }
+
+ sOamWork->array[id].palTagIndex = IndexOfSpritePaletteTag(template->spritePal->tag);
+ if (sOamWork->array[id].palTagIndex == 0xFF)
+ sOamWork->array[id].palTagIndex = LoadSpritePalette(template->spritePal);
+
+ sOamWork->array[id].strConvMode = template->strConvMode;
+ sOamWork->array[id].oamCount = template->oamCount;
+ sOamWork->array[id].x = template->x;
+ sOamWork->array[id].y = template->y;
+ sOamWork->array[id].shape = template->shape;
+ sOamWork->array[id].size = template->size;
+ sOamWork->array[id].priority = template->priority;
+ sOamWork->array[id].xDelta = template->xDelta;
+ sOamWork->array[id].tilesPerImage = GetTilesPerImage(template->shape, template->size);
+ sOamWork->array[id].tileTag = template->spriteSheet.uncompressed->tag;
+ sOamWork->array[id].palTag = template->spritePal->tag;
+ sOamWork->array[id].isActive = TRUE;
+
+ // Decimal left shift
+ sOamWork->array[id].pow10 = 1;
+ for (i = 1; i < template->oamCount; i++)
+ sOamWork->array[id].pow10 *= 10;
+
+ CopyWorkToOam(&sOamWork->array[id]);
+ DigitObjUtil_PrintNumOn(id, num);
+
+ return TRUE;
+}
+
+static void CopyWorkToOam(struct DigitPrinter *objWork)
+{
+ u32 i;
+ u32 oamId = objWork->firstOamId;
+ u32 x = objWork->x;
+ u32 oamCount = objWork->oamCount + 1;
+
+ CpuFill16(0, &gMain.oamBuffer[oamId], sizeof(struct OamData) * oamCount);
+ for (i = 0, oamId = objWork->firstOamId; i < oamCount; i++, oamId++)
+ {
+ gMain.oamBuffer[oamId].y = objWork->y;
+ gMain.oamBuffer[oamId].x = x;
+ gMain.oamBuffer[oamId].shape = objWork->shape;
+ gMain.oamBuffer[oamId].size = objWork->size;
+ gMain.oamBuffer[oamId].tileNum = objWork->tileStart;
+ gMain.oamBuffer[oamId].priority = objWork->priority;
+ gMain.oamBuffer[oamId].paletteNum = objWork->palTagIndex;
+
+ x += objWork->xDelta;
+ }
+
+ oamId--;
+ gMain.oamBuffer[oamId].x = objWork->x - objWork->xDelta;
+ gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
+ gMain.oamBuffer[oamId].tileNum = objWork->tileStart + (objWork->tilesPerImage * 10);
+}
+
+void DigitObjUtil_PrintNumOn(u32 id, s32 num)
+{
+ bool32 sign;
+
+ if (sOamWork == NULL)
+ return;
+ if (!sOamWork->array[id].isActive)
+ return;
+
+ sOamWork->array[id].lastPrinted = num;
+ if (num < 0)
+ {
+ sign = TRUE;
+ num *= -1;
+ }
+ else
+ {
+ sign = FALSE;
+ }
+
+ switch (sOamWork->array[id].strConvMode)
+ {
+ case 0:
+ default:
+ DrawNumObjsLeadingZeros(&sOamWork->array[id], num, sign);
+ break;
+ case 1:
+ DrawNumObjsMinusInFront(&sOamWork->array[id], num, sign);
+ break;
+ case 2:
+ DrawNumObjsMinusInBack(&sOamWork->array[id], num, sign);
+ break;
+ }
+}
+
+static void DrawNumObjsLeadingZeros(struct DigitPrinter *objWork, s32 num, bool32 sign)
+{
+ u32 pow10 = objWork->pow10;
+ u32 oamId = objWork->firstOamId;
+
+ while (pow10 != 0)
+ {
+ u32 digit = num / pow10;
+ num -= (digit * pow10);
+ pow10 /= 10;
+
+ gMain.oamBuffer[oamId].tileNum = (digit * objWork->tilesPerImage) + objWork->tileStart;
+ oamId++;
+ }
+
+ if (sign)
+ gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
+ else
+ gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
+}
+
+static void DrawNumObjsMinusInFront(struct DigitPrinter *objWork, s32 num, bool32 sign)
+{
+ u32 pow10 = objWork->pow10;
+ static int oamId;
+ static int curDigit;
+ static int firstDigit;
+
+ oamId = objWork->firstOamId;
+ curDigit = 0;
+ firstDigit = -1;
+
+ while (pow10 != 0)
+ {
+ u32 digit = num / pow10;
+ num -= (digit * pow10);
+ pow10 /= 10;
+
+ if (digit != 0 || firstDigit != -1 || pow10 == 0)
+ {
+ gMain.oamBuffer[oamId].tileNum = (digit * objWork->tilesPerImage) + objWork->tileStart;
+ gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
+
+ if (firstDigit == -1)
+ firstDigit = curDigit;
+ }
+ else
+ {
+ gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
+ }
+
+ oamId++;
+ curDigit++;
+ }
+
+ if (sign)
+ {
+ gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
+ gMain.oamBuffer[oamId].x = objWork->x + ((firstDigit - 1) * objWork->xDelta);
+ }
+ else
+ {
+ gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
+ }
+}
+
+static void DrawNumObjsMinusInBack(struct DigitPrinter *objWork, s32 num, bool32 sign)
+{
+ u32 pow10 = objWork->pow10;
+ u32 oamId = objWork->firstOamId;
+ u32 printingDigits = 0;
+ s32 nsprites = 0;
+
+ while (pow10 != 0)
+ {
+ u32 digit = num / pow10;
+ num -= (digit * pow10);
+ pow10 /= 10;
+
+ if (digit != 0 || printingDigits != 0 || pow10 == 0)
+ {
+ printingDigits = 1;
+ gMain.oamBuffer[oamId].tileNum = (digit * objWork->tilesPerImage) + objWork->tileStart;
+ gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
+
+ oamId++;
+ nsprites++;
+ }
+ }
+
+ while (nsprites < objWork->oamCount)
+ {
+ gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
+ oamId++;
+ nsprites++;
+ }
+
+ if (sign)
+ gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
+ else
+ gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
+}
+
+void DigitObjUtil_DeletePrinter(u32 id)
+{
+ s32 oamId, oamCount, i;
+
+ if (sOamWork == NULL)
+ return;
+ if (!sOamWork->array[id].isActive)
+ return;
+
+ oamCount = sOamWork->array[id].oamCount + 1;
+ oamId = sOamWork->array[id].firstOamId;
+
+ for (i = 0; i < oamCount; i++, oamId++)
+ gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
+
+ if (!SharesTileWithAnyActive(id))
+ FreeSpriteTilesByTag(sOamWork->array[id].tileTag);
+ if (!SharesPalWithAnyActive(id))
+ FreeSpritePaletteByTag(sOamWork->array[id].palTag);
+
+ sOamWork->array[id].isActive = FALSE;
+}
+
+void DigitObjUtil_HideOrShow(u32 id, bool32 hide)
+{
+ s32 oamId, oamCount, i;
+
+ if (sOamWork == NULL)
+ return;
+ if (!sOamWork->array[id].isActive)
+ return;
+
+ oamCount = sOamWork->array[id].oamCount + 1;
+ oamId = sOamWork->array[id].firstOamId;
+ if (hide)
+ {
+ for (i = 0; i < oamCount; i++, oamId++)
+ gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
+ }
+ else
+ {
+ for (i = 0; i < oamCount; i++, oamId++)
+ gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
+
+ DigitObjUtil_PrintNumOn(id, sOamWork->array[id].lastPrinted);
+ }
+}
+
+static u8 GetFirstOamId(u8 oamCount)
+{
+ u32 i;
+ u16 firstOamId = 64;
+
+ for (i = 0; i < sOamWork->count; i++)
+ {
+ if (!sOamWork->array[i].isActive)
+ {
+ if (sOamWork->array[i].firstOamId != 0xFF && sOamWork->array[i].oamCount <= oamCount)
+ return sOamWork->array[i].firstOamId;
+ }
+ else
+ {
+ firstOamId += 1 + sOamWork->array[i].oamCount;
+ }
+ }
+
+ if (firstOamId + oamCount + 1 > 128)
+ return 0xFF;
+ else
+ return firstOamId;
+}
+
+static bool32 SharesTileWithAnyActive(u32 id)
+{
+ u32 i;
+
+ for (i = 0; i < sOamWork->count; i++)
+ {
+ if (sOamWork->array[i].isActive && i != id
+ && sOamWork->array[i].tileTag == sOamWork->array[id].tileTag)
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static bool32 SharesPalWithAnyActive(u32 id)
+{
+ u32 i;
+
+ for (i = 0; i < sOamWork->count; i++)
+ {
+ if (sOamWork->array[i].isActive && i != id
+ && sOamWork->array[i].palTag == sOamWork->array[id].palTag)
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static u8 GetTilesPerImage(u32 shape, u32 size)
+{
+ return sTilesPerImage[shape][size];
+}
diff --git a/src/diploma.c b/src/diploma.c
index afb22400b..f702eebd5 100644
--- a/src/diploma.c
+++ b/src/diploma.c
@@ -4,7 +4,6 @@
#include "dynamic_placeholder_text_util.h"
#include "gba/macro.h"
#include "gpu_regs.h"
-#include "gpu_regs.h"
#include "main.h"
#include "malloc.h"
#include "menu.h"
@@ -19,7 +18,6 @@
#include "task.h"
#include "text.h"
#include "window.h"
-#include "diploma.h"
struct Diploma
{
diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c
index 1860f1917..ea6d46df2 100644
--- a/src/dodrio_berry_picking.c
+++ b/src/dodrio_berry_picking.c
@@ -1,162 +1,145 @@
#include "global.h"
-#include "bg.h"
+#include "gflib.h"
+#include "dodrio_berry_picking.h"
+#include "event_data.h"
+#include "item.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "m4a.h"
+#include "minigame_countdown.h"
+#include "random.h"
+#include "script.h"
#include "strings.h"
-#include "window.h"
-
-/*static*/ void sub_8150C78(void);
-/*static*/ void sub_8150CBC(void);
-/*static*/ void sub_8150CF4(void);
-/*static*/ void sub_8150D7C(void);
-/*static*/ void sub_8150DA4(void);
-/*static*/ void sub_8150FDC(void);
-/*static*/ void sub_8151198(void);
-/*static*/ void sub_81512B4(void);
-/*static*/ void sub_8151488(void);
-/*static*/ void sub_81514F0(void);
-/*static*/ void sub_815159C(void);
-/*static*/ void sub_8150F40(void);
-/*static*/ void sub_8150E68(void);
-/*static*/ void sub_815109C(void);
-/*static*/ void sub_8150FC4(void);
-/*static*/ void nullsub_97(struct Sprite *sprite);
-/*static*/ void sub_81543E8(struct Sprite *sprite);
-/*static*/ void sub_8154A2C(void);
-/*static*/ void sub_8154B34(void);
-/*static*/ void sub_8154F80(void);
-/*static*/ void sub_81556E0(void);
-/*static*/ void sub_8155A78(void);
-/*static*/ void sub_8155B4C(void);
-/*static*/ void sub_8155C2C(void);
-/*static*/ void sub_8155C80(void);
-/*static*/ void unused_0(void);
-/*static*/ void nullsub_98(void);
-
-// const rom data
-/*static*/ const u8 sUnknown_8471F50[5][5][11] =
+#include "task.h"
+#include "text_window.h"
+#include "constants/songs.h"
+#include "constants/fanfares.h"
+#include "constants/items.h"
+#include "constants/species.h"
+
+struct DodrioStruct
{
- {
- {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
- },
- {
- {0, 1, 2, 3, 4, 5, 6, 3, 8, 9, 0},
- {0, 1, 2, 5, 6, 3, 4, 5, 8, 9, 0},
- },
- {
- {0, 1, 2, 3, 4, 5, 6, 7, 2, 9, 0},
- {0, 1, 4, 5, 6, 7, 2, 3, 4, 9, 0},
- {0, 1, 6, 7, 2, 3, 4, 5, 6, 9, 0},
- },
- {
- {0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 0},
- {0, 3, 4, 5, 6, 7, 8, 1, 2, 3, 0},
- {0, 5, 6, 7, 8, 1, 2, 3, 4, 5, 0},
- {0, 7, 8, 1, 2, 3, 4, 5, 6, 7, 0},
- },
- {
- {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
- {2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2},
- {4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4},
- {6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6},
- {8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8},
- },
-};
+ /*0x0000*/ void (*savedCallback)(void);
+ /*0x0004*/ u8 ALIGNED(4) unk04;
+ /*0x0008*/ u8 ALIGNED(4) unk08;
+ /*0x000C*/ u8 ALIGNED(4) unk0C;
+ /*0x0010*/ u8 ALIGNED(4) unk10;
+ /*0x0014*/ u8 ALIGNED(4) unk14;
+ /*0x0018*/ u8 ALIGNED(4) unk18;
+ /*0x001C*/ u8 ALIGNED(4) unk1C;
+ /*0x0020*/ u8 ALIGNED(4) unk20;
+ /*0x0024*/ u8 ALIGNED(4) unk24;
+ /*0x0028*/ u8 ALIGNED(4) multiplayerId;
+ /*0x0030*/ u8 ALIGNED(8) unk30;
+ /*0x0034*/ u8 ALIGNED(4) unk34[5];
+ /*0x003C*/ u8 ALIGNED(4) unk3C;
+ /*0x0040*/ u8 ALIGNED(4) unk40;
+ /*0x0044*/ u8 ALIGNED(4) unk44;
+ /*0x0048*/ u8 ALIGNED(4) unk48;
+ /*0x004A*/ u16 unk4A[5][6];
+ /*0x0086*/ u16 unk86[5];
+ /*0x0090*/ u8 ALIGNED(4) unk90[5];
+ /*0x0098*/ u8 ALIGNED(4) unk98[4];
+ /*0x009C*/ u8 ALIGNED(4) unk9C[11];
+ /*0x00A8*/ u8 ALIGNED(4) unkA8[5];
+ /*0x00B0*/ u8 ALIGNED(4) unkB0[5];
+ /*0x00B8*/ u8 ALIGNED(4) unkB8[11];
+ /*0x00C4*/ u8 ALIGNED(4) unkC4[11];
+ /*0x00D0*/ u8 ALIGNED(4) unkD0[11];
+ /*0x00DC*/ u8 ALIGNED(4) unkDC[11];
+ /*0x00E8*/ u8 ALIGNED(4) unkE8[11];
+ /*0x00F4*/ u8 ALIGNED(4) unkF4[11][2];
+ /*0x010C*/ u8 ALIGNED(4) unk10C[5];
+ /*0x0112*/ u16 unk112;
+ /*0x0114*/ u16 unk114;
+ /*0x0118*/ u32 unk118;
+ /*0x011C*/ u32 unk11C;
+ /*0x0120*/ u32 unk120;
+ /*0x0124*/ u8 ALIGNED(4) unk124;
+ /*0x0128*/ u8 ALIGNED(4) unk128;
+ /*0x012C*/ u32 unk12C;
+ /*0x0130*/ u32 unk130[5];
+ /*0x0144*/ u8 ALIGNED(4) unk144;
+ /*0x0148*/ u8 ALIGNED(4) unk148[11];
+ /*0x0154*/ u8 ALIGNED(4) unk154;
+ /*0x0158*/ u8 ALIGNED(4) unk158[5];
+ /*0x0160*/ struct DodrioSubstruct_0160 unk160;
+ /*0x318C*/ struct DodrioSubstruct_318C unk318C[5];
+ /*0x31A0*/ struct DodrioSubstruct_31A0 unk31A0[5];
+ /*0x32CC*/ struct DodrioSubstruct_31A0 unk32CC;
+ /*0x3308*/ struct DodrioSubstruct_3308 unk3308[5];
+}; // size = 0x3330
+
+static EWRAM_DATA struct DodrioStruct * gUnknown_203F3E0 = NULL;
+
+static bool32 gUnknown_3002044;
+
+static void sub_81508D8(void);
+static void sub_81508EC(struct DodrioStruct * dodrio);
+static void sub_8150A84(u8 taskId);
+static void sub_8150C78(void);
+static void sub_8150CBC(void);
+static void sub_8150CF4(void);
+static void sub_8150D7C(void);
+static void sub_8150DA4(void);
+static void sub_8150E68(void);
+static void sub_8150F40(void);
+static void sub_8150FC4(void);
+static void sub_8150FDC(void);
+static void sub_815109C(void);
+static void sub_8151198(void);
+static void sub_81512B4(void);
+static void sub_8151488(void);
+static void sub_81514F0(void);
+static void sub_815159C(void);
+static void sub_81516DC(u8 taskId);
+static void sub_8151750(u8 taskId);
+static void sub_8151B54(void);
+static void sub_8151BA0(void);
+static void sub_8151C5C(void);
+static void sub_8151D28(void);
+static void sub_8151D98(void);
+static void sub_8151E94(void);
+static void sub_815201C(void);
+static void sub_8152034(void);
+static void sub_8152048(struct DodrioSubstruct_318C * dodrioMon, struct Pokemon * partyMon);
+static void sub_815205C(TaskFunc func, u8 priority);
+static void sub_815206C(TaskFunc func);
+static void sub_8152090(u8 a0);
+static bool32 sub_81520B4(void);
+static void sub_8152110(void);
+static bool32 sub_8152484(u8 a0, u8 a1, u8 a2);
+static void sub_815256C(void);
+static void sub_815293C(void);
+static void sub_8152970(void);
+static bool32 sub_8152A00(void);
+static void sub_8152A70(void);
+static void sub_81529A4(u8 a0, u8 *a1, u8 *a2);
+static bool32 sub_8152A98(void);
+static bool32 sub_8152AD8(void);
+static void sub_8152B64(u8 a0);
+static u8 sub_8152BD4(u8 a0);
+static u8 sub_8152BF8(u8 a0, u8 a1);
+static u8 sub_8152CB8(u8 arg0, u8 arg1);
+static void sub_8152D34(u8 a0, u8 a1, u8 a2);
+static void sub_8152F94(bool32 a0);
+static void sub_8153004(void);
+static void sub_8153048(void);
+static void sub_8153150(void);
+static void sub_81531FC(void);
+static u8 sub_815327C(u8);
+static void sub_81532B8(void);
+static void sub_815336C(void);
+static u32 sub_8153424(u8 mpId);
+static void Task_ShowDodrioBerryPickingRecords(u8 taskId);
+static void sub_81538D0(u8 windowId);
-/*static*/ const u8 sUnknown_8472063[5][5][3] =
-{
- {
- {4, 5, 6},
- },
- {
- {3, 4, 5},
- {5, 6, 3},
- },
- {
- {4, 5, 6},
- {6, 7, 2},
- {2, 3, 4},
- },
- {
- {3, 4, 5},
- {5, 6, 7},
- {7, 8, 1},
- {1, 2, 3},
- },
- {
- {4, 5, 6},
- {6, 7, 8},
- {8, 9, 0},
- {0, 1, 2},
- {2, 3, 4},
- },
-};
-
-/*static*/ const u8 sUnknown_84720AE[5][5][3] =
-{
- {
- {1, 0, 1},
- },
- {
- {1, 0, 1},
- {0, 1, 0},
- },
- {
- {2, 0, 1},
- {0, 1, 2},
- {1, 2, 0},
- },
- {
- {3, 0, 1},
- {0, 1, 2},
- {1, 2, 3},
- {2, 3, 0},
- },
- {
- {4, 0, 1},
- {0, 1, 2},
- {1, 2, 3},
- {2, 3, 4},
- {3, 4, 0},
- },
-};
-
-ALIGNED(4)
-/*static*/ const u8 sUnknown_84720FC[5][11] =
-{
- {9, 9, 9, 9, 1, 1, 1, 9, 9, 9, 9},
- {9, 9, 9, 0, 0, 1, 1, 0, 9, 9, 9},
- {9, 9, 2, 2, 0, 0, 1, 1, 1, 9, 9},
- {9, 3, 3, 0, 0, 1, 1, 2, 2, 3, 9},
- {3, 3, 4, 4, 0, 0, 1, 1, 2, 2, 3},
-};
+// const rom data
-/*static*/ const u8 sUnknown_8472133[5][5] =
-{
- {5},
- {4, 6},
- {3, 5, 7},
- {2, 4, 6, 8},
- {1, 3, 5, 6, 9},
-};
+// Assets in this header are duplicated
+#include "data/dodrio_berry_picking.h"
-// Duplicate and unused gfx. Feel free to remove.
-/*static*/ const u32 sDuplicateGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_bg1.gbapal",
- "graphics/link_games/dodrioberry_bg2.gbapal",
- "graphics/link_games/dodrioberry_pkmn.gbapal",
- "graphics/link_games/dodrioberry_shiny.gbapal",
- "graphics/link_games/dodrioberry_status.gbapal",
- "graphics/link_games/dodrioberry_berrysprites.gbapal",
- "graphics/link_games/dodrioberry_berrysprites.4bpp.lz",
- "graphics/link_games/dodrioberry_platform.gbapal",
- "graphics/link_games/dodrioberry_bg1.4bpp.lz",
- "graphics/link_games/dodrioberry_bg2.4bpp.lz",
- "graphics/link_games/dodrioberry_status.4bpp.lz",
- "graphics/link_games/dodrioberry_platform.4bpp.lz",
- "graphics/link_games/dodrioberry_pkmn.4bpp.lz",
- "graphics/link_games/dodrioberry_bg1.bin.lz",
- "graphics/link_games/dodrioberry_bg2right.bin.lz",
- "graphics/link_games/dodrioberry_bg2left.bin.lz");
-
-/*static*/ const u8 sUnknown_847553C[][3] =
+static const u8 sUnknown_847553C[][3] =
{
{40, 24, 13},
{32, 19, 10},
@@ -164,20 +147,20 @@ ALIGNED(4)
};
ALIGNED(4)
-/*static*/ const u8 sUnknown_8475548[] = {8, 5, 8, 11, 15};
+static const u8 sUnknown_8475548[] = {8, 5, 8, 11, 15};
ALIGNED(4)
-/*static*/ const u8 sUnknown_8475550[] = {5, 10, 20, 30, 50, 70, 100};
+static const u8 sUnknown_8475550[] = {5, 10, 20, 30, 50, 70, 100};
ALIGNED(4)
-/*static*/ const u8 sUnknown_8475558[][10] =
+static const u8 sUnknown_8475558[][10] =
{
{15, 16, 17, 18, 19, 19, 18, 17, 16, 15},
{20, 21, 22, 23, 24, 25, 26, 27, 28, 29},
{30, 31, 32, 33, 34, 34, 33, 32, 31, 30},
};
-/*static*/ void (*const sUnknown_8475578[])(void) =
+static void (*const sUnknown_8475578[])(void) =
{
sub_8150C78,
sub_8150CBC,
@@ -193,7 +176,7 @@ ALIGNED(4)
sub_8150F40
};
-/*static*/ void (*const sUnknown_84755A8[])(void) =
+static void (*const sUnknown_84755A8[])(void) =
{
sub_8150C78,
sub_8150CBC,
@@ -209,540 +192,2245 @@ ALIGNED(4)
sub_8150FC4
};
-/*static*/ const s16 sUnknown_84755D8[] = {10, 30, 50, 50};
+void StartDodrioBerryPicking(u16 a0, MainCallback callback)
+{
+ gUnknown_3002044 = FALSE;
-// Data related to printing saved results.
-/*static*/ const struct WindowTemplate sUnknown_84755E0 =
+ if (gReceivedRemoteLinkPlayers && (gUnknown_203F3E0 = AllocZeroed(sizeof(*gUnknown_203F3E0))) != NULL)
+ {
+ sub_81508D8();
+ sub_81508EC(gUnknown_203F3E0);
+ gUnknown_203F3E0->savedCallback = callback;
+ gUnknown_203F3E0->multiplayerId = GetMultiplayerId();
+ gUnknown_203F3E0->unk32CC = gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId];
+ sub_8152048(&gUnknown_203F3E0->unk318C[gUnknown_203F3E0->multiplayerId], &gPlayerParty[a0]);
+ CreateTask(sub_8150A84, 1);
+ SetMainCallback2(sub_815201C);
+ sub_8153150();
+ sub_81529A4(gUnknown_203F3E0->unk24, &gUnknown_203F3E0->unk44, &gUnknown_203F3E0->unk48);
+ StopMapMusic();
+ PlayNewMapMusic(MUS_KINOMIKUI);
+ }
+ else
+ {
+ SetMainCallback2(callback);
+ return;
+ }
+}
+
+static void sub_81508D8(void)
{
- .bg = 0,
- .tilemapLeft = 1,
- .tilemapTop = 1,
- .width = 28,
- .height = 11,
- .paletteNum = 15,
- .baseBlock = 1,
-};
+ ResetTasks();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+}
-/*static*/ const u8 *const sUnknown_84755E8[] = {gText_BerryPickingRecords, gText_BerriesPicked, gText_BestScore, gText_BerriesInRowFivePlayers};
-/*static*/ const u8 sUnknown_84755F8[] = {4, 7, 4};
+static void sub_81508EC(struct DodrioStruct * data)
+{
+ u8 i;
+
+ data->unk0C = 0;
+ data->unk10 = 0;
+ data->unk14 = 0;
+ data->unk18 = 0;
+ data->unk1C = 0;
+ data->unk11C = 0;
+ data->unk120 = 0;
+ data->unk30 = 0;
+ data->unk40 = 0;
+ data->unk3C = 0;
+ data->unk12C = 0;
+
+ for (i = 0; i < 4; i++)
+ {
+ data->unk98[i] = 0;
+ }
-ALIGNED(4)
-/*static*/ const u8 sUnknown_84755FC[][2] = {{24}, {40}, {56}};
-/*static*/ const u8 sUnknown_8475602[][2] = {{24}, {40}, {70}};
+ for (i = 0; i < 5; i++)
+ {
+ data->unkA8[i] = 0;
+ data->unkB0[i] = 0;
+ data->unk4A[i][0] = 0;
+ data->unk4A[i][1] = 0;
+ data->unk4A[i][2] = 0;
+ data->unk4A[i][3] = 0;
+ data->unk4A[i][5] = 0;
+ data->unk10C[i] = 0;
+ data->unk130[i] = 0;
+ }
-// Debug functions?
-/*static*/ const u16 sUnknown_8475608[][4] =
+ for (i = 0; i < 11; i++)
+ {
+ data->unkD0[i] = 0;
+ data->unkDC[i] = 0;
+ data->unkC4[i] = 0;
+ data->unkF4[i][0] = 0xFF;
+ data->unkF4[i][1] = 0xFF;
+ }
+
+ data->unk20 = GetMultiplayerId() == 0 ? 1 : 0;
+ data->unk24 = GetLinkPlayerCount();
+ data->unk34[0] = GetMultiplayerId();
+ for (i = 1; i < data->unk24; i++)
+ {
+ data->unk34[i] = data->unk34[i - 1] + 1;
+ if (data->unk34[i] > data->unk24 - 1)
+ data->unk34[i] %= data->unk24;
+ }
+}
+
+static void sub_8150A84(u8 taskId)
{
- {9999, 0, 90, 9999},
- {9999, 9999, 70, 9999},
- {9999, 0, 9999, 0},
- {9999, 9999, 60, 0},
- {9999, 9999, 9999, 0},
-};
+ u8 r4, r5;
-/*static*/ const u8 sUnknown_8475630[] = _("あいうえおかき");
-/*static*/ const u8 sUnknown_8475638[] = _("ABCDEFG");
-/*static*/ const u8 sUnknown_8475640[] = _("0123456");
+ switch (gUnknown_203F3E0->unk0C)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ sub_815205C(sub_8151750, 4);
+ gUnknown_203F3E0->unk0C++;
+ break;
+ case 1:
+ if (!FuncIsActiveTask(sub_8151750))
+ {
+ sub_8154968(&gUnknown_203F3E0->unk160);
+ gUnknown_203F3E0->unk0C++;
+ }
+ break;
+ case 2:
+ if (!sub_8155E68())
+ {
+ LinkRfu_SetRfuFuncToSend6600();
+ gUnknown_203F3E0->unk0C++;
+ }
+ break;
+ case 3:
+ if (IsLinkTaskFinished())
+ {
+ if (gReceivedRemoteLinkPlayers)
+ {
+ LoadWirelessStatusIndicatorSpriteGfx();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ }
+ gUnknown_203F3E0->unk0C++;
+ }
+ break;
+ case 4:
+ r5 = gUnknown_203F3E0->unk24;
+ sub_8153A9C();
+ for (r4 = 0; r4 < r5; r4++)
+ {
+ sub_8153AFC(&gUnknown_203F3E0->unk318C[gUnknown_203F3E0->unk34[r4]], r4, gUnknown_203F3E0->unk34[r4], gUnknown_203F3E0->unk24);
+ }
+ sub_8153D80(FALSE, gUnknown_203F3E0->unk24);
+ gUnknown_203F3E0->unk0C++;
+ break;
+ case 5:
+ sub_8154128();
+ sub_815417C();
+ sub_8154438();
+ sub_8153E28();
+ gUnknown_203F3E0->unk0C++;
+ break;
+ case 6:
+ BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ SetVBlankCallback(sub_8152034);
+ gUnknown_203F3E0->unk0C++;
+ break;
+ case 7:
+ UpdatePaletteFade();
+ if (!gPaletteFade.active)
+ {
+ gUnknown_203F3E0->unk0C++;
+ }
+ break;
+ default:
+ DestroyTask(taskId);
+ sub_815206C(sub_81516DC);
+ break;
+ }
+}
-/*static*/ const u8 *const sUnknown_8475648[] =
+static void sub_8150C08(u8 taskId)
{
- sUnknown_8475630,
- sUnknown_8475630,
- sUnknown_8475630,
- sUnknown_8475638,
- sUnknown_8475640
-};
+ sub_8151B54();
+ sUnknown_8475578[gUnknown_203F3E0->unk18]();
+ if (!gUnknown_3002044)
+ {
+ sub_815293C();
+ }
+ sub_8151BA0();
+}
-// Large chunk of data
-/*static*/ const struct BgTemplate sUnknown_847565C[] =
-{
- {
- .bg = 0,
- .charBaseIndex = 0,
- .mapBaseIndex = 30,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 0,
- .baseTile = 0
- },
- {
- .bg = 1,
- .charBaseIndex = 2,
- .mapBaseIndex = 12,
- .screenSize = 1,
- .paletteMode = 0,
- .priority = 1,
- .baseTile = 0
- },
- {
- .bg = 2,
- .charBaseIndex = 2,
- .mapBaseIndex = 14,
- .screenSize = 1,
- .paletteMode = 0,
- .priority = 1,
- .baseTile = 0
- },
- {
- .bg = 3,
- .charBaseIndex = 3,
- .mapBaseIndex = 31,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 2,
- .baseTile = 0
- },
-};
+static void sub_8150C40(u8 taskId)
+{
+ sub_8151C5C();
+ sUnknown_84755A8[gUnknown_203F3E0->unk18]();
+ if (!gUnknown_3002044)
+ {
+ sub_8152970();
+ }
+ sub_8151D28();
+}
-// Unknown unreferenced data, feel free to remove.
-/*static*/ const u32 sUnused[] = {255, 0};
+static void sub_8150C78(void)
+{
+ switch (gUnknown_203F3E0->unk10)
+ {
+ case 0:
+ sub_8153BF8(1);
+ sub_81549D4(1);
+ gUnknown_203F3E0->unk10++;
+ break;
+ case 1:
+ if (!sub_8155E68())
+ sub_8152090(1);
+ break;
+ }
+}
-/*static*/ const struct WindowTemplate sUnknown_8475674[] =
+static void sub_8150CBC(void)
{
+ if (gUnknown_203F3E0->unk10 == 0)
{
- .bg = 0,
- .tilemapLeft = 1,
- .tilemapTop = 1,
- .width = 28,
- .height = 3,
- .paletteNum = 13,
- .baseBlock = 0x13,
- },
+ sub_8152110();
+ gUnknown_203F3E0->unk10++;
+ }
+ else
{
- .bg = 0,
- .tilemapLeft = 1,
- .tilemapTop = 6,
- .width = 28,
- .height = 13,
- .paletteNum = 13,
- .baseBlock = 0x67,
+ gUnknown_203F3E0->unk118 = 1;
+ sub_8152090(2);
}
-};
+}
-/*static*/ const struct WindowTemplate sUnknown_8475684 =
+static void sub_8150CF4(void)
{
- .bg = 0,
- .tilemapLeft = 1,
- .tilemapTop = 6,
- .width = 28,
- .height = 7,
- .paletteNum = 13,
- .baseBlock = 0x67,
-};
+ switch (gUnknown_203F3E0->unk10)
+ {
+ case 0:
+ StartMinigameCountdown(7, 8, 120, 80, 0);
+ gUnknown_203F3E0->unk10++;
+ break;
+ case 1:
+ LinkRfu_SetRfuFuncToSend6600();
+ gUnknown_203F3E0->unk10++;
+ break;
+ case 2:
+ if (IsLinkTaskFinished())
+ {
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ case 3:
+ if (!IsMinigameCountdownRunning())
+ {
+ LinkRfu_SetRfuFuncToSend6600();
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ case 4:
+ if (IsLinkTaskFinished())
+ {
+ sub_8152090(3);
+ }
+ break;
+ }
+}
-/*static*/ const struct WindowTemplate sUnknown_847568C[] =
+static void sub_8150D7C(void)
{
+ if (gUnknown_203F3E0->unk10 == 0)
{
- .bg = 0,
- .tilemapLeft = 1,
- .tilemapTop = 8,
- .width = 19,
- .height = 3,
- .paletteNum = 13,
- .baseBlock = 0x13,
- },
+ if (gUnknown_203F3E0->unk11C != 0)
+ {
+ sub_8152090(4);
+ }
+ }
+}
+
+static void sub_8150DA4(void)
+{
+ if (gUnknown_203F3E0->unk10 == 0)
{
- .bg = 0,
- .tilemapLeft = 22,
- .tilemapTop = 7,
- .width = 6,
- .height = 4,
- .paletteNum = 13,
- .baseBlock = 0x4C,
+ if (gUnknown_203F3E0->unk40 < 10)
+ {
+ if (gUnknown_203F3E0->unkA8[0] == 0)
+ {
+ if (JOY_NEW(DPAD_UP))
+ {
+ if (gUnknown_203F3E0->unk31A0[0].unk2C.unk0 == 0)
+ {
+ gUnknown_203F3E0->unk31A0[0].unk2C.unk4 = 0;
+ gUnknown_203F3E0->unk31A0[0].unk2C.unk0 = sub_815327C(2);
+ }
+ }
+ else if (JOY_NEW(DPAD_RIGHT))
+ {
+ if (gUnknown_203F3E0->unk31A0[0].unk2C.unk0 == 0)
+ {
+ gUnknown_203F3E0->unk31A0[0].unk2C.unk4 = 0;
+ gUnknown_203F3E0->unk31A0[0].unk2C.unk0 = sub_815327C(1);
+ }
+ }
+ else if (JOY_NEW(DPAD_LEFT))
+ {
+ if (gUnknown_203F3E0->unk31A0[0].unk2C.unk0 == 0)
+ {
+ gUnknown_203F3E0->unk31A0[0].unk2C.unk4 = 0;
+ gUnknown_203F3E0->unk31A0[0].unk2C.unk0 = sub_815327C(3);
+ }
+ }
+ else
+ {
+ gUnknown_203F3E0->unk31A0[0].unk2C.unk0 = sub_815327C(0);
+ }
+ }
+ }
+ else
+ {
+ sub_8152090(11);
+ }
+ sub_815256C();
+ sub_8151D98();
}
-};
+}
+static void sub_8150E68(void)
+{
+ if (gUnknown_203F3E0->unk40 < 10)
+ {
+ if (JOY_NEW(DPAD_UP))
+ {
+ if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 == 0)
+ {
+ gUnknown_203F3E0->unk32CC.unk2C.unk0 = 2;
+ }
+ }
+ else if (JOY_NEW(DPAD_RIGHT))
+ {
+ if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 == 0)
+ {
+ gUnknown_203F3E0->unk32CC.unk2C.unk0 = 1;
+ }
+ }
+ else if (JOY_NEW(DPAD_LEFT))
+ {
+ if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 == 0)
+ {
+ gUnknown_203F3E0->unk32CC.unk2C.unk0 = 3;
+ }
+ }
+ else
+ {
+ gUnknown_203F3E0->unk32CC.unk2C.unk0 = 0;
+ }
+ }
+ else
+ {
+ sub_8152090(11);
+ }
+ sub_8151E94();
+}
-/*static*/ const struct WindowTemplate sUnknown_847569C =
+static void sub_8150F40(void)
{
- .bg = 0,
- .tilemapLeft = 4,
- .tilemapTop = 6,
- .width = 22,
- .height = 5,
- .paletteNum = 13,
- .baseBlock = 0x13,
-};
+ u8 i;
-/*static*/ const struct WindowTemplate sUnknown_84756A4 =
+ sub_815256C();
+ sub_8151D98();
+ if (sub_8152A98() == 1)
+ {
+ sub_8153004();
+ sub_8152090(5);
+ }
+ else
+ {
+ gUnknown_203F3E0->unk12C = 1;
+ for (i = 1; i < gUnknown_203F3E0->unk24; i++)
+ {
+ if (gUnknown_203F3E0->unk130[i] != 1)
+ {
+ gUnknown_203F3E0->unk12C = 0;
+ break;
+ }
+ }
+ }
+}
+
+static void sub_8150FC4(void)
{
- .bg = 0,
- .tilemapLeft = 5,
- .tilemapTop = 8,
- .width = 19,
- .height = 3,
- .paletteNum = 13,
- .baseBlock = 0x13,
-};
+ sub_8151E94();
+ if (sub_8152AD8() == 1)
+ sub_8152090(5);
+}
-// This is an unused copy of the tables from the top of the file. Feel free to remove.
-/*static*/ const u8 sDuplicateArray[] =
-{
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 3, 8, 9, 0, 0, 1, 2, 5, 6, 3, 4, 5, 8, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 2, 9,
- 0, 0, 1, 4, 5, 6, 7, 2, 3, 4, 9, 0, 0, 1, 6, 7, 2, 3, 4, 5, 6, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 0, 0, 3, 4, 5, 6, 7, 8, 1, 2, 3, 0, 0, 5, 6, 7, 8, 1, 2, 3, 4, 5, 0, 0, 7,
- 8, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 2, 3, 4, 5, 6, 7, 8, 9, 0,
- 1, 2, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 4, 5, 6, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 5, 5, 6, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 6, 7, 2, 2, 3, 4, 0, 0, 0, 0, 0, 0,
- 3, 4, 5, 5, 6, 7, 7, 8, 1, 1, 2, 3, 0, 0, 0, 4, 5, 6, 6, 7, 8, 8, 9, 0, 0, 1, 2, 2, 3, 4, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 1,
- 2, 1, 2, 3, 2, 3, 0, 0, 0, 0, 4, 0, 1, 0, 1, 2, 1, 2, 3, 2, 3, 4, 3, 4, 0, 0, 0, 0, 9, 9, 9, 9, 1, 1, 1, 9, 9, 9, 9, 9,
- 9, 9, 0, 0, 1, 1, 0, 9, 9, 9, 9, 9, 2, 2, 0, 0, 1, 1, 1, 9, 9, 9, 3, 3, 0, 0, 1, 1, 2, 2, 3, 9, 3, 3, 4, 4, 0, 0, 1, 1,
- 2, 2, 3, 5, 0, 0, 0, 0, 4, 6, 0, 0, 0, 3, 5, 7, 0, 0, 2, 4, 6, 8, 0, 1, 3, 5, 6, 9
-};
+static void sub_8150FDC(void)
+{
+ u8 blockReceivedStatus;
+ u8 i;
+ switch (gUnknown_203F3E0->unk10)
+ {
+ case 0:
+ SendBlock(0, gUnknown_203F3E0->unk4A, sizeof(gUnknown_203F3E0->unk4A));
+ gUnknown_203F3E0->unk08 = 0;
+ gUnknown_203F3E0->unk10++;
+ break;
+ case 1:
+ if (IsLinkTaskFinished())
+ {
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ case 2:
+ blockReceivedStatus = GetBlockReceivedStatus();
+ for (i = 0; i < gUnknown_203F3E0->unk24; blockReceivedStatus >>= 1, i++)
+ {
+ if (blockReceivedStatus & 1)
+ {
+ ResetBlockReceivedFlag(i);
+ gUnknown_203F3E0->unk08++;
+ }
+ }
+ if (gUnknown_203F3E0->unk08 >= gUnknown_203F3E0->unk24)
+ {
+ gUnknown_203F3E0->unk14++;
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ default:
+ if (WaitFanfare(TRUE))
+ {
+ sub_8152090(6);
+ FadeOutAndPlayNewMapMusic(MUS_WIN_YASEI, 4);
+ }
+ break;
+ }
+}
-/*static*/ const u16 sDodrioBerryBgPal1[] = INCBIN_U16("graphics/link_games/dodrioberry_bg1.gbapal",
- "graphics/link_games/dodrioberry_bg2.gbapal");
-/*static*/ const u16 sDodrioBerryPkmnPal[] = INCBIN_U16("graphics/link_games/dodrioberry_pkmn.gbapal");
-/*static*/ const u16 sDodrioBerryShinyPal[] = INCBIN_U16("graphics/link_games/dodrioberry_shiny.gbapal");
-/*static*/ const u16 sDodrioBerryStatusPal[] = INCBIN_U16("graphics/link_games/dodrioberry_status.gbapal");
-/*static*/ const u16 sDodrioBerrySpritesPal[] = INCBIN_U16("graphics/link_games/dodrioberry_berrysprites.gbapal");
-/*static*/ const u32 sDodrioBerrySpritesGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_berrysprites.4bpp.lz");
-/*static*/ const u16 sDodrioBerryPlatformPal[] = INCBIN_U16("graphics/link_games/dodrioberry_platform.gbapal");
-/*static*/ const u32 sDodrioBerryBgGfx1[] = INCBIN_U32("graphics/link_games/dodrioberry_bg1.4bpp.lz");
-/*static*/ const u32 sDodrioBerryBgGfx2[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2.4bpp.lz");
-/*static*/ const u32 sDodrioBerryStatusGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_status.4bpp.lz");
-/*static*/ const u32 sDodrioBerryPlatformGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_platform.4bpp.lz");
-/*static*/ const u32 sDodrioBerryPkmnGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_pkmn.4bpp.lz");
-/*static*/ const u32 sDodrioBerryBgTilemap1[] = INCBIN_U32("graphics/link_games/dodrioberry_bg1.bin.lz");
-/*static*/ const u32 sDodrioBerryBgTilemap2Right[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2right.bin.lz");
-/*static*/ const u32 sDodrioBerryBgTilemap2Left[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2left.bin.lz");
-
-/*static*/ const struct OamData sOamData_8478C98 =
-{
- .y = 0,
- .affineMode = ST_OAM_AFFINE_OFF,
- .objMode = ST_OAM_OBJ_NORMAL,
- .mosaic = FALSE,
- .bpp = ST_OAM_4BPP,
- .shape = SPRITE_SHAPE(64x64),
- .x = 0,
- .matrixNum = 0,
- .size = SPRITE_SIZE(64x64),
- .tileNum = 0,
- .priority = 2,
- .paletteNum = 0,
- .affineParam = 0
-};
+static void sub_815109C(void)
+{
+ u8 i;
+ u8 blockReceivedStatus;
+
+ switch (gUnknown_203F3E0->unk10) {
+ case 0:
+ SendBlock(0, gUnknown_203F3E0->unk4A[gUnknown_203F3E0->unk14], sizeof(gUnknown_203F3E0->unk4A));
+ gUnknown_203F3E0->unk08 = 0;
+ gUnknown_203F3E0->unk10++;
+ break;
+ case 1:
+ if (IsLinkTaskFinished()) {
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ case 2:
+ blockReceivedStatus = GetBlockReceivedStatus();
+ for (i = 0; i < gUnknown_203F3E0->unk24; blockReceivedStatus >>= 1, i++)
+ {
+ if (blockReceivedStatus & 1)
+ {
+ memcpy(gUnknown_203F3E0->unk4A, gBlockRecvBuffer, sizeof(gUnknown_203F3E0->unk4A));
+ ResetBlockReceivedFlag(i);
+ gUnknown_203F3E0->unk08++;
+ }
+ }
+ if (gUnknown_203F3E0->unk08 >= gUnknown_203F3E0->unk24) {
+ gUnknown_203F3E0->unk14++;
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ default:
+ if (WaitFanfare(TRUE)) {
+ gUnknown_203F3E0->unk114 = gUnknown_203F3E0->unk4A[gUnknown_203F3E0->multiplayerId][5];
+ sub_8152090(6);
+ FadeOutAndPlayNewMapMusic(MUS_WIN_YASEI, 4);
+ }
+ break;
+ }
+}
-/*static*/ const struct OamData sOamData_8478CA0 =
-{
- .y = 0,
- .affineMode = ST_OAM_AFFINE_OFF,
- .objMode = ST_OAM_OBJ_NORMAL,
- .mosaic = FALSE,
- .bpp = ST_OAM_4BPP,
- .shape = SPRITE_SHAPE(16x16),
- .x = 0,
- .matrixNum = 0,
- .size = SPRITE_SIZE(16x16),
- .tileNum = 0,
- .priority = 0,
- .paletteNum = 0,
- .affineParam = 0
-};
+static void sub_8151198(void)
+{
+ u8 sp00;
+ u8 i;
+ u8 blockReceivedStatus;
-/*static*/ const struct OamData sOamData_8478CA8 =
-{
- .y = 0,
- .affineMode = ST_OAM_AFFINE_OFF,
- .objMode = ST_OAM_OBJ_NORMAL,
- .mosaic = FALSE,
- .bpp = ST_OAM_4BPP,
- .shape = SPRITE_SHAPE(16x16),
- .x = 0,
- .matrixNum = 0,
- .size = SPRITE_SIZE(16x16),
- .tileNum = 0,
- .priority = 2,
- .paletteNum = 0,
- .affineParam = 0
-};
+ switch (gUnknown_203F3E0->unk10)
+ {
+ case 0:
+ sub_81531FC();
+ sub_81540DC(TRUE);
+ sub_81544F0();
+ sub_81545BC(TRUE);
+ sub_81549D4(2);
+ gUnknown_203F3E0->unk10++;
+ break;
+ case 1:
+ if (!sub_8155E68())
+ {
+ sp00 = 1;
+ sub_81549D4(5);
+ sp00 = sub_8155E8C();
+ SendBlock(0, &sp00, sizeof(sp00));
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ case 2:
+ if (IsLinkTaskFinished())
+ {
+ gUnknown_203F3E0->unk10++;
+ gUnknown_203F3E0->unk08 = 0;
+ }
+ break;
+ case 3:
+ blockReceivedStatus = GetBlockReceivedStatus();
+ for (i = 0; i < gUnknown_203F3E0->unk24; blockReceivedStatus >>= 1, i++)
+ {
+ if (blockReceivedStatus & 1)
+ {
+ *(gUnknown_203F3E0->unk10C + i) = *(u8 *)gBlockRecvBuffer[i];
+ ResetBlockReceivedFlag(i);
+ gUnknown_203F3E0->unk08++;
+ }
+ }
+ if (gUnknown_203F3E0->unk08 >= gUnknown_203F3E0->unk24) {
+ if (++gUnknown_203F3E0->unk14 >= 120)
+ {
+ sub_81549D4(6);
+ gUnknown_203F3E0->unk10++;
+ }
+ }
+ break;
+ default:
+ if (!sub_8155E68())
+ {
+ sub_8152090(7);
+ }
+ break;
+ }
+}
-/*static*/ const struct OamData sOamData_8478CB0 =
-{
- .y = 0,
- .affineMode = ST_OAM_AFFINE_OFF,
- .objMode = ST_OAM_OBJ_NORMAL,
- .mosaic = FALSE,
- .bpp = ST_OAM_4BPP,
- .shape = SPRITE_SHAPE(64x32),
- .x = 0,
- .matrixNum = 0,
- .size = SPRITE_SIZE(64x32),
- .tileNum = 0,
- .priority = 3,
- .paletteNum = 0,
- .affineParam = 0
-};
+static void sub_81512B4(void)
+{
+ u8 sp0;
+ u8 i;
+ u8 blockReceivedStatus;
-/*static*/ const union AnimCmd sSpriteAnim_8478CB8[] =
+ switch (gUnknown_203F3E0->unk10)
+ {
+ case 0:
+ if (sub_81534AC() >= 3000)
+ {
+ sub_81549D4(4);
+ }
+ gUnknown_203F3E0->unk10++;
+ break;
+ case 1:
+ if (!sub_8155E68())
+ {
+ sub_81549D4(3);
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ case 2:
+ sub_81546C0();
+ sub_8153048();
+ gUnknown_203F3E0->unk10++;
+ break;
+ case 3:
+ if ((sp0 = sub_8155E8C()) != 0)
+ {
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ case 4:
+ if (!sub_8155E68())
+ {
+ sub_81549D4(5);
+ sp0 = sub_8155E8C();
+ SendBlock(0, &sp0, sizeof(sp0));
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ case 5:
+ if (IsLinkTaskFinished())
+ {
+ gUnknown_203F3E0->unk10++;
+ gUnknown_203F3E0->unk08 = 0;
+ }
+ break;
+ case 6:
+ blockReceivedStatus = GetBlockReceivedStatus();
+ for (i = 0; i < gUnknown_203F3E0->unk24; blockReceivedStatus >>= 1, i++)
+ {
+ if (blockReceivedStatus & 1)
+ {
+ *(gUnknown_203F3E0->unk10C + i) = *(u8 *)gBlockRecvBuffer[i];
+ ResetBlockReceivedFlag(i);
+ gUnknown_203F3E0->unk08++;
+ }
+ }
+ if (gUnknown_203F3E0->unk08 >= gUnknown_203F3E0->unk24) {
+ if (++gUnknown_203F3E0->unk14 >= 120)
+ {
+ sub_815336C();
+ sub_81549D4(6);
+ gUnknown_203F3E0->unk10++;
+ }
+ }
+ else
+ {
+ sub_81532B8();
+ }
+ break;
+ default:
+ if (!sub_8155E68())
+ {
+ for (i = 0; i < gUnknown_203F3E0->unk24; i++)
+ {
+ if (gUnknown_203F3E0->unk10C[i] == 2)
+ {
+ sub_8152090(8);
+ return;
+ }
+ }
+ sub_8152090(10);
+ }
+ break;
+ }
+}
+
+static void sub_8151488(void)
{
- ANIMCMD_FRAME(0, 20),
- ANIMCMD_JUMP(0)
-};
+ switch (gUnknown_203F3E0->unk10)
+ {
+ case 0:
+ Link_TryStartSend5FFF();
+ sub_81549D4(7);
+ gUnknown_203F3E0->unk10++;
+ break;
+ case 1:
+ if (!sub_8155E68())
+ {
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ case 2:
+ if (sub_8155E8C() == 5)
+ {
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ default:
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ sub_8152090(9);
+ }
+ break;
+ }
+}
-/*static*/ const union AnimCmd sSpriteAnim_8478CC0[] =
+static void sub_81514F0(void)
{
- ANIMCMD_FRAME(64, 20),
- ANIMCMD_JUMP(0)
-};
+ switch (gUnknown_203F3E0->unk10)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gUnknown_203F3E0->unk10++;
+ break;
+ case 1:
+ UpdatePaletteFade();
+ if (!gPaletteFade.active)
+ {
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ case 2:
+ sub_8154274();
+ sub_8153ED8();
+ sub_8153D08(gUnknown_203F3E0->unk24);
+ sub_8154578();
+ gUnknown_3002044 = TRUE;
+ sub_81549D4(8);
+ gUnknown_203F3E0->unk10++;
+ break;
+ default:
+ if (!sub_8155E68())
+ {
+ SetMainCallback2(gUnknown_203F3E0->savedCallback);
+ DestroyTask(gUnknown_203F3E0->unk04);
+ Free(gUnknown_203F3E0);
+ FreeAllWindowBuffers();
+ }
+ break;
+ }
+}
-/*static*/ const union AnimCmd sSpriteAnim_8478CC8[] =
+static void sub_815159C(void)
{
- ANIMCMD_FRAME(128, 20),
- ANIMCMD_JUMP(0)
-};
+ switch (gUnknown_203F3E0->unk10)
+ {
+ case 0:
+ sub_81549D4(9);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gUnknown_203F3E0->unk10++;
+ break;
+ case 1:
+ UpdatePaletteFade();
+ if (!gPaletteFade.active)
+ {
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ case 2:
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ gUnknown_203F3E0->unk10++;
+ break;
+ case 3:
+ StopMapMusic();
+ gUnknown_203F3E0->unk10++;
+ break;
+ case 4:
+ PlayNewMapMusic(MUS_KINOMIKUI);
+ sub_8154540();
+ gUnknown_203F3E0->unk10++;
+ break;
+ case 5:
+ BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ gUnknown_203F3E0->unk10++;
+ break;
+ case 6:
+ UpdatePaletteFade();
+ if (!gPaletteFade.active)
+ {
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ default:
+ DestroyTask(gUnknown_203F3E0->unk04);
+ sub_815206C(sub_81516DC);
+ sub_8154730();
+ sub_81508EC(gUnknown_203F3E0);
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ gUnknown_203F3E0->unk24 = 1;
+ }
+ sub_8153150();
+ sub_81545BC(FALSE);
+ break;
+ }
+}
-/*static*/ const union AnimCmd sSpriteAnim_8478CD0[] =
+static void sub_81516DC(u8 taskId)
{
- ANIMCMD_FRAME(192, 20),
- ANIMCMD_JUMP(0)
-};
+ switch (gUnknown_203F3E0->unk10)
+ {
+ case 0:
+ if (sub_81520B4() == 1)
+ {
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ case 1:
+ sub_8153DD8();
+ gUnknown_203F3E0->unk10++;
+ break;
+ case 2:
+ if (sub_8153F1C() == TRUE)
+ {
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ default:
+ if (gUnknown_203F3E0->unk20 != 0)
+ {
+ sub_815206C(sub_8150C08);
+ }
+ else
+ {
+ sub_815206C(sub_8150C40);
+ }
+ DestroyTask(taskId);
+ break;
+ }
+}
-/*static*/ const union AnimCmd sSpriteAnim_8478CD8[] =
+static void sub_8151750(u8 taskId)
{
- ANIMCMD_FRAME(256, 20),
- ANIMCMD_JUMP(0)
-};
+ s16 * data = gTasks[taskId].data;
+ u8 i;
+ u8 blockReceivedStatus;
+
+ switch (data[0])
+ {
+ case 0:
+ SendBlock(0, &gUnknown_203F3E0->unk318C[gUnknown_203F3E0->multiplayerId].isShiny, sizeof(gUnknown_203F3E0->unk318C[gUnknown_203F3E0->multiplayerId].isShiny));
+ gUnknown_203F3E0->unk08 = 0;
+ data[0]++;
+ break;
+ case 1:
+ if (IsLinkTaskFinished())
+ {
+ data[0]++;
+ }
+ break;
+ case 2:
+ blockReceivedStatus = GetBlockReceivedStatus();
+ for (i = 0; i < gUnknown_203F3E0->unk24; blockReceivedStatus >>= 1, i++)
+ {
+ if (blockReceivedStatus & 1)
+ {
+ *(u8 *)&gUnknown_203F3E0->unk318C[i] = *(u8 *)gBlockRecvBuffer[i];
+ ResetBlockReceivedFlag(i);
+ gUnknown_203F3E0->unk08++;
+ }
+ }
+ if (gUnknown_203F3E0->unk08 >= gUnknown_203F3E0->unk24)
+ {
+ DestroyTask(taskId);
+ sub_81549D4(6);
+ gUnknown_203F3E0->unk10++;
+ }
+ break;
+ }
+}
-/*static*/ const union AnimCmd *const sSpriteAnimTable_8478CE0[] =
+static void sub_815184C(void)
{
- sSpriteAnim_8478CB8,
- sSpriteAnim_8478CC0,
- sSpriteAnim_8478CC8,
- sSpriteAnim_8478CD0,
- sSpriteAnim_8478CD8
-};
+ u8 i;
+ u8 r7 = gUnknown_203F3E0->unk24;
-/*static*/ const union AnimCmd sSpriteAnim_8478CF4[] =
+ gUnknown_203F3E0->unk31A0[0].unk10 = sub_815A950(0, &gUnknown_203F3E0->unk31A0[0], &gUnknown_203F3E0->unk31A0[0].unk2C, &gUnknown_203F3E0->unk31A0[1].unk2C, &gUnknown_203F3E0->unk31A0[2].unk2C, &gUnknown_203F3E0->unk31A0[3].unk2C, &gUnknown_203F3E0->unk31A0[4].unk2C, &gUnknown_203F3E0->unk40, &gUnknown_203F3E0->unk120, &gUnknown_203F3E0->unk12C);
+ gUnknown_203F3E0->unk128 = 1;
+
+ for (i = 1; i < r7; i++)
+ {
+ if ( gUnknown_203F3E0->unkA8[i] == 0
+ && sub_815AB04(i, &gUnknown_203F3E0->unk31A0[i].unk2C.unk0) == 0)
+ {
+ gUnknown_203F3E0->unk31A0[i].unk2C.unk0 = 0;
+ gUnknown_203F3E0->unk128 = 0;
+ }
+ }
+ if (++gUnknown_203F3E0->unk124 >= 60)
+ {
+ if (gUnknown_203F3E0->unk128 != 0)
+ {
+ sub_80FBA44();
+ gUnknown_203F3E0->unk124 = 0;
+ }
+ else if (gUnknown_203F3E0->unk124 > 70)
+ {
+ sub_80FBA44();
+ gUnknown_203F3E0->unk124 = 0;
+ }
+ }
+
+ for (i = 0; i < r7; i++)
+ {
+ if ( gUnknown_203F3E0->unk31A0[i].unk2C.unk0 != 0
+ && gUnknown_203F3E0->unkA8[i] == 0)
+ {
+ gUnknown_203F3E0->unkA8[i] = 1;
+ }
+ switch (gUnknown_203F3E0->unkA8[i])
+ {
+ case 0:
+ default:
+ break;
+ case 1 ... 3:
+ if (++gUnknown_203F3E0->unkB0[i] >= 6)
+ {
+ gUnknown_203F3E0->unkB0[i] = 0;
+ gUnknown_203F3E0->unkA8[i] = 0;
+ gUnknown_203F3E0->unk31A0[i].unk2C.unk0 = 0;
+ gUnknown_203F3E0->unk31A0[i].unk2C.unk4 = 0;
+ gUnknown_203F3E0->unk31A0[i].unk2C.unk8 = 0;
+ }
+ break;
+ case 4:
+ if (++gUnknown_203F3E0->unkB0[i] >= 40)
+ {
+ gUnknown_203F3E0->unkB0[i] = 0;
+ gUnknown_203F3E0->unkA8[i] = 0;
+ gUnknown_203F3E0->unk31A0[i].unk2C.unk0 = 0;
+ gUnknown_203F3E0->unk31A0[i].unk2C.unk4 = 0;
+ gUnknown_203F3E0->unk31A0[i].unk2C.unk8 = 0;
+ }
+ break;
+ }
+ }
+}
+
+static void sub_8151A5C(void)
{
- ANIMCMD_FRAME(0, 20),
- ANIMCMD_JUMP(0)
-};
+ u8 i;
+ u8 r6 = gUnknown_203F3E0->unk24;
-/*static*/ const union AnimCmd sSpriteAnim_8478CFC[] =
+ gUnknown_203F3E0->unk31A0[0].unk10 = sub_815A950(0, &gUnknown_203F3E0->unk31A0[0], &gUnknown_203F3E0->unk31A0[0].unk2C, &gUnknown_203F3E0->unk31A0[1].unk2C, &gUnknown_203F3E0->unk31A0[2].unk2C, &gUnknown_203F3E0->unk31A0[3].unk2C, &gUnknown_203F3E0->unk31A0[4].unk2C, &gUnknown_203F3E0->unk40, &gUnknown_203F3E0->unk120, &gUnknown_203F3E0->unk12C);
+ gUnknown_203F3E0->unk128 = 1;
+
+ for (i = 1; i < r6; i++)
+ {
+ if (sub_815AB60(i) != 0)
+ {
+ gUnknown_203F3E0->unk130[i] = 1;
+ gUnknown_203F3E0->unk128 = 0;
+ }
+ }
+ if (++gUnknown_203F3E0->unk124 >= 60)
+ {
+ if (gUnknown_203F3E0->unk128 != 0)
+ {
+ sub_80FBA44();
+ gUnknown_203F3E0->unk124 = 0;
+ }
+ else if (gUnknown_203F3E0->unk124 > 70)
+ {
+ sub_80FBA44();
+ gUnknown_203F3E0->unk124 = 0;
+ }
+ }
+}
+
+static void sub_8151B54(void)
{
- ANIMCMD_FRAME(4, 20),
- ANIMCMD_JUMP(0)
-};
+ switch (gUnknown_203F3E0->unk18)
+ {
+ case 3:
+ if (sub_8152A00() == TRUE)
+ {
+ sub_8152A70();
+ gUnknown_203F3E0->unk11C = 1;
+ }
+ break;
+ case 4:
+ sub_815184C();
+ break;
+ case 11:
+ sub_8151A5C();
+ break;
+ }
+}
-/*static*/ const union AnimCmd sSpriteAnim_8478D04[] =
+static void sub_8151BA0(void)
{
- ANIMCMD_FRAME(8, 20),
- ANIMCMD_JUMP(0)
-};
+ switch (gUnknown_203F3E0->unk18)
+ {
+ case 4:
+ sub_815A61C(&gUnknown_203F3E0->unk32CC, &gUnknown_203F3E0->unk31A0[0].unk2C, &gUnknown_203F3E0->unk31A0[1].unk2C, &gUnknown_203F3E0->unk31A0[2].unk2C, &gUnknown_203F3E0->unk31A0[3].unk2C, &gUnknown_203F3E0->unk31A0[4].unk2C, gUnknown_203F3E0->unk40, gUnknown_203F3E0->unk120, gUnknown_203F3E0->unk12C);
+ break;
+ case 11:
+ sub_815A61C(&gUnknown_203F3E0->unk32CC, &gUnknown_203F3E0->unk31A0[0].unk2C, &gUnknown_203F3E0->unk31A0[1].unk2C, &gUnknown_203F3E0->unk31A0[2].unk2C, &gUnknown_203F3E0->unk31A0[3].unk2C, &gUnknown_203F3E0->unk31A0[4].unk2C, gUnknown_203F3E0->unk40, gUnknown_203F3E0->unk120, gUnknown_203F3E0->unk12C);
+ break;
+ }
+}
-/*static*/ const union AnimCmd *const sSpriteAnimTable_8478D0C[] =
+static void sub_8151C5C(void)
{
- sSpriteAnim_8478CF4,
- sSpriteAnim_8478CFC,
- sSpriteAnim_8478D04
-};
+ switch (gUnknown_203F3E0->unk18)
+ {
+ case 4:
+ sub_815A950(gUnknown_203F3E0->multiplayerId, &gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId], &gUnknown_203F3E0->unk31A0[0].unk2C, &gUnknown_203F3E0->unk31A0[1].unk2C, &gUnknown_203F3E0->unk31A0[2].unk2C, &gUnknown_203F3E0->unk31A0[3].unk2C, &gUnknown_203F3E0->unk31A0[4].unk2C, &gUnknown_203F3E0->unk40, &gUnknown_203F3E0->unk120, &gUnknown_203F3E0->unk12C);
+ break;
+ case 11:
+ sub_815A950(gUnknown_203F3E0->multiplayerId, &gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId], &gUnknown_203F3E0->unk31A0[0].unk2C, &gUnknown_203F3E0->unk31A0[1].unk2C, &gUnknown_203F3E0->unk31A0[2].unk2C, &gUnknown_203F3E0->unk31A0[3].unk2C, &gUnknown_203F3E0->unk31A0[4].unk2C, &gUnknown_203F3E0->unk40, &gUnknown_203F3E0->unk120, &gUnknown_203F3E0->unk12C);
+ break;
+ }
+}
-/*static*/ const union AnimCmd sSpriteAnim_8478D18[] =
+static void sub_8151D28(void)
{
- ANIMCMD_FRAME(0, 20),
- ANIMCMD_JUMP(0)
-};
+ switch (gUnknown_203F3E0->unk18)
+ {
+ case 3:
+ sub_815A5BC(1);
+ gUnknown_203F3E0->unk11C = 1;
+ break;
+ case 4:
+ if (gUnknown_203F3E0->unk32CC.unk2C.unk0 != 0)
+ {
+ sub_815AAD8(gUnknown_203F3E0->unk32CC.unk2C.unk0);
+ }
+ break;
+ case 11:
+ if (gUnknown_203F3E0->unk120 == 0 && gUnknown_203F3E0->unk12C == 0)
+ {
+ sub_815AB3C(1);
+ }
+ break;
+ }
+}
-/*static*/ const union AnimCmd sSpriteAnim_8478D20[] =
+static void sub_8151D98(void)
{
- ANIMCMD_FRAME(4, 20),
- ANIMCMD_JUMP(0)
-};
+ if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 == 0)
+ {
+ if (!IsSEPlaying())
+ {
+ gUnknown_203F3E0->unk144 = 0;
+ }
+ }
+ else if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk4 == 1)
+ {
+ if (gUnknown_203F3E0->unk144 == 0)
+ {
+ m4aSongNumStop(SE_SEIKAI);
+ PlaySE(SE_SEIKAI);
+ gUnknown_203F3E0->unk144 = 1;
+ }
+ }
+ else if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk8 == 1)
+ {
+ if (gUnknown_203F3E0->unk144 == 0 && !IsSEPlaying())
+ {
+ PlaySE(SE_BOO);
+ sub_8153BC0(1);
+ gUnknown_203F3E0->unk144 = 1;
+ }
+ }
-/*static*/ const union AnimCmd sSpriteAnim_8478D28[] =
+ if (gUnknown_203F3E0->unk154 == 0 && gUnknown_203F3E0->unk40 >= 10)
+ {
+ StopMapMusic();
+ gUnknown_203F3E0->unk154 = 1;
+ }
+ else if (gUnknown_203F3E0->unk154 == 1)
+ {
+ PlayFanfareByFanfareNum(FANFARE_10); // MUS_ME_ZANNEN
+ gUnknown_203F3E0->unk154 = 2;
+ }
+}
+
+static void sub_8151E94(void)
{
- ANIMCMD_FRAME(8, 20),
- ANIMCMD_JUMP(0)
-};
+ u8 r8 = gUnknown_203F3E0->unk44;
+ u8 r7 = gUnknown_203F3E0->unk48;
+ u8 r4;
+ if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 == 0)
+ {
+ if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk4 != 1 && gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk8 != 1)
+ {
+ gUnknown_203F3E0->unk144 = 0;
+ }
+ }
+ else if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk4 == 1)
+ {
+ if (gUnknown_203F3E0->unk144 == 0)
+ {
+ m4aSongNumStop(SE_SEIKAI);
+ PlaySE(SE_SEIKAI);
+ gUnknown_203F3E0->unk144 = 1;
+ }
+ }
+ else if (gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk8 == 1)
+ {
+ if (gUnknown_203F3E0->unk144 == 0 && !IsSEPlaying())
+ {
+ PlaySE(SE_BOO);
+ sub_8153BC0(1);
+ gUnknown_203F3E0->unk144 = 1;
+ }
+ }
+ for (r4 = r8; r4 < r7; r4++)
+ {
+ struct DodrioSubstruct_31A0_14 * ptr = &gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk14;
+ if (ptr->unkB[r4] >= 10)
+ {
+ if (gUnknown_203F3E0->unk148[r4] == 0)
+ {
+ PlaySE(SE_FUUSEN1 + ptr->unk0[r4]);
+ gUnknown_203F3E0->unk148[r4] = 1;
+ }
+ }
+ else
+ {
+ gUnknown_203F3E0->unk148[r4] = 0;
+ }
+ }
+ if (gUnknown_203F3E0->unk154 == 0 && gUnknown_203F3E0->unk40 >= 10)
+ {
+ StopMapMusic();
+ gUnknown_203F3E0->unk154 = 1;
+ }
+ else if (gUnknown_203F3E0->unk154 == 1)
+ {
+ PlayFanfareByFanfareNum(FANFARE_10); // MUS_ME_ZANNEN
+ gUnknown_203F3E0->unk154 = 2;
+ }
+}
-/*static*/ const union AnimCmd sSpriteAnim_8478D30[] =
+static void sub_815201C(void)
{
- ANIMCMD_FRAME(12, 20),
- ANIMCMD_JUMP(0)
-};
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
-/*static*/ const union AnimCmd sSpriteAnim_8478D38[] =
+static void sub_8152034(void)
{
- ANIMCMD_FRAME(16, 20),
- ANIMCMD_JUMP(0)
-};
+ TransferPlttBuffer();
+ LoadOam();
+ ProcessSpriteCopyRequests();
+}
-/*static*/ const union AnimCmd sSpriteAnim_8478D40[] =
+static void sub_8152048(struct DodrioSubstruct_318C * a0, struct Pokemon * a1)
{
- ANIMCMD_FRAME(20, 20),
- ANIMCMD_JUMP(0)
-};
+ a0->isShiny = IsMonShiny(a1);
+}
-/*static*/ const union AnimCmd sSpriteAnim_8478D48[] =
+static void sub_815205C(TaskFunc func, u8 priority)
{
- ANIMCMD_FRAME(24, 20),
- ANIMCMD_JUMP(0)
-};
+ CreateTask(func, priority);
+}
-/*static*/ const union AnimCmd sSpriteAnim_8478D50[] =
+static void sub_815206C(TaskFunc func)
{
- ANIMCMD_FRAME(28, 20),
- ANIMCMD_JUMP(0)
-};
+ gUnknown_203F3E0->unk04 = CreateTask(func, 1);
+ gUnknown_203F3E0->unk10 = 0;
+ gUnknown_203F3E0->unk0C = 0;
+ gUnknown_203F3E0->unk14 = 0;
+}
-/*static*/ const union AnimCmd sSpriteAnim_8478D58[] =
+static void sub_8152090(u8 a0)
{
- ANIMCMD_FRAME(32, 20),
- ANIMCMD_JUMP(0)
-};
+ gUnknown_203F3E0->unk1C = gUnknown_203F3E0->unk18;
+ gUnknown_203F3E0->unk18 = a0;
+ gUnknown_203F3E0->unk10 = 0;
+ gUnknown_203F3E0->unk14 = 0;
+}
-/*static*/ const union AnimCmd *const sSpriteAnimTable_8478D60[] =
-{
- sSpriteAnim_8478D18,
- sSpriteAnim_8478D20,
- sSpriteAnim_8478D28,
- sSpriteAnim_8478D30,
- sSpriteAnim_8478D38,
- sSpriteAnim_8478D40,
- sSpriteAnim_8478D48,
- sSpriteAnim_8478D50,
- sSpriteAnim_8478D58
-};
+static bool32 sub_81520B4(void)
+{
+ u8 r2 = gUnknown_203F3E0->unk14 / 4;
+ gUnknown_203F3E0->unk14++;
+ if (r2 != 0 && gUnknown_203F3E0->unk14 % 4 == 0)
+ {
+ if (r2 < sUnknown_8475548[gUnknown_203F3E0->unk24 - 1])
+ {
+ SetGpuReg(REG_OFFSET_BG1HOFS, (r2 * 8));
+ SetGpuReg(REG_OFFSET_BG2HOFS, -(r2 * 8));
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+ }
+ else
+ {
+ return FALSE;
+ }
+}
-/*static*/ const union AnimCmd sSpriteAnim_8478D84[] =
+static void sub_8152110(void)
{
- ANIMCMD_FRAME(0, 20),
- ANIMCMD_JUMP(0)
-};
+ u8 i;
+ u8 start = gUnknown_203F3E0->unk44;
+ u8 finish = gUnknown_203F3E0->unk48;
+
+ for (i = start; i < finish; i++)
+ {
+ struct DodrioSubstruct_31A0_14 * ptr = &gUnknown_203F3E0->unk32CC.unk14;
+ ptr->unkB[i] = (i % 2 == 0) ? 1 : 0;
+ ptr->unk0[i] = 0;
+ }
+}
-/*static*/ const union AnimCmd *const sSpriteAnimTable_8478D8C[] =
+static void sub_8152174(void)
{
- sSpriteAnim_8478D84
-};
+ u8 sp0 = gUnknown_203F3E0->unk44;
+ u8 sp4 = gUnknown_203F3E0->unk48;
+ u8 sp8 = gUnknown_203F3E0->unk24;
+ u8 i, j, k, r5;
-// These are declared inside pokeemerald's sub_80283A8
-const struct SpritePalette gUnknown_8478D90 = {sDodrioBerryPkmnPal, 0};
-const struct SpritePalette gUnknown_8478D98 = {sDodrioBerryShinyPal, 1};
-
-// These are declared inside pokeemerald's sub_8028734
-const struct SpritePalette gUnknown_8478DA0 = {sDodrioBerryStatusPal, 2};
-const struct SpriteTemplate gUnknown_8478DA8 =
- {
- .tileTag = 1,
- .paletteTag = 2,
- .oam = &sOamData_8478CA0,
- .anims = sSpriteAnimTable_8478D0C,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = nullsub_97,
- };
-
-// Unknown unused data, feel free to remove.
-/*static*/ const u8 sUnused2[] = {0xCD, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0xF4, 0x0, 0x0};
-
-// This is declared inside pokeemerald's sub_8028A34
-const struct SpritePalette gUnknown_8478DCC = {sDodrioBerrySpritesPal, 3};
-
-/*static*/ const s16 sUnknown_8478DD4[] = {88, 128, 168, 208};
-
-// These are declared inside pokeemerald's sub_8028A88
-const struct SpriteTemplate gUnknown_8478DDC =
- {
- .tileTag = 2,
- .paletteTag = 3,
- .oam = &sOamData_8478CA8,
- .anims = sSpriteAnimTable_8478D60,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy,
- };
-const struct SpriteTemplate gUnknown_8478DF4 =
- {
- .tileTag = 2,
- .paletteTag = 3,
- .oam = &sOamData_8478CA0,
- .anims = sSpriteAnimTable_8478D60,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy,
- };
-
-// This is declared inside pokeemerald's sub_8028CF4
-/*static*/ const u8 gUnknown_8478E0C[] = {30, 20};
-
-/*static*/ const s16 gUnknown_8478E0E[][2] = {{230, 55}, {30, 74}};
-
-// These are declared inside pokeemerald's sub_8028D44
-const struct SpritePalette gUnknown_8478E18 = {sDodrioBerryPlatformPal, 6};
-const struct SpriteTemplate gUnknown_8478E20 =
- {
- .tileTag = 5,
- .paletteTag = 6,
- .oam = &sOamData_8478CB0,
- .anims = sSpriteAnimTable_8478D8C,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_81543E8,
- };
-
-struct WinCoords
-{
- u8 left;
- u8 top;
-};
+ if (gUnknown_203F3E0->unk40 >= 10)
+ return;
+
+ for (i = 0; i < sp8; i++)
+ {
+ u8 *ptr = &gUnknown_203F3E0->unk31A0[i].unk2C.unk0;
+ if (*ptr != 0 && gUnknown_203F3E0->unkA8[i] == 1)
+ {
+ for (j = sp0; j < sp4; j++)
+ {
+ r5 = sUnknown_8471F50[0][0][j];
+ if (gUnknown_203F3E0->unkF4[r5][0] == i || gUnknown_203F3E0->unkF4[r5][1] == i)
+ break;
+ if (sub_8152484(i, *ptr, r5) == TRUE)
+ {
+ for (k = 0; k < 2; k++)
+ {
+ if (gUnknown_203F3E0->unkF4[r5][k] == 0xFF)
+ {
+ gUnknown_203F3E0->unkF4[r5][k] = i;
+ gUnknown_203F3E0->unkA8[i] = 2;
+ gUnknown_203F3E0->unkC4[r5] = 1;
+ break;
+ }
+ }
+ break;
+ }
+ if (gUnknown_203F3E0->unk31A0[i].unk2C.unk8 == 1)
+ break;
+ }
+ }
+ }
+
+ for (j = sp0; j < sp4; j++)
+ {
+ u8 id = 0xFF;
+ r5 = sUnknown_8471F50[0][0][j];
+ if (gUnknown_203F3E0->unkC4[r5] == 1)
+ {
+ s32 r2;
+ u8 r4, r3 = gUnknown_203F3E0->unk90[sub_8152BD4(r5)] / 7;
+ if (r3 >= NELEMS(sUnknown_847553C) - 1)
+ r3 = NELEMS(sUnknown_847553C) - 1;
+
+ r2 = sUnknown_847553C[r3][gUnknown_203F3E0->unk31A0[0].unk14.unk0[r5]] - gUnknown_203F3E0->unkD0[r5];
+ if (r2 < 6)
+ gUnknown_203F3E0->unk9C[r5] += r2;
+
+ if (++gUnknown_203F3E0->unk9C[r5] >= 6)
+ {
+ gUnknown_203F3E0->unk9C[r5] = 0;
+ if (gUnknown_203F3E0->unkF4[r5][0] == 0xFF && gUnknown_203F3E0->unkF4[r5][1] == 0xFF)
+ {
+ continue;
+ }
+ else if (gUnknown_203F3E0->unkF4[r5][0] != 0xFF && gUnknown_203F3E0->unkF4[r5][1] == 0xFF)
+ {
+ r4 = gUnknown_203F3E0->unkF4[r5][0];
+ }
+ else
+ {
+ u8 unk0 = gUnknown_203F3E0->unkF4[r5][0];
+ i = gUnknown_203F3E0->unkF4[r5][1]; // Have to re-use the variable to match.
+ if (!(Random() & 1))
+ {
+ r4 = unk0;
+ id = i;
+ }
+ else
+ {
+ r4 = i;
+ id = unk0;
+ }
+ }
+ gUnknown_203F3E0->unk32CC.unk14.unkB[r5] = 7;
+ gUnknown_203F3E0->unkC4[r5] = 2;
+ gUnknown_203F3E0->unkA8[r4] = 3;
+ gUnknown_203F3E0->unkB8[r5] = r4;
+ gUnknown_203F3E0->unk31A0[r4].unk2C.unk4 = 1;
+ gUnknown_203F3E0->unk31A0[id].unk2C.unk8 = 1;
+ gUnknown_203F3E0->unk86[r4]++;
+ sub_8152D34(0, r5, r4);
+ sub_8152F94(TRUE);
+ sub_8152B64(r4);
+ gUnknown_203F3E0->unkE8[r5] = gUnknown_203F3E0->unk32CC.unk14.unk0[r5];
+ gUnknown_203F3E0->unk32CC.unk14.unk0[r5] = 3;
+ gUnknown_203F3E0->unkF4[r5][0] = 0xFF;
+ gUnknown_203F3E0->unkF4[r5][1] = 0xFF;
+ }
+ }
+ }
+}
-/*static*/ const u8 sUnknown_8478E38[][3] =
+static bool32 sub_8152484(u8 a0, u8 a1, u8 a2)
{
- {1, 2, 3},
- {1, 4, 5},
- {1, 8, 9},
- {1, 6, 7},
-};
+ s32 r7 = 0;
+ u8 r5 = gUnknown_203F3E0->unk24 - 1;
+ struct DodrioSubstruct_31A0_14 * ptr = &gUnknown_203F3E0->unk32CC.unk14;
+
+ switch (a1)
+ {
+ case 3:
+ default:
+ r7 = 0;
+ break;
+ case 2:
+ r7 = 1;
+ break;
+ case 1:
+ r7 = 2;
+ break;
+ }
+ if (ptr->unkB[a2] == 6 || ptr->unkB[a2] == 7)
+ {
+ if (a2 == sUnknown_8472063[r5][a0][r7])
+ {
+ if (gUnknown_203F3E0->unkC4[a2] == 1 || gUnknown_203F3E0->unkC4[a2] == 2)
+ {
+ gUnknown_203F3E0->unk31A0[a0].unk2C.unk8 = 1;
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+ }
+ }
+ else
+ {
+ if (a2 == sUnknown_8472063[r5][a0][r7])
+ {
+ gUnknown_203F3E0->unkA8[a0] = 4;
+ gUnknown_203F3E0->unk31A0[a0].unk2C.unk8 = 1;
+ }
+ }
+ return FALSE;
+}
+
+static void sub_815256C(void)
+{
+ u8 r1 = gUnknown_203F3E0->unk44;
+ u8 r9 = gUnknown_203F3E0->unk48;
+ u8 r3 = 0;
+ u8 r10 = 0;
+ u8 i;
+ u8 r2;
+ struct DodrioStruct * ptr;
+
+ gUnknown_203F3E0->unk120 = 0;
+
+ for (i = r1; i < r9 - 1; i++)
+ {
+ ptr = gUnknown_203F3E0;
+
+ if (gUnknown_203F3E0->unkC4[i] == 0 || gUnknown_203F3E0->unkC4[i] == 1)
+ {
+ gUnknown_203F3E0->unk120 = 1;
+ if (ptr->unk32CC.unk14.unkB[i] >= 10)
+ {
+ ptr->unk32CC.unk14.unkB[i] = 10;
+ gUnknown_203F3E0->unkC4[i] = 3;
+ if (gUnknown_203F3E0->unk148[i] == 0)
+ {
+ gUnknown_203F3E0->unk148[i] = 1;
+ PlaySE(SE_FUUSEN1 + ptr->unk32CC.unk14.unk0[i]);
+ }
+ if (gUnknown_203F3E0->unk40 < 10 || r10 == 1)
+ {
+ r10 = 1;
+ gUnknown_203F3E0->unk148[i] = 0;
+ if (gUnknown_203F3E0->unk40 < 10)
+ {
+ gUnknown_203F3E0->unk40++;
+ }
+ sub_8152D34(3, i, 0);
+ sub_8152F94(FALSE);
+ }
+ }
+ else
+ {
+ r3 = gUnknown_203F3E0->unk90[sub_8152BD4(i)] / 7;
+ if (r3 >= NELEMS(sUnknown_847553C) - 1)
+ {
+ r3 = NELEMS(sUnknown_847553C) - 1;
+ }
+ r2 = sUnknown_847553C[r3][ptr->unk32CC.unk14.unk0[i]];
+ if (++gUnknown_203F3E0->unkD0[i] >= r2)
+ {
+ ptr->unk32CC.unk14.unkB[i]++;
+ gUnknown_203F3E0->unkD0[i] = 0;
+ }
+ sub_8152174();
+ }
+ }
+ else if (gUnknown_203F3E0->unkC4[i] == 2)
+ {
+ // gUnknown_203F3E0->unk120 = 1;
+ if (++gUnknown_203F3E0->unkDC[i] >= 20)
+ {
+ gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->unkB8[i]].unk2C.unk4 = 0;
+ gUnknown_203F3E0->unkDC[i] = 0;
+ gUnknown_203F3E0->unkD0[i] = 0;
+ gUnknown_203F3E0->unkC4[i] = 0;
+ ptr->unk32CC.unk14.unkB[i] = 1;
+ ptr->unk32CC.unk14.unk0[i] = sub_8152BF8(sub_8152BD4(i), i);
+ }
+ }
+ else if (gUnknown_203F3E0->unkC4[i] == 3)
+ {
+ if (++gUnknown_203F3E0->unkDC[i] >= 20)
+ {
+ if (gUnknown_203F3E0->unk40 < 10)
+ {
+ gUnknown_203F3E0->unkDC[i] = 0;
+ gUnknown_203F3E0->unkD0[i] = 0;
+ gUnknown_203F3E0->unkC4[i] = 0;
+ ptr->unk32CC.unk14.unkB[i] = 1;
+ gUnknown_203F3E0->unkE8[i] = ptr->unk32CC.unk14.unk0[i];
+ ptr->unk32CC.unk14.unk0[i] = sub_8152BF8(sub_8152BD4(i), i);
+ }
+ }
+ }
+ }
+}
+
+static void sub_81527D0(void)
+{
+ u8 i, first, count;
+
+ first = gUnknown_203F3E0->unk44;
+ count = gUnknown_203F3E0->unk48;
+ for (i = first; i < count; i++)
+ {
+ struct DodrioSubstruct_31A0 * ptr = &gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId];
+ u8 var = sUnknown_8471F50[gUnknown_203F3E0->unk24 - 1][gUnknown_203F3E0->multiplayerId][i];
+
+ if (ptr->unk14.unkB[var] != 0)
+ sub_81542EC(i, FALSE);
+ else
+ sub_81542EC(i, TRUE);
+
+ if (ptr->unk14.unkB[var] > 9)
+ {
+ sub_8154398(i, ptr->unk14.unk0[var] + 3);
+ sub_8154370(i, ptr->unk14.unkB[var] * 2 - 1);
+ }
+ else if (ptr->unk14.unk0[var] == 3)
+ {
+ ptr->unk14.unkB[var] = 7;
+ sub_8154398(i, 6);
+ sub_8154370(i, ptr->unk14.unkB[var] * 2 - 1);
+ }
+ else
+ {
+ sub_8154398(i, ptr->unk14.unk0[var]);
+ sub_8154370(i, ptr->unk14.unkB[var] * 2);
+ }
+ }
+}
+
+static void sub_81528D0(void)
+{
+ u8 i, count;
+
+ count = gUnknown_203F3E0->unk24;
+ for (i = 0; i < count; i++)
+ {
+ struct DodrioSubstruct_31A0 * ptr = &gUnknown_203F3E0->unk31A0[i];
+ sub_8153DA8(i, ptr->unk2C.unk0);
+ }
+}
+
+static void sub_8152910(void)
+{
+ u8 i, count;
+
+ count = gUnknown_203F3E0->unk24;
+ for (i = 0; i < count; i++)
+ sub_8153DA8(i, 4);
+}
+
+static void sub_815293C(void)
+{
+ sub_81527D0();
+ if (gUnknown_203F3E0->unk40 > 9)
+ sub_8152910();
+ else
+ sub_81528D0();
+
+ sub_8153FC8(gUnknown_203F3E0->unk40);
+}
+
+// This function is literally the same as the one above...Why?
+static void sub_8152970(void)
+{
+ sub_81527D0();
+ if (gUnknown_203F3E0->unk40 > 9)
+ sub_8152910();
+ else
+ sub_81528D0();
+
+ sub_8153FC8(gUnknown_203F3E0->unk40);
+}
+
+static void sub_81529A4(u8 arg0, u8 *arg1, u8 *arg2)
+{
+ switch (arg0)
+ {
+ case 1:
+ *arg1 = 4, *arg2 = 7;
+ break;
+ case 2:
+ *arg1 = 3, *arg2 = 8;
+ break;
+ case 3:
+ *arg1 = 2, *arg2 = 9;
+ break;
+ case 4:
+ *arg1 = 1, *arg2 = 10;
+ break;
+ case 5:
+ *arg1 = 0, *arg2 = 11;
+ break;
+ }
+}
+
+static bool32 sub_8152A00(void)
+{
+ u8 i, count;
+
+ count = gUnknown_203F3E0->unk24;
+ for (i = 1; i < count; i++)
+ {
+ if (gUnknown_203F3E0->unk158[i] == 0)
+ gUnknown_203F3E0->unk158[i] = sub_815A5E8(i);
+ }
+
+ // This loop won't ever run, the seemingly pointless assingment below is to make the compiler
+ // generate code for it.
+ count = count;
+ for (; i < count; i++)
+ {
+ if (gUnknown_203F3E0->unk158[i] == 0)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void sub_8152A70(void)
+{
+ u8 i;
+
+ for (i = 0; i < 5; i++)
+ gUnknown_203F3E0->unk158[i] = 0;
+}
+
+static bool32 sub_8152A98(void)
+{
+ if (gUnknown_203F3E0->unk40 > 9 && gUnknown_203F3E0->unk120 == 0)
+ {
+ gUnknown_203F3E0->unk40 = 10;
+ if (gUnknown_203F3E0->unk12C != 0)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool32 sub_8152AD8(void)
+{
+ u8 i, first, count;
+
+ if (gUnknown_203F3E0->unk40 > 9)
+ {
+ first = gUnknown_203F3E0->unk44;
+ count = gUnknown_203F3E0->unk48;
+ gUnknown_203F3E0->unk40 = 10;
+ if (gUnknown_203F3E0->unk12C != 0)
+ {
+ for (i = first; i < count; i++)
+ {
+ struct DodrioSubstruct_31A0 * ptr = &gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId];
+ u8 var = sUnknown_8471F50[gUnknown_203F3E0->unk24 - 1][gUnknown_203F3E0->multiplayerId][i];
+
+ if (ptr->unk14.unkB[var] != 10)
+ return FALSE;
+ }
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static void sub_8152B64(u8 arg0)
+{
+ u8 var = sUnknown_8475550[gUnknown_203F3E0->unk90[arg0] % 7] + (gUnknown_203F3E0->unk90[arg0] / 7) * 100;
+ if (gUnknown_203F3E0->unk86[arg0] >= var)
+ gUnknown_203F3E0->unk90[arg0]++;
+}
+
+static u8 sub_8152BD4(u8 arg0)
+{
+ return sUnknown_84720FC[gUnknown_203F3E0->unk24 - 1][arg0];
+}
+
+static u8 sub_8152BF8(u8 arg0, u8 arg1)
+{
+ u8 i, var3;
+ u8 count = gUnknown_203F3E0->unk24 - 1;
+ u8 var0 = sUnknown_84720AE[count][arg0][0];
+ u8 var1 = sUnknown_84720AE[count][arg0][1];
+ u8 var2 = sUnknown_84720AE[count][arg0][2];
+
+ for (i = 0; sUnknown_8472133[count][i] != 0; i++)
+ {
+ if (arg1 == sUnknown_8472133[count][i])
+ return sub_8152CB8(gUnknown_203F3E0->unk90[var1], arg1);
+ }
+
+ // Gets the highest of the three.
+ if (gUnknown_203F3E0->unk90[var0] > gUnknown_203F3E0->unk90[var1])
+ var3 = gUnknown_203F3E0->unk90[var0];
+ else
+ var3 = gUnknown_203F3E0->unk90[var1];
+
+ if (gUnknown_203F3E0->unk90[var2] > var3)
+ var3 = gUnknown_203F3E0->unk90[var2];
+
+ return sub_8152CB8(var3, arg1);
+}
+
+static u8 sub_8152CB8(u8 arg0, u8 arg1)
+{
+ u8 var = gUnknown_203F3E0->unkE8[arg1];
+ switch (arg0 % 7)
+ {
+ default: return 0;
+ case 0: return 0;
+ case 1: return 1;
+ case 2: return 2;
+ case 3:
+ if (var == 0)
+ return 1;
+ else
+ return 0;
+ case 4:
+ if (var == 0)
+ return 2;
+ else
+ return 0;
+ case 5:
+ if (var == 2)
+ return 1;
+ else
+ return 2;
+ case 6:
+ if (var == 0)
+ return 1;
+ else if (var == 1)
+ return 2;
+ else
+ return 0;
+ }
+}
+
+static void sub_8152D34(u8 arg0, u8 arg1, u8 arg2)
+{
+ u8 var;
+ u8 count = gUnknown_203F3E0->unk24;
+ switch (arg0)
+ {
+ case 0:
+ case 1:
+ case 2:
+ var = gUnknown_203F3E0->unk31A0[0].unk14.unk0[arg1];
+ gUnknown_203F3E0->unk4A[arg2][var] = IncrementWithLimit(gUnknown_203F3E0->unk4A[arg2][var], 20000);
+ break;
+ case 3:
+ switch (count)
+ {
+ case 5:
+ switch (arg1)
+ {
+ case 0:
+ gUnknown_203F3E0->unk4A[2][3]++;
+ gUnknown_203F3E0->unk4A[3][3]++;
+ break;
+ case 1:
+ gUnknown_203F3E0->unk4A[3][3]++;
+ break;
+ case 2:
+ gUnknown_203F3E0->unk4A[3][3]++;
+ gUnknown_203F3E0->unk4A[4][3]++;
+ break;
+ case 3:
+ gUnknown_203F3E0->unk4A[4][3]++;
+ break;
+ case 4:
+ gUnknown_203F3E0->unk4A[4][3]++;
+ gUnknown_203F3E0->unk4A[0][3]++;
+ break;
+ case 5:
+ gUnknown_203F3E0->unk4A[0][3]++;
+ break;
+ case 6:
+ gUnknown_203F3E0->unk4A[0][3]++;
+ gUnknown_203F3E0->unk4A[1][3]++;
+ break;
+ case 7:
+ gUnknown_203F3E0->unk4A[1][3]++;
+ break;
+ case 8:
+ gUnknown_203F3E0->unk4A[1][3]++;
+ gUnknown_203F3E0->unk4A[2][3]++;
+ break;
+ case 9:
+ gUnknown_203F3E0->unk4A[2][3]++;
+ break;
+ }
+ break;
+ case 4:
+ switch (arg1)
+ {
+ case 1:
+ gUnknown_203F3E0->unk4A[2][3]++;
+ gUnknown_203F3E0->unk4A[3][3]++;
+ break;
+ case 2:
+ gUnknown_203F3E0->unk4A[3][3]++;
+ break;
+ case 3:
+ gUnknown_203F3E0->unk4A[3][3]++;
+ gUnknown_203F3E0->unk4A[0][3]++;
+ break;
+ case 4:
+ gUnknown_203F3E0->unk4A[0][3]++;
+ break;
+ case 5:
+ gUnknown_203F3E0->unk4A[0][3]++;
+ gUnknown_203F3E0->unk4A[1][3]++;
+ break;
+ case 6:
+ gUnknown_203F3E0->unk4A[1][3]++;
+ break;
+ case 7:
+ gUnknown_203F3E0->unk4A[1][3]++;
+ gUnknown_203F3E0->unk4A[2][3]++;
+ break;
+ case 8:
+ gUnknown_203F3E0->unk4A[2][3]++;
+ break;
+ }
+ break;
+ case 3:
+ switch (arg1)
+ {
+ case 2:
+ gUnknown_203F3E0->unk4A[1][3]++;
+ gUnknown_203F3E0->unk4A[2][3]++;
+ break;
+ case 3:
+ gUnknown_203F3E0->unk4A[2][3]++;
+ break;
+ case 4:
+ gUnknown_203F3E0->unk4A[2][3]++;
+ gUnknown_203F3E0->unk4A[0][3]++;
+ break;
+ case 5:
+ gUnknown_203F3E0->unk4A[0][3]++;
+ break;
+ case 6:
+ gUnknown_203F3E0->unk4A[0][3]++;
+ gUnknown_203F3E0->unk4A[1][3]++;
+ break;
+ case 7:
+ gUnknown_203F3E0->unk4A[1][3]++;
+ break;
+ }
+ break;
+ case 2:
+ switch (arg1)
+ {
+ case 3:
+ gUnknown_203F3E0->unk4A[0][3]++;
+ gUnknown_203F3E0->unk4A[1][3]++;
+ break;
+ case 4:
+ gUnknown_203F3E0->unk4A[0][3]++;
+ break;
+ case 5:
+ gUnknown_203F3E0->unk4A[0][3]++;
+ gUnknown_203F3E0->unk4A[1][3]++;
+ break;
+ case 6:
+ gUnknown_203F3E0->unk4A[1][3]++;
+ break;
+ }
+ break;
+ }
+ break;
+ }
+}
+
+static void sub_8152F94(bool32 arg0)
+{
+ if (gUnknown_203F3E0->unk24 != 5)
+ return;
+
+ if (arg0 == TRUE)
+ {
+ if (++gUnknown_203F3E0->unk112 > gUnknown_203F3E0->unk114)
+ gUnknown_203F3E0->unk114 = gUnknown_203F3E0->unk112;
+ if (gUnknown_203F3E0->unk112 > 9999)
+ gUnknown_203F3E0->unk112 = 9999;
+ }
+ else
+ {
+ if (gUnknown_203F3E0->unk112 > gUnknown_203F3E0->unk114)
+ gUnknown_203F3E0->unk114 = gUnknown_203F3E0->unk112;
+ gUnknown_203F3E0->unk112 = 0;
+ }
+}
+
+static void sub_8153004(void)
+{
+ u8 i;
+ for (i = 0; i < gUnknown_203F3E0->unk24; i++)
+ gUnknown_203F3E0->unk4A[i][5] = gUnknown_203F3E0->unk114;
+}
+
+static void sub_8153048(void)
+{
+ u8 i, j;
-/*static*/ const struct WinCoords sUnknown_8478E44[] = {{12, 6}};
-/*static*/ const struct WinCoords sUnknown_8478E48[] = {{9, 10}, {15, 6}};
-/*static*/ const struct WinCoords sUnknown_8478E50[] = {{12, 6}, {18, 10}, {6, 10}};
-/*static*/ const struct WinCoords sUnknown_8478E5C[] = {{9, 10}, {15, 6}, {21, 10}, {3, 6}};
-/*static*/ const struct WinCoords sUnknown_8478E6C[] = {{12, 6}, {18, 10}, {23, 6}, {1, 6}, {6, 10}};
+ for (i = 0; i < 5; i++)
+ {
+ for (j = 0; j < 11; j++)
+ gUnknown_203F3E0->unk31A0[i].unk14.unkB[j] = 0;
+ gUnknown_203F3E0->unk31A0[i].unk2C.unk0 = 0;
+ gUnknown_203F3E0->unk31A0[i].unk2C.unk4 = 0;
+ gUnknown_203F3E0->unk90[i] = 0;
+ gUnknown_203F3E0->unk86[i] = 0;
+ gUnknown_203F3E0->unk3308[i].unk0 = 0;
+ gUnknown_203F3E0->unk3308[i].unk4 = 0;
+ gUnknown_203F3E0->unk4A[i][0] = 0;
+ gUnknown_203F3E0->unk4A[i][1] = 0;
+ gUnknown_203F3E0->unk4A[i][2] = 0;
+ gUnknown_203F3E0->unk4A[i][3] = 0;
+ gUnknown_203F3E0->unk4A[i][4] = 0;
+ gUnknown_203F3E0->unk4A[i][5] = 0;
+ }
+ gUnknown_203F3E0->unk154 = 0;
+ gUnknown_203F3E0->unk112 = 0;
+ gUnknown_203F3E0->unk40 = 0;
+ sub_81528D0();
+ sub_81527D0();
+}
+
+static const s16 sUnknown_84755D8[] = {10, 30, 50, 50};
+
+static void sub_8153150(void)
+{
+ u8 i, var = 0, var2 = 0;
+
+ switch (gUnknown_203F3E0->unk24)
+ {
+ case 4: var = 1; break;
+ case 5: var = 2; break;
+ }
+
+ var2 = Random() % 10;
+ for (i = 0; i < 5; i++)
+ gUnknown_203F3E0->unk4A[i][4] = sUnknown_8475558[var][var2];
+}
+
+static u32 sub_81531BC(u8 arg0)
+{
+ u32 sum = gUnknown_203F3E0->unk4A[arg0][0]
+ + gUnknown_203F3E0->unk4A[arg0][1]
+ + gUnknown_203F3E0->unk4A[arg0][2];
+ return min(sum, 9999);
+}
+
+static void sub_81531FC(void)
+{
+ u32 berriesPicked = Min(sub_81531BC(gUnknown_203F3E0->multiplayerId), 9999);
+ u32 score = Min(sub_8153424(gUnknown_203F3E0->multiplayerId), 999990);
+
+ if (gSaveBlock2Ptr->berryPick.bestScore < score)
+ gSaveBlock2Ptr->berryPick.bestScore = score;
+ if (gSaveBlock2Ptr->berryPick.berriesPicked < berriesPicked)
+ gSaveBlock2Ptr->berryPick.berriesPicked = berriesPicked;
+ if (gSaveBlock2Ptr->berryPick.berriesPickedInRow < gUnknown_203F3E0->unk114)
+ gSaveBlock2Ptr->berryPick.berriesPickedInRow = gUnknown_203F3E0->unk114;
+}
+
+static u8 sub_815327C(u8 arg0)
+{
+ u8 i, saved;
+
+ saved = gUnknown_203F3E0->unk98[3];
+ for (i = 3; i != 0; i--)
+ gUnknown_203F3E0->unk98[i] = gUnknown_203F3E0->unk98[i - 1];
+ gUnknown_203F3E0->unk98[0] = arg0;
+ return saved;
+}
+
+static void sub_81532B8(void)
+{
+ if (gUnknown_203F3E0->unkB0[gUnknown_203F3E0->multiplayerId] == 0)
+ {
+ if (JOY_NEW(DPAD_UP))
+ {
+ gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 = 2;
+ gUnknown_203F3E0->unkB0[gUnknown_203F3E0->multiplayerId] = 6;
+ PlaySE(SE_W204);
+ }
+ else if (JOY_NEW(DPAD_LEFT))
+ {
+ gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 = 3;
+ gUnknown_203F3E0->unkB0[gUnknown_203F3E0->multiplayerId] = 6;
+ PlaySE(SE_W204);
+ }
+ else if (JOY_NEW(DPAD_RIGHT))
+ {
+ gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 = 1;
+ gUnknown_203F3E0->unkB0[gUnknown_203F3E0->multiplayerId] = 6;
+ PlaySE(SE_W204);
+ }
+ else
+ {
+ gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 = 0;
+ }
+ }
+ else
+ {
+ gUnknown_203F3E0->unkB0[gUnknown_203F3E0->multiplayerId]--;
+ }
+}
+
+static void sub_815336C(void)
+{
+ gUnknown_203F3E0->unk31A0[gUnknown_203F3E0->multiplayerId].unk2C.unk0 = 0;
+}
+
+u16 sub_8153390(void)
+{
+ return gUnknown_203F3E0->unk4A[gUnknown_203F3E0->multiplayerId][4] + FIRST_BERRY_INDEX;
+}
+
+u8 sub_81533B4(void)
+{
+ return gUnknown_203F3E0->unk24;
+}
+
+u8 *sub_81533C4(u8 id)
+{
+ if (gReceivedRemoteLinkPlayers)
+ return gLinkPlayers[id].name;
+ else
+ return gUnknown_203F3E0->unk31A0[id].name;
+}
-/*static*/ const struct WinCoords *const sUnknown_8478E80[] =
+u16 sub_8153404(u8 arg0, u8 arg1)
+{
+ return gUnknown_203F3E0->unk4A[arg0][arg1];
+}
+
+static u32 sub_8153424(u8 arg0)
+{
+ u8 i;
+ u32 var, sum = 0;
+
+ for (i = 0; i < 3; i++)
+ sum += gUnknown_203F3E0->unk4A[arg0][i] * sUnknown_84755D8[i];
+
+ var = gUnknown_203F3E0->unk4A[arg0][3] * sUnknown_84755D8[3];
+ if (sum <= var)
+ return 0;
+ else
+ return sum - var;
+}
+
+u32 sub_81534AC(void)
+{
+ u8 i, count = gUnknown_203F3E0->unk24;
+ u32 maxVar = sub_8153424(0);
+
+ for (i = 1; i < count; i++)
+ {
+ u32 var = sub_8153424(i);
+ if (var > maxVar)
+ maxVar = var;
+ }
+ return Min(maxVar, 999990);
+}
+
+u32 sub_81534F0(u8 arg0)
+{
+ u8 i, count = gUnknown_203F3E0->unk24;
+ u16 maxVar = gUnknown_203F3E0->unk4A[0][arg0];
+
+ for (i = 0; i < count; i++)
+ {
+ u16 var = gUnknown_203F3E0->unk4A[i][arg0];
+ if (var > maxVar)
+ maxVar = var;
+ }
+ return maxVar;
+}
+
+static u32 sub_8153534(u8 arg0)
+{
+ u32 vals[5], temp;
+ s16 r6 = TRUE;
+ u8 i, count = gUnknown_203F3E0->unk24;
+
+ for (i = 0; i < count; i++)
+ vals[i] = temp = sub_8153424(i);
+
+ while (r6)
+ {
+ r6 = FALSE;
+ for (i = 0; i < count - 1; i++)
+ {
+ if (vals[i] < vals[i + 1])
+ {
+ SWAP(vals[i], vals[i + 1], temp);
+ r6 = TRUE;
+ }
+ }
+ }
+
+ return vals[arg0];
+}
+
+u32 sub_81535B0(void)
+{
+ u8 i, r10 = 0, r8 = 0, r9 = 0, count = gUnknown_203F3E0->unk24;
+
+ // Function called two times for some reason.
+ sub_81534AC();
+ if (sub_81534AC() == 0)
+ {
+ for (i = 0; i < count; i++)
+ {
+ gUnknown_203F3E0->unk3308[i].unk0 = 4;
+ gUnknown_203F3E0->unk3308[i].unk4 = 0;
+ }
+ }
+
+ for (i = 0; i < count; i++)
+ gUnknown_203F3E0->unk3308[i].unk4 = Min(sub_8153424(i), 999990);
+
+ do
+ {
+ u32 r6 = sub_8153534(r10);
+ u8 r3 = r8;
+ for (i = 0; i < count; i++)
+ {
+ if (r6 == gUnknown_203F3E0->unk3308[i].unk4)
+ {
+ gUnknown_203F3E0->unk3308[i].unk0 = r3;
+ r8++;
+ r9++;
+ }
+ }
+ r10 = r8;
+ } while (r9 < count);
+
+ return 0;
+}
+
+void sub_81536A0(struct DodrioSubstruct_3308 * dst, u8 id)
{
- sUnknown_8478E44,
- sUnknown_8478E48,
- sUnknown_8478E50,
- sUnknown_8478E5C,
- sUnknown_8478E6C,
+ *dst = gUnknown_203F3E0->unk3308[id];
+}
+
+static u8 sub_81536C0(u8 arg0)
+{
+ u8 i, ret = 0, count = gUnknown_203F3E0->unk24;
+ u32 var, vars[5] = {0};
+
+ for (i = 0; i < count; i++)
+ vars[i] = sub_8153424(i);
+
+ var = vars[arg0];
+ for (i = 0; i < 5; i++)
+ {
+ if (i != arg0 && var < vars[i])
+ ret++;
+ }
+
+ return ret;
+}
+
+u8 sub_815372C(void)
+{
+ u8 multiplayerId = gUnknown_203F3E0->multiplayerId;
+ u16 itemId = sub_8153390();
+
+ if (sub_8153424(multiplayerId) != sub_81534AC())
+ return 3;
+ if (!CheckBagHasSpace(itemId, 1))
+ return 2;
+
+ AddBagItem(itemId, 1);
+ if (!CheckBagHasSpace(itemId, 1))
+ return 1;
+ return 0;
+}
+
+// Really? What next, u32 Add(u32 a)return a+1;?
+u32 IncrementWithLimit(u32 a, u32 max)
+{
+ if (a < max)
+ return a + 1;
+ else
+ return max;
+}
+
+// Gamefreak pls, min(a, b) ((a) < (b) ? (a) : (b)) is a well-known macro
+u32 Min(u32 a, u32 b)
+{
+ if (a < b)
+ return a;
+ else
+ return b;
+}
+
+u8 sub_81537AC(u8 id)
+{
+ return gUnknown_203F3E0->unk34[id];
+}
+
+void IsDodrioInParty(void)
+{
+ int i;
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES)
+ && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_DODRIO)
+ {
+ gSpecialVar_Result = TRUE;
+ return;
+ }
+ }
+
+ gSpecialVar_Result = FALSE;
+}
+
+void ShowDodrioBerryPickingRecords(void)
+{
+ u8 taskId = CreateTask(Task_ShowDodrioBerryPickingRecords, 0);
+ Task_ShowDodrioBerryPickingRecords(taskId);
+}
+
+// Data related to printing saved results.
+static const struct WindowTemplate sUnknown_84755E0 =
+{
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 1,
+ .width = 28,
+ .height = 11,
+ .paletteNum = 15,
+ .baseBlock = 1,
};
-/*static*/ const u8 *const sUnknown_8478E94[] =
+static const u8 *const sUnknown_84755E8[] = {gText_BerryPickingRecords, gText_BerriesPicked, gText_BestScore, gText_BerriesInRowFivePlayers};
+static const u8 sUnknown_84755F8[] = {4, 7, 4};
+
+ALIGNED(4)
+static const u8 sUnknown_84755FC[][2] = {{24}, {40}, {56}};
+static const u8 sUnknown_8475602[][2] = {{24}, {40}, {70}};
+
+static void Task_ShowDodrioBerryPickingRecords(u8 taskId)
+{
+ struct WindowTemplate window;
+ s32 i, width, widthCurr;
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ data[1] = AddWindow(&sUnknown_84755E0);
+ sub_81538D0(data[1]);
+ CopyWindowToVram(data[1], 3);
+ data[0]++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ data[0]++;
+ break;
+ case 2:
+ if (JOY_NEW(A_BUTTON | B_BUTTON))
+ {
+ rbox_fill_rectangle(data[1]);
+ CopyWindowToVram(data[1], 1);
+ data[0]++;
+ }
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ RemoveWindow(data[1]);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ }
+ break;
+ }
+}
+
+static void sub_81538D0(u8 windowId)
{
- gText_1Colon,
- gText_2Colon,
- gText_3Colon,
- gText_4Colon,
- gText_5Colon,
+ s32 i, x, numWidth;
+ s32 results[3];
+ u8 strbuf[20];
+ results[0] = gSaveBlock2Ptr->berryPick.berriesPicked;
+ results[1] = gSaveBlock2Ptr->berryPick.bestScore;
+ results[2] = gSaveBlock2Ptr->berryPick.berriesPickedInRow;
+
+ TextWindow_SetStdFrame0_WithPal(windowId, 0x21D, 0xD0);
+ DrawTextBorderOuter(windowId, 0x21D, 0xD);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
+ AddTextPrinterParameterized(windowId, 2, sUnknown_84755E8[0], 1, 1, TEXT_SPEED_FF, NULL);
+ for (i = 0; i < 3; i++)
+ {
+ ConvertIntToDecimalStringN(strbuf, results[i], STR_CONV_MODE_LEFT_ALIGN, sUnknown_84755F8[i]);
+ numWidth = GetStringWidth(2, strbuf, -1);
+ AddTextPrinterParameterized(windowId, 2, sUnknown_84755E8[i + 1], 1, sUnknown_84755FC[i][0], TEXT_SPEED_FF, NULL);
+ x = 224 - numWidth;
+ AddTextPrinterParameterized(windowId, 2, strbuf, x, sUnknown_8475602[i][0], TEXT_SPEED_FF, NULL);
+ }
+ PutWindowTilemap(windowId);
+}
+
+// Debug functions?
+static const u16 sUnknown_8475608[][4] =
+{
+ {9999, 0, 90, 9999},
+ {9999, 9999, 70, 9999},
+ {9999, 0, 9999, 0},
+ {9999, 9999, 60, 0},
+ {9999, 9999, 9999, 0},
};
-/*static*/ const u16 sUnknown_8478EA8[] = {92, 132, 172, 212};
-/*static*/ const u16 sUnknown_8478EB0[] = {30, 45, 60, 75, 90};
-/*static*/ const u16 sUnknown_8478EBA[] = {12, 28, 44, 60, 76};
-
-struct
-{
- u8 id;
- void (*func)(void);
-} const gUnknown_8478EC4[] =
-{
- {0, sub_8154A2C},
- {1, sub_8154B34},
- {2, sub_8154F80},
- {3, sub_81556E0},
- {4, sub_8155A78},
- {5, sub_8155B4C},
- {6, sub_8155C2C},
- {7, sub_8155C80},
- {8, unused_0},
- {9, nullsub_98},
+static const u8 sUnknown_8475630[] = _("あいうえおかき");
+static const u8 sUnknown_8475638[] = _("ABCDEFG");
+static const u8 sUnknown_8475640[] = _("0123456");
+
+static const u8 *const sPlaceholderPlayerNames[] =
+{
+ sUnknown_8475630,
+ sUnknown_8475630,
+ sUnknown_8475630,
+ sUnknown_8475638,
+ sUnknown_8475640
};
-// This is declared inside pokeemerald's sub_80296A8
-const u8 gUnknown_8478F14[5] = {0, 1, 2, 3, 4};
+static void sub_81539EC(void)
+{
+ gUnknown_203F3E0->unk24 = GetLinkPlayerCount();
+}
+
+static void sub_8153A04(void)
+{
+ u8 i, playerId;
+
+ for (playerId = gUnknown_203F3E0->unk24; playerId < NELEMS(sPlaceholderPlayerNames); playerId++)
+ StringCopy(gLinkPlayers[playerId].name, sPlaceholderPlayerNames[playerId]);
+
+ gUnknown_203F3E0->unk24 = 5;
+ for (i = 0; i < 4; i++)
+ {
+ for (playerId = 0; playerId < gUnknown_203F3E0->unk24; playerId++)
+ gUnknown_203F3E0->unk4A[playerId][i] = sUnknown_8475608[playerId][i];
+ }
+}
diff --git a/src/dodrio_berry_picking_2.c b/src/dodrio_berry_picking_2.c
index fc6aa14c6..e170ac903 100644
--- a/src/dodrio_berry_picking_2.c
+++ b/src/dodrio_berry_picking_2.c
@@ -1,23 +1,1617 @@
#include "global.h"
+#include "gflib.h"
+#include "dodrio_berry_picking.h"
+#include "dynamic_placeholder_text_util.h"
+#include "item.h"
#include "link.h"
-#include "link_rfu.h"
+#include "menu.h"
+#include "new_menu_helpers.h"
+#include "save.h"
+#include "strings.h"
+#include "task.h"
+#include "text_window.h"
+#include "text_window_graphics.h"
+#include "constants/songs.h"
-void sub_815A5BC(s32 a0)
+struct DodrioStruct_2022CF4
{
- struct Padded_U8 data[2];
- data[0].value = 1;
- data[1].value = a0;
- sub_80F9E2C(data);
+ u8 filler_00[0xc];
+ u8 unkC[10];
+ s16 unk16[10];
+ u16 unk2A[10];
+ u16 unk3E;
+}; // size = 0x40
+
+static EWRAM_DATA u16 *gUnknown_203F3E4[5] = {NULL};
+static EWRAM_DATA u16 *gUnknown_203F3F8[2] = {NULL};
+static EWRAM_DATA u16 *gUnknown_203F400[11] = {NULL};
+static EWRAM_DATA u16 *gUnknown_203F42C[4] = {NULL};
+static EWRAM_DATA struct DodrioStruct_2022CF4 * gUnknown_203F43C = NULL;
+static EWRAM_DATA struct DodrioSubstruct_0160 * gUnknown_203F440 = NULL;
+
+static void sub_8153B9C(struct Sprite * sprite);
+static u32 sub_8153C30(struct Sprite * sprite);
+static u32 sub_8153CA0(struct Sprite * sprite);
+static void sub_8153D48(bool8 a0, u8 a1);
+static void nullsub_97(struct Sprite * sprite);
+static void sub_8154324(bool8 a0);
+static void sub_81543E8(struct Sprite * sprite);
+static s16 sub_8154608(u8 a0, u8 a1);
+static void sub_8154A08(u8 taskId);
+static void sub_8154A2C(void);
+static void sub_8154B34(void);
+static void sub_8154F80(void);
+static void sub_81556E0(void);
+static void sub_8155A78(void);
+static void sub_8155B4C(void);
+static void sub_8155C2C(void);
+static void sub_8155C80(void);
+static void unused_0(void);
+static void nullsub_98(void);
+static void sub_8155E24(MainCallback cb);
+MainCallback sub_8155E54(void);
+static void sub_8155EA0(void);
+static bool32 sub_8155FE0(void);
+
+// Assets in this header are duplicated
+#include "data/dodrio_berry_picking.h"
+
+static const struct OamData sOamData_8478C98 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x64),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(64x64),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_8478CA0 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x16),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(16x16),
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_8478CA8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x16),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(16x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_8478CB0 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x32),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(64x32),
+ .tileNum = 0,
+ .priority = 3,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_8478CB8[] =
+{
+ ANIMCMD_FRAME(0, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_8478CC0[] =
+{
+ ANIMCMD_FRAME(64, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_8478CC8[] =
+{
+ ANIMCMD_FRAME(128, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_8478CD0[] =
+{
+ ANIMCMD_FRAME(192, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_8478CD8[] =
+{
+ ANIMCMD_FRAME(256, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSpriteAnimTable_8478CE0[] =
+{
+ sSpriteAnim_8478CB8,
+ sSpriteAnim_8478CC0,
+ sSpriteAnim_8478CC8,
+ sSpriteAnim_8478CD0,
+ sSpriteAnim_8478CD8
+};
+
+static const union AnimCmd sSpriteAnim_8478CF4[] =
+{
+ ANIMCMD_FRAME(0, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_8478CFC[] =
+{
+ ANIMCMD_FRAME(4, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_8478D04[] =
+{
+ ANIMCMD_FRAME(8, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSpriteAnimTable_8478D0C[] =
+{
+ sSpriteAnim_8478CF4,
+ sSpriteAnim_8478CFC,
+ sSpriteAnim_8478D04
+};
+
+static const union AnimCmd sSpriteAnim_8478D18[] =
+{
+ ANIMCMD_FRAME(0, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_8478D20[] =
+{
+ ANIMCMD_FRAME(4, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_8478D28[] =
+{
+ ANIMCMD_FRAME(8, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_8478D30[] =
+{
+ ANIMCMD_FRAME(12, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_8478D38[] =
+{
+ ANIMCMD_FRAME(16, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_8478D40[] =
+{
+ ANIMCMD_FRAME(20, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_8478D48[] =
+{
+ ANIMCMD_FRAME(24, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_8478D50[] =
+{
+ ANIMCMD_FRAME(28, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_8478D58[] =
+{
+ ANIMCMD_FRAME(32, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSpriteAnimTable_8478D60[] =
+{
+ sSpriteAnim_8478D18,
+ sSpriteAnim_8478D20,
+ sSpriteAnim_8478D28,
+ sSpriteAnim_8478D30,
+ sSpriteAnim_8478D38,
+ sSpriteAnim_8478D40,
+ sSpriteAnim_8478D48,
+ sSpriteAnim_8478D50,
+ sSpriteAnim_8478D58
+};
+
+static const union AnimCmd sSpriteAnim_8478D84[] =
+{
+ ANIMCMD_FRAME(0, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSpriteAnimTable_8478D8C[] =
+{
+ sSpriteAnim_8478D84
+};
+
+// Code
+
+void sub_8153A9C(void)
+{
+ void *ptr = AllocZeroed(0x3000);
+ struct SpritePalette pal1 = {sDodrioBerryPkmnPal, 0};
+ struct SpritePalette pal2 = {sDodrioBerryShinyPal, 1};
+
+ LZ77UnCompWram(sDodrioBerryPkmnGfx, ptr);
+ // This check should be one line up.
+ if (ptr != NULL)
+ {
+ struct SpriteSheet sheet = {ptr, 0x3000, 0};
+ LoadSpriteSheet(&sheet);
+ Free(ptr);
+ }
+ LoadSpritePalette(&pal1);
+ LoadSpritePalette(&pal2);
+}
+
+void sub_8153AFC(struct DodrioSubstruct_318C * arg0, u8 arg1, u8 id, u8 arg3)
+{
+ struct SpriteTemplate sprTemplate =
+ {
+ .tileTag = 0,
+ .paletteTag = arg0->isShiny,
+ .oam = &sOamData_8478C98,
+ .anims = sSpriteAnimTable_8478CE0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8153B9C,
+ };
+
+ gUnknown_203F3E4[id] = AllocZeroed(4);
+ *gUnknown_203F3E4[id] = CreateSprite(&sprTemplate, sub_8154608(arg1, arg3), 136, 3);
+ sub_8153D48(TRUE, id);
+}
+
+static void sub_8153B9C(struct Sprite * sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ break;
+ case 1:
+ sub_8153C30(sprite);
+ break;
+ case 2:
+ sub_8153CA0(sprite);
+ break;
+ }
+}
+
+void sub_8153BC0(u8 unused)
+{
+ struct Sprite * sprite = &gSprites[*gUnknown_203F3E4[GetMultiplayerId()]];
+ sprite->data[0] = 1;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+}
+
+void sub_8153BF8(u8 unused)
+{
+ struct Sprite * sprite = &gSprites[*gUnknown_203F3E4[GetMultiplayerId()]];
+ sprite->data[0] = 2;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
}
-u8 sub_815A5E8(s32 a0)
+static u32 sub_8153C30(struct Sprite * sprite)
{
- u8 * r1;
- if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00)
- return 0;
- r1 = (u8 *)&gRecvCmds[a0][1];
- if (r1[0] == 1)
- return r1[4];
+ s8 var;
+ u8 mod = (++sprite->data[1] / 2) % 4;
+
+ if (sprite->data[1] >= 3)
+ {
+ switch (mod)
+ {
+ default:
+ var = 1;
+ break;
+ case 1:
+ case 2:
+ var = -1;
+ break;
+ }
+
+ sprite->pos1.x += var;
+ if (++sprite->data[1] >= 40)
+ {
+ sprite->data[0] = 0;
+ sprite->pos1.x = sub_8154608(0, sub_81533B4());
+ }
+ }
+
return 0;
}
+static u32 sub_8153CA0(struct Sprite * sprite)
+{
+ u8 mod = (++sprite->data[1] / 13) % 4;
+
+ if (sprite->data[1] % 13 == 0 && mod != 0)
+ PlaySE(SE_W204);
+ if (sprite->data[1] >= 104)
+ {
+ sprite->data[0] = 0;
+ mod = 0;
+ }
+ sub_8153DA8(GetMultiplayerId(), mod);
+ return 0;
+}
+
+void sub_8153D08(u8 count)
+{
+ u8 i;
+ for (i = 0; i < count; i++)
+ {
+ struct Sprite * sprite = &gSprites[*gUnknown_203F3E4[i]];
+ if (sprite != NULL)
+ DestroySpriteAndFreeResources(sprite);
+ // Memory should be freed here but is not.
+ }
+}
+
+static void sub_8153D48(bool8 invisible, u8 id)
+{
+ gSprites[*gUnknown_203F3E4[id]].invisible = invisible;
+}
+
+void sub_8153D80(bool8 invisible, u8 count)
+{
+ u8 i;
+ for (i = 0; i < count; i++)
+ sub_8153D48(invisible, i);
+}
+
+void sub_8153DA8(u8 id, u8 frameNum)
+{
+ StartSpriteAnim(&gSprites[*gUnknown_203F3E4[id]], frameNum);
+}
+
+static void nullsub_97(struct Sprite * sprite)
+{
+
+}
+
+void sub_8153DD8(void)
+{
+ u8 i;
+ for (i = 0; i < 10; i++)
+ {
+ struct Sprite * sprite = &gSprites[gUnknown_203F43C->unk2A[i]];
+ sprite->pos1.x = (i * 16) + 48;
+ sprite->pos1.y = -8 - (i * 8);
+ gUnknown_203F43C->unkC[i] = 0;
+ }
+}
+
+void sub_8153E28(void)
+{
+ u8 i;
+ void *ptr = AllocZeroed(0x180);
+ struct SpritePalette spPal = {sDodrioBerryStatusPal, 2};
+
+ LZ77UnCompWram(sDodrioBerryStatusGfx, ptr);
+ // This check should be one line up.
+ if (ptr != NULL)
+ {
+ struct SpriteSheet spSheet = {ptr, 0x180, 1};
+ struct SpriteTemplate spTemplate =
+ {
+ .tileTag = 1,
+ .paletteTag = 2,
+ .oam = &sOamData_8478CA0,
+ .anims = sSpriteAnimTable_8478D0C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = nullsub_97,
+ };
+
+ gUnknown_203F43C = AllocZeroed(sizeof(*gUnknown_203F43C));
+ LoadSpriteSheet(&spSheet);
+ LoadSpritePalette(&spPal);
+ for (i = 0; i < 10; i++)
+ gUnknown_203F43C->unk2A[i] = CreateSprite(&spTemplate, (i * 16) + 48, -8 - (i * 8), 0);
+ }
+
+ Free(ptr);
+}
+
+void sub_8153ED8(void)
+{
+ u8 i;
+ for (i = 0; i < 10; i++)
+ {
+ struct Sprite * sprite = &gSprites[gUnknown_203F43C->unk2A[i]];
+ if (sprite != NULL)
+ DestroySpriteAndFreeResources(sprite);
+ }
+ FREE_AND_SET_NULL(gUnknown_203F43C);
+}
+
+bool32 sub_8153F1C(void)
+{
+ u8 i;
+ bool32 r3 = FALSE;
+ for (i = 0; i < 10; i++)
+ {
+ struct Sprite * sprite = &gSprites[gUnknown_203F43C->unk2A[i]];
+ gUnknown_203F43C->unk16[i] = 2;
+ if (gUnknown_203F43C->unkC[i] != 0 && sprite->pos1.y == 8)
+ continue;
+ r3 = TRUE;
+ if (sprite->pos1.y == 8)
+ {
+ if (gUnknown_203F43C->unkC[i] != 0)
+ continue;
+ gUnknown_203F43C->unkC[i] = 1;
+ gUnknown_203F43C->unk16[i] = -16;
+ PlaySE(SE_TK_KASYA);
+ }
+ sprite->pos1.y += gUnknown_203F43C->unk16[i];
+ }
+
+ if (r3)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void sub_8153FC8(u8 arg0)
+{
+ u8 i;
+
+ if (arg0 > 10)
+ {
+ for (i = 0; i < 10; i++)
+ StartSpriteAnim(&gSprites[gUnknown_203F43C->unk2A[i]], 1);
+ }
+ else
+ {
+ for (i = 0; i < 10 - arg0; i++)
+ {
+ if (arg0 > 6)
+ {
+ gUnknown_203F43C->unk3E += arg0 - 6;
+ if (gUnknown_203F43C->unk3E > 30)
+ gUnknown_203F43C->unk3E = 0;
+ else if (gUnknown_203F43C->unk3E > 10)
+ StartSpriteAnim(&gSprites[gUnknown_203F43C->unk2A[i]], 2);
+ else
+ StartSpriteAnim(&gSprites[gUnknown_203F43C->unk2A[i]], 0);
+ }
+ else
+ {
+ StartSpriteAnim(&gSprites[gUnknown_203F43C->unk2A[i]], 0);
+ }
+ }
+ for (; i < 10; i++)
+ StartSpriteAnim(&gSprites[gUnknown_203F43C->unk2A[i]], 1);
+ }
+}
+
+void sub_81540DC(bool8 invisible)
+{
+ u8 i;
+ for (i = 0; i < 10; i++)
+ gSprites[gUnknown_203F43C->unk2A[i]].invisible = invisible;
+}
+
+// Unknown unused data, feel free to remove.
+static const u8 sUnused2[] = {
+ SE_W204,
+ SE_TOY_C,
+ SE_TOY_D,
+ SE_TOY_E,
+ SE_TOY_F,
+ SE_TOY_G,
+ SE_TOY_A,
+ SE_TOY_B,
+ SE_TOY_C1,
+ SE_CARD3
+};
+
+void sub_8154128(void)
+{
+ void *ptr = AllocZeroed(0x480);
+ struct SpritePalette sprPal = {sDodrioBerrySpritesPal, 3};
+
+ LZ77UnCompWram(sDodrioBerrySpritesGfx, ptr);
+ if (ptr != NULL) // This should be one line up
+ {
+ struct SpriteSheet sprSheet = {ptr, 0x480, 2};
+ LoadSpriteSheet(&sprSheet);
+ }
+
+ LoadSpritePalette(&sprPal);
+ Free(ptr);
+}
+
+static const s16 sUnknown_8478DD4[] = {88, 128, 168, 208};
+
+void sub_815417C(void)
+{
+ u8 i;
+ s16 x;
+
+ struct SpriteTemplate sprTemplate1 =
+ {
+ .tileTag = 2,
+ .paletteTag = 3,
+ .oam = &sOamData_8478CA8,
+ .anims = sSpriteAnimTable_8478D60,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ };
+ struct SpriteTemplate sprTemplate2 =
+ {
+ .tileTag = 2,
+ .paletteTag = 3,
+ .oam = &sOamData_8478CA0,
+ .anims = sSpriteAnimTable_8478D60,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ };
+
+ for (i = 0; i < 11; i++)
+ {
+ gUnknown_203F400[i] = AllocZeroed(4);
+ x = i * 16;
+ *gUnknown_203F400[i] = CreateSprite(&sprTemplate1, x + (i * 8), 8, 1);
+ sub_81542EC(i, TRUE);
+ }
+ for (i = 0; i < 4; i++)
+ {
+ gUnknown_203F42C[i] = AllocZeroed(4);
+ if (i == 3)
+ *gUnknown_203F42C[i] = CreateSprite(&sprTemplate2, sUnknown_8478DD4[i], 57, 0);
+ else
+ *gUnknown_203F42C[i] = CreateSprite(&sprTemplate2, sUnknown_8478DD4[i], 60, 0);
+ StartSpriteAnim(&gSprites[*gUnknown_203F42C[i]], i);
+ }
+
+ sub_8154324(TRUE);
+}
+
+void sub_8154274(void)
+{
+ struct Sprite * sprite;
+ u8 i;
+
+ for (i = 0; i < 11; i++)
+ {
+ sprite = &gSprites[*gUnknown_203F400[i]];
+ if (sprite != NULL)
+ DestroySprite(sprite);
+ FREE_AND_SET_NULL(gUnknown_203F400[i]);
+ }
+ for (i = 0; i < 4; i++)
+ {
+ sprite = &gSprites[*gUnknown_203F42C[i]];
+ if (sprite != NULL)
+ DestroySprite(sprite);
+ FREE_AND_SET_NULL(gUnknown_203F42C[i]);
+ }
+}
+
+void sub_81542EC(u8 id, bool8 invisible)
+{
+ gSprites[*gUnknown_203F400[id]].invisible = invisible;
+}
+
+static void sub_8154324(bool8 invisible)
+{
+ u8 i;
+ for (i = 0; i < 4; i++)
+ gSprites[*gUnknown_203F42C[i]].invisible = invisible;
+}
+
+void sub_8154370(u8 id, u8 y)
+{
+ gSprites[*gUnknown_203F400[id]].pos1.y = y * 8;
+}
+
+void sub_8154398(u16 id, u8 frameNum)
+{
+ StartSpriteAnim(&gSprites[*gUnknown_203F400[id]], frameNum);
+}
+
+// Unused
+static void sub_81543C4(u8 spriteId)
+{
+ gSprites[spriteId].pos1.x = 20 * spriteId + 50;
+ gSprites[spriteId].pos1.y = 50;
+}
+
+// Gamefreak made a mistake there and goes out of bounds for the data array as it holds 8 elements
+// in turn overwriting sprite's subpriority and subsprites fields.
+#if defined(BUGFIX)
+#define sKeepPosX data[1]
+#else
+#define sKeepPosX data[10]
+#endif // NONMATCHING
+
+static void sub_81543E8(struct Sprite * sprite)
+{
+ u8 i;
+ static const u8 array[] = {30, 20};
+
+ if (sprite->sKeepPosX != TRUE)
+ {
+ for (i = 0; i < 2; i++)
+ {
+ if (++gUnknown_203F3F8[i][1] > array[i])
+ {
+ sprite->pos1.x--;
+ gUnknown_203F3F8[i][1] = 0;
+ }
+ }
+ }
+}
+
+static const s16 gUnknown_8478E0E[][2] = {{230, 55}, {30, 74}};
+
+void sub_8154438(void)
+{
+ u8 i;
+ void *ptr = AllocZeroed(0x400);
+ struct SpritePalette sprPal = {sDodrioBerryPlatformPal, 6};
+
+ LZ77UnCompWram(sDodrioBerryPlatformGfx, ptr);
+ if (ptr != NULL) // This should be one line up
+ {
+ struct SpriteSheet sprSheet = {ptr, 0x400, 5};
+ struct SpriteTemplate sprTemplate =
+ {
+ .tileTag = 5,
+ .paletteTag = 6,
+ .oam = &sOamData_8478CB0,
+ .anims = sSpriteAnimTable_8478D8C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_81543E8,
+ };
+
+ LoadSpriteSheet(&sprSheet);
+ LoadSpritePalette(&sprPal);
+ for (i = 0; i < 2; i++)
+ {
+ gUnknown_203F3F8[i] = AllocZeroed(4);
+ *gUnknown_203F3F8[i] = CreateSprite(&sprTemplate, gUnknown_8478E0E[i][0], gUnknown_8478E0E[i][1], 4);
+ }
+ }
+
+ Free(ptr);
+}
+
+void sub_81544F0(void)
+{
+ u8 i;
+ for (i = 0; i < 2; i++)
+ {
+ struct Sprite * sprite = &gSprites[*gUnknown_203F3F8[i]];
+ sprite->sKeepPosX = TRUE;
+ sprite->pos1.x = gUnknown_8478E0E[i][0];
+ sprite->pos1.y = gUnknown_8478E0E[i][1];
+ }
+}
+
+void sub_8154540(void)
+{
+ u8 i;
+ for (i = 0; i < 2; i++)
+ {
+ struct Sprite * sprite = &gSprites[*gUnknown_203F3F8[i]];
+ sprite->sKeepPosX = FALSE;
+ }
+}
+
+void sub_8154578(void)
+{
+ u8 i;
+ for (i = 0; i < 2; i++)
+ {
+ struct Sprite * sprite = &gSprites[*gUnknown_203F3F8[i]];
+ if (sprite)
+ DestroySprite(sprite);
+ FREE_AND_SET_NULL(gUnknown_203F3F8[i]);
+ }
+}
+
+void sub_81545BC(bool8 invisible)
+{
+ u8 i;
+ for (i = 0; i < 2; i++)
+ gSprites[*gUnknown_203F3F8[i]].invisible = invisible;
+}
+
+#undef sKeepPosX
+
+static s16 sub_8154608(u8 arg0, u8 arg1)
+{
+ s16 x = 0;
+ switch (arg1)
+ {
+ case 1:
+ x = 15;
+ break;
+ case 2:
+ switch (arg0)
+ {
+ case 0: x = 12; break;
+ case 1: x = 18; break;
+ }
+ break;
+ case 3:
+ switch (arg0)
+ {
+ case 0: x = 15; break;
+ case 1: x = 21; break;
+ case 2: x = 9; break;
+ }
+ break;
+ case 4:
+ switch (arg0)
+ {
+ case 0: x = 12; break;
+ case 1: x = 18; break;
+ case 2: x = 24; break;
+ case 3: x = 6; break;
+ }
+ break;
+ case 5:
+ switch (arg0)
+ {
+ case 0: x = 15; break;
+ case 1: x = 21; break;
+ case 2: x = 27; break;
+ case 3: x = 3; break;
+ case 4: x = 9; break;
+ }
+ break;
+ }
+
+ return x * 8;
+}
+
+void sub_81546C0(void)
+{
+ u8 i;
+ for (i = 0; i < 11; i++)
+ {
+ sub_81542EC(i, TRUE);
+ sub_8154370(i, 1);
+ }
+ sub_81540DC(FALSE);
+}
+
+static void sub_81546EC(u8 frameId)
+{
+ LoadBgTiles(0, GetUserFrameGraphicsInfo(frameId)->tiles, 0x120, 1);
+ LoadPalette(GetUserFrameGraphicsInfo(frameId)->palette, 0xA0, 0x20);
+}
+
+static void sub_8154720(void)
+{
+ TextWindow_SetStdFrame0_WithPal(0, 0xA, 0xB0);
+}
+
+void sub_8154730(void)
+{
+ gUnknown_203F440->finished = FALSE;
+ gUnknown_203F440->state = 0;
+ gUnknown_203F440->unk3018 = 0;
+ gUnknown_203F440->unk3020 = 0;
+ gUnknown_203F440->unk3024 = 0;
+}
+
+static void sub_8154768(const struct WindowTemplate * winTempl)
+{
+ u8 pal = 0xA;
+
+ FillBgTilemapBufferRect(0, 1, winTempl->tilemapLeft - 1, winTempl->tilemapTop - 1, 1, 1, pal);
+ FillBgTilemapBufferRect(0, 2, winTempl->tilemapLeft, winTempl->tilemapTop - 1, winTempl->width, 1, pal);
+ FillBgTilemapBufferRect(0, 3, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop - 1, 1, 1, pal);
+ FillBgTilemapBufferRect(0, 4, winTempl->tilemapLeft - 1, winTempl->tilemapTop, 1, winTempl->height, pal);
+ FillBgTilemapBufferRect(0, 6, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop, 1, winTempl->height, pal);
+ FillBgTilemapBufferRect(0, 7, winTempl->tilemapLeft - 1, winTempl->tilemapTop + winTempl->height, 1, 1, pal);
+ FillBgTilemapBufferRect(0, 8, winTempl->tilemapLeft, winTempl->tilemapTop + winTempl->height, winTempl->width, 1, pal);
+ FillBgTilemapBufferRect(0, 9, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop + winTempl->height, 1, 1, pal);
+}
+
+static void sub_8154868(const struct WindowTemplate * winTempl)
+{
+ u8 pal = 0xB;
+
+ FillBgTilemapBufferRect(0, 10, winTempl->tilemapLeft - 1, winTempl->tilemapTop - 1, 1, 1, pal);
+ FillBgTilemapBufferRect(0, 11, winTempl->tilemapLeft, winTempl->tilemapTop - 1, winTempl->width, 1, pal);
+ FillBgTilemapBufferRect(0, 12, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop - 1, 1, 1, pal);
+ FillBgTilemapBufferRect(0, 13, winTempl->tilemapLeft - 1, winTempl->tilemapTop, 1, winTempl->height, pal);
+ FillBgTilemapBufferRect(0, 15, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop, 1, winTempl->height, pal);
+ FillBgTilemapBufferRect(0, 16, winTempl->tilemapLeft - 1, winTempl->tilemapTop + winTempl->height, 1, 1, pal);
+ FillBgTilemapBufferRect(0, 17, winTempl->tilemapLeft, winTempl->tilemapTop + winTempl->height, winTempl->width, 1, pal);
+ FillBgTilemapBufferRect(0, 18, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop + winTempl->height, 1, 1, pal);
+}
+
+void sub_8154968(struct DodrioSubstruct_0160 * ptr)
+{
+ gUnknown_203F440 = ptr;
+ gUnknown_203F440->finished = FALSE;
+ gUnknown_203F440->state = 0;
+ gUnknown_203F440->unk3018 = 0;
+ gUnknown_203F440->unk3020 = 0;
+ gUnknown_203F440->unk3024 = 0;
+ gUnknown_203F440->unk3004 = CreateTask(sub_8154A08, 3);
+ sub_8155E24(sub_8154A2C);
+}
+
+static void sub_81549C8(void)
+{
+ FreeAllWindowBuffers();
+}
+
+struct WinCoords
+{
+ u8 left;
+ u8 top;
+};
+
+static const u8 sTextColorTable[][3] =
+{
+ {
+ TEXT_COLOR_WHITE,
+ TEXT_COLOR_DARK_GREY,
+ TEXT_COLOR_LIGHT_GREY
+ }, {
+ TEXT_COLOR_WHITE,
+ TEXT_COLOR_RED,
+ TEXT_COLOR_LIGHT_RED
+ }, {
+ TEXT_COLOR_WHITE,
+ TEXT_COLOR_BLUE,
+ TEXT_COLOR_LIGHT_BLUE
+ }, {
+ TEXT_COLOR_WHITE,
+ TEXT_COLOR_GREEN,
+ TEXT_COLOR_LIGHT_GREEN
+ }
+};
+
+static const struct WinCoords sUnknown_8478E44[] = {{12, 6}};
+static const struct WinCoords sUnknown_8478E48[] = {{9, 10}, {15, 6}};
+static const struct WinCoords sUnknown_8478E50[] = {{12, 6}, {18, 10}, {6, 10}};
+static const struct WinCoords sUnknown_8478E5C[] = {{9, 10}, {15, 6}, {21, 10}, {3, 6}};
+static const struct WinCoords sUnknown_8478E6C[] = {{12, 6}, {18, 10}, {23, 6}, {1, 6}, {6, 10}};
+
+static const struct WinCoords * const sUnknown_8478E80[] =
+{
+ sUnknown_8478E44,
+ sUnknown_8478E48,
+ sUnknown_8478E50,
+ sUnknown_8478E5C,
+ sUnknown_8478E6C,
+};
+
+static const u8 *const sUnknown_8478E94[] =
+{
+ gText_1Colon,
+ gText_2Colon,
+ gText_3Colon,
+ gText_4Colon,
+ gText_5Colon,
+};
+
+static const u16 sUnknown_8478EA8[] = {92, 132, 172, 212};
+static const u16 sUnknown_8478EB0[] = {30, 45, 60, 75, 90};
+static const u16 sUnknown_8478EBA[] = {12, 28, 44, 60, 76};
+
+struct
+{
+ u8 id;
+ void (*func)(void);
+} const gUnknown_8478EC4[] =
+{
+ {0, sub_8154A2C},
+ {1, sub_8154B34},
+ {2, sub_8154F80},
+ {3, sub_81556E0},
+ {4, sub_8155A78},
+ {5, sub_8155B4C},
+ {6, sub_8155C2C},
+ {7, sub_8155C80},
+ {8, unused_0},
+ {9, nullsub_98},
+};
+
+void sub_81549D4(u8 arg0)
+{
+ u8 i;
+ for (i = 0; i < 10; i++)
+ {
+ if (gUnknown_8478EC4[i].id == arg0)
+ sub_8155E24(gUnknown_8478EC4[i].func);
+ }
+}
+
+static void sub_8154A08(u8 taskId)
+{
+ if (!gUnknown_203F440->finished)
+ sub_8155E54()();
+}
+
+static void sub_8154A2C(void)
+{
+ switch (gUnknown_203F440->state)
+ {
+ case 0:
+ sub_8155EA0();
+ gUnknown_203F440->state++;
+ break;
+ case 1:
+ if (sub_8155FE0() == TRUE)
+ gUnknown_203F440->state++;
+ break;
+ case 2:
+ CopyToBgTilemapBuffer(3, sDodrioBerryBgTilemap1, 0, 0);
+ CopyToBgTilemapBuffer(1, sDodrioBerryBgTilemap2Left, 0, 0);
+ CopyToBgTilemapBuffer(2, sDodrioBerryBgTilemap2Right, 0, 0);
+ CopyBgTilemapBufferToVram(3);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ gUnknown_203F440->state++;
+ break;
+ case 3:
+ ShowBg(0);
+ ShowBg(3);
+ ShowBg(1);
+ ShowBg(2);
+ gUnknown_203F440->state++;
+ break;
+ case 4:
+ sub_81546EC(gSaveBlock2Ptr->optionsWindowFrameType);
+ sub_8154720();
+ gUnknown_203F440->state++;
+ break;
+ default:
+ gUnknown_203F440->finished = TRUE;
+ break;
+ }
+}
+
+static void sub_8154B34(void)
+{
+ u8 i, playersCount, id, colorsId, *name;
+ u32 left;
+ struct WindowTemplate window;
+ const struct WinCoords * ptr;
+
+ switch (gUnknown_203F440->state)
+ {
+ case 0:
+ playersCount = sub_81533B4();
+ ptr = sUnknown_8478E80[playersCount - 1];
+ window.bg = 0;
+ window.width = 7;
+ window.height = 2;
+ window.paletteNum = 0xD;
+ window.baseBlock = 0x13;
+ for (i = 0; i < playersCount; ptr++, i++)
+ {
+ colorsId = 0;
+ id = sub_81537AC(i);
+ left = (56 - GetStringWidth(0, sub_81533C4(id), -1)) / 2u;
+ window.tilemapLeft = ptr->left;
+ window.tilemapTop = ptr->top;
+ gUnknown_203F440->unk3008[i] = AddWindow(&window);
+ ClearWindowTilemap(gUnknown_203F440->unk3008[i]);
+ FillWindowPixelBuffer(gUnknown_203F440->unk3008[i], PIXEL_FILL(1));
+ if (id == GetMultiplayerId())
+ colorsId = 2;
+ name = sub_81533C4(id);
+ AddTextPrinterParameterized3(gUnknown_203F440->unk3008[i], 0, left, 1, sTextColorTable[colorsId], -1, name);
+ CopyWindowToVram(gUnknown_203F440->unk3008[i], 2);
+ window.baseBlock += 0xE;
+ sub_8154868(&window);
+ }
+ gUnknown_203F440->state++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ playersCount = sub_81533B4();
+ for (i = 0; i < playersCount; i++)
+ PutWindowTilemap(gUnknown_203F440->unk3008[i]);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F440->state++;
+ }
+ break;
+ default:
+ if (++gUnknown_203F440->state > 180)
+ {
+ playersCount = sub_81533B4();
+ for (i = 0; i < playersCount; i++)
+ {
+ ClearWindowTilemap(gUnknown_203F440->unk3008[i]);
+ RemoveWindow(gUnknown_203F440->unk3008[i]);
+ }
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F440->finished = TRUE;
+ }
+ break;
+ }
+}
+
+static void sub_8154D9C(u8 playersCount_)
+{
+ u8 i, r8 = 0, r6 = 0;
+ u8 playersCount = playersCount_; // Pointless variable, I know, but it's needed to match.
+ u8 *name;
+ u32 x, numWidth;
+ u8 numString[32];
+ u8 array[5] = {0, 1, 2, 3, 4};
+ struct DodrioSubstruct_3308 temp, structArray[5];
+
+ for (i = 0; i < playersCount; i++)
+ {
+ array[i] = i;
+ sub_81536A0(&temp, i);
+ structArray[i] = temp;
+ }
+
+ if (sub_81534AC() != 0)
+ {
+ do
+ {
+ for (i = 0; i < playersCount; i++)
+ {
+ if (structArray[i].unk0 == r8)
+ {
+ array[r6] = i;
+ r6++;
+ }
+ }
+ r8 = r6;
+ } while (r6 < playersCount);
+ }
+
+ for (i = 0; i < playersCount; i++)
+ {
+ if (structArray[i].unk4 == 0)
+ structArray[i].unk0 = playersCount - 1;
+ }
+
+ x = 216 - GetStringWidth(0, gText_SpacePoints, 0);
+ for (i = 0; i < playersCount; i++)
+ {
+ u8 colorsId = 0;
+ u8 id = array[i];
+ u32 points = structArray[id].unk4;
+
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 0, sUnknown_8478E94[structArray[id].unk0], 8, sUnknown_8478EBA[i], -1, NULL);
+ if (id == GetMultiplayerId())
+ colorsId = 2;
+ name = sub_81533C4(id);
+ AddTextPrinterParameterized3(gUnknown_203F440->unk3008[1], 0, 28, sUnknown_8478EBA[i], sTextColorTable[colorsId], -1, name);
+ ConvertIntToDecimalStringN(numString, points, STR_CONV_MODE_RIGHT_ALIGN, 7);
+ numWidth = GetStringWidth(0, numString, -1);
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 0, numString, x - 35, sUnknown_8478EBA[i], -1, NULL);
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 0, gText_SpacePoints, x, sUnknown_8478EBA[i], -1, NULL);
+ }
+}
+
+static void sub_8154F80(void)
+{
+ u8 i, j, itemGiveRet, playersCount = sub_81533B4();
+ u8 *name;
+ u32 strWidth, x;
+ u8 sp0C[100];
+ u8 sp70[20];
+
+ switch (gUnknown_203F440->state)
+ {
+ case 0:
+ sub_81535B0();
+ gUnknown_203F440->unk301C = 0;
+ gUnknown_203F440->state++;
+ break;
+ case 1:
+ gUnknown_203F440->unk3008[0] = AddWindow(&sUnknown_8475674[0]);
+ gUnknown_203F440->unk3008[1] = AddWindow(&sUnknown_8475674[1]);
+ ClearWindowTilemap(gUnknown_203F440->unk3008[0]);
+ ClearWindowTilemap(gUnknown_203F440->unk3008[1]);
+ sub_8154868(&sUnknown_8475674[0]);
+ sub_8154868(&sUnknown_8475674[1]);
+ gUnknown_203F440->state++;
+ break;
+ case 2:
+ FillWindowPixelBuffer(gUnknown_203F440->unk3008[0], PIXEL_FILL(1));
+ FillWindowPixelBuffer(gUnknown_203F440->unk3008[1], PIXEL_FILL(1));
+ strWidth = GetStringWidth(0, gText_BerryPickingResults, -1);
+ x = (224 - strWidth) / 2;
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[0], 0, gText_BerryPickingResults, x, 2, -1, NULL);
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 0, gText_10P30P50P50P, 68, 16, -1, NULL);
+ for (i = 0; i < playersCount; i++)
+ {
+ u8 colorsId = 0;
+ if (i == GetMultiplayerId())
+ colorsId = 2;
+
+ name = sub_81533C4(i);
+ AddTextPrinterParameterized3(gUnknown_203F440->unk3008[1], 0, 2, sUnknown_8478EB0[i], sTextColorTable[colorsId], -1, name);
+ for (j = 0; j < 4; j++)
+ {
+ u32 width;
+ u16 result1 = Min(sub_8153404(i, j), 9999);
+ u16 result2 = Min(sub_81534F0(j), 9999);
+
+ ConvertIntToDecimalStringN(sp0C, result1, STR_CONV_MODE_LEFT_ALIGN, 4);
+ width = GetStringWidth(0, sp0C, -1);
+ if (result2 == result1 && result2 != 0)
+ AddTextPrinterParameterized3(gUnknown_203F440->unk3008[1], 0, sUnknown_8478EA8[j] - width, sUnknown_8478EB0[i], sTextColorTable[1], -1, sp0C);
+ else
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 0, sp0C, sUnknown_8478EA8[j] - width, sUnknown_8478EB0[i], -1, NULL);
+ }
+ }
+ CopyWindowToVram(gUnknown_203F440->unk3008[0], 2);
+ CopyWindowToVram(gUnknown_203F440->unk3008[1], 2);
+ gUnknown_203F440->state++;
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_203F440->unk3008[0]);
+ PutWindowTilemap(gUnknown_203F440->unk3008[1]);
+ }
+ CopyBgTilemapBufferToVram(0);
+ sub_8154324(FALSE);
+ gUnknown_203F440->state++;
+ break;
+ case 4:
+ if (++gUnknown_203F440->unk301C >= 30 && JOY_NEW(A_BUTTON))
+ {
+ gUnknown_203F440->unk301C = 0;
+ PlaySE(SE_SELECT);
+ sub_8154324(TRUE);
+ gUnknown_203F440->state++;
+ }
+ break;
+ case 5:
+ FillWindowPixelBuffer(gUnknown_203F440->unk3008[0], PIXEL_FILL(1));
+ FillWindowPixelBuffer(gUnknown_203F440->unk3008[1], PIXEL_FILL(1));
+ strWidth = GetStringWidth(0, gText_AnnouncingRankings, -1);
+ x = (224 - strWidth) / 2;
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[0], 0, gText_AnnouncingRankings, x, 2, -1, NULL);
+ gUnknown_203F440->state++;
+ break;
+ case 6:
+ sub_8154D9C(playersCount);
+ CopyWindowToVram(gUnknown_203F440->unk3008[0], 2);
+ CopyWindowToVram(gUnknown_203F440->unk3008[1], 2);
+ gUnknown_203F440->state++;
+ break;
+ case 7:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_203F440->unk3008[0]);
+ PutWindowTilemap(gUnknown_203F440->unk3008[1]);
+ }
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F440->state++;
+ break;
+ case 8:
+ if (++gUnknown_203F440->unk301C >= 30 && JOY_NEW(A_BUTTON))
+ {
+ gUnknown_203F440->unk301C = 0;
+ PlaySE(SE_SELECT);
+ if (sub_81534AC() < 3000)
+ {
+ gUnknown_203F440->state = 127;
+ }
+ else
+ {
+ StopMapMusic();
+ gUnknown_203F440->state++;
+ }
+
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 5, 30, 15);
+ RemoveWindow(gUnknown_203F440->unk3008[1]);
+ gUnknown_203F440->unk3008[1] = AddWindow(&sUnknown_8475684);
+ ClearWindowTilemap(gUnknown_203F440->unk3008[1]);
+ sub_8154868(&sUnknown_8475684);
+ }
+ break;
+ case 9:
+ PlayNewMapMusic(MUS_FANFA1);
+ FillWindowPixelBuffer(gUnknown_203F440->unk3008[0], PIXEL_FILL(1));
+ FillWindowPixelBuffer(gUnknown_203F440->unk3008[1], PIXEL_FILL(1));
+ strWidth = GetStringWidth(0, gText_AnnouncingPrizes, -1);
+ x = (224 - strWidth) / 2;
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[0], 0, gText_AnnouncingPrizes, x, 2, -1, NULL);
+ DynamicPlaceholderTextUtil_Reset();
+ CopyItemName(sub_8153390(), sp70);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sp70);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(sp0C, gText_FirstPlacePrize);
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 0, sp0C, 8, 2, -1, NULL);
+ itemGiveRet = sub_815372C();
+ if (itemGiveRet != 0 && itemGiveRet != 3)
+ {
+ DynamicPlaceholderTextUtil_Reset();
+ CopyItemName(sub_8153390(), sp70);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sp70);
+ if (itemGiveRet == 2)
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(sp0C, gText_CantHoldAnyMore);
+ else if (itemGiveRet == 1)
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(sp0C, gText_FilledStorageSpace);
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 0, sp0C, 8, 40, -1, NULL);
+ }
+ CopyWindowToVram(gUnknown_203F440->unk3008[0], 2);
+ CopyWindowToVram(gUnknown_203F440->unk3008[1], 2);
+ gUnknown_203F440->state++;
+ break;
+ case 10:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_203F440->unk3008[0]);
+ PutWindowTilemap(gUnknown_203F440->unk3008[1]);
+ }
+ CopyBgTilemapBufferToVram(0);
+ FadeOutAndFadeInNewMapMusic(MUS_WIN_YASEI, 20, 10);
+ gUnknown_203F440->state++;
+ break;
+ case 11:
+ if (++gUnknown_203F440->unk301C >= 30 && JOY_NEW(A_BUTTON))
+ {
+ gUnknown_203F440->unk301C = 0;
+ PlaySE(SE_SELECT);
+ gUnknown_203F440->state++;
+ }
+ break;
+ default:
+ ClearWindowTilemap(gUnknown_203F440->unk3008[0]);
+ ClearWindowTilemap(gUnknown_203F440->unk3008[1]);
+ RemoveWindow(gUnknown_203F440->unk3008[0]);
+ RemoveWindow(gUnknown_203F440->unk3008[1]);
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F440->finished = TRUE;
+ break;
+ }
+}
+
+static void sub_81556E0(void)
+{
+ u8 y;
+
+ switch (gUnknown_203F440->state)
+ {
+ case 0:
+ gUnknown_203F440->unk3008[0] = AddWindow(&sUnknown_847568C[0]);
+ gUnknown_203F440->unk3008[1] = AddWindow(&sUnknown_847568C[1]);
+ ClearWindowTilemap(gUnknown_203F440->unk3008[0]);
+ ClearWindowTilemap(gUnknown_203F440->unk3008[1]);
+ sub_8154868(&sUnknown_847568C[0]);
+ sub_8154768(&sUnknown_847568C[1]);
+ gUnknown_203F440->state++;
+ gUnknown_203F440->unk3020 = 0;
+ gUnknown_203F440->unk3024 = 0;
+ break;
+ case 1:
+ FillWindowPixelBuffer(gUnknown_203F440->unk3008[0], PIXEL_FILL(1));
+ FillWindowPixelBuffer(gUnknown_203F440->unk3008[1], PIXEL_FILL(1));
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[0], 2, gText_WantToPlayAgain, 0, 6, -1, NULL);
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 2, gText_Yes, 8, 2, -1, NULL);
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 2, gText_No, 8, 16, -1, NULL);
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 2, gText_SelectorArrow2, 0, 2, -1, NULL);
+ CopyWindowToVram(gUnknown_203F440->unk3008[0], 2);
+ CopyWindowToVram(gUnknown_203F440->unk3008[1], 2);
+ gUnknown_203F440->state++;
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_203F440->unk3008[0]);
+ PutWindowTilemap(gUnknown_203F440->unk3008[1]);
+ }
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F440->state++;
+ break;
+ case 3:
+ y = gUnknown_203F440->unk3020;
+ if (y == 0)
+ y = 1;
+ FillWindowPixelBuffer(gUnknown_203F440->unk3008[1], PIXEL_FILL(1));
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 2, gText_Yes, 8, 2, -1, NULL);
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 2, gText_No, 8, 16, -1, NULL);
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[1], 2, gText_SelectorArrow2, 0, y == 1 ? 2 : 16, -1, NULL);
+ CopyWindowToVram(gUnknown_203F440->unk3008[1], 3);
+ // Increment state only if A or B button have been pressed.
+ if (JOY_NEW(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ if (gUnknown_203F440->unk3020 == 0)
+ gUnknown_203F440->unk3020 = 1;
+ gUnknown_203F440->state++;
+ }
+ else if (JOY_NEW(DPAD_UP | DPAD_DOWN))
+ {
+ PlaySE(SE_SELECT);
+ switch (gUnknown_203F440->unk3020)
+ {
+ case 0:
+ gUnknown_203F440->unk3020 = 2;
+ break;
+ case 1:
+ gUnknown_203F440->unk3020 = 2;
+ break;
+ case 2:
+ gUnknown_203F440->unk3020 = 1;
+ break;
+ }
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ gUnknown_203F440->unk3020 = 2;
+ gUnknown_203F440->state++;
+ }
+ break;
+ default:
+ gUnknown_203F440->unk3024 = gUnknown_203F440->unk3020;
+ ClearWindowTilemap(gUnknown_203F440->unk3008[0]);
+ ClearWindowTilemap(gUnknown_203F440->unk3008[1]);
+ RemoveWindow(gUnknown_203F440->unk3008[0]);
+ RemoveWindow(gUnknown_203F440->unk3008[1]);
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F440->finished = TRUE;
+ break;
+ }
+}
+
+static void sub_8155A78(void)
+{
+ switch (gUnknown_203F440->state)
+ {
+ case 0:
+ DrawDialogueFrame(0, FALSE);
+ AddTextPrinterParameterized2(0, 2, gText_SavingDontTurnOffThePower2, 0, NULL, TEXT_COLOR_DARK_GREY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GREY);
+ gUnknown_203F440->state++;
+ break;
+ case 1:
+ CopyWindowToVram(0, 3);
+ gUnknown_203F440->state++;
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ CreateTask(sub_80DA634, 0);
+ gUnknown_203F440->state++;
+ }
+ break;
+ case 3:
+ if (!FuncIsActiveTask(sub_80DA634))
+ gUnknown_203F440->state++;
+ break;
+ default:
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F440->finished = TRUE;
+ break;
+ }
+}
+
+static void sub_8155B4C(void)
+{
+ switch (gUnknown_203F440->state)
+ {
+ case 0:
+ gUnknown_203F440->unk3008[0] = AddWindow(&sUnknown_84756A4);
+ ClearWindowTilemap(gUnknown_203F440->unk3008[0]);
+ sub_8154868(&sUnknown_84756A4);
+ gUnknown_203F440->state++;
+ break;
+ case 1:
+ FillWindowPixelBuffer(gUnknown_203F440->unk3008[0], PIXEL_FILL(1));
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[0], 2, gText_CommunicationStandby3, 0, 6, -1, NULL);
+ CopyWindowToVram(gUnknown_203F440->unk3008[0], 2);
+ gUnknown_203F440->state++;
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ PutWindowTilemap(gUnknown_203F440->unk3008[0]);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F440->state++;
+ break;
+ default:
+ gUnknown_203F440->finished = TRUE;
+ break;
+ }
+}
+
+static void sub_8155C2C(void)
+{
+ ClearWindowTilemap(gUnknown_203F440->unk3008[0]);
+ RemoveWindow(gUnknown_203F440->unk3008[0]);
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F440->finished = TRUE;
+}
+
+static void sub_8155C80(void)
+{
+ switch (gUnknown_203F440->state)
+ {
+ case 0:
+ gUnknown_203F440->unk3008[0] = AddWindow(&sUnknown_847569C);
+ ClearWindowTilemap(gUnknown_203F440->unk3008[0]);
+ sub_8154868(&sUnknown_847569C);
+ gUnknown_203F440->state++;
+ gUnknown_203F440->unk301C = 0;
+ gUnknown_203F440->unk3020 = 0;
+ gUnknown_203F440->unk3024 = 0;
+ break;
+ case 1:
+ FillWindowPixelBuffer(gUnknown_203F440->unk3008[0], PIXEL_FILL(1));
+ AddTextPrinterParameterized(gUnknown_203F440->unk3008[0], 2, gText_SomeoneDroppedOut, 0, 6, TEXT_SPEED_FF, NULL);
+ CopyWindowToVram(gUnknown_203F440->unk3008[0], 2);
+ gUnknown_203F440->state++;
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ PutWindowTilemap(gUnknown_203F440->unk3008[0]);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F440->state++;
+ break;
+ case 3:
+ if (++gUnknown_203F440->unk301C >= 120)
+ gUnknown_203F440->state++;
+ break;
+ default:
+ gUnknown_203F440->unk3024 = 5;
+ ClearWindowTilemap(gUnknown_203F440->unk3008[0]);
+ RemoveWindow(gUnknown_203F440->unk3008[0]);
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F440->finished = TRUE;
+ break;
+ }
+}
+
+static void unused_0(void)
+{
+ DestroyTask(gUnknown_203F440->unk3004);
+ gUnknown_203F440->finished = TRUE;
+}
+
+static void nullsub_98(void)
+{
+
+}
+
+static void sub_8155E24(void (*func)(void))
+{
+ gUnknown_203F440->state = 0;
+ gUnknown_203F440->finished = FALSE;
+ gUnknown_203F440->unk3028 = func;
+}
+
+void (*sub_8155E54(void))(void)
+{
+ return gUnknown_203F440->unk3028;
+}
+
+bool32 sub_8155E68(void)
+{
+ if (gUnknown_203F440->finished == TRUE)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+u8 sub_8155E8C(void)
+{
+ return gUnknown_203F440->unk3024;
+}
+
+static void sub_8155EA0(void)
+{
+ DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000);
+ DmaClear32(3,(void *)OAM, OAM_SIZE);
+ DmaClear16(3, (void *)PLTT, PLTT_SIZE);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ ResetBgsAndClearDma3BusyFlags(FALSE);
+ InitBgsFromTemplates(0, sUnknown_847565C, ARRAY_COUNT(sUnknown_847565C));
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ InitStandardTextBoxWindows();
+ ResetBg0();
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ SetBgTilemapBuffer(3, gUnknown_203F440->tilemapBuffers[0]);
+ SetBgTilemapBuffer(1, gUnknown_203F440->tilemapBuffers[1]);
+ SetBgTilemapBuffer(2, gUnknown_203F440->tilemapBuffers[2]);
+}
+
+static bool32 sub_8155FE0(void)
+{
+ switch (gUnknown_203F440->unk3018)
+ {
+ case 0:
+ LoadPalette(sDodrioBerryBgPal1, 0, sizeof(sDodrioBerryBgPal1));
+ break;
+ case 1:
+ ResetTempTileDataBuffers();
+ break;
+ case 2:
+ DecompressAndCopyTileDataToVram(3, sDodrioBerryBgGfx1, 0, 0, 0);
+ break;
+ case 3:
+ DecompressAndCopyTileDataToVram(1, sDodrioBerryBgGfx2, 0, 0, 0);
+ break;
+ case 4:
+ if (FreeTempTileDataBuffersIfPossible() == TRUE)
+ return FALSE;
+ break;
+ case 5:
+ LoadPalette(stdpal_get(3), 0xD0, 0x20);
+ break;
+ default:
+ gUnknown_203F440->unk3018 = 0;
+ return TRUE;
+ }
+
+ gUnknown_203F440->unk3018++;
+ return FALSE;
+}
diff --git a/src/dodrio_berry_picking_3.c b/src/dodrio_berry_picking_3.c
new file mode 100644
index 000000000..fec1d62f7
--- /dev/null
+++ b/src/dodrio_berry_picking_3.c
@@ -0,0 +1,241 @@
+#include "global.h"
+#include "dodrio_berry_picking.h"
+#include "link.h"
+#include "link_rfu.h"
+
+void sub_815A5BC(s32 a0)
+{
+ struct Padded_U8 data[2];
+ data[0].value = 1;
+ data[1].value = a0;
+ RfuPrepareSend0x2f00(data);
+}
+
+u8 sub_815A5E8(s32 a0)
+{
+ u8 * r1;
+ if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00)
+ return 0;
+ r1 = (u8 *)&gRecvCmds[a0][1];
+ if (r1[0] == 1)
+ return r1[4];
+ return 0;
+}
+
+struct UnkPacket2
+{
+ u8 id;
+ u8 unk1_0:4;
+ u8 unk1_1:4;
+ u16 unk2_0:4;
+ u16 unk2_1:4;
+ u16 unk3_0:4;
+ u16 unk3_1:4;
+ u16 unk4_0:4;
+ u16 unk4_1:4;
+ u16 unk5_0:4;
+ u16 unk5_1:4;
+ u16 unk6_0:2;
+ u16 unk6_1:2;
+ u16 unk6_2:2;
+ u16 unk6_3:2;
+ u16 unk7_0:2;
+ u16 unk7_1:2;
+ u16 unk7_2:2;
+ u16 unk7_3:2;
+ u8 unk8_0:2;
+ u8 unk8_1:2;
+ u8 unk8_2:2;
+ u8 unk8_3:2;
+ u8 unk9_0:2;
+ u8 unk9_1:2;
+ u8 unk9_2:2;
+ u8 unk9_3:1;
+ u8 unk9_4:1;
+ u8 unkA_0:1;
+ u8 unkA_1:1;
+ u8 unkA_2:1;
+ u8 unkA_3:5;
+ u8 unkB_0:1;
+ u8 unkB_1:1;
+ u8 unkB_2:1;
+ u8 unkB_3:1;
+ u8 unkB_4:1;
+ u8 unkB_5:1;
+ u8 unkB_6:1;
+};
+
+void sub_815A61C(struct DodrioSubstruct_31A0 * arg0, struct DodrioSubstruct_31A0_2C * arg1, struct DodrioSubstruct_31A0_2C * arg2, struct DodrioSubstruct_31A0_2C * arg3, struct DodrioSubstruct_31A0_2C * arg4, struct DodrioSubstruct_31A0_2C * arg5, u8 arg6, u32 arg7, u32 arg8)
+{
+ struct UnkPacket2 packet;
+ struct DodrioSubstruct_31A0_14 * ptr = &arg0->unk14;
+
+ packet.id = 2;
+ packet.unk1_0 = ptr->unkB[0];
+ packet.unk1_1 = ptr->unkB[1];
+ packet.unk2_0 = ptr->unkB[2];
+ packet.unk2_1 = ptr->unkB[3];
+ packet.unk3_0 = ptr->unkB[4];
+ packet.unk3_1 = ptr->unkB[5];
+ packet.unk4_0 = ptr->unkB[6];
+ packet.unk4_1 = ptr->unkB[7];
+ packet.unk5_0 = ptr->unkB[8];
+ packet.unk5_1 = ptr->unkB[9];
+
+ packet.unk6_0 = ptr->unk0[0];
+ packet.unk6_1 = ptr->unk0[1];
+ packet.unk6_2 = ptr->unk0[2];
+ packet.unk6_3 = ptr->unk0[3];
+ packet.unk7_0 = ptr->unk0[4];
+ packet.unk7_1 = ptr->unk0[5];
+ packet.unk7_2 = ptr->unk0[6];
+ packet.unk7_3 = ptr->unk0[7];
+ packet.unk8_0 = ptr->unk0[8];
+ packet.unk8_1 = ptr->unk0[9];
+
+ packet.unk8_2 = arg1->unk0;
+ packet.unk8_3 = arg2->unk0;
+ packet.unk9_0 = arg3->unk0;
+ packet.unk9_1 = arg4->unk0;
+ packet.unk9_2 = arg5->unk0;
+
+ packet.unk9_3 = arg1->unk4;
+ packet.unk9_4 = arg2->unk4;
+ packet.unkA_0 = arg3->unk4;
+ packet.unkA_1 = arg4->unk4;
+ packet.unkA_2 = arg5->unk4;
+
+ packet.unkB_2 = arg1->unk8;
+ packet.unkB_3 = arg2->unk8;
+ packet.unkB_4 = arg3->unk8;
+ packet.unkB_5 = arg4->unk8;
+ packet.unkB_6 = arg5->unk8;
+
+ packet.unkA_3 = arg6;
+ packet.unkB_1 = arg7;
+ packet.unkB_0 = arg8;
+ RfuPrepareSend0x2f00(&packet);
+}
+
+u32 sub_815A950(u32 unused, struct DodrioSubstruct_31A0 * arg0, struct DodrioSubstruct_31A0_2C * arg1, struct DodrioSubstruct_31A0_2C * arg2, struct DodrioSubstruct_31A0_2C * arg3, struct DodrioSubstruct_31A0_2C * arg4, struct DodrioSubstruct_31A0_2C * arg5, u8 *arg6, u32 *arg7, u32 *arg8)
+{
+ struct UnkPacket2 * packet;
+ struct DodrioSubstruct_31A0_14 * ptr = &arg0->unk14;
+
+ if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00)
+ return 0;
+
+ packet = (void *)&gRecvCmds[0][1];
+ if (packet->id == 2)
+ {
+ ptr->unkB[0] = packet->unk1_0;
+ ptr->unkB[1] = packet->unk1_1;
+ ptr->unkB[2] = packet->unk2_0;
+ ptr->unkB[3] = packet->unk2_1;
+ ptr->unkB[4] = packet->unk3_0;
+ ptr->unkB[5] = packet->unk3_1;
+ ptr->unkB[6] = packet->unk4_0;
+ ptr->unkB[7] = packet->unk4_1;
+ ptr->unkB[8] = packet->unk5_0;
+ ptr->unkB[9] = packet->unk5_1;
+ ptr->unkB[10] = packet->unk1_0;
+
+ ptr->unk0[0] = packet->unk6_0;
+ ptr->unk0[1] = packet->unk6_1;
+ ptr->unk0[2] = packet->unk6_2;
+ ptr->unk0[3] = packet->unk6_3;
+ ptr->unk0[4] = packet->unk7_0;
+ ptr->unk0[5] = packet->unk7_1;
+ ptr->unk0[6] = packet->unk7_2;
+ ptr->unk0[7] = packet->unk7_3;
+ ptr->unk0[8] = packet->unk8_0;
+ ptr->unk0[9] = packet->unk8_1;
+ ptr->unk0[10] = packet->unk6_0;
+
+ arg1->unk0 = packet->unk8_2;
+ arg1->unk4 = packet->unk9_3;
+ arg1->unk8 = packet->unkB_2;
+
+ arg2->unk0 = packet->unk8_3;
+ arg2->unk4 = packet->unk9_4;
+ arg2->unk8 = packet->unkB_3;
+
+ arg3->unk0 = packet->unk9_0;
+ arg3->unk4 = packet->unkA_0;
+ arg3->unk8 = packet->unkB_4;
+
+ arg4->unk0 = packet->unk9_1;
+ arg4->unk4 = packet->unkA_1;
+ arg4->unk8 = packet->unkB_5;
+
+ arg5->unk0 = packet->unk9_2;
+ arg5->unk4 = packet->unkA_2;
+ arg5->unk8 = packet->unkB_6;
+
+ *arg6 = packet->unkA_3;
+ *arg7 = packet->unkB_1;
+ *arg8 = packet->unkB_0;
+ return 1;
+ }
+
+ return 0;
+}
+
+struct UnkPacket3
+{
+ u8 id;
+ u8 ALIGNED(4) unk4;
+};
+
+void sub_815AAD8(u8 arg0)
+{
+ struct UnkPacket3 packet;
+ packet.id = 3;
+ packet.unk4 = arg0;
+ RfuPrepareSend0x2f00(&packet);
+}
+
+u32 sub_815AB04(u32 arg0, u8 *arg1)
+{
+ struct UnkPacket3 * packet;
+
+ if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00)
+ return 0;
+
+ packet = (void *)&gRecvCmds[arg0][1];
+ if (packet->id == 3)
+ {
+ *arg1 = packet->unk4;
+ return 1;
+ }
+
+ return 0;
+}
+
+struct UnkPacket4
+{
+ u8 id;
+ u32 unk4;
+};
+
+void sub_815AB3C(u32 arg0)
+{
+ struct UnkPacket4 packet;
+ packet.id = 4;
+ packet.unk4 = arg0;
+ RfuPrepareSend0x2f00(&packet);
+}
+
+u32 sub_815AB60(u32 arg0)
+{
+ struct UnkPacket4 * packet;
+
+ if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00)
+ return 0;
+
+ packet = (void *)&gRecvCmds[arg0][1];
+ if (packet->id == 4)
+ return packet->unk4;
+
+ return 0;
+}
diff --git a/src/dynamic_placeholder_text_util.c b/src/dynamic_placeholder_text_util.c
index 6909fea30..921612cfc 100644
--- a/src/dynamic_placeholder_text_util.c
+++ b/src/dynamic_placeholder_text_util.c
@@ -1,17 +1,89 @@
#include "global.h"
#include "text.h"
-#include "dynamic_placeholder_text_util.h"
#include "string_util.h"
+#include "constants/event_objects.h"
static EWRAM_DATA const u8 *sStringPointers[8] = {0};
static const u8 sTextColorTable[] =
{
- 0, 0, 0, 16, 17, 17, 17, 16, 16, 0, 0, 17, 1, 0, 17, 16,
- 0, 16, 16, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0,
- 17, 1, 0, 0, 0, 16, 17, 0, 16, 16, 16, 0, 1, 0, 51, 51,
- 51, 51, 51, 51, 51, 51, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 50,
+ // [LOW_NYBBLE / 2] = 0xXY, // HIGH_NYBBLE
+ [OBJ_EVENT_GFX_RED_NORMAL / 2] = 0x00, // OBJ_EVENT_GFX_RED_BIKE
+ [OBJ_EVENT_GFX_RED_SURF / 2] = 0x00, // OBJ_EVENT_GFX_RED_ITEM
+ [OBJ_EVENT_GFX_RED_FISH / 2] = 0x00, // OBJ_EVENT_GFX_RED_ITEM_COPY
+ [OBJ_EVENT_GFX_RED_VS_SEEKER / 2] = 0x10, // OBJ_EVENT_GFX_GREEN_NORMAL
+ [OBJ_EVENT_GFX_GREEN_BIKE / 2] = 0x11, // OBJ_EVENT_GFX_GREEN_SURF
+ [OBJ_EVENT_GFX_GREEN_ITEM / 2] = 0x11, // OBJ_EVENT_GFX_GREEN_FISH
+ [OBJ_EVENT_GFX_GREEN_ITEM_COPY / 2] = 0x11, // OBJ_EVENT_GFX_GREEN_VS_SEEKER
+ [OBJ_EVENT_GFX_RS_BRENDAN / 2] = 0x10, // OBJ_EVENT_GFX_RS_MAY
+ [OBJ_EVENT_GFX_LITTLE_BOY / 2] = 0x10, // OBJ_EVENT_GFX_LITTLE_GIRL
+ [OBJ_EVENT_GFX_YOUNGSTER / 2] = 0x00, // OBJ_EVENT_GFX_BOY
+ [OBJ_EVENT_GFX_BUG_CATCHER / 2] = 0x00, // OBJ_EVENT_GFX_SITTING_BOY
+ [OBJ_EVENT_GFX_LASS / 2] = 0x11, // OBJ_EVENT_GFX_WOMAN_1
+ [OBJ_EVENT_GFX_BATTLE_GIRL / 2] = 0x01, // OBJ_EVENT_GFX_MAN
+ [OBJ_EVENT_GFX_ROCKER / 2] = 0x00, // OBJ_EVENT_GFX_FAT_MAN
+ [OBJ_EVENT_GFX_WOMAN_2 / 2] = 0x11, // OBJ_EVENT_GFX_BEAUTY
+ [OBJ_EVENT_GFX_BALDING_MAN / 2] = 0x10, // OBJ_EVENT_GFX_WOMAN_3
+ [OBJ_EVENT_GFX_OLD_MAN_1 / 2] = 0x00, // OBJ_EVENT_GFX_OLD_MAN_2
+ [OBJ_EVENT_GFX_OLD_MAN_LYING_DOWN / 2] = 0x10, // OBJ_EVENT_GFX_OLD_WOMAN
+ [OBJ_EVENT_GFX_TUBER_M_1 / 2] = 0x10, // OBJ_EVENT_GFX_TUBER_F
+ [OBJ_EVENT_GFX_TUBER_M_2 / 2] = 0x00, // OBJ_EVENT_GFX_CAMPER
+ [OBJ_EVENT_GFX_PICNICKER / 2] = 0x01, // OBJ_EVENT_GFX_COOLTRAINER_M
+ [OBJ_EVENT_GFX_COOLTRAINER_F / 2] = 0x01, // OBJ_EVENT_GFX_SWIMMER_M_WATER
+ [OBJ_EVENT_GFX_SWIMMER_F_WATER / 2] = 0x01, // OBJ_EVENT_GFX_SWIMMER_M_LAND
+ [OBJ_EVENT_GFX_SWIMMER_F_LAND / 2] = 0x01, // OBJ_EVENT_GFX_WORKER_M
+ [OBJ_EVENT_GFX_WORKER_F / 2] = 0x01, // OBJ_EVENT_GFX_ROCKET_M
+ [OBJ_EVENT_GFX_ROCKET_F / 2] = 0x01, // OBJ_EVENT_GFX_GBA_KID
+ [OBJ_EVENT_GFX_SUPER_NERD / 2] = 0x00, // OBJ_EVENT_GFX_BIKER
+ [OBJ_EVENT_GFX_BLACKBELT / 2] = 0x00, // OBJ_EVENT_GFX_SCIENTIST
+ [OBJ_EVENT_GFX_HIKER / 2] = 0x00, // OBJ_EVENT_GFX_FISHER
+ [OBJ_EVENT_GFX_CHANNELER / 2] = 0x01, // OBJ_EVENT_GFX_CHEF
+ [OBJ_EVENT_GFX_POLICEMAN / 2] = 0x00, // OBJ_EVENT_GFX_GENTLEMAN
+ [OBJ_EVENT_GFX_SAILOR / 2] = 0x00, // OBJ_EVENT_GFX_CAPTAIN
+ [OBJ_EVENT_GFX_NURSE / 2] = 0x11, // OBJ_EVENT_GFX_CABLE_CLUB_RECEPTIONIST
+ [OBJ_EVENT_GFX_UNION_ROOM_RECEPTIONIST / 2] = 0x01, // OBJ_EVENT_GFX_UNUSED_MALE_RECEPTIONIST
+ [OBJ_EVENT_GFX_CLERK / 2] = 0x00, // OBJ_EVENT_GFX_MG_DELIVERYMAN
+ [OBJ_EVENT_GFX_TRAINER_TOWER_DUDE / 2] = 0x00, // OBJ_EVENT_GFX_PROF_OAK
+ [OBJ_EVENT_GFX_BLUE / 2] = 0x00, // OBJ_EVENT_GFX_BILL
+ [OBJ_EVENT_GFX_LANCE / 2] = 0x10, // OBJ_EVENT_GFX_AGATHA
+ [OBJ_EVENT_GFX_DAISY / 2] = 0x11, // OBJ_EVENT_GFX_LORELEI
+ [OBJ_EVENT_GFX_MR_FUJI / 2] = 0x00, // OBJ_EVENT_GFX_BRUNO
+ [OBJ_EVENT_GFX_BROCK / 2] = 0x10, // OBJ_EVENT_GFX_MISTY
+ [OBJ_EVENT_GFX_LT_SURGE / 2] = 0x10, // OBJ_EVENT_GFX_ERIKA
+ [OBJ_EVENT_GFX_KOGA / 2] = 0x10, // OBJ_EVENT_GFX_SABRINA
+ [OBJ_EVENT_GFX_BLAINE / 2] = 0x00, // OBJ_EVENT_GFX_GIOVANNI
+ [OBJ_EVENT_GFX_MOM / 2] = 0x01, // OBJ_EVENT_GFX_CELIO
+ [OBJ_EVENT_GFX_TEACHY_TV_HOST / 2] = 0x00, // OBJ_EVENT_GFX_GYM_GUY
+ [OBJ_EVENT_GFX_ITEM_BALL / 2] = 0x33, // OBJ_EVENT_GFX_TOWN_MAP
+ [OBJ_EVENT_GFX_POKEDEX / 2] = 0x33, // OBJ_EVENT_GFX_CUT_TREE
+ [OBJ_EVENT_GFX_ROCK_SMASH_ROCK / 2] = 0x33, // OBJ_EVENT_GFX_STRENGTH_BOULDER
+ [OBJ_EVENT_GFX_FOSSIL / 2] = 0x33, // OBJ_EVENT_GFX_RUBY
+ [OBJ_EVENT_GFX_SAPPHIRE / 2] = 0x33, // OBJ_EVENT_GFX_OLD_AMBER
+ [OBJ_EVENT_GFX_GYM_SIGN / 2] = 0x33, // OBJ_EVENT_GFX_SIGN
+ [OBJ_EVENT_GFX_TRAINER_TIPS / 2] = 0x33, // OBJ_EVENT_GFX_CLIPBOARD
+ [OBJ_EVENT_GFX_METEORITE / 2] = 0x33, // OBJ_EVENT_GFX_LAPRAS_DOLL
+ [OBJ_EVENT_GFX_SEAGALLOP / 2] = 0x23, // OBJ_EVENT_GFX_SNORLAX
+ [OBJ_EVENT_GFX_SPEAROW / 2] = 0x22, // OBJ_EVENT_GFX_CUBONE
+ [OBJ_EVENT_GFX_POLIWRATH / 2] = 0x22, // OBJ_EVENT_GFX_CLEFAIRY
+ [OBJ_EVENT_GFX_PIDGEOT / 2] = 0x22, // OBJ_EVENT_GFX_JIGGLYPUFF
+ [OBJ_EVENT_GFX_PIDGEY / 2] = 0x22, // OBJ_EVENT_GFX_CHANSEY
+ [OBJ_EVENT_GFX_OMANYTE / 2] = 0x22, // OBJ_EVENT_GFX_KANGASKHAN
+ [OBJ_EVENT_GFX_PIKACHU / 2] = 0x22, // OBJ_EVENT_GFX_PSYDUCK
+ [OBJ_EVENT_GFX_NIDORAN_F / 2] = 0x22, // OBJ_EVENT_GFX_NIDORAN_M
+ [OBJ_EVENT_GFX_NIDORINO / 2] = 0x22, // OBJ_EVENT_GFX_MEOWTH
+ [OBJ_EVENT_GFX_SEEL / 2] = 0x22, // OBJ_EVENT_GFX_VOLTORB
+ [OBJ_EVENT_GFX_SLOWPOKE / 2] = 0x22, // OBJ_EVENT_GFX_SLOWBRO
+ [OBJ_EVENT_GFX_MACHOP / 2] = 0x22, // OBJ_EVENT_GFX_WIGGLYTUFF
+ [OBJ_EVENT_GFX_DODUO / 2] = 0x22, // OBJ_EVENT_GFX_FEAROW
+ [OBJ_EVENT_GFX_MACHOKE / 2] = 0x22, // OBJ_EVENT_GFX_LAPRAS
+ [OBJ_EVENT_GFX_ZAPDOS / 2] = 0x22, // OBJ_EVENT_GFX_MOLTRES
+ [OBJ_EVENT_GFX_ARTICUNO / 2] = 0x22, // OBJ_EVENT_GFX_MEWTWO
+ [OBJ_EVENT_GFX_MEW / 2] = 0x22, // OBJ_EVENT_GFX_ENTEI
+ [OBJ_EVENT_GFX_SUICUNE / 2] = 0x22, // OBJ_EVENT_GFX_RAIKOU
+ [OBJ_EVENT_GFX_LUGIA / 2] = 0x22, // OBJ_EVENT_GFX_HO_OH
+ [OBJ_EVENT_GFX_CELEBI / 2] = 0x22, // OBJ_EVENT_GFX_KABUTO
+ [OBJ_EVENT_GFX_DEOXYS_D / 2] = 0x22, // OBJ_EVENT_GFX_DEOXYS_A
+ [OBJ_EVENT_GFX_DEOXYS_N / 2] = 0x32, // OBJ_EVENT_GFX_SS_ANNE
};
void DynamicPlaceholderTextUtil_Reset(void)
@@ -63,7 +135,7 @@ u8 GetColorFromTextColorTable(u16 graphicId)
u32 test = graphicId >> 1;
u32 shift = (graphicId & 1) << 2;
- if (test > 0x4B)
+ if (test >= NELEMS(sTextColorTable))
return 3;
else
return (sTextColorTable[graphicId >> 1] >> shift) & 0xF;
diff --git a/src/easy_chat.c b/src/easy_chat.c
index 1d2873fc2..657d178d7 100644
--- a/src/easy_chat.c
+++ b/src/easy_chat.c
@@ -1,33 +1,18 @@
#include "global.h"
#include "malloc.h"
-#include "bg.h"
#include "data.h"
-#include "decompress.h"
-#include "dynamic_placeholder_text_util.h"
#include "easy_chat.h"
#include "event_data.h"
#include "field_message_box.h"
-#include "field_weather.h"
-#include "gpu_regs.h"
-#include "graphics.h"
-#include "main.h"
#include "mevent.h"
#include "menu.h"
#include "mail.h"
-#include "overworld.h"
-#include "palette.h"
#include "pokedex.h"
#include "random.h"
-#include "sound.h"
#include "string_util.h"
#include "strings.h"
-#include "task.h"
-#include "text_window.h"
-#include "window.h"
#include "constants/easy_chat.h"
-#include "constants/object_events.h"
#include "constants/flags.h"
-#include "constants/songs.h"
#include "constants/species.h"
struct Unk203A120
@@ -291,7 +276,7 @@ static u16 GetRandomWordFromAnyGroup(u16 groupId)
return GetRandomWordFromGroup(groupId);
}
-void Special_BufferEasyChatMessage(void)
+void ShowEasyChatMessage(void)
{
u16 *easyChatWords;
int columns, rows;
diff --git a/src/easy_chat_2.c b/src/easy_chat_2.c
new file mode 100644
index 000000000..4b3c70b67
--- /dev/null
+++ b/src/easy_chat_2.c
@@ -0,0 +1,1363 @@
+#include "global.h"
+#include "gflib.h"
+#include "easy_chat.h"
+#include "event_data.h"
+#include "menu.h"
+#include "mevent.h"
+#include "overworld.h"
+#include "strings.h"
+#include "task.h"
+#include "constants/songs.h"
+
+#define EZCHAT_TASK_STATE 0
+#define EZCHAT_TASK_TYPE 1
+#define EZCHAT_TASK_WORDS 2
+#define EZCHAT_TASK_MAINCALLBACK 4
+#define EZCHAT_TASK_UNK06 6
+#define EZCHAT_TASK_SIZE 7
+
+struct EasyChatScreenTemplate
+{
+ u8 type;
+ u8 numColumns;
+ u8 numRows;
+ u8 frameId;
+ const u8 *titleText;
+ const u8 *instructionsText1;
+ const u8 *instructionsText2;
+ const u8 *confirmText1;
+ const u8 *confirmText2;
+};
+
+struct EasyChatScreen
+{
+ /*0x00*/ u8 type;
+ /*0x01*/ u8 templateId;
+ /*0x02*/ u8 numColumns;
+ /*0x03*/ u8 numRows;
+ /*0x04*/ u8 state;
+ /*0x05*/ s8 mainCursorColumn;
+ /*0x06*/ s8 mainCursorRow;
+ /*0x07*/ u8 numWords;
+ /*0x08*/ u8 stateBackup;
+ /*0x09*/ bool8 isAlphaMode;
+ /*0x0A*/ s8 selectGroupCursorX;
+ /*0x0B*/ s8 selectGroupCursorY;
+ /*0x0C*/ u8 selectGroupRowsAbove;
+ /*0x0D*/ u8 selectGroupNumRows;
+ /*0x0E*/ u8 selectWordRowsAbove;
+ /*0x0F*/ u8 selectWordNumRows;
+ /*0x10*/ s8 selectWordCursorX;
+ /*0x11*/ s8 selectWordCursorY;
+ /*0x14*/ u16 *words;
+ /*0x18*/ u16 ecWordBuffer[9];
+};
+
+static EWRAM_DATA struct EasyChatScreen * sEasyChatScreen = NULL;
+
+static void CB2_EasyChatScreen(void);
+static void Task_InitEasyChat(u8 taskId);
+static void Task_RunEasyChat(u8 taskId);
+static bool8 Task_InitEasyChatInternal(u8 taskId);
+static void DismantleEasyChat(MainCallback cb);
+static void CompareProfileResponseWithPassphrase(void);
+static void CompareQuestionnaireResponseWithPassphrase(void);
+static bool8 EasyChat_AllocateResources(u8 type, u16 *words);
+static void EasyChat_FreeResources(void);
+static u16 EasyChatScreen_HandleJoypad(void);
+static u16 HandleJoypad_SelectField(void);
+static u16 HandleJoypad_SelectFooter(void);
+static u16 HandleJoypad_SelectGroup(void);
+static u16 HandleJoypad_SelectWord(void);
+static u16 Cancel_HandleYesNoMenu(void);
+static u16 Confirm_HandleYesNoMenu(void);
+static u16 DelAll_HandleYesNoMenu(void);
+static u16 Cancel_CreateYesNoMenu(void);
+static u16 DelAll_CreateYesNoMenu(void);
+static u16 Confirm_CreateYesNoMenu(void);
+static u8 GetStateBackup(void);
+static int OpenSelectedGroup(void);
+static int BackOutFromGroupToFieldSelect(void);
+static int ToggleGroupAlphaMode(void);
+static int DeleteSelectedWord(void);
+static int PlaceSelectedWord(void);
+static void CommitECWords(void);
+static void DeleteAllECFields(void);
+static void SetEasyChatWordToField(u16 word);
+static bool8 HasECMessageChanged(void);
+static u16 SelectGroupCursorAction(u32 action);
+static int UpdateSelectGroupCursorPos_OutsideBlueBox_GroupMode(u32 action);
+static int UpdateSelectGroupCursorPos_OutsideBlueBox_AlphaMode(u32 action);
+static int UpdateSelectGroupCursorPos_InsideBlueBox(u32 action);
+static void GroupCursorMoveToBlueBox(void);
+static void GroupCursorWrapAroundLeft(void);
+static u16 SelectWordCursorAction(u32 action);
+static u16 GetSelectedFieldIndex(void);
+static u16 GetSelectedGroupIndex(void);
+static int GetSelectedLetter(void);
+static u16 GetSelectWordCursorPos(void);
+static u8 GetMaxGroupCursorXinAlphaMode(u8 unkB);
+static void MoveGroupCursorXToMaxCol(void);
+static void MoveWordCursorXToMaxCol(void);
+static bool8 GroupSelectCursorXPosTooFarRight(void);
+static bool8 WordSelectCursorXPosTooFarRight(void);
+static bool8 IsPhraseDifferentThanPlayerInput(const u16 *wordsToCompare, u8 numWords);
+static u8 GetEasyChatScreenTemplateId(u8 type);
+static bool32 IsEcWordBufferUninitialized(void);
+
+void DoEasyChatScreen(u8 type, u16 *words, MainCallback callback)
+{
+ u8 taskId;
+ ResetTasks();
+ taskId = CreateTask(Task_InitEasyChat, 0);
+ gTasks[taskId].data[EZCHAT_TASK_TYPE] = type;
+ SetWordTaskArg(taskId, EZCHAT_TASK_WORDS, (uintptr_t)words);
+ SetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK, (uintptr_t)callback);
+ SetMainCallback2(CB2_EasyChatScreen);
+}
+
+static void CB2_EasyChatScreen(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void VBlankCallback_EasyChatScreen(void)
+{
+ TransferPlttBuffer();
+ LoadOam();
+ ProcessSpriteCopyRequests();
+}
+
+static void SetEasyChatTaskFunc(u8 taskId, TaskFunc func)
+{
+ gTasks[taskId].func = func;
+ gTasks[taskId].data[EZCHAT_TASK_STATE] = 0;
+}
+
+static void Task_InitEasyChat(u8 taskId)
+{
+ if (!IsUpdateLinkStateCBActive())
+ {
+ while (Task_InitEasyChatInternal(taskId))
+ ;
+ }
+ else
+ {
+ if (Task_InitEasyChatInternal(taskId) == TRUE)
+ return;
+ }
+ SetEasyChatTaskFunc(taskId, Task_RunEasyChat);
+}
+
+static void Task_RunEasyChat(u8 taskId)
+{
+ u16 action;
+ s16 *data;
+
+ data = gTasks[taskId].data;
+ switch (data[EZCHAT_TASK_STATE])
+ {
+ case 0:
+ SetVBlankCallback(VBlankCallback_EasyChatScreen);
+ BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK);
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ data[EZCHAT_TASK_STATE]++;
+ break;
+ case 1:
+ action = EasyChatScreen_HandleJoypad();
+ if (action == 23)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK);
+ data[EZCHAT_TASK_STATE] = 3;
+ }
+ else if (action != 0)
+ {
+ PlaySE(SE_SELECT);
+ EasyChatInterfaceCommand_Setup(action);
+ data[EZCHAT_TASK_STATE]++;
+ }
+ break;
+ case 2:
+ if (!EasyChatInterfaceCommand_Run())
+ data[EZCHAT_TASK_STATE] = 1;
+ break;
+ case 3:
+ if (!gPaletteFade.active)
+ {
+ if (data[EZCHAT_TASK_TYPE] == EASY_CHAT_TYPE_QUESTIONNAIRE)
+ CompareQuestionnaireResponseWithPassphrase();
+ if (data[EZCHAT_TASK_TYPE] == EASY_CHAT_TYPE_PROFILE)
+ {
+ FlagSet(FLAG_SYS_SET_TRAINER_CARD_PROFILE);
+ CompareProfileResponseWithPassphrase();
+ }
+ DismantleEasyChat((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));
+ }
+ break;
+ }
+}
+
+static bool8 Task_InitEasyChatInternal(u8 taskId)
+{
+ s16 *data;
+
+ data = gTasks[taskId].data;
+ switch (data[EZCHAT_TASK_STATE])
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetPaletteFade();
+ break;
+ case 1:
+ if (!InitEasyChatSelection())
+ {
+ DismantleEasyChat((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));
+ }
+ break;
+ case 2:
+ if (!EasyChat_AllocateResources(data[EZCHAT_TASK_TYPE], (u16 *)GetWordTaskArg(taskId, EZCHAT_TASK_WORDS)))
+ {
+ DismantleEasyChat((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));
+ }
+ break;
+ case 3:
+ if (!InitEasyChatGraphicsWork())
+ {
+ DismantleEasyChat((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));
+ }
+ break;
+ case 4:
+ if (LoadEasyChatGraphics())
+ {
+ return TRUE;
+ }
+ break;
+ default:
+ return FALSE;
+ }
+ data[EZCHAT_TASK_STATE]++;
+ return TRUE;
+}
+
+static void DismantleEasyChat(MainCallback callback)
+{
+ DestroyEasyChatSelectionData();
+ EasyChat_FreeResources();
+ DestroyEasyChatGraphicsResources();
+ FreeAllWindowBuffers();
+ SetMainCallback2(callback);
+}
+
+void ShowEasyChatScreen(void)
+{
+ u16 *words;
+ switch (gSpecialVar_0x8004)
+ {
+ case EASY_CHAT_TYPE_PROFILE:
+ words = gSaveBlock1Ptr->easyChatProfile;
+ break;
+ case EASY_CHAT_TYPE_BATTLE_START:
+ words = gSaveBlock1Ptr->easyChatBattleStart;
+ break;
+ case EASY_CHAT_TYPE_BATTLE_WON:
+ words = gSaveBlock1Ptr->easyChatBattleWon;
+ break;
+ case EASY_CHAT_TYPE_BATTLE_LOST:
+ words = gSaveBlock1Ptr->easyChatBattleLost;
+ break;
+ case EASY_CHAT_TYPE_QUESTIONNAIRE:
+ words = GetMEventProfileECWordsMaybe();
+ break;
+ case EASY_CHAT_TYPE_MAIL:
+ words = gSaveBlock1Ptr->mail[gSpecialVar_0x8005].words;
+ break;
+ default:
+ return;
+ }
+ DoEasyChatScreen(gSpecialVar_0x8004, words, sub_80568C4);
+}
+
+static const u16 sECPhrase_MysteryEventIsExciting[] = {
+ EC_WORD_MYSTERY,
+ EC_WORD_EVENT,
+ EC_WORD_IS,
+ EC_WORD_EXCITING
+};
+
+static void CompareProfileResponseWithPassphrase(void)
+{
+ gSpecialVar_0x8004 = IsPhraseDifferentThanPlayerInput(sECPhrase_MysteryEventIsExciting, NELEMS(sECPhrase_MysteryEventIsExciting));
+}
+
+static const u16 sECPhrase_LinkTogetherWithAll[] = {
+ EC_WORD_LINK,
+ EC_WORD_TOGETHER,
+ EC_WORD_WITH,
+ EC_WORD_ALL
+};
+
+static void CompareQuestionnaireResponseWithPassphrase(void)
+{
+ gSpecialVar_0x8004 = IsPhraseDifferentThanPlayerInput(sECPhrase_LinkTogetherWithAll, NELEMS(sECPhrase_LinkTogetherWithAll));
+}
+
+static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = {
+ {
+ .type = EASY_CHAT_TYPE_PROFILE,
+ .numColumns = 2,
+ .numRows = 2,
+ .frameId = 0,
+ .titleText = gUnknown_8418A2B,
+ .instructionsText1 = gUnknown_84186D1,
+ .instructionsText2 = gUnknown_84186EF,
+ .confirmText1 = gUnknown_841880E,
+ .confirmText2 = gUnknown_8418902
+ }, {
+ .type = EASY_CHAT_TYPE_BATTLE_START,
+ .numColumns = 2,
+ .numRows = 3,
+ .frameId = 1,
+ .titleText = gUnknown_8418A33,
+ .instructionsText1 = gUnknown_8418706,
+ .instructionsText2 = gUnknown_8418725,
+ .confirmText1 = gUnknown_841881B,
+ .confirmText2 = gUnknown_8418902
+ }, {
+ .type = EASY_CHAT_TYPE_BATTLE_WON,
+ .numColumns = 2,
+ .numRows = 3,
+ .frameId = 1,
+ .titleText = gUnknown_8418A4A,
+ .instructionsText1 = gUnknown_8418706,
+ .instructionsText2 = gUnknown_8418725,
+ .confirmText1 = gUnknown_841883E,
+ .confirmText2 = gUnknown_8418902
+ }, {
+ .type = EASY_CHAT_TYPE_BATTLE_LOST,
+ .numColumns = 2,
+ .numRows = 3,
+ .frameId = 1,
+ .titleText = gUnknown_8418A61,
+ .instructionsText1 = gUnknown_8418706,
+ .instructionsText2 = gUnknown_8418725,
+ .confirmText1 = gUnknown_841885F,
+ .confirmText2 = gUnknown_8418902
+ }, {
+ .type = EASY_CHAT_TYPE_MAIL,
+ .numColumns = 2,
+ .numRows = 5,
+ .frameId = 2,
+ .titleText = NULL,
+ .instructionsText1 = gUnknown_8418780,
+ .instructionsText2 = gUnknown_841879E,
+ .confirmText1 = gUnknown_841888C,
+ .confirmText2 = gUnknown_8418902
+ }, {
+ .type = EASY_CHAT_TYPE_MAIL_NO_CONFIRM,
+ .numColumns = 2,
+ .numRows = 2,
+ .frameId = 0,
+ .instructionsText1 = gUnknown_8418780,
+ .instructionsText2 = gUnknown_841879E,
+ }, {
+ .type = EASY_CHAT_TYPE_BARD_SONG,
+ .numColumns = 2,
+ .numRows = 3,
+ .frameId = 1,
+ .titleText = gUnknown_8418A77,
+ .instructionsText1 = gUnknown_84187B2,
+ .instructionsText2 = gUnknown_84187D1,
+ .confirmText1 = gUnknown_84188AC,
+ .confirmText2 = gUnknown_8418902
+ }, {
+ .type = EASY_CHAT_TYPE_INTERVIEW,
+ .numColumns = 2,
+ .numRows = 3,
+ .frameId = 1,
+ .titleText = gUnknown_8418AA1,
+ .instructionsText1 = gUnknown_8418745,
+ .instructionsText2 = gUnknown_8418763,
+ .confirmText1 = gUnknown_8418881,
+ .confirmText2 = gUnknown_8418902
+ }, {
+ .type = EASY_CHAT_TYPE_TRENDY_PHRASE,
+ .numColumns = 2,
+ .numRows = 1,
+ .frameId = 3,
+ .titleText = gUnknown_8418A87,
+ .instructionsText1 = gUnknown_84188B9,
+ .instructionsText2 = gUnknown_84188D6,
+ .confirmText1 = gUnknown_84188F0,
+ .confirmText2 = gUnknown_8418902
+ }, {
+ .type = EASY_CHAT_TYPE_QUESTIONNAIRE,
+ .numColumns = 2,
+ .numRows = 2,
+ .frameId = 0,
+ .titleText = gUnknown_8418AB2,
+ .instructionsText1 = gUnknown_84186D1,
+ .instructionsText2 = gUnknown_84187EE,
+ .confirmText1 = gUnknown_8418881,
+ .confirmText2 = gUnknown_8418902
+ }
+};
+
+static bool8 EasyChat_AllocateResources(u8 type, u16 *words)
+{
+ u8 templateId;
+ int i;
+
+ sEasyChatScreen = malloc(sizeof(*sEasyChatScreen));
+ if (sEasyChatScreen == NULL)
+ return FALSE;
+
+ sEasyChatScreen->type = type;
+ sEasyChatScreen->words = words;
+ sEasyChatScreen->state = 0;
+ sEasyChatScreen->mainCursorColumn = 0;
+ sEasyChatScreen->mainCursorRow = 0;
+ sEasyChatScreen->isAlphaMode = FALSE;
+ templateId = GetEasyChatScreenTemplateId(type);
+
+ sEasyChatScreen->numColumns = sEasyChatScreenTemplates[templateId].numColumns;
+ sEasyChatScreen->numRows = sEasyChatScreenTemplates[templateId].numRows;
+ sEasyChatScreen->numWords = sEasyChatScreen->numColumns * sEasyChatScreen->numRows;
+ sEasyChatScreen->templateId = templateId;
+ if (sEasyChatScreen->numWords > 9)
+ sEasyChatScreen->numWords = 9;
+
+ CpuCopy16(words, sEasyChatScreen->ecWordBuffer, sEasyChatScreen->numWords * sizeof(u16));
+ sEasyChatScreen->selectGroupNumRows = (GetNumDisplayableGroups() - 1) / 2 + 1;
+ return TRUE;
+}
+
+static void EasyChat_FreeResources(void)
+{
+ if (sEasyChatScreen != NULL)
+ Free(sEasyChatScreen);
+}
+
+static u16 EasyChatScreen_HandleJoypad(void)
+{
+ switch (sEasyChatScreen->state)
+ {
+ case 0:
+ return HandleJoypad_SelectField();
+ case 1:
+ return HandleJoypad_SelectFooter();
+ case 2:
+ return HandleJoypad_SelectGroup();
+ case 3:
+ return HandleJoypad_SelectWord();
+ case 4:
+ return Cancel_HandleYesNoMenu();
+ case 5:
+ return DelAll_HandleYesNoMenu();
+ case 6:
+ return Confirm_HandleYesNoMenu();
+ }
+ return 0;
+}
+
+static u16 HandleJoypad_SelectField(void)
+{
+ do
+ {
+ if (JOY_NEW(A_BUTTON))
+ {
+ sEasyChatScreen->state = 2;
+ sEasyChatScreen->selectGroupCursorX = 0;
+ sEasyChatScreen->selectGroupCursorY = 0;
+ sEasyChatScreen->selectGroupRowsAbove = 0;
+ return 9;
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ return Cancel_CreateYesNoMenu();
+ }
+ else if (JOY_NEW(START_BUTTON))
+ {
+ return Confirm_CreateYesNoMenu();
+ }
+ else if (JOY_NEW(DPAD_UP))
+ {
+ sEasyChatScreen->mainCursorRow--;
+ break;
+ }
+ else if (JOY_NEW(DPAD_LEFT))
+ {
+ sEasyChatScreen->mainCursorColumn--;
+ break;
+ }
+ else if (JOY_NEW(DPAD_DOWN))
+ {
+ sEasyChatScreen->mainCursorRow++;
+ break;
+ }
+ else if (JOY_NEW(DPAD_RIGHT))
+ {
+ sEasyChatScreen->mainCursorColumn++;
+ break;
+ }
+
+ return 0;
+ } while (0);
+
+ if (sEasyChatScreen->mainCursorRow < 0)
+ sEasyChatScreen->mainCursorRow = sEasyChatScreenTemplates[sEasyChatScreen->templateId].numRows;
+
+ if (sEasyChatScreen->mainCursorRow > sEasyChatScreenTemplates[sEasyChatScreen->templateId].numRows)
+ sEasyChatScreen->mainCursorRow = 0;
+
+ if (sEasyChatScreen->mainCursorRow == sEasyChatScreenTemplates[sEasyChatScreen->templateId].numRows)
+ {
+ if (sEasyChatScreen->mainCursorColumn > 2)
+ sEasyChatScreen->mainCursorColumn = 2;
+
+ sEasyChatScreen->state = 1;
+ return 3;
+ }
+
+ if (sEasyChatScreen->mainCursorColumn < 0)
+ sEasyChatScreen->mainCursorColumn = sEasyChatScreenTemplates[sEasyChatScreen->templateId].numColumns - 1;
+
+ if (sEasyChatScreen->mainCursorColumn >= sEasyChatScreenTemplates[sEasyChatScreen->templateId].numColumns)
+ sEasyChatScreen->mainCursorColumn = 0;
+
+ if (GetEasyChatScreenFrameId() == 2 && sEasyChatScreen->mainCursorColumn == 1 && sEasyChatScreen->mainCursorRow == 4)
+ sEasyChatScreen->mainCursorColumn = 0;
+
+ return 2;
+}
+
+static u16 HandleJoypad_SelectFooter(void)
+{
+ do
+ {
+ if (JOY_NEW(A_BUTTON))
+ {
+ switch (sEasyChatScreen->mainCursorColumn)
+ {
+ case 0:
+ return DelAll_CreateYesNoMenu();
+ case 1:
+ return Cancel_CreateYesNoMenu();
+ case 2:
+ return Confirm_CreateYesNoMenu();
+ }
+ }
+
+ if (JOY_NEW(B_BUTTON))
+ {
+ return Cancel_CreateYesNoMenu();
+ }
+ else if (JOY_NEW(START_BUTTON))
+ {
+ return Confirm_CreateYesNoMenu();
+ }
+ else if (JOY_NEW(DPAD_UP))
+ {
+ sEasyChatScreen->mainCursorRow--;
+ break;
+ }
+ else if (JOY_NEW(DPAD_LEFT))
+ {
+ sEasyChatScreen->mainCursorColumn--;
+ break;
+ }
+ else if (JOY_NEW(DPAD_DOWN))
+ {
+ sEasyChatScreen->mainCursorRow = 0;
+ break;
+ }
+ else if (JOY_NEW(DPAD_RIGHT))
+ {
+ sEasyChatScreen->mainCursorColumn++;
+ break;
+ }
+
+ return 0;
+ } while (0);
+
+ if (sEasyChatScreen->mainCursorRow == sEasyChatScreenTemplates[sEasyChatScreen->templateId].numRows)
+ {
+ if (sEasyChatScreen->mainCursorColumn < 0)
+ sEasyChatScreen->mainCursorColumn = 2;
+
+ if (sEasyChatScreen->mainCursorColumn >= 3)
+ sEasyChatScreen->mainCursorColumn = 0;
+
+ return 3;
+ }
+
+ if (sEasyChatScreen->mainCursorColumn >= sEasyChatScreenTemplates[sEasyChatScreen->templateId].numColumns)
+ sEasyChatScreen->mainCursorColumn = sEasyChatScreenTemplates[sEasyChatScreen->templateId].numColumns - 1;
+
+ if (GetEasyChatScreenFrameId() == 2 && sEasyChatScreen->mainCursorColumn == 1 && sEasyChatScreen->mainCursorRow == 4)
+ sEasyChatScreen->mainCursorColumn = 0;
+
+ sEasyChatScreen->state = 0;
+ return 2;
+}
+
+static u16 HandleJoypad_SelectGroup(void)
+{
+ if (JOY_NEW(B_BUTTON))
+ return BackOutFromGroupToFieldSelect();
+
+ if (JOY_NEW(A_BUTTON))
+ {
+ if (sEasyChatScreen->selectGroupCursorX != -1)
+ return OpenSelectedGroup();
+
+ switch (sEasyChatScreen->selectGroupCursorY)
+ {
+ case 0:
+ return ToggleGroupAlphaMode();
+ case 1:
+ return DeleteSelectedWord();
+ case 2:
+ return BackOutFromGroupToFieldSelect();
+ }
+ }
+
+ if (JOY_NEW(SELECT_BUTTON))
+ return ToggleGroupAlphaMode();
+
+ if (JOY_REPT(DPAD_UP))
+ return SelectGroupCursorAction(2);
+
+ if (JOY_REPT(DPAD_DOWN))
+ return SelectGroupCursorAction(3);
+
+ if (JOY_REPT(DPAD_LEFT))
+ return SelectGroupCursorAction(1);
+
+ if (JOY_REPT(DPAD_RIGHT))
+ return SelectGroupCursorAction(0);
+
+ return 0;
+}
+
+static u16 HandleJoypad_SelectWord(void)
+{
+ if (JOY_NEW(B_BUTTON))
+ {
+ sEasyChatScreen->state = 2;
+ return 13;
+ }
+
+ if (JOY_NEW(A_BUTTON))
+ return PlaceSelectedWord();
+
+ if (JOY_NEW(START_BUTTON))
+ return SelectWordCursorAction(4);
+
+ if (JOY_NEW(SELECT_BUTTON))
+ return SelectWordCursorAction(5);
+
+ if (JOY_REPT(DPAD_UP))
+ return SelectWordCursorAction(2);
+
+ if (JOY_REPT(DPAD_DOWN))
+ return SelectWordCursorAction(3);
+
+ if (JOY_REPT(DPAD_LEFT))
+ return SelectWordCursorAction(1);
+
+ if (JOY_REPT(DPAD_RIGHT))
+ return SelectWordCursorAction(0);
+
+ return 0;
+}
+
+static u16 Cancel_HandleYesNoMenu(void)
+{
+ u8 var0;
+
+ switch (Menu_ProcessInputNoWrapClearOnChoose())
+ {
+ case MENU_B_PRESSED: // B Button
+ case 1: // No
+ sEasyChatScreen->state = GetStateBackup();
+ return 7;
+ case 0: // Yes
+ gSpecialVar_Result = 0;
+
+ return 23;
+ default:
+ return 0;
+ }
+}
+
+static u16 Confirm_HandleYesNoMenu(void)
+{
+ switch (Menu_ProcessInputNoWrapClearOnChoose())
+ {
+ case MENU_B_PRESSED: // B Button
+ case 1: // No
+ sEasyChatScreen->state = GetStateBackup();
+ return 7;
+ case 0: // Yes
+ gSpecialVar_Result = HasECMessageChanged();
+ CommitECWords();
+ return 23;
+ default:
+ return 0;
+ }
+}
+
+static u16 DelAll_HandleYesNoMenu(void)
+{
+ switch (Menu_ProcessInputNoWrapClearOnChoose())
+ {
+ case MENU_B_PRESSED: // B Button
+ case 1: // No
+ sEasyChatScreen->state = 1;
+ return 7;
+ case 0: // Yes
+ DeleteAllECFields();
+ sEasyChatScreen->state = 1;
+ return 8;
+ default:
+ return 0;
+ }
+}
+
+static u16 Cancel_CreateYesNoMenu(void)
+{
+ sEasyChatScreen->stateBackup = sEasyChatScreen->state;
+ sEasyChatScreen->state = 4;
+ return 5;
+}
+
+static u16 DelAll_CreateYesNoMenu(void)
+{
+ sEasyChatScreen->stateBackup = sEasyChatScreen->state;
+ sEasyChatScreen->state = 5;
+ return 4;
+}
+
+static u16 Confirm_CreateYesNoMenu(void)
+{
+ sEasyChatScreen->stateBackup = sEasyChatScreen->state;
+ if (IsEcWordBufferUninitialized())
+ {
+ sEasyChatScreen->state = 4;
+ return 5;
+ }
+ else
+ {
+ sEasyChatScreen->state = 6;
+ return 6;
+ }
+}
+
+static u8 GetStateBackup(void)
+{
+ return sEasyChatScreen->stateBackup;
+}
+
+static int OpenSelectedGroup(void)
+{
+ u16 numDisplayedWords;
+
+ if (!sEasyChatScreen->isAlphaMode)
+ {
+ u8 groupId = GetSelectedGroupByIndex(GetSelectedGroupIndex());
+ GetUnlockedECWords(FALSE, groupId);
+ }
+ else
+ {
+ GetUnlockedECWords(TRUE, GetSelectedLetter());
+ }
+
+ numDisplayedWords = GetNumDisplayedWords();
+ if (numDisplayedWords == 0)
+ return 0;
+
+ sEasyChatScreen->selectWordNumRows = (numDisplayedWords - 1) / 2;
+ sEasyChatScreen->selectWordRowsAbove = 0;
+ sEasyChatScreen->selectWordCursorX = 0;
+ sEasyChatScreen->selectWordCursorY = 0;
+ sEasyChatScreen->state = 3;
+ return 11;
+}
+
+static int BackOutFromGroupToFieldSelect(void)
+{
+ sEasyChatScreen->state = 0;
+ return 10;
+}
+
+static int ToggleGroupAlphaMode(void)
+{
+ sEasyChatScreen->selectGroupCursorX = 0;
+ sEasyChatScreen->selectGroupCursorY = 0;
+ sEasyChatScreen->selectGroupRowsAbove = 0;
+ if (!sEasyChatScreen->isAlphaMode)
+ sEasyChatScreen->isAlphaMode = TRUE;
+ else
+ sEasyChatScreen->isAlphaMode = FALSE;
+
+ return 22;
+}
+
+static int DeleteSelectedWord(void)
+{
+ SetEasyChatWordToField(0xFFFF);
+ return 1;
+}
+
+static int PlaceSelectedWord(void)
+{
+ u16 easyChatWord = GetDisplayedWordByIndex(GetSelectWordCursorPos());
+ SetEasyChatWordToField(easyChatWord);
+ sEasyChatScreen->state = 0;
+ return 12;
+}
+
+static void CommitECWords(void)
+{
+ u16 i;
+ for (i = 0; i < sEasyChatScreen->numWords; i++)
+ sEasyChatScreen->words[i] = sEasyChatScreen->ecWordBuffer[i];
+}
+
+static void DeleteAllECFields(void)
+{
+ u16 i;
+ for (i = 0; i < sEasyChatScreen->numWords; i++)
+ sEasyChatScreen->ecWordBuffer[i] = 0xFFFF;
+}
+
+static void SetEasyChatWordToField(u16 easyChatWord)
+{
+ u16 index = GetSelectedFieldIndex();
+ sEasyChatScreen->ecWordBuffer[index] = easyChatWord;
+}
+
+static bool8 HasECMessageChanged(void)
+{
+ u16 i;
+ for (i = 0; i < sEasyChatScreen->numWords; i++)
+ {
+ if (sEasyChatScreen->ecWordBuffer[i] != sEasyChatScreen->words[i])
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static u16 SelectGroupCursorAction(u32 action)
+{
+ if (sEasyChatScreen->selectGroupCursorX != -1)
+ {
+ if (!sEasyChatScreen->isAlphaMode)
+ return UpdateSelectGroupCursorPos_OutsideBlueBox_GroupMode(action);
+ else
+ return UpdateSelectGroupCursorPos_OutsideBlueBox_AlphaMode(action);
+ }
+ else
+ {
+ return UpdateSelectGroupCursorPos_InsideBlueBox(action);
+ }
+}
+
+static int UpdateSelectGroupCursorPos_OutsideBlueBox_GroupMode(u32 arg0)
+{
+ switch (arg0)
+ {
+ case 2:
+ if (sEasyChatScreen->selectGroupCursorY != -sEasyChatScreen->selectGroupRowsAbove)
+ {
+ if (sEasyChatScreen->selectGroupCursorY)
+ {
+ sEasyChatScreen->selectGroupCursorY--;
+ return 14;
+ }
+ else
+ {
+ sEasyChatScreen->selectGroupRowsAbove--;
+ return 16;
+ }
+ }
+ break;
+ case 3:
+ if (sEasyChatScreen->selectGroupCursorY + sEasyChatScreen->selectGroupRowsAbove < sEasyChatScreen->selectGroupNumRows - 1)
+ {
+ int var0;
+ if (sEasyChatScreen->selectGroupCursorY < 3)
+ {
+ sEasyChatScreen->selectGroupCursorY++;
+ var0 = 14;
+ }
+ else
+ {
+ sEasyChatScreen->selectGroupRowsAbove++;
+ var0 = 15;
+ }
+
+ MoveGroupCursorXToMaxCol();
+ return var0;
+ }
+ break;
+ case 1:
+ if (sEasyChatScreen->selectGroupCursorX)
+ sEasyChatScreen->selectGroupCursorX--;
+ else
+ GroupCursorMoveToBlueBox();
+
+ return 14;
+ case 0:
+ if (sEasyChatScreen->selectGroupCursorX < 1)
+ {
+ sEasyChatScreen->selectGroupCursorX++;
+ if (GroupSelectCursorXPosTooFarRight())
+ GroupCursorMoveToBlueBox();
+ }
+ else
+ {
+ GroupCursorMoveToBlueBox();
+ }
+ return 14;
+ }
+
+ return 0;
+}
+
+static int UpdateSelectGroupCursorPos_OutsideBlueBox_AlphaMode(u32 arg0)
+{
+ switch (arg0)
+ {
+ case 2:
+ if (sEasyChatScreen->selectGroupCursorY > 0)
+ sEasyChatScreen->selectGroupCursorY--;
+ else
+ sEasyChatScreen->selectGroupCursorY = 3;
+
+ MoveGroupCursorXToMaxCol();
+ return 14;
+ case 3:
+ if (sEasyChatScreen->selectGroupCursorY < 3)
+ sEasyChatScreen->selectGroupCursorY++;
+ else
+ sEasyChatScreen->selectGroupCursorY = 0;
+
+ MoveGroupCursorXToMaxCol();
+ return 14;
+ case 0:
+ sEasyChatScreen->selectGroupCursorX++;
+ if (GroupSelectCursorXPosTooFarRight())
+ GroupCursorMoveToBlueBox();
+
+ return 14;
+ case 1:
+ sEasyChatScreen->selectGroupCursorX--;
+ if (sEasyChatScreen->selectGroupCursorX < 0)
+ GroupCursorMoveToBlueBox();
+
+ return 14;
+ }
+
+ return 0;
+}
+
+static int UpdateSelectGroupCursorPos_InsideBlueBox(u32 arg0)
+{
+ switch (arg0)
+ {
+ case 2:
+ if (sEasyChatScreen->selectGroupCursorY)
+ sEasyChatScreen->selectGroupCursorY--;
+ else
+ sEasyChatScreen->selectGroupCursorY = 2;
+
+ return 14;
+ case 3:
+ if (sEasyChatScreen->selectGroupCursorY < 2)
+ sEasyChatScreen->selectGroupCursorY++;
+ else
+ sEasyChatScreen->selectGroupCursorY = 0;
+
+ return 14;
+ case 1:
+ sEasyChatScreen->selectGroupCursorY++;
+ GroupCursorWrapAroundLeft();
+ return 14;
+ case 0:
+ sEasyChatScreen->selectGroupCursorX = 0;
+ sEasyChatScreen->selectGroupCursorY++;
+ return 14;
+ }
+
+ return 0;
+}
+
+static void GroupCursorMoveToBlueBox(void)
+{
+ sEasyChatScreen->selectGroupCursorX = 0xFF;
+ if (sEasyChatScreen->selectGroupCursorY)
+ sEasyChatScreen->selectGroupCursorY--;
+}
+
+static void GroupCursorWrapAroundLeft(void)
+{
+ if (!sEasyChatScreen->isAlphaMode)
+ {
+ sEasyChatScreen->selectGroupCursorX = 1;
+ MoveGroupCursorXToMaxCol();
+ }
+ else
+ {
+ sEasyChatScreen->selectGroupCursorX = GetMaxGroupCursorXinAlphaMode(sEasyChatScreen->selectGroupCursorY);
+ }
+}
+
+static u16 SelectWordCursorAction(u32 arg0)
+{
+ u16 result;
+ switch (arg0)
+ {
+ case 2: // up
+ if (sEasyChatScreen->selectWordCursorY + sEasyChatScreen->selectWordRowsAbove > 0)
+ {
+ if (sEasyChatScreen->selectWordCursorY > 0)
+ {
+ sEasyChatScreen->selectWordCursorY--;
+ result = 17;
+ }
+ else
+ {
+ sEasyChatScreen->selectWordRowsAbove--;
+ result = 18;
+ }
+
+ MoveWordCursorXToMaxCol();
+ return result;
+ }
+ break;
+ case 3: // down
+ if (sEasyChatScreen->selectWordCursorY + sEasyChatScreen->selectWordRowsAbove < sEasyChatScreen->selectWordNumRows)
+ {
+ if (sEasyChatScreen->selectWordCursorY < 3)
+ {
+ sEasyChatScreen->selectWordCursorY++;
+ result = 17;
+ }
+ else
+ {
+ sEasyChatScreen->selectWordRowsAbove++;
+ result = 19;
+ }
+
+ MoveWordCursorXToMaxCol();
+ return result;
+ }
+ break;
+ case 1: // left
+ if (sEasyChatScreen->selectWordCursorX > 0)
+ sEasyChatScreen->selectWordCursorX--;
+ else
+ sEasyChatScreen->selectWordCursorX = 1;
+
+ MoveWordCursorXToMaxCol();
+ return 17;
+ case 0: // right
+ if (sEasyChatScreen->selectWordCursorX < 1)
+ {
+ sEasyChatScreen->selectWordCursorX++;
+ if (WordSelectCursorXPosTooFarRight())
+ sEasyChatScreen->selectWordCursorX = 0;
+ }
+ else
+ {
+ sEasyChatScreen->selectWordCursorX = 0;
+ }
+ return 17;
+ case 4: // pg up
+ if (sEasyChatScreen->selectWordRowsAbove)
+ {
+ if (sEasyChatScreen->selectWordRowsAbove > 3)
+ sEasyChatScreen->selectWordRowsAbove -= 4;
+ else
+ sEasyChatScreen->selectWordRowsAbove = 0;
+
+ return 20;
+ }
+ break;
+ case 5: // pg dn
+ if (sEasyChatScreen->selectWordRowsAbove <= sEasyChatScreen->selectWordNumRows - 4)
+ {
+ sEasyChatScreen->selectWordRowsAbove += 4;
+ if (sEasyChatScreen->selectWordRowsAbove > sEasyChatScreen->selectWordNumRows - 3)
+ sEasyChatScreen->selectWordRowsAbove = sEasyChatScreen->selectWordNumRows + -3u;
+
+ MoveWordCursorXToMaxCol();
+ return 21;
+ }
+ break;
+ }
+
+ return 0;
+}
+
+static u16 GetSelectedFieldIndex(void)
+{
+ return (sEasyChatScreen->mainCursorRow * sEasyChatScreen->numColumns) + sEasyChatScreen->mainCursorColumn;
+}
+
+static u16 GetSelectedGroupIndex(void)
+{
+ return 2 * (sEasyChatScreen->selectGroupCursorY + sEasyChatScreen->selectGroupRowsAbove) + sEasyChatScreen->selectGroupCursorX;
+}
+
+static const u8 sAlphabetLayout[][7] = {
+ { 1, 2, 3, 4, 5, 6},
+ { 7, 8, 9, 10, 11, 12},
+ {13, 14, 15, 16, 17, 18, 19},
+ {20, 21, 22, 23, 24, 25, 26}
+};
+
+static int GetSelectedLetter(void)
+{
+ int col = sEasyChatScreen->selectGroupCursorX < NELEMS(*sAlphabetLayout) ? sEasyChatScreen->selectGroupCursorX : 0;
+ int row = sEasyChatScreen->selectGroupCursorY < NELEMS(sAlphabetLayout) ? sEasyChatScreen->selectGroupCursorY : 0;
+ return sAlphabetLayout[row][col];
+}
+
+static u16 GetSelectWordCursorPos(void)
+{
+ return 2 * (sEasyChatScreen->selectWordCursorY + sEasyChatScreen->selectWordRowsAbove) + sEasyChatScreen->selectWordCursorX;
+}
+
+static u8 GetMaxGroupCursorXinAlphaMode(u8 arg0)
+{
+ switch (arg0)
+ {
+ case 0:
+ default:
+ return 6;
+ case 1:
+ return 5;
+ }
+}
+
+static void MoveGroupCursorXToMaxCol(void)
+{
+ while (GroupSelectCursorXPosTooFarRight())
+ {
+ if (sEasyChatScreen->selectGroupCursorX)
+ sEasyChatScreen->selectGroupCursorX--;
+ else
+ break;
+ }
+}
+
+static void MoveWordCursorXToMaxCol(void)
+{
+ while (WordSelectCursorXPosTooFarRight())
+ {
+ if (sEasyChatScreen->selectWordCursorX)
+ sEasyChatScreen->selectWordCursorX--;
+ else
+ break;
+ }
+}
+
+static bool8 GroupSelectCursorXPosTooFarRight(void)
+{
+ if (!sEasyChatScreen->isAlphaMode)
+ return GetSelectedGroupIndex() >= GetNumDisplayableGroups() ? TRUE : FALSE;
+ else
+ return sEasyChatScreen->selectGroupCursorX > GetMaxGroupCursorXinAlphaMode(sEasyChatScreen->selectGroupCursorY) ? TRUE : FALSE;
+}
+
+static bool8 WordSelectCursorXPosTooFarRight(void)
+{
+ return GetSelectWordCursorPos() >= GetNumDisplayedWords() ? TRUE : FALSE;
+}
+
+u8 GetEasyChatScreenFrameId(void)
+{
+ return sEasyChatScreenTemplates[sEasyChatScreen->templateId].frameId;
+}
+
+const u8 *GetTitleText(void)
+{
+ return sEasyChatScreenTemplates[sEasyChatScreen->templateId].titleText;
+}
+
+u16 *GetEasyChatWordBuffer(void)
+{
+ return sEasyChatScreen->ecWordBuffer;
+}
+
+u8 GetNumRows(void)
+{
+ return sEasyChatScreen->numRows;
+}
+
+u8 GetNumColumns(void)
+{
+ return sEasyChatScreen->numColumns;
+}
+
+u8 GetMainCursorColumn(void)
+{
+ return sEasyChatScreen->mainCursorColumn;
+}
+
+u8 GetMainCursorRow(void)
+{
+ return sEasyChatScreen->mainCursorRow;
+}
+
+void GetEasyChatInstructionsText(const u8 **str1, const u8 **str2)
+{
+ *str1 = sEasyChatScreenTemplates[sEasyChatScreen->templateId].instructionsText1;
+ *str2 = sEasyChatScreenTemplates[sEasyChatScreen->templateId].instructionsText2;
+}
+
+void GetEasyChatConfirmText(const u8 **str1, const u8 **str2)
+{
+ *str1 = sEasyChatScreenTemplates[sEasyChatScreen->templateId].confirmText1;
+ *str2 = sEasyChatScreenTemplates[sEasyChatScreen->templateId].confirmText2;
+}
+
+void GetEasyChatConfirmCancelText(const u8 **str1, const u8 **str2)
+{
+ switch (sEasyChatScreen->type)
+ {
+ case EASY_CHAT_TYPE_MAIL:
+ *str1 = gUnknown_84189EE;
+ *str2 = NULL;
+ break;
+ default:
+ *str1 = gUnknown_84189E0;
+ *str2 = NULL;
+ break;
+ }
+
+}
+
+void GetEasyChatConfirmDeletionText(const u8 **str1, const u8 **str2)
+{
+ *str1 = gUnknown_8418937;
+ *str2 = gUnknown_8418956;
+}
+
+void GetECSelectGroupCursorCoords(u8 *Xp, u8 *Yp)
+{
+ *Xp = sEasyChatScreen->selectGroupCursorX;
+ *Yp = sEasyChatScreen->selectGroupCursorY;
+}
+
+bool8 IsEasyChatAlphaMode(void)
+{
+ return sEasyChatScreen->isAlphaMode;
+}
+
+u8 GetECSelectGroupRowsAbove(void)
+{
+ return sEasyChatScreen->selectGroupRowsAbove;
+}
+
+void GetECSelectWordCursorCoords(s8 *Xp, s8 *Yp)
+{
+ *Xp = sEasyChatScreen->selectWordCursorX;
+ *Yp = sEasyChatScreen->selectWordCursorY;
+}
+
+u8 GetECSelectWordRowsAbove(void)
+{
+ return sEasyChatScreen->selectWordRowsAbove;
+}
+
+u8 GetECSelectWordNumRows(void)
+{
+ return sEasyChatScreen->selectWordNumRows;
+}
+
+u8 unref_sub_80FFE60(void)
+{
+ return 0;
+}
+
+bool32 ShouldDrawECUpArrow(void)
+{
+ switch (sEasyChatScreen->state)
+ {
+ case 2:
+ if (!sEasyChatScreen->isAlphaMode && sEasyChatScreen->selectGroupRowsAbove != 0)
+ return TRUE;
+ break;
+ case 3:
+ if (sEasyChatScreen->selectWordRowsAbove != 0)
+ return TRUE;
+ break;
+ }
+
+ return FALSE;
+}
+
+bool32 ShouldDrawECDownArrow(void)
+{
+ switch (sEasyChatScreen->state)
+ {
+ case 2:
+ if (!sEasyChatScreen->isAlphaMode && sEasyChatScreen->selectGroupRowsAbove + 4 <= sEasyChatScreen->selectGroupNumRows - 1)
+ return TRUE;
+ break;
+ case 3:
+ if (sEasyChatScreen->selectWordRowsAbove + 4 <= sEasyChatScreen->selectWordNumRows)
+ return TRUE;
+ break;
+ }
+
+ return FALSE;
+}
+
+static bool8 IsPhraseDifferentThanPlayerInput(const u16 *phrase, u8 phraseLength)
+{
+ u8 i;
+
+ for (i = 0; i < phraseLength; i++)
+ {
+ if (phrase[i] != sEasyChatScreen->ecWordBuffer[i])
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static u8 GetEasyChatScreenTemplateId(u8 type)
+{
+ u32 i;
+
+ for (i = 0; i < NELEMS(sEasyChatScreenTemplates); i++)
+ {
+ if (sEasyChatScreenTemplates[i].type == type)
+ return i;
+ }
+
+ return 0;
+}
+
+static bool32 IsEcWordBufferUninitialized(void)
+{
+ int i;
+
+ for (i = 0; i < sEasyChatScreen->numWords; i++)
+ {
+ if (sEasyChatScreen->ecWordBuffer[i] != 0xFFFF)
+ return FALSE;
+ }
+
+ return TRUE;
+}
diff --git a/src/easy_chat_3.c b/src/easy_chat_3.c
new file mode 100644
index 000000000..1501762bc
--- /dev/null
+++ b/src/easy_chat_3.c
@@ -0,0 +1,2298 @@
+#include "global.h"
+#include "gflib.h"
+#include "keyboard_text.h"
+#include "decompress.h"
+#include "easy_chat.h"
+#include "graphics.h"
+#include "menu.h"
+#include "new_menu_helpers.h"
+#include "strings.h"
+#include "text_window.h"
+
+struct ECWork
+{
+ u16 state;
+ u16 windowId;
+ u16 id;
+ u8 frameAnimIdx;
+ u8 frameAnimTarget;
+ s8 frameAnimDelta;
+ u8 modeIconState;
+ u8 ecPrintBuffer[0xC1];
+ u8 ecPaddedWordBuffer[0x200];
+ u16 bg2ScrollRow;
+ int tgtBgY;
+ int deltaBgY;
+ struct Sprite * selectDestFieldCursorSprite;
+ struct Sprite * rectCursorSpriteRight;
+ struct Sprite * rectCursorSpriteLeft;
+ struct Sprite * selectWordCursorSprite;
+ struct Sprite * selectGroupHelpSprite;
+ struct Sprite * modeIconsSprite;
+ struct Sprite * upTriangleCursorSprite;
+ struct Sprite * downTriangleCursorSprite;
+ struct Sprite * startPgUpButtonSprite;
+ struct Sprite * selectPgDnButtonSprite;
+ u16 bg1TilemapBuffer[BG_SCREEN_SIZE / 2];
+ u16 bg3TilemapBuffer[BG_SCREEN_SIZE / 2];
+};
+
+struct EasyChatPhraseFrameDimensions
+{
+ u8 left;
+ u8 top;
+ u8 width;
+ u8 height;
+};
+
+static EWRAM_DATA struct ECWork * sEasyChatGraphicsResources = NULL;
+
+static bool8 ECInterfaceCmd_01(void);
+static bool8 ECInterfaceCmd_02(void);
+static bool8 ECInterfaceCmd_03(void);
+static bool8 ECInterfaceCmd_05(void);
+static bool8 ECInterfaceCmd_06(void);
+static bool8 ECInterfaceCmd_04(void);
+static bool8 ECInterfaceCmd_07(void);
+static bool8 ECInterfaceCmd_08(void);
+static bool8 ECInterfaceCmd_09(void);
+static bool8 ECInterfaceCmd_10(void);
+static bool8 ECInterfaceCmd_22(void);
+static bool8 ECInterfaceCmd_14(void);
+static bool8 ECInterfaceCmd_15(void);
+static bool8 ECInterfaceCmd_16(void);
+static bool8 ECInterfaceCmd_11(void);
+static bool8 ECInterfaceCmd_12(void);
+static bool8 ECInterfaceCmd_13(void);
+static bool8 ECInterfaceCmd_17(void);
+static bool8 ECInterfaceCmd_19(void);
+static bool8 ECInterfaceCmd_18(void);
+static bool8 ECInterfaceCmd_21(void);
+static bool8 ECInterfaceCmd_20(void);
+static bool8 InitEasyChatGraphicsWork_Internal(void);
+static void SetGpuRegsForEasyChatInit(void);
+static void LoadEasyChatPals(void);
+static void PrintTitleText(void);
+static void EC_AddTextPrinterParameterized2(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 speed, u8 bg, u8 fg, u8 shadow);
+static void PrintECInstructionsText(void);
+static void PrintECInterfaceTextById(u8 a0);
+static void EC_CreateYesNoMenuWithInitialCursorPos(u8 initialCursorPos);
+static void CreatePhraseFrameWindow(void);
+static void PrintECFields(void);
+static void DrawECFrameInTilemapBuffer(u16 *buffer);
+static void PutWin2TilemapAndCopyToVram(void);
+static void PrintECMenuById(u32 a0);
+static void PrintECGroupOrAlphaMenu(void);
+static void PrintECGroupsMenu(void);
+static void PrintEasyChatKeyboardText(void);
+static void PrintECWordsMenu(void);
+static void UpdateWin2PrintWordsScrollDown(void);
+static void UpdateWin2PrintWordsScrollUp(void);
+static void UpdateWin2PrintWordsScrollPageDown(void);
+static void UpdateWin2PrintWordsScrollPageUp(void);
+static void PrintECRowsWin2(u8 row, u8 remrow);
+static void ClearECRowsWin2(u8 row, u8 remrow);
+static void ClearWin2AndCopyToVram(void);
+static void StartWin2FrameAnim(int a0);
+static bool8 AnimateFrameResize(void);
+static void RedrawFrameByIndex(u8 a0);
+static void RedrawFrameByRect(int left, int top, int width, int height);
+static void InitBg2Scroll(void);
+static void ScheduleBg2VerticalScroll(s16 direction, u8 speed);
+static bool8 AnimateBg2VerticalScroll(void);
+static int GetBg2ScrollRow(void);
+static void SetRegWin0Coords(u8 left, u8 top, u8 right, u8 bottom);
+static void LoadSpriteGfx(void);
+static void CreateSelectDestFieldCursorSprite(void);
+static void SpriteCB_BounceCursor(struct Sprite * sprite);
+static void SetSelectDestFieldCursorSpritePosAndResetAnim(u8 x, u8 y);
+static void FreezeSelectDestFieldCursorSprite(void);
+static void UnfreezeSelectDestFieldCursorSprite(void);
+static void CreateRedRectangularCursorSpritePair(void);
+static void DestroyRedRectangularCursor(void);
+static void EC_MoveCursor(void);
+static void MoveCursor_Group(s8 a0, s8 a1);
+static void MoveCursor_Alpha(s8 a0, s8 a1);
+static void CreateSelectWordCursorSprite(void);
+static void SpriteCB_SelectWordCursorSprite(struct Sprite * sprite);
+static void SetSelectWordCursorSpritePos(void);
+static void SetSelectWordCursorSpritePosExplicit(u8 x, u8 y);
+static void DestroySelectWordCursorSprite(void);
+static void CreateSelectGroupHelpSprite(void);
+static bool8 AnimateSeletGroupModeAndHelpSpriteEnter(void);
+static void StartModeIconHidingAnimation(void);
+static bool8 RunModeIconHidingAnimation(void);
+static void ShrinkModeIconsSprite(void);
+static void ShowModeIconsSprite(void);
+static bool8 ModeIconsSpriteAnimIsEnded(void);
+static void CreateVerticalScrollArrowSprites(void);
+static void UpdateVerticalScrollArrowVisibility(void);
+static void HideVerticalScrollArrowSprites(void);
+static void UpdateVerticalScrollArrowSpriteXPos(int a0);
+static void CreateStartSelectButtonsSprites(void);
+static void UpdateStartSelectButtonSpriteVisibility(void);
+static void HideStartSelectButtonSprites(void);
+static void CreateFooterWindow(void);
+
+static const u16 gUnknown_843F3B8[] = INCBIN_U16("graphics/link_rfu/unk_843F3F8.gbapal");
+static const u16 gUnknown_843F3D8[] = INCBIN_U16("graphics/link_rfu/unk_8E9BD28.gbapal");
+static const u16 sRightTriangleCursor_Tiles[] = INCBIN_U16("graphics/link_rfu/unk_843F3F8.4bpp");
+static const u16 sUpTriangleCursor_Tiles[] = INCBIN_U16("graphics/link_rfu/unk_843F418.4bpp");
+static const u16 sStartSelectButtons_Tiles[] = INCBIN_U16("graphics/link_rfu/unk_843F518.4bpp");
+static const u16 gUnknown_843F618[] = INCBIN_U16("graphics/link_rfu/unk_843F638.gbapal");
+static const u32 gUnknown_843F638[] = INCBIN_U32("graphics/link_rfu/unk_843F638.4bpp.lz");
+static const u16 gUnknown_843F76C[] = INCBIN_U16("graphics/link_rfu/unk_843F76C.gbapal");
+static const u16 gUnknown_843F78C[] = INCBIN_U16("graphics/link_rfu/unk_843F78C.gbapal");
+static const u32 gUnknown_843F7AC[] = INCBIN_U32("graphics/link_rfu/unk_843F7AC.4bpp.lz");
+
+static const u16 gUnknown_843F874[] = {
+ RGB( 0, 0, 0),
+ RGB( 0, 0, 0),
+ RGB( 7, 25, 31),
+ RGB(21, 21, 29)
+};
+
+static const u16 gUnknown_843F87C[] = {
+ RGB( 0, 0, 0),
+ RGB(31, 31, 31),
+ RGB(12, 12, 12),
+ RGB(27, 26, 27),
+ RGB( 8, 17, 9)
+};
+
+static const struct EasyChatPhraseFrameDimensions sPhraseFrameDimensions[] = {
+ {
+ .left = 0x03,
+ .top = 0x04,
+ .width = 0x18,
+ .height = 0x04
+ }, {
+ .left = 0x01,
+ .top = 0x04,
+ .width = 0x1b,
+ .height = 0x04
+ }, {
+ .left = 0x03,
+ .top = 0x00,
+ .width = 0x18,
+ .height = 0x0a
+ }, {
+ .left = 0x06,
+ .top = 0x06,
+ .width = 0x12,
+ .height = 0x04
+ }, {
+ .left = 0x10,
+ .top = 0x04,
+ .width = 0x09,
+ .height = 0x02
+ }, {
+ .left = 0x0e,
+ .top = 0x04,
+ .width = 0x12,
+ .height = 0x04
+ }
+};
+
+static const struct BgTemplate sEasyChatBgTemplates[] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 28,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0,
+ }, {
+ .bg = 1,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 29,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0,
+ }, {
+ .bg = 2,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0x80,
+ }, {
+ .bg = 3,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0,
+ }
+};
+
+static const struct WindowTemplate sEasyChatWindowTemplates[] = {
+ {
+ .bg = 1,
+ .tilemapLeft = 7,
+ .tilemapTop = 0,
+ .width = 16,
+ .height = 2,
+ .paletteNum = 10,
+ .baseBlock = 0x10,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 4,
+ .tilemapTop = 15,
+ .width = 22,
+ .height = 4,
+ .paletteNum = 15,
+ .baseBlock = 0xA,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 0,
+ .width = 28,
+ .height = 32,
+ .paletteNum = 3,
+ .baseBlock = 0,
+ },
+ DUMMY_WIN_TEMPLATE,
+};
+
+static const struct WindowTemplate sEasyChatYesNoWindowTemplate = {
+ .bg = 0,
+ .tilemapLeft = 22,
+ .tilemapTop = 9,
+ .width = 5,
+ .height = 4,
+ .paletteNum = 15,
+ .baseBlock = 0x062
+};
+
+static const u8 gUnknown_843F8D8[] = _("{UNDERSCORE}");
+static const u8 sText_Clear17[] = _("{CLEAR 17}");
+
+static const u8 *const sEasyChatKeyboardText[] = {
+ gUnknown_847A8D8,
+ gUnknown_847A8FA,
+ gUnknown_847A913,
+ gUnknown_847A934
+};
+
+static const struct SpriteSheet sEasyChatSpriteSheets[] = {
+ {sRightTriangleCursor_Tiles, 0x0020, 0},
+ {sUpTriangleCursor_Tiles, 0x0100, 2},
+ {sStartSelectButtons_Tiles, 0x0100, 3},
+ {}
+};
+
+static const struct SpritePalette sEasyChatSpritePalettes[] = {
+ {gUnknown_843F3B8, 0},
+ {gUnknown_843F3D8, 1},
+ {gUnknown_8E99F24, 2},
+ {gUnknown_843F618, 3},
+ {}
+};
+
+static const struct CompressedSpriteSheet sEasyChatCompressedSpriteSheets[] = {
+ {gUnknown_843F638, 0x0800, 5},
+ {gEasyChatRedRectangularCursor_Tiles, 0x1000, 1},
+ {gEasyChatSelectGroupHelp_Tiles, 0x0800, 6},
+ {gEasyChatModeIcons_Tiles, 0x1000, 4}
+};
+
+static const u8 sECDisplay_AlphaModeXCoords[] = {
+ 0,
+ 12,
+ 24,
+ 56,
+ 68,
+ 80,
+ 92
+};
+
+static const struct OamData sOamData_RightTriangleCursor = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .mosaic = FALSE,
+ .shape = SPRITE_SHAPE(8x8),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(8x8),
+ .tileNum = 0x000,
+ .priority = 3,
+ .paletteNum = 0
+};
+
+static const struct SpriteTemplate sSpriteTemplate_RightTriangleCursor = {
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &sOamData_RightTriangleCursor,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_BounceCursor
+};
+
+static const struct OamData sOamData_RedRectangularCursor = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .mosaic = FALSE,
+ .shape = SPRITE_SHAPE(64x32),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(64x32),
+ .tileNum = 0x000,
+ .priority = 1,
+ .paletteNum = 0
+};
+
+static const union AnimCmd sAnimCmd_RectCursor_Wide[] = {
+ ANIMCMD_FRAME(0x00, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sAnimCmd_RectCursor_Norm[] = {
+ ANIMCMD_FRAME(0x20, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sAnimCmd_RectCursor_NormTaller[] = {
+ ANIMCMD_FRAME(0x40, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sAnimCmd_RectCursor_Narrow[] = {
+ ANIMCMD_FRAME(0x60, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sAnimTable_RedRectangularCursor[] = {
+ sAnimCmd_RectCursor_Wide,
+ sAnimCmd_RectCursor_Norm,
+ sAnimCmd_RectCursor_NormTaller,
+ sAnimCmd_RectCursor_Narrow
+};
+
+static const struct SpriteTemplate sSpriteTemplate_RedRectangularCursor = {
+ .tileTag = 1,
+ .paletteTag = 1,
+ .oam = &sOamData_RedRectangularCursor,
+ .anims = sAnimTable_RedRectangularCursor,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_BounceCursor
+};
+
+static const struct OamData sOamData_EasyChatModeIcons = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .mosaic = FALSE,
+ .shape = SPRITE_SHAPE(64x32),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(64x32),
+ .tileNum = 0x000,
+ .priority = 1,
+ .paletteNum = 0
+};
+
+static const union AnimCmd sAnim_EasyChatModeIcon_Hidden[] = {
+ ANIMCMD_FRAME(0x60, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sAnim_EasyChatModeIcon_ToGroupMode[] = {
+ ANIMCMD_FRAME(0x40, 4),
+ ANIMCMD_FRAME(0x20, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sAnim_EasyChatModeIcon_ToAlphaMode[] = {
+ ANIMCMD_FRAME(0x40, 4),
+ ANIMCMD_FRAME(0x00, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sAnim_EasyChatModeIcon_ToHidden[] = {
+ ANIMCMD_FRAME(0x40, 4),
+ ANIMCMD_FRAME(0x60, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sAnim_EasyChatModeIcon_HoldSmall[] = {
+ ANIMCMD_FRAME(0x40, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sAnimTable_EasyChatModeIcons[] = {
+ sAnim_EasyChatModeIcon_Hidden,
+ sAnim_EasyChatModeIcon_ToGroupMode,
+ sAnim_EasyChatModeIcon_ToAlphaMode,
+ sAnim_EasyChatModeIcon_ToHidden,
+ sAnim_EasyChatModeIcon_HoldSmall
+};
+
+static const struct SpriteTemplate sSpriteTemplate_EasyChatModeIcons = {
+ .tileTag = 4,
+ .paletteTag = 2,
+ .oam = &sOamData_EasyChatModeIcons,
+ .anims = sAnimTable_EasyChatModeIcons,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct OamData sOamData_SelectGroupHelp = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x64),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(64x64),
+ .tileNum = 0x000,
+ .priority = 3,
+ .paletteNum = 0
+};
+
+static const struct SpriteTemplate sSpriteTemplate_SelectGroupHelp = {
+ .tileTag = 6,
+ .paletteTag = 2,
+ .oam = &sOamData_SelectGroupHelp,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct OamData gUnknown_843FA58 = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x8),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(32x8),
+ .tileNum = 0x000,
+ .priority = 1,
+ .paletteNum = 0
+};
+
+static const struct OamData sOamData_UpTriangleCursor = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x16),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(16x16),
+ .tileNum = 0x000,
+ .priority = 1,
+ .paletteNum = 0
+};
+
+static const union AnimCmd gUnknown_843FA68[] = {
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_843FA70[] = {
+ ANIMCMD_FRAME(4, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gUnknown_843FA78[] = {
+ gUnknown_843FA68,
+ gUnknown_843FA70,
+};
+
+static const struct SpriteTemplate sSpriteTemplate_StartSelectButtons = {
+ .tileTag = 3,
+ .paletteTag = 2,
+ .oam = &gUnknown_843FA58,
+ .anims = gUnknown_843FA78,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct SpriteTemplate sSpriteTemplate_UpTriangleCursor = {
+ .tileTag = 2,
+ .paletteTag = 2,
+ .oam = &sOamData_UpTriangleCursor,
+ .anims = gUnknown_843FA78,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+bool8 InitEasyChatGraphicsWork(void)
+{
+ if (!InitEasyChatGraphicsWork_Internal())
+ return FALSE;
+ else
+ return TRUE;
+}
+
+bool8 LoadEasyChatGraphics(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sEasyChatBgTemplates, NELEMS(sEasyChatBgTemplates));
+ SetBgTilemapBuffer(3, sEasyChatGraphicsResources->bg3TilemapBuffer);
+ SetBgTilemapBuffer(1, sEasyChatGraphicsResources->bg1TilemapBuffer);
+ InitWindows(sEasyChatWindowTemplates);
+ DeactivateAllTextPrinters();
+ LoadEasyChatPals();
+ SetGpuRegsForEasyChatInit();
+ CpuFastFill(0, (void *)VRAM + 0x1000000, 0x400);
+ break;
+ case 1:
+ DecompressAndLoadBgGfxUsingHeap(3, gEasyChatWindow_Gfx, 0, 0, 0);
+ CopyToBgTilemapBuffer(3, gEasyChatWindow_Tilemap, 0, 0);
+ CreatePhraseFrameWindow();
+ CreateFooterWindow();
+ CopyBgTilemapBufferToVram(3);
+ break;
+ case 2:
+ DrawECFrameInTilemapBuffer(sEasyChatGraphicsResources->bg1TilemapBuffer);
+ DecompressAndLoadBgGfxUsingHeap(1, gUnknown_843F7AC, 0, 0, 0);
+ CopyBgTilemapBufferToVram(1);
+ break;
+ case 3:
+ PrintTitleText();
+ PrintECInstructionsText();
+ PrintECFields();
+ PutWin2TilemapAndCopyToVram();
+ break;
+ case 4:
+ LoadSpriteGfx();
+ CreateSelectDestFieldCursorSprite();
+ break;
+ case 5:
+ if (IsDma3ManagerBusyWithBgCopy())
+ {
+ return TRUE;
+ }
+ else
+ {
+ SetRegWin0Coords(0, 0, 0, 0);
+ SetGpuReg(REG_OFFSET_WININ, WIN_RANGE(0, 63));
+ SetGpuReg(REG_OFFSET_WINOUT, WIN_RANGE(0, 59));
+ ShowBg(3);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(0);
+ CreateVerticalScrollArrowSprites();
+ CreateStartSelectButtonsSprites();
+ }
+ break;
+ default:
+ return FALSE;
+ }
+
+ sEasyChatGraphicsResources->state++;
+ return TRUE;
+}
+
+void DestroyEasyChatGraphicsResources(void)
+{
+ if (sEasyChatGraphicsResources)
+ Free(sEasyChatGraphicsResources);
+}
+
+void EasyChatInterfaceCommand_Setup(u16 id)
+{
+ sEasyChatGraphicsResources->id = id;
+ sEasyChatGraphicsResources->state = 0;
+ EasyChatInterfaceCommand_Run();
+}
+
+bool8 EasyChatInterfaceCommand_Run(void)
+{
+ switch (sEasyChatGraphicsResources->id)
+ {
+ case 0: return FALSE;
+ case 1: return ECInterfaceCmd_01();
+ case 2: return ECInterfaceCmd_02();
+ case 3: return ECInterfaceCmd_03();
+ case 4: return ECInterfaceCmd_04();
+ case 5: return ECInterfaceCmd_05();
+ case 6: return ECInterfaceCmd_06();
+ case 7: return ECInterfaceCmd_07();
+ case 8: return ECInterfaceCmd_08();
+ case 9: return ECInterfaceCmd_09();
+ case 10: return ECInterfaceCmd_10();
+ case 11: return ECInterfaceCmd_11();
+ case 12: return ECInterfaceCmd_12();
+ case 13: return ECInterfaceCmd_13();
+ case 14: return ECInterfaceCmd_14();
+ case 15: return ECInterfaceCmd_15();
+ case 16: return ECInterfaceCmd_16();
+ case 17: return ECInterfaceCmd_17();
+ case 18: return ECInterfaceCmd_18();
+ case 19: return ECInterfaceCmd_19();
+ case 20: return ECInterfaceCmd_20();
+ case 21: return ECInterfaceCmd_21();
+ case 22: return ECInterfaceCmd_22();
+ default: return FALSE;
+ }
+}
+
+static bool8 ECInterfaceCmd_01(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ PrintECFields();
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 1:
+ return IsDma3ManagerBusyWithBgCopy();
+ }
+
+ return TRUE;
+}
+
+static bool8 ECInterfaceCmd_02(void)
+{
+ u8 i;
+ u16 *ecWordBuffer;
+ u16 *ecWord;
+ u8 frameId;
+ u8 cursorColumn, cursorRow, numColumns;
+ s16 var1;
+ int stringWidth;
+ int trueStringWidth;
+ int var2;
+ u8 str[64];
+
+ ecWordBuffer = GetEasyChatWordBuffer();
+ frameId = GetEasyChatScreenFrameId();
+ cursorColumn = GetMainCursorColumn();
+ cursorRow = GetMainCursorRow();
+ numColumns = GetNumColumns();
+ ecWord = &ecWordBuffer[cursorRow * numColumns];
+ var1 = 8 * sPhraseFrameDimensions[frameId].left + 13;
+ for (i = 0; i < cursorColumn; i++)
+ {
+ if (*ecWord == 0xFFFF)
+ {
+ stringWidth = GetStringWidth(1, gUnknown_843F8D8, 0) * 7;
+ }
+ else
+ {
+ CopyEasyChatWord(str, *ecWord);
+ stringWidth = GetStringWidth(1, str, 0);
+ }
+
+ trueStringWidth = stringWidth + 17;
+ var1 += trueStringWidth;
+ ecWord++;
+ }
+
+ var2 = 8 * (sPhraseFrameDimensions[frameId].top + cursorRow * 2 + 1) + 1;
+ SetSelectDestFieldCursorSpritePosAndResetAnim(var1, var2);
+ return FALSE;
+}
+
+static bool8 ECInterfaceCmd_03(void)
+{
+ u8 xOffset;
+ switch (GetMainCursorColumn())
+ {
+ case 0:
+ xOffset = 28;
+ break;
+ case 1:
+ xOffset = 115;
+ break;
+ case 2:
+ xOffset = 191;
+ break;
+ default:
+ return FALSE;
+ }
+ SetSelectDestFieldCursorSpritePosAndResetAnim(xOffset, 97);
+ return FALSE;
+}
+
+static bool8 ECInterfaceCmd_05(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ FreezeSelectDestFieldCursorSprite();
+ PrintECInterfaceTextById(2);
+ EC_CreateYesNoMenuWithInitialCursorPos(1);
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 1:
+ return IsDma3ManagerBusyWithBgCopy();
+ }
+
+ return TRUE;
+}
+
+static bool8 ECInterfaceCmd_06(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ FreezeSelectDestFieldCursorSprite();
+ PrintECInterfaceTextById(3);
+ EC_CreateYesNoMenuWithInitialCursorPos(0);
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 1:
+ return IsDma3ManagerBusyWithBgCopy();
+ }
+
+ return TRUE;
+}
+
+static bool8 ECInterfaceCmd_04(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ FreezeSelectDestFieldCursorSprite();
+ PrintECInterfaceTextById(1);
+ EC_CreateYesNoMenuWithInitialCursorPos(1);
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 1:
+ return IsDma3ManagerBusyWithBgCopy();
+ }
+
+ return TRUE;
+}
+
+static bool8 ECInterfaceCmd_07(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ UnfreezeSelectDestFieldCursorSprite();
+ PrintECInterfaceTextById(0);
+ ShowBg(0);
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 1:
+ return IsDma3ManagerBusyWithBgCopy();
+ }
+
+ return TRUE;
+}
+
+static bool8 ECInterfaceCmd_08(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ UnfreezeSelectDestFieldCursorSprite();
+ PrintECInterfaceTextById(0);
+ PrintECFields();
+ sEasyChatGraphicsResources->state++;
+ // Fall through
+ case 1:
+ return IsDma3ManagerBusyWithBgCopy();
+ }
+
+ return TRUE;
+}
+
+static bool8 ECInterfaceCmd_09(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ FreezeSelectDestFieldCursorSprite();
+ HideBg(0);
+ SetRegWin0Coords(0, 0, 0, 0);
+ PrintECGroupOrAlphaMenu();
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ StartWin2FrameAnim(0);
+ sEasyChatGraphicsResources->state++;
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy() && !AnimateFrameResize())
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ CreateSelectGroupHelpSprite();
+ sEasyChatGraphicsResources->state++;
+ }
+ break;
+ case 4:
+ if (!AnimateSeletGroupModeAndHelpSpriteEnter())
+ {
+ CreateRedRectangularCursorSpritePair();
+ UpdateVerticalScrollArrowSpriteXPos(0);
+ UpdateVerticalScrollArrowVisibility();
+ sEasyChatGraphicsResources->state++;
+ return FALSE;
+ }
+ break;
+ default:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool8 ECInterfaceCmd_10(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ DestroyRedRectangularCursor();
+ StartModeIconHidingAnimation();
+ HideVerticalScrollArrowSprites();
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 1:
+ if (RunModeIconHidingAnimation() == TRUE)
+ break;
+
+ StartWin2FrameAnim(1);
+ sEasyChatGraphicsResources->state++;
+ // Fall through
+ case 2:
+ if (!AnimateFrameResize())
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ UnfreezeSelectDestFieldCursorSprite();
+ ShowBg(0);
+ sEasyChatGraphicsResources->state++;
+ }
+ break;
+ case 4:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool8 ECInterfaceCmd_22(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ DestroyRedRectangularCursor();
+ HideVerticalScrollArrowSprites();
+ ShrinkModeIconsSprite();
+ StartWin2FrameAnim(5);
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 1:
+ if (!AnimateFrameResize() && !ModeIconsSpriteAnimIsEnded())
+ {
+ PrintECGroupOrAlphaMenu();
+ sEasyChatGraphicsResources->state++;
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ StartWin2FrameAnim(6);
+ ShowModeIconsSprite();
+ sEasyChatGraphicsResources->state++;
+ }
+ break;
+ case 3:
+ if (!AnimateFrameResize() && !ModeIconsSpriteAnimIsEnded())
+ {
+ UpdateVerticalScrollArrowVisibility();
+ CreateRedRectangularCursorSpritePair();
+ sEasyChatGraphicsResources->state++;
+ return FALSE;
+ }
+ break;
+ case 4:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool8 ECInterfaceCmd_14(void)
+{
+ EC_MoveCursor();
+ return FALSE;
+}
+
+static bool8 ECInterfaceCmd_15(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ ScheduleBg2VerticalScroll(1, 2);
+ sEasyChatGraphicsResources->state++;
+ // Fall through
+ case 1:
+ if (!AnimateBg2VerticalScroll())
+ {
+ EC_MoveCursor();
+ UpdateVerticalScrollArrowVisibility();
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool8 ECInterfaceCmd_16(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ ScheduleBg2VerticalScroll(-1, 2);
+ sEasyChatGraphicsResources->state++;
+ // Fall through
+ case 1:
+ if (!AnimateBg2VerticalScroll())
+ {
+ UpdateVerticalScrollArrowVisibility();
+ sEasyChatGraphicsResources->state++;
+ return FALSE;
+ }
+ break;
+ case 2:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool8 ECInterfaceCmd_11(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ DestroyRedRectangularCursor();
+ StartModeIconHidingAnimation();
+ HideVerticalScrollArrowSprites();
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 1:
+ if (!RunModeIconHidingAnimation())
+ {
+ ClearWin2AndCopyToVram();
+ sEasyChatGraphicsResources->state++;
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ StartWin2FrameAnim(2);
+ sEasyChatGraphicsResources->state++;
+ }
+ break;
+ case 3:
+ if (!AnimateFrameResize())
+ {
+ PrintECMenuById(2);
+ sEasyChatGraphicsResources->state++;
+ }
+ break;
+ case 4:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ CreateSelectWordCursorSprite();
+ UpdateVerticalScrollArrowSpriteXPos(1);
+ UpdateVerticalScrollArrowVisibility();
+ UpdateStartSelectButtonSpriteVisibility();
+ sEasyChatGraphicsResources->state++;
+ return FALSE;
+ }
+ break;
+ case 5:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool8 ECInterfaceCmd_12(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ PrintECFields();
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 1:
+ DestroySelectWordCursorSprite();
+ HideVerticalScrollArrowSprites();
+ HideStartSelectButtonSprites();
+ ClearWin2AndCopyToVram();
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ StartWin2FrameAnim(3);
+ sEasyChatGraphicsResources->state++;
+ }
+ break;
+ case 3:
+ if (!AnimateFrameResize())
+ {
+ ShowBg(0);
+ sEasyChatGraphicsResources->state++;
+ }
+ break;
+ case 4:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ UnfreezeSelectDestFieldCursorSprite();
+ sEasyChatGraphicsResources->state++;
+ return FALSE;
+ }
+ break;
+ case 5:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool8 ECInterfaceCmd_13(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ DestroySelectWordCursorSprite();
+ HideVerticalScrollArrowSprites();
+ HideStartSelectButtonSprites();
+ ClearWin2AndCopyToVram();
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ StartWin2FrameAnim(4);
+ sEasyChatGraphicsResources->state++;
+ }
+ break;
+ case 2:
+ if (!AnimateFrameResize())
+ {
+ PrintECGroupOrAlphaMenu();
+ sEasyChatGraphicsResources->state++;
+ }
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ CreateSelectGroupHelpSprite();
+ sEasyChatGraphicsResources->state++;
+ }
+ break;
+ case 4:
+ if (!AnimateSeletGroupModeAndHelpSpriteEnter())
+ {
+ CreateRedRectangularCursorSpritePair();
+ UpdateVerticalScrollArrowSpriteXPos(0);
+ UpdateVerticalScrollArrowVisibility();
+ sEasyChatGraphicsResources->state++;
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool8 ECInterfaceCmd_17(void)
+{
+ SetSelectWordCursorSpritePos();
+ return FALSE;
+}
+
+static bool8 ECInterfaceCmd_19(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ UpdateWin2PrintWordsScrollDown();
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ ScheduleBg2VerticalScroll(1, 2);
+ sEasyChatGraphicsResources->state++;
+ }
+ break;
+ case 2:
+ if (!AnimateBg2VerticalScroll())
+ {
+ SetSelectWordCursorSpritePos();
+ UpdateVerticalScrollArrowVisibility();
+ UpdateStartSelectButtonSpriteVisibility();
+ sEasyChatGraphicsResources->state++;
+ return FALSE;
+ }
+ break;
+ case 3:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool8 ECInterfaceCmd_18(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ UpdateWin2PrintWordsScrollUp();
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ ScheduleBg2VerticalScroll(-1, 2);
+ sEasyChatGraphicsResources->state++;
+ }
+ break;
+ case 2:
+ if (!AnimateBg2VerticalScroll())
+ {
+ UpdateVerticalScrollArrowVisibility();
+ UpdateStartSelectButtonSpriteVisibility();
+ sEasyChatGraphicsResources->state++;
+ return FALSE;
+ }
+ break;
+ case 3:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool8 ECInterfaceCmd_21(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ UpdateWin2PrintWordsScrollPageDown();
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ s16 direction = GetECSelectWordRowsAbove() - GetBg2ScrollRow();
+ ScheduleBg2VerticalScroll(direction, 4);
+ sEasyChatGraphicsResources->state++;
+ }
+ break;
+ case 2:
+ if (!AnimateBg2VerticalScroll())
+ {
+ SetSelectWordCursorSpritePos();
+ UpdateVerticalScrollArrowVisibility();
+ UpdateStartSelectButtonSpriteVisibility();
+ sEasyChatGraphicsResources->state++;
+ return FALSE;
+ }
+ break;
+ case 3:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool8 ECInterfaceCmd_20(void)
+{
+ switch (sEasyChatGraphicsResources->state)
+ {
+ case 0:
+ UpdateWin2PrintWordsScrollPageUp();
+ sEasyChatGraphicsResources->state++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ s16 direction = GetECSelectWordRowsAbove() - GetBg2ScrollRow();
+ ScheduleBg2VerticalScroll(direction, 4);
+ sEasyChatGraphicsResources->state++;
+ }
+ break;
+ case 2:
+ if (!AnimateBg2VerticalScroll())
+ {
+ UpdateVerticalScrollArrowVisibility();
+ UpdateStartSelectButtonSpriteVisibility();
+ sEasyChatGraphicsResources->state++;
+ return FALSE;
+ }
+ break;
+ case 3:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool8 InitEasyChatGraphicsWork_Internal(void)
+{
+ sEasyChatGraphicsResources = Alloc(sizeof(*sEasyChatGraphicsResources));
+ if (sEasyChatGraphicsResources == NULL)
+ return FALSE;
+
+ sEasyChatGraphicsResources->state = 0;
+ sEasyChatGraphicsResources->selectDestFieldCursorSprite = NULL;
+ sEasyChatGraphicsResources->rectCursorSpriteRight = NULL;
+ sEasyChatGraphicsResources->rectCursorSpriteLeft = NULL;
+ sEasyChatGraphicsResources->selectWordCursorSprite = NULL;
+ sEasyChatGraphicsResources->selectGroupHelpSprite = NULL;
+ sEasyChatGraphicsResources->modeIconsSprite = NULL;
+ sEasyChatGraphicsResources->upTriangleCursorSprite = NULL;
+ sEasyChatGraphicsResources->downTriangleCursorSprite = NULL;
+ sEasyChatGraphicsResources->startPgUpButtonSprite = NULL;
+ sEasyChatGraphicsResources->selectPgDnButtonSprite = NULL;
+ return TRUE;
+}
+
+static void SetGpuRegsForEasyChatInit(void)
+{
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON);
+}
+
+static void LoadEasyChatPals(void)
+{
+ ResetPaletteFade();
+ LoadPalette(gEasyChatMode_Pal, 0, 32);
+ LoadPalette(gUnknown_843F76C, 1 * 16, 32);
+ LoadPalette(gUnknown_843F78C, 4 * 16, 32);
+ LoadPalette(gUnknown_843F874, 10 * 16, 8);
+ LoadPalette(gUnknown_843F87C, 11 * 16, 10);
+ LoadPalette(gUnknown_843F87C, 15 * 16, 10);
+ LoadPalette(gUnknown_843F87C, 3 * 16, 10);
+}
+
+static void PrintTitleText(void)
+{
+ int xOffset;
+ const u8 *titleText = GetTitleText();
+ if (titleText == NULL)
+ return;
+
+ xOffset = (128 - GetStringWidth(1, titleText, 0)) / 2u;
+ FillWindowPixelBuffer(0, PIXEL_FILL(0));
+ EC_AddTextPrinterParameterized2(0, 1, titleText, xOffset, 0, TEXT_SPEED_FF, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY);
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 3);
+}
+
+static void EC_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16))
+{
+ if (fontId == 1) y += 2;
+ AddTextPrinterParameterized(windowId, fontId, str, x, y, speed, callback);
+}
+
+static void EC_AddTextPrinterParameterized2(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, u8 bg, u8 fg, u8 shadow)
+{
+ u8 color[3];
+ if (fontId == 1) y += 2;
+ color[0] = bg;
+ color[1] = fg;
+ color[2] = shadow;
+ AddTextPrinterParameterized3(windowId, fontId, x, y, color, speed, str);
+}
+
+static void PrintECInstructionsText(void)
+{
+ FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 17);
+ TextWindow_SetUserSelectedFrame(1, 1, 0xE0);
+ DrawTextBorderOuter(1, 1, 14);
+ PrintECInterfaceTextById(0);
+ PutWindowTilemap(1);
+ CopyBgTilemapBufferToVram(0);
+}
+
+static void PrintECInterfaceTextById(u8 direction)
+{
+ const u8 *text2 = NULL;
+ const u8 *text1 = NULL;
+ switch (direction)
+ {
+ case 0:
+ GetEasyChatInstructionsText(&text1, &text2);
+ break;
+ case 2:
+ GetEasyChatConfirmCancelText(&text1, &text2);
+ break;
+ case 3:
+ GetEasyChatConfirmText(&text1, &text2);
+ break;
+ case 1:
+ GetEasyChatConfirmDeletionText(&text1, &text2);
+ break;
+ }
+
+ FillWindowPixelBuffer(1, PIXEL_FILL(1));
+ if (text1)
+ EC_AddTextPrinterParameterized(1, 1, text1, 0, 0, TEXT_SPEED_FF, NULL);
+
+ if (text2)
+ EC_AddTextPrinterParameterized(1, 1, text2, 0, 16, TEXT_SPEED_FF, NULL);
+
+ CopyWindowToVram(1, 3);
+}
+
+static void EC_CreateYesNoMenuWithInitialCursorPos(u8 initialCursorPos)
+{
+ CreateYesNoMenu(&sEasyChatYesNoWindowTemplate, 1, 0, 2, 0x001, 14, initialCursorPos);
+}
+
+static void CreatePhraseFrameWindow(void)
+{
+ u8 frameId;
+ struct WindowTemplate template;
+
+ frameId = GetEasyChatScreenFrameId();
+ template.bg = 3;
+ template.tilemapLeft = sPhraseFrameDimensions[frameId].left;
+ template.tilemapTop = sPhraseFrameDimensions[frameId].top;
+ template.width = sPhraseFrameDimensions[frameId].width;
+ template.height = sPhraseFrameDimensions[frameId].height;
+ template.paletteNum = 11;
+ template.baseBlock = 0x060;
+ sEasyChatGraphicsResources->windowId = AddWindow(&template);
+ PutWindowTilemap(sEasyChatGraphicsResources->windowId);
+}
+
+static void PrintECFields(void)
+{
+ u16 *ecWord;
+ u8 numColumns, numRows;
+ u8 *str;
+ u8 frameId;
+ int i, j, k;
+
+ ecWord = GetEasyChatWordBuffer();
+ numColumns = GetNumColumns();
+ numRows = GetNumRows();
+ frameId = GetEasyChatScreenFrameId();
+ FillWindowPixelBuffer(sEasyChatGraphicsResources->windowId, PIXEL_FILL(1));
+ for (i = 0; i < numRows; i++)
+ {
+ str = sEasyChatGraphicsResources->ecPrintBuffer;
+ str[0] = EOS;
+ str = StringAppend(str, sText_Clear17);
+ for (j = 0; j < numColumns; j++)
+ {
+ if (*ecWord != 0xFFFF)
+ {
+ str = CopyEasyChatWord(str, *ecWord);
+ ecWord++;
+ }
+ else
+ {
+ str = WriteColorChangeControlCode(str, 0, TEXT_COLOR_RED);
+ ecWord++;
+ for (k = 0; k < 7; k++)
+ {
+ *str++ = CHAR_EXTRA_EMOJI;
+ *str++ = 9;
+ }
+
+ str = WriteColorChangeControlCode(str, 0, TEXT_COLOR_DARK_GREY);
+ }
+
+ str = StringAppend(str, sText_Clear17);
+ if (frameId == 2)
+ {
+ if (j == 0 && i == 4)
+ break;
+ }
+ }
+
+ *str = EOS;
+ EC_AddTextPrinterParameterized(sEasyChatGraphicsResources->windowId, 1, sEasyChatGraphicsResources->ecPrintBuffer, 0, i * 16, TEXT_SPEED_FF, NULL);
+ }
+
+ CopyWindowToVram(sEasyChatGraphicsResources->windowId, 3);
+}
+
+static void DrawECFrameInTilemapBuffer(u16 *tilemap)
+{
+ u8 frameId;
+ int right, bottom;
+ int x, y;
+
+ frameId = GetEasyChatScreenFrameId();
+ CpuFastFill(0, tilemap, BG_SCREEN_SIZE);
+ if (frameId == 2)
+ {
+ right = sPhraseFrameDimensions[frameId].left + sPhraseFrameDimensions[frameId].width;
+ bottom = sPhraseFrameDimensions[frameId].top + sPhraseFrameDimensions[frameId].height;
+ for (y = sPhraseFrameDimensions[frameId].top; y < bottom; y++)
+ {
+ x = sPhraseFrameDimensions[frameId].left - 1;
+ tilemap[y * 32 + x] = 0x1005;
+ x++;
+ for (; x < right; x++)
+ tilemap[y * 32 + x] = 0x1000;
+
+ tilemap[y* 32 + x] = 0x1007;
+ }
+ }
+ else
+ {
+ y = sPhraseFrameDimensions[frameId].top - 1;
+ x = sPhraseFrameDimensions[frameId].left - 1;
+ right = sPhraseFrameDimensions[frameId].left + sPhraseFrameDimensions[frameId].width;
+ bottom = sPhraseFrameDimensions[frameId].top + sPhraseFrameDimensions[frameId].height;
+ tilemap[y * 32 + x] = 0x1001;
+ x++;
+ for (; x < right; x++)
+ tilemap[y * 32 + x] = 0x1002;
+
+ tilemap[y * 32 + x] = 0x1003;
+ y++;
+ for (; y < bottom; y++)
+ {
+ x = sPhraseFrameDimensions[frameId].left - 1;
+ tilemap[y * 32 + x] = 0x1005;
+ x++;
+ for (; x < right; x++)
+ tilemap[y * 32 + x] = 0x1000;
+
+ tilemap[y* 32 + x] = 0x1007;
+ }
+
+ x = sPhraseFrameDimensions[frameId].left - 1;
+ tilemap[y * 32 + x] = 0x1009;
+ x++;
+ for (; x < right; x++)
+ tilemap[y * 32 + x] = 0x100A;
+
+ tilemap[y * 32 + x] = 0x100B;
+ }
+}
+
+static void PutWin2TilemapAndCopyToVram(void)
+{
+ PutWindowTilemap(2);
+ CopyBgTilemapBufferToVram(2);
+}
+
+static void PrintECMenuById(u32 id)
+{
+ InitBg2Scroll();
+ FillWindowPixelBuffer(2, PIXEL_FILL(1));
+ switch (id)
+ {
+ case 0:
+ PrintECGroupsMenu();
+ break;
+ case 1:
+ PrintEasyChatKeyboardText();
+ break;
+ case 2:
+ PrintECWordsMenu();
+ break;
+ }
+
+ CopyWindowToVram(2, 2);
+}
+
+static void PrintECGroupOrAlphaMenu(void)
+{
+ if (!IsEasyChatAlphaMode())
+ PrintECMenuById(0);
+ else
+ PrintECMenuById(1);
+}
+
+static void PrintECGroupsMenu(void)
+{
+ int i;
+ int x, y;
+
+ i = 0;
+ y = 96;
+ while (1)
+ {
+ for (x = 0; x < 2; x++)
+ {
+ u8 groupId = GetSelectedGroupByIndex(i++);
+ if (groupId == EC_NUM_GROUPS)
+ {
+ ScheduleBg2VerticalScroll(GetECSelectGroupRowsAbove(), 0);
+ return;
+ }
+
+ EC_AddTextPrinterParameterized(2, 1, GetEasyChatWordGroupName(groupId), x * 84 + 10, y, TEXT_SPEED_FF, NULL);
+ }
+
+ y += 16;
+ }
+}
+
+static void PrintEasyChatKeyboardText(void)
+{
+ u32 i;
+
+ for (i = 0; i < NELEMS(sEasyChatKeyboardText); i++)
+ EC_AddTextPrinterParameterized(2, 1, sEasyChatKeyboardText[i], 10, 96 + i * 16, TEXT_SPEED_FF, NULL);
+}
+
+static void PrintECWordsMenu(void)
+{
+ PrintECRowsWin2(0, 4);
+}
+
+static void UpdateWin2PrintWordsScrollDown(void)
+{
+ u8 rowsAbove = GetECSelectWordRowsAbove() + 3;
+ ClearECRowsWin2(rowsAbove, 1);
+ PrintECRowsWin2(rowsAbove, 1);
+}
+
+static void UpdateWin2PrintWordsScrollUp(void)
+{
+ u8 rowsAbove = GetECSelectWordRowsAbove();
+ ClearECRowsWin2(rowsAbove, 1);
+ PrintECRowsWin2(rowsAbove, 1);
+}
+
+static void UpdateWin2PrintWordsScrollPageDown(void)
+{
+ u8 row = GetECSelectWordRowsAbove();
+ u8 maxrow = row + 4;
+ u8 numrowsplus1 = GetECSelectWordNumRows() + 1;
+ if (maxrow > numrowsplus1)
+ maxrow = numrowsplus1;
+
+ if (row < maxrow)
+ {
+ u8 remrow = maxrow - row;
+ ClearECRowsWin2(row, remrow);
+ PrintECRowsWin2(row, remrow);
+ }
+}
+
+static void UpdateWin2PrintWordsScrollPageUp(void)
+{
+ u8 row = GetECSelectWordRowsAbove();
+ u8 maxrow = GetBg2ScrollRow();
+ if (row < maxrow)
+ {
+ u8 remrow = maxrow - row;
+ ClearECRowsWin2(row, remrow);
+ PrintECRowsWin2(row, remrow);
+ }
+}
+
+static void PrintECRowsWin2(u8 row, u8 remrow)
+{
+ int i, j;
+ u16 easyChatWord;
+ u8 *str;
+ int y;
+ u8 y_;
+ int ecWordIdx;
+
+ ecWordIdx = row * 2;
+ y = (row * 16 + 96) & 0xFF;
+
+ for (i = 0; i < remrow; i++)
+ {
+ for (j = 0; j < 2; j++)
+ {
+ // FIXME: Dumb trick needed to match
+ y_ = y << 18 >> 18;
+ easyChatWord = GetDisplayedWordByIndex(ecWordIdx++);
+ if (easyChatWord != 0xFFFF)
+ {
+
+ CopyEasyChatWordPadded(sEasyChatGraphicsResources->ecPaddedWordBuffer, easyChatWord, 0);
+
+ EC_AddTextPrinterParameterized(2, 1, sEasyChatGraphicsResources->ecPaddedWordBuffer, (j * 13 + 3) * 8, y_, TEXT_SPEED_FF, NULL);
+ }
+ }
+ y += 16;
+
+ }
+
+ CopyWindowToVram(2, 2);
+}
+
+static void ClearECRowsWin2(u8 row, u8 remrow)
+{
+ int y;
+ int totalHeight;
+ int heightWrappedAround;
+ int heightToBottom;
+
+ y = (row * 16 + 96) & 0xFF;
+ heightToBottom = remrow * 16;
+ totalHeight = y + heightToBottom;
+ if (totalHeight > 255)
+ {
+ heightWrappedAround = totalHeight - 256;
+ heightToBottom = 256 - y;
+ }
+ else
+ {
+ heightWrappedAround = 0;
+ }
+
+ FillWindowPixelRect(2, PIXEL_FILL(1), 0, y, 224, heightToBottom);
+ if (heightWrappedAround)
+ FillWindowPixelRect(2, PIXEL_FILL(1), 0, 0, 224, heightWrappedAround);
+}
+
+static void ClearWin2AndCopyToVram(void)
+{
+ FillWindowPixelBuffer(2, PIXEL_FILL(1));
+ CopyWindowToVram(2, 2);
+}
+
+static void StartWin2FrameAnim(int animNo)
+{
+ switch (animNo)
+ {
+ case 0:
+ sEasyChatGraphicsResources->frameAnimIdx = 0;
+ sEasyChatGraphicsResources->frameAnimTarget = 10;
+ break;
+ case 1:
+ sEasyChatGraphicsResources->frameAnimIdx = 9;
+ sEasyChatGraphicsResources->frameAnimTarget = 0;
+ break;
+ case 2:
+ sEasyChatGraphicsResources->frameAnimIdx = 11;
+ sEasyChatGraphicsResources->frameAnimTarget = 17;
+ break;
+ case 3:
+ sEasyChatGraphicsResources->frameAnimIdx = 17;
+ sEasyChatGraphicsResources->frameAnimTarget = 0;
+ break;
+ case 4:
+ sEasyChatGraphicsResources->frameAnimIdx = 17;
+ sEasyChatGraphicsResources->frameAnimTarget = 10;
+ break;
+ case 5:
+ sEasyChatGraphicsResources->frameAnimIdx = 18;
+ sEasyChatGraphicsResources->frameAnimTarget = 22;
+ break;
+ case 6:
+ sEasyChatGraphicsResources->frameAnimIdx = 22;
+ sEasyChatGraphicsResources->frameAnimTarget = 18;
+ break;
+ }
+
+ sEasyChatGraphicsResources->frameAnimDelta = sEasyChatGraphicsResources->frameAnimIdx < sEasyChatGraphicsResources->frameAnimTarget ? 1 : -1;
+}
+
+static bool8 AnimateFrameResize(void)
+{
+ if (sEasyChatGraphicsResources->frameAnimIdx == sEasyChatGraphicsResources->frameAnimTarget)
+ return FALSE;
+
+ sEasyChatGraphicsResources->frameAnimIdx += sEasyChatGraphicsResources->frameAnimDelta;
+ RedrawFrameByIndex(sEasyChatGraphicsResources->frameAnimIdx);
+ return sEasyChatGraphicsResources->frameAnimIdx != sEasyChatGraphicsResources->frameAnimTarget;
+}
+
+static void RedrawFrameByIndex(u8 direction)
+{
+ FillBgTilemapBufferRect_Palette0(1, 0, 0, 10, 30, 10);
+ switch (direction)
+ {
+ case 0:
+ break;
+ case 1:
+ RedrawFrameByRect(11, 14, 3, 2);
+ break;
+ case 2:
+ RedrawFrameByRect(9, 14, 7, 2);
+ break;
+ case 3:
+ RedrawFrameByRect(7, 14, 11, 2);
+ break;
+ case 4:
+ RedrawFrameByRect(5, 14, 15, 2);
+ break;
+ case 5:
+ RedrawFrameByRect(3, 14, 19, 2);
+ break;
+ case 6:
+ RedrawFrameByRect(1, 14, 23, 2);
+ break;
+ case 7:
+ RedrawFrameByRect(1, 13, 23, 4);
+ break;
+ case 8:
+ RedrawFrameByRect(1, 12, 23, 6);
+ break;
+ case 9:
+ RedrawFrameByRect(1, 11, 23, 8);
+ break;
+ case 10:
+ RedrawFrameByRect(1, 10, 23, 10);
+ break;
+ case 11:
+ RedrawFrameByRect(1, 10, 24, 10);
+ break;
+ case 12:
+ RedrawFrameByRect(1, 10, 25, 10);
+ break;
+ case 13:
+ RedrawFrameByRect(1, 10, 26, 10);
+ break;
+ case 14:
+ RedrawFrameByRect(1, 10, 27, 10);
+ break;
+ case 15:
+ RedrawFrameByRect(1, 10, 28, 10);
+ break;
+ case 16:
+ RedrawFrameByRect(1, 10, 29, 10);
+ break;
+ case 17:
+ RedrawFrameByRect(0, 10, 30, 10);
+ break;
+ case 18:
+ RedrawFrameByRect(1, 10, 23, 10);
+ break;
+ case 19:
+ RedrawFrameByRect(1, 11, 23, 8);
+ break;
+ case 20:
+ RedrawFrameByRect(1, 12, 23, 6);
+ break;
+ case 21:
+ RedrawFrameByRect(1, 13, 23, 4);
+ break;
+ case 22:
+ RedrawFrameByRect(1, 14, 23, 2);
+ break;
+ }
+
+ CopyBgTilemapBufferToVram(1);
+}
+
+static void RedrawFrameByRect(int left, int top, int width, int height)
+{
+ u16 *tilemap;
+ int right;
+ int bottom;
+ int x, y;
+
+ tilemap = sEasyChatGraphicsResources->bg1TilemapBuffer;
+ right = left + width - 1;
+ bottom = top + height - 1;
+ x = left;
+ y = top;
+ tilemap[y * 32 + x] = 0x4001;
+ x++;
+ for (; x < right; x++)
+ tilemap[y * 32 + x] = 0x4002;
+
+ tilemap[y * 32 + x] = 0x4003;
+ y++;
+ for (; y < bottom; y++)
+ {
+ tilemap[y * 32 + left] = 0x4005;
+ x = left + 1;
+ for (; x < right; x++)
+ tilemap[y * 32 + x] = 0x4000;
+
+ tilemap[y * 32 + x] = 0x4007;
+ }
+
+ tilemap[y * 32 + left] = 0x4009;
+ x = left + 1;
+ for (; x < right; x++)
+ tilemap[y * 32 + x] = 0x400A;
+
+ tilemap[y * 32 + x] = 0x400B;
+ SetRegWin0Coords((left + 1) * 8, (top + 1) * 8, (width - 2) * 8, (height - 2) * 8);
+}
+
+static void InitBg2Scroll(void)
+{
+ ChangeBgY(2, 0x800, 0);
+ sEasyChatGraphicsResources->bg2ScrollRow = 0;
+}
+
+static void ScheduleBg2VerticalScroll(s16 direction, u8 speed)
+{
+ int bgY;
+ s16 totalDelta;
+
+ bgY = GetBgY(2);
+ sEasyChatGraphicsResources->bg2ScrollRow += direction;
+ totalDelta = direction * 16;
+ bgY += totalDelta << 8;
+ if (speed)
+ {
+ sEasyChatGraphicsResources->tgtBgY = bgY;
+ sEasyChatGraphicsResources->deltaBgY = speed * 256;
+ if (totalDelta < 0)
+ sEasyChatGraphicsResources->deltaBgY = -sEasyChatGraphicsResources->deltaBgY;
+ }
+ else
+ {
+ ChangeBgY(2, bgY, 0);
+ }
+}
+
+static bool8 AnimateBg2VerticalScroll(void)
+{
+ int bgY;
+
+ bgY = GetBgY(2);
+ if (bgY == sEasyChatGraphicsResources->tgtBgY)
+ {
+ return FALSE;
+ }
+ else
+ {
+ ChangeBgY(2, sEasyChatGraphicsResources->deltaBgY, 1);
+ return TRUE;
+ }
+}
+
+static int GetBg2ScrollRow(void)
+{
+ return sEasyChatGraphicsResources->bg2ScrollRow;
+}
+
+static void SetRegWin0Coords(u8 left, u8 top, u8 width, u8 height)
+{
+ u16 horizontalDimensions = WIN_RANGE(left, left + width);
+ u16 verticalDimensions = WIN_RANGE(top, top + height);
+ SetGpuReg(REG_OFFSET_WIN0H, horizontalDimensions);
+ SetGpuReg(REG_OFFSET_WIN0V, verticalDimensions);
+}
+
+static void LoadSpriteGfx(void)
+{
+ u32 i;
+
+ LoadSpriteSheets(sEasyChatSpriteSheets);
+ LoadSpritePalettes(sEasyChatSpritePalettes);
+ for (i = 0; i < NELEMS(sEasyChatCompressedSpriteSheets); i++)
+ LoadCompressedSpriteSheet(&sEasyChatCompressedSpriteSheets[i]);
+}
+
+static void CreateSelectDestFieldCursorSprite(void)
+{
+ u8 frameId = GetEasyChatScreenFrameId();
+ s16 x = sPhraseFrameDimensions[frameId].left * 8 + 13;
+ s16 y = (sPhraseFrameDimensions[frameId].top + 1) * 8 + 1;
+ u8 spriteId = CreateSprite(&sSpriteTemplate_RightTriangleCursor, x, y, 2);
+ sEasyChatGraphicsResources->selectDestFieldCursorSprite = &gSprites[spriteId];
+ gSprites[spriteId].data[1] = 1;
+}
+
+static void SpriteCB_BounceCursor(struct Sprite * sprite)
+{
+ if (sprite->data[1])
+ {
+ if (++sprite->data[0] > 2)
+ {
+ sprite->data[0] = 0;
+ if (++sprite->pos2.x > 0)
+ sprite->pos2.x = -6;
+ }
+ }
+}
+
+static void SetSelectDestFieldCursorSpritePosAndResetAnim(u8 x, u8 y)
+{
+ sEasyChatGraphicsResources->selectDestFieldCursorSprite->pos1.x = x;
+ sEasyChatGraphicsResources->selectDestFieldCursorSprite->pos1.y = y;
+ sEasyChatGraphicsResources->selectDestFieldCursorSprite->pos2.x = 0;
+ sEasyChatGraphicsResources->selectDestFieldCursorSprite->data[0] = 0;
+}
+
+static void FreezeSelectDestFieldCursorSprite(void)
+{
+ sEasyChatGraphicsResources->selectDestFieldCursorSprite->data[0] = 0;
+ sEasyChatGraphicsResources->selectDestFieldCursorSprite->data[1] = 0;
+ sEasyChatGraphicsResources->selectDestFieldCursorSprite->pos2.x = 0;
+}
+
+static void UnfreezeSelectDestFieldCursorSprite(void)
+{
+ sEasyChatGraphicsResources->selectDestFieldCursorSprite->data[1] = 1;
+}
+
+static void CreateRedRectangularCursorSpritePair(void)
+{
+ u8 spriteId = CreateSprite(&sSpriteTemplate_RedRectangularCursor, 0, 0, 3);
+ sEasyChatGraphicsResources->rectCursorSpriteRight = &gSprites[spriteId];
+ sEasyChatGraphicsResources->rectCursorSpriteRight->pos2.x = 32;
+
+ spriteId = CreateSprite(&sSpriteTemplate_RedRectangularCursor, 0, 0, 3);
+ sEasyChatGraphicsResources->rectCursorSpriteLeft = &gSprites[spriteId];
+ sEasyChatGraphicsResources->rectCursorSpriteLeft->pos2.x = -32;
+
+ sEasyChatGraphicsResources->rectCursorSpriteRight->hFlip = TRUE;
+ EC_MoveCursor();
+}
+
+static void DestroyRedRectangularCursor(void)
+{
+ DestroySprite(sEasyChatGraphicsResources->rectCursorSpriteRight);
+ sEasyChatGraphicsResources->rectCursorSpriteRight = NULL;
+ DestroySprite(sEasyChatGraphicsResources->rectCursorSpriteLeft);
+ sEasyChatGraphicsResources->rectCursorSpriteLeft = NULL;
+}
+
+static void EC_MoveCursor(void)
+{
+ u8 x;
+ u8 y;
+
+ if (sEasyChatGraphicsResources->rectCursorSpriteRight && sEasyChatGraphicsResources->rectCursorSpriteLeft)
+ {
+ GetECSelectGroupCursorCoords(&x, &y);
+ if (!IsEasyChatAlphaMode())
+ MoveCursor_Group(x, y);
+ else
+ MoveCursor_Alpha(x, y);
+ }
+}
+
+static void MoveCursor_Group(s8 x, s8 y)
+{
+ if (x != -1)
+ {
+ StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteRight, 0);
+ sEasyChatGraphicsResources->rectCursorSpriteRight->pos1.x = x * 84 + 58;
+ sEasyChatGraphicsResources->rectCursorSpriteRight->pos1.y = y * 16 + 96;
+
+ StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteLeft, 0);
+ sEasyChatGraphicsResources->rectCursorSpriteLeft->pos1.x = x * 84 + 58;
+ sEasyChatGraphicsResources->rectCursorSpriteLeft->pos1.y = y * 16 + 96;
+ }
+ else
+ {
+ StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteRight, 1);
+ sEasyChatGraphicsResources->rectCursorSpriteRight->pos1.x = 216;
+ sEasyChatGraphicsResources->rectCursorSpriteRight->pos1.y = y * 16 + 112;
+
+ StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteLeft, 1);
+ sEasyChatGraphicsResources->rectCursorSpriteLeft->pos1.x = 216;
+ sEasyChatGraphicsResources->rectCursorSpriteLeft->pos1.y = y * 16 + 112;
+ }
+}
+
+static void MoveCursor_Alpha(s8 cursorX, s8 cursorY)
+{
+ int anim;
+ int x, y;
+
+ if (cursorX != -1)
+ {
+ y = cursorY * 16 + 96;
+ x = 32;
+ if (cursorX == 6 && cursorY == 0)
+ {
+ x = 157;
+ anim = 2;
+ }
+ else
+ {
+ x += sECDisplay_AlphaModeXCoords[cursorX < NELEMS(sECDisplay_AlphaModeXCoords) ? cursorX : 0];
+ anim = 3;
+ }
+
+ StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteRight, anim);
+ sEasyChatGraphicsResources->rectCursorSpriteRight->pos1.x = x;
+ sEasyChatGraphicsResources->rectCursorSpriteRight->pos1.y = y;
+
+ StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteLeft, anim);
+ sEasyChatGraphicsResources->rectCursorSpriteLeft->pos1.x = x;
+ sEasyChatGraphicsResources->rectCursorSpriteLeft->pos1.y = y;
+ }
+ else
+ {
+ StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteRight, 1);
+ sEasyChatGraphicsResources->rectCursorSpriteRight->pos1.x = 216;
+ sEasyChatGraphicsResources->rectCursorSpriteRight->pos1.y = cursorY * 16 + 112;
+
+ StartSpriteAnim(sEasyChatGraphicsResources->rectCursorSpriteLeft, 1);
+ sEasyChatGraphicsResources->rectCursorSpriteLeft->pos1.x = 216;
+ sEasyChatGraphicsResources->rectCursorSpriteLeft->pos1.y = cursorY * 16 + 112;
+ }
+}
+
+static void CreateSelectWordCursorSprite(void)
+{
+ u8 spriteId = CreateSprite(&sSpriteTemplate_RightTriangleCursor, 0, 0, 4);
+ sEasyChatGraphicsResources->selectWordCursorSprite = &gSprites[spriteId];
+ sEasyChatGraphicsResources->selectWordCursorSprite->callback = SpriteCB_SelectWordCursorSprite;
+ sEasyChatGraphicsResources->selectWordCursorSprite->oam.priority = 2;
+ SetSelectWordCursorSpritePos();
+}
+
+static void SpriteCB_SelectWordCursorSprite(struct Sprite * sprite)
+{
+ if (++sprite->data[0] > 2)
+ {
+ sprite->data[0] = 0;
+ if (++sprite->pos2.x > 0)
+ sprite->pos2.x = -6;
+ }
+}
+
+static void SetSelectWordCursorSpritePos(void)
+{
+ s8 cursorX, cursorY;
+ u8 x, y;
+
+ GetECSelectWordCursorCoords(&cursorX, &cursorY);
+ x = cursorX * 13 + 3;
+ y = cursorY * 2 + 11;
+ SetSelectWordCursorSpritePosExplicit(x, y);
+}
+
+static void SetSelectWordCursorSpritePosExplicit(u8 x, u8 y)
+{
+ if (sEasyChatGraphicsResources->selectWordCursorSprite)
+ {
+ sEasyChatGraphicsResources->selectWordCursorSprite->pos1.x = x * 8 + 4;
+ sEasyChatGraphicsResources->selectWordCursorSprite->pos1.y = (y + 1) * 8 + 1;
+ sEasyChatGraphicsResources->selectWordCursorSprite->pos2.x = 0;
+ sEasyChatGraphicsResources->selectWordCursorSprite->data[0] = 0;
+ }
+}
+
+static void DestroySelectWordCursorSprite(void)
+{
+ if (sEasyChatGraphicsResources->selectWordCursorSprite)
+ {
+ DestroySprite(sEasyChatGraphicsResources->selectWordCursorSprite);
+ sEasyChatGraphicsResources->selectWordCursorSprite = NULL;
+ }
+}
+
+static void CreateSelectGroupHelpSprite(void)
+{
+ u8 spriteId = CreateSprite(&sSpriteTemplate_SelectGroupHelp, 208, 128, 6);
+ sEasyChatGraphicsResources->selectGroupHelpSprite = &gSprites[spriteId];
+ sEasyChatGraphicsResources->selectGroupHelpSprite->pos2.x = -64;
+
+ spriteId = CreateSprite(&sSpriteTemplate_EasyChatModeIcons, 208, 80, 5);
+ sEasyChatGraphicsResources->modeIconsSprite = &gSprites[spriteId];
+ sEasyChatGraphicsResources->modeIconState = 0;
+}
+
+static bool8 AnimateSeletGroupModeAndHelpSpriteEnter(void)
+{
+ switch (sEasyChatGraphicsResources->modeIconState)
+ {
+ default:
+ return FALSE;
+ case 0:
+ sEasyChatGraphicsResources->selectGroupHelpSprite->pos2.x += 8;
+ if (sEasyChatGraphicsResources->selectGroupHelpSprite->pos2.x >= 0)
+ {
+ sEasyChatGraphicsResources->selectGroupHelpSprite->pos2.x = 0;
+ if (!IsEasyChatAlphaMode())
+ StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, 1);
+ else
+ StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, 2);
+
+ sEasyChatGraphicsResources->modeIconState++;
+ }
+ break;
+ case 1:
+ if (sEasyChatGraphicsResources->modeIconsSprite->animEnded)
+ {
+ sEasyChatGraphicsResources->modeIconState = 2;
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+static void StartModeIconHidingAnimation(void)
+{
+ sEasyChatGraphicsResources->modeIconState = 0;
+ StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, 3);
+}
+
+static bool8 RunModeIconHidingAnimation(void)
+{
+ switch (sEasyChatGraphicsResources->modeIconState)
+ {
+ default:
+ return FALSE;
+ case 0:
+ if (sEasyChatGraphicsResources->modeIconsSprite->animEnded)
+ sEasyChatGraphicsResources->modeIconState = 1;
+ break;
+ case 1:
+ sEasyChatGraphicsResources->selectGroupHelpSprite->pos2.x -= 8;
+ if (sEasyChatGraphicsResources->selectGroupHelpSprite->pos2.x <= -64)
+ {
+ DestroySprite(sEasyChatGraphicsResources->modeIconsSprite);
+ DestroySprite(sEasyChatGraphicsResources->selectGroupHelpSprite);
+ sEasyChatGraphicsResources->modeIconsSprite = NULL;
+ sEasyChatGraphicsResources->selectGroupHelpSprite = NULL;
+ sEasyChatGraphicsResources->modeIconState++;
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+static void ShrinkModeIconsSprite(void)
+{
+ StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, 4);
+}
+
+static void ShowModeIconsSprite(void)
+{
+ if (!IsEasyChatAlphaMode())
+ StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, 1);
+ else
+ StartSpriteAnim(sEasyChatGraphicsResources->modeIconsSprite, 2);
+}
+
+static bool8 ModeIconsSpriteAnimIsEnded(void)
+{
+ return !sEasyChatGraphicsResources->modeIconsSprite->animEnded;
+}
+
+static void CreateVerticalScrollArrowSprites(void)
+{
+ u8 spriteId = CreateSprite(&sSpriteTemplate_UpTriangleCursor, 96, 80, 0);
+ if (spriteId != MAX_SPRITES)
+ sEasyChatGraphicsResources->upTriangleCursorSprite = &gSprites[spriteId];
+
+ spriteId = CreateSprite(&sSpriteTemplate_UpTriangleCursor, 96, 156, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ sEasyChatGraphicsResources->downTriangleCursorSprite = &gSprites[spriteId];
+ sEasyChatGraphicsResources->downTriangleCursorSprite->vFlip = TRUE;
+ }
+
+ HideVerticalScrollArrowSprites();
+}
+
+static void UpdateVerticalScrollArrowVisibility(void)
+{
+ sEasyChatGraphicsResources->upTriangleCursorSprite->invisible = !ShouldDrawECUpArrow();
+ sEasyChatGraphicsResources->downTriangleCursorSprite->invisible = !ShouldDrawECDownArrow();
+}
+
+static void HideVerticalScrollArrowSprites(void)
+{
+ sEasyChatGraphicsResources->upTriangleCursorSprite->invisible = TRUE;
+ sEasyChatGraphicsResources->downTriangleCursorSprite->invisible = TRUE;
+}
+
+static void UpdateVerticalScrollArrowSpriteXPos(int direction)
+{
+ if (!direction)
+ {
+ // Group select
+ sEasyChatGraphicsResources->upTriangleCursorSprite->pos1.x = 96;
+ sEasyChatGraphicsResources->downTriangleCursorSprite->pos1.x = 96;
+ }
+ else
+ {
+ // Word select
+ sEasyChatGraphicsResources->upTriangleCursorSprite->pos1.x = 120;
+ sEasyChatGraphicsResources->downTriangleCursorSprite->pos1.x = 120;
+ }
+}
+
+static void CreateStartSelectButtonsSprites(void)
+{
+ u8 spriteId = CreateSprite(&sSpriteTemplate_StartSelectButtons, 220, 84, 1);
+ if (spriteId != MAX_SPRITES)
+ sEasyChatGraphicsResources->startPgUpButtonSprite = &gSprites[spriteId];
+
+ spriteId = CreateSprite(&sSpriteTemplate_StartSelectButtons, 220, 156, 1);
+ if (spriteId != MAX_SPRITES)
+ {
+ sEasyChatGraphicsResources->selectPgDnButtonSprite = &gSprites[spriteId];
+ StartSpriteAnim(sEasyChatGraphicsResources->selectPgDnButtonSprite, 1);
+ }
+
+ HideStartSelectButtonSprites();
+}
+
+static void UpdateStartSelectButtonSpriteVisibility(void)
+{
+ sEasyChatGraphicsResources->startPgUpButtonSprite->invisible = !ShouldDrawECUpArrow();
+ sEasyChatGraphicsResources->selectPgDnButtonSprite->invisible = !ShouldDrawECDownArrow();
+}
+
+static void HideStartSelectButtonSprites(void)
+{
+ sEasyChatGraphicsResources->startPgUpButtonSprite->invisible = TRUE;
+ sEasyChatGraphicsResources->selectPgDnButtonSprite->invisible = TRUE;
+}
+
+static void CreateFooterWindow(void)
+{
+ u16 windowId;
+ struct WindowTemplate template;
+ template.bg = 3;
+ template.tilemapLeft = 4;
+ template.tilemapTop = 11;
+ template.width = 24;
+ template.height = 2;
+ template.paletteNum = 11;
+ template.baseBlock = 0x030;
+ windowId = AddWindow(&template);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
+ EC_AddTextPrinterParameterized(windowId, 1, gUnknown_841EE2B, 0, 0, 0, NULL);
+ PutWindowTilemap(windowId);
+}
diff --git a/src/ereader_helpers.c b/src/ereader_helpers.c
index cce6cefca..df1b1c279 100644
--- a/src/ereader_helpers.c
+++ b/src/ereader_helpers.c
@@ -1,25 +1,18 @@
#include "global.h"
#include "link.h"
-#include "unk_815c27c.h"
-
-enum {
- EREADER_XFR_STATE_INIT,
- EREADER_XFR_STATE_HANDSHAKE,
- EREADER_XFR_STATE_START,
- EREADER_XFR_STATE_TRANSFER,
-};
+#include "ereader_helpers.h"
struct SendRecvMgr
{
- u8 sendOrRecv;
- u8 state;
- u8 field_02;
- u8 field_03;
- u8 field_04;
- u32 * dataptr;
- int cursor;
- int size;
- u32 checksum;
+ u8 master_slave; // 0: clock slave; 1: clock master
+ u8 state; // EREADER_XFR_STATE_*
+ u8 xferState; // EREADER_XFER_*
+ u8 checksumResult; // EREADER_CHECKSUM_*
+ u8 cancellationReason; // EREADER_CANCEL_*
+ u32 * dataptr; // Payload source or destination
+ int cursor; // Index of the next word
+ int size; // Last word index
+ u32 checksum; // Validation checksum
};
static bool16 DetermineSendRecvState(u8);
@@ -39,10 +32,9 @@ static u16 sSavedIme;
static u16 sSavedIe;
static u16 sSavedTm3Cnt;
static u16 sSavedSioCnt;
-static u16 sSavedSioCnt;
static u16 sSavedRCnt;
-int EReader_Send(size_t r6, const void * r5)
+int EReader_Send(size_t size, const void * src)
{
int result;
EReaderHelper_SaveRegsState();
@@ -53,18 +45,18 @@ int EReader_Send(size_t r6, const void * r5)
if (TEST_BUTTON(sJoyNew, B_BUTTON))
gShouldAdvanceLinkState = 2;
- sSendRecvStatus = EReaderHandleTransfer(1, r6, r5, NULL);
- if ((sSendRecvStatus & 0x13) == 0x10)
+ sSendRecvStatus = EReaderHandleTransfer(1, size, src, NULL);
+ if ((sSendRecvStatus & 0x13) == 0x10) // checksum OK and xfer off
{
result = 0;
break;
}
- else if (sSendRecvStatus & 8)
+ else if (sSendRecvStatus & 8) // cancelled by player
{
result = 1;
break;
}
- else if (sSendRecvStatus & 4)
+ else if (sSendRecvStatus & 4) // timed out
{
result = 2;
break;
@@ -81,7 +73,7 @@ int EReader_Send(size_t r6, const void * r5)
return result;
}
-int EReader_Recv(void * r5)
+int EReader_Recv(void * dest)
{
int result;
EReaderHelper_SaveRegsState();
@@ -92,18 +84,18 @@ int EReader_Recv(void * r5)
if (TEST_BUTTON(sJoyNew, B_BUTTON))
gShouldAdvanceLinkState = 2;
- sSendRecvStatus = EReaderHandleTransfer(0, 0, NULL, r5);
- if ((sSendRecvStatus & 0x13) == 0x10)
+ sSendRecvStatus = EReaderHandleTransfer(0, 0, NULL, dest);
+ if ((sSendRecvStatus & 0x13) == 0x10) // checksum OK and xfer off
{
result = 0;
break;
}
- else if (sSendRecvStatus & 8)
+ else if (sSendRecvStatus & 8) // cancelled by player
{
result = 1;
break;
}
- else if (sSendRecvStatus & 4)
+ else if (sSendRecvStatus & 4) // timed out
{
result = 2;
break;
@@ -159,92 +151,98 @@ u16 EReaderHandleTransfer(u8 mode, size_t size, const void * data, void * recvBu
{
switch (sSendRecvMgr.state)
{
- case 0:
+ case EREADER_XFR_STATE_INIT:
OpenSerialMulti();
- sSendRecvMgr.field_02 = 1;
- sSendRecvMgr.state = 1;
+ sSendRecvMgr.xferState = EREADER_XFER_EXE;
+ sSendRecvMgr.state = EREADER_XFR_STATE_HANDSHAKE;
break;
- case 1:
+ case EREADER_XFR_STATE_HANDSHAKE:
if (DetermineSendRecvState(mode))
EnableSio();
if (gShouldAdvanceLinkState == 2)
{
- sSendRecvMgr.field_04 = 2;
- sSendRecvMgr.state = 6;
+ sSendRecvMgr.cancellationReason = EREADER_CANCEL_KEY;
+ sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
+ // Progression is handled by the serial callback
break;
- case 2:
+ case EREADER_XFR_STATE_START:
OpenSerial32();
SetUpTransferManager(size, data, recvBuffer);
- sSendRecvMgr.state = 3;
+ sSendRecvMgr.state = EREADER_XFR_STATE_TRANSFER;
// fallthrough
- case 3:
+ case EREADER_XFR_STATE_TRANSFER:
if (gShouldAdvanceLinkState == 2)
{
- sSendRecvMgr.field_04 = 2;
- sSendRecvMgr.state = 6;
+ sSendRecvMgr.cancellationReason = EREADER_CANCEL_KEY;
+ sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
else
{
sCounter1++;
sCounter2++;
- if (sSendRecvMgr.sendOrRecv == 0 && sCounter2 > 60)
+ if (sSendRecvMgr.master_slave == 0 && sCounter2 > 60)
{
- sSendRecvMgr.field_04 = 1;
- sSendRecvMgr.state = 6;
+ sSendRecvMgr.cancellationReason = EREADER_CANCEL_TIMEOUT;
+ sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
- if (sSendRecvMgr.field_02 != 2)
+ if (sSendRecvMgr.xferState != EREADER_XFER_CHK)
{
- if (sSendRecvMgr.sendOrRecv != 0 && sCounter1 > 2)
+ if (sSendRecvMgr.master_slave != 0 && sCounter1 > 2)
{
EnableSio();
- sSendRecvMgr.field_02 = 2;
+ sSendRecvMgr.xferState = EREADER_XFER_CHK;
}
else
{
EnableSio();
- sSendRecvMgr.field_02 = 2;
+ sSendRecvMgr.xferState = EREADER_XFER_CHK;
}
}
}
+ // Progression is handled by the serial callback
break;
- case 4:
+ case EREADER_XFR_STATE_TRANSFER_DONE:
OpenSerialMulti();
- sSendRecvMgr.state = 5;
+ sSendRecvMgr.state = EREADER_XFR_STATE_CHECKSUM;
break;
- case 5:
- if (sSendRecvMgr.sendOrRecv == 1 && sCounter1 > 2)
+ case EREADER_XFR_STATE_CHECKSUM:
+ if (sSendRecvMgr.master_slave == 1 && sCounter1 > 2)
EnableSio();
if (++sCounter1 > 60)
{
- sSendRecvMgr.field_04 = 1;
- sSendRecvMgr.state = 6;
+ sSendRecvMgr.cancellationReason = EREADER_CANCEL_TIMEOUT;
+ sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
break;
- case 6:
- if (sSendRecvMgr.field_02 != 0)
+ // Progression is handled by the serial callback
+ case EREADER_XFR_STATE_DONE:
+ if (sSendRecvMgr.xferState != 0)
{
CloseSerial();
- sSendRecvMgr.field_02 = 0;
+ sSendRecvMgr.xferState = 0;
}
break;
}
- return sSendRecvMgr.field_02 | (sSendRecvMgr.field_04 << 2) | (sSendRecvMgr.field_03 << 4);
+ return
+ (sSendRecvMgr.xferState << EREADER_XFER_SHIFT)
+ | (sSendRecvMgr.cancellationReason << EREADER_CANCEL_SHIFT)
+ | (sSendRecvMgr.checksumResult << EREADER_CHECKSUM_SHIFT);
}
static bool16 DetermineSendRecvState(u8 mode)
{
bool16 resp;
if ((*(vu32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SI | SIO_MULTI_SD)) == SIO_MULTI_SD && mode)
- resp = sSendRecvMgr.sendOrRecv = TRUE;
+ resp = sSendRecvMgr.master_slave = TRUE;
else
- resp = sSendRecvMgr.sendOrRecv = FALSE;
+ resp = sSendRecvMgr.master_slave = FALSE;
return resp;
}
static void SetUpTransferManager(size_t size, const void * data, void * recvBuffer)
{
- if (sSendRecvMgr.sendOrRecv)
+ if (sSendRecvMgr.master_slave)
{
REG_SIOCNT |= SIO_38400_BPS;
sSendRecvMgr.dataptr = (void *)data;
@@ -284,7 +282,7 @@ void EReaderHelper_SerialCallback(void)
switch (sSendRecvMgr.state)
{
- case 1:
+ case EREADER_XFR_STATE_HANDSHAKE:
REG_SIOMLT_SEND = 0xCCD0;
*(u64 *)recv = REG_SIOMLT_RECV;
for (i = 0, cnt1 = 0, cnt2 = 0; i < 4; i++)
@@ -295,14 +293,17 @@ void EReaderHelper_SerialCallback(void)
cnt2++;
}
if (cnt1 == 2 && cnt2 == 0)
- sSendRecvMgr.state = 2;
+ sSendRecvMgr.state = EREADER_XFR_STATE_START;
break;
- case 3:
+ // Progression is handled by software
+ case EREADER_XFR_STATE_TRANSFER:
recv32 = REG_SIODATA32;
- if (sSendRecvMgr.cursor == 0 && sSendRecvMgr.sendOrRecv == 0)
+ // The first value sent by the EReader is the payload size
+ if (sSendRecvMgr.cursor == 0 && sSendRecvMgr.master_slave == 0)
sSendRecvMgr.size = recv32 / 4 + 1;
- if (sSendRecvMgr.sendOrRecv == 1)
+ if (sSendRecvMgr.master_slave == 1)
{
+ // Send mode
if (sSendRecvMgr.cursor < sSendRecvMgr.size)
{
REG_SIODATA32 = sSendRecvMgr.dataptr[sSendRecvMgr.cursor];
@@ -313,43 +314,51 @@ void EReaderHelper_SerialCallback(void)
}
else
{
+ // Receive mode
if (sSendRecvMgr.cursor > 0 && sSendRecvMgr.cursor < sSendRecvMgr.size + 1)
{
+ // Receive next word
sSendRecvMgr.dataptr[sSendRecvMgr.cursor - 1] = recv32;
sSendRecvMgr.checksum += recv32;
}
else if (sSendRecvMgr.cursor != 0)
{
+ // Reached the end, test the received checksum
if (sSendRecvMgr.checksum == recv32)
- sSendRecvMgr.field_03 = 1;
+ sSendRecvMgr.checksumResult = EREADER_CHECKSUM_OK;
else
- sSendRecvMgr.field_03 = 2;
+ sSendRecvMgr.checksumResult = EREADER_CHECKSUM_ERR;
}
sCounter2 = 0;
}
sSendRecvMgr.cursor++;
if (sSendRecvMgr.cursor < sSendRecvMgr.size + 2)
{
- if (sSendRecvMgr.sendOrRecv != 0)
+ if (sSendRecvMgr.master_slave != 0)
+ // Clock master; start timer
REG_TM3CNT_H |= TIMER_ENABLE;
else
+ // Clock slave; reset
EnableSio();
}
else
{
- sSendRecvMgr.state = 4;
+ sSendRecvMgr.state = EREADER_XFR_STATE_TRANSFER_DONE;
sCounter1 = 0;
}
break;
- case 5:
- if (sSendRecvMgr.sendOrRecv == 0)
- REG_SIODATA8 = sSendRecvMgr.field_03;
+ // Progression is handled by the software
+ case EREADER_XFR_STATE_CHECKSUM:
+ if (sSendRecvMgr.master_slave == 0)
+ // Clock slave
+ REG_SIODATA8 = sSendRecvMgr.checksumResult;
*(vu64 *)recv = REG_SIOMLT_RECV;
- if (recv[1] == 1 || recv[1] == 2)
+ if (recv[1] == EREADER_CHECKSUM_OK || recv[1] == EREADER_CHECKSUM_ERR)
{
- if (sSendRecvMgr.sendOrRecv == 1)
- sSendRecvMgr.field_03 = recv[1];
- sSendRecvMgr.state = 6;
+ if (sSendRecvMgr.master_slave == 1)
+ // EReader has (in)validated the payload
+ sSendRecvMgr.checksumResult = recv[1];
+ sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
break;
}
diff --git a/src/event_data.c b/src/event_data.c
index 010a4414c..a162e8701 100644
--- a/src/event_data.c
+++ b/src/event_data.c
@@ -24,7 +24,7 @@ EWRAM_DATA u16 gSpecialVar_MonBoxId = 0;
EWRAM_DATA u16 gSpecialVar_MonBoxPos = 0;
EWRAM_DATA u16 gSpecialVar_TextColor = 0;
EWRAM_DATA u16 gSpecialVar_PrevTextColor = 0;
-EWRAM_DATA u16 gUnknown_20370DE = 0;
+EWRAM_DATA u16 gSpecialVar_0x8014 = 0;
EWRAM_DATA u8 sSpecialFlags[SPECIAL_FLAGS_COUNT] = {};
u16 gLastQuestLogStoredFlagOrVarIdx;
@@ -118,7 +118,7 @@ bool32 IsMysteryGiftEnabled(void)
return FlagGet(FLAG_SYS_MYSTERY_GIFT_ENABLED);
}
-void sub_806E2D0(void)
+void ResetMysteryEventFlags(void)
{
FlagClear(FLAG_MYSTERY_EVENT_DONE);
FlagClear(FLAG_0x3D9);
@@ -138,7 +138,7 @@ void sub_806E2D0(void)
FlagClear(FLAG_0x3E7);
}
-void sub_806E370(void)
+void ResetMysteryEventVars(void)
{
VarSet(VAR_EVENT_PICHU_SLOT, 0);
VarSet(VAR_0x40B6, 0);
@@ -321,5 +321,5 @@ void ResetSpecialVars(void)
gSpecialVar_MonBoxPos = 0;
gSpecialVar_TextColor = 0;
gSpecialVar_PrevTextColor = 0;
- gUnknown_20370DE = 0;
+ gSpecialVar_0x8014 = 0;
}
diff --git a/src/event_object_80688E4.c b/src/event_object_80688E4.c
new file mode 100644
index 000000000..746b10f38
--- /dev/null
+++ b/src/event_object_80688E4.c
@@ -0,0 +1,653 @@
+#include "global.h"
+#include "event_object_movement.h"
+#include "field_effect.h"
+#include "field_ground_effect.h"
+
+// This is part of evobjmv.c (see assert statement in DoObjectUnionRoomWarpYDisplacement).
+
+static void DoObjectUnionRoomWarpYDisplacement(struct Sprite * sprite);
+
+bool8 FreezeObjectEvent(struct ObjectEvent * objectEvent)
+{
+ if (objectEvent->heldMovementActive || objectEvent->frozen)
+ return TRUE;
+ objectEvent->frozen = TRUE;
+ objectEvent->spriteAnimPausedBackup = gSprites[objectEvent->spriteId].animPaused;
+ objectEvent->spriteAffineAnimPausedBackup = gSprites[objectEvent->spriteId].affineAnimPaused;
+ gSprites[objectEvent->spriteId].animPaused = TRUE;
+ gSprites[objectEvent->spriteId].affineAnimPaused = TRUE;
+ return FALSE;
+}
+
+void FreezeObjectEvents(void)
+{
+ u8 i;
+ for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
+ {
+ if (gObjectEvents[i].active && i != gPlayerAvatar.objectEventId)
+ FreezeObjectEvent(&gObjectEvents[i]);
+ }
+}
+
+void FreezeObjectEventsExceptOne(u8 noFreeze)
+{
+ u8 i;
+ for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
+ {
+ if (i != noFreeze && gObjectEvents[i].active && i != gPlayerAvatar.objectEventId)
+ FreezeObjectEvent(&gObjectEvents[i]);
+ }
+}
+
+void UnfreezeObjectEvent(struct ObjectEvent * objectEvent)
+{
+ if (objectEvent->active && objectEvent->frozen)
+ {
+ objectEvent->frozen = FALSE;
+ gSprites[objectEvent->spriteId].animPaused = objectEvent->spriteAnimPausedBackup;
+ gSprites[objectEvent->spriteId].affineAnimPaused = objectEvent->spriteAffineAnimPausedBackup;
+ }
+}
+
+void UnfreezeObjectEvents(void)
+{
+ u8 i;
+ for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
+ {
+ if (gObjectEvents[i].active)
+ UnfreezeObjectEvent(&gObjectEvents[i]);
+ }
+}
+
+#define tObjectEventId data[0]
+#define tZCoord data[1]
+#define tInvisible data[2]
+
+#define tDirection data[3]
+#define tSpeed data[4]
+#define tStepNo data[5]
+
+static void little_step(struct Sprite * sprite, u8 direction)
+{
+ sprite->pos1.x += sDirectionToVectors[direction].x;
+ sprite->pos1.y += sDirectionToVectors[direction].y;
+}
+
+static void double_little_steps(struct Sprite * sprite, u8 direction)
+{
+ sprite->pos1.x += 2 * (u16) sDirectionToVectors[direction].x;
+ sprite->pos1.y += 2 * (u16) sDirectionToVectors[direction].y;
+}
+
+static void triple_little_steps(struct Sprite * sprite, u8 direction)
+{
+ sprite->pos1.x += 2 * (u16) sDirectionToVectors[direction].x + (u16) sDirectionToVectors[direction].x;
+ sprite->pos1.y += 2 * (u16) sDirectionToVectors[direction].y + (u16) sDirectionToVectors[direction].y;
+}
+
+static void quad_little_steps(struct Sprite * sprite, u8 direction)
+{
+ sprite->pos1.x += 4 * (u16) sDirectionToVectors[direction].x;
+ sprite->pos1.y += 4 * (u16) sDirectionToVectors[direction].y;
+}
+
+static void oct_little_steps(struct Sprite * sprite, u8 direction)
+{
+ sprite->pos1.x += 8 * (u16) sDirectionToVectors[direction].x;
+ sprite->pos1.y += 8 * (u16) sDirectionToVectors[direction].y;
+}
+
+void oamt_npc_ministep_reset(struct Sprite * sprite, u8 direction, u8 speed)
+{
+ sprite->tDirection = direction;
+ sprite->tSpeed = speed;
+ sprite->tStepNo = 0;
+}
+
+typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 direction);
+
+static const SpriteStepFunc sSpeed0[] = {
+ little_step,
+ little_step,
+ little_step,
+ little_step,
+ little_step,
+ little_step,
+ little_step,
+ little_step,
+ little_step,
+ little_step,
+ little_step,
+ little_step,
+ little_step,
+ little_step,
+ little_step,
+ little_step
+};
+
+static const SpriteStepFunc sSpeed1[] = {
+ double_little_steps,
+ double_little_steps,
+ double_little_steps,
+ double_little_steps,
+ double_little_steps,
+ double_little_steps,
+ double_little_steps,
+ double_little_steps
+};
+
+static const SpriteStepFunc sSpeed2[] = {
+ double_little_steps,
+ triple_little_steps,
+ triple_little_steps,
+ double_little_steps,
+ triple_little_steps,
+ triple_little_steps
+};
+
+static const SpriteStepFunc sSpeed3[] = {
+ quad_little_steps,
+ quad_little_steps,
+ quad_little_steps,
+ quad_little_steps
+};
+
+static const SpriteStepFunc sSpeed4[] = {
+ oct_little_steps,
+ oct_little_steps
+};
+
+static const SpriteStepFunc *const sSpriteStepFuncsBySpeed[] = {
+ sSpeed0,
+ sSpeed1,
+ sSpeed2,
+ sSpeed3,
+ sSpeed4
+};
+
+static const s16 sSpriteStepCountsBySpeed[] = {
+ NELEMS(sSpeed0),
+ NELEMS(sSpeed1),
+ NELEMS(sSpeed2),
+ NELEMS(sSpeed3),
+ NELEMS(sSpeed4)
+};
+
+bool8 obj_npc_ministep(struct Sprite *sprite)
+{
+ if (sprite->tStepNo >= sSpriteStepCountsBySpeed[sprite->tSpeed])
+ return FALSE;
+
+ sSpriteStepFuncsBySpeed[sprite->tSpeed][sprite->tStepNo](sprite, sprite->tDirection);
+
+ sprite->tStepNo++;
+
+ if (sprite->tStepNo < sSpriteStepCountsBySpeed[sprite->tSpeed])
+ return FALSE;
+
+ return TRUE;
+}
+
+#undef tStepNo
+#undef tSpeed
+#undef tDirection
+
+#define tDirection data[3]
+#define tDelay data[4]
+#define tStepNo data[5]
+
+void sub_8068BBC(struct Sprite *sprite, u8 direction)
+{
+ sprite->tDirection = direction;
+ sprite->tDelay = 0;
+ sprite->tStepNo = 0;
+}
+
+// used by an_walk_any_2
+bool8 sub_8068BCC(struct Sprite *sprite)
+{
+ if (!(sprite->tDelay & 1))
+ {
+ little_step(sprite, sprite->tDirection);
+ sprite->tStepNo++;
+ }
+
+ sprite->tDelay++;
+
+ if (sprite->tStepNo > 15)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_8068C08(struct Sprite *sprite, u8 direction)
+{
+ sprite->tDirection = direction;
+ sprite->tDelay = 0;
+ sprite->tStepNo = 0;
+}
+
+bool8 sub_8068C18(struct Sprite *sprite)
+{
+ if (++sprite->tDelay < 3)
+ {
+ little_step(sprite, sprite->tDirection);
+ sprite->tStepNo++;
+ }
+ else
+ sprite->tDelay = 0;
+
+ if (sprite->tStepNo > 15)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_8068C58(struct Sprite *sprite, u8 direction)
+{
+ sprite->tDirection = direction;
+ sprite->tDelay = 0;
+ sprite->tStepNo = 0;
+}
+
+bool8 sub_8068C68(struct Sprite *sprite)
+{
+ if (++sprite->tDelay > 9)
+ {
+ sprite->tDelay = 0;
+ little_step(sprite, sprite->tDirection);
+ sprite->tStepNo++;
+ }
+
+ if (sprite->tStepNo > 15)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_8068CA4(struct Sprite *sprite, u8 direction)
+{
+ sprite->tDirection = direction;
+ sprite->tDelay = 0;
+ sprite->tStepNo = 0;
+}
+
+bool8 sub_8068CB4(struct Sprite *sprite)
+{
+ if ((++sprite->tDelay) & 1)
+ {
+ little_step(sprite, sprite->tDirection);
+ sprite->tStepNo++;
+ }
+ else
+ {
+ double_little_steps(sprite, sprite->tDirection);
+ sprite->tStepNo += 2;
+ }
+
+ if (sprite->tStepNo > 15)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+#undef tStepNo
+#undef tDelay
+#undef tDirection
+
+#define tDirection data[3]
+#define tJumpSpeed data[4]
+#define tJumpHeight data[5]
+#define tStepNo data[6]
+
+static const s8 sJumpHeight12[] = {
+ -4, -6, -8, -10, -11, -12, -12, -12, -11, -10, -9, -8, -6, -4, 0, 0
+};
+
+static const s8 sJumpHeight6[] = {
+ 0, -2, -3, -4, -5, -6, -6, -6, -5, -5, -4, -3, -2, 0, 0, 0
+};
+
+static const s8 sJumpHeight10[] = {
+ -2, -4, -6, -8, -9, -10, -10, -10, -9, -8, -6, -5, -3, -2, 0, 0
+};
+
+static const s8 *const sYDisplacementPtrs[] = {
+ sJumpHeight12,
+ sJumpHeight6,
+ sJumpHeight10
+};
+
+static s16 GetJumpYDisplacement(s16 stepno, u8 jumpno)
+{
+ return sYDisplacementPtrs[jumpno][stepno];
+}
+
+void sub_8068D1C(struct Sprite *sprite, u8 direction, u8 speed, u8 height)
+{
+ sprite->tDirection = direction;
+ sprite->tJumpSpeed = speed;
+ sprite->tJumpHeight = height;
+ sprite->tStepNo = 0;
+}
+
+u8 sub_8068D3C(struct Sprite *sprite)
+{
+ s16 duration[3] = {0x10, 0x10, 0x20};
+ u8 shifts[3] = {0, 0, 1};
+ u8 jumpPhase = 0;
+
+ if (sprite->tJumpSpeed != 0)
+ little_step(sprite, sprite->tDirection);
+
+ sprite->pos2.y = GetJumpYDisplacement(sprite->tStepNo >> shifts[sprite->tJumpSpeed], sprite->tJumpHeight);
+
+ sprite->tStepNo++;
+
+ if (sprite->tStepNo == (duration[sprite->tJumpSpeed] >> 1))
+ jumpPhase = 1;
+
+ if (sprite->tStepNo >= duration[sprite->tJumpSpeed])
+ {
+ sprite->pos2.y = 0;
+ jumpPhase = -1;
+ }
+
+ return jumpPhase;
+}
+
+u8 sub_8068DC4(struct Sprite *sprite)
+{
+ s16 duration[3] = {0x20, 0x20, 0x40};
+ u8 shifts[3] = {1, 1, 2};
+ u8 jumpPhase = 0;
+
+ if (sprite->tJumpSpeed != 0 && !(sprite->tStepNo & 1))
+ little_step(sprite, sprite->tDirection);
+
+ sprite->pos2.y = GetJumpYDisplacement(sprite->tStepNo >> shifts[sprite->tJumpSpeed], sprite->tJumpHeight);
+
+ sprite->tStepNo++;
+
+ if (sprite->tStepNo == (duration[sprite->tJumpSpeed] >> 1))
+ jumpPhase = 1;
+
+ if (sprite->tStepNo >= duration[sprite->tJumpSpeed])
+ {
+ sprite->pos2.y = 0;
+ jumpPhase = -1;
+ }
+
+ return jumpPhase;
+}
+
+#undef tStepNo
+#undef tJumpHeight
+#undef tJumpSpeed
+#undef tDirection
+
+#define tDelay data[3]
+
+void SetMovementDelay(struct Sprite *sprite, s16 delay)
+{
+ sprite->tDelay = delay;
+}
+
+bool8 WaitForMovementDelay(struct Sprite *sprite)
+{
+ sprite->tDelay--;
+
+ if (sprite->tDelay == 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+#undef tDelay
+
+void SetAndStartSpriteAnim(struct Sprite *sprite, u8 animNum, u8 animCmdIndex)
+{
+ sprite->animNum = animNum;
+ sprite->animPaused = FALSE;
+ SeekSpriteAnim(sprite, animCmdIndex);
+}
+
+bool8 SpriteAnimEnded(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void UpdateObjectEventSpriteVisibility(struct Sprite *sprite, bool8 invisible)
+{
+ u16 x, y;
+ s16 x2, y2;
+
+ sprite->invisible = invisible;
+
+ if (sprite->coordOffsetEnabled)
+ {
+ x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX;
+ y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY;
+ }
+ else
+ {
+ x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
+ y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
+ }
+
+ x2 = x - (sprite->centerToCornerVecX >> 1);
+ y2 = y - (sprite->centerToCornerVecY >> 1);
+
+ if ((s16)x > 255 || x2 < -16)
+ sprite->invisible = TRUE;
+ if ((s16)y > 175 || y2 < -16)
+ sprite->invisible = TRUE;
+}
+
+void UpdateObjectEventSpriteSubpriorityAndVisibility(struct Sprite *sprite)
+{
+ DoObjectUnionRoomWarpYDisplacement(sprite);
+ SetObjectSubpriorityByZCoord(sprite->tZCoord, sprite, 1);
+ UpdateObjectEventSpriteVisibility(sprite, sprite->tInvisible);
+}
+
+void sub_8068FD0(void)
+{
+ s32 i;
+ for (i = 0; i < MAX_SPRITES; i++)
+ {
+ struct Sprite *sprite = &gSprites[i];
+ if (sprite->inUse && sprite->callback == UpdateObjectEventSpriteSubpriorityAndVisibility)
+ {
+ DestroySprite(sprite);
+ }
+ }
+}
+
+#define tUnionRoomWarpAnimNo data[3]
+#define tUnionRoomWarpAnimState data[4]
+
+static int GetObjectEventSpriteId(u8 objectEventId)
+{
+ int i;
+ for (i = 0; i < MAX_SPRITES; i++)
+ {
+ struct Sprite *sprite = &gSprites[i];
+ if (sprite->inUse && sprite->callback == UpdateObjectEventSpriteSubpriorityAndVisibility && (u8)sprite->tObjectEventId == objectEventId)
+ {
+ return i;
+ }
+ }
+ return MAX_SPRITES;
+}
+
+void TurnObjectEvent(u8 objectEventId, u8 direction)
+{
+ u8 animNum;
+ u8 spriteId = GetObjectEventSpriteId(objectEventId);
+ if (spriteId != MAX_SPRITES)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+ StartSpriteAnim(sprite, GetFaceDirectionAnimNum(direction));
+ }
+}
+
+void RfuUnionObjectSetFacingDirection(u8 objectEventId, u8 direction)
+{
+ u8 animNum;
+ int spriteId = GetObjectEventSpriteId(objectEventId);
+ u16 baseBlock;
+ if (spriteId != MAX_SPRITES)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+ const struct ObjectEventGraphicsInfo * info = GetObjectEventGraphicsInfo(direction);
+ baseBlock = sprite->oam.tileNum;
+ sprite->oam = *info->oam;
+ sprite->oam.tileNum = baseBlock;
+ sprite->oam.paletteNum = info->paletteSlot;
+ sprite->images = info->images;
+ if (info->subspriteTables == NULL)
+ {
+ sprite->subspriteTables = NULL;
+ sprite->subspriteTableNum = 0;
+ sprite->subspriteMode = SUBSPRITES_OFF;
+ }
+ else
+ {
+ SetSubspriteTables(sprite, info->subspriteTables);
+ sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;
+ }
+ StartSpriteAnim(sprite, 0);
+ }
+}
+
+void RfuUnionObjectToggleInvisibility(u8 objectEventId, bool32 invisible)
+{
+ u8 spriteId = GetObjectEventSpriteId(objectEventId);
+ if (spriteId != MAX_SPRITES)
+ {
+ if (invisible)
+ gSprites[spriteId].tInvisible = TRUE;
+ else
+ gSprites[spriteId].tInvisible = FALSE;
+ }
+}
+
+bool32 RfuUnionObjectIsInvisible(u8 objectEventId)
+{
+ u8 spriteId = GetObjectEventSpriteId(objectEventId);
+ if (spriteId == MAX_SPRITES)
+ return FALSE;
+ return gSprites[spriteId].tInvisible == TRUE;
+}
+
+void RfuUnionObjectStartWarp(u8 objectEventId, u8 animNo)
+{
+ u8 spriteId = GetObjectEventSpriteId(objectEventId);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].tUnionRoomWarpAnimNo = animNo;
+ gSprites[spriteId].tUnionRoomWarpAnimState = 0;
+ }
+}
+
+static void DoObjectUnionRoomWarpYDisplacementUpwards(struct Sprite * sprite)
+{
+ switch (sprite->tUnionRoomWarpAnimState)
+ {
+ case 0:
+ sprite->pos2.y = 0;
+ sprite->tUnionRoomWarpAnimState++;
+ // fallthrough
+ case 1:
+ if ((sprite->pos2.y -= 8) == -160)
+ {
+ sprite->pos2.y = 0;
+ sprite->tInvisible = 1;
+ sprite->tUnionRoomWarpAnimNo = 0;
+ sprite->tUnionRoomWarpAnimState = 0;
+ }
+ break;
+ }
+}
+
+static void DoObjectUnionRoomWarpYDisplacementDownwards(struct Sprite * sprite)
+{
+ switch (sprite->tUnionRoomWarpAnimState)
+ {
+ case 0:
+ sprite->pos2.y = -160;
+ sprite->tUnionRoomWarpAnimState++;
+ // fallthrough
+ case 1:
+ if ((sprite->pos2.y += 8) == 0)
+ {
+ sprite->tUnionRoomWarpAnimNo = 0;
+ sprite->tUnionRoomWarpAnimState = 0;
+ }
+ break;
+ }
+}
+
+static void DoObjectUnionRoomWarpYDisplacement(struct Sprite * sprite)
+{
+ switch (sprite->tUnionRoomWarpAnimNo)
+ {
+ case 0:
+ break;
+ case 1:
+ DoObjectUnionRoomWarpYDisplacementDownwards(sprite);
+ break;
+ case 2:
+ DoObjectUnionRoomWarpYDisplacementUpwards(sprite);
+ break;
+ default:
+ sprite->tUnionRoomWarpAnimNo = 0;
+ AGB_ASSERT_EX(0, ABSPATH("evobjmv.c"), 13331);
+ }
+}
+
+bool32 RfuUnionObjectIsWarping(u8 objectEventId)
+{
+ u8 spriteId = GetObjectEventSpriteId(objectEventId);
+ if (spriteId == MAX_SPRITES)
+ return FALSE;
+ if (gSprites[spriteId].tUnionRoomWarpAnimNo)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+#undef tUnionRoomWarpAnimState
+#undef tUnionRoomWarpAnimNo
+#undef tInvisible
+#undef tZCoord
+#undef tObjectEventId
+
+u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct ObjectEvent * objectEvent)
+{
+ ObjectEventGetLocalIdAndMap(objectEvent, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
+ return FieldEffectStart(fieldEffectId);
+}
+
+void DoShadowFieldEffect(struct ObjectEvent *objectEvent)
+{
+ if (!objectEvent->hasShadow)
+ {
+ objectEvent->hasShadow = TRUE;
+ oe_exec_and_other_stuff(FLDEFF_SHADOW, objectEvent);
+ }
+}
+
+void DoRippleFieldEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+{
+ const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);
+ gFieldEffectArguments[0] = sprite->pos1.x;
+ gFieldEffectArguments[1] = sprite->pos1.y + (graphicsInfo->height >> 1) - 2;
+ gFieldEffectArguments[2] = 151;
+ gFieldEffectArguments[3] = 3;
+ FieldEffectStart(FLDEFF_RIPPLE);
+}
diff --git a/src/event_object_lock.c b/src/event_object_lock.c
index 996e0c19c..a72845ac7 100644
--- a/src/event_object_lock.c
+++ b/src/event_object_lock.c
@@ -3,9 +3,7 @@
#include "field_player_avatar.h"
#include "event_object_movement.h"
#include "script_movement.h"
-#include "event_object_80688E4.h"
#include "event_data.h"
-#include "event_object_lock.h"
bool8 walkrun_is_standing_still(void)
{
@@ -89,18 +87,18 @@ void sub_80696C0(void)
{
u8 objectEventId = GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0);
ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objectEventId]);
- sub_80974D8();
+ ScriptMovement_UnfreezeObjectEvents();
UnfreezeObjectEvents();
}
-void sub_80696F0(void)
+void UnionRoom_UnlockPlayerAndChatPartner(void)
{
u8 objectEventId;
if (gObjectEvents[gSelectedObjectEvent].active)
ObjectEventClearHeldMovementIfFinished(&gObjectEvents[gSelectedObjectEvent]);
objectEventId = GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0);
ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objectEventId]);
- sub_80974D8();
+ ScriptMovement_UnfreezeObjectEvents();
UnfreezeObjectEvents();
}
diff --git a/src/event_object_movement.c b/src/event_object_movement.c
index 53008f3a0..7ec8dd8d1 100644
--- a/src/event_object_movement.c
+++ b/src/event_object_movement.c
@@ -1,8 +1,6 @@
#include "global.h"
#include "malloc.h"
#include "event_data.h"
-#include "event_object_80688E4.h"
-#include "event_object_8097404.h"
#include "event_object_movement.h"
#include "field_camera.h"
#include "field_control_avatar.h"
@@ -21,7 +19,6 @@
#include "trig.h"
#include "constants/event_object_movement.h"
#include "constants/event_objects.h"
-#include "constants/object_events.h"
#define NUM_FIELD_MAP_OBJECT_TEMPLATES 0x51
@@ -74,18 +71,18 @@ static u8 sub_8063304(struct ObjectEvent *, struct Sprite *);
static u8 sub_8063324(struct ObjectEvent *, struct Sprite *);
static u8 sub_8063344(struct ObjectEvent *, struct Sprite *);
static void sub_8064544(struct ObjectEvent *, struct Sprite *);
-u8 sub_8064988(struct ObjectEvent *, struct Sprite *);
-u8 sub_80649C8(struct ObjectEvent *, struct Sprite *);
-u8 sub_8064A08(struct ObjectEvent *, struct Sprite *);
-u8 sub_8064A48(struct ObjectEvent *, struct Sprite *);
-u8 sub_8064A88(struct ObjectEvent *, struct Sprite *);
-u8 sub_8064AC8(struct ObjectEvent *, struct Sprite *);
-u8 sub_8064B08(struct ObjectEvent *, struct Sprite *);
-u8 sub_8064B48(struct ObjectEvent *, struct Sprite *);
-u8 sub_8064C5C(struct ObjectEvent *, struct Sprite *);
-u8 sub_8064C9C(struct ObjectEvent *, struct Sprite *);
-u8 sub_8064CDC(struct ObjectEvent *, struct Sprite *);
-u8 sub_8064D1C(struct ObjectEvent *, struct Sprite *);
+u8 MovementActionFunc_x9B_1(struct ObjectEvent *, struct Sprite *);
+u8 MovementActionFunc_x9C_1(struct ObjectEvent *, struct Sprite *);
+u8 MovementActionFunc_x9D_1(struct ObjectEvent *, struct Sprite *);
+u8 MovementActionFunc_x9E_1(struct ObjectEvent *, struct Sprite *);
+u8 MovementActionFunc_x08_1(struct ObjectEvent *, struct Sprite *);
+u8 MovementActionFunc_x09_1(struct ObjectEvent *, struct Sprite *);
+u8 MovementActionFunc_x0A_1(struct ObjectEvent *, struct Sprite *);
+u8 MovementActionFunc_x0B_1(struct ObjectEvent *, struct Sprite *);
+u8 MovementActionFunc_x0D_1(struct ObjectEvent *, struct Sprite *);
+u8 MovementActionFunc_x0C_1(struct ObjectEvent *, struct Sprite *);
+u8 MovementActionFunc_x0E_1(struct ObjectEvent *, struct Sprite *);
+u8 MovementActionFunc_x0F_1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_WalkNormalDown_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_WalkNormalUp_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_WalkNormalLeft_Step1(struct ObjectEvent *, struct Sprite *);
@@ -98,10 +95,10 @@ u8 MovementAction_WalkFastDown_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_WalkFastUp_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_WalkFastLeft_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_WalkFastRight_Step1(struct ObjectEvent *, struct Sprite *);
-bool8 sub_8065438(struct ObjectEvent *, struct Sprite *);
-bool8 sub_80654A4(struct ObjectEvent *, struct Sprite *);
-bool8 sub_8065510(struct ObjectEvent *, struct Sprite *);
-bool8 sub_806557C(struct ObjectEvent *, struct Sprite *);
+bool8 MovementActionFunc_xA0_1(struct ObjectEvent *, struct Sprite *);
+bool8 MovementActionFunc_xA1_1(struct ObjectEvent *, struct Sprite *);
+bool8 MovementActionFunc_xA2_1(struct ObjectEvent *, struct Sprite *);
+bool8 MovementActionFunc_xA3_1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_RideWaterCurrentDown_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_RideWaterCurrentUp_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_RideWaterCurrentLeft_Step1(struct ObjectEvent *, struct Sprite *);
@@ -118,18 +115,18 @@ u8 MovementAction_PlayerRunDown_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_PlayerRunUp_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_PlayerRunLeft_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_PlayerRunRight_Step1(struct ObjectEvent *, struct Sprite *);
-bool8 sub_8065FE4(struct ObjectEvent *, struct Sprite *);
-bool8 sub_8066024(struct ObjectEvent *, struct Sprite *);
-bool8 sub_8066064(struct ObjectEvent *, struct Sprite *);
-bool8 sub_80660A4(struct ObjectEvent *, struct Sprite *);
+bool8 MovementActionFunc_x41_1(struct ObjectEvent *, struct Sprite *);
+bool8 MovementActionFunc_x42_1(struct ObjectEvent *, struct Sprite *);
+bool8 MovementActionFunc_x43_1(struct ObjectEvent *, struct Sprite *);
+bool8 MovementActionFunc_x44_1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_JumpSpecialDown_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_JumpSpecialUp_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_JumpSpecialLeft_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_JumpSpecialRight_Step1(struct ObjectEvent *, struct Sprite *);
-bool8 sub_806629C(struct ObjectEvent *, struct Sprite *);
-bool8 sub_80662DC(struct ObjectEvent *, struct Sprite *);
-bool8 sub_806631C(struct ObjectEvent *, struct Sprite *);
-bool8 sub_806635C(struct ObjectEvent *, struct Sprite *);
+bool8 MovementActionFunc_xA6_1(struct ObjectEvent *, struct Sprite *);
+bool8 MovementActionFunc_xA7_1(struct ObjectEvent *, struct Sprite *);
+bool8 MovementActionFunc_xA8_1(struct ObjectEvent *, struct Sprite *);
+bool8 MovementActionFunc_xA9_1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_JumpDown_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_JumpUp_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_JumpLeft_Step1(struct ObjectEvent *, struct Sprite *);
@@ -165,10 +162,10 @@ u8 MovementAction_AcroWheelieMoveDown_Step1(struct ObjectEvent *, struct Sprite
u8 MovementAction_AcroWheelieMoveUp_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_AcroWheelieMoveLeft_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_AcroWheelieMoveRight_Step1(struct ObjectEvent *, struct Sprite *);;
-bool8 sub_80676A4(struct ObjectEvent *, struct Sprite *);
-bool8 sub_80676E4(struct ObjectEvent *, struct Sprite *);
-bool8 sub_8067724(struct ObjectEvent *, struct Sprite *);
-bool8 sub_8067764(struct ObjectEvent *, struct Sprite *);
+bool8 MovementActionFunc_x94_1(struct ObjectEvent *, struct Sprite *);
+bool8 MovementActionFunc_x95_1(struct ObjectEvent *, struct Sprite *);
+bool8 MovementActionFunc_x96_1(struct ObjectEvent *, struct Sprite *);
+bool8 MovementActionFunc_x97_1(struct ObjectEvent *, struct Sprite *);
#define movement_type_def(setup, table) \
static u8 setup##_callback(struct ObjectEvent *, struct Sprite *);\
@@ -319,7 +316,6 @@ extern const struct UnkStruct_083A3698 gUnknown_83A3698[];
extern const u8 gTrainerFacingDirectionMovementTypes[];
extern bool8 (*const gOppositeDirectionBlockedMetatileFuncs[])(u8);
extern bool8 (*const gDirectionBlockedMetatileFuncs[])(u8);
-extern const struct Coords16 sDirectionToVectors[];
extern const u8 gFaceDirectionMovementActions[5];
extern const u8 gWalkSlowMovementActions[5];
extern const u8 gUnknown_83A64F6[];
@@ -793,7 +789,7 @@ static u8 sub_805E238(struct ObjectEventTemplate *template, u8 var, s16 x, s16 y
static u8 sub_805E27C(struct ObjectEventTemplate *template, s16 x, s16 y)
{
- if ((u8) (template->graphicsId - OBJECT_EVENT_GFX_CUT_TREE) > 1)
+ if ((u8) (template->graphicsId - OBJ_EVENT_GFX_CUT_TREE) > 1)
return 1;
if (gSaveBlock1Ptr->pos.x < x)
@@ -826,7 +822,7 @@ static u8 sub_805E2E8(struct ObjectEventTemplate *template, s16 x, s16 y)
x2 = gBackupMapLayout.Xsize - 16;
y2 = gBackupMapLayout.Ysize - 15;
- if ((u8) (template->graphicsId - OBJECT_EVENT_GFX_CUT_TREE) > 1)
+ if ((u8) (template->graphicsId - OBJ_EVENT_GFX_CUT_TREE) > 1)
return 1;
if (!gSaveBlock1Ptr->pos.x)
@@ -1043,7 +1039,7 @@ u8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *objectEventTemplate)
return TrySpawnObjectEventTemplate(objectEventTemplate, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY);
}
-u8 SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 z)
+int SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 z)
{
struct ObjectEventTemplate objectEventTemplate;
@@ -4846,13 +4842,13 @@ bool8 sub_8064930(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8064968(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x9B_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8064904(objectEvent, sprite, DIR_SOUTH);
- return sub_8064988(objectEvent, sprite);
+ return MovementActionFunc_x9B_1(objectEvent, sprite);
}
-bool8 sub_8064988(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x9B_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (sub_8064930(objectEvent, sprite))
{
@@ -4862,13 +4858,13 @@ bool8 sub_8064988(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_80649A8(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x9C_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8064904(objectEvent, sprite, DIR_NORTH);
- return sub_80649C8(objectEvent, sprite);
+ return MovementActionFunc_x9C_1(objectEvent, sprite);
}
-bool8 sub_80649C8(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x9C_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (sub_8064930(objectEvent, sprite))
{
@@ -4878,13 +4874,13 @@ bool8 sub_80649C8(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_80649E8(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x9D_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8064904(objectEvent, sprite, DIR_WEST);
- return sub_8064A08(objectEvent, sprite);
+ return MovementActionFunc_x9D_1(objectEvent, sprite);
}
-bool8 sub_8064A08(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x9D_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (sub_8064930(objectEvent, sprite))
{
@@ -4894,13 +4890,13 @@ bool8 sub_8064A08(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8064A28(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x9E_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8064904(objectEvent, sprite, DIR_EAST);
- return sub_8064A48(objectEvent, sprite);
+ return MovementActionFunc_x9E_1(objectEvent, sprite);
}
-bool8 sub_8064A48(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x9E_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (sub_8064930(objectEvent, sprite))
{
@@ -4910,13 +4906,13 @@ bool8 sub_8064A48(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8064A68(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x08_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8064830(objectEvent, sprite, DIR_SOUTH);
- return sub_8064A88(objectEvent, sprite);
+ return MovementActionFunc_x08_1(objectEvent, sprite);
}
-bool8 sub_8064A88(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x08_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (an_walk_any_2(objectEvent, sprite))
{
@@ -4926,13 +4922,13 @@ bool8 sub_8064A88(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8064AA8(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x09_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8064830(objectEvent, sprite, DIR_NORTH);
- return sub_8064AC8(objectEvent, sprite);
+ return MovementActionFunc_x09_1(objectEvent, sprite);
}
-bool8 sub_8064AC8(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x09_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (an_walk_any_2(objectEvent, sprite))
{
@@ -4942,13 +4938,13 @@ bool8 sub_8064AC8(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8064AE8(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x0A_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8064830(objectEvent, sprite, DIR_WEST);
- return sub_8064B08(objectEvent, sprite);
+ return MovementActionFunc_x0A_1(objectEvent, sprite);
}
-bool8 sub_8064B08(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x0A_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (an_walk_any_2(objectEvent, sprite))
{
@@ -4958,13 +4954,13 @@ bool8 sub_8064B08(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8064B28(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x0B_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8064830(objectEvent, sprite, DIR_EAST);
- return sub_8064B48(objectEvent, sprite);
+ return MovementActionFunc_x0B_1(objectEvent, sprite);
}
-bool8 sub_8064B48(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x0B_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (an_walk_any_2(objectEvent, sprite))
{
@@ -5008,13 +5004,13 @@ bool8 sub_8064C04(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8064C3C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x0D_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8064BD8(objectEvent, sprite, DIR_NORTH);
- return sub_8064C5C(objectEvent, sprite);
+ return MovementActionFunc_x0D_1(objectEvent, sprite);
}
-bool8 sub_8064C5C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x0D_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (sub_8064C04(objectEvent, sprite))
{
@@ -5024,13 +5020,13 @@ bool8 sub_8064C5C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8064C7C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x0C_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8064BD8(objectEvent, sprite, DIR_SOUTH);
- return sub_8064C9C(objectEvent, sprite);
+ return MovementActionFunc_x0C_1(objectEvent, sprite);
}
-bool8 sub_8064C9C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x0C_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (sub_8064C04(objectEvent, sprite))
{
@@ -5040,13 +5036,13 @@ bool8 sub_8064C9C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8064CBC(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x0E_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8064BD8(objectEvent, sprite, DIR_WEST);
- return sub_8064CDC(objectEvent, sprite);
+ return MovementActionFunc_x0E_1(objectEvent, sprite);
}
-bool8 sub_8064CDC(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x0E_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (sub_8064C04(objectEvent, sprite))
{
@@ -5056,13 +5052,13 @@ bool8 sub_8064CDC(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8064CFC(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x0F_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8064BD8(objectEvent, sprite, DIR_EAST);
- return sub_8064D1C(objectEvent, sprite);
+ return MovementActionFunc_x0F_1(objectEvent, sprite);
}
-bool8 sub_8064D1C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x0F_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (sub_8064C04(objectEvent, sprite))
{
@@ -5421,16 +5417,16 @@ bool8 sub_80653CC(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-u8 sub_80653F8(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+u8 MovementActionFunc_xA0_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if(objectEvent->facingDirection != DIR_SOUTH)
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_SOUTH));
npc_apply_direction(objectEvent, sprite, DIR_SOUTH, 1);
- return sub_8065438(objectEvent, sprite);
+ return MovementActionFunc_xA0_1(objectEvent, sprite);
}
-bool8 sub_8065438(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_xA0_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
AnimateSprite(sprite);
if (sub_80653CC(objectEvent, sprite))
@@ -5441,16 +5437,16 @@ bool8 sub_8065438(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-u8 sub_8065464(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+u8 MovementActionFunc_xA1_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if(objectEvent->facingDirection != DIR_NORTH)
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_NORTH));
npc_apply_direction(objectEvent, sprite, DIR_NORTH, 1);
- return sub_80654A4(objectEvent, sprite);
+ return MovementActionFunc_xA1_1(objectEvent, sprite);
}
-bool8 sub_80654A4(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_xA1_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
AnimateSprite(sprite);
if (sub_80653CC(objectEvent, sprite))
@@ -5461,16 +5457,16 @@ bool8 sub_80654A4(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-u8 sub_80654D0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+u8 MovementActionFunc_xA2_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if(objectEvent->facingDirection != DIR_WEST)
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_WEST));
npc_apply_direction(objectEvent, sprite, DIR_WEST, 1);
- return sub_8065510(objectEvent, sprite);
+ return MovementActionFunc_xA2_1(objectEvent, sprite);
}
-bool8 sub_8065510(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_xA2_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
AnimateSprite(sprite);
if (sub_80653CC(objectEvent, sprite))
@@ -5481,16 +5477,16 @@ bool8 sub_8065510(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-u8 sub_806553C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+u8 MovementActionFunc_xA3_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if(objectEvent->facingDirection != DIR_EAST)
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_EAST));
npc_apply_direction(objectEvent, sprite, DIR_EAST, 1);
- return sub_806557C(objectEvent, sprite);
+ return MovementActionFunc_xA3_1(objectEvent, sprite);
}
-bool8 sub_806557C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_xA3_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
AnimateSprite(sprite);
if (sub_80653CC(objectEvent, sprite))
@@ -5509,7 +5505,7 @@ void sub_80655A8(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 dire
sprite->data[2] = 1;
}
-u8 sub_80655D4(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+u8 MovementActionFunc_x04_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if(objectEvent->facingDirection != DIR_SOUTH)
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_SOUTH));
@@ -5519,7 +5515,7 @@ u8 sub_80655D4(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return TRUE;
}
-u8 sub_8065610(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+u8 MovementActionFunc_x05_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if(objectEvent->facingDirection != DIR_NORTH)
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_NORTH));
@@ -5529,7 +5525,7 @@ u8 sub_8065610(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return TRUE;
}
-u8 sub_806564C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+u8 MovementActionFunc_x06_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if(objectEvent->facingDirection != DIR_WEST)
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_WEST));
@@ -5539,7 +5535,7 @@ u8 sub_806564C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return TRUE;
}
-u8 sub_8065688(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+u8 MovementActionFunc_x07_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if(objectEvent->facingDirection != DIR_EAST)
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(DIR_EAST));
@@ -5964,13 +5960,13 @@ bool8 sub_8065F8C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8065FC4(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x41_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8065F60(objectEvent, sprite, DIR_SOUTH);
- return sub_8065FE4(objectEvent, sprite);
+ return MovementActionFunc_x41_1(objectEvent, sprite);
}
-bool8 sub_8065FE4(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x41_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (sub_8065F8C(objectEvent, sprite))
{
@@ -5980,13 +5976,13 @@ bool8 sub_8065FE4(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8066004(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x42_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8065F60(objectEvent, sprite, DIR_NORTH);
- return sub_8066024(objectEvent, sprite);
+ return MovementActionFunc_x42_1(objectEvent, sprite);
}
-bool8 sub_8066024(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x42_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (sub_8065F8C(objectEvent, sprite))
{
@@ -5996,13 +5992,13 @@ bool8 sub_8066024(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8066044(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x43_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8065F60(objectEvent, sprite, DIR_WEST);
- return sub_8066064(objectEvent, sprite);
+ return MovementActionFunc_x43_1(objectEvent, sprite);
}
-bool8 sub_8066064(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x43_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (sub_8065F8C(objectEvent, sprite))
{
@@ -6012,13 +6008,13 @@ bool8 sub_8066064(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8066084(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x44_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8065F60(objectEvent, sprite, DIR_SOUTH);
- return sub_80660A4(objectEvent, sprite);
+ return MovementActionFunc_x44_1(objectEvent, sprite);
}
-bool8 sub_80660A4(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x44_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (sub_8065F8C(objectEvent, sprite))
{
@@ -6125,13 +6121,13 @@ bool8 MovementAction_JumpSpecialRight_Step1(struct ObjectEvent *objectEvent, str
return FALSE;
}
-bool8 sub_806627C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_xA6_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8066128(objectEvent, sprite, DIR_SOUTH);
- return sub_806629C(objectEvent, sprite);
+ return MovementActionFunc_xA6_1(objectEvent, sprite);
}
-bool8 sub_806629C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_xA6_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (sub_8065040(objectEvent, sprite))
{
@@ -6141,13 +6137,13 @@ bool8 sub_806629C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_80662BC(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_xA7_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8066128(objectEvent, sprite, DIR_NORTH);
- return sub_80662DC(objectEvent, sprite);
+ return MovementActionFunc_xA7_1(objectEvent, sprite);
}
-bool8 sub_80662DC(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_xA7_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (sub_8065040(objectEvent, sprite))
{
@@ -6157,13 +6153,13 @@ bool8 sub_80662DC(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_80662FC(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_xA8_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8066128(objectEvent, sprite, DIR_WEST);
- return sub_806631C(objectEvent, sprite);
+ return MovementActionFunc_xA8_1(objectEvent, sprite);
}
-bool8 sub_806631C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_xA8_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (sub_8065040(objectEvent, sprite))
{
@@ -6173,13 +6169,13 @@ bool8 sub_806631C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_806633C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_xA9_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8066128(objectEvent, sprite, DIR_EAST);
- return sub_806635C(objectEvent, sprite);
+ return MovementActionFunc_xA9_1(objectEvent, sprite);
}
-bool8 sub_806635C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_xA9_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (sub_8065040(objectEvent, sprite))
{
@@ -6504,23 +6500,23 @@ bool8 MovementAction_EmoteQuestionMark_Step0(struct ObjectEvent *objectEvent, st
bool8 MovementAction_EmoteHeart_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
- FieldEffectStart(FLDEFF_HEART_ICON);
+ FieldEffectStart(FLDEFF_X_ICON);
sprite->data[2] = 1;
return TRUE;
}
-bool8 sub_806698C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 do_double_excl_bubble(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
- FieldEffectStart(FLDEFF_UNK_42);
+ FieldEffectStart(FLDEFF_DOUBLE_EXCL_MARK_ICON);
sprite->data[2] = 1;
return TRUE;
}
-bool8 sub_80669B0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 do_smile_bubble(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
- FieldEffectStart(FLDEFF_UNK_40);
+ FieldEffectStart(FLDEFF_SMILEY_FACE_ICON);
sprite->data[2] = 1;
return TRUE;
}
@@ -6529,7 +6525,7 @@ bool8 MovementAction_RevealTrainer_Step0(struct ObjectEvent *objectEvent, struct
{
if (objectEvent->movementType == MOVEMENT_TYPE_HIDDEN)
{
- sub_80824EC(objectEvent);
+ MovementAction_RevealTrainer_RunTrainerSeeFuncList(objectEvent);
return FALSE;
}
if (objectEvent->movementType != MOVEMENT_TYPE_TREE_DISGUISE && objectEvent->movementType != MOVEMENT_TYPE_MOUNTAIN_DISGUISE)
@@ -6686,25 +6682,25 @@ void sub_8066C70(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 dire
sprite->data[2] = 1;
}
-bool8 sub_8066CB0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x70_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8066C70(objectEvent, sprite, DIR_SOUTH);
return TRUE;
}
-bool8 sub_8066CC0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x71_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8066C70(objectEvent, sprite, DIR_NORTH);
return TRUE;
}
-bool8 sub_8066CD0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x72_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8066C70(objectEvent, sprite, DIR_WEST);
return TRUE;
}
-bool8 sub_8066CE0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x73_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8066C70(objectEvent, sprite, DIR_EAST);
return TRUE;
@@ -6993,25 +6989,25 @@ bool8 MovementAction_AcroWheelieJumpRight_Step1(struct ObjectEvent *objectEvent,
return FALSE;
}
-bool8 sub_8067304(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x88_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_80656C4(objectEvent, sprite, DIR_SOUTH, GetFishingDirectionAnimNum(DIR_SOUTH), 8);
return MovementAction_WalkInPlace_Step1(objectEvent, sprite);
}
-bool8 sub_806733C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x89_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_80656C4(objectEvent, sprite, DIR_NORTH, GetFishingDirectionAnimNum(DIR_NORTH), 8);
return MovementAction_WalkInPlace_Step1(objectEvent, sprite);
}
-bool8 sub_8067374(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x8A_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_80656C4(objectEvent, sprite, DIR_WEST, GetFishingDirectionAnimNum(DIR_WEST), 8);
return MovementAction_WalkInPlace_Step1(objectEvent, sprite);
}
-bool8 sub_80673AC(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x8B_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_80656C4(objectEvent, sprite, DIR_EAST, GetFishingDirectionAnimNum(DIR_EAST), 8);
return MovementAction_WalkInPlace_Step1(objectEvent, sprite);
@@ -7165,13 +7161,13 @@ void sub_806764C(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 dire
SeekSpriteAnim(sprite, 0);
}
-bool8 sub_8067684(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x94_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_806764C(objectEvent, sprite, DIR_SOUTH, 1);
- return sub_80676A4(objectEvent, sprite);
+ return MovementActionFunc_x94_1(objectEvent, sprite);
}
-bool8 sub_80676A4(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x94_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite))
{
@@ -7181,13 +7177,13 @@ bool8 sub_80676A4(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_80676C4(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x95_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_806764C(objectEvent, sprite, DIR_NORTH, 1);
- return sub_80676E4(objectEvent, sprite);
+ return MovementActionFunc_x95_1(objectEvent, sprite);
}
-bool8 sub_80676E4(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x95_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite))
{
@@ -7197,13 +7193,13 @@ bool8 sub_80676E4(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8067704(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x96_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_806764C(objectEvent, sprite, DIR_WEST, 1);
- return sub_8067724(objectEvent, sprite);
+ return MovementActionFunc_x96_1(objectEvent, sprite);
}
-bool8 sub_8067724(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x96_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite))
{
@@ -7213,13 +7209,13 @@ bool8 sub_8067724(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8067744(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x97_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_806764C(objectEvent, sprite, DIR_EAST, 1);
- return sub_8067764(objectEvent, sprite);
+ return MovementActionFunc_x97_1(objectEvent, sprite);
}
-bool8 sub_8067764(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x97_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite))
{
@@ -7229,7 +7225,7 @@ bool8 sub_8067764(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8067784(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x98_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
StartSpriteAnim(sprite, 20);
sprite->animPaused = FALSE;
@@ -7242,12 +7238,12 @@ bool8 sub_8067784(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_80677C0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x98_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
return sprite->animEnded;
}
-bool8 sub_80677CC(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x99_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
s32 y;
switch (sprite->data[7])
@@ -7294,7 +7290,7 @@ bool8 sub_80677CC(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_80678C0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x9A_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
bool8 ret;
sprite->data[7] = (sprite->data[7] + 4) & 0xFF;
@@ -7306,7 +7302,7 @@ bool8 sub_80678C0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return ret;
}
-bool8 sub_80678F0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x9F_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
StartSpriteAnim(sprite, 28);
sprite->animPaused = FALSE;
@@ -7315,7 +7311,7 @@ bool8 sub_80678F0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8067924(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_x9F_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
return sprite->animEnded;
}
@@ -7331,14 +7327,14 @@ bool8 MovementAction_PauseSpriteAnim(struct ObjectEvent *objectEvent, struct Spr
return TRUE;
}
-bool8 sub_8067944(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_xA4_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sprite->pos2.y = 0;
sprite->data[2]++;
return FALSE;
}
-bool8 sub_8067954(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_xA4_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sprite->pos2.y -= 8;
if (sprite->pos2.y == -160)
@@ -7346,14 +7342,14 @@ bool8 sub_8067954(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-bool8 sub_8067978(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_xA5_0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sprite->pos2.y = -160;
sprite->data[2]++;
return FALSE;
}
-bool8 sub_806798C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 MovementActionFunc_xA5_1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sprite->pos2.y += 8;
if (sprite->pos2.y == 0)
@@ -7361,7 +7357,7 @@ bool8 sub_806798C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
return FALSE;
}
-u8 sub_80679A8(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+u8 MovementActionFunc_xA4_2(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
return TRUE;
}
diff --git a/src/evolution_scene.c b/src/evolution_scene.c
index f3b05b32c..71eb3fc36 100644
--- a/src/evolution_scene.c
+++ b/src/evolution_scene.c
@@ -31,8 +31,6 @@
#include "text.h"
#include "text_window.h"
#include "trig.h"
-#include "trade.h"
-#include "util.h"
#include "battle_string_ids.h"
#include "constants/species.h"
#include "constants/songs.h"
diff --git a/src/fame_checker.c b/src/fame_checker.c
index c9a8aac5a..7b71610ed 100644
--- a/src/fame_checker.c
+++ b/src/fame_checker.c
@@ -1536,7 +1536,7 @@ static void PlaceListMenuCursor(bool8 isActive)
{
u16 cursorY = ListMenuGetYCoordForPrintingArrowCursor(sFameCheckerData->listMenuTaskId);
if (isActive == TRUE)
- AddTextPrinterParameterized4(FCWINDOWID_LIST, 2, 0, cursorY, 0, 0, sTextColor_DkGrey, 0, gFameCheckerText_ListMenuCursor);
+ AddTextPrinterParameterized4(FCWINDOWID_LIST, 2, 0, cursorY, 0, 0, sTextColor_DkGrey, 0, gText_SelectorArrow2);
else
- AddTextPrinterParameterized4(FCWINDOWID_LIST, 2, 0, cursorY, 0, 0, sTextColor_White, 0, gFameCheckerText_ListMenuCursor);
+ AddTextPrinterParameterized4(FCWINDOWID_LIST, 2, 0, cursorY, 0, 0, sTextColor_White, 0, gText_SelectorArrow2);
}
diff --git a/src/field_camera.c b/src/field_camera.c
new file mode 100644
index 000000000..40ab8f464
--- /dev/null
+++ b/src/field_camera.c
@@ -0,0 +1,572 @@
+#include "global.h"
+#include "gflib.h"
+#include "field_camera.h"
+#include "field_player_avatar.h"
+#include "fieldmap.h"
+#include "event_object_movement.h"
+#include "new_menu_helpers.h"
+#include "overworld.h"
+
+EWRAM_DATA bool8 gUnusedBikeCameraAheadPanback = FALSE;
+
+// Static type declarations
+struct FieldCameraOffset
+{
+ u8 xPixelOffset;
+ u8 yPixelOffset;
+ u8 xTileOffset;
+ u8 yTileOffset;
+ bool8 copyBGToVRAM;
+};
+
+// static functions
+static void RedrawMapSliceNorth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);
+static void RedrawMapSliceSouth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);
+static void RedrawMapSliceEast(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);
+static void RedrawMapSliceWest(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);
+static s32 MapPosToBgTilemapOffset(struct FieldCameraOffset *a, s32 x, s32 y);
+static void DrawWholeMapViewInternal(int x, int y, const struct MapLayout *mapLayout);
+static void DrawMetatileAt(const struct MapLayout *mapLayout, u16, int, int);
+static void DrawMetatile(s32 a, const u16 *b, u16 c);
+static void CameraPanningCB_PanAhead(void);
+
+// IWRAM bss vars
+static struct FieldCameraOffset sFieldCameraOffset;
+static s16 sHorizontalCameraPan;
+static s16 sVerticalCameraPan;
+static u8 gUnknown_3000E9C;
+static void (*sFieldCameraPanningCallback)(void);
+
+struct CameraObject gFieldCamera;
+u16 gTotalCameraPixelOffsetY;
+u16 gTotalCameraPixelOffsetX;
+
+// text
+static void move_tilemap_camera_to_upper_left_corner_(struct FieldCameraOffset *cameraOffset)
+{
+ cameraOffset->xTileOffset = 0;
+ cameraOffset->yTileOffset = 0;
+ cameraOffset->xPixelOffset = 0;
+ cameraOffset->yPixelOffset = 0;
+ cameraOffset->copyBGToVRAM = TRUE;
+}
+
+static void tilemap_move_something(struct FieldCameraOffset *cameraOffset, u32 b, u32 c)
+{
+ cameraOffset->xTileOffset += b;
+ cameraOffset->xTileOffset %= 32;
+ cameraOffset->yTileOffset += c;
+ cameraOffset->yTileOffset %= 32;
+}
+
+static void coords8_add(struct FieldCameraOffset *cameraOffset, u32 b, u32 c)
+{
+ cameraOffset->xPixelOffset += b;
+ cameraOffset->yPixelOffset += c;
+}
+
+void move_tilemap_camera_to_upper_left_corner(void)
+{
+ move_tilemap_camera_to_upper_left_corner_(&sFieldCameraOffset);
+}
+
+void FieldUpdateBgTilemapScroll(void)
+{
+ u32 r4, r5;
+ r5 = sFieldCameraOffset.xPixelOffset + sHorizontalCameraPan;
+ r4 = sVerticalCameraPan + sFieldCameraOffset.yPixelOffset + 8;
+
+ SetGpuReg(REG_OFFSET_BG1HOFS, r5);
+ SetGpuReg(REG_OFFSET_BG1VOFS, r4);
+ SetGpuReg(REG_OFFSET_BG2HOFS, r5);
+ SetGpuReg(REG_OFFSET_BG2VOFS, r4);
+ SetGpuReg(REG_OFFSET_BG3HOFS, r5);
+ SetGpuReg(REG_OFFSET_BG3VOFS, r4);
+}
+
+void sub_805A658(s16 *a, s16 *b)
+{
+ *a = sFieldCameraOffset.xPixelOffset + sHorizontalCameraPan;
+ *b = sFieldCameraOffset.yPixelOffset + sVerticalCameraPan + 8;
+}
+
+void DrawWholeMapView(void)
+{
+ DrawWholeMapViewInternal(gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y, gMapHeader.mapLayout);
+ // sFieldCameraOffset.copyBGToVRAM = TRUE;
+}
+
+static void DrawWholeMapViewInternal(int x, int y, const struct MapLayout *mapLayout)
+{
+ u8 i;
+ u8 j;
+ u32 r6;
+ u8 temp;
+
+ for (i = 0; i < 32; i += 2)
+ {
+ temp = sFieldCameraOffset.yTileOffset + i;
+ if (temp >= 32)
+ temp -= 32;
+ r6 = temp * 32;
+ for (j = 0; j < 32; j += 2)
+ {
+ temp = sFieldCameraOffset.xTileOffset + j;
+ if (temp >= 32)
+ temp -= 32;
+ DrawMetatileAt(mapLayout, r6 + temp, x + j / 2, y + i / 2);
+ }
+ }
+}
+
+static void RedrawMapSlicesForCameraUpdate(struct FieldCameraOffset *cameraOffset, int x, int y)
+{
+ const struct MapLayout *mapLayout = gMapHeader.mapLayout;
+
+ if (x > 0)
+ RedrawMapSliceWest(cameraOffset, mapLayout);
+ if (x < 0)
+ RedrawMapSliceEast(cameraOffset, mapLayout);
+ if (y > 0)
+ RedrawMapSliceNorth(cameraOffset, mapLayout);
+ if (y < 0)
+ RedrawMapSliceSouth(cameraOffset, mapLayout);
+ cameraOffset->copyBGToVRAM = TRUE;
+}
+
+static void RedrawMapSliceNorth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout)
+{
+ u8 i;
+ u8 temp;
+ u32 r7;
+
+ temp = cameraOffset->yTileOffset + 28;
+ if (temp >= 32)
+ temp -= 32;
+ r7 = temp * 32;
+ for (i = 0; i < 32; i += 2)
+ {
+ temp = cameraOffset->xTileOffset + i;
+ if (temp >= 32)
+ temp -= 32;
+ DrawMetatileAt(mapLayout, r7 + temp, gSaveBlock1Ptr->pos.x + i / 2, gSaveBlock1Ptr->pos.y + 14);
+ }
+}
+
+static void RedrawMapSliceSouth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout)
+{
+ u8 i;
+ u8 temp;
+ u32 r7 = cameraOffset->yTileOffset * 32;
+
+ for (i = 0; i < 32; i += 2)
+ {
+ temp = cameraOffset->xTileOffset + i;
+ if (temp >= 32)
+ temp -= 32;
+ DrawMetatileAt(mapLayout, r7 + temp, gSaveBlock1Ptr->pos.x + i / 2, gSaveBlock1Ptr->pos.y);
+ }
+}
+
+static void RedrawMapSliceEast(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout)
+{
+ u8 i;
+ u8 temp;
+ u32 r6 = cameraOffset->xTileOffset;
+
+ for (i = 0; i < 32; i += 2)
+ {
+ temp = cameraOffset->yTileOffset + i;
+ if (temp >= 32)
+ temp -= 32;
+ DrawMetatileAt(mapLayout, temp * 32 + r6, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y + i / 2);
+ }
+}
+
+static void RedrawMapSliceWest(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout)
+{
+ u8 i;
+ u8 temp;
+ u8 r5 = cameraOffset->xTileOffset + 28;
+
+ if (r5 >= 32)
+ r5 -= 32;
+ for (i = 0; i < 32; i += 2)
+ {
+ temp = cameraOffset->yTileOffset + i;
+ if (temp >= 32)
+ temp -= 32;
+ DrawMetatileAt(mapLayout, temp * 32 + r5, gSaveBlock1Ptr->pos.x + 14, gSaveBlock1Ptr->pos.y + i / 2);
+ }
+}
+
+void CurrentMapDrawMetatileAt(int x, int y)
+{
+ int offset = MapPosToBgTilemapOffset(&sFieldCameraOffset, x, y);
+
+ if (offset >= 0)
+ {
+ DrawMetatileAt(gMapHeader.mapLayout, offset, x, y);
+ // sFieldCameraOffset.copyBGToVRAM = TRUE;
+ }
+}
+
+void DrawDoorMetatileAt(int x, int y, const u16 *arr)
+{
+ int offset = MapPosToBgTilemapOffset(&sFieldCameraOffset, x, y);
+
+ if (offset >= 0)
+ {
+ DrawMetatile(1, arr, offset);
+ // sFieldCameraOffset.copyBGToVRAM = TRUE;
+ }
+}
+
+static void DrawMetatileAt(const struct MapLayout *mapLayout, u16 offset, int x, int y)
+{
+ u16 metatileId = MapGridGetMetatileIdAt(x, y);
+ u16 *metatiles;
+
+ if (metatileId > NUM_METATILES_TOTAL)
+ metatileId = 0;
+ if (metatileId < NUM_METATILES_IN_PRIMARY)
+ metatiles = mapLayout->primaryTileset->metatiles;
+ else
+ {
+ metatiles = mapLayout->secondaryTileset->metatiles;
+ metatileId -= NUM_METATILES_IN_PRIMARY;
+ }
+ DrawMetatile(MapGridGetMetatileLayerTypeAt(x, y), metatiles + metatileId * 8, offset);
+}
+
+static void DrawMetatile(s32 metatileLayerType, const u16 *metatiles, u16 offset)
+{
+ switch (metatileLayerType)
+ {
+ case 2: // LAYER_TYPE_
+ // Draw metatile's bottom layer to the bottom background layer.
+ gBGTilemapBuffers3[offset] = metatiles[0];
+ gBGTilemapBuffers3[offset + 1] = metatiles[1];
+ gBGTilemapBuffers3[offset + 0x20] = metatiles[2];
+ gBGTilemapBuffers3[offset + 0x21] = metatiles[3];
+
+ // Draw transparent tiles to the middle background layer.
+ gBGTilemapBuffers1[offset] = 0;
+ gBGTilemapBuffers1[offset + 1] = 0;
+ gBGTilemapBuffers1[offset + 0x20] = 0;
+ gBGTilemapBuffers1[offset + 0x21] = 0;
+
+ // Draw metatile's top layer to the top background layer.
+ gBGTilemapBuffers2[offset] = metatiles[4];
+ gBGTilemapBuffers2[offset + 1] = metatiles[5];
+ gBGTilemapBuffers2[offset + 0x20] = metatiles[6];
+ gBGTilemapBuffers2[offset + 0x21] = metatiles[7];
+ break;
+ case 1: // LAYER_TYPE_COVERED_BY_OBJECTS
+ // Draw metatile's bottom layer to the bottom background layer.
+ gBGTilemapBuffers3[offset] = metatiles[0];
+ gBGTilemapBuffers3[offset + 1] = metatiles[1];
+ gBGTilemapBuffers3[offset + 0x20] = metatiles[2];
+ gBGTilemapBuffers3[offset + 0x21] = metatiles[3];
+
+ // Draw metatile's top layer to the middle background layer.
+ gBGTilemapBuffers1[offset] = metatiles[4];
+ gBGTilemapBuffers1[offset + 1] = metatiles[5];
+ gBGTilemapBuffers1[offset + 0x20] = metatiles[6];
+ gBGTilemapBuffers1[offset + 0x21] = metatiles[7];
+
+ // Draw transparent tiles to the top background layer.
+ gBGTilemapBuffers2[offset] = 0;
+ gBGTilemapBuffers2[offset + 1] = 0;
+ gBGTilemapBuffers2[offset + 0x20] = 0;
+ gBGTilemapBuffers2[offset + 0x21] = 0;
+ break;
+ case 0: // LAYER_TYPE_NORMAL
+ // Draw garbage to the bottom background layer.
+ gBGTilemapBuffers3[offset] = 0x3014;
+ gBGTilemapBuffers3[offset + 1] = 0x3014;
+ gBGTilemapBuffers3[offset + 0x20] = 0x3014;
+ gBGTilemapBuffers3[offset + 0x21] = 0x3014;
+
+ // Draw metatile's bottom layer to the middle background layer.
+ gBGTilemapBuffers1[offset] = metatiles[0];
+ gBGTilemapBuffers1[offset + 1] = metatiles[1];
+ gBGTilemapBuffers1[offset + 0x20] = metatiles[2];
+ gBGTilemapBuffers1[offset + 0x21] = metatiles[3];
+
+ // Draw metatile's top layer to the top background layer, which covers object event sprites.
+ gBGTilemapBuffers2[offset] = metatiles[4];
+ gBGTilemapBuffers2[offset + 1] = metatiles[5];
+ gBGTilemapBuffers2[offset + 0x20] = metatiles[6];
+ gBGTilemapBuffers2[offset + 0x21] = metatiles[7];
+ break;
+ }
+ ScheduleBgCopyTilemapToVram(1);
+ ScheduleBgCopyTilemapToVram(2);
+ ScheduleBgCopyTilemapToVram(3);
+}
+
+static s32 MapPosToBgTilemapOffset(struct FieldCameraOffset *cameraOffset, s32 x, s32 y)
+{
+ x -= gSaveBlock1Ptr->pos.x;
+ x *= 2;
+ if (x >= 32 || x < 0)
+ return -1;
+ x = x + cameraOffset->xTileOffset;
+ if (x >= 32)
+ x -= 32;
+
+ y = (y - gSaveBlock1Ptr->pos.y) * 2;
+ if (y >= 32 || y < 0)
+ return -1;
+ y = y + cameraOffset->yTileOffset;
+ if (y >= 32)
+ y -= 32;
+
+ return y * 32 + x;
+}
+
+static void CameraUpdateCallback(struct CameraObject *fieldCamera)
+{
+ if (fieldCamera->spriteId != 0)
+ {
+ fieldCamera->movementSpeedX = gSprites[fieldCamera->spriteId].data[2];
+ fieldCamera->movementSpeedY = gSprites[fieldCamera->spriteId].data[3];
+ }
+}
+
+void ResetCameraUpdateInfo(void)
+{
+ gFieldCamera.movementSpeedX = 0;
+ gFieldCamera.movementSpeedY = 0;
+ gFieldCamera.x = 0;
+ gFieldCamera.y = 0;
+ gFieldCamera.spriteId = 0;
+ gFieldCamera.callback = NULL;
+}
+
+u32 InitCameraUpdateCallback(u8 trackedSpriteId)
+{
+ if (gFieldCamera.spriteId != 0)
+ DestroySprite(&gSprites[gFieldCamera.spriteId]);
+ gFieldCamera.spriteId = AddCameraObject(trackedSpriteId);
+ gFieldCamera.callback = CameraUpdateCallback;
+ return 0;
+}
+
+void CameraUpdate(void)
+{
+ int deltaX;
+ int deltaY;
+ int curMovementOffsetY;
+ int curMovementOffsetX;
+ int movementSpeedX;
+ int movementSpeedY;
+
+ if (gFieldCamera.callback != NULL)
+ gFieldCamera.callback(&gFieldCamera);
+ movementSpeedX = gFieldCamera.movementSpeedX;
+ movementSpeedY = gFieldCamera.movementSpeedY;
+ deltaX = 0;
+ deltaY = 0;
+ curMovementOffsetX = gFieldCamera.x;
+ curMovementOffsetY = gFieldCamera.y;
+
+
+ if (curMovementOffsetX == 0 && movementSpeedX != 0)
+ {
+ if (movementSpeedX > 0)
+ deltaX = 1;
+ else
+ deltaX = -1;
+ }
+ if (curMovementOffsetY == 0 && movementSpeedY != 0)
+ {
+ if (movementSpeedY > 0)
+ deltaY = 1;
+ else
+ deltaY = -1;
+ }
+ if (curMovementOffsetX != 0 && curMovementOffsetX == -movementSpeedX)
+ {
+ if (movementSpeedX > 0)
+ deltaX = 1;
+ else
+ deltaX = -1;
+ }
+ if (curMovementOffsetY != 0 && curMovementOffsetY == -movementSpeedY)
+ {
+ if (movementSpeedY > 0)
+ deltaX = 1;
+ else
+ deltaX = -1;
+ }
+
+ gFieldCamera.x += movementSpeedX;
+ gFieldCamera.x = gFieldCamera.x - 16 * (gFieldCamera.x / 16);
+ gFieldCamera.y += movementSpeedY;
+ gFieldCamera.y = gFieldCamera.y - 16 * (gFieldCamera.y / 16);
+
+ if (deltaX != 0 || deltaY != 0)
+ {
+ CameraMove(deltaX, deltaY);
+ UpdateObjectEventsForCameraUpdate(deltaX, deltaY);
+ // RotatingGatePuzzleCameraUpdate(deltaX, deltaY);
+ // ResetBerryTreeSparkleFlags();
+ tilemap_move_something(&sFieldCameraOffset, deltaX * 2, deltaY * 2);
+ RedrawMapSlicesForCameraUpdate(&sFieldCameraOffset, deltaX * 2, deltaY * 2);
+ }
+
+ coords8_add(&sFieldCameraOffset, movementSpeedX, movementSpeedY);
+ gTotalCameraPixelOffsetX -= movementSpeedX;
+ gTotalCameraPixelOffsetY -= movementSpeedY;
+}
+
+void MoveCameraAndRedrawMap(int deltaX, int deltaY) // unused
+{
+ CameraMove(deltaX, deltaY);
+ UpdateObjectEventsForCameraUpdate(deltaX, deltaY);
+ DrawWholeMapView();
+ gTotalCameraPixelOffsetX -= deltaX * 16;
+ gTotalCameraPixelOffsetY -= deltaY * 16;
+}
+
+void sub_805ACF0(void)
+{
+ int deltaX;
+ int deltaY;
+ int curMovementOffsetY;
+ int curMovementOffsetX;
+ int movementSpeedX;
+ int movementSpeedY;
+
+ if (gFieldCamera.callback != NULL)
+ gFieldCamera.callback(&gFieldCamera);
+ movementSpeedX = gFieldCamera.movementSpeedX;
+ movementSpeedY = gFieldCamera.movementSpeedY;
+ deltaX = 0;
+ deltaY = 0;
+ curMovementOffsetX = gFieldCamera.x;
+ curMovementOffsetY = gFieldCamera.y;
+
+
+ if (curMovementOffsetX == 0 && movementSpeedX != 0)
+ {
+ if (movementSpeedX > 0)
+ deltaX = 1;
+ else
+ deltaX = -1;
+ }
+ if (curMovementOffsetY == 0 && movementSpeedY != 0)
+ {
+ if (movementSpeedY > 0)
+ deltaY = 1;
+ else
+ deltaY = -1;
+ }
+ if (curMovementOffsetX != 0 && curMovementOffsetX == -movementSpeedX)
+ {
+ if (movementSpeedX > 0)
+ deltaX = 1;
+ else
+ deltaX = -1;
+ }
+ if (curMovementOffsetY != 0 && curMovementOffsetY == -movementSpeedY)
+ {
+ if (movementSpeedY > 0)
+ deltaX = 1;
+ else
+ deltaX = -1;
+ }
+
+ gFieldCamera.x += movementSpeedX;
+ gFieldCamera.x = gFieldCamera.x - 16 * (gFieldCamera.x / 16);
+ gFieldCamera.y += movementSpeedY;
+ gFieldCamera.y = gFieldCamera.y - 16 * (gFieldCamera.y / 16);
+
+ if (deltaX != 0 || deltaY != 0)
+ {
+ CameraMove(deltaX, deltaY);
+ // UpdateObjectEventsForCameraUpdate(deltaX, deltaY);
+ // RotatingGatePuzzleCameraUpdate(deltaX, deltaY);
+ // ResetBerryTreeSparkleFlags();
+ tilemap_move_something(&sFieldCameraOffset, deltaX * 2, deltaY * 2);
+ RedrawMapSlicesForCameraUpdate(&sFieldCameraOffset, deltaX * 2, deltaY * 2);
+ }
+
+ coords8_add(&sFieldCameraOffset, movementSpeedX, movementSpeedY);
+ // gTotalCameraPixelOffsetX -= movementSpeedX;
+ // gTotalCameraPixelOffsetY -= movementSpeedY;
+}
+
+void SetCameraPanningCallback(void (*a)(void))
+{
+ sFieldCameraPanningCallback = a;
+}
+
+void SetCameraPanning(s16 a, s16 b)
+{
+ sHorizontalCameraPan = a;
+ sVerticalCameraPan = b + 32;
+}
+
+void InstallCameraPanAheadCallback(void)
+{
+ sFieldCameraPanningCallback = CameraPanningCB_PanAhead;
+ gUnknown_3000E9C = 0;
+ sHorizontalCameraPan = 0;
+ sVerticalCameraPan = 32;
+}
+
+void UpdateCameraPanning(void)
+{
+ if (sFieldCameraPanningCallback != NULL)
+ sFieldCameraPanningCallback();
+ // Update sprite offset of overworld objects
+ gSpriteCoordOffsetX = gTotalCameraPixelOffsetX - sHorizontalCameraPan;
+ gSpriteCoordOffsetY = gTotalCameraPixelOffsetY - sVerticalCameraPan - 8;
+}
+
+static void CameraPanningCB_PanAhead(void)
+{
+ u8 var;
+
+ if (gUnusedBikeCameraAheadPanback == FALSE)
+ {
+ InstallCameraPanAheadCallback();
+ }
+ else
+ {
+ // this code is never reached.
+ if (gPlayerAvatar.tileTransitionState == 1)
+ {
+ gUnknown_3000E9C ^= 1;
+ if (gUnknown_3000E9C == 0)
+ return;
+ }
+ else
+ {
+ gUnknown_3000E9C = 0;
+ }
+
+ var = GetPlayerMovementDirection();
+ if (var == 2)
+ {
+ if (sVerticalCameraPan > -8)
+ sVerticalCameraPan -= 2;
+ }
+ else if (var == 1)
+ {
+ if (sVerticalCameraPan < 72)
+ sVerticalCameraPan += 2;
+ }
+ else if (sVerticalCameraPan < 32)
+ {
+ sVerticalCameraPan += 2;
+ }
+ else if (sVerticalCameraPan > 32)
+ {
+ sVerticalCameraPan -= 2;
+ }
+ }
+}
diff --git a/src/field_door.c b/src/field_door.c
index cbf7a79ea..e17ef0d5a 100644
--- a/src/field_door.c
+++ b/src/field_door.c
@@ -4,6 +4,10 @@
#include "fieldmap.h"
#include "metatile_behavior.h"
#include "constants/songs.h"
+#include "constants/metatile_labels.h"
+
+#define DOOR_SOUND_NORMAL 0
+#define DOOR_SOUND_SLIDING 1
struct DoorAnimFrame
{
@@ -14,7 +18,7 @@ struct DoorAnimFrame
struct DoorGraphics
{
u16 metatileId;
- s8 sliding;
+ u8 sound;
u8 size;
const u8 * tiles;
const u8 * palettes;
@@ -26,204 +30,148 @@ static void SetDoorFramePalettes(const struct DoorGraphics * gfx, int x, int y,
static void BufferDoorFrameTilesWithPalettes(u16 *a0, u16 a1, const u8 *a2);
static bool32 PlayDoorAnimationFrame(const struct DoorGraphics * gfx, const struct DoorAnimFrame * frames, s16 *data);
static const struct DoorAnimFrame * SeekToEndOfDoorAnim(const struct DoorAnimFrame * frames);
-static s8 GetDoorOpenType(const struct DoorGraphics * gfx, int x, int y);
-
-static const u8 gUnknown_8353088[] = INCBIN_U8("graphics/door_anims/frame_8353088_1.4bpp", "graphics/door_anims/frame_8353088_2.4bpp", "graphics/door_anims/frame_8353088_3.4bpp");
-static const u8 gUnknown_8353208[32] = {};
-static const u8 gUnknown_8353228[] = INCBIN_U8("graphics/door_anims/frame_8353228_1.4bpp", "graphics/door_anims/frame_8353228_2.4bpp", "graphics/door_anims/frame_8353228_3.4bpp");
-static const u8 gUnknown_83533A8[32] = {};
-static const u8 gUnknown_83533C8[] = INCBIN_U8("graphics/door_anims/frame_83533C8_1.4bpp", "graphics/door_anims/frame_83533C8_2.4bpp", "graphics/door_anims/frame_83533C8_3.4bpp");
-static const u8 gUnknown_8353548[32] = {};
-static const u8 gUnknown_8353568[] = INCBIN_U8("graphics/door_anims/frame_8353568_1.4bpp", "graphics/door_anims/frame_8353568_2.4bpp", "graphics/door_anims/frame_8353568_3.4bpp");
-static const u8 gUnknown_83536E8[32] = {};
-static const u8 gUnknown_8353708[] = INCBIN_U8("graphics/door_anims/frame_8353708_1.4bpp", "graphics/door_anims/frame_8353708_2.4bpp", "graphics/door_anims/frame_8353708_3.4bpp");
-static const u8 gUnknown_8353888[32] = {};
-static const u8 gUnknown_83538A8[] = INCBIN_U8("graphics/door_anims/frame_83538A8_1.4bpp", "graphics/door_anims/frame_83538A8_2.4bpp", "graphics/door_anims/frame_83538A8_3.4bpp");
-static const u8 gUnknown_8353A28[32] = {};
-static const u8 gUnknown_8353A48[] = INCBIN_U8("graphics/door_anims/frame_8353A48_1.4bpp", "graphics/door_anims/frame_8353A48_2.4bpp", "graphics/door_anims/frame_8353A48_3.4bpp");
-static const u8 gUnknown_8353BC8[32] = {};
-static const u8 gUnknown_8353BE8[] = INCBIN_U8("graphics/door_anims/frame_8353BE8_1.4bpp", "graphics/door_anims/frame_8353BE8_2.4bpp", "graphics/door_anims/frame_8353BE8_3.4bpp");
-static const u8 gUnknown_8353D68[32] = {};
-static const u8 gUnknown_8353D88[] = INCBIN_U8("graphics/door_anims/frame_8353D88_1.4bpp", "graphics/door_anims/frame_8353D88_2.4bpp", "graphics/door_anims/frame_8353D88_3.4bpp");
-static const u8 gUnknown_8353F08[32] = {};
-static const u8 gUnknown_8353F28[] = INCBIN_U8("graphics/door_anims/frame_8353F28_1.4bpp", "graphics/door_anims/frame_8353F28_2.4bpp", "graphics/door_anims/frame_8353F28_3.4bpp");
-static const u8 gUnknown_83540A8[32] = {};
-static const u8 gUnknown_83540C8[] = INCBIN_U8("graphics/door_anims/frame_83540C8_1.4bpp", "graphics/door_anims/frame_83540C8_2.4bpp", "graphics/door_anims/frame_83540C8_3.4bpp");
-static const u8 gUnknown_8354248[32] = {};
-static const u8 gUnknown_8354268[] = INCBIN_U8("graphics/door_anims/frame_8354268_1.4bpp", "graphics/door_anims/frame_8354268_2.4bpp", "graphics/door_anims/frame_8354268_3.4bpp");
-static const u8 gUnknown_83543E8[32] = {};
-static const u8 gUnknown_8354408[] = INCBIN_U8("graphics/door_anims/frame_8354408_1.4bpp", "graphics/door_anims/frame_8354408_2.4bpp", "graphics/door_anims/frame_8354408_3.4bpp");
-static const u8 gUnknown_8354588[32] = {};
-static const u8 gUnknown_83545A8[] = INCBIN_U8("graphics/door_anims/frame_83545A8_1.4bpp", "graphics/door_anims/frame_83545A8_2.4bpp", "graphics/door_anims/frame_83545A8_3.4bpp");
-static const u8 gUnknown_8354728[32] = {};
-static const u8 gUnknown_8354748[] = INCBIN_U8("graphics/door_anims/frame_8354748_1.4bpp", "graphics/door_anims/frame_8354748_2.4bpp", "graphics/door_anims/frame_8354748_3.4bpp");
-static const u8 gUnknown_83548C8[32] = {};
-static const u8 gUnknown_83548E8[] = INCBIN_U8("graphics/door_anims/frame_83548E8_1.4bpp", "graphics/door_anims/frame_83548E8_2.4bpp", "graphics/door_anims/frame_83548E8_3.4bpp");
-static const u8 gUnknown_8354A68[32] = {};
-static const u8 gUnknown_8354A88[] = INCBIN_U8("graphics/door_anims/frame_8354A88_1.4bpp", "graphics/door_anims/frame_8354A88_2.4bpp", "graphics/door_anims/frame_8354A88_3.4bpp");
-static const u8 gUnknown_8354C08[32] = {};
-static const u8 gUnknown_8354C28[] = INCBIN_U8("graphics/door_anims/frame_8354C28_1.4bpp", "graphics/door_anims/frame_8354C28_2.4bpp", "graphics/door_anims/frame_8354C28_3.4bpp");
-static const u8 gUnknown_8354F28[32] = {};
-static const u8 gUnknown_8354F48[] = INCBIN_U8("graphics/door_anims/frame_8354F48_1.4bpp", "graphics/door_anims/frame_8354F48_2.4bpp", "graphics/door_anims/frame_8354F48_3.4bpp");
-static const u8 gUnknown_8355248[32] = {};
-static const u8 gUnknown_8355268[] = INCBIN_U8("graphics/door_anims/frame_8355268_1.4bpp", "graphics/door_anims/frame_8355268_2.4bpp", "graphics/door_anims/frame_8355268_3.4bpp");
-static const u8 gUnknown_8355568[32] = {};
-static const u8 gUnknown_8355588[] = INCBIN_U8("graphics/door_anims/frame_8355588_1.4bpp", "graphics/door_anims/frame_8355588_2.4bpp", "graphics/door_anims/frame_8355588_3.4bpp");
-static const u8 gUnknown_8355888[32] = {};
-static const u8 gUnknown_83558A8[256] = {};
-static const u8 gUnknown_83559A8[256] = {};
-static const u8 gUnknown_8355AA8[256] = {};
-static const u8 gUnknown_8355BA8[32] = {};
-static const u8 gUnknown_8355BC8[256] = {};
-static const u8 gUnknown_8355CC8[256] = {};
-static const u8 gUnknown_8355DC8[256] = {};
-static const u8 gUnknown_8355EC8[32] = {};
-static const u8 gUnknown_8355EE8[256] = {};
-static const u8 gUnknown_8355FE8[256] = {};
-static const u8 gUnknown_83560E8[256] = {};
-static const u8 gUnknown_83561E8[32] = {};
-static const u8 gUnknown_8356208[256] = {};
-static const u8 gUnknown_8356308[256] = {};
-static const u8 gUnknown_8356408[256] = {};
-static const u8 gUnknown_8356508[32] = {};
-static const u8 gUnknown_8356528[256] = {};
-static const u8 gUnknown_8356628[256] = {};
-static const u8 gUnknown_8356728[256] = {};
-static const u8 gUnknown_8356828[32] = {};
-static const u8 gUnknown_8356848[256] = {};
-static const u8 gUnknown_8356948[256] = {};
-static const u8 gUnknown_8356A48[256] = {};
-static const u8 gUnknown_8356B48[32] = {};
-static const u8 gUnknown_8356B68[256] = {};
-static const u8 gUnknown_8356C68[256] = {};
-static const u8 gUnknown_8356D68[256] = {};
-static const u8 gUnknown_8356E68[32] = {};
-static const u8 gUnknown_8356E88[128] = {};
-static const u8 gUnknown_8356F08[128] = {};
-static const u8 gUnknown_8356F88[128] = {};
-static const u8 gUnknown_8357008[32] = {};
-static const u8 gUnknown_8357028[128] = {};
-static const u8 gUnknown_83570A8[128] = {};
-static const u8 gUnknown_8357128[128] = {};
-static const u8 gUnknown_83571A8[32] = {};
-static const u8 gUnknown_83571C8[128] = {};
-static const u8 gUnknown_8357248[128] = {};
-static const u8 gUnknown_83572C8[128] = {};
-static const u8 gUnknown_8357348[32] = {};
-static const u8 gUnknown_8357368[128] = {};
-static const u8 gUnknown_83573E8[128] = {};
-static const u8 gUnknown_8357468[128] = {};
-static const u8 gUnknown_83574E8[32] = {};
-static const u8 gUnknown_8357508[128] = {};
-static const u8 gUnknown_8357588[128] = {};
-static const u8 gUnknown_8357608[128] = {};
-static const u8 gUnknown_8357688[32] = {};
-static const u8 gUnknown_83576A8[128] = {};
-static const u8 gUnknown_8357728[128] = {};
-static const u8 gUnknown_83577A8[128] = {};
-static const u8 gUnknown_8357828[32] = {};
-static const u8 gUnknown_8357848[128] = {};
-static const u8 gUnknown_83578C8[128] = {};
-static const u8 gUnknown_8357948[128] = {};
-static const u8 gUnknown_83579C8[32] = {};
-static const u8 gUnknown_83579E8[128] = {};
-static const u8 gUnknown_8357A68[128] = {};
-static const u8 gUnknown_8357AE8[128] = {};
-static const u8 gUnknown_8357B68[32] = {};
-static const u8 gUnknown_8357B88[128] = {};
-static const u8 gUnknown_8357C08[128] = {};
-static const u8 gUnknown_8357C88[128] = {};
-static const u8 gUnknown_8357D08[32] = {};
-static const u8 gUnknown_8357D28[128] = {};
-static const u8 gUnknown_8357DA8[128] = {};
-static const u8 gUnknown_8357E28[128] = {};
-static const u8 gUnknown_8357EA8[32] = {};
-static const u8 gUnknown_8357EC8[128] = {};
-static const u8 gUnknown_8357F48[128] = {};
-static const u8 gUnknown_8357FC8[128] = {};
-static const u8 gUnknown_8358048[32] = {};
-static const u8 gUnknown_8358068[128] = {};
-static const u8 gUnknown_83580E8[128] = {};
-static const u8 gUnknown_8358168[128] = {};
-static const u8 gUnknown_83581E8[32] = {};
-static const u8 gUnknown_8358208[128] = {};
-static const u8 gUnknown_8358288[128] = {};
-static const u8 gUnknown_8358308[128] = {};
-static const u8 gUnknown_8358388[32] = {};
-static const u8 gUnknown_83583A8[128] = {};
-static const u8 gUnknown_8358428[128] = {};
-static const u8 gUnknown_83584A8[128] = {};
-static const u8 gUnknown_8358528[32] = {};
-static const u8 gUnknown_8358548[128] = {};
-static const u8 gUnknown_83585C8[128] = {};
-static const u8 gUnknown_8358648[128] = {};
-static const u8 gUnknown_83586C8[32] = {};
-static const u8 gUnknown_83586E8[128] = {};
-static const u8 gUnknown_8358768[128] = {};
-static const u8 gUnknown_83587E8[128] = {};
-static const u8 gUnknown_8358868[32] = {};
-static const u8 gUnknown_8358888[128] = {};
-static const u8 gUnknown_8358908[128] = {};
-static const u8 gUnknown_8358988[128] = {};
-static const u8 gUnknown_8358A08[32] = {};
-static const u8 gUnknown_8358A28[128] = {};
-static const u8 gUnknown_8358AA8[128] = {};
-static const u8 gUnknown_8358B28[128] = {};
-static const u8 gUnknown_8358BA8[32] = {};
-static const u8 gUnknown_8358BC8[128] = {};
-static const u8 gUnknown_8358C48[128] = {};
-static const u8 gUnknown_8358CC8[128] = {};
-static const u8 gUnknown_8358D48[32] = {};
-static const u8 gUnknown_8358D68[128] = {};
-static const u8 gUnknown_8358DE8[128] = {};
-static const u8 gUnknown_8358E68[128] = {};
-static const u8 gUnknown_8358EE8[32] = {};
-static const u8 gUnknown_8358F08[128] = {};
-static const u8 gUnknown_8358F88[128] = {};
-static const u8 gUnknown_8359008[128] = {};
-static const u8 gUnknown_8359088[32] = {};
-static const u8 gUnknown_83590A8[128] = {};
-static const u8 gUnknown_8359128[128] = {};
-static const u8 gUnknown_83591A8[128] = {};
-static const u8 gUnknown_8359228[32] = {};
-static const u8 gUnknown_8359248[128] = {};
-static const u8 gUnknown_83592C8[128] = {};
-static const u8 gUnknown_8359348[128] = {};
-static const u8 gUnknown_83593C8[32] = {};
-static const u8 gUnknown_83593E8[128] = {};
-static const u8 gUnknown_8359468[128] = {};
-static const u8 gUnknown_83594E8[128] = {};
-static const u8 gUnknown_8359568[32] = {};
-static const u8 gUnknown_8359588[] = INCBIN_U8("graphics/door_anims/frame_8359588_1.4bpp", "graphics/door_anims/frame_8359588_2.4bpp");
-static const u8 gUnknown_8359688[256] = {};
-static const u8 gUnknown_8359788[] = INCBIN_U8("graphics/door_anims/frame_8359788_1.4bpp", "graphics/door_anims/frame_8359788_2.4bpp", "graphics/door_anims/frame_8359788_3.4bpp", "graphics/door_anims/frame_8359788_4.4bpp");
-static const u8 gUnknown_8359888[256] = {};
-static const u8 gUnknown_8359988[] = INCBIN_U8("graphics/door_anims/frame_8359988_1.4bpp", "graphics/door_anims/frame_8359988_2.4bpp", "graphics/door_anims/frame_8359988_3.4bpp", "graphics/door_anims/frame_8359988_4.4bpp");
-static const u8 gUnknown_8359A88[256] = {};
-static const u8 gUnknown_8359B88[] = INCBIN_U8("graphics/door_anims/frame_8359B88_1.4bpp", "graphics/door_anims/frame_8359B88_2.4bpp", "graphics/door_anims/frame_8359B88_3.4bpp", "graphics/door_anims/frame_8359B88_4.4bpp");
-static const u8 gUnknown_8359C88[32] = {};
-static const u8 gUnknown_8359CA8[] = INCBIN_U8("graphics/door_anims/frame_8359CA8_1.4bpp", "graphics/door_anims/frame_8359CA8_2.4bpp", "graphics/door_anims/frame_8359CA8_3.4bpp");
-static const u8 gUnknown_8359FA8[32] = {};
-static const u8 gUnknown_8359FC8[] = INCBIN_U8("graphics/door_anims/frame_8359FC8_1.4bpp", "graphics/door_anims/frame_8359FC8_2.4bpp", "graphics/door_anims/frame_8359FC8_3.4bpp");
-static const u8 gUnknown_835A148[32] = {};
-static const u8 gUnknown_835A168[] = INCBIN_U8("graphics/door_anims/frame_835A168_1.4bpp", "graphics/door_anims/frame_835A168_2.4bpp", "graphics/door_anims/frame_835A168_3.4bpp");
-static const u8 gUnknown_835A2E8[32] = {};
-static const u8 gUnknown_835A308[] = INCBIN_U8("graphics/door_anims/frame_835A308_1.4bpp", "graphics/door_anims/frame_835A308_2.4bpp", "graphics/door_anims/frame_835A308_3.4bpp");
-static const u8 gUnknown_835A488[32] = {};
-static const u8 gUnknown_835A4A8[] = INCBIN_U8("graphics/door_anims/frame_835A4A8_1.4bpp", "graphics/door_anims/frame_835A4A8_2.4bpp", "graphics/door_anims/frame_835A4A8_3.4bpp");
-static const u8 gUnknown_835A628[32] = {};
-static const u8 gUnknown_835A648[] = INCBIN_U8("graphics/door_anims/frame_835A648_1.4bpp", "graphics/door_anims/frame_835A648_2.4bpp", "graphics/door_anims/frame_835A648_3.4bpp");
-static const u8 gUnknown_835A7C8[32] = {};
-static const u8 gUnknown_835A7E8[] = INCBIN_U8("graphics/door_anims/frame_835A7E8_1.4bpp", "graphics/door_anims/frame_835A7E8_2.4bpp", "graphics/door_anims/frame_835A7E8_3.4bpp");
-static const u8 gUnknown_835A968[32] = {};
-static const u8 gUnknown_835A988[] = INCBIN_U8("graphics/door_anims/frame_835A988_1.4bpp", "graphics/door_anims/frame_835A988_2.4bpp", "graphics/door_anims/frame_835A988_3.4bpp");
-static const u8 gUnknown_835AB08[32] = {};
-static const u8 gUnknown_835AB28[] = INCBIN_U8("graphics/door_anims/frame_835AB28_1.4bpp", "graphics/door_anims/frame_835AB28_2.4bpp", "graphics/door_anims/frame_835AB28_3.4bpp");
-static const u8 gUnknown_835AE28[32] = {};
-static const u8 gUnknown_835AE48[] = INCBIN_U8("graphics/door_anims/frame_835AE48_1.4bpp", "graphics/door_anims/frame_835AE48_2.4bpp", "graphics/door_anims/frame_835AE48_3.4bpp");
-static const u8 gUnknown_835B148[32] = {};
-static const u8 gUnknown_835B168[] = INCBIN_U8("graphics/door_anims/frame_835B168_1.4bpp", "graphics/door_anims/frame_835B168_2.4bpp", "graphics/door_anims/frame_835B168_3.4bpp");
-static const u8 gUnknown_835B468[32] = {};
+static s8 GetDoorSoundType(const struct DoorGraphics * gfx, int x, int y);
+
+static const u8 sDoorAnimTiles_General[] = INCBIN_U8("graphics/door_anims/general.4bpp");
+static const u16 sDoorNullPalette1[16] = {};
+static const u8 sDoorAnimTiles_SlidingSingle[] = INCBIN_U8("graphics/door_anims/sliding_single.4bpp");
+static const u16 sDoorNullPalette2[16] = {};
+static const u8 sDoorAnimTiles_SlidingDouble[] = INCBIN_U8("graphics/door_anims/sliding_double.4bpp");
+static const u16 sDoorNullPalette3[16] = {};
+static const u8 sDoorAnimTiles_Pallet[] = INCBIN_U8("graphics/door_anims/pallet.4bpp");
+static const u16 sDoorNullPalette4[16] = {};
+static const u8 sDoorAnimTiles_OaksLab[] = INCBIN_U8("graphics/door_anims/oaks_lab.4bpp");
+static const u16 sDoorNullPalette5[16] = {};
+static const u8 sDoorAnimTiles_Viridian[] = INCBIN_U8("graphics/door_anims/viridian.4bpp");
+static const u16 sDoorNullPalette6[16] = {};
+static const u8 sDoorAnimTiles_Pewter[] = INCBIN_U8("graphics/door_anims/pewter.4bpp");
+static const u16 sDoorNullPalette7[16] = {};
+static const u8 sDoorAnimTiles_Saffron[] = INCBIN_U8("graphics/door_anims/saffron.4bpp");
+static const u16 sDoorNullPalette8[16] = {};
+static const u8 sDoorAnimTiles_SilphCo[] = INCBIN_U8("graphics/door_anims/silph_co.4bpp");
+static const u16 sDoorNullPalette9[16] = {};
+static const u8 sDoorAnimTiles_Cerulean[] = INCBIN_U8("graphics/door_anims/cerulean.4bpp");
+static const u16 sDoorNullPalette10[16] = {};
+static const u8 sDoorAnimTiles_Lavender[] = INCBIN_U8("graphics/door_anims/lavender.4bpp");
+static const u16 sDoorNullPalette11[16] = {};
+static const u8 sDoorAnimTiles_Vermilion[] = INCBIN_U8("graphics/door_anims/vermilion.4bpp");
+static const u16 sDoorNullPalette12[16] = {};
+static const u8 sDoorAnimTiles_PokemonFanClub[] = INCBIN_U8("graphics/door_anims/pokemon_fan_club.4bpp");
+static const u16 sDoorNullPalette13[16] = {};
+static const u8 sDoorAnimTiles_DeptStore[] = INCBIN_U8("graphics/door_anims/dept_store.4bpp");
+static const u16 sDoorNullPalette14[16] = {};
+static const u8 sDoorAnimTiles_Fuchsia[] = INCBIN_U8("graphics/door_anims/fuchsia.4bpp");
+static const u16 sDoorNullPalette15[16] = {};
+static const u8 sDoorAnimTiles_SafariZone[] = INCBIN_U8("graphics/door_anims/safari_zone.4bpp");
+static const u16 sDoorNullPalette16[16] = {};
+static const u8 sDoorAnimTiles_CinnabarLab[] = INCBIN_U8("graphics/door_anims/cinnabar_lab.4bpp");
+static const u16 sDoorNullPalette17[16] = {};
+static const u8 sDoorAnimTiles_DeptStoreElevator[] = INCBIN_U8("graphics/door_anims/dept_store_elevator.4bpp");
+static const u16 sDoorNullPalette18[16] = {};
+static const u8 sDoorAnimTiles_CableClub[] = INCBIN_U8("graphics/door_anims/cable_club.4bpp");
+static const u16 sDoorNullPalette19[16] = {};
+static const u8 sDoorAnimTiles_HideoutElevator[] = INCBIN_U8("graphics/door_anims/hideout_elevator.4bpp");
+static const u16 sDoorNullPalette20[16] = {};
+static const u8 sDoorAnimTiles_SSAnne[] = INCBIN_U8("graphics/door_anims/ss_anne.4bpp");
+static const u16 sDoorNullPalette21[16] = {};
+
+// Doors from R/S dummied below
+static const u8 sDoorAnimTiles_Empty1[256 * 3] = {};
+static const u16 sDoorNullPalette22[16] = {};
+static const u8 sDoorAnimTiles_Empty2[256 * 3] = {};
+static const u16 sDoorNullPalette23[16] = {};
+static const u8 sDoorAnimTiles_Empty3[256 * 3] = {};
+static const u16 sDoorNullPalette24[16] = {};
+static const u8 sDoorAnimTiles_Empty4[256 * 3] = {};
+static const u16 sDoorNullPalette25[16] = {};
+static const u8 sDoorAnimTiles_Empty5[256 * 3] = {};
+static const u16 sDoorNullPalette26[16] = {};
+static const u8 sDoorAnimTiles_Empty6[256 * 3] = {};
+static const u16 sDoorNullPalette27[16] = {};
+static const u8 sDoorAnimTiles_Empty7[256 * 3] = {};
+static const u16 sDoorNullPalette28[16] = {};
+static const u8 sDoorAnimTiles_Empty8[128 * 3] = {};
+static const u16 sDoorNullPalette29[16] = {};
+static const u8 sDoorAnimTiles_Empty9[128 * 3] = {};
+static const u16 sDoorNullPalette30[16] = {};
+static const u8 sDoorAnimTiles_Empty10[128 * 3] = {};
+static const u16 sDoorNullPalette31[16] = {};
+static const u8 sDoorAnimTiles_Empty11[128 * 3] = {};
+static const u16 sDoorNullPalette32[16] = {};
+static const u8 sDoorAnimTiles_Empty12[128 * 3] = {};
+static const u16 sDoorNullPalette33[16] = {};
+static const u8 sDoorAnimTiles_Empty13[128 * 3] = {};
+static const u16 sDoorNullPalette34[16] = {};
+static const u8 sDoorAnimTiles_Empty14[128 * 3] = {};
+static const u16 sDoorNullPalette35[16] = {};
+static const u8 sDoorAnimTiles_Empty15[128 * 3] = {};
+static const u16 sDoorNullPalette36[16] = {};
+static const u8 sDoorAnimTiles_Empty16[128 * 3] = {};
+static const u16 sDoorNullPalette37[16] = {};
+static const u8 sDoorAnimTiles_Empty17[128 * 3] = {};
+static const u16 sDoorNullPalette38[16] = {};
+static const u8 sDoorAnimTiles_Empty18[128 * 3] = {};
+static const u16 sDoorNullPalette39[16] = {};
+static const u8 sDoorAnimTiles_Empty19[128 * 3] = {};
+static const u16 sDoorNullPalette40[16] = {};
+static const u8 sDoorAnimTiles_Empty20[128 * 3] = {};
+static const u16 sDoorNullPalette41[16] = {};
+static const u8 sDoorAnimTiles_Empty21[128 * 3] = {};
+static const u16 sDoorNullPalette42[16] = {};
+static const u8 sDoorAnimTiles_Empty22[128 * 3] = {};
+static const u16 sDoorNullPalette43[16] = {};
+static const u8 sDoorAnimTiles_Empty23[128 * 3] = {};
+static const u16 sDoorNullPalette44[16] = {};
+static const u8 sDoorAnimTiles_Empty24[128 * 3] = {};
+static const u16 sDoorNullPalette45[16] = {};
+static const u8 sDoorAnimTiles_Empty25[128 * 3] = {};
+static const u16 sDoorNullPalette46[16] = {};
+static const u8 sDoorAnimTiles_Empty26[128 * 3] = {};
+static const u16 sDoorNullPalette47[16] = {};
+static const u8 sDoorAnimTiles_Empty27[128 * 3] = {};
+static const u16 sDoorNullPalette48[16] = {};
+static const u8 sDoorAnimTiles_Empty28[128 * 3] = {};
+static const u16 sDoorNullPalette49[16] = {};
+static const u8 sDoorAnimTiles_Empty29[128 * 3] = {};
+static const u16 sDoorNullPalette50[16] = {};
+static const u8 sDoorAnimTiles_Empty30[128 * 3] = {};
+static const u16 sDoorNullPalette51[16] = {};
+static const u8 sDoorAnimTiles_Empty31[128 * 3] = {};
+static const u16 sDoorNullPalette52[16] = {};
+
+// Unused block of door tiles
+static const u8 sDoorAnimTiles_UnusedTop[] = INCBIN_U8("graphics/door_anims/unused_top.4bpp");
+static const u8 sDoorAnimTiles_Empty32[256] = {};
+static const u8 sDoorAnimTiles_UnusedMidTop[] = INCBIN_U8("graphics/door_anims/unused_midtop.4bpp");
+static const u8 sDoorAnimTiles_Empty33[256] = {};
+static const u8 sDoorAnimTiles_UnusedMidBottom[] = INCBIN_U8("graphics/door_anims/unused_midbottom.4bpp");
+static const u8 sDoorAnimTiles_Empty34[256] = {};
+static const u8 sDoorAnimTiles_UnusedBottom[] = INCBIN_U8("graphics/door_anims/unused_bottom.4bpp");
+static const u16 sDoorNullPalette53[16] = {};
+
+// Used FRLG doors resume
+static const u8 sDoorAnimTiles_SilphCoElevator[] = INCBIN_U8("graphics/door_anims/silph_co_elevator.4bpp");
+static const u16 sDoorNullPalette54[16] = {};
+static const u8 sDoorAnimTiles_Sevii123[] = INCBIN_U8("graphics/door_anims/sevii_123.4bpp");
+static const u16 sDoorNullPalette55[16] = {};
+static const u8 sDoorAnimTiles_JoyfulGameCorner[] = INCBIN_U8("graphics/door_anims/joyful_game_corner.4bpp");
+static const u16 sDoorNullPalette56[16] = {};
+static const u8 sDoorAnimTiles_OneIslandPokeCenter[] = INCBIN_U8("graphics/door_anims/one_island_poke_center.4bpp");
+static const u16 sDoorNullPalette57[16] = {};
+static const u8 sDoorAnimTiles_Sevii45[] = INCBIN_U8("graphics/door_anims/sevii_45.4bpp");
+static const u16 sDoorNullPalette58[16] = {};
+static const u8 sDoorAnimTiles_FourIslandDayCare[] = INCBIN_U8("graphics/door_anims/four_island_day_care.4bpp");
+static const u16 sDoorNullPalette59[16] = {};
+static const u8 sDoorAnimTiles_RocketWarehouse[] = INCBIN_U8("graphics/door_anims/rocket_warehouse.4bpp");
+static const u16 sDoorNullPalette60[16] = {};
+static const u8 sDoorAnimTiles_Sevii67[] = INCBIN_U8("graphics/door_anims/sevii_67.4bpp");
+static const u16 sDoorNullPalette61[16] = {};
+static const u8 sDoorAnimTiles_Teleporter[] = INCBIN_U8("graphics/door_anims/teleporter.4bpp");
+static const u16 sDoorNullPalette62[16] = {};
+static const u8 sDoorAnimTiles_TrainerTowerLobbyElevator[] = INCBIN_U8("graphics/door_anims/trainer_tower_lobby_elevator.4bpp");
+static const u16 sDoorNullPalette63[16] = {};
+static const u8 sDoorAnimTiles_TrainerTowerRoofElevator[] = INCBIN_U8("graphics/door_anims/trainer_tower_roof_elevator.4bpp");
+static const u16 sDoorNullPalette64[16] = {};
static const struct DoorAnimFrame sDoorAnimFrames_OpenSmall[] = {
{4, 0xFFFF},
@@ -257,72 +205,72 @@ static const struct DoorAnimFrame sDoorAnimFrames_CloseLarge[] = {
{}
};
-static const u8 gUnknown_835B4D8[] = {0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2};
-static const u8 gUnknown_835B4E0[] = {0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3};
-static const u8 gUnknown_835B4E8[] = {0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3};
-static const u8 gUnknown_835B4F0[] = {0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8};
-static const u8 gUnknown_835B4F8[] = {0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa};
-static const u8 gUnknown_835B500[] = {0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8};
-static const u8 gUnknown_835B508[] = {0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8};
-static const u8 gUnknown_835B510[] = {0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8};
-static const u8 gUnknown_835B518[] = {0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3};
-static const u8 gUnknown_835B520[] = {0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc};
-static const u8 gUnknown_835B528[] = {0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9};
-static const u8 gUnknown_835B530[] = {0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9};
-static const u8 gUnknown_835B538[] = {0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9};
-static const u8 gUnknown_835B540[] = {0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3};
-static const u8 gUnknown_835B548[] = {0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8};
-static const u8 gUnknown_835B550[] = {0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9};
-static const u8 gUnknown_835B558[] = {0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3};
-static const u8 gUnknown_835B560[] = {0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8};
-static const u8 gUnknown_835B568[] = {0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8};
-static const u8 gUnknown_835B570[] = {0xc, 0xc, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2};
-static const u8 gUnknown_835B578[] = {0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7};
-static const u8 gUnknown_835B580[] = {0x8, 0x8, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2};
-static const u8 gUnknown_835B588[] = {0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5};
-static const u8 gUnknown_835B590[] = {0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3};
-static const u8 gUnknown_835B598[] = {0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3};
-static const u8 gUnknown_835B5A0[] = {0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5};
-static const u8 gUnknown_835B5A8[] = {0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3};
-static const u8 gUnknown_835B5B0[] = {0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa};
-static const u8 gUnknown_835B5B8[] = {0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5};
-static const u8 gUnknown_835B5C0[] = {0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8};
-static const u8 gUnknown_835B5C8[] = {0x8, 0x8, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2};
-static const u8 gUnknown_835B5D0[] = {0xb, 0xb, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2};
+static const u8 sDoorAnimPalettes_General[] = {2, 2, 2, 2, 2, 2, 2, 2};
+static const u8 sDoorAnimPalettes_SlidingSingle[] = {3, 3, 3, 3, 3, 3, 3, 3};
+static const u8 sDoorAnimPalettes_SlidingDouble[] = {3, 3, 3, 3, 3, 3, 3, 3};
+static const u8 sDoorAnimPalettes_Pallet[] = {8, 8, 8, 8, 8, 8, 8, 8};
+static const u8 sDoorAnimPalettes_OaksLab[] = {10, 10, 10, 10, 10, 10, 10, 10};
+static const u8 sDoorAnimPalettes_Viridian[] = {8, 8, 8, 8, 8, 8, 8, 8};
+static const u8 sDoorAnimPalettes_Pewter[] = {8, 8, 8, 8, 8, 8, 8, 8};
+static const u8 sDoorAnimPalettes_Saffron[] = {8, 8, 8, 8, 8, 8, 8, 8};
+static const u8 sDoorAnimPalettes_SilphCo[] = {3, 3, 3, 3, 3, 3, 3, 3};
+static const u8 sDoorAnimPalettes_Cerulean[] = {12, 12, 12, 12, 12, 12, 12, 12};
+static const u8 sDoorAnimPalettes_Lavender[] = {9, 9, 9, 9, 9, 9, 9, 9};
+static const u8 sDoorAnimPalettes_Vermilion[] = {9, 9, 9, 9, 9, 9, 9, 9};
+static const u8 sDoorAnimPalettes_PokemonFanClub[] = {9, 9, 9, 9, 9, 9, 9, 9};
+static const u8 sDoorAnimPalettes_DeptStore[] = {3, 3, 3, 3, 3, 3, 3, 3};
+static const u8 sDoorAnimPalettes_Fuchsia[] = {8, 8, 8, 8, 8, 8, 8, 8};
+static const u8 sDoorAnimPalettes_SafariZone[] = {9, 9, 9, 9, 9, 9, 9, 9};
+static const u8 sDoorAnimPalettes_CinnabarLab[] = {3, 3, 3, 3, 3, 3, 3, 3};
+static const u8 sDoorAnimPalettes_DeptStoreElevator[] = {8, 8, 8, 8, 8, 8, 8, 8};
+static const u8 sDoorAnimPalettes_CableClub[] = {8, 8, 8, 8, 8, 8, 8, 8};
+static const u8 sDoorAnimPalettes_HideoutElevator[] = {12, 12, 2, 2, 2, 2, 2, 2};
+static const u8 sDoorAnimPalettes_SSAnne[] = {7, 7, 7, 7, 7, 7, 7, 7};
+static const u8 sDoorAnimPalettes_SilphCoElevator[] = {8, 8, 2, 2, 2, 2, 2, 2};
+static const u8 sDoorAnimPalettes_Sevii123[] = {5, 5, 5, 5, 5, 5, 5, 5};
+static const u8 sDoorAnimPalettes_JoyfulGameCorner[] = {3, 3, 3, 3, 3, 3, 3, 3};
+static const u8 sDoorAnimPalettes_OneIslandPokeCenter[] = {3, 3, 3, 3, 3, 3, 3, 3};
+static const u8 sDoorAnimPalettes_Sevii45[] = {5, 5, 5, 5, 5, 5, 5, 5};
+static const u8 sDoorAnimPalettes_FourIslandDayCare[] = {3, 3, 3, 3, 3, 3, 3, 3};
+static const u8 sDoorAnimPalettes_RocketWarehouse[] = {10, 10, 10, 10, 10, 10, 10, 10};
+static const u8 sDoorAnimPalettes_Sevii67[] = {5, 5, 5, 5, 5, 5, 5, 5};
+static const u8 sDoorAnimPalettes_Teleporter[] = {8, 8, 8, 8, 8, 8, 8, 8};
+static const u8 sDoorAnimPalettes_TrainerTowerLobbyElevator[] = {8, 8, 2, 2, 2, 2, 2, 2};
+static const u8 sDoorAnimPalettes_TrainerTowerRoofElevator[] = {11, 11, 2, 2, 2, 2, 2, 2};
static const struct DoorGraphics sDoorGraphics[] = {
- {0x03d, 0, 0, gUnknown_8353088, gUnknown_835B4D8},
- {0x062, 1, 0, gUnknown_8353228, gUnknown_835B4E0},
- {0x15b, 1, 0, gUnknown_83533C8, gUnknown_835B4E8},
- {0x2a3, 0, 0, gUnknown_8353568, gUnknown_835B4F0},
- {0x2ac, 0, 0, gUnknown_8353708, gUnknown_835B4F8},
- {0x299, 0, 0, gUnknown_83538A8, gUnknown_835B500},
- {0x2ce, 0, 0, gUnknown_8353A48, gUnknown_835B508},
- {0x284, 0, 0, gUnknown_8353BE8, gUnknown_835B510},
- {0x2bc, 1, 0, gUnknown_8353D88, gUnknown_835B518},
- {0x298, 0, 0, gUnknown_8353F28, gUnknown_835B520},
- {0x2a2, 0, 0, gUnknown_83540C8, gUnknown_835B528},
- {0x29e, 0, 0, gUnknown_8354268, gUnknown_835B530},
- {0x2e1, 0, 0, gUnknown_8354408, gUnknown_835B538},
- {0x294, 1, 0, gUnknown_83545A8, gUnknown_835B540},
- {0x2bf, 0, 0, gUnknown_8354748, gUnknown_835B548},
- {0x2d2, 1, 0, gUnknown_83548E8, gUnknown_835B550},
- {0x2ad, 0, 0, gUnknown_8354A88, gUnknown_835B558},
- {0x297, 0, 0, gUnknown_8359FC8, gUnknown_835B588},
- {0x29b, 1, 0, gUnknown_835A168, gUnknown_835B590},
- {0x2eb, 0, 0, gUnknown_835A308, gUnknown_835B598},
- {0x29a, 0, 0, gUnknown_835A4A8, gUnknown_835B5A0},
- {0x2b9, 0, 0, gUnknown_835A648, gUnknown_835B5A8},
- {0x2af, 0, 0, gUnknown_835A7E8, gUnknown_835B5B0},
- {0x30c, 0, 0, gUnknown_835A988, gUnknown_835B5B8},
- {0x28d, 1, 1, gUnknown_8354C28, gUnknown_835B560},
- {0x2de, 1, 1, gUnknown_8354F48, gUnknown_835B568},
- {0x2ab, 1, 1, gUnknown_8355268, gUnknown_835B570},
- {0x281, 0, 1, gUnknown_8355588, gUnknown_835B578},
- {0x2e2, 1, 1, gUnknown_8359CA8, gUnknown_835B580},
- {0x296, 1, 1, gUnknown_835AB28, gUnknown_835B5C0},
- {0x2c3, 1, 1, gUnknown_835AE48, gUnknown_835B5C8},
- {0x356, 1, 1, gUnknown_835B168, gUnknown_835B5D0},
+ {METATILE_General_Door, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_General, sDoorAnimPalettes_General},
+ {METATILE_General_SlidingSingleDoor, DOOR_SOUND_SLIDING, 0, sDoorAnimTiles_SlidingSingle, sDoorAnimPalettes_SlidingSingle},
+ {METATILE_General_SlidingDoubleDoor, DOOR_SOUND_SLIDING, 0, sDoorAnimTiles_SlidingDouble, sDoorAnimPalettes_SlidingDouble},
+ {METATILE_PalletTown_Door, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_Pallet, sDoorAnimPalettes_Pallet},
+ {METATILE_PalletTown_OaksLabDoor, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_OaksLab, sDoorAnimPalettes_OaksLab},
+ {METATILE_ViridianCity_Door, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_Viridian, sDoorAnimPalettes_Viridian},
+ {METATILE_PewterCity_Door, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_Pewter, sDoorAnimPalettes_Pewter},
+ {METATILE_SaffronCity_Door, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_Saffron, sDoorAnimPalettes_Saffron},
+ {METATILE_SaffronCity_SilphCoDoor, DOOR_SOUND_SLIDING, 0, sDoorAnimTiles_SilphCo, sDoorAnimPalettes_SilphCo},
+ {METATILE_CeruleanCity_Door, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_Cerulean, sDoorAnimPalettes_Cerulean},
+ {METATILE_LavenderTown_Door, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_Lavender, sDoorAnimPalettes_Lavender},
+ {METATILE_VermilionCity_Door, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_Vermilion, sDoorAnimPalettes_Vermilion},
+ {METATILE_VermilionCity_PokemonFanClubDoor, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_PokemonFanClub, sDoorAnimPalettes_PokemonFanClub},
+ {METATILE_CeladonCity_DeptStoreDoor, DOOR_SOUND_SLIDING, 0, sDoorAnimTiles_DeptStore, sDoorAnimPalettes_DeptStore},
+ {METATILE_FuchsiaCity_Door, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_Fuchsia, sDoorAnimPalettes_Fuchsia},
+ {METATILE_FuchsiaCity_SafariZoneDoor, DOOR_SOUND_SLIDING, 0, sDoorAnimTiles_SafariZone, sDoorAnimPalettes_SafariZone},
+ {METATILE_CinnabarIsland_LabDoor, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_CinnabarLab, sDoorAnimPalettes_CinnabarLab},
+ {METATILE_SeviiIslands123_Door, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_Sevii123, sDoorAnimPalettes_Sevii123},
+ {METATILE_SeviiIslands123_GameCornerDoor, DOOR_SOUND_SLIDING, 0, sDoorAnimTiles_JoyfulGameCorner, sDoorAnimPalettes_JoyfulGameCorner},
+ {METATILE_SeviiIslands123_PokeCenterDoor, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_OneIslandPokeCenter, sDoorAnimPalettes_OneIslandPokeCenter},
+ {METATILE_SeviiIslands45_Door, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_Sevii45, sDoorAnimPalettes_Sevii45},
+ {METATILE_SeviiIslands45_DayCareDoor, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_FourIslandDayCare, sDoorAnimPalettes_FourIslandDayCare},
+ {METATILE_SeviiIslands45_RocketWarehouseDoor_Unlocked, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_RocketWarehouse, sDoorAnimPalettes_RocketWarehouse},
+ {METATILE_SeviiIslands67_Door, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_Sevii67, sDoorAnimPalettes_Sevii67},
+ {METATILE_DepartmentStore_ElevatorDoor, DOOR_SOUND_SLIDING, 1, sDoorAnimTiles_DeptStoreElevator, sDoorAnimPalettes_DeptStoreElevator},
+ {METATILE_PokemonCenter_CableClubDoor, DOOR_SOUND_SLIDING, 1, sDoorAnimTiles_CableClub, sDoorAnimPalettes_CableClub},
+ {METATILE_SilphCo_HideoutElevatorDoor, DOOR_SOUND_SLIDING, 1, sDoorAnimTiles_HideoutElevator, sDoorAnimPalettes_HideoutElevator},
+ {METATILE_SSAnne_Door, DOOR_SOUND_NORMAL, 1, sDoorAnimTiles_SSAnne, sDoorAnimPalettes_SSAnne},
+ {METATILE_SilphCo_ElevatorDoor, DOOR_SOUND_SLIDING, 1, sDoorAnimTiles_SilphCoElevator, sDoorAnimPalettes_SilphCoElevator},
+ {METATILE_SeaCottage_Teleporter_Door, DOOR_SOUND_SLIDING, 1, sDoorAnimTiles_Teleporter, sDoorAnimPalettes_Teleporter},
+ {METATILE_TrainerTower_LobbyElevatorDoor, DOOR_SOUND_SLIDING, 1, sDoorAnimTiles_TrainerTowerLobbyElevator, sDoorAnimPalettes_TrainerTowerLobbyElevator},
+ {METATILE_TrainerTower_RoofElevatorDoor, DOOR_SOUND_SLIDING, 1, sDoorAnimTiles_TrainerTowerRoofElevator, sDoorAnimPalettes_TrainerTowerRoofElevator},
{}
};
@@ -418,7 +366,7 @@ static bool32 PlayDoorAnimationFrame(const struct DoorGraphics * gfx, const stru
return TRUE;
}
-static const struct DoorGraphics * door_find(const struct DoorGraphics * gfx, u16 id)
+static const struct DoorGraphics * GetDoorGraphics(const struct DoorGraphics * gfx, u16 id)
{
while (gfx->tiles != NULL)
{
@@ -429,16 +377,18 @@ static const struct DoorGraphics * door_find(const struct DoorGraphics * gfx, u1
return NULL;
}
-static s8 task_overworld_door_add_if_inactive(const struct DoorGraphics * gfx, const struct DoorAnimFrame * frames, int a2, int a3)
+static s8 StartDoorAnimationTask(const struct DoorGraphics * gfx, const struct DoorAnimFrame * frames, int x, int y)
{
u8 taskId;
s16 *data;
if (FuncIsActiveTask(Task_AnimateDoor) == TRUE)
return -1;
+
taskId = CreateTask(Task_AnimateDoor, 80);
data = gTasks[taskId].data;
- data[6] = a2;
- data[7] = a3;
+
+ data[6] = x;
+ data[7] = y;
data[1] = (uintptr_t)frames;
data[0] = (uintptr_t)frames >> 16;
data[3] = (uintptr_t)gfx;
@@ -446,14 +396,14 @@ static s8 task_overworld_door_add_if_inactive(const struct DoorGraphics * gfx, c
return taskId;
}
-static void DrawClosedDoor(const struct DoorGraphics * gfx, int a1, int a2)
+static void DrawClosedDoor(const struct DoorGraphics * gfx, int x, int y)
{
- DrawDoorDefaultImage(gfx, a1, a2);
+ DrawDoorDefaultImage(gfx, x, y);
}
static void DrawOpenedDoor(const struct DoorGraphics * gfx, int x, int y)
{
- gfx = door_find(gfx, MapGridGetMetatileIdAt(x, y));
+ gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
if (gfx != NULL)
{
UpdateDrawDoorFrame(gfx, SeekToEndOfDoorAnim(gfx->size == 0 ? sDoorAnimFrames_OpenSmall : sDoorAnimFrames_OpenLarge), x, y);
@@ -469,24 +419,24 @@ static const struct DoorAnimFrame * SeekToEndOfDoorAnim(const struct DoorAnimFra
static s8 AnimateDoorOpenInternal(const struct DoorGraphics * gfx, int x, int y)
{
- gfx = door_find(gfx, MapGridGetMetatileIdAt(x, y));
+ gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
if (gfx == NULL)
return -1;
else if (gfx->size == 0)
- return task_overworld_door_add_if_inactive(gfx, sDoorAnimFrames_OpenSmall, x, y);
+ return StartDoorAnimationTask(gfx, sDoorAnimFrames_OpenSmall, x, y);
else
- return task_overworld_door_add_if_inactive(gfx, sDoorAnimFrames_OpenLarge, x, y);
+ return StartDoorAnimationTask(gfx, sDoorAnimFrames_OpenLarge, x, y);
}
static s8 AnimateDoorCloseInternal(const struct DoorGraphics * gfx, int x, int y)
{
- gfx = door_find(gfx, MapGridGetMetatileIdAt(x, y));
+ gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
if (gfx == NULL)
return -1;
else if (gfx->size == 0)
- return task_overworld_door_add_if_inactive(gfx, sDoorAnimFrames_CloseSmall, x, y);
+ return StartDoorAnimationTask(gfx, sDoorAnimFrames_CloseSmall, x, y);
else
- return task_overworld_door_add_if_inactive(gfx, sDoorAnimFrames_CloseLarge, x, y);
+ return StartDoorAnimationTask(gfx, sDoorAnimFrames_CloseLarge, x, y);
}
void FieldSetDoorOpened(int x, int y)
@@ -522,16 +472,16 @@ bool8 FieldIsDoorAnimationRunning(void)
u16 GetDoorSoundEffect(x, y)
{
- if (!GetDoorOpenType(sDoorGraphics, x, y))
+ if (GetDoorSoundType(sDoorGraphics, x, y) == DOOR_SOUND_NORMAL)
return MUS_W_DOOR;
- else
+ else // DOOR_SOUND_SLIDING
return SE_JIDO_DOA;
}
-static s8 GetDoorOpenType(const struct DoorGraphics * gfx, int x, int y)
+static s8 GetDoorSoundType(const struct DoorGraphics * gfx, int x, int y)
{
- gfx = door_find(gfx, MapGridGetMetatileIdAt(x, y));
+ gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
if (gfx == NULL)
return -1;
- return gfx->sliding;
+ return gfx->sound;
}
diff --git a/src/field_effect.c b/src/field_effect.c
new file mode 100644
index 000000000..082aee32d
--- /dev/null
+++ b/src/field_effect.c
@@ -0,0 +1,3909 @@
+#include "global.h"
+#include "gflib.h"
+#include "data.h"
+#include "decompress.h"
+#include "event_data.h"
+#include "event_object_movement.h"
+#include "field_camera.h"
+#include "field_control_avatar.h"
+#include "field_effect.h"
+#include "field_effect_helpers.h"
+#include "field_effect_scripts.h"
+#include "field_fadetransition.h"
+#include "field_player_avatar.h"
+#include "field_weather.h"
+#include "fieldmap.h"
+#include "help_system.h"
+#include "metatile_behavior.h"
+#include "new_menu_helpers.h"
+#include "overworld.h"
+#include "party_menu.h"
+#include "quest_log.h"
+#include "script.h"
+#include "special_field_anim.h"
+#include "task.h"
+#include "trainer_pokemon_sprites.h"
+#include "trig.h"
+#include "util.h"
+#include "constants/event_object_movement.h"
+#include "constants/metatile_behaviors.h"
+#include "constants/songs.h"
+
+#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))}
+#define FIELD_EFFECT_COUNT 32
+
+EWRAM_DATA u32 gFieldEffectArguments[8] = {0};
+
+static u8 sFieldEffectActiveList[FIELD_EFFECT_COUNT];
+
+static void FieldEffectActiveListAdd(u8 fldeff);
+static bool8 FieldEffectCmd_loadtiles(const u8 **script, u32 *result);
+static bool8 FieldEffectCmd_loadfadedpal(const u8 **script, u32 *result);
+static bool8 FieldEffectCmd_loadpal(const u8 **script, u32 *result);
+static bool8 FieldEffectCmd_callnative(const u8 **script, u32 *result);
+static bool8 FieldEffectCmd_end(const u8 **script, u32 *result);
+static bool8 FieldEffectCmd_loadgfx_callnative(const u8 **script, u32 *result);
+static bool8 FieldEffectCmd_loadtiles_callnative(const u8 **script, u32 *result);
+static bool8 FieldEffectCmd_loadfadedpal_callnative(const u8 **script, u32 *result);
+static void FieldEffectScript_LoadTiles(const u8 **script);
+static void FieldEffectScript_LoadFadedPal(const u8 **script);
+static void FieldEffectScript_LoadPal(const u8 **script);
+static void FieldEffectScript_CallNative(const u8 **script, u32 *result);
+static void FieldEffectFreeTilesIfUnused(u16 tilesTag);
+static void FieldEffectFreePaletteIfUnused(u8 paletteNum);
+static void Task_PokecenterHeal(u8 taskId);
+static void SpriteCB_PokeballGlow(struct Sprite * sprite);
+static void SpriteCB_PokecenterMonitor(struct Sprite * sprite);
+static void SpriteCB_HallOfFameMonitor(struct Sprite * sprite);
+
+static const u16 sNewGameOakObjectSpriteTiles[] = INCBIN_U16("graphics/field_effects/unk_83CA770.4bpp");
+static const u16 sNewGameOakObjectPals[] = INCBIN_U16("graphics/field_effects/unk_83CAF70.gbapal");
+static const u16 sUnknown_83CAF90[] = INCBIN_U16("graphics/field_effects/unk_83CAF90.4bpp");
+static const u16 sUnknown_83CAFB0[] = INCBIN_U16("graphics/field_effects/unk_83CAFB0.gbapal");
+static const u16 sUnknown_83CAFD0[] = INCBIN_U16("graphics/field_effects/unk_83CAFD0.4bpp");
+static const u16 sUnknown_83CB3D0[] = INCBIN_U16("graphics/field_effects/unk_83CB3D0.gbapal");
+static const u16 sUnknown_83CB3F0[] = INCBIN_U16("graphics/field_effects/unk_83CB3F0.4bpp");
+static const u16 sFieldMoveStreaksTiles[] = INCBIN_U16("graphics/field_effects/unk_83CB5F0.4bpp");
+static const u16 sFieldMoveStreaksPalette[] = INCBIN_U16("graphics/field_effects/unk_83CB7F0.gbapal");
+static const u16 sFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/field_effects/unk_83CB810.bin");
+static const u16 sDarknessFieldMoveStreaksTiles[] = INCBIN_U16("graphics/field_effects/unk_83CBA90.4bpp");
+static const u16 sDarknessFieldMoveStreaksPalette[] = INCBIN_U16("graphics/field_effects/unk_83CBB10.gbapal");
+static const u16 sDarknessFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/field_effects/unk_83CBB30.bin");
+static const u16 sFldEffUnk44_Tiles[] = INCBIN_U16("graphics/field_effects/unk_83CBDB0.4bpp");
+
+static bool8 (*const sFldEffScrcmdTable[])(const u8 **script, u32 *result) = {
+ FieldEffectCmd_loadtiles,
+ FieldEffectCmd_loadfadedpal,
+ FieldEffectCmd_loadpal,
+ FieldEffectCmd_callnative,
+ FieldEffectCmd_end,
+ FieldEffectCmd_loadgfx_callnative,
+ FieldEffectCmd_loadtiles_callnative,
+ FieldEffectCmd_loadfadedpal_callnative
+};
+
+static const struct OamData sNewGameOakOamAttributes = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x64),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(64x64),
+ .tileNum = 0x000,
+ .priority = 0,
+ .paletteNum = 0x0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_8x8 = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x8),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(8x8),
+ .tileNum = 0x000,
+ .priority = 0,
+ .paletteNum = 0x0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_16x16 = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x16),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(16x16),
+ .tileNum = 0x000,
+ .priority = 0,
+ .paletteNum = 0x0,
+ .affineParam = 0
+};
+
+static const struct SpriteFrameImage sNewGameOakObjectSpriteFrames[] = {
+ {sNewGameOakObjectSpriteTiles, 0x800}
+};
+
+static const struct SpritePalette sNewGameOakObjectPaletteInfo = {
+ sNewGameOakObjectPals, 4102
+};
+
+static const union AnimCmd sNewGameOakAnim[] = {
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sNewGameOakAnimTable[] = {
+ sNewGameOakAnim
+};
+
+static const struct SpriteTemplate sNewGameOakObjectTemplate = {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 4102,
+ .oam = &sNewGameOakOamAttributes,
+ .anims = sNewGameOakAnimTable,
+ .images = sNewGameOakObjectSpriteFrames,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+const struct SpritePalette gUnknown_83CBE9C = {
+ sUnknown_83CAFB0, 4103
+};
+
+const struct SpritePalette gUnknown_83CBEA4 = {
+ sUnknown_83CB3D0, 4112
+};
+
+static const struct OamData sOamData_83CBEAC = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x16),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(32x16),
+ .tileNum = 0x000,
+ .priority = 0,
+ .paletteNum = 0x0,
+ .affineParam = 0
+};
+
+static const struct SpriteFrameImage sUnknown_83CBEB4[] = {
+ {sUnknown_83CAF90, 0x20}
+};
+
+static const struct SpriteFrameImage sUnknown_83CBEBC[] = {
+ {sUnknown_83CAFD0 + 0x000, 0x100},
+ {sUnknown_83CAFD0 + 0x080, 0x100},
+ {sUnknown_83CAFD0 + 0x100, 0x100},
+ {sUnknown_83CAFD0 + 0x180, 0x100}
+};
+
+static const struct SpriteFrameImage sUnknown_83CBEDC[] = {
+ {sUnknown_83CB3F0 + 0x00, 0x80},
+ {sUnknown_83CB3F0 + 0x40, 0x80},
+ {sUnknown_83CB3F0 + 0x80, 0x80},
+ {sUnknown_83CB3F0 + 0xC0, 0x80}
+};
+
+static const struct Subsprite sUnknown_83CBEFC[] =
+{
+ {
+ .x = -12,
+ .y = -8,
+ .shape = SPRITE_SHAPE(16x8),
+ .size = SPRITE_SIZE(16x8),
+ .tileOffset = 0,
+ .priority = 2
+ }, {
+ .x = 4,
+ .y = -8,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 2,
+ .priority = 2
+ }, {
+ .x = -12,
+ .y = 0,
+ .shape = SPRITE_SHAPE(16x8),
+ .size = SPRITE_SIZE(16x8),
+ .tileOffset = 3,
+ .priority = 2
+ }, {
+ .x = 4,
+ .y = 0,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 5,
+ .priority = 2
+ }
+};
+
+static const struct SubspriteTable sUnknown_83CBF0C = subsprite_table(sUnknown_83CBEFC);
+
+static const struct Subsprite sUnknown_83CBF14[] =
+{
+ {
+ .x = -32,
+ .y = -8,
+ .shape = SPRITE_SHAPE(32x8),
+ .size = SPRITE_SIZE(32x8),
+ .tileOffset = 0,
+ .priority = 2
+ }, {
+ .x = 0,
+ .y = -8,
+ .shape = SPRITE_SHAPE(32x8),
+ .size = SPRITE_SIZE(32x8),
+ .tileOffset = 4,
+ .priority = 2
+ }, {
+ .x = -32,
+ .y = 0,
+ .shape = SPRITE_SHAPE(32x8),
+ .size = SPRITE_SIZE(32x8),
+ .tileOffset = 8,
+ .priority = 2
+ }, {
+ .x = 0,
+ .y = 0,
+ .shape = SPRITE_SHAPE(32x8),
+ .size = SPRITE_SIZE(32x8),
+ .tileOffset = 12,
+ .priority = 2
+ }
+};
+
+static const struct SubspriteTable sUnknown_83CBF24 = subsprite_table(sUnknown_83CBF14);
+
+static const union AnimCmd sUnknown_83CBF2C[] = {
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sUnknown_83CBF34[] = {
+ ANIMCMD_FRAME(1, 5),
+ ANIMCMD_FRAME(2, 5),
+ ANIMCMD_FRAME(3, 7),
+ ANIMCMD_FRAME(2, 5),
+ ANIMCMD_FRAME(1, 5),
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_LOOP(3),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sUnknown_83CBF54[] = {
+ sUnknown_83CBF2C,
+ sUnknown_83CBF34
+};
+
+static const union AnimCmd sUnknown_83CBF5C[] = {
+ ANIMCMD_FRAME(3, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_LOOP(2),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sUnknown_83CBF84[] = {
+ sUnknown_83CBF5C
+};
+
+static const struct SpriteTemplate sUnknown_83CBF88 = {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 4103,
+ .oam = &sOamData_8x8,
+ .anims = sUnknown_83CBF54,
+ .images = sUnknown_83CBEB4,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_PokeballGlow
+};
+
+static const struct SpriteTemplate sUnknown_83CBFA0 = {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 4103,
+ .oam = &sOamData_83CBEAC,
+ .anims = sUnknown_83CBF54,
+ .images = sUnknown_83CBEBC,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_PokecenterMonitor
+};
+
+static const struct SpriteTemplate sUnknown_83CBFB8 = {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 4112,
+ .oam = &sOamData_16x16,
+ .anims = sUnknown_83CBF84,
+ .images = sUnknown_83CBEDC,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_HallOfFameMonitor
+};
+
+
+u32 FieldEffectStart(u8 fldeff)
+{
+ const u8 *script;
+ u32 result;
+ FieldEffectActiveListAdd(fldeff);
+ script = gFieldEffectScriptPointers[fldeff];
+ while (sFldEffScrcmdTable[*script](&script, &result))
+ ;
+ return result;
+}
+
+static bool8 FieldEffectCmd_loadtiles(const u8 **script, u32 *result)
+{
+ (*script)++;
+ FieldEffectScript_LoadTiles(script);
+ return TRUE;
+}
+
+static bool8 FieldEffectCmd_loadfadedpal(const u8 **script, u32 *result)
+{
+ (*script)++;
+ FieldEffectScript_LoadFadedPal(script);
+ return TRUE;
+}
+
+static bool8 FieldEffectCmd_loadpal(const u8 **script, u32 *result)
+{
+ (*script)++;
+ FieldEffectScript_LoadPal(script);
+ return TRUE;
+}
+static bool8 FieldEffectCmd_callnative(const u8 **script, u32 *result)
+{
+ (*script)++;
+ FieldEffectScript_CallNative(script, result);
+ return TRUE;
+}
+
+static bool8 FieldEffectCmd_end(const u8 **script, u32 *result)
+{
+ return FALSE;
+}
+
+static bool8 FieldEffectCmd_loadgfx_callnative(const u8 **script, u32 *result)
+{
+ (*script)++;
+ FieldEffectScript_LoadTiles(script);
+ FieldEffectScript_LoadFadedPal(script);
+ FieldEffectScript_CallNative(script, result);
+ return TRUE;
+}
+
+static bool8 FieldEffectCmd_loadtiles_callnative(const u8 **script, u32 *result)
+{
+ (*script)++;
+ FieldEffectScript_LoadTiles(script);
+ FieldEffectScript_CallNative(script, result);
+ return TRUE;
+}
+
+static bool8 FieldEffectCmd_loadfadedpal_callnative(const u8 **script, u32 *result)
+{
+ (*script)++;
+ FieldEffectScript_LoadFadedPal(script);
+ FieldEffectScript_CallNative(script, result);
+ return TRUE;
+}
+
+static u32 FieldEffectScript_ReadWord(const u8 **script)
+{
+ return T2_READ_32(*script);
+}
+
+static void FieldEffectScript_LoadTiles(const u8 **script)
+{
+ const struct SpriteSheet * spriteSheet = (const struct SpriteSheet * )FieldEffectScript_ReadWord(script);
+ if (GetSpriteTileStartByTag(spriteSheet->tag) == 0xFFFF)
+ LoadSpriteSheet(spriteSheet);
+ *script += sizeof(u32);
+}
+
+void sub_8083598(u8 paletteIdx)
+{
+ switch (gUnknown_2036E28)
+ {
+ case 0:
+ return;
+ case 1:
+ TintPalette_GrayScale(&gPlttBufferUnfaded[(paletteIdx + 16) * 16], 0x10);
+ break;
+ case 2:
+ TintPalette_SepiaTone(&gPlttBufferUnfaded[(paletteIdx + 16) * 16], 0x10);
+ break;
+ case 3:
+ sub_8111F38((paletteIdx + 16) * 16, 0x10);
+ TintPalette_GrayScale(&gPlttBufferUnfaded[(paletteIdx + 16) * 16], 0x10);
+ break;
+ default:
+ return;
+ }
+ CpuFastCopy(&gPlttBufferUnfaded[(paletteIdx + 16) * 16], &gPlttBufferFaded[(paletteIdx + 16) * 16], 0x20);
+}
+
+static void FieldEffectScript_LoadFadedPal(const u8 **script)
+{
+ const struct SpritePalette * spritePalette = (const struct SpritePalette * )FieldEffectScript_ReadWord(script);
+ u8 idx = IndexOfSpritePaletteTag(spritePalette->tag);
+ LoadSpritePalette(spritePalette);
+ if (idx == 0xFF)
+ sub_8083598(IndexOfSpritePaletteTag(spritePalette->tag));
+ UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(spritePalette->tag));
+ *script += sizeof(u32);
+}
+
+static void FieldEffectScript_LoadPal(const u8 **script)
+{
+ const struct SpritePalette * spritePalette = (const struct SpritePalette * )FieldEffectScript_ReadWord(script);
+ u8 idx = IndexOfSpritePaletteTag(spritePalette->tag);
+ LoadSpritePalette(spritePalette);
+ if (idx != 0xFF)
+ sub_8083598(IndexOfSpritePaletteTag(spritePalette->tag));
+ *script += sizeof(u32);
+}
+
+static void FieldEffectScript_CallNative(const u8 **script, u32 *result)
+{
+ u32 (*func)(void) = (u32 (*)(void))FieldEffectScript_ReadWord(script);
+ *result = func();
+ *script += sizeof(u32);
+}
+
+static void FieldEffectFreeGraphicsResources(struct Sprite * sprite)
+{
+ u16 tileStart = sprite->sheetTileStart;
+ u8 paletteNum = sprite->oam.paletteNum;
+ DestroySprite(sprite);
+ FieldEffectFreeTilesIfUnused(tileStart);
+ FieldEffectFreePaletteIfUnused(paletteNum);
+}
+
+void FieldEffectStop(struct Sprite * sprite, u8 fldeff)
+{
+ FieldEffectFreeGraphicsResources(sprite);
+ FieldEffectActiveListRemove(fldeff);
+}
+
+static void FieldEffectFreeTilesIfUnused(u16 tileStart)
+{
+ u8 i;
+ u16 tileTag = GetSpriteTileTagByTileStart(tileStart);
+ if (tileTag == SPRITE_INVALID_TAG)
+ return;
+ for (i = 0; i < MAX_SPRITES; i++)
+ {
+ if (gSprites[i].inUse && gSprites[i].usingSheet && tileStart == gSprites[i].sheetTileStart)
+ return;
+ }
+ FreeSpriteTilesByTag(tileTag);
+}
+
+static void FieldEffectFreePaletteIfUnused(u8 paletteNum)
+{
+ u8 i;
+ u16 paletteTag = GetSpritePaletteTagByPaletteNum(paletteNum);
+ if (paletteTag == SPRITE_INVALID_TAG)
+ return;
+ for (i = 0; i < MAX_SPRITES; i++)
+ {
+ if (gSprites[i].inUse && gSprites[i].oam.paletteNum == paletteNum)
+ return;
+ }
+ FreeSpritePaletteByTag(paletteTag);
+}
+
+void FieldEffectActiveListClear(void)
+{
+ u8 i;
+ for (i = 0; i < FIELD_EFFECT_COUNT; i++)
+ {
+ sFieldEffectActiveList[i] = 0xFF;
+ }
+}
+
+static void FieldEffectActiveListAdd(u8 fldeff)
+{
+ u8 i;
+ for (i = 0; i < FIELD_EFFECT_COUNT; i++)
+ {
+ if (sFieldEffectActiveList[i] == 0xFF)
+ {
+ sFieldEffectActiveList[i] = fldeff;
+ return;
+ }
+ }
+}
+
+void FieldEffectActiveListRemove(u8 fldeff)
+{
+ u8 i;
+ for (i = 0; i < FIELD_EFFECT_COUNT; i++)
+ {
+ if (sFieldEffectActiveList[i] == fldeff)
+ {
+ sFieldEffectActiveList[i] = 0xFF;
+ return;
+ }
+ }
+}
+
+bool8 FieldEffectActiveListContains(u8 fldeff)
+{
+ u8 i;
+ for (i = 0; i < FIELD_EFFECT_COUNT; i++)
+ {
+ if (sFieldEffectActiveList[i] == fldeff)
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buffer)
+{
+ struct SpriteTemplate spriteTemplate;
+ LoadCompressedSpritePaletteOverrideBuffer(&gTrainerFrontPicPaletteTable[trainerSpriteID], buffer);
+ LoadCompressedSpriteSheetOverrideBuffer(&gTrainerFrontPicTable[trainerSpriteID], buffer);
+ spriteTemplate.tileTag = gTrainerFrontPicTable[trainerSpriteID].tag;
+ spriteTemplate.paletteTag = gTrainerFrontPicPaletteTable[trainerSpriteID].tag;
+ spriteTemplate.oam = &sNewGameOakOamAttributes;
+ spriteTemplate.anims = gDummySpriteAnimTable;
+ spriteTemplate.images = NULL;
+ spriteTemplate.affineAnims = gDummySpriteAffineAnimTable;
+ spriteTemplate.callback = SpriteCallbackDummy;
+ return CreateSprite(&spriteTemplate, x, y, subpriority);
+}
+
+static void LoadTrainerGfx_TrainerCard(u8 gender, u16 palOffset, u8 *dest)
+{
+ LZDecompressVram(gTrainerFrontPicTable[gender].data, dest);
+ LoadCompressedPalette(gTrainerFrontPicPaletteTable[gender].data, palOffset, 0x20);
+}
+
+static u8 AddNewGameBirchObject(s16 x, s16 y, u8 subpriority)
+{
+ LoadSpritePalette(&sNewGameOakObjectPaletteInfo);
+ return CreateSprite(&sNewGameOakObjectTemplate, x, y, subpriority);
+}
+
+u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority)
+{
+ u16 spriteId = CreateMonPicSprite_HandleDeoxys(species, 0, 0x8000, TRUE, x, y, 0, gMonPaletteTable[species].tag);
+ PreservePaletteInWeather(IndexOfSpritePaletteTag(gMonPaletteTable[species].tag) + 0x10);
+ if (spriteId == 0xFFFF)
+ return MAX_SPRITES;
+ else
+ return spriteId;
+}
+
+static u8 CreateMonSprite_FieldMove(u16 species, u32 otId, u32 personality, s16 x, s16 y, u8 subpriority)
+{
+ const struct CompressedSpritePalette * spritePalette = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality);
+ u16 spriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, 1, x, y, 0, spritePalette->tag);
+ PreservePaletteInWeather(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10);
+ if (spriteId == 0xFFFF)
+ return MAX_SPRITES;
+ else
+ return spriteId;
+}
+
+void FreeResourcesAndDestroySprite(struct Sprite * sprite, u8 spriteId)
+{
+ ResetPreservedPalettesInWeather();
+ if (sprite->oam.affineMode != ST_OAM_AFFINE_OFF)
+ {
+ FreeOamMatrix(sprite->oam.matrixNum);
+ }
+ FreeAndDestroyMonPicSprite(spriteId);
+}
+
+// r, g, b are between 0 and 16
+void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b)
+{
+ int curRed;
+ int curGreen;
+ int curBlue;
+ u16 outPal;
+
+ outPal = gPlttBufferUnfaded[i];
+ curRed = outPal & 0x1f;
+ curGreen = (outPal & (0x1f << 5)) >> 5;
+ curBlue = (outPal & (0x1f << 10)) >> 10;
+ curRed += (((0x1f - curRed) * r) >> 4);
+ curGreen += (((0x1f - curGreen) * g) >> 4);
+ curBlue += (((0x1f - curBlue) * b) >> 4);
+ outPal = curRed;
+ outPal |= curGreen << 5;
+ outPal |= curBlue << 10;
+ gPlttBufferFaded[i] = outPal;
+}
+
+// r, g, b are between 0 and 16
+static void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b)
+{
+ int curRed;
+ int curGreen;
+ int curBlue;
+ u16 outPal;
+
+ outPal = gPlttBufferUnfaded[i];
+ curRed = outPal & 0x1f;
+ curGreen = (outPal & (0x1f << 5)) >> 5;
+ curBlue = (outPal & (0x1f << 10)) >> 10;
+ curRed -= ((curRed * r) >> 4);
+ curGreen -= ((curGreen * g) >> 4);
+ curBlue -= ((curBlue * b) >> 4);
+ outPal = curRed;
+ outPal |= curGreen << 5;
+ outPal |= curBlue << 10;
+ gPlttBufferFaded[i] = outPal;
+}
+
+static void PokecenterHealEffect_0(struct Task * task);
+static void PokecenterHealEffect_1(struct Task * task);
+static void PokecenterHealEffect_2(struct Task * task);
+static void PokecenterHealEffect_3(struct Task * task);
+static void HallOfFameRecordEffect_0(struct Task * task);
+static void HallOfFameRecordEffect_1(struct Task * task);
+static void HallOfFameRecordEffect_2(struct Task * task);
+static void HallOfFameRecordEffect_3(struct Task * task);
+static void Task_HallOfFameRecord(u8 taskId);
+static u8 CreatePokeballGlowSprite(s16 duration, s16 x, s16 y, bool16 fanfare);
+static void SpriteCB_PokeballGlowEffect(struct Sprite * sprite);
+static void PokeballGlowEffect_0(struct Sprite * sprite);
+static void PokeballGlowEffect_1(struct Sprite * sprite);
+static void PokeballGlowEffect_2(struct Sprite * sprite);
+static void PokeballGlowEffect_3(struct Sprite * sprite);
+static void PokeballGlowEffect_4(struct Sprite * sprite);
+static void PokeballGlowEffect_5(struct Sprite * sprite);
+static void PokeballGlowEffect_6(struct Sprite * sprite);
+static void PokeballGlowEffect_7(struct Sprite * sprite);
+static u8 PokecenterHealEffectHelper(s32 x, s32 y);
+static void HallOfFameRecordEffectHelper(s32 x, s32 y);
+
+static void (*const sPokecenterHealTaskCBTable[])(struct Task * ) = {
+ PokecenterHealEffect_0,
+ PokecenterHealEffect_1,
+ PokecenterHealEffect_2,
+ PokecenterHealEffect_3
+};
+
+static void (*const sHallOfFameRecordTaskCBTable[])(struct Task * ) = {
+ HallOfFameRecordEffect_0,
+ HallOfFameRecordEffect_1,
+ HallOfFameRecordEffect_2,
+ HallOfFameRecordEffect_3
+};
+
+static void (*const sPokeballGlowSpriteCBTable[])(struct Sprite * ) = {
+ PokeballGlowEffect_0,
+ PokeballGlowEffect_1,
+ PokeballGlowEffect_2,
+ PokeballGlowEffect_3,
+ PokeballGlowEffect_4,
+ PokeballGlowEffect_5,
+ PokeballGlowEffect_6,
+ PokeballGlowEffect_7
+};
+
+bool8 FldEff_PokecenterHeal(void)
+{
+ u8 nPokemon;
+ struct Task * task;
+
+ nPokemon = CalculatePlayerPartyCount();
+ task = &gTasks[CreateTask(Task_PokecenterHeal, 0xff)];
+ task->data[1] = nPokemon;
+ task->data[2] = 0x5d;
+ task->data[3] = 0x24;
+ task->data[4] = 0x80;
+ task->data[5] = 0x18;
+ return FALSE;
+}
+
+static void Task_PokecenterHeal(u8 taskId)
+{
+ struct Task * task = &gTasks[taskId];
+ sPokecenterHealTaskCBTable[task->data[0]](task);
+}
+
+static void PokecenterHealEffect_0(struct Task * task)
+{
+ task->data[0]++;
+ task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], TRUE);
+ task->data[7] = PokecenterHealEffectHelper(task->data[4], task->data[5]);
+}
+
+static void PokecenterHealEffect_1(struct Task * task)
+{
+ if (gSprites[task->data[6]].data[0] > 1)
+ {
+ gSprites[task->data[7]].data[0]++;
+ task->data[0]++;
+ }
+}
+
+static void PokecenterHealEffect_2(struct Task * task)
+{
+ if (gSprites[task->data[6]].data[0] > 4)
+ {
+ task->data[0]++;
+ }
+}
+
+static void PokecenterHealEffect_3(struct Task * task)
+{
+ if (gSprites[task->data[6]].data[0] > 6)
+ {
+ DestroySprite(&gSprites[task->data[6]]);
+ FieldEffectActiveListRemove(FLDEFF_POKECENTER_HEAL);
+ DestroyTask(FindTaskIdByFunc(Task_PokecenterHeal));
+ }
+}
+
+bool8 FldEff_HallOfFameRecord(void)
+{
+ u8 nPokemon;
+ struct Task * task;
+
+ nPokemon = CalculatePlayerPartyCount();
+ task = &gTasks[CreateTask(Task_HallOfFameRecord, 0xff)];
+ task->data[1] = nPokemon;
+ task->data[2] = 0x75;
+ task->data[3] = 0x3C;
+ return FALSE;
+}
+
+static void Task_HallOfFameRecord(u8 taskId)
+{
+ struct Task * task;
+ task = &gTasks[taskId];
+ sHallOfFameRecordTaskCBTable[task->data[0]](task);
+}
+
+static void HallOfFameRecordEffect_0(struct Task * task)
+{
+ u8 taskId;
+ task->data[0]++;
+ task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], FALSE);
+}
+
+static void HallOfFameRecordEffect_1(struct Task * task)
+{
+ if (gSprites[task->data[6]].data[0] > 1)
+ {
+ HallOfFameRecordEffectHelper(0x78, 0x19);
+ task->data[15]++; // was this ever initialized? is this ever used?
+ task->data[0]++;
+ }
+}
+
+static void HallOfFameRecordEffect_2(struct Task * task)
+{
+ if (gSprites[task->data[6]].data[0] > 4)
+ {
+ task->data[0]++;
+ }
+}
+
+static void HallOfFameRecordEffect_3(struct Task * task)
+{
+ if (gSprites[task->data[6]].data[0] > 6)
+ {
+ DestroySprite(&gSprites[task->data[6]]);
+ FieldEffectActiveListRemove(FLDEFF_HALL_OF_FAME_RECORD);
+ DestroyTask(FindTaskIdByFunc(Task_HallOfFameRecord));
+ }
+}
+
+static u8 CreatePokeballGlowSprite(s16 duration, s16 x, s16 y, bool16 fanfare)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+ spriteId = CreateInvisibleSprite(SpriteCB_PokeballGlowEffect);
+ sprite = &gSprites[spriteId];
+ sprite->pos2.x = x;
+ sprite->pos2.y = y;
+ sprite->subpriority = 0xFF;
+ sprite->data[5] = fanfare;
+ sprite->data[6] = duration;
+ sprite->data[7] = spriteId;
+ return spriteId;
+}
+
+static void SpriteCB_PokeballGlowEffect(struct Sprite * sprite)
+{
+ sPokeballGlowSpriteCBTable[sprite->data[0]](sprite);
+}
+
+static const struct Coords16 sUnknown_83CC010[] = {
+ {0, 0},
+ {6, 0},
+ {0, 4},
+ {6, 4},
+ {0, 8},
+ {6, 8}
+};
+
+static const u8 sUnknown_83CC028[] = {16, 12, 8, 0};
+static const u8 sUnknown_83CC02C[] = {16, 12, 8, 0};
+static const u8 sUnknown_83CC030[] = { 0, 0, 0, 0};
+
+static void PokeballGlowEffect_0(struct Sprite * sprite)
+{
+ u8 endSpriteId;
+ if (sprite->data[1] == 0 || (--sprite->data[1]) == 0)
+ {
+ sprite->data[1] = 25;
+ endSpriteId = CreateSpriteAtEnd(&sUnknown_83CBF88, sUnknown_83CC010[sprite->data[2]].x + sprite->pos2.x, sUnknown_83CC010[sprite->data[2]].y + sprite->pos2.y, 0xFF);
+ gSprites[endSpriteId].oam.priority = 2;
+ gSprites[endSpriteId].data[0] = sprite->data[7];
+ sprite->data[2]++;
+ sprite->data[6]--;
+ PlaySE(SE_BOWA);
+ }
+ if (sprite->data[6] == 0)
+ {
+ sprite->data[1] = 32;
+ sprite->data[0]++;
+ }
+}
+
+static void PokeballGlowEffect_1(struct Sprite * sprite)
+{
+ if ((--sprite->data[1]) == 0)
+ {
+ sprite->data[0]++;
+ sprite->data[1] = 8;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ if (sprite->data[5])
+ {
+ PlayFanfare(MUS_ME_ASA);
+ }
+ }
+}
+
+static void PokeballGlowEffect_2(struct Sprite * sprite)
+{
+ u8 phase;
+ if ((--sprite->data[1]) == 0)
+ {
+ sprite->data[1] = 8;
+ sprite->data[2]++;
+ sprite->data[2] &= 3;
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[3]++;
+ }
+ }
+ phase = (sprite->data[2] + 3) & 3;
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, sUnknown_83CC028[phase], sUnknown_83CC02C[phase], sUnknown_83CC030[phase]);
+ phase = (sprite->data[2] + 2) & 3;
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, sUnknown_83CC028[phase], sUnknown_83CC02C[phase], sUnknown_83CC030[phase]);
+ phase = (sprite->data[2] + 1) & 3;
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, sUnknown_83CC028[phase], sUnknown_83CC02C[phase], sUnknown_83CC030[phase]);
+ phase = sprite->data[2];
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, sUnknown_83CC028[phase], sUnknown_83CC02C[phase], sUnknown_83CC030[phase]);
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, sUnknown_83CC028[phase], sUnknown_83CC02C[phase], sUnknown_83CC030[phase]);
+ if (sprite->data[3] > 2)
+ {
+ sprite->data[0]++;
+ sprite->data[1] = 8;
+ sprite->data[2] = 0;
+ }
+}
+
+static void PokeballGlowEffect_3(struct Sprite * sprite)
+{
+ u8 phase;
+ if ((--sprite->data[1]) == 0)
+ {
+ sprite->data[1] = 8;
+ sprite->data[2]++;
+ sprite->data[2] &= 3;
+ if (sprite->data[2] == 3)
+ {
+ sprite->data[0]++;
+ sprite->data[1] = 30;
+ }
+ }
+ phase = sprite->data[2];
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, sUnknown_83CC028[phase], sUnknown_83CC02C[phase], sUnknown_83CC030[phase]);
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, sUnknown_83CC028[phase], sUnknown_83CC02C[phase], sUnknown_83CC030[phase]);
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, sUnknown_83CC028[phase], sUnknown_83CC02C[phase], sUnknown_83CC030[phase]);
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, sUnknown_83CC028[phase], sUnknown_83CC02C[phase], sUnknown_83CC030[phase]);
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, sUnknown_83CC028[phase], sUnknown_83CC02C[phase], sUnknown_83CC030[phase]);
+}
+
+static void PokeballGlowEffect_4(struct Sprite * sprite)
+{
+ if ((--sprite->data[1]) == 0)
+ {
+ sprite->data[0]++;
+ }
+}
+
+static void PokeballGlowEffect_5(struct Sprite * sprite)
+{
+ sprite->data[0]++;
+}
+
+static void PokeballGlowEffect_6(struct Sprite * sprite)
+{
+ if (sprite->data[5] == 0 || IsFanfareTaskInactive())
+ {
+ sprite->data[0]++;
+ }
+}
+
+static void PokeballGlowEffect_7(struct Sprite * sprite)
+{
+}
+
+static void SpriteCB_PokeballGlow(struct Sprite * sprite)
+{
+ if (gSprites[sprite->data[0]].data[0] > 4)
+ FieldEffectFreeGraphicsResources(sprite);
+}
+
+static u8 PokecenterHealEffectHelper(s32 x, s32 y)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+ spriteId = CreateSpriteAtEnd(&sUnknown_83CBFA0, x, y, 0);
+ sprite = &gSprites[spriteId];
+ sprite->oam.priority = 2;
+ sprite->invisible = TRUE;
+ return spriteId;
+}
+
+static void SpriteCB_PokecenterMonitor(struct Sprite * sprite)
+{
+ if (sprite->data[0] != 0)
+ {
+ sprite->data[0] = 0;
+ sprite->invisible = FALSE;
+ StartSpriteAnim(sprite, 1);
+ }
+ if (sprite->animEnded)
+ FieldEffectFreeGraphicsResources(sprite);
+}
+
+static void HallOfFameRecordEffectHelper(s32 x, s32 y)
+{
+ CreateSpriteAtEnd(&sUnknown_83CBFB8, x, y, 0);
+}
+
+static void SpriteCB_HallOfFameMonitor(struct Sprite * sprite)
+{
+ if (sprite->animEnded)
+ FieldEffectFreeGraphicsResources(sprite);
+}
+
+static void FieldCallback_Fly(void);
+static void Task_FlyOut(u8 taskId);
+static void FieldCallback_FlyArrive(void);
+static void Task_FlyIn(u8 taskId);
+
+void ReturnToFieldFromFlyMapSelect(void)
+{
+ SetMainCallback2(CB2_ReturnToField);
+ gFieldCallback = FieldCallback_Fly;
+}
+
+static void FieldCallback_Fly(void)
+{
+ FadeInFromBlack();
+ CreateTask(Task_FlyOut, 0);
+ ScriptContext2_Enable();
+ FreezeObjectEvents();
+ gFieldCallback = NULL;
+}
+
+static void Task_FlyOut(u8 taskId)
+{
+ struct Task * task;
+ task = &gTasks[taskId];
+ if (task->data[0] == 0)
+ {
+ if (!IsWeatherNotFadingIn())
+ return;
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+ if ((int)gFieldEffectArguments[0] >= PARTY_SIZE)
+ gFieldEffectArguments[0] = 0;
+ FieldEffectStart(FLDEFF_USE_FLY);
+ task->data[0]++;
+ }
+ if (!FieldEffectActiveListContains(FLDEFF_USE_FLY))
+ {
+ Overworld_ResetStateAfterFly();
+ WarpIntoMap();
+ SetMainCallback2(CB2_LoadMap);
+ gFieldCallback = FieldCallback_FlyArrive;
+ DestroyTask(taskId);
+ }
+}
+
+static void FieldCallback_FlyArrive(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ FadeInFromBlack();
+ CreateTask(Task_FlyIn, 0);
+ gObjectEvents[gPlayerAvatar.objectEventId].invisible = TRUE;
+ if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
+ {
+ ObjectEventTurn(&gObjectEvents[gPlayerAvatar.objectEventId], DIR_WEST);
+ }
+ ScriptContext2_Enable();
+ FreezeObjectEvents();
+ gFieldCallback = NULL;
+}
+
+static void Task_FlyIn(u8 taskId)
+{
+ struct Task * task;
+ task = &gTasks[taskId];
+ if (task->data[0] == 0)
+ {
+ if (gPaletteFade.active)
+ {
+ return;
+ }
+ FieldEffectStart(FLDEFF_FLY_IN);
+ task->data[0]++;
+ }
+ if (!FieldEffectActiveListContains(FLDEFF_FLY_IN))
+ {
+ ScriptContext2_Disable();
+ UnfreezeObjectEvents();
+ DestroyTask(taskId);
+ }
+}
+
+static void Task_FallWarpFieldEffect(u8 taskId);
+static bool8 FallWarpEffect_1(struct Task * task);
+static bool8 FallWarpEffect_2(struct Task * task);
+static bool8 FallWarpEffect_3(struct Task * task);
+static bool8 FallWarpEffect_4(struct Task * task);
+static bool8 FallWarpEffect_5(struct Task * task);
+static bool8 FallWarpEffect_6(struct Task * task);
+static bool8 FallWarpEffect_7(struct Task * task);
+
+static bool8 (*const sFallWarpEffectCBPtrs[])(struct Task * task) = {
+ FallWarpEffect_1,
+ FallWarpEffect_2,
+ FallWarpEffect_3,
+ FallWarpEffect_4,
+ FallWarpEffect_5,
+ FallWarpEffect_6,
+ FallWarpEffect_7
+};
+
+void FieldCB_FallWarpExit(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ WarpFadeInScreen();
+ sub_8111CF0();
+ ScriptContext2_Enable();
+ FreezeObjectEvents();
+ CreateTask(Task_FallWarpFieldEffect, 0);
+ gFieldCallback = NULL;
+}
+
+static void Task_FallWarpFieldEffect(u8 taskId)
+{
+ struct Task * task = &gTasks[taskId];
+ while (sFallWarpEffectCBPtrs[task->data[0]](task))
+ ;
+}
+
+static bool8 FallWarpEffect_1(struct Task * task)
+{
+ struct ObjectEvent * playerObject;
+ struct Sprite * playerSprite;
+ playerObject = &gObjectEvents[gPlayerAvatar.objectEventId];
+ playerSprite = &gSprites[gPlayerAvatar.spriteId];
+ CameraObjectReset2();
+ gObjectEvents[gPlayerAvatar.objectEventId].invisible = TRUE;
+ gPlayerAvatar.preventStep = TRUE;
+ ObjectEventSetHeldMovement(playerObject, GetFaceDirectionMovementAction(GetPlayerFacingDirection()));
+ task->data[4] = playerSprite->subspriteMode;
+ playerObject->fixedPriority = TRUE;
+ playerSprite->oam.priority = 1;
+ playerSprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;
+ task->data[0]++;
+ return TRUE;
+}
+
+static bool8 FallWarpEffect_2(struct Task * task)
+{
+ if (IsWeatherNotFadingIn())
+ {
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 FallWarpEffect_3(struct Task * task)
+{
+ struct Sprite * sprite;
+ s16 centerToCornerVecY;
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ centerToCornerVecY = -(sprite->centerToCornerVecY << 1);
+ sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY);
+ task->data[1] = 1;
+ task->data[2] = 0;
+ gObjectEvents[gPlayerAvatar.objectEventId].invisible = FALSE;
+ PlaySE(SE_RU_HYUU);
+ task->data[0]++;
+ return FALSE;
+}
+
+static bool8 FallWarpEffect_4(struct Task * task)
+{
+ struct ObjectEvent * objectEvent;
+ struct Sprite * sprite;
+
+ objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ sprite->pos2.y += task->data[1];
+ if (task->data[1] < 8)
+ {
+ task->data[2] += task->data[1];
+ if (task->data[2] & 0xf)
+ {
+ task->data[1] <<= 1;
+ }
+ }
+ if (task->data[3] == 0 && sprite->pos2.y >= -16)
+ {
+ task->data[3]++;
+ objectEvent->fixedPriority = FALSE;
+ sprite->subspriteMode = task->data[4];
+ objectEvent->triggerGroundEffectsOnMove = TRUE;
+ }
+ if (sprite->pos2.y >= 0)
+ {
+ PlaySE(SE_W070);
+ objectEvent->triggerGroundEffectsOnStop = TRUE;
+ objectEvent->landingJump = TRUE;
+ sprite->pos2.y = 0;
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 FallWarpEffect_5(struct Task * task)
+{
+ task->data[0]++;
+ task->data[1] = 4;
+ task->data[2] = 0;
+ SetCameraPanningCallback(NULL);
+ return TRUE;
+}
+
+static bool8 FallWarpEffect_6(struct Task * task)
+{
+ SetCameraPanning(0, task->data[1]);
+ task->data[1] = -task->data[1];
+ task->data[2]++;
+ if ((task->data[2] & 3) == 0)
+ {
+ task->data[1] >>= 1;
+ }
+ if (task->data[1] == 0)
+ {
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 FallWarpEffect_7(struct Task * task)
+{
+ s16 x, y;
+ gPlayerAvatar.preventStep = FALSE;
+ ScriptContext2_Disable();
+ CameraObjectReset1();
+ UnfreezeObjectEvents();
+ InstallCameraPanAheadCallback();
+ PlayerGetDestCoords(&x, &y);
+ // Seafoam Islands
+ if (sub_8055B38(MapGridGetMetatileBehaviorAt(x, y)) == TRUE)
+ {
+ VarSet(VAR_TEMP_1, 1);
+ SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_SURFING);
+ SetHelpContext(HELPCONTEXT_SURFING);
+ }
+ DestroyTask(FindTaskIdByFunc(Task_FallWarpFieldEffect));
+ return FALSE;
+}
+
+static void Task_EscalatorWarpFieldEffect(u8 taskId);
+static bool8 EscalatorWarpEffect_1(struct Task * task);
+static bool8 EscalatorWarpEffect_2(struct Task * task);
+static bool8 EscalatorWarpEffect_3(struct Task * task);
+static bool8 EscalatorWarpEffect_4(struct Task * task);
+static bool8 EscalatorWarpEffect_5(struct Task * task);
+static bool8 EscalatorWarpEffect_6(struct Task * task);
+static void Escalator_AnimatePlayerGoingDown(struct Task * task);
+static void Escalator_AnimatePlayerGoingUp(struct Task * task);
+static void Escalator_BeginFadeOutToNewMap(void);
+static void Escalator_TransitionToWarpInEffect(void);
+static void FieldCB_EscalatorWarpIn(void);
+static void Task_EscalatorWarpInFieldEffect(u8 taskId);
+static bool8 EscalatorWarpInEffect_1(struct Task * task);
+static bool8 EscalatorWarpInEffect_2(struct Task * task);
+static bool8 EscalatorWarpInEffect_3(struct Task * task);
+static bool8 EscalatorWarpInEffect_4(struct Task * task);
+static bool8 EscalatorWarpInEffect_5(struct Task * task);
+static bool8 EscalatorWarpInEffect_6(struct Task * task);
+static bool8 EscalatorWarpInEffect_7(struct Task * task);
+
+static bool8 (*const sEscalatorWarpFieldEffectFuncs[])(struct Task * task) = {
+ EscalatorWarpEffect_1,
+ EscalatorWarpEffect_2,
+ EscalatorWarpEffect_3,
+ EscalatorWarpEffect_4,
+ EscalatorWarpEffect_5,
+ EscalatorWarpEffect_6
+};
+
+void StartEscalatorWarp(u8 metatileBehavior, u8 priority)
+{
+ u8 taskId = CreateTask(Task_EscalatorWarpFieldEffect, priority);
+ gTasks[taskId].data[1] = 0;
+ if (metatileBehavior == MB_UP_ESCALATOR)
+ gTasks[taskId].data[1] = 1;
+}
+
+static void Task_EscalatorWarpFieldEffect(u8 taskId)
+{
+ struct Task * task = &gTasks[taskId];
+ while (sEscalatorWarpFieldEffectFuncs[task->data[0]](task))
+ ;
+}
+
+static bool8 EscalatorWarpEffect_1(struct Task * task)
+{
+ FreezeObjectEvents();
+ CameraObjectReset2();
+ StartEscalator(task->data[1]);
+ sub_81128BC(1);
+ task->data[0]++;
+ return FALSE;
+}
+
+static bool8 EscalatorWarpEffect_2(struct Task * task)
+{
+ struct ObjectEvent * objectEvent;
+ objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent))
+ {
+ ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(GetPlayerFacingDirection()));
+ task->data[0]++;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ if ((u8)task->data[1] == 0)
+ {
+ task->data[0] = 4;
+ }
+ PlaySE(SE_ESUKA);
+ }
+ return FALSE;
+}
+
+static bool8 EscalatorWarpEffect_3(struct Task * task)
+{
+ Escalator_AnimatePlayerGoingDown(task);
+ if (task->data[2] > 3)
+ {
+ Escalator_BeginFadeOutToNewMap();
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 EscalatorWarpEffect_4(struct Task * task)
+{
+ Escalator_AnimatePlayerGoingDown(task);
+ Escalator_TransitionToWarpInEffect();
+ return FALSE;
+}
+
+static bool8 EscalatorWarpEffect_5(struct Task * task)
+{
+ Escalator_AnimatePlayerGoingUp(task);
+ if (task->data[2] > 3)
+ {
+ Escalator_BeginFadeOutToNewMap();
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 EscalatorWarpEffect_6(struct Task * task)
+{
+ Escalator_AnimatePlayerGoingUp(task);
+ Escalator_TransitionToWarpInEffect();
+ return FALSE;
+}
+
+
+static void Escalator_AnimatePlayerGoingDown(struct Task * task)
+{
+ struct Sprite * sprite;
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ sprite->pos2.x = Cos(0x84, task->data[2]);
+ sprite->pos2.y = Sin(0x94, task->data[2]);
+ task->data[3]++;
+ if (task->data[3] & 1)
+ {
+ task->data[2]++;
+ }
+}
+
+static void Escalator_AnimatePlayerGoingUp(struct Task * task)
+{
+ struct Sprite * sprite;
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ sprite->pos2.x = Cos(0x7c, task->data[2]);
+ sprite->pos2.y = Sin(0x76, task->data[2]);
+ task->data[3]++;
+ if (task->data[3] & 1)
+ {
+ task->data[2]++;
+ }
+}
+
+static void Escalator_BeginFadeOutToNewMap(void)
+{
+ TryFadeOutOldMapMusic();
+ WarpFadeOutScreen();
+}
+
+static void Escalator_TransitionToWarpInEffect(void)
+{
+ if (!gPaletteFade.active && BGMusicStopped() == TRUE)
+ {
+ StopEscalator();
+ WarpIntoMap();
+ gFieldCallback = FieldCB_EscalatorWarpIn;
+ SetMainCallback2(CB2_LoadMap);
+ DestroyTask(FindTaskIdByFunc(Task_EscalatorWarpFieldEffect));
+ }
+}
+
+static bool8 (*const sEscalatorWarpInFieldEffectFuncs[])(struct Task * task) = {
+ EscalatorWarpInEffect_1,
+ EscalatorWarpInEffect_2,
+ EscalatorWarpInEffect_3,
+ EscalatorWarpInEffect_4,
+ EscalatorWarpInEffect_5,
+ EscalatorWarpInEffect_6,
+ EscalatorWarpInEffect_7
+};
+
+static void FieldCB_EscalatorWarpIn(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ WarpFadeInScreen();
+ sub_8111CF0();
+ ScriptContext2_Enable();
+ FreezeObjectEvents();
+ CreateTask(Task_EscalatorWarpInFieldEffect, 0);
+ gFieldCallback = NULL;
+}
+
+static void Task_EscalatorWarpInFieldEffect(u8 taskId)
+{
+ struct Task * task = &gTasks[taskId];
+ while (sEscalatorWarpInFieldEffectFuncs[task->data[0]](task))
+ ;
+}
+
+static bool8 EscalatorWarpInEffect_1(struct Task * task)
+{
+ struct ObjectEvent * objectEvent;
+ s16 x;
+ s16 y;
+ u8 behavior;
+ CameraObjectReset2();
+ objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(DIR_EAST));
+ PlayerGetDestCoords(&x, &y);
+ behavior = MapGridGetMetatileBehaviorAt(x, y);
+ task->data[0]++;
+ task->data[1] = 16;
+ if (behavior == MB_DOWN_ESCALATOR)
+ {
+ behavior = 1;
+ task->data[0] = 3;
+ } else
+ {
+ behavior = 0;
+ }
+ StartEscalator(behavior);
+ return TRUE;
+}
+
+static bool8 EscalatorWarpInEffect_2(struct Task * task)
+{
+ struct Sprite * sprite;
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ sprite->pos2.x = Cos(0x84, task->data[1]);
+ sprite->pos2.y = Sin(0x94, task->data[1]);
+ task->data[0]++;
+ return FALSE;
+}
+
+static bool8 EscalatorWarpInEffect_3(struct Task * task)
+{
+ struct Sprite * sprite;
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ sprite->pos2.x = Cos(0x84, task->data[1]);
+ sprite->pos2.y = Sin(0x94, task->data[1]);
+ task->data[2]++;
+ if (task->data[2] & 1)
+ {
+ task->data[1]--;
+ }
+ if (task->data[1] == 0)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ task->data[0] = 5;
+ }
+ return FALSE;
+}
+
+
+static bool8 EscalatorWarpInEffect_4(struct Task * task)
+{
+ struct Sprite * sprite;
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ sprite->pos2.x = Cos(0x7c, task->data[1]);
+ sprite->pos2.y = Sin(0x76, task->data[1]);
+ task->data[0]++;
+ return FALSE;
+}
+
+static bool8 EscalatorWarpInEffect_5(struct Task * task)
+{
+ struct Sprite * sprite;
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ sprite->pos2.x = Cos(0x7c, task->data[1]);
+ sprite->pos2.y = Sin(0x76, task->data[1]);
+ task->data[2]++;
+ if (task->data[2] & 1)
+ {
+ task->data[1]--;
+ }
+ if (task->data[1] == 0)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 EscalatorWarpInEffect_6(struct Task * task)
+{
+ if (IsEscalatorMoving())
+ {
+ return FALSE;
+ }
+ StopEscalator();
+ task->data[0]++;
+ return TRUE;
+}
+
+static bool8 EscalatorWarpInEffect_7(struct Task * task)
+{
+ struct ObjectEvent * objectEvent;
+ objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (ObjectEventClearHeldMovementIfFinished(objectEvent))
+ {
+ CameraObjectReset1();
+ ScriptContext2_Disable();
+ UnfreezeObjectEvents();
+ ObjectEventSetHeldMovement(objectEvent, GetWalkNormalMovementAction(DIR_EAST));
+ DestroyTask(FindTaskIdByFunc(Task_EscalatorWarpInFieldEffect));
+ sub_81128BC(2);
+ }
+ return FALSE;
+}
+
+static void Task_UseWaterfall(u8 taskId);
+
+static bool8 waterfall_0_setup(struct Task * task, struct ObjectEvent * playerObj);
+static bool8 waterfall_1_do_anim_probably(struct Task * task, struct ObjectEvent * playerObj);
+static bool8 waterfall_2_wait_anim_finish_probably(struct Task * task, struct ObjectEvent * playerObj);
+static bool8 waterfall_3_move_player_probably(struct Task * task, struct ObjectEvent * playerObj);
+static bool8 waterfall_4_wait_player_move_probably(struct Task * task, struct ObjectEvent * playerObj);
+
+static bool8 (*const sUseWaterfallFieldEffectFuncs[])(struct Task * task, struct ObjectEvent * playerObj) = {
+ waterfall_0_setup,
+ waterfall_1_do_anim_probably,
+ waterfall_2_wait_anim_finish_probably,
+ waterfall_3_move_player_probably,
+ waterfall_4_wait_player_move_probably
+};
+
+u32 FldEff_UseWaterfall(void)
+{
+ u8 taskId = CreateTask(Task_UseWaterfall, 0xFF);
+ gTasks[taskId].data[1] = gFieldEffectArguments[0];
+ Task_UseWaterfall(taskId);
+ return 0;
+}
+
+static void Task_UseWaterfall(u8 taskId)
+{
+ while (sUseWaterfallFieldEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId]))
+ ;
+}
+
+static bool8 waterfall_0_setup(struct Task * task, struct ObjectEvent * playerObj)
+{
+ ScriptContext2_Enable();
+ gPlayerAvatar.preventStep = TRUE;
+ task->data[0]++;
+ return FALSE;
+}
+
+static bool8 waterfall_1_do_anim_probably(struct Task * task, struct ObjectEvent * playerObj)
+{
+ ScriptContext2_Enable();
+ if (!ObjectEventIsMovementOverridden(playerObj))
+ {
+ ObjectEventClearHeldMovementIfFinished(playerObj);
+ gFieldEffectArguments[0] = task->data[1];
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 waterfall_2_wait_anim_finish_probably(struct Task * task, struct ObjectEvent * playerObj)
+{
+ if (FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
+ return FALSE;
+ task->data[0]++;
+ return TRUE;
+}
+
+static bool8 waterfall_3_move_player_probably(struct Task * task, struct ObjectEvent * playerObj)
+{
+ ObjectEventSetHeldMovement(playerObj, sub_8063F2C(DIR_NORTH));
+ task->data[0]++;
+ return FALSE;
+}
+
+static bool8 waterfall_4_wait_player_move_probably(struct Task * task, struct ObjectEvent * playerObj)
+{
+ if (!ObjectEventClearHeldMovementIfFinished(playerObj))
+ return FALSE;
+ if (MetatileBehavior_IsWaterfall(playerObj->currentMetatileBehavior))
+ {
+ task->data[0] = 3;
+ return TRUE;
+ }
+ ScriptContext2_Disable();
+ gPlayerAvatar.preventStep = FALSE;
+ DestroyTask(FindTaskIdByFunc(Task_UseWaterfall));
+ FieldEffectActiveListRemove(FLDEFF_USE_WATERFALL);
+ return FALSE;
+}
+
+static void Task_Dive(u8 taskId);
+static bool8 dive_1_lock(struct Task * task);
+static bool8 dive_2_unknown(struct Task * task);
+static bool8 dive_3_unknown(struct Task * task);
+
+static bool8 (*const sDiveFieldEffectFuncPtrs[])(struct Task * task) = {
+ dive_1_lock,
+ dive_2_unknown,
+ dive_3_unknown
+};
+
+u32 FldEff_UseDive(void)
+{
+ u8 taskId = CreateTask(Task_Dive, 0xFF);
+ gTasks[taskId].data[15] = gFieldEffectArguments[0];
+ gTasks[taskId].data[14] = gFieldEffectArguments[1];
+ Task_Dive(taskId);
+ return 0;
+}
+
+static void Task_Dive(u8 taskId)
+{
+ while (sDiveFieldEffectFuncPtrs[gTasks[taskId].data[0]](&gTasks[taskId]))
+ ;
+}
+
+static bool8 dive_1_lock(struct Task * task)
+{
+ gPlayerAvatar.preventStep = TRUE;
+ task->data[0]++;
+ return FALSE;
+}
+
+static bool8 dive_2_unknown(struct Task * task)
+{
+ ScriptContext2_Enable();
+ gFieldEffectArguments[0] = task->data[15];
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
+ task->data[0]++;
+ return FALSE;
+}
+
+static bool8 dive_3_unknown(struct Task * task)
+{
+ struct MapPosition pos;
+ PlayerGetDestCoords(&pos.x, &pos.y);
+ if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
+ {
+ dive_warp(&pos, gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior);
+ DestroyTask(FindTaskIdByFunc(Task_Dive));
+ FieldEffectActiveListRemove(FLDEFF_USE_DIVE);
+ }
+ return FALSE;
+}
+
+static void Task_LavaridgeGymB1FWarp(u8 taskId);
+static bool8 LavaridgeGymB1FWarpEffect_1(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite);
+static bool8 LavaridgeGymB1FWarpEffect_2(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite);
+static bool8 LavaridgeGymB1FWarpEffect_3(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite);
+static bool8 LavaridgeGymB1FWarpEffect_4(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite);
+static bool8 LavaridgeGymB1FWarpEffect_5(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite);
+static bool8 LavaridgeGymB1FWarpEffect_6(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite);
+static void FieldCB_LavaridgeGymB1FWarpExit(void);
+static void Task_LavaridgeGymB1FWarpExit(u8 taskId);
+static bool8 LavaridgeGymB1FWarpExitEffect_1(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite);
+static bool8 LavaridgeGymB1FWarpExitEffect_2(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite);
+static bool8 LavaridgeGymB1FWarpExitEffect_3(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite);
+static bool8 LavaridgeGymB1FWarpExitEffect_4(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite);
+
+static bool8 (*const sLavaridgeGymB1FWarpEffectFuncs[])(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite) = {
+ LavaridgeGymB1FWarpEffect_1,
+ LavaridgeGymB1FWarpEffect_2,
+ LavaridgeGymB1FWarpEffect_3,
+ LavaridgeGymB1FWarpEffect_4,
+ LavaridgeGymB1FWarpEffect_5,
+ LavaridgeGymB1FWarpEffect_6
+};
+
+void StartLavaridgeGymB1FWarp(u8 priority)
+{
+ CreateTask(Task_LavaridgeGymB1FWarp, priority);
+}
+
+static void Task_LavaridgeGymB1FWarp(u8 taskId)
+{
+ while (sLavaridgeGymB1FWarpEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId], &gSprites[gPlayerAvatar.spriteId]));
+}
+
+static bool8 LavaridgeGymB1FWarpEffect_1(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ FreezeObjectEvents();
+ CameraObjectReset2();
+ SetCameraPanningCallback(NULL);
+ gPlayerAvatar.preventStep = TRUE;
+ objectEvent->fixedPriority = TRUE;
+ task->data[1] = 1;
+ task->data[0]++;
+ return TRUE;
+}
+
+static bool8 LavaridgeGymB1FWarpEffect_2(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ SetCameraPanning(0, task->data[1]);
+ task->data[1] = -task->data[1];
+ task->data[2]++;
+ if (task->data[2] > 7)
+ {
+ task->data[2] = 0;
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 LavaridgeGymB1FWarpEffect_3(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ sprite->pos2.y = 0;
+ task->data[3] = 1;
+ gFieldEffectArguments[0] = objectEvent->currentCoords.x;
+ gFieldEffectArguments[1] = objectEvent->currentCoords.y;
+ gFieldEffectArguments[2] = sprite->subpriority - 1;
+ gFieldEffectArguments[3] = sprite->oam.priority;
+ FieldEffectStart(FLDEFF_LAVARIDGE_GYM_WARP);
+ PlaySE(SE_W153);
+ task->data[0]++;
+ return TRUE;
+}
+
+static bool8 LavaridgeGymB1FWarpEffect_4(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ s16 centerToCornerVecY;
+ SetCameraPanning(0, task->data[1]);
+ if (task->data[1] = -task->data[1], ++task->data[2] <= 17)
+ {
+ if (!(task->data[2] & 1) && (task->data[1] <= 3))
+ {
+ task->data[1] <<= 1;
+ }
+ } else if (!(task->data[2] & 4) && (task->data[1] > 0))
+ {
+ task->data[1] >>= 1;
+ }
+ if (task->data[2] > 6)
+ {
+ centerToCornerVecY = -(sprite->centerToCornerVecY << 1);
+ if (sprite->pos2.y > -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY))
+ {
+ sprite->pos2.y -= task->data[3];
+ if (task->data[3] <= 7)
+ {
+ task->data[3]++;
+ }
+ } else
+ {
+ task->data[4] = 1;
+ }
+ }
+ if (task->data[5] == 0 && sprite->pos2.y < -0x10)
+ {
+ task->data[5]++;
+ objectEvent->fixedPriority = TRUE;
+ sprite->oam.priority = 1;
+ sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;
+ }
+ if (task->data[1] == 0 && task->data[4] != 0)
+ {
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 LavaridgeGymB1FWarpEffect_5(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ TryFadeOutOldMapMusic();
+ WarpFadeOutScreen();
+ task->data[0]++;
+ return FALSE;
+}
+
+static bool8 LavaridgeGymB1FWarpEffect_6(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ if (!gPaletteFade.active && BGMusicStopped() == TRUE)
+ {
+ WarpIntoMap();
+ gFieldCallback = FieldCB_LavaridgeGymB1FWarpExit;
+ SetMainCallback2(CB2_LoadMap);
+ DestroyTask(FindTaskIdByFunc(Task_LavaridgeGymB1FWarp));
+ }
+ return FALSE;
+}
+
+static bool8 (*const sLavaridgeGymB1FWarpExitEffectFuncs[])(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite) = {
+ LavaridgeGymB1FWarpExitEffect_1,
+ LavaridgeGymB1FWarpExitEffect_2,
+ LavaridgeGymB1FWarpExitEffect_3,
+ LavaridgeGymB1FWarpExitEffect_4
+};
+
+static void FieldCB_LavaridgeGymB1FWarpExit(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ WarpFadeInScreen();
+ sub_8111CF0();
+ ScriptContext2_Enable();
+ gFieldCallback = NULL;
+ CreateTask(Task_LavaridgeGymB1FWarpExit, 0);
+}
+
+static void Task_LavaridgeGymB1FWarpExit(u8 taskId)
+{
+ while (sLavaridgeGymB1FWarpExitEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId], &gSprites[gPlayerAvatar.spriteId]));
+}
+
+static bool8 LavaridgeGymB1FWarpExitEffect_1(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ CameraObjectReset2();
+ FreezeObjectEvents();
+ gPlayerAvatar.preventStep = TRUE;
+ objectEvent->invisible = TRUE;
+ task->data[0]++;
+ return FALSE;
+}
+
+static bool8 LavaridgeGymB1FWarpExitEffect_2(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ if (IsWeatherNotFadingIn())
+ {
+ gFieldEffectArguments[0] = objectEvent->currentCoords.x;
+ gFieldEffectArguments[1] = objectEvent->currentCoords.y;
+ gFieldEffectArguments[2] = sprite->subpriority - 1;
+ gFieldEffectArguments[3] = sprite->oam.priority;
+ task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH);
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 LavaridgeGymB1FWarpExitEffect_3(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ sprite = &gSprites[task->data[1]];
+ if (sprite->animCmdIndex > 1)
+ {
+ task->data[0]++;
+ objectEvent->invisible = FALSE;
+ CameraObjectReset1();
+ PlaySE(SE_W091);
+ ObjectEventSetHeldMovement(objectEvent, GetJumpMovementAction(DIR_EAST));
+ }
+ return FALSE;
+}
+
+static bool8 LavaridgeGymB1FWarpExitEffect_4(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ if (ObjectEventClearHeldMovementIfFinished(objectEvent))
+ {
+ gPlayerAvatar.preventStep = FALSE;
+ ScriptContext2_Disable();
+ UnfreezeObjectEvents();
+ DestroyTask(FindTaskIdByFunc(Task_LavaridgeGymB1FWarpExit));
+ }
+ return FALSE;
+}
+
+static void Task_LavaridgeGym1FWarp(u8 taskId);
+static bool8 LavaridgeGym1FWarpEffect_1(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite);
+static bool8 LavaridgeGym1FWarpEffect_2(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite);
+static bool8 LavaridgeGym1FWarpEffect_3(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite);
+static bool8 LavaridgeGym1FWarpEffect_4(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite);
+static bool8 LavaridgeGym1FWarpEffect_5(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite);
+
+static bool8 (*const sLavaridgeGym1FWarpEffectFuncs[])(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite) = {
+ LavaridgeGym1FWarpEffect_1,
+ LavaridgeGym1FWarpEffect_2,
+ LavaridgeGym1FWarpEffect_3,
+ LavaridgeGym1FWarpEffect_4,
+ LavaridgeGym1FWarpEffect_5
+};
+
+// For the ash puff effect when warping off the B1F ash tiles
+u8 FldEff_LavaridgeGymWarp(void)
+{
+ u8 spriteId;
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[33], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ gSprites[spriteId].oam.priority = gFieldEffectArguments[3];
+ gSprites[spriteId].coordOffsetEnabled = TRUE;
+ return spriteId;
+}
+
+void SpriteCB_LavaridgeGymWarp(struct Sprite * sprite)
+{
+ if (sprite->animEnded)
+ {
+ FieldEffectStop(sprite, FLDEFF_LAVARIDGE_GYM_WARP);
+ }
+}
+
+void StartLavaridgeGym1FWarp(u8 priority)
+{
+ CreateTask(Task_LavaridgeGym1FWarp, priority);
+}
+
+static void Task_LavaridgeGym1FWarp(u8 taskId)
+{
+ while(sLavaridgeGym1FWarpEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId], &gSprites[gPlayerAvatar.spriteId]));
+}
+
+static bool8 LavaridgeGym1FWarpEffect_1(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ FreezeObjectEvents();
+ CameraObjectReset2();
+ gPlayerAvatar.preventStep = TRUE;
+ objectEvent->fixedPriority = TRUE;
+ task->data[0]++;
+ return FALSE;
+}
+
+static bool8 LavaridgeGym1FWarpEffect_2(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ if (ObjectEventClearHeldMovementIfFinished(objectEvent))
+ {
+ if (task->data[1] > 3)
+ {
+ gFieldEffectArguments[0] = objectEvent->currentCoords.x;
+ gFieldEffectArguments[1] = objectEvent->currentCoords.y;
+ gFieldEffectArguments[2] = sprite->subpriority - 1;
+ gFieldEffectArguments[3] = sprite->oam.priority;
+ task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH);
+ task->data[0]++;
+ } else
+ {
+ task->data[1]++;
+ ObjectEventSetHeldMovement(objectEvent, GetWalkInPlaceFastMovementAction(objectEvent->facingDirection));
+ PlaySE(SE_FU_ZUZUZU);
+ }
+ }
+ return FALSE;
+}
+
+static bool8 LavaridgeGym1FWarpEffect_3(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ if (gSprites[task->data[1]].animCmdIndex == 2)
+ {
+ objectEvent->invisible = TRUE;
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 LavaridgeGym1FWarpEffect_4(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH))
+ {
+ TryFadeOutOldMapMusic();
+ WarpFadeOutScreen();
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 LavaridgeGym1FWarpEffect_5(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ if (!gPaletteFade.active && BGMusicStopped() == TRUE)
+ {
+ WarpIntoMap();
+ gFieldCallback = FieldCB_FallWarpExit;
+ SetMainCallback2(CB2_LoadMap);
+ DestroyTask(FindTaskIdByFunc(Task_LavaridgeGym1FWarp));
+ }
+ return FALSE;
+}
+
+u8 FldEff_PopOutOfAsh(void)
+{
+ u8 spriteId;
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[32], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ gSprites[spriteId].oam.priority = gFieldEffectArguments[3];
+ gSprites[spriteId].coordOffsetEnabled = TRUE;
+ return spriteId;
+}
+
+void SpriteCB_PopOutOfAsh(struct Sprite * sprite)
+{
+ if (sprite->animEnded)
+ {
+ FieldEffectStop(sprite, FLDEFF_POP_OUT_OF_ASH);
+ }
+}
+
+static void Task_DoEscapeRopeFieldEffect(u8 taskId);
+static void EscapeRopeFieldEffect_Step0(struct Task * task);
+static void EscapeRopeFieldEffect_Step1(struct Task * task);
+static u8 sub_808576C(struct ObjectEvent * playerObj, s16 *a1p, s16 *a2p);
+static bool32 sub_80857F0(struct ObjectEvent * playerObj, s16 *a1p, s16 *a2p);
+static void FieldCallback_EscapeRopeExit(void);
+static void Task_DoEscapeRopeExitFieldEffect(u8 taskId);
+static void EscapeRopeExitFieldEffect_Step0(struct Task * task);
+static void EscapeRopeExitFieldEffect_Step1(struct Task * task);
+
+static void (*const gEscapeRopeFieldEffectFuncs[])(struct Task * task) = {
+ EscapeRopeFieldEffect_Step0,
+ EscapeRopeFieldEffect_Step1
+};
+
+void StartEscapeRopeFieldEffect(void)
+{
+ ScriptContext2_Enable();
+ FreezeObjectEvents();
+ CreateTask(Task_DoEscapeRopeFieldEffect, 80);
+}
+
+static void Task_DoEscapeRopeFieldEffect(u8 taskId)
+{
+ gEscapeRopeFieldEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+static void EscapeRopeFieldEffect_Step0(struct Task * task)
+{
+ task->data[0]++;
+ task->data[13] = 64;
+ task->data[14] = GetPlayerFacingDirection();
+ task->data[15] = 0;
+}
+
+static void EscapeRopeFieldEffect_Step1(struct Task * task)
+{
+ struct ObjectEvent * playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];
+ s16 *data = task->data;
+ sub_808576C(playerObj, &task->data[1], &task->data[2]);
+ if (data[3] < 60)
+ {
+ data[3]++;
+ if (data[3] == 20)
+ {
+ PlaySE(SE_TK_WARPIN);
+ }
+ }
+ else if (data[4] == 0 && !sub_80857F0(playerObj, &task->data[5], &task->data[6]))
+ {
+ TryFadeOutOldMapMusic();
+ WarpFadeOutScreen();
+ data[4] = 1;
+ }
+ if (data[4] == 1 && !gPaletteFade.active && BGMusicStopped() == TRUE)
+ {
+ SetObjectEventDirection(playerObj, task->data[15]);
+ sub_80555E0();
+ WarpIntoMap();
+ gFieldCallback = FieldCallback_EscapeRopeExit;
+ SetMainCallback2(CB2_LoadMap);
+ DestroyTask(FindTaskIdByFunc(Task_DoEscapeRopeFieldEffect));
+ }
+}
+
+static const u8 sUnknown_83CC0E8[] = {
+ [DIR_NONE] = DIR_SOUTH,
+ [DIR_SOUTH] = DIR_WEST,
+ [DIR_WEST] = DIR_NORTH,
+ [DIR_NORTH] = DIR_EAST,
+ [DIR_EAST] = DIR_SOUTH,
+};
+
+static u8 sub_808576C(struct ObjectEvent * playerObj, s16 *delay_p, s16 *stage_p)
+{
+ if (!ObjectEventIsMovementOverridden(playerObj) || ObjectEventClearHeldMovementIfFinished(playerObj))
+ {
+ if (*delay_p != 0 && --(*delay_p) != 0)
+ return playerObj->facingDirection;
+ ObjectEventSetHeldMovement(playerObj, GetFaceDirectionMovementAction(sUnknown_83CC0E8[playerObj->facingDirection]));
+ if (*stage_p < 12)
+ (*stage_p)++;
+ *delay_p = 12 >> (*stage_p); // 12 >> 4 = 0
+ return sUnknown_83CC0E8[playerObj->facingDirection];
+ }
+ return playerObj->facingDirection;
+}
+
+static bool32 sub_80857F0(struct ObjectEvent * playerObj, s16 *state_p, s16 *y_p)
+{
+ struct Sprite * sprite = &gSprites[playerObj->spriteId];
+ switch (*state_p)
+ {
+ case 0:
+ CameraObjectReset2();
+ (*state_p)++;
+ // fallthrough
+ case 1:
+ sprite->pos2.y -= 8;
+ (*y_p) -= 8;
+ if (*y_p <= -16)
+ {
+ playerObj->fixedPriority = TRUE;
+ sprite->oam.priority = 1;
+ sprite->subpriority = 0;
+ sprite->subspriteMode = SUBSPRITES_OFF;
+ (*state_p)++;
+ }
+ break;
+ case 2:
+ sprite->pos2.y -= 8;
+ (*y_p) -= 8;
+ if (*y_p <= -88)
+ {
+ (*state_p)++;
+ return FALSE;
+ }
+ break;
+ case 3:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static void (*const sEscapeRopeExitEffectFuncs[])(struct Task * task) = {
+ EscapeRopeExitFieldEffect_Step0,
+ EscapeRopeExitFieldEffect_Step1
+};
+
+static bool32 sub_80858A4(struct ObjectEvent * playerObj, s16 *state_p, s16 *y_p, s16 *priority_p, s16 *subpriority_p, s16 *subspriteMode_p)
+{
+ struct Sprite * sprite = &gSprites[playerObj->spriteId];
+ switch (*state_p)
+ {
+ case 0:
+ CameraObjectReset2();
+ *y_p = -88;
+ sprite->pos2.y -= 88;
+ *priority_p = sprite->oam.priority;
+ *subpriority_p = sprite->subpriority;
+ *subspriteMode_p = sprite->subspriteMode;
+ playerObj->fixedPriority = TRUE;
+ sprite->oam.priority = 1;
+ sprite->subpriority = 0;
+ sprite->subspriteMode = SUBSPRITES_OFF;
+ (*state_p)++;
+ // fallthrough
+ case 1:
+ sprite->pos2.y += 4;
+ (*y_p) += 4;
+ if (*y_p >= -16)
+ {
+ sprite->oam.priority = *priority_p;
+ sprite->subpriority = *subpriority_p;
+ sprite->subspriteMode = *subspriteMode_p;
+ (*state_p)++;
+ }
+ break;
+ case 2:
+ sprite->pos2.y += 4;
+ (*y_p) += 4;
+ if (*y_p >= 0)
+ {
+ PlaySE(SE_TK_KASYA);
+ CameraObjectReset1();
+ (*state_p)++;
+ return FALSE;
+ }
+ break;
+ case 3:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static void FieldCallback_EscapeRopeExit(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ WarpFadeInScreen();
+ sub_8111CF0();
+ ScriptContext2_Enable();
+ FreezeObjectEvents();
+ gFieldCallback = NULL;
+ gObjectEvents[gPlayerAvatar.objectEventId].invisible = TRUE;
+ CreateTask(Task_DoEscapeRopeExitFieldEffect, 0);
+}
+
+static void Task_DoEscapeRopeExitFieldEffect(u8 taskId)
+{
+ sEscapeRopeExitEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+static void EscapeRopeExitFieldEffect_Step0(struct Task * task)
+{
+ if (IsWeatherNotFadingIn())
+ {
+ PlaySE(SE_TK_WARPOUT);
+ task->data[15] = GetPlayerFacingDirection();
+ task->data[0]++;
+ }
+}
+
+static void EscapeRopeExitFieldEffect_Step1(struct Task * task)
+{
+ s16 *data = task->data;
+ struct ObjectEvent * playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];
+ bool32 finished = sub_80858A4(playerObj, &data[1], &data[2], &data[3], &data[4], &data[5]);
+ playerObj->invisible = FALSE;
+ if (data[6] < 8)
+ data[6]++;
+ else if (data[7] == 0)
+ {
+ data[6]++;
+ data[8] = sub_808576C(playerObj, &data[9], &data[10]);
+ if (data[6] >= 50 && data[8] == data[15])
+ data[7] = 1;
+ }
+ if (!finished && data[8] == data[15] && ObjectEventCheckHeldMovementStatus(playerObj) == TRUE)
+ {
+ playerObj->invisible = FALSE;
+ playerObj->fixedPriority = FALSE;
+ ScriptContext2_Disable();
+ UnfreezeObjectEvents();
+ DestroyTask(FindTaskIdByFunc(Task_DoEscapeRopeExitFieldEffect));
+ }
+}
+
+static void Task_DoTeleportFieldEffect(u8 taskId);
+static void TeleportFieldEffectTask1(struct Task * task);
+static void TeleportFieldEffectTask2(struct Task * task);
+static void TeleportFieldEffectTask3(struct Task * task);
+static void TeleportFieldEffectTask4(struct Task * task);
+static void FieldCallback_TeleportIn(void);
+static void Task_DoTeleportInFieldEffect(u8 taskId);
+static void TeleportInFieldEffectTask1(struct Task * task);
+static void TeleportInFieldEffectTask2(struct Task * task);
+static void TeleportInFieldEffectTask3(struct Task * task);
+
+static void (*const sTeleportEffectFuncs[])(struct Task * ) = {
+ TeleportFieldEffectTask1,
+ TeleportFieldEffectTask2,
+ TeleportFieldEffectTask3,
+ TeleportFieldEffectTask4
+};
+
+void CreateTeleportFieldEffectTask(void)
+{
+ CreateTask(Task_DoTeleportFieldEffect, 0);
+}
+
+static void Task_DoTeleportFieldEffect(u8 taskId)
+{
+ sTeleportEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+static void TeleportFieldEffectTask1(struct Task * task)
+{
+ ScriptContext2_Enable();
+ FreezeObjectEvents();
+ CameraObjectReset2();
+ task->data[15] = GetPlayerFacingDirection();
+ task->data[0]++;
+}
+
+static void TeleportFieldEffectTask2(struct Task * task)
+{
+ u8 spinDirections[5] = {
+ [DIR_NONE] = DIR_SOUTH,
+ [DIR_SOUTH] = DIR_WEST,
+ [DIR_WEST] = DIR_NORTH,
+ [DIR_NORTH] = DIR_EAST,
+ [DIR_EAST] = DIR_SOUTH
+ };
+ struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (task->data[1] == 0 || (--task->data[1]) == 0)
+ {
+ ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]);
+ task->data[1] = 8;
+ task->data[2]++;
+ }
+ if (task->data[2] > 7 && task->data[15] == objectEvent->facingDirection)
+ {
+ task->data[0]++;
+ task->data[1] = 4;
+ task->data[2] = 8;
+ task->data[3] = 1;
+ PlaySE(SE_TK_WARPIN);
+ }
+}
+
+static void TeleportFieldEffectTask3(struct Task * task)
+{
+ u8 spinDirections[5] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH};
+ struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ struct Sprite * sprite = &gSprites[gPlayerAvatar.spriteId];
+ if ((--task->data[1]) <= 0)
+ {
+ task->data[1] = 4;
+ ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]);
+ }
+ sprite->pos1.y -= task->data[3];
+ task->data[4] += task->data[3];
+ if ((--task->data[2]) <= 0 && (task->data[2] = 4, task->data[3] < 8))
+ {
+ task->data[3] <<= 1;
+ }
+ if (task->data[4] > 8 && (sprite->oam.priority = 1, sprite->subspriteMode != SUBSPRITES_OFF))
+ {
+ sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;
+ }
+ if (task->data[4] >= 0xa8)
+ {
+ task->data[0]++;
+ TryFadeOutOldMapMusic();
+ WarpFadeOutScreen();
+ }
+}
+
+static void TeleportFieldEffectTask4(struct Task * task)
+{
+ if (!gPaletteFade.active)
+ {
+ if (BGMusicStopped() == TRUE)
+ {
+ copy_saved_warp3_bank_and_enter_x_to_warp1();
+ WarpIntoMap();
+ SetMainCallback2(CB2_LoadMap);
+ gFieldCallback = FieldCallback_TeleportIn;
+ DestroyTask(FindTaskIdByFunc(Task_DoTeleportFieldEffect));
+ }
+ }
+}
+
+static void (*const sTeleportInEffectFuncs[])(struct Task * ) = {
+ TeleportInFieldEffectTask1,
+ TeleportInFieldEffectTask2,
+ TeleportInFieldEffectTask3
+};
+
+static void FieldCallback_TeleportIn(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ WarpFadeInScreen();
+ sub_8111CF0();
+ ScriptContext2_Enable();
+ FreezeObjectEvents();
+ gFieldCallback = NULL;
+ gObjectEvents[gPlayerAvatar.objectEventId].invisible = TRUE;
+ CameraObjectReset2();
+ CreateTask(Task_DoTeleportInFieldEffect, 0);
+}
+
+static void Task_DoTeleportInFieldEffect(u8 taskId)
+{
+ sTeleportInEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+static void TeleportInFieldEffectTask1(struct Task * task)
+{
+ struct Sprite * sprite;
+ s16 centerToCornerVecY;
+ if (IsWeatherNotFadingIn())
+ {
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ centerToCornerVecY = -(sprite->centerToCornerVecY << 1);
+ sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY);
+ gObjectEvents[gPlayerAvatar.objectEventId].invisible = FALSE;
+ task->data[0]++;
+ task->data[1] = 8;
+ task->data[2] = 1;
+ task->data[14] = sprite->subspriteMode;
+ task->data[15] = GetPlayerFacingDirection();
+ PlaySE(SE_TK_WARPIN);
+ }
+}
+
+static void TeleportInFieldEffectTask2(struct Task * task)
+{
+ u8 spinDirections[5] = {1, 3, 4, 2, 1};
+ struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ struct Sprite * sprite = &gSprites[gPlayerAvatar.spriteId];
+ if ((sprite->pos2.y += task->data[1]) >= -8)
+ {
+ if (task->data[13] == 0)
+ {
+ task->data[13]++;
+ objectEvent->triggerGroundEffectsOnMove = TRUE;
+ sprite->subspriteMode = task->data[14];
+ }
+ } else
+ {
+ sprite->oam.priority = 1;
+ if (sprite->subspriteMode != SUBSPRITES_OFF)
+ {
+ sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;
+ }
+ }
+ if (sprite->pos2.y >= -0x30 && task->data[1] > 1 && !(sprite->pos2.y & 1))
+ {
+ task->data[1]--;
+ }
+ if ((--task->data[2]) == 0)
+ {
+ task->data[2] = 4;
+ ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]);
+ }
+ if (sprite->pos2.y >= 0)
+ {
+ sprite->pos2.y = 0;
+ task->data[0]++;
+ task->data[1] = 1;
+ task->data[2] = 0;
+ }
+}
+
+static void TeleportInFieldEffectTask3(struct Task * task)
+{
+ u8 spinDirections[5] = {1, 3, 4, 2, 1};
+ struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if ((--task->data[1]) == 0)
+ {
+ ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]);
+ task->data[1] = 8;
+ if ((++task->data[2]) > 4 && task->data[14] == objectEvent->facingDirection)
+ {
+ ScriptContext2_Disable();
+ CameraObjectReset1();
+ UnfreezeObjectEvents();
+ DestroyTask(FindTaskIdByFunc(Task_DoTeleportInFieldEffect));
+ }
+ }
+}
+
+static void Task_ShowMon_Outdoors(u8 taskId);
+static void ShowMonEffect_Outdoors_1(struct Task * task);
+static void ShowMonEffect_Outdoors_2(struct Task * task);
+static void ShowMonEffect_Outdoors_3(struct Task * task);
+static void ShowMonEffect_Outdoors_4(struct Task * task);
+static void ShowMonEffect_Outdoors_5(struct Task * task);
+static void ShowMonEffect_Outdoors_6(struct Task * task);
+static void ShowMonEffect_Outdoors_7(struct Task * task);
+static void VBlankCB_ShowMonEffect_Outdoors(void);
+static void LoadFieldMoveStreaksTilemapToVram(u16 screenbase);
+static void Task_ShowMon_Indoors(u8 taskId);
+static void ShowMonEffect_Indoors_1(struct Task * task);
+static void ShowMonEffect_Indoors_2(struct Task * task);
+static void ShowMonEffect_Indoors_3(struct Task * task);
+static void ShowMonEffect_Indoors_4(struct Task * task);
+static void ShowMonEffect_Indoors_5(struct Task * task);
+static void ShowMonEffect_Indoors_6(struct Task * task);
+static void ShowMonEffect_Indoors_7(struct Task * task);
+static void VBlankCB_ShowMonEffect_Indoors(void);
+static void sub_8086728(struct Task * task);
+static bool8 sub_8086738(struct Task * task);
+static bool8 sub_80867F0(struct Task * task);
+static u8 sub_8086860(u32 species, u32 otId, u32 personality);
+static void sub_80868C0(struct Sprite * sprite);
+static void sub_8086904(struct Sprite * sprite);
+static void sub_8086920(struct Sprite * sprite);
+
+static void (*const sShowMonOutdoorsEffectFuncs[])(struct Task * task) = {
+ ShowMonEffect_Outdoors_1,
+ ShowMonEffect_Outdoors_2,
+ ShowMonEffect_Outdoors_3,
+ ShowMonEffect_Outdoors_4,
+ ShowMonEffect_Outdoors_5,
+ ShowMonEffect_Outdoors_6,
+ ShowMonEffect_Outdoors_7
+};
+
+u32 FldEff_FieldMoveShowMon(void)
+{
+ u8 taskId;
+ if (IsMapTypeOutdoors(GetCurrentMapType()) == TRUE)
+ taskId = CreateTask(Task_ShowMon_Outdoors, 0xFF);
+ else
+ taskId = CreateTask(Task_ShowMon_Indoors, 0xFF);
+ gTasks[taskId].data[15] = sub_8086860(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ return 0;
+}
+
+u32 FldEff_FieldMoveShowMonInit(void)
+{
+ u32 r6 = gFieldEffectArguments[0] & 0x80000000;
+ u8 partyIdx = gFieldEffectArguments[0];
+ gFieldEffectArguments[0] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES);
+ gFieldEffectArguments[1] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_OT_ID);
+ gFieldEffectArguments[2] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_PERSONALITY);
+ gFieldEffectArguments[0] |= r6;
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON);
+ FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
+ return 0;
+}
+
+static void Task_ShowMon_Outdoors(u8 taskId)
+{
+ sShowMonOutdoorsEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+static void ShowMonEffect_Outdoors_1(struct Task * task)
+{
+ task->data[11] = GetGpuReg(REG_OFFSET_WININ);
+ task->data[12] = GetGpuReg(REG_OFFSET_WINOUT);
+ StoreWordInTwoHalfwords((u16*)&task->data[13], (u32)gMain.vblankCallback);
+ task->data[1] = WIN_RANGE(0xF0, 0xF1);
+ task->data[2] = WIN_RANGE(0x50, 0x51);
+ task->data[3] = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;
+ task->data[4] = WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR;
+ SetGpuReg(REG_OFFSET_WIN0H, task->data[1]);
+ SetGpuReg(REG_OFFSET_WIN0V, task->data[2]);
+ SetGpuReg(REG_OFFSET_WININ, task->data[3]);
+ SetGpuReg(REG_OFFSET_WINOUT, task->data[4]);
+ SetVBlankCallback(VBlankCB_ShowMonEffect_Outdoors);
+ task->data[0]++;
+}
+
+static void ShowMonEffect_Outdoors_2(struct Task * task)
+{
+ u16 charbase = ((GetGpuReg(REG_OFFSET_BG0CNT) >> 2) << 14);
+ u16 screenbase = ((GetGpuReg(REG_OFFSET_BG0CNT) >> 8) << 11);
+ CpuCopy16(sFieldMoveStreaksTiles, (void *)(VRAM + charbase), 0x200);
+ CpuFill32(0, (void *)(VRAM + screenbase), 0x800);
+ LoadPalette(sFieldMoveStreaksPalette, 0xf0, 0x20);
+ LoadFieldMoveStreaksTilemapToVram(screenbase);
+ task->data[0]++;
+}
+
+static void ShowMonEffect_Outdoors_3(struct Task * task)
+{
+ s16 win0h_lo;
+ s16 win0v_lo;
+ s16 win0v_hi;
+ task->data[5] -= 16;
+ win0h_lo = ((u16)task->data[1] >> 8);
+ win0v_lo = ((u16)task->data[2] >> 8);
+ win0v_hi = ((u16)task->data[2] & 0xff);
+ win0h_lo -= 16;
+ win0v_lo -= 2;
+ win0v_hi += 2;
+ if (win0h_lo < 0)
+ {
+ win0h_lo = 0;
+ }
+ if (win0v_lo < 0x28)
+ {
+ win0v_lo = 0x28;
+ }
+ if (win0v_hi > 0x78)
+ {
+ win0v_hi = 0x78;
+ }
+ task->data[1] = WIN_RANGE(win0h_lo, task->data[1] & 0xff);
+ task->data[2] = WIN_RANGE(win0v_lo, win0v_hi);
+ if (win0h_lo == 0 && win0v_lo == 0x28 && win0v_hi == 0x78)
+ {
+ gSprites[task->data[15]].callback = sub_80868C0;
+ task->data[0]++;
+ }
+}
+
+static void ShowMonEffect_Outdoors_4(struct Task * task)
+{
+ task->data[5] -= 16;
+ if (gSprites[task->data[15]].data[7])
+ {
+ task->data[0]++;
+ }
+}
+
+static void ShowMonEffect_Outdoors_5(struct Task * task)
+{
+ s16 win0v_lo;
+ s16 win0v_hi;
+ task->data[5] -= 16;
+ win0v_lo = (task->data[2] >> 8);
+ win0v_hi = (task->data[2] & 0xff);
+ win0v_lo += 6;
+ win0v_hi -= 6;
+ if (win0v_lo > 0x50)
+ {
+ win0v_lo = 0x50;
+ }
+ if (win0v_hi < 0x51)
+ {
+ win0v_hi = 0x51;
+ }
+ task->data[2] = WIN_RANGE(win0v_lo, win0v_hi);
+ if (win0v_lo == 0x50 && win0v_hi == 0x51)
+ {
+ task->data[0]++;
+ }
+}
+
+static void ShowMonEffect_Outdoors_6(struct Task * task)
+{
+ u16 bg0cnt = (GetGpuReg(REG_OFFSET_BG0CNT) >> 8) << 11;
+ CpuFill32(0, (void *)VRAM + bg0cnt, 0x800);
+ task->data[1] = WIN_RANGE(0x00, 0xf1);
+ task->data[2] = WIN_RANGE(0x00, 0xa1);
+ task->data[3] = task->data[11];
+ task->data[4] = task->data[12];
+ task->data[0]++;
+}
+
+static void ShowMonEffect_Outdoors_7(struct Task * task)
+{
+ IntrCallback callback;
+ LoadWordFromTwoHalfwords((u16 *)&task->data[13], (uintptr_t *)&callback);
+ SetVBlankCallback(callback);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ Menu_LoadStdPal();
+ FreeResourcesAndDestroySprite(&gSprites[task->data[15]], task->data[15]);
+ FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON);
+ DestroyTask(FindTaskIdByFunc(Task_ShowMon_Outdoors));
+}
+
+static void VBlankCB_ShowMonEffect_Outdoors(void)
+{
+ IntrCallback callback;
+ struct Task * task = &gTasks[FindTaskIdByFunc(Task_ShowMon_Outdoors)];
+ LoadWordFromTwoHalfwords((u16 *)&task->data[13], (uintptr_t *)&callback);
+ callback();
+ SetGpuReg(REG_OFFSET_WIN0H, task->data[1]);
+ SetGpuReg(REG_OFFSET_WIN0V, task->data[2]);
+ SetGpuReg(REG_OFFSET_WININ, task->data[3]);
+ SetGpuReg(REG_OFFSET_WINOUT, task->data[4]);
+ SetGpuReg(REG_OFFSET_BG0HOFS, task->data[5]);
+ SetGpuReg(REG_OFFSET_BG0VOFS, task->data[6]);
+}
+
+static void LoadFieldMoveStreaksTilemapToVram(u16 screenbase)
+{
+ u16 i;
+ u16 *dest;
+ dest = (u16 *)(VRAM + (10 * 32) + screenbase);
+ for (i = 0; i < (10 * 32); i++, dest++)
+ {
+ *dest = sFieldMoveStreaksTilemap[i] | METATILE_ELEVATION_MASK;
+ }
+}
+
+static void (*const sShowMonIndoorsEffectFuncs[])(struct Task * ) = {
+ ShowMonEffect_Indoors_1,
+ ShowMonEffect_Indoors_2,
+ ShowMonEffect_Indoors_3,
+ ShowMonEffect_Indoors_4,
+ ShowMonEffect_Indoors_5,
+ ShowMonEffect_Indoors_6,
+ ShowMonEffect_Indoors_7
+};
+
+static void Task_ShowMon_Indoors(u8 taskId)
+{
+ sShowMonIndoorsEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+static void ShowMonEffect_Indoors_1(struct Task * task)
+{
+ SetGpuReg(REG_OFFSET_BG0HOFS, task->data[1]);
+ SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]);
+ StoreWordInTwoHalfwords((u16 *)&task->data[13], (u32)gMain.vblankCallback);
+ SetVBlankCallback(VBlankCB_ShowMonEffect_Indoors);
+ task->data[0]++;
+}
+
+static void ShowMonEffect_Indoors_2(struct Task * task)
+{
+ u16 charbase;
+ u16 screenbase;
+ charbase = ((GetGpuReg(REG_OFFSET_BG0CNT) >> 2) << 14);
+ screenbase = ((GetGpuReg(REG_OFFSET_BG0CNT) >> 8) << 11);
+ task->data[12] = screenbase;
+ CpuCopy16(sDarknessFieldMoveStreaksTiles, (void *)(VRAM + charbase), 0x80);
+ CpuFill32(0, (void *)(VRAM + screenbase), 0x800);
+ LoadPalette(sDarknessFieldMoveStreaksPalette, 0xf0, 0x20);
+ task->data[0]++;
+}
+
+static void ShowMonEffect_Indoors_3(struct Task * task)
+{
+ if (sub_8086738(task))
+ {
+ task->data[5] = GetGpuReg(REG_OFFSET_WININ);
+ SetGpuReg(REG_OFFSET_WININ, (task->data[5] & 0xFF) | WININ_WIN1_BG0 | WININ_WIN1_OBJ);
+ SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(0x00, 0xf0));
+ SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(0x28, 0x78));
+ gSprites[task->data[15]].callback = sub_80868C0;
+ task->data[0]++;
+ }
+ sub_8086728(task);
+}
+
+static void ShowMonEffect_Indoors_4(struct Task * task)
+{
+ sub_8086728(task);
+ if (gSprites[task->data[15]].data[7])
+ {
+ task->data[0]++;
+ }
+}
+
+static void ShowMonEffect_Indoors_5(struct Task * task)
+{
+ sub_8086728(task);
+ task->data[3] = task->data[1] & 7;
+ task->data[4] = 0;
+ SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(0xff, 0xff));
+ SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(0xff, 0xff));
+ SetGpuReg(REG_OFFSET_WININ, task->data[5]);
+ task->data[0]++;
+}
+
+static void ShowMonEffect_Indoors_6(struct Task * task)
+{
+ sub_8086728(task);
+ if (sub_80867F0(task))
+ {
+ task->data[0]++;
+ }
+}
+
+static void ShowMonEffect_Indoors_7(struct Task * task)
+{
+ IntrCallback intrCallback;
+ u16 charbase;
+ charbase = (GetGpuReg(REG_OFFSET_BG0CNT) >> 8) << 11;
+ CpuFill32(0, (void *)VRAM + charbase, 0x800);
+ LoadWordFromTwoHalfwords((u16 *)&task->data[13], (uintptr_t *)&intrCallback);
+ SetVBlankCallback(intrCallback);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ Menu_LoadStdPal();
+ FreeResourcesAndDestroySprite(&gSprites[task->data[15]], task->data[15]);
+ FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON);
+ DestroyTask(FindTaskIdByFunc(Task_ShowMon_Indoors));
+}
+
+static void VBlankCB_ShowMonEffect_Indoors(void)
+{
+ IntrCallback intrCallback;
+ struct Task * task;
+ task = &gTasks[FindTaskIdByFunc(Task_ShowMon_Indoors)];
+ LoadWordFromTwoHalfwords((u16 *)&task->data[13], (uintptr_t *)&intrCallback);
+ intrCallback();
+ SetGpuReg(REG_OFFSET_BG0HOFS, task->data[1]);
+ SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]);
+}
+
+static void sub_8086728(struct Task * task)
+{
+ task->data[1] -= 16;
+ task->data[3] += 16;
+}
+
+static bool8 sub_8086738(struct Task * task)
+{
+ u16 i;
+ u16 srcOffs;
+ u16 dstOffs;
+ u16 *dest;
+ if (task->data[4] >= 32)
+ {
+ return TRUE;
+ }
+ dstOffs = (task->data[3] >> 3) & 0x1f;
+ if (dstOffs >= task->data[4])
+ {
+ dstOffs = (32 - dstOffs) & 0x1f;
+ srcOffs = (32 - task->data[4]) & 0x1f;
+ dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]);
+ for (i = 0; i < 10; i++)
+ {
+ dest[dstOffs + i * 32] = sDarknessFieldMoveStreaksTilemap[srcOffs + i * 32];
+ dest[dstOffs + i * 32] |= 0xf000;
+
+ dest[((dstOffs + 1) & 0x1f) + i * 32] = sDarknessFieldMoveStreaksTilemap[((srcOffs + 1) & 0x1f) + i * 32] | 0xf000;
+ dest[((dstOffs + 1) & 0x1f) + i * 32] |= 0xf000;
+ }
+ task->data[4] += 2;
+ }
+ return FALSE;
+}
+
+static bool8 sub_80867F0(struct Task * task)
+{
+ u16 i;
+ u16 dstOffs;
+ u16 *dest;
+ if (task->data[4] >= 32)
+ {
+ return TRUE;
+ }
+ dstOffs = task->data[3] >> 3;
+ if (dstOffs >= task->data[4])
+ {
+ dstOffs = (task->data[1] >> 3) & 0x1f;
+ dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]);
+ for (i = 0; i < 10; i++)
+ {
+ dest[dstOffs + i * 32] = 0xf000;
+ dest[((dstOffs + 1) & 0x1f) + i * 32] = 0xf000;
+ }
+ task->data[4] += 2;
+ }
+ return FALSE;
+}
+
+static u8 sub_8086860(u32 species, u32 otId, u32 personality)
+{
+ bool16 playCry;
+ u8 monSprite;
+ struct Sprite * sprite;
+ playCry = (species & 0x80000000) >> 16;
+ species &= 0x7fffffff;
+ monSprite = CreateMonSprite_FieldMove(species, otId, personality, 0x140, 0x50, 0);
+ sprite = &gSprites[monSprite];
+ sprite->callback = SpriteCallbackDummy;
+ sprite->oam.priority = 0;
+ sprite->data[0] = species;
+ sprite->data[6] = playCry;
+ return monSprite;
+}
+
+static void sub_80868C0(struct Sprite * sprite)
+{
+ if ((sprite->pos1.x -= 20) <= 0x78)
+ {
+ sprite->pos1.x = 0x78;
+ sprite->data[1] = 30;
+ sprite->callback = sub_8086904;
+ if (sprite->data[6])
+ {
+ PlayCry2(sprite->data[0], 0, 0x7d, 0xa);
+ }
+ else
+ {
+ PlayCry1(sprite->data[0], 0);
+ }
+ }
+}
+
+static void sub_8086904(struct Sprite * sprite)
+{
+ if ((--sprite->data[1]) == 0)
+ {
+ sprite->callback = sub_8086920;
+ }
+}
+
+static void sub_8086920(struct Sprite * sprite)
+{
+ if (sprite->pos1.x < -0x40)
+ {
+ sprite->data[7] = 1;
+ }
+ else
+ {
+ sprite->pos1.x -= 20;
+ }
+}
+
+static void Task_FldEffUseSurf(u8 taskId);
+static void UseSurfEffect_1(struct Task * task);
+static void UseSurfEffect_2(struct Task * task);
+static void UseSurfEffect_3(struct Task * task);
+static void UseSurfEffect_4(struct Task * task);
+static void UseSurfEffect_5(struct Task * task);
+
+static void (*const sUseSurfEffectFuncs[])(struct Task * ) = {
+ UseSurfEffect_1,
+ UseSurfEffect_2,
+ UseSurfEffect_3,
+ UseSurfEffect_4,
+ UseSurfEffect_5,
+};
+
+u8 FldEff_UseSurf(void)
+{
+ u8 taskId = CreateTask(Task_FldEffUseSurf, 0xff);
+ gTasks[taskId].data[15] = gFieldEffectArguments[0];
+ sav1_reset_battle_music_maybe();
+ if (sub_8056124(MUS_NAMINORI))
+ Overworld_ChangeMusicTo(MUS_NAMINORI);
+ return FALSE;
+}
+
+static void Task_FldEffUseSurf(u8 taskId)
+{
+ sUseSurfEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+static void UseSurfEffect_1(struct Task * task)
+{
+ ScriptContext2_Enable();
+ FreezeObjectEvents();
+ gPlayerAvatar.preventStep = TRUE;
+ SetPlayerAvatarStateMask(8);
+ PlayerGetDestCoords(&task->data[1], &task->data[2]);
+ MoveCoords(gObjectEvents[gPlayerAvatar.objectEventId].movementDirection, &task->data[1], &task->data[2]);
+ task->data[0]++;
+}
+
+static void UseSurfEffect_2(struct Task * task)
+{
+ struct ObjectEvent * objectEvent;
+ objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent))
+ {
+ sub_805CB70();
+ ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);
+ task->data[0]++;
+ }
+}
+
+static void UseSurfEffect_3(struct Task * task)
+{
+ struct ObjectEvent * objectEvent;
+ objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (ObjectEventCheckHeldMovementStatus(objectEvent))
+ {
+ gFieldEffectArguments[0] = task->data[15] | 0x80000000;
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
+ task->data[0]++;
+ }
+}
+
+static void UseSurfEffect_4(struct Task * task)
+{
+ struct ObjectEvent * objectEvent;
+ if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
+ {
+ objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(2));
+ ObjectEventClearHeldMovementIfFinished(objectEvent);
+ ObjectEventSetHeldMovement(objectEvent, sub_80641C0(objectEvent->movementDirection));
+ gFieldEffectArguments[0] = task->data[1];
+ gFieldEffectArguments[1] = task->data[2];
+ gFieldEffectArguments[2] = gPlayerAvatar.objectEventId;
+ objectEvent->fieldEffectSpriteId = FieldEffectStart(FLDEFF_SURF_BLOB);
+ task->data[0]++;
+ }
+}
+
+static void UseSurfEffect_5(struct Task * task)
+{
+ struct ObjectEvent * objectEvent;
+ objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (ObjectEventClearHeldMovementIfFinished(objectEvent))
+ {
+ gPlayerAvatar.preventStep = FALSE;
+ gPlayerAvatar.flags &= 0xdf;
+ ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(objectEvent->movementDirection));
+ sub_80DC44C(objectEvent->fieldEffectSpriteId, 1);
+ UnfreezeObjectEvents();
+ ScriptContext2_Disable();
+ FieldEffectActiveListRemove(FLDEFF_USE_SURF);
+ DestroyTask(FindTaskIdByFunc(Task_FldEffUseSurf));
+ SetHelpContext(HELPCONTEXT_SURFING);
+ }
+}
+
+static void Task_FldEffUseVsSeeker(u8 taskId);
+static void UseVsSeekerEffect_1(struct Task * task);
+static void UseVsSeekerEffect_2(struct Task * task);
+static void UseVsSeekerEffect_3(struct Task * task);
+static void UseVsSeekerEffect_4(struct Task * task);
+
+static void (*const sUseVsSeekerEffectFuncs[])(struct Task * task) = {
+ UseVsSeekerEffect_1,
+ UseVsSeekerEffect_2,
+ UseVsSeekerEffect_3,
+ UseVsSeekerEffect_4
+};
+
+u32 FldEff_UseVsSeeker(void)
+{
+ if (gQuestLogState == QL_STATE_1)
+ sub_811278C(8, 89);
+ CreateTask(Task_FldEffUseVsSeeker, 0xFF);
+ return 0;
+}
+
+static void Task_FldEffUseVsSeeker(u8 taskId)
+{
+ sUseVsSeekerEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+static void UseVsSeekerEffect_1(struct Task * task)
+{
+ ScriptContext2_Enable();
+ FreezeObjectEvents();
+ gPlayerAvatar.preventStep = TRUE;
+ task->data[0]++;
+}
+
+static void UseVsSeekerEffect_2(struct Task * task)
+{
+ struct ObjectEvent * playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (!ObjectEventIsMovementOverridden(playerObj) || ObjectEventClearHeldMovementIfFinished(playerObj))
+ {
+ sub_805CBE8();
+ ObjectEventSetHeldMovement(playerObj, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);
+ task->data[0]++;
+ }
+}
+
+static void UseVsSeekerEffect_3(struct Task * task)
+{
+ struct ObjectEvent * playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (ObjectEventClearHeldMovementIfFinished(playerObj))
+ {
+ if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_ACRO_BIKE | PLAYER_AVATAR_FLAG_MACH_BIKE))
+ ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(1));
+ else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
+ ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(2));
+ else
+ ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(0));
+ ObjectEventForceSetHeldMovement(playerObj, GetFaceDirectionMovementAction(playerObj->facingDirection));
+ task->data[0]++;
+ }
+}
+
+static void UseVsSeekerEffect_4(struct Task * task)
+{
+ struct ObjectEvent * playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (ObjectEventClearHeldMovementIfFinished(playerObj))
+ {
+ gPlayerAvatar.preventStep = FALSE;
+ FieldEffectActiveListRemove(FLDEFF_USE_VS_SEEKER);
+ DestroyTask(FindTaskIdByFunc(Task_FldEffUseVsSeeker));
+ }
+}
+
+static void sub_8086D94(struct Sprite * sprite);
+
+u8 FldEff_NpcFlyOut(void)
+{
+ u8 spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0x78, 0, 1);
+ struct Sprite * sprite = &gSprites[spriteId];
+
+ sprite->oam.paletteNum = 0;
+ sprite->oam.priority = 1;
+ sprite->callback = sub_8086D94;
+ sprite->data[1] = gFieldEffectArguments[0];
+ PlaySE(SE_W019);
+ return spriteId;
+}
+
+static void sub_8086D94(struct Sprite * sprite)
+{
+ struct Sprite * npcSprite;
+
+ sprite->pos2.x = Cos(sprite->data[2], 0x8c);
+ sprite->pos2.y = Sin(sprite->data[2], 0x48);
+ sprite->data[2] = (sprite->data[2] + 4) & 0xff;
+ if (sprite->data[0])
+ {
+ npcSprite = &gSprites[sprite->data[1]];
+ npcSprite->coordOffsetEnabled = FALSE;
+ npcSprite->pos1.x = sprite->pos1.x + sprite->pos2.x;
+ npcSprite->pos1.y = sprite->pos1.y + sprite->pos2.y - 8;
+ npcSprite->pos2.x = 0;
+ npcSprite->pos2.y = 0;
+ }
+ if (sprite->data[2] >= 0x80)
+ {
+ FieldEffectStop(sprite, FLDEFF_NPCFLY_OUT);
+ }
+}
+
+static void Task_UseFly(u8 taskId);
+static void UseFlyEffect_1(struct Task * task);
+static void UseFlyEffect_2(struct Task * task);
+static void UseFlyEffect_3(struct Task * task);
+static void UseFlyEffect_4(struct Task * task);
+static void UseFlyEffect_5(struct Task * task);
+static void UseFlyEffect_6(struct Task * task);
+static void UseFlyEffect_7(struct Task * task);
+static void UseFlyEffect_8(struct Task * task);
+static void UseFlyEffect_9(struct Task * task);
+static u8 sub_8087168(void);
+static bool8 sub_80871AC(u8 flyBlobSpriteId);
+static void sub_80871C8(u8 flyBlobSpriteId);
+static void sub_8087204(u8 flyBlobSpriteId, u8 playerSpriteId);
+static void sub_8087220(struct Sprite * sprite);
+static void sub_80872F0(struct Sprite * sprite);
+static void sub_80877FC(struct Sprite * sprite, u8 affineAnimId);
+static void sub_8087828(struct Sprite * sprite);
+
+static void (*const sUseFlyEffectFuncs[])(struct Task * ) = {
+ UseFlyEffect_1,
+ UseFlyEffect_2,
+ UseFlyEffect_3,
+ UseFlyEffect_4,
+ UseFlyEffect_5,
+ UseFlyEffect_6,
+ UseFlyEffect_7,
+ UseFlyEffect_8,
+ UseFlyEffect_9
+};
+
+u8 FldEff_UseFly(void)
+{
+ u8 taskId = CreateTask(Task_UseFly, 0xfe);
+ gTasks[taskId].data[1] = gFieldEffectArguments[0];
+ return 0;
+}
+
+static void Task_UseFly(u8 taskId)
+{
+ sUseFlyEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+static void UseFlyEffect_1(struct Task * task)
+{
+ struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent))
+ {
+ task->data[15] = gPlayerAvatar.flags;
+ gPlayerAvatar.preventStep = TRUE;
+ SetPlayerAvatarStateMask(1);
+ sub_805CB70();
+ ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);
+ task->data[0]++;
+ }
+}
+
+static void UseFlyEffect_2(struct Task * task)
+{
+ struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (ObjectEventClearHeldMovementIfFinished(objectEvent))
+ {
+ task->data[0]++;
+ gFieldEffectArguments[0] = task->data[1];
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
+ }
+}
+
+static void UseFlyEffect_3(struct Task * task)
+{
+ if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
+ {
+ struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (task->data[15] & 0x08)
+ {
+ sub_80DC44C(objectEvent->fieldEffectSpriteId, 2);
+ sub_80DC478(objectEvent->fieldEffectSpriteId, 0);
+ }
+ task->data[1] = sub_8087168();
+ task->data[0]++;
+ }
+}
+
+static void UseFlyEffect_4(struct Task * task)
+{
+ if (sub_80871AC(task->data[1]))
+ {
+ task->data[0]++;
+ task->data[2] = 16;
+ SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);
+ ObjectEventSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], MOVEMENT_ACTION_FACE_LEFT);
+ }
+}
+
+static void UseFlyEffect_5(struct Task * task)
+{
+ struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if ((task->data[2] == 0 || (--task->data[2]) == 0) && ObjectEventClearHeldMovementIfFinished(objectEvent))
+ {
+ task->data[0]++;
+ PlaySE(SE_W019);
+ sub_80871C8(task->data[1]);
+ }
+}
+
+static void UseFlyEffect_6(struct Task * task)
+{
+ if ((++task->data[2]) >= 8)
+ {
+ struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(2));
+ StartSpriteAnim(&gSprites[objectEvent->spriteId], 0x16);
+ objectEvent->inanimate = TRUE;
+ ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT);
+ task->data[0]++;
+ task->data[2] = 0;
+ }
+}
+
+static void UseFlyEffect_7(struct Task * task)
+{
+ if ((++task->data[2]) >= 10)
+ {
+ struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ ObjectEventClearHeldMovementIfActive(objectEvent);
+ objectEvent->inanimate = FALSE;
+ objectEvent->hasShadow = FALSE;
+ sub_8087204(task->data[1], objectEvent->spriteId);
+ StartSpriteAnim(&gSprites[task->data[1]], gSaveBlock2Ptr->playerGender * 2 + 1);
+ sub_80877FC(&gSprites[task->data[1]], 0);
+ gSprites[task->data[1]].callback = sub_8087828;
+ CameraObjectReset2();
+ task->data[0]++;
+ }
+}
+
+static void UseFlyEffect_8(struct Task * task)
+{
+ if (sub_80871AC(task->data[1]))
+ {
+ WarpFadeOutScreen();
+ task->data[0]++;
+ }
+}
+
+static void UseFlyEffect_9(struct Task * task)
+{
+ if (!gPaletteFade.active)
+ {
+ FieldEffectActiveListRemove(FLDEFF_USE_FLY);
+ DestroyTask(FindTaskIdByFunc(Task_UseFly));
+ }
+}
+
+static u8 sub_8087168(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+ spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0xff, 0xb4, 0x1);
+ sprite = &gSprites[spriteId];
+ sprite->oam.paletteNum = 0;
+ sprite->oam.priority = 1;
+ sprite->callback = sub_8087220;
+ return spriteId;
+}
+
+static u8 sub_80871AC(u8 spriteId)
+{
+ return gSprites[spriteId].data[7];
+}
+
+static void sub_80871C8(u8 spriteId)
+{
+ struct Sprite * sprite;
+ sprite = &gSprites[spriteId];
+ sprite->callback = sub_80872F0;
+ sprite->pos1.x = 0x78;
+ sprite->pos1.y = 0x00;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ memset(&sprite->data[0], 0, 8 * sizeof(u16) /* zero all data cells */);
+ sprite->data[6] = 0x40;
+}
+
+static void sub_8087204(u8 a0, u8 a1)
+{
+ gSprites[a0].data[6] = a1;
+}
+
+static const union AffineAnimCmd sUnknown_83CC19C[] = {
+ AFFINEANIMCMD_FRAME( 8, 8, 226, 0),
+ AFFINEANIMCMD_FRAME(28, 28, 0, 30),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sUnknown_83CC1B4[] = {
+ AFFINEANIMCMD_FRAME(256, 256, 64, 0),
+ AFFINEANIMCMD_FRAME(-10, -10, 0, 22),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const sUnknown_83CC1CC[] = {
+ sUnknown_83CC19C,
+ sUnknown_83CC1B4
+};
+
+static void sub_8087220(struct Sprite * sprite)
+{
+ if (sprite->data[7] == 0)
+ {
+ if (sprite->data[0] == 0)
+ {
+ sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ sprite->affineAnims = sUnknown_83CC1CC;
+ InitSpriteAffineAnim(sprite);
+ StartSpriteAffineAnim(sprite, 0);
+ if (gSaveBlock2Ptr->playerGender == MALE)
+ sprite->pos1.x = 0x80;
+ else
+ sprite->pos1.x = 0x76;
+ sprite->pos1.y = -0x30;
+ sprite->data[0]++;
+ sprite->data[1] = 0x40;
+ sprite->data[2] = 0x100;
+ }
+ sprite->data[1] += (sprite->data[2] >> 8);
+ sprite->pos2.x = Cos(sprite->data[1], 0x78);
+ sprite->pos2.y = Sin(sprite->data[1], 0x78);
+ if (sprite->data[2] < 0x800)
+ {
+ sprite->data[2] += 0x60;
+ }
+ if (sprite->data[1] > 0x81)
+ {
+ sprite->data[7]++;
+ sprite->oam.affineMode = ST_OAM_AFFINE_OFF;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, ST_OAM_AFFINE_OFF);
+ }
+ }
+}
+
+static void sub_80872F0(struct Sprite * sprite)
+{
+ sprite->pos2.x = Cos(sprite->data[2], 0x8c);
+ sprite->pos2.y = Sin(sprite->data[2], 0x48);
+ sprite->data[2] = (sprite->data[2] + 4) & 0xff;
+ if (sprite->data[6] != MAX_SPRITES)
+ {
+ struct Sprite * sprite1 = &gSprites[sprite->data[6]];
+ sprite1->coordOffsetEnabled = FALSE;
+ sprite1->pos1.x = sprite->pos1.x + sprite->pos2.x;
+ sprite1->pos1.y = sprite->pos1.y + sprite->pos2.y - 8;
+ sprite1->pos2.x = 0;
+ sprite1->pos2.y = 0;
+ }
+ if (sprite->data[2] >= 0x80)
+ {
+ sprite->data[7] = 1;
+ }
+}
+
+static void sub_8087364(struct Sprite * sprite)
+{
+ if (sprite->data[7] == 0)
+ {
+ if (sprite->data[0] == 0)
+ {
+ sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ sprite->affineAnims = sUnknown_83CC1CC;
+ InitSpriteAffineAnim(sprite);
+ StartSpriteAffineAnim(sprite, 1);
+ if (gSaveBlock2Ptr->playerGender == MALE)
+ sprite->pos1.x = 0x70;
+ else
+ sprite->pos1.x = 0x64;
+ sprite->pos1.y = -0x20;
+ sprite->data[0]++;
+ sprite->data[1] = 0xf0;
+ sprite->data[2] = 0x800;
+ sprite->data[4] = 0x80;
+ }
+ sprite->data[1] += sprite->data[2] >> 8;
+ sprite->data[3] += sprite->data[2] >> 8;
+ sprite->data[1] &= 0xff;
+ sprite->pos2.x = Cos(sprite->data[1], 0x20);
+ sprite->pos2.y = Sin(sprite->data[1], 0x78);
+ if (sprite->data[2] > 0x100)
+ {
+ sprite->data[2] -= sprite->data[4];
+ }
+ if (sprite->data[4] < 0x100)
+ {
+ sprite->data[4] += 24;
+ }
+ if (sprite->data[2] < 0x100)
+ {
+ sprite->data[2] = 0x100;
+ }
+ if (sprite->data[3] >= 60)
+ {
+ sprite->data[7]++;
+ sprite->oam.affineMode = ST_OAM_AFFINE_OFF;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ sprite->invisible = TRUE;
+ }
+ }
+}
+
+static void sub_8087458(u8 spriteId)
+{
+ sub_80871C8(spriteId);
+ gSprites[spriteId].callback = sub_8087364;
+}
+
+static void Task_FldEffFlyIn(u8 taskId);
+static void FlyInEffect_1(struct Task * task);
+static void FlyInEffect_2(struct Task * task);
+static void FlyInEffect_3(struct Task * task);
+static void FlyInEffect_4(struct Task * task);
+static void FlyInEffect_5(struct Task * task);
+static void FlyInEffect_6(struct Task * task);
+static void FlyInEffect_7(struct Task * task);
+static void sub_80878C0(struct Sprite * sprite);
+
+static void (*const sFlyInEffectFuncs[])(struct Task * task) = {
+ FlyInEffect_1,
+ FlyInEffect_2,
+ FlyInEffect_3,
+ FlyInEffect_4,
+ FlyInEffect_5,
+ FlyInEffect_6,
+ FlyInEffect_7
+};
+
+u32 FldEff_FlyIn(void)
+{
+ CreateTask(Task_FldEffFlyIn, 0xfe);
+ return 0;
+}
+
+static void Task_FldEffFlyIn(u8 taskId)
+{
+ sFlyInEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+static void FlyInEffect_1(struct Task * task)
+{
+ struct ObjectEvent * objectEvent;
+ objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent))
+ {
+ task->data[0]++;
+ task->data[2] = 33;
+ task->data[15] = gPlayerAvatar.flags;
+ gPlayerAvatar.preventStep = TRUE;
+ SetPlayerAvatarStateMask(0x01);
+ if (task->data[15] & 0x08)
+ {
+ sub_80DC44C(objectEvent->fieldEffectSpriteId, 0);
+ }
+ ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(2));
+ CameraObjectReset2();
+ ObjectEventTurn(objectEvent, DIR_WEST);
+ StartSpriteAnim(&gSprites[objectEvent->spriteId], 0x16);
+ objectEvent->invisible = FALSE;
+ task->data[1] = sub_8087168();
+ sub_80871C8(task->data[1]);
+ sub_8087204(task->data[1], objectEvent->spriteId);
+ StartSpriteAnim(&gSprites[task->data[1]], gSaveBlock2Ptr->playerGender * 2 + 2);
+ sub_80877FC(&gSprites[task->data[1]], 1);
+ gSprites[task->data[1]].callback = sub_8087828;
+ }
+}
+
+static void FlyInEffect_2(struct Task * task)
+{
+ struct ObjectEvent * objectEvent;
+ struct Sprite * sprite;
+ sub_80878C0(&gSprites[task->data[1]]);
+ if (task->data[2] == 0 || (--task->data[2]) == 0)
+ {
+ objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ sprite = &gSprites[objectEvent->spriteId];
+ sub_8087204(task->data[1], 0x40);
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ task->data[0]++;
+ task->data[2] = 0;
+ }
+}
+
+static void FlyInEffect_3(struct Task * task)
+{
+ s16 gUnknown_83CC1F0[18] = {
+ -2,
+ -4,
+ -5,
+ -6,
+ -7,
+ -8,
+ -8,
+ -8,
+ -7,
+ -7,
+ -6,
+ -5,
+ -3,
+ -2,
+ 0,
+ 2,
+ 4,
+ 8
+ };
+ struct Sprite * sprite = &gSprites[gPlayerAvatar.spriteId];
+ sprite->pos2.y = gUnknown_83CC1F0[task->data[2]];
+ if ((++task->data[2]) >= 18)
+ {
+ task->data[0]++;
+ }
+}
+
+static void FlyInEffect_4(struct Task * task)
+{
+ struct ObjectEvent * objectEvent;
+ struct Sprite * sprite;
+ if (sub_80871AC(task->data[1]))
+ {
+ objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ sprite = &gSprites[objectEvent->spriteId];
+ objectEvent->inanimate = FALSE;
+ MoveObjectEventToMapCoords(objectEvent, objectEvent->currentCoords.x, objectEvent->currentCoords.y);
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->coordOffsetEnabled = TRUE;
+ sub_805CB70();
+ ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);
+ task->data[0]++;
+ }
+}
+
+static void FlyInEffect_5(struct Task * task)
+{
+ if (ObjectEventClearHeldMovementIfFinished(&gObjectEvents[gPlayerAvatar.objectEventId]))
+ {
+ task->data[0]++;
+ sub_8087458(task->data[1]);
+ }
+}
+
+static void FlyInEffect_6(struct Task * task)
+{
+ if (sub_80871AC(task->data[1]))
+ {
+ DestroySprite(&gSprites[task->data[1]]);
+ task->data[0]++;
+ task->data[1] = 0x10;
+ }
+}
+
+static void FlyInEffect_7(struct Task * task)
+{
+ u8 state;
+ struct ObjectEvent * objectEvent;
+ if ((--task->data[1]) == 0)
+ {
+ objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ state = 0;
+ if (task->data[15] & 0x08)
+ {
+ state = 2;
+ sub_80DC44C(objectEvent->fieldEffectSpriteId, 1);
+ }
+ ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(state));
+ ObjectEventTurn(objectEvent, DIR_SOUTH);
+ gPlayerAvatar.flags = task->data[15];
+ gPlayerAvatar.preventStep = FALSE;
+ FieldEffectActiveListRemove(FLDEFF_FLY_IN);
+ DestroyTask(FindTaskIdByFunc(Task_FldEffFlyIn));
+ }
+}
+
+static const union AffineAnimCmd sUnknown_83CC214[] = {
+ AFFINEANIMCMD_FRAME(24, 24, 0, 1),
+ AFFINEANIMCMD_JUMP(0)
+};
+
+static const union AffineAnimCmd sUnknown_83CC224[] = {
+ AFFINEANIMCMD_FRAME(512, 512, 0, 1),
+ AFFINEANIMCMD_FRAME(-16, -16, 0, 1),
+ AFFINEANIMCMD_JUMP(1)
+};
+
+static const union AffineAnimCmd *const sUnknown_83CC23C[] = {
+ sUnknown_83CC214,
+ sUnknown_83CC224
+};
+
+static void sub_80877FC(struct Sprite * sprite, u8 affineAnimId)
+{
+ sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ sprite->affineAnims = sUnknown_83CC23C;
+ InitSpriteAffineAnim(sprite);
+ StartSpriteAffineAnim(sprite, affineAnimId);
+}
+
+static void sub_8087828(struct Sprite * sprite)
+{
+ struct Sprite * sprite2;
+ sprite->pos2.x = Cos(sprite->data[2], 0xB4);
+ sprite->pos2.y = Sin(sprite->data[2], 0x48);
+ sprite->data[2] += 2;
+ sprite->data[2] &= 0xFF;
+ if (sprite->data[6] != MAX_SPRITES)
+ {
+ sprite2 = &gSprites[sprite->data[6]];
+ sprite2->coordOffsetEnabled = FALSE;
+ sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x;
+ sprite2->pos1.y = sprite->pos1.y + sprite->pos2.y - 8;
+ sprite2->pos2.x = 0;
+ sprite2->pos2.y = 0;
+ }
+ if (sprite->data[2] >= 0x80)
+ {
+ sprite->data[7] = 1;
+ sprite->oam.affineMode = ST_OAM_AFFINE_OFF;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, ST_OAM_AFFINE_OFF);
+ }
+}
+
+static void sub_80878C0(struct Sprite * sprite)
+{
+ if (sprite->oam.affineMode != ST_OAM_AFFINE_OFF)
+ {
+ if (gOamMatrices[sprite->oam.matrixNum].a == 0x100 || gOamMatrices[sprite->oam.matrixNum].d == 0x100)
+ {
+ sprite->oam.affineMode = ST_OAM_AFFINE_OFF;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, ST_OAM_AFFINE_OFF);
+ StartSpriteAnim(sprite, 0);
+ sprite->callback = sub_80872F0;
+ }
+ }
+}
+
+static void Task_MoveDeoxysRock_Step(u8 taskId);
+
+u32 FldEff_MoveDeoxysRock(void)
+{
+ u8 taskId;
+ u8 objectEventIdBuffer;
+ s32 x;
+ s32 y;
+ struct ObjectEvent * objectEvent;
+ if (!TryGetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &objectEventIdBuffer))
+ {
+ objectEvent = &gObjectEvents[objectEventIdBuffer];
+ x = objectEvent->currentCoords.x - 7;
+ y = objectEvent->currentCoords.y - 7;
+ x = (gFieldEffectArguments[3] - x) * 16;
+ y = (gFieldEffectArguments[4] - y) * 16;
+ ShiftObjectEventCoords(objectEvent, gFieldEffectArguments[3] + 7, gFieldEffectArguments[4] + 7);
+ taskId = CreateTask(Task_MoveDeoxysRock_Step, 0x50);
+ gTasks[taskId].data[1] = objectEvent->spriteId;
+ gTasks[taskId].data[2] = gSprites[objectEvent->spriteId].pos1.x + x;
+ gTasks[taskId].data[3] = gSprites[objectEvent->spriteId].pos1.y + y;
+ gTasks[taskId].data[8] = gFieldEffectArguments[5];
+ gTasks[taskId].data[9] = objectEventIdBuffer;
+ }
+ return FALSE;
+}
+
+static void Task_MoveDeoxysRock_Step(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ struct Sprite * sprite = &gSprites[data[1]];
+ struct ObjectEvent * objectEvent;
+ switch (data[0])
+ {
+ case 0:
+ data[4] = sprite->pos1.x << 4;
+ data[5] = sprite->pos1.y << 4;
+ data[6] = ((data[2] << 4) - data[4]) / data[8];
+ data[7] = ((data[3] << 4) - data[5]) / data[8];
+ data[0]++;
+ // fallthrough
+ case 1:
+ if (data[8] != 0)
+ {
+ data[8]--;
+ data[4] += data[6];
+ data[5] += data[7];
+ sprite->pos1.x = data[4] >> 4;
+ sprite->pos1.y = data[5] >> 4;
+ }
+ else
+ {
+ objectEvent = &gObjectEvents[data[9]];
+ sprite->pos1.x = data[2];
+ sprite->pos1.y = data[3];
+ ShiftStillObjectEventCoords(objectEvent);
+ objectEvent->triggerGroundEffectsOnStop = TRUE;
+ FieldEffectActiveListRemove(FLDEFF_MOVE_DEOXYS_ROCK);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void Task_FldEffUnk44(u8 taskId);
+static void Unk44Effect_0(s16 *data, u8 taskId);
+static void Unk44Effect_1(s16 *data, u8 taskId);
+static void Unk44Effect_2(s16 *data, u8 taskId);
+static void sub_8087CFC(struct Sprite * sprite);
+static void SpriteCB_FldEffUnk44(struct Sprite * sprite);
+
+static void (*const sUnk44EffectFuncs[])(s16 *data, u8 taskId) = {
+ Unk44Effect_0,
+ Unk44Effect_1,
+ Unk44Effect_2
+};
+
+static const struct SpriteFrameImage sImages_FldEffUnk44[] = {
+ {sFldEffUnk44_Tiles + 0x00, 0x20},
+ {sFldEffUnk44_Tiles + 0x10, 0x20},
+ {sFldEffUnk44_Tiles + 0x20, 0x20},
+ {sFldEffUnk44_Tiles + 0x30, 0x20}
+};
+
+static const union AnimCmd sAnimCmd_FldEffUnk44_0[] = {
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sAnimCmd_FldEffUnk44_1[] = {
+ ANIMCMD_FRAME(1, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sAnimCmd_FldEffUnk44_2[] = {
+ ANIMCMD_FRAME(2, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sAnimCmd_FldEffUnk44_3[] = {
+ ANIMCMD_FRAME(3, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sAnimCmdTable_FldEffUnk44[] = {
+ sAnimCmd_FldEffUnk44_0,
+ sAnimCmd_FldEffUnk44_1,
+ sAnimCmd_FldEffUnk44_2,
+ sAnimCmd_FldEffUnk44_3
+};
+
+static const struct SpriteTemplate sUnknown_83CC2A0 = {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 4371,
+ .oam = &sOamData_8x8,
+ .anims = sAnimCmdTable_FldEffUnk44,
+ .images = sImages_FldEffUnk44,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_FldEffUnk44
+};
+
+u32 FldEff_Unk44(void)
+{
+ u8 taskId;
+ u8 objectEventIdBuffer;
+ if (!TryGetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &objectEventIdBuffer))
+ {
+ taskId = CreateTask(Task_FldEffUnk44, 0x50);
+ gTasks[taskId].data[2] = objectEventIdBuffer;
+ gTasks[taskId].data[6] = gFieldEffectArguments[0];
+ gTasks[taskId].data[7] = gFieldEffectArguments[1];
+ gTasks[taskId].data[8] = gFieldEffectArguments[2];
+ }
+ else
+ {
+ FieldEffectActiveListRemove(FLDEFF_UNK_44);
+ }
+ return FALSE;
+}
+
+static void sub_8087B14(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (data[7] != 0)
+ {
+ if (++data[6] > 20)
+ {
+ data[6] = 0;
+ if (data[5] != 0)
+ data[5]--;
+ }
+ }
+ else
+ {
+ data[5] = 4;
+ }
+
+ if (++data[0] > 1)
+ {
+ data[0] = 0;
+ if (++data[1] & 1)
+ {
+ SetCameraPanning(0, -data[5]);
+ }
+ else
+ {
+ SetCameraPanning(0, data[5]);
+ }
+ }
+ UpdateCameraPanning();
+ if (data[5] == 0)
+ DestroyTask(taskId);
+}
+
+static void sub_8087BA8(u8 taskId)
+{
+ gTasks[taskId].data[7] = 1;
+}
+
+static void Task_FldEffUnk44(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ InstallCameraPanAheadCallback();
+ SetCameraPanningCallback(NULL);
+ sUnk44EffectFuncs[data[1]](data, taskId);
+}
+
+static void Unk44Effect_0(s16 *data, u8 taskId)
+{
+ u8 newTaskId = CreateTask(sub_8087B14, 90);
+ PlaySE(SE_T_KAMI2);
+ data[5] = newTaskId;
+ data[1]++;
+}
+
+static void Unk44Effect_1(s16 *data, u8 taskId)
+{
+ if (++data[3] > 0x78)
+ {
+ struct Sprite * sprite = &gSprites[gObjectEvents[data[2]].spriteId];
+ gObjectEvents[data[2]].invisible = TRUE;
+ BlendPalettes(0x0000FFFF, 0x10, RGB_WHITE);
+ BeginNormalPaletteFade(0x0000FFFF, 0, 0x10, 0, RGB_WHITE);
+ sub_8087CFC(sprite);
+ PlaySE(SE_T_KAMI);
+ sub_8087BA8(data[5]);
+ data[3] = 0;
+ data[1]++;
+ }
+}
+
+static void Unk44Effect_2(s16 *data, u8 taskId)
+{
+ if (!gPaletteFade.active && !FuncIsActiveTask(sub_8087B14))
+ {
+ InstallCameraPanAheadCallback();
+ RemoveObjectEventByLocalIdAndMap(data[6], data[7], data[8]);
+ FieldEffectActiveListRemove(FLDEFF_UNK_44);
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_8087CFC(struct Sprite* sprite)
+{
+ int i;
+ int xPos = (s16)gTotalCameraPixelOffsetX + sprite->pos1.x + sprite->pos2.x;
+ int yPos = (s16)gTotalCameraPixelOffsetY + sprite->pos1.y + sprite->pos2.y - 4;
+
+ for (i = 0; i < 4; i++)
+ {
+ u8 spriteId = CreateSprite(&sUnknown_83CC2A0, xPos, yPos, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ StartSpriteAnim(&gSprites[spriteId], i);
+ gSprites[spriteId].data[0] = i;
+ gSprites[spriteId].oam.paletteNum = sprite->oam.paletteNum;
+ }
+ }
+}
+
+static void SpriteCB_FldEffUnk44(struct Sprite* sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos1.x -= 16;
+ sprite->pos1.y -= 12;
+ break;
+ case 1:
+ sprite->pos1.x += 16;
+ sprite->pos1.y -= 12;
+ break;
+ case 2:
+ sprite->pos1.x -= 16;
+ sprite->pos1.y += 12;
+ break;
+ case 3:
+ sprite->pos1.x += 16;
+ sprite->pos1.y += 12;
+ break;
+ }
+ if (sprite->pos1.x < -4 || sprite->pos1.x > 0xF4 || sprite->pos1.y < -4 || sprite->pos1.y > 0xA4)
+ DestroySprite(sprite);
+}
+
+static void Task_FldEffUnk45(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ FieldEffectActiveListRemove(FLDEFF_UNK_45);
+ DestroyTask(taskId);
+ }
+}
+
+// Bug: Return value should be u32, not void
+void FldEff_Unk45(void)
+{
+ BlendPalettes(0xFFFFFFFF, 0x10, RGB_WHITE);
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0x0F, 0x00, RGB_WHITE);
+ CreateTask(Task_FldEffUnk45, 90);
+}
diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c
new file mode 100644
index 000000000..06d48fce0
--- /dev/null
+++ b/src/field_effect_helpers.c
@@ -0,0 +1,1411 @@
+#include "global.h"
+#include "event_object_movement.h"
+#include "field_camera.h"
+#include "field_effect.h"
+#include "field_weather.h"
+#include "fieldmap.h"
+#include "metatile_behavior.h"
+#include "sound.h"
+#include "sprite.h"
+#include "constants/field_effects.h"
+#include "constants/songs.h"
+
+#define OBJ_EVENT_PAL_TAG_NONE 0x11FF // duplicate of define in event_object_movement.c
+
+static void UpdateObjectReflectionSprite(struct Sprite * sprite);
+static void LoadObjectReflectionPalette(struct ObjectEvent * objectEvent, struct Sprite * sprite);
+static void LoadObjectHighBridgeReflectionPalette(struct ObjectEvent * objectEvent, u8 paletteNum);
+static void LoadObjectRegularReflectionPalette(struct ObjectEvent * objectEvent, u8 paletteNum);
+static void sub_80DCD48(struct Sprite * sprite, u8 z, u8 offset);
+static void FadeFootprintsTireTracks_Step0(struct Sprite * sprite);
+static void FadeFootprintsTireTracks_Step1(struct Sprite * sprite);
+static void UpdateFeetInFlowingWaterFieldEffect(struct Sprite * sprite);
+static void UpdateAshFieldEffect_Step0(struct Sprite * sprite);
+static void UpdateAshFieldEffect_Step1(struct Sprite * sprite);
+static void UpdateAshFieldEffect_Step2(struct Sprite * sprite);
+static void SynchroniseSurfAnim(struct ObjectEvent * objectEvent, struct Sprite * sprite);
+static void sub_80DC588(struct ObjectEvent * objectEvent, struct Sprite * sprite);
+static void CreateBobbingEffect(struct ObjectEvent * objectEvent, struct Sprite * linkedSprite, struct Sprite * sprite);
+static void sub_80DC700(struct Sprite * sprite);
+static u32 ShowDisguiseFieldEffect(u8 fldEff, u8 templateIdx, u8 paletteNum);
+
+void SetUpReflection(struct ObjectEvent * objectEvent, struct Sprite * sprite, bool8 stillReflection)
+{
+ struct Sprite * reflectionSprite;
+
+ reflectionSprite = &gSprites[CreateCopySpriteAt(sprite, sprite->pos1.x, sprite->pos1.y, 0x98)];
+ reflectionSprite->callback = UpdateObjectReflectionSprite;
+ reflectionSprite->oam.priority = 3;
+ reflectionSprite->oam.paletteNum = gReflectionEffectPaletteMap[reflectionSprite->oam.paletteNum];
+ reflectionSprite->usingSheet = TRUE;
+ reflectionSprite->anims = gDummySpriteAnimTable;
+ StartSpriteAnim(reflectionSprite, 0);
+ reflectionSprite->affineAnims = gDummySpriteAffineAnimTable;
+ reflectionSprite->affineAnimBeginning = TRUE;
+ reflectionSprite->subspriteMode = SUBSPRITES_OFF;
+ reflectionSprite->data[0] = sprite->data[0];
+ reflectionSprite->data[1] = objectEvent->localId;
+ reflectionSprite->data[7] = stillReflection;
+ LoadObjectReflectionPalette(objectEvent, reflectionSprite);
+
+ if (!stillReflection)
+ reflectionSprite->oam.affineMode = ST_OAM_AFFINE_NORMAL;
+}
+
+static s16 GetReflectionVerticalOffset(struct ObjectEvent * objectEvent)
+{
+ return GetObjectEventGraphicsInfo(objectEvent->graphicsId)->height - 2;
+}
+
+static void LoadObjectReflectionPalette(struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ u8 bridgeType;
+ u16 bridgeReflectionVerticalOffsets[] = { 12, 28, 44 };
+ sprite->data[2] = 0;
+ if (!GetObjectEventGraphicsInfo(objectEvent->graphicsId)->disableReflectionPaletteLoad && ((bridgeType = MetatileBehavior_GetBridgeType(objectEvent->previousMetatileBehavior)) || (bridgeType = MetatileBehavior_GetBridgeType(objectEvent->currentMetatileBehavior))))
+ {
+ sprite->data[2] = bridgeReflectionVerticalOffsets[bridgeType - 1];
+ LoadObjectHighBridgeReflectionPalette(objectEvent, sprite->oam.paletteNum);
+ }
+ else
+ {
+ LoadObjectRegularReflectionPalette(objectEvent, sprite->oam.paletteNum);
+ }
+}
+
+static void LoadObjectRegularReflectionPalette(struct ObjectEvent * objectEvent, u8 paletteIndex)
+{
+ const struct ObjectEventGraphicsInfo * graphicsInfo;
+
+ graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);
+ if (graphicsInfo->paletteTag2 != OBJ_EVENT_PAL_TAG_NONE)
+ {
+ if (graphicsInfo->paletteSlot == 0)
+ {
+ LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag1, paletteIndex);
+ }
+ else if (graphicsInfo->paletteSlot == 10)
+ {
+ LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag1, paletteIndex);
+ }
+ else
+ {
+ PatchObjectPalette(GetObjectPaletteTag(paletteIndex), paletteIndex);
+ }
+ UpdateSpritePaletteWithWeather(paletteIndex);
+ }
+}
+
+// When walking on a bridge high above water (Route 120), the reflection is a solid dark blue color.
+// This is so the sprite blends in with the dark water metatile underneath the bridge.
+static void LoadObjectHighBridgeReflectionPalette(struct ObjectEvent * objectEvent, u8 paletteNum)
+{
+ const struct ObjectEventGraphicsInfo * graphicsInfo;
+
+ graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);
+ if (graphicsInfo->paletteTag2 != OBJ_EVENT_PAL_TAG_NONE)
+ {
+ PatchObjectPalette(graphicsInfo->paletteTag2, paletteNum);
+ UpdateSpritePaletteWithWeather(paletteNum);
+ }
+}
+
+static void UpdateObjectReflectionSprite(struct Sprite * reflectionSprite)
+{
+ struct ObjectEvent * objectEvent;
+ struct Sprite * mainSprite;
+
+ objectEvent = &gObjectEvents[reflectionSprite->data[0]];
+ mainSprite = &gSprites[objectEvent->spriteId];
+ if (!objectEvent->active || !objectEvent->hasReflection || objectEvent->localId != reflectionSprite->data[1])
+ {
+ reflectionSprite->inUse = FALSE;
+ }
+ else
+ {
+ reflectionSprite->oam.paletteNum = gReflectionEffectPaletteMap[mainSprite->oam.paletteNum];
+ reflectionSprite->oam.shape = mainSprite->oam.shape;
+ reflectionSprite->oam.size = mainSprite->oam.size;
+ reflectionSprite->oam.matrixNum = mainSprite->oam.matrixNum | ST_OAM_VFLIP;
+ reflectionSprite->oam.tileNum = mainSprite->oam.tileNum;
+ reflectionSprite->subspriteTables = mainSprite->subspriteTables;
+ reflectionSprite->subspriteTableNum = mainSprite->subspriteTableNum;
+ reflectionSprite->invisible = mainSprite->invisible;
+ reflectionSprite->pos1.x = mainSprite->pos1.x;
+ // reflectionSprite->data[2] holds an additional vertical offset, used by the high bridges on Route 120
+ reflectionSprite->pos1.y = mainSprite->pos1.y + GetReflectionVerticalOffset(objectEvent) + reflectionSprite->data[2];
+ reflectionSprite->centerToCornerVecX = mainSprite->centerToCornerVecX;
+ reflectionSprite->centerToCornerVecY = mainSprite->centerToCornerVecY;
+ reflectionSprite->pos2.x = mainSprite->pos2.x;
+ reflectionSprite->pos2.y = -mainSprite->pos2.y;
+ reflectionSprite->coordOffsetEnabled = mainSprite->coordOffsetEnabled;
+
+/*
+ if (objectEvent->hideReflection == TRUE)
+ reflectionSprite->invisible = TRUE;
+*/
+
+ // Check if the reflection is not still.
+ if (reflectionSprite->data[7] == FALSE)
+ {
+ // Sets the reflection sprite's rot/scale matrix to the appropriate
+ // matrix based on whether or not the main sprite is horizontally flipped.
+ // If the sprite is facing to the east, then it is flipped, and its matrixNum is 8.
+ reflectionSprite->oam.matrixNum = 0;
+ if (mainSprite->oam.matrixNum & ST_OAM_HFLIP)
+ reflectionSprite->oam.matrixNum = 1;
+ }
+ }
+}
+
+extern const struct SpriteTemplate * const gFieldEffectObjectTemplatePointers[];
+
+u8 CreateWarpArrowSprite(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[8], 0, 0, 0x52);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->oam.priority = 1;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->invisible = TRUE;
+ }
+ return spriteId;
+}
+
+void SetSpriteInvisible(u8 spriteId)
+{
+ gSprites[spriteId].invisible = TRUE;
+}
+
+void ShowWarpArrowSprite(u8 spriteId, u8 direction, s16 x, s16 y)
+{
+ s16 x2;
+ s16 y2;
+ struct Sprite * sprite;
+
+ sprite = &gSprites[spriteId];
+ if (sprite->invisible || sprite->data[0] != x || sprite->data[1] != y)
+ {
+ SetSpritePosToMapCoords(x, y, &x2, &y2);
+ sprite = &gSprites[spriteId];
+ sprite->pos1.x = x2 + 8;
+ sprite->pos1.y = y2 + 8;
+ sprite->invisible = FALSE;
+ sprite->data[0] = x;
+ sprite->data[1] = y;
+ StartSpriteAnim(sprite, direction - 1);
+ }
+}
+
+const u8 gShadowEffectTemplateIds[] = {
+ 0,
+ 1,
+ 2,
+ 3
+};
+
+const u16 gShadowVerticalOffsets[] = {
+ 4,
+ 4,
+ 4,
+ 16
+};
+
+u32 FldEff_Shadow(void)
+{
+ u8 objectEventId;
+ const struct ObjectEventGraphicsInfo * graphicsInfo;
+ u8 spriteId;
+
+ objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[gShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0, 0x94);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].coordOffsetEnabled = TRUE;
+ gSprites[spriteId].data[0] = gFieldEffectArguments[0];
+ gSprites[spriteId].data[1] = gFieldEffectArguments[1];
+ gSprites[spriteId].data[2] = gFieldEffectArguments[2];
+ gSprites[spriteId].data[3] = (graphicsInfo->height >> 1) - gShadowVerticalOffsets[graphicsInfo->shadowSize];
+ }
+ return 0;
+}
+
+void UpdateShadowFieldEffect(struct Sprite * sprite)
+{
+ u8 objectEventId;
+ struct ObjectEvent * objectEvent;
+ struct Sprite * linkedSprite;
+
+ if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId))
+ {
+ FieldEffectStop(sprite, FLDEFF_SHADOW);
+ }
+ else
+ {
+ objectEvent = &gObjectEvents[objectEventId];
+ linkedSprite = &gSprites[objectEvent->spriteId];
+ sprite->oam.priority = linkedSprite->oam.priority;
+ sprite->pos1.x = linkedSprite->pos1.x;
+ sprite->pos1.y = linkedSprite->pos1.y + sprite->data[3];
+ if (!objectEvent->active || !objectEvent->hasShadow
+ || MetatileBehavior_IsPokeGrass(objectEvent->currentMetatileBehavior)
+ || MetatileBehavior_IsSurfable(objectEvent->currentMetatileBehavior)
+ || MetatileBehavior_IsSurfable(objectEvent->previousMetatileBehavior)
+ || MetatileBehavior_IsReflective(objectEvent->currentMetatileBehavior)
+ || MetatileBehavior_IsReflective(objectEvent->previousMetatileBehavior))
+ {
+ FieldEffectStop(sprite, FLDEFF_SHADOW);
+ }
+ }
+}
+
+u32 FldEff_TallGrass(void)
+{
+ s16 x;
+ s16 y;
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ x = gFieldEffectArguments[0];
+ y = gFieldEffectArguments[1];
+ sub_8063BC4(&x, &y, 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[4], x, y, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gFieldEffectArguments[3];
+ sprite->data[0] = gFieldEffectArguments[2];
+ sprite->data[1] = gFieldEffectArguments[0];
+ sprite->data[2] = gFieldEffectArguments[1];
+ sprite->data[3] = gFieldEffectArguments[4];
+ sprite->data[4] = gFieldEffectArguments[5];
+ sprite->data[5] = gFieldEffectArguments[6];
+ if (gFieldEffectArguments[7])
+ {
+ SeekSpriteAnim(sprite, 4);
+ }
+ }
+ return 0;
+}
+
+void UpdateTallGrassFieldEffect(struct Sprite * sprite)
+{
+ u8 mapNum;
+ u8 mapGroup;
+ u8 metatileBehavior;
+ u8 localId;
+ u8 objectEventId;
+ struct ObjectEvent * objectEvent;
+
+ mapNum = sprite->data[5] >> 8;
+ mapGroup = sprite->data[5];
+ if (gCamera.active && (gSaveBlock1Ptr->location.mapNum != mapNum || gSaveBlock1Ptr->location.mapGroup != mapGroup))
+ {
+ sprite->data[1] -= gCamera.x;
+ sprite->data[2] -= gCamera.y;
+ sprite->data[5] = ((u8)gSaveBlock1Ptr->location.mapNum << 8) | (u8)gSaveBlock1Ptr->location.mapGroup;
+ }
+ localId = sprite->data[3] >> 8;
+ mapNum = sprite->data[3];
+ mapGroup = sprite->data[4];
+ metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data[1], sprite->data[2]);
+ if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId) || !MetatileBehavior_IsTallGrass_2(metatileBehavior) || (sprite->data[7] && sprite->animEnded))
+ {
+ FieldEffectStop(sprite, FLDEFF_TALL_GRASS);
+ }
+ else
+ {
+ objectEvent = &gObjectEvents[objectEventId];
+ if ((objectEvent->currentCoords.x != sprite->data[1] || objectEvent->currentCoords.y != sprite->data[2]) && (objectEvent->previousCoords.x != sprite->data[1] || objectEvent->previousCoords.y != sprite->data[2]))
+ sprite->data[7] = TRUE;
+
+ // This variable is misused.
+ metatileBehavior = 0;
+ if (sprite->animCmdIndex == 0)
+ metatileBehavior = 4;
+
+ UpdateObjectEventSpriteVisibility(sprite, FALSE);
+ sub_80DCD48(sprite, sprite->data[0], metatileBehavior);
+ }
+}
+
+u32 FldEff_JumpTallGrass(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[10], gFieldEffectArguments[0], gFieldEffectArguments[1], 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gFieldEffectArguments[3];
+ sprite->data[0] = gFieldEffectArguments[2];
+ sprite->data[1] = 12;
+ }
+ return 0;
+}
+
+u8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y)
+{
+ struct Sprite * sprite;
+ u8 i;
+
+ for (i = 0; i < MAX_SPRITES; i++)
+ {
+ if (gSprites[i].inUse)
+ {
+ sprite = &gSprites[i];
+ if (sprite->callback == UpdateTallGrassFieldEffect && (x == sprite->data[1] && y == sprite->data[2]) && (localId == (sprite->data[3] >> 8) && mapNum == (sprite->data[3] & 0xFF) && mapGroup == sprite->data[4]))
+ return i;
+ }
+ }
+
+ return MAX_SPRITES;
+}
+
+u32 FldEff_LongGrass(void)
+{
+ s16 x;
+ s16 y;
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ x = gFieldEffectArguments[0];
+ y = gFieldEffectArguments[1];
+ sub_8063BC4(&x, &y, 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[15], x, y, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = ZCoordToPriority(gFieldEffectArguments[2]);
+ sprite->data[0] = gFieldEffectArguments[2];
+ sprite->data[1] = gFieldEffectArguments[0];
+ sprite->data[2] = gFieldEffectArguments[1];
+ sprite->data[3] = gFieldEffectArguments[4];
+ sprite->data[4] = gFieldEffectArguments[5];
+ sprite->data[5] = gFieldEffectArguments[6];
+ if (gFieldEffectArguments[7])
+ {
+ SeekSpriteAnim(sprite, 6);
+ }
+ }
+ return 0;
+}
+
+void UpdateLongGrassFieldEffect(struct Sprite * sprite)
+{
+ u8 mapNum;
+ u8 mapGroup;
+ u8 metatileBehavior;
+ u8 localId;
+ u8 objectEventId;
+ struct ObjectEvent * objectEvent;
+
+ mapNum = sprite->data[5] >> 8;
+ mapGroup = sprite->data[5];
+ if (gCamera.active && (gSaveBlock1Ptr->location.mapNum != mapNum || gSaveBlock1Ptr->location.mapGroup != mapGroup))
+ {
+ sprite->data[1] -= gCamera.x;
+ sprite->data[2] -= gCamera.y;
+ sprite->data[5] = ((u8)gSaveBlock1Ptr->location.mapNum << 8) | (u8)gSaveBlock1Ptr->location.mapGroup;
+ }
+ localId = sprite->data[3] >> 8;
+ mapNum = sprite->data[3];
+ mapGroup = sprite->data[4];
+ metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data[1], sprite->data[2]);
+ if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId) || !MetatileBehavior_IsLongGrass(metatileBehavior) || (sprite->data[7] && sprite->animEnded))
+ {
+ FieldEffectStop(sprite, FLDEFF_LONG_GRASS);
+ }
+ else
+ {
+ objectEvent = &gObjectEvents[objectEventId];
+ if ((objectEvent->currentCoords.x != sprite->data[1] || objectEvent->currentCoords.y != sprite->data[2]) && (objectEvent->previousCoords.x != sprite->data[1] || objectEvent->previousCoords.y != sprite->data[2]))
+ {
+ sprite->data[7] = TRUE;
+ }
+ UpdateObjectEventSpriteVisibility(sprite, FALSE);
+ sub_80DCD48(sprite, sprite->data[0], 0);
+ }
+}
+
+u32 FldEff_JumpLongGrass(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[16], gFieldEffectArguments[0], gFieldEffectArguments[1], 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gFieldEffectArguments[3];
+ sprite->data[0] = gFieldEffectArguments[2];
+ sprite->data[1] = 18;
+ }
+ return 0;
+}
+
+u32 FldEff_ShortGrass(void)
+{
+ u8 objectEventId;
+ struct ObjectEvent * objectEvent;
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ objectEvent = &gObjectEvents[objectEventId];
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[30], 0, 0, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &(gSprites[spriteId]);
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gSprites[objectEvent->spriteId].oam.priority;
+ sprite->data[0] = gFieldEffectArguments[0];
+ sprite->data[1] = gFieldEffectArguments[1];
+ sprite->data[2] = gFieldEffectArguments[2];
+ sprite->data[3] = gSprites[objectEvent->spriteId].pos1.x;
+ sprite->data[4] = gSprites[objectEvent->spriteId].pos1.y;
+ }
+ return 0;
+}
+
+void UpdateShortGrassFieldEffect(struct Sprite * sprite)
+{
+ u8 objectEventId;
+ s16 x;
+ s16 y;
+ const struct ObjectEventGraphicsInfo * graphicsInfo;
+ struct Sprite * linkedSprite;
+
+ if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId) || !gObjectEvents[objectEventId].inShortGrass)
+ {
+ FieldEffectStop(sprite, FLDEFF_SHORT_GRASS);
+ }
+ else
+ {
+ graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId);
+ linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId];
+ y = linkedSprite->pos1.y;
+ x = linkedSprite->pos1.x;
+ if (x != sprite->data[3] || y != sprite->data[4])
+ {
+ sprite->data[3] = x;
+ sprite->data[4] = y;
+ if (sprite->animEnded)
+ {
+ StartSpriteAnim(sprite, 0);
+ }
+ }
+ sprite->pos1.x = x;
+ sprite->pos1.y = y;
+ sprite->pos2.y = (graphicsInfo->height >> 1) - 8;
+ sprite->subpriority = linkedSprite->subpriority - 1;
+ sprite->oam.priority = linkedSprite->oam.priority;
+ UpdateObjectEventSpriteVisibility(sprite, linkedSprite->invisible);
+ }
+}
+
+u32 FldEff_SandFootprints(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[11], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gFieldEffectArguments[3];
+ sprite->data[7] = FLDEFF_SAND_FOOTPRINTS;
+ StartSpriteAnim(sprite, gFieldEffectArguments[4]);
+ }
+ return 0;
+}
+
+u32 FldEff_DeepSandFootprints(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[23], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gFieldEffectArguments[3];
+ sprite->data[7] = FLDEFF_DEEP_SAND_FOOTPRINTS;
+ StartSpriteAnim(sprite, gFieldEffectArguments[4]);
+ }
+ return spriteId;
+}
+
+u32 FldEff_BikeTireTracks(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[27], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gFieldEffectArguments[3];
+ sprite->data[7] = FLDEFF_BIKE_TIRE_TRACKS;
+ StartSpriteAnim(sprite, gFieldEffectArguments[4]);
+ }
+ return spriteId;
+}
+
+void (*const gFadeFootprintsTireTracksFuncs[])(struct Sprite * sprite) = {
+ FadeFootprintsTireTracks_Step0,
+ FadeFootprintsTireTracks_Step1
+};
+
+void UpdateFootprintsTireTracksFieldEffect(struct Sprite * sprite)
+{
+ gFadeFootprintsTireTracksFuncs[sprite->data[0]](sprite);
+}
+
+static void FadeFootprintsTireTracks_Step0(struct Sprite * sprite)
+{
+ // Wait 40 frames before the flickering starts.
+ if (++sprite->data[1] > 40)
+ sprite->data[0] = 1;
+
+ UpdateObjectEventSpriteVisibility(sprite, FALSE);
+}
+
+static void FadeFootprintsTireTracks_Step1(struct Sprite * sprite)
+{
+ sprite->invisible ^= 1;
+ sprite->data[1]++;
+ UpdateObjectEventSpriteVisibility(sprite, sprite->invisible);
+ if (sprite->data[1] > 56)
+ {
+ FieldEffectStop(sprite, sprite->data[7]);
+ }
+}
+
+u32 FldEff_Splash(void)
+{
+ u8 objectEventId;
+ struct ObjectEvent * objectEvent;
+ u8 spriteId;
+ struct Sprite * sprite;
+ const struct ObjectEventGraphicsInfo * graphicsInfo;
+ struct Sprite * linkedSprite;
+
+ objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ objectEvent = &gObjectEvents[objectEventId];
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[13], 0, 0, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ linkedSprite = &gSprites[objectEvent->spriteId];
+ sprite->oam.priority = linkedSprite->oam.priority;
+ sprite->data[0] = gFieldEffectArguments[0];
+ sprite->data[1] = gFieldEffectArguments[1];
+ sprite->data[2] = gFieldEffectArguments[2];
+ sprite->pos2.y = (graphicsInfo->height >> 1) - 4;
+ PlaySE(SE_MIZU);
+ }
+ return 0;
+}
+
+void UpdateSplashFieldEffect(struct Sprite * sprite)
+{
+ u8 objectEventId;
+
+ if (sprite->animEnded || TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId))
+ {
+ FieldEffectStop(sprite, FLDEFF_SPLASH);
+ }
+ else
+ {
+ sprite->pos1.x = gSprites[gObjectEvents[objectEventId].spriteId].pos1.x;
+ sprite->pos1.y = gSprites[gObjectEvents[objectEventId].spriteId].pos1.y;
+ UpdateObjectEventSpriteVisibility(sprite, FALSE);
+ }
+}
+
+u32 FldEff_JumpSmallSplash(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[14], gFieldEffectArguments[0], gFieldEffectArguments[1], 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gFieldEffectArguments[3];
+ sprite->data[0] = gFieldEffectArguments[2];
+ sprite->data[1] = FLDEFF_JUMP_SMALL_SPLASH;
+ }
+ return 0;
+}
+
+u32 FldEff_JumpBigSplash(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[12], gFieldEffectArguments[0], gFieldEffectArguments[1], 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gFieldEffectArguments[3];
+ sprite->data[0] = gFieldEffectArguments[2];
+ sprite->data[1] = FLDEFF_JUMP_BIG_SPLASH;
+ }
+ return 0;
+}
+
+u32 FldEff_FeetInFlowingWater(void)
+{
+ u8 objectEventId;
+ struct ObjectEvent * objectEvent;
+ u8 spriteId;
+ struct Sprite * sprite;
+ const struct ObjectEventGraphicsInfo * graphicsInfo;
+
+ objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ objectEvent = &gObjectEvents[objectEventId];
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[13], 0, 0, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);
+ sprite = &gSprites[spriteId];
+ sprite->callback = UpdateFeetInFlowingWaterFieldEffect;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gSprites[objectEvent->spriteId].oam.priority;
+ sprite->data[0] = gFieldEffectArguments[0];
+ sprite->data[1] = gFieldEffectArguments[1];
+ sprite->data[2] = gFieldEffectArguments[2];
+ sprite->data[3] = -1;
+ sprite->data[4] = -1;
+ sprite->pos2.y = (graphicsInfo->height >> 1) - 4;
+ StartSpriteAnim(sprite, 1);
+ }
+ return 0;
+}
+
+static void UpdateFeetInFlowingWaterFieldEffect(struct Sprite * sprite)
+{
+ u8 objectEventId;
+ struct Sprite * linkedSprite;
+ struct ObjectEvent * objectEvent;
+
+ if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId) || !gObjectEvents[objectEventId].inShallowFlowingWater)
+ {
+ FieldEffectStop(sprite, FLDEFF_FEET_IN_FLOWING_WATER);
+ }
+ else
+ {
+ objectEvent = &gObjectEvents[objectEventId];
+ linkedSprite = &gSprites[objectEvent->spriteId];
+ sprite->pos1.x = linkedSprite->pos1.x;
+ sprite->pos1.y = linkedSprite->pos1.y;
+ sprite->subpriority = linkedSprite->subpriority;
+ UpdateObjectEventSpriteVisibility(sprite, FALSE);
+ if (objectEvent->currentCoords.x != sprite->data[3] || objectEvent->currentCoords.y != sprite->data[4])
+ {
+ sprite->data[3] = objectEvent->currentCoords.x;
+ sprite->data[4] = objectEvent->currentCoords.y;
+ if (!sprite->invisible)
+ {
+ PlaySE(SE_MIZU);
+ }
+ }
+ }
+}
+
+u32 FldEff_Ripple(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[5], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gFieldEffectArguments[3];
+ sprite->data[0] = FLDEFF_RIPPLE;
+ }
+ return 0;
+}
+
+u32 FldEff_HotSpringsWater(void)
+{
+ u8 objectEventId;
+ struct ObjectEvent * objectEvent;
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ objectEvent = &gObjectEvents[objectEventId];
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[31], 0, 0, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gSprites[objectEvent->spriteId].oam.priority;
+ sprite->data[0] = gFieldEffectArguments[0];
+ sprite->data[1] = gFieldEffectArguments[1];
+ sprite->data[2] = gFieldEffectArguments[2];
+ sprite->data[3] = gSprites[objectEvent->spriteId].pos1.x;
+ sprite->data[4] = gSprites[objectEvent->spriteId].pos1.y;
+ }
+ return 0;
+}
+
+void UpdateHotSpringsWaterFieldEffect(struct Sprite * sprite)
+{
+ u8 objectEventId;
+ const struct ObjectEventGraphicsInfo * graphicsInfo;
+ struct Sprite * linkedSprite;
+
+ if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId) || !gObjectEvents[objectEventId].inHotSprings)
+ {
+ FieldEffectStop(sprite, FLDEFF_HOT_SPRINGS_WATER);
+ }
+ else
+ {
+ graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId);
+ linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId];
+ sprite->pos1.x = linkedSprite->pos1.x;
+ sprite->pos1.y = (graphicsInfo->height >> 1) + linkedSprite->pos1.y - 8;
+ sprite->subpriority = linkedSprite->subpriority - 1;
+ UpdateObjectEventSpriteVisibility(sprite, FALSE);
+ }
+}
+
+u32 FldEff_Unknown19(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[17], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gFieldEffectArguments[3];
+ sprite->data[0] = FLDEFF_UNKNOWN_19;
+ }
+ return 0;
+}
+
+u32 FldEff_Unknown20(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[18], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gFieldEffectArguments[3];
+ sprite->data[0] = FLDEFF_UNKNOWN_20;
+ }
+ return 0;
+}
+
+u32 FldEff_Unknown21(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[19], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gFieldEffectArguments[3];
+ sprite->data[0] = FLDEFF_UNKNOWN_21;
+ }
+ return 0;
+}
+
+u32 FldEff_Unknown22(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[20], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gFieldEffectArguments[3];
+ sprite->data[0] = FLDEFF_UNKNOWN_22;
+ }
+ return 0;
+}
+
+void StartAshFieldEffect(s16 x, s16 y, u16 metatileId, s16 d)
+{
+ gFieldEffectArguments[0] = x;
+ gFieldEffectArguments[1] = y;
+ gFieldEffectArguments[2] = 0x52;
+ gFieldEffectArguments[3] = 1;
+ gFieldEffectArguments[4] = metatileId;
+ gFieldEffectArguments[5] = d;
+ FieldEffectStart(FLDEFF_ASH);
+}
+
+u32 FldEff_Ash(void)
+{
+ s16 x;
+ s16 y;
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ x = gFieldEffectArguments[0];
+ y = gFieldEffectArguments[1];
+ sub_8063BC4(&x, &y, 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[6], x, y, gFieldEffectArguments[2]);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gFieldEffectArguments[3];
+ sprite->data[1] = gFieldEffectArguments[0];
+ sprite->data[2] = gFieldEffectArguments[1];
+ sprite->data[3] = gFieldEffectArguments[4];
+ sprite->data[4] = gFieldEffectArguments[5];
+ }
+ return 0;
+}
+
+void (*const gAshFieldEffectFuncs[])(struct Sprite * sprite) = {
+ UpdateAshFieldEffect_Step0,
+ UpdateAshFieldEffect_Step1,
+ UpdateAshFieldEffect_Step2
+};
+
+void UpdateAshFieldEffect(struct Sprite * sprite)
+{
+ gAshFieldEffectFuncs[sprite->data[0]](sprite);
+}
+
+static void UpdateAshFieldEffect_Step0(struct Sprite * sprite)
+{
+ sprite->invisible = TRUE;
+ sprite->animPaused = TRUE;
+ if (--sprite->data[4] == 0)
+ sprite->data[0] = 1;
+}
+
+static void UpdateAshFieldEffect_Step1(struct Sprite * sprite)
+{
+ sprite->invisible = FALSE;
+ sprite->animPaused = FALSE;
+ MapGridSetMetatileIdAt(sprite->data[1], sprite->data[2], sprite->data[3]);
+ CurrentMapDrawMetatileAt(sprite->data[1], sprite->data[2]);
+ gObjectEvents[gPlayerAvatar.objectEventId].triggerGroundEffectsOnMove = TRUE;
+ sprite->data[0] = 2;
+}
+
+static void UpdateAshFieldEffect_Step2(struct Sprite * sprite)
+{
+ UpdateObjectEventSpriteVisibility(sprite, FALSE);
+ if (sprite->animEnded)
+ FieldEffectStop(sprite, FLDEFF_ASH);
+}
+
+u32 FldEff_SurfBlob(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[7], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x96);
+ if (spriteId !=MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.paletteNum = 0;
+ sprite->data[2] = gFieldEffectArguments[2];
+ sprite->data[3] = 0;
+ sprite->data[6] = -1;
+ sprite->data[7] = -1;
+ }
+ FieldEffectActiveListRemove(FLDEFF_SURF_BLOB);
+ return spriteId;
+}
+
+void sub_80DC44C(u8 spriteId, u8 value)
+{
+ gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF) | (value & 0xF);
+}
+
+void sub_80DC478(u8 spriteId, u8 value)
+{
+ gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF0) | ((value & 0xF) << 4);
+}
+
+void sub_80DC4A4(u8 spriteId, u8 value, s16 data1)
+{
+ gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF00) | ((value & 0xF) << 8);
+ gSprites[spriteId].data[1] = data1;
+}
+
+static u8 sub_80DC4D8(struct Sprite * sprite)
+{
+ return sprite->data[0] & 0xF;
+}
+
+static u8 sub_80DC4E0(struct Sprite * sprite)
+{
+ return (sprite->data[0] & 0xF0) >> 4;
+}
+
+static u8 sub_80DC4EC(struct Sprite * sprite)
+{
+ return (sprite->data[0] & 0xF00) >> 8;
+}
+
+void UpdateSurfBlobFieldEffect(struct Sprite * sprite)
+{
+ struct ObjectEvent * objectEvent;
+ struct Sprite * linkedSprite;
+
+ objectEvent = &gObjectEvents[sprite->data[2]];
+ linkedSprite = &gSprites[objectEvent->spriteId];
+ SynchroniseSurfAnim(objectEvent, sprite);
+ sub_80DC588(objectEvent, sprite);
+ CreateBobbingEffect(objectEvent, linkedSprite, sprite);
+ sprite->oam.priority = linkedSprite->oam.priority;
+}
+
+static void SynchroniseSurfAnim(struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ u8 surfBlobDirectionAnims[] = {
+ [DIR_NONE] = 0,
+ [DIR_SOUTH] = 0,
+ [DIR_NORTH] = 1,
+ [DIR_WEST] = 2,
+ [DIR_EAST] = 3
+ };
+
+ if (sub_80DC4E0(sprite) == 0)
+ StartSpriteAnimIfDifferent(sprite, surfBlobDirectionAnims[objectEvent->movementDirection]);
+}
+
+void sub_80DC588(struct ObjectEvent * objectEvent, struct Sprite * sprite)
+{
+ u8 i;
+ s16 x = objectEvent->currentCoords.x;
+ s16 y = objectEvent->currentCoords.y;
+ s32 spriteY = sprite->pos2.y;
+
+ if (spriteY == 0 && (x != sprite->data[6] || y != sprite->data[7]))
+ {
+ sprite->data[5] = spriteY;
+ sprite->data[6] = x;
+ sprite->data[7] = y;
+ for (i = DIR_SOUTH; i <= DIR_EAST; i++, x = sprite->data[6], y = sprite->data[7])
+ {
+ MoveCoords(i, &x, &y);
+ if (MapGridGetZCoordAt(x, y) == 3)
+ {
+ sprite->data[5]++;
+ break;
+ }
+ }
+ }
+}
+
+static void CreateBobbingEffect(struct ObjectEvent * objectEvent, struct Sprite * linkedSprite, struct Sprite * sprite)
+{
+ u16 unk_83FECFA[] = {7, 15};
+ u8 v0 = sub_80DC4D8(sprite);
+ if (v0 != 0)
+ {
+ if (((u16)(++ sprite->data[4]) & unk_83FECFA[sprite->data[5]]) == 0)
+ {
+ sprite->pos2.y += sprite->data[3];
+ }
+ if ((sprite->data[4] & 0x1F) == 0)
+ {
+ sprite->data[3] = -sprite->data[3];
+ }
+ if (v0 != 2)
+ {
+ if (sub_80DC4EC(sprite) == 0)
+ linkedSprite->pos2.y = sprite->pos2.y;
+ else
+ linkedSprite->pos2.y = sprite->data[1] + sprite->pos2.y;
+ if (sprite->animCmdIndex != 0)
+ linkedSprite->pos2.y++;
+ sprite->pos1.x = linkedSprite->pos1.x;
+ sprite->pos1.y = linkedSprite->pos1.y + 8;
+ }
+ }
+}
+
+u8 sub_80DC6B0(u8 oldSpriteId)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ spriteId = CreateSpriteAtEnd(&gDummySpriteTemplate, 0, 0, -1);
+ sprite = &gSprites[spriteId];
+ sprite->callback = sub_80DC700;
+ sprite->invisible = TRUE;
+ sprite->data[0] = oldSpriteId;
+ sprite->data[1] = 1;
+ return spriteId;
+}
+
+static void sub_80DC700(struct Sprite * sprite)
+{
+ struct Sprite * oldSprite;
+
+ oldSprite = &gSprites[sprite->data[0]];
+ if (((sprite->data[2]++) & 0x03) == 0)
+ {
+ oldSprite->pos2.y += sprite->data[1];
+ }
+ if ((sprite->data[2] & 0x0F) == 0)
+ {
+ sprite->data[1] = -sprite->data[1];
+ }
+}
+
+u32 FldEff_Dust(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[9], gFieldEffectArguments[0], gFieldEffectArguments[1], 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gFieldEffectArguments[3];
+ sprite->data[0] = gFieldEffectArguments[2];
+ sprite->data[1] = 10;
+ }
+ return 0;
+}
+
+u32 FldEff_SandPile(void)
+{
+ u8 objectEventId;
+ struct ObjectEvent * objectEvent;
+ u8 spriteId;
+ struct Sprite * sprite;
+ const struct ObjectEventGraphicsInfo * graphicsInfo;
+
+ objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ objectEvent = &gObjectEvents[objectEventId];
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[29], 0, 0, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gSprites[objectEvent->spriteId].oam.priority;
+ sprite->data[0] = gFieldEffectArguments[0];
+ sprite->data[1] = gFieldEffectArguments[1];
+ sprite->data[2] = gFieldEffectArguments[2];
+ sprite->data[3] = gSprites[objectEvent->spriteId].pos1.x;
+ sprite->data[4] = gSprites[objectEvent->spriteId].pos1.y;
+ sprite->pos2.y = (graphicsInfo->height >> 1) - 2;
+ SeekSpriteAnim(sprite, 2);
+ }
+ return 0;
+}
+
+void UpdateSandPileFieldEffect(struct Sprite * sprite)
+{
+ u8 objectEventId;
+ s16 x;
+ s16 y;
+
+ if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &objectEventId) || !gObjectEvents[objectEventId].inSandPile)
+ {
+ FieldEffectStop(sprite, FLDEFF_SAND_PILE);
+ }
+ else
+ {
+ y = gSprites[gObjectEvents[objectEventId].spriteId].pos1.y;
+ x = gSprites[gObjectEvents[objectEventId].spriteId].pos1.x;
+ if (x != sprite->data[3] || y != sprite->data[4])
+ {
+ sprite->data[3] = x;
+ sprite->data[4] = y;
+ if (sprite->animEnded)
+ {
+ StartSpriteAnim(sprite, 0);
+ }
+ }
+ sprite->pos1.x = x;
+ sprite->pos1.y = y;
+ sprite->subpriority = gSprites[gObjectEvents[objectEventId].spriteId].subpriority;
+ UpdateObjectEventSpriteVisibility(sprite, FALSE);
+ }
+}
+
+u32 FldEff_Bubbles(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 0);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[34], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = 1;
+ }
+ return 0;
+}
+
+void UpdateBubblesFieldEffect(struct Sprite * sprite)
+{
+ sprite->data[0] += 0x80;
+ sprite->data[0] &= 0x100;
+ sprite->pos1.y -= sprite->data[0] >> 8;
+ UpdateObjectEventSpriteVisibility(sprite, FALSE);
+ if (sprite->invisible || sprite->animEnded)
+ {
+ FieldEffectStop(sprite, FLDEFF_BUBBLES);
+ }
+}
+
+u32 FldEff_BerryTreeGrowthSparkle(void)
+{
+ /*u8 spriteId;
+ struct Sprite * sprite;
+
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 4);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[22], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = gFieldEffectArguments[3];
+ sprite->oam.paletteNum = 5;
+ sprite->data[0] = FLDEFF_BERRY_TREE_GROWTH_SPARKLE;
+ }*/
+ return 0;
+}
+
+u32 ShowTreeDisguiseFieldEffect(void)
+{
+ return ShowDisguiseFieldEffect(FLDEFF_TREE_DISGUISE, 24, 4);
+}
+
+u32 ShowMountainDisguiseFieldEffect(void)
+{
+ return ShowDisguiseFieldEffect(FLDEFF_MOUNTAIN_DISGUISE, 25, 3);
+}
+
+u32 ShowSandDisguiseFieldEffect(void)
+{
+ return ShowDisguiseFieldEffect(FLDEFF_SAND_DISGUISE, 28, 2);
+}
+
+static u32 ShowDisguiseFieldEffect(u8 fldEff, u8 templateIdx, u8 paletteNum)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+
+ if (TryGetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &spriteId))
+ {
+ FieldEffectActiveListRemove(fldEff);
+ return MAX_SPRITES;
+ }
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[templateIdx], 0, 0, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->coordOffsetEnabled++;
+ sprite->oam.paletteNum = paletteNum;
+ sprite->data[1] = fldEff;
+ sprite->data[2] = gFieldEffectArguments[0];
+ sprite->data[3] = gFieldEffectArguments[1];
+ sprite->data[4] = gFieldEffectArguments[2];
+ }
+ return spriteId;
+}
+
+void UpdateDisguiseFieldEffect(struct Sprite * sprite)
+{
+ u8 objectEventId;
+ const struct ObjectEventGraphicsInfo * graphicsInfo;
+ struct Sprite * linkedSprite;
+
+ if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[2], sprite->data[3], sprite->data[4], &objectEventId))
+ {
+ FieldEffectStop(sprite, sprite->data[1]);
+ }
+
+ graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId);
+ linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId];
+ sprite->invisible = linkedSprite->invisible;
+ sprite->pos1.x = linkedSprite->pos1.x;
+ sprite->pos1.y = (graphicsInfo->height >> 1) + linkedSprite->pos1.y - 16;
+ sprite->subpriority = linkedSprite->subpriority - 1;
+ if (sprite->data[0] == 1)
+ {
+ sprite->data[0]++;
+ StartSpriteAnim(sprite, 1);
+ }
+ if (sprite->data[0] == 2 && sprite->animEnded)
+ {
+ sprite->data[7] = 1;
+ }
+ if (sprite->data[0] == 3)
+ {
+ FieldEffectStop(sprite, sprite->data[1]);
+ }
+}
+
+void sub_80DCBB8(struct ObjectEvent * objectEvent)
+{
+ if (objectEvent->directionSequenceIndex == 1)
+ {
+ gSprites[objectEvent->fieldEffectSpriteId].data[0]++;
+ }
+}
+
+bool8 sub_80DCBE0(struct ObjectEvent * objectEvent)
+{
+ struct Sprite * sprite;
+
+ if (objectEvent->directionSequenceIndex == 2)
+ {
+ return TRUE;
+ }
+ if (objectEvent->directionSequenceIndex == 0)
+ {
+ return TRUE;
+ }
+ sprite = &gSprites[objectEvent->fieldEffectSpriteId];
+ if (sprite->data[7])
+ {
+ objectEvent->directionSequenceIndex = 2;
+ sprite->data[0]++;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+u32 FldEff_Sparkle(void)
+{
+ u8 spriteId;
+
+ gFieldEffectArguments[0] += 7;
+ gFieldEffectArguments[1] += 7;
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[35], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].oam.priority = gFieldEffectArguments[2];
+ gSprites[spriteId].coordOffsetEnabled = TRUE;
+ }
+ return 0;
+}
+
+void UpdateSparkleFieldEffect(struct Sprite * sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ if (sprite->animEnded)
+ {
+ sprite->invisible = TRUE;
+ sprite->data[0]++;
+ }
+
+ if (sprite->data[0] == 0)
+ return;
+ }
+
+ if (++sprite->data[1] > 34)
+ FieldEffectStop(sprite, FLDEFF_SPARKLE);
+}
+
+void sub_80DCCE0(struct Sprite * sprite)
+{
+ if (sprite->animEnded)
+ {
+ FieldEffectStop(sprite, sprite->data[1]);
+ }
+ else
+ {
+ UpdateObjectEventSpriteVisibility(sprite, FALSE);
+ SetObjectSubpriorityByZCoord(sprite->data[0], sprite, 0);
+ }
+}
+
+void WaitFieldEffectSpriteAnim(struct Sprite * sprite)
+{
+ if (sprite->animEnded)
+ FieldEffectStop(sprite, sprite->data[0]);
+ else
+ UpdateObjectEventSpriteVisibility(sprite, FALSE);
+}
+
+static void sub_80DCD48(struct Sprite * sprite, u8 z, u8 offset)
+{
+ u8 i;
+ s16 var, xhi, lyhi, yhi, ylo;
+ const struct ObjectEventGraphicsInfo * graphicsInfo; // Unused Variable
+ struct Sprite * linkedSprite;
+
+ SetObjectSubpriorityByZCoord(z, sprite, offset);
+ for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
+ {
+ struct ObjectEvent * objectEvent = &gObjectEvents[i];
+ if (objectEvent->active)
+ {
+ graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);
+ linkedSprite = &gSprites[objectEvent->spriteId];
+ xhi = sprite->pos1.x + sprite->centerToCornerVecX;
+ var = sprite->pos1.x - sprite->centerToCornerVecX;
+ if (xhi < linkedSprite->pos1.x && var > linkedSprite->pos1.x)
+ {
+ lyhi = linkedSprite->pos1.y + linkedSprite->centerToCornerVecY;
+ var = linkedSprite->pos1.y;
+ ylo = sprite->pos1.y - sprite->centerToCornerVecY;
+ yhi = ylo + linkedSprite->centerToCornerVecY;
+ if ((lyhi < yhi || lyhi < ylo) && var > yhi && sprite->subpriority <= linkedSprite->subpriority)
+ {
+ sprite->subpriority = linkedSprite->subpriority + 2;
+ break;
+ }
+ }
+ }
+ }
+}
diff --git a/src/field_fadetransition.c b/src/field_fadetransition.c
index 4edefd13a..58f654110 100644
--- a/src/field_fadetransition.c
+++ b/src/field_fadetransition.c
@@ -13,16 +13,17 @@
#include "metatile_behavior.h"
#include "quest_log.h"
#include "link.h"
-#include "event_object_80688E4.h"
+#include "event_object_movement.h"
#include "sound.h"
#include "field_door.h"
#include "field_effect.h"
#include "field_screen_effect.h"
-#include "event_object_movement.h"
#include "field_specials.h"
#include "event_object_lock.h"
#include "start_menu.h"
#include "constants/songs.h"
+#include "constants/event_object_movement.h"
+#include "constants/field_weather.h"
static void sub_807DF4C(u8 a0);
static void sub_807DFBC(u8 taskId);
@@ -50,18 +51,18 @@ void palette_bg_faded_fill_black(void)
CpuFastFill16(RGB_BLACK, gPlttBufferFaded, 0x400);
}
-void pal_fill_for_maplights(void)
+void WarpFadeInScreen(void)
{
- switch (sub_80C9DCC(get_map_light_from_warp0(), GetCurrentMapType()))
+ switch (MapTransitionIsExit(GetLastUsedWarpMapType(), GetCurrentMapType()))
{
case 0:
palette_bg_faded_fill_black();
- FadeScreen(0, 0);
+ FadeScreen(FADE_FROM_BLACK, 0);
palette_bg_faded_fill_black();
break;
case 1:
palette_bg_faded_fill_white();
- FadeScreen(2, 0);
+ FadeScreen(FADE_FROM_WHITE, 0);
palette_bg_faded_fill_white();
break;
}
@@ -69,42 +70,42 @@ void pal_fill_for_maplights(void)
static void sub_807DBAC(void)
{
- switch (sub_80C9DCC(get_map_light_from_warp0(), GetCurrentMapType()))
+ switch (MapTransitionIsExit(GetLastUsedWarpMapType(), GetCurrentMapType()))
{
case 0:
palette_bg_faded_fill_black();
- FadeScreen(0, 3);
+ FadeScreen(FADE_FROM_BLACK, 3);
palette_bg_faded_fill_black();
break;
case 1:
palette_bg_faded_fill_white();
- FadeScreen(2, 3);
+ FadeScreen(FADE_FROM_WHITE, 3);
palette_bg_faded_fill_white();
break;
}
}
-void sub_807DC00(void)
+void FadeInFromBlack(void)
{
palette_bg_faded_fill_black();
- FadeScreen(0, 0);
+ FadeScreen(FADE_FROM_BLACK, 0);
palette_bg_faded_fill_black();
}
-void sub_807DC18(void)
+void WarpFadeOutScreen(void)
{
const struct MapHeader *header = warp1_get_mapheader();
- if (header->regionMapSectionId != gMapHeader.regionMapSectionId && sub_80F8110(header->regionMapSectionId, FALSE))
- FadeScreen(1, 0);
+ if (header->regionMapSectionId != gMapHeader.regionMapSectionId && MapHasPreviewScreen(header->regionMapSectionId, MPS_TYPE_CAVE))
+ FadeScreen(FADE_TO_BLACK, 0);
else
{
- switch (sub_80C9D7C(GetCurrentMapType(), header->mapType))
+ switch (MapTransitionIsEnter(GetCurrentMapType(), header->mapType))
{
- case 0:
- FadeScreen(1, 0);
+ case FALSE:
+ FadeScreen(FADE_TO_BLACK, 0);
break;
- case 1:
- FadeScreen(3, 0);
+ case TRUE:
+ FadeScreen(FADE_TO_WHITE, 0);
break;
}
}
@@ -112,13 +113,13 @@ void sub_807DC18(void)
static void sub_807DC70(void)
{
- switch (sub_80C9D7C(GetCurrentMapType(), warp1_get_mapheader()->mapType))
+ switch (MapTransitionIsEnter(GetCurrentMapType(), warp1_get_mapheader()->mapType))
{
- case 0:
- FadeScreen(1, 3);
+ case FALSE:
+ FadeScreen(FADE_TO_BLACK, 3);
break;
- case 1:
- FadeScreen(3, 3);
+ case TRUE:
+ FadeScreen(FADE_TO_WHITE, 3);
break;
}
}
@@ -138,7 +139,7 @@ void sub_807DCE4(void)
{
ScriptContext2_Enable();
Overworld_PlaySpecialMapMusic();
- sub_807DC00();
+ FadeInFromBlack();
CreateTask(task0A_nop_for_a_while, 10);
}
@@ -155,14 +156,14 @@ void FieldCallback_ReturnToEventScript2(void)
{
ScriptContext2_Enable();
Overworld_PlaySpecialMapMusic();
- sub_807DC00();
+ FadeInFromBlack();
CreateTask(task0A_asap_script_env_2_enable_and_set_ctx_running, 10);
}
void sub_807DD44(void)
{
ScriptContext2_Enable();
- sub_807DC00();
+ FadeInFromBlack();
CreateTask(task0A_asap_script_env_2_enable_and_set_ctx_running, 10);
}
@@ -172,13 +173,13 @@ static void task_mpl_807DD60(u8 taskId)
switch (task->data[0])
{
case 0:
- task->data[1] = sub_8081150();
+ task->data[1] = CreateTask_ReestablishLinkInCableClubRoom();
task->data[0]++;
break;
case 1:
if (gTasks[task->data[1]].isActive != TRUE)
{
- pal_fill_for_maplights();
+ WarpFadeInScreen();
task->data[0]++;
}
break;
@@ -192,7 +193,7 @@ static void task_mpl_807DD60(u8 taskId)
}
}
-void sub_807DDD0(void)
+void FieldCB_ReturnToFieldWiredLink(void)
{
ScriptContext2_Enable();
Overworld_PlaySpecialMapMusic();
@@ -206,13 +207,13 @@ static void sub_807DDF0(u8 taskId)
switch (task->data[0])
{
case 0:
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
task->data[0]++;
break;
case 1:
if (IsLinkTaskFinished())
{
- pal_fill_for_maplights();
+ WarpFadeInScreen();
task->data[0]++;
}
break;
@@ -227,7 +228,7 @@ static void sub_807DDF0(u8 taskId)
}
}
-void sub_807DE58(void)
+void FieldCB_ReturnToFieldWirelessLink(void)
{
ScriptContext2_Enable();
Overworld_PlaySpecialMapMusic();
@@ -246,7 +247,7 @@ static void sub_807DE78(bool8 a0)
if (MetatileBehavior_IsWarpDoor_2(behavior) == TRUE)
{
func = sub_807DFBC;
- switch (sub_80C9DCC(get_map_light_from_warp0(), GetCurrentMapType()))
+ switch (MapTransitionIsExit(GetLastUsedWarpMapType(), GetCurrentMapType()))
{
case 0:
palette_bg_faded_fill_black();
@@ -278,9 +279,9 @@ static void sub_807DE78(bool8 a0)
static void sub_807DF4C(bool8 a0)
{
if (!a0)
- pal_fill_for_maplights();
+ WarpFadeInScreen();
else
- sub_807DC00();
+ FadeInFromBlack();
}
void sub_807DF64(void)
@@ -302,7 +303,7 @@ void sub_807DF7C(void)
static void sub_807DF94(void)
{
Overworld_PlaySpecialMapMusic();
- pal_fill_for_maplights();
+ WarpFadeInScreen();
sub_8111CF0();
PlaySE(SE_TK_WARPOUT);
CreateTask(sub_807E31C, 10);
@@ -349,7 +350,7 @@ static void sub_807DFBC(u8 taskId)
{
PlayerGetDestCoords(&task->data[12], &task->data[13]);
sub_807DCB0(TRUE);
- ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], 16);
+ ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], MOVEMENT_ACTION_WALK_NORMAL_DOWN);
task->data[0] = 8;
}
break;
@@ -373,7 +374,7 @@ static void sub_807DFBC(u8 taskId)
if (sub_807E418())
{
sub_807DCB0(TRUE);
- ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], 16);
+ ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], MOVEMENT_ACTION_WALK_NORMAL_DOWN);
task->data[0] = 2;
}
break;
@@ -485,7 +486,7 @@ static void Task_WaitFadeAndCreateStartMenuTask(u8 taskId)
void FadeTransition_FadeInOnReturnToStartMenu(void)
{
- sub_807DC00();
+ FadeInFromBlack();
CreateTask(Task_WaitFadeAndCreateStartMenuTask, 80);
ScriptContext2_Enable();
}
@@ -510,7 +511,7 @@ void sub_807E3EC(void)
{
ScriptContext2_Enable();
Overworld_PlaySpecialMapMusic();
- sub_807DC00();
+ FadeInFromBlack();
CreateTask(task_mpl_807E3C8, 10);
}
@@ -521,7 +522,7 @@ static bool32 sub_807E40C(void)
bool32 sub_807E418(void)
{
- if (IsWeatherNotFadingIn() == TRUE && sub_80F83B0())
+ if (IsWeatherNotFadingIn() == TRUE && ForestMapPreviewScreenIsRunning())
return TRUE;
else
return FALSE;
@@ -530,8 +531,8 @@ bool32 sub_807E418(void)
void DoWarp(void)
{
ScriptContext2_Enable();
- sub_8055F88();
- sub_807DC18();
+ TryFadeOutOldMapMusic();
+ WarpFadeOutScreen();
PlayRainStoppingSoundEffect();
PlaySE(SE_KAIDAN);
gFieldCallback = sub_807DF64;
@@ -541,8 +542,8 @@ void DoWarp(void)
void DoDiveWarp(void)
{
ScriptContext2_Enable();
- sub_8055F88();
- sub_807DC18();
+ TryFadeOutOldMapMusic();
+ WarpFadeOutScreen();
PlayRainStoppingSoundEffect();
gFieldCallback = sub_807DF64;
CreateTask(sub_807E718, 10);
@@ -580,31 +581,31 @@ void sub_807E524(void)
void DoFallWarp(void)
{
DoDiveWarp();
- gFieldCallback = sub_8084454;
+ gFieldCallback = FieldCB_FallWarpExit;
}
void sub_807E560(u8 a0)
{
ScriptContext2_Enable();
- sub_8084784(a0, 10);
+ StartEscalatorWarp(a0, 10);
}
void sub_807E57C(void)
{
ScriptContext2_Enable();
- sub_8084F2C(10);
+ StartLavaridgeGymB1FWarp(10);
}
void sub_807E58C(void)
{
ScriptContext2_Enable();
- sub_80853CC(10);
+ StartLavaridgeGym1FWarp(10);
}
void sub_807E59C(void)
{
ScriptContext2_Enable();
- sub_8055F88();
+ TryFadeOutOldMapMusic();
CreateTask(sub_807E784, 10);
gFieldCallback = sub_807DF94;
}
@@ -612,7 +613,7 @@ void sub_807E59C(void)
void sub_807E5C4(void)
{
ScriptContext2_Enable();
- sub_807DC18();
+ WarpFadeOutScreen();
CreateTask(sub_807E718, 10);
gFieldCallback = nullsub_60;
}
@@ -632,7 +633,7 @@ static void sub_807E5EC(u8 taskId)
break;
case 2:
WarpIntoMap();
- SetMainCallback2(sub_8056788);
+ SetMainCallback2(CB2_ReturnToFieldCableClub);
DestroyTask(taskId);
break;
}
@@ -641,8 +642,8 @@ static void sub_807E5EC(u8 taskId)
void DoCableClubWarp(void)
{
ScriptContext2_Enable();
- sub_8055F88();
- sub_807DC18();
+ TryFadeOutOldMapMusic();
+ WarpFadeOutScreen();
PlaySE(SE_KAIDAN);
CreateTask(sub_807E5EC, 10);
}
@@ -654,15 +655,15 @@ static void sub_807E678(u8 taskId)
{
case 0:
ClearLinkCallback_2();
- FadeScreen(1, 0);
- sub_8055F88();
+ FadeScreen(FADE_TO_BLACK, 0);
+ TryFadeOutOldMapMusic();
PlaySE(SE_KAIDAN);
data[0]++;
break;
case 1:
if (!sub_807E40C() && BGMusicStopped())
{
- sub_800AAC0();
+ Link_TryStartSend5FFF();
data[0]++;
}
break;
@@ -719,7 +720,7 @@ static void sub_807E784(u8 taskId)
case 1:
if (!sub_805DAD0())
{
- sub_807DC18();
+ WarpFadeOutScreen();
task->data[0]++;
}
break;
@@ -753,7 +754,7 @@ static void sub_807E80C(u8 taskId)
if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE)
{
ObjectEventClearHeldMovementIfActive(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)]);
- ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], 17);
+ ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], MOVEMENT_ACTION_WALK_NORMAL_UP);
task->data[0] = 2;
}
break;
@@ -773,14 +774,14 @@ static void sub_807E80C(u8 taskId)
}
break;
case 4:
- sub_8055F88();
- sub_807DC18();
+ TryFadeOutOldMapMusic();
+ WarpFadeOutScreen();
PlayRainStoppingSoundEffect();
task->data[0] = 0;
task->func = sub_807E718;
break;
case 5:
- sub_8055F88();
+ TryFadeOutOldMapMusic();
PlayRainStoppingSoundEffect();
task->data[0] = 0;
task->func = sub_807E718;
@@ -808,7 +809,7 @@ static void sub_807E980(u8 taskId)
data[15]--;
else
{
- sub_8055F88();
+ TryFadeOutOldMapMusic();
PlayRainStoppingSoundEffect();
playerSpr->oam.priority = 1;
sub_807EB64(data[1], &data[2], &data[3]);
@@ -822,7 +823,7 @@ static void sub_807E980(u8 taskId)
data[15]++;
if (data[15] >= 12)
{
- sub_807DC18();
+ WarpFadeOutScreen();
data[0]++;
}
break;
@@ -906,7 +907,7 @@ static void sub_807EC34(u8 taskId)
break;
case 0:
Overworld_PlaySpecialMapMusic();
- pal_fill_for_maplights();
+ WarpFadeInScreen();
ScriptContext2_Enable();
sub_807ECBC(&data[1], &data[2], &data[3], &data[4], &data[5]);
data[0]++;
diff --git a/src/field_message_box.c b/src/field_message_box.c
new file mode 100644
index 000000000..1909fd398
--- /dev/null
+++ b/src/field_message_box.c
@@ -0,0 +1,140 @@
+#include "global.h"
+#include "gflib.h"
+#include "new_menu_helpers.h"
+#include "quest_log.h"
+#include "script.h"
+#include "text_window.h"
+
+static EWRAM_DATA u8 sMessageBoxType = 0;
+
+static void textbox_fdecode_auto_and_task_add(const u8 *str);
+static void textbox_auto_and_task_add(void);
+
+void sub_8069348(void)
+{
+ sMessageBoxType = 0;
+ gTextFlags.canABSpeedUpPrint = FALSE;
+ gTextFlags.useAlternateDownArrow = FALSE;
+ gTextFlags.autoScroll = FALSE;
+}
+
+static void Task_RunFieldMessageBoxPrinter(u8 taskId)
+{
+ struct Task * task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ case 0:
+ if (gQuestLogState == QL_STATE_2)
+ {
+ gTextFlags.autoScroll = TRUE;
+ TextWindow_LoadTilesStdFrame1(0, 0x200);
+ }
+ else if (!IsMsgSignPost())
+ {
+ LoadStdWindowFrameGfx();
+ }
+ else
+ {
+ LoadSignPostWindowFrameGfx();
+ }
+ task->data[0]++;
+ break;
+ case 1:
+ DrawDialogueFrame(0, TRUE);
+ task->data[0]++;
+ break;
+ case 2:
+ if (RunTextPrinters_CheckPrinter0Active() != TRUE)
+ {
+ sMessageBoxType = 0;
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void task_add_textbox(void)
+{
+ CreateTask(Task_RunFieldMessageBoxPrinter, 80);
+}
+
+static void task_del_textbox(void)
+{
+ u8 taskId = FindTaskIdByFunc(Task_RunFieldMessageBoxPrinter);
+ if (taskId != 0xFF)
+ DestroyTask(taskId);
+}
+
+bool8 ShowFieldMessage(const u8 *str)
+{
+ if (sMessageBoxType != 0)
+ return FALSE;
+ textbox_fdecode_auto_and_task_add(str);
+ sMessageBoxType = 2;
+ return TRUE;
+}
+
+bool8 ShowFieldAutoScrollMessage(const u8 *str)
+{
+ if (sMessageBoxType != 0)
+ return FALSE;
+ sMessageBoxType = 3;
+ textbox_fdecode_auto_and_task_add(str);
+ return TRUE;
+}
+
+bool8 sub_806948C(const u8 *str)
+{
+ sMessageBoxType = 3;
+ textbox_fdecode_auto_and_task_add(str);
+ return TRUE;
+}
+
+bool8 sub_80694A4(const u8 *str)
+{
+ if (sMessageBoxType != 0)
+ return FALSE;
+ sMessageBoxType = 2;
+ textbox_auto_and_task_add();
+ return TRUE;
+}
+
+static void textbox_fdecode_auto_and_task_add(const u8 *str)
+{
+ StringExpandPlaceholders(gStringVar4, str);
+ AddTextPrinterDiffStyle(TRUE);
+ task_add_textbox();
+}
+
+static void textbox_auto_and_task_add(void)
+{
+ AddTextPrinterDiffStyle(TRUE);
+ task_add_textbox();
+}
+
+void HideFieldMessageBox(void)
+{
+ task_del_textbox();
+ ClearDialogWindowAndFrame(0, TRUE);
+ sMessageBoxType = 0;
+}
+
+u8 textbox_any_visible(void)
+{
+ return sMessageBoxType;
+}
+
+bool8 IsFieldMessageBoxHidden(void)
+{
+ if (sMessageBoxType == 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_8069538(void)
+{
+ task_del_textbox();
+ DrawStdWindowFrame(0, TRUE);
+ sMessageBoxType = 0;
+}
diff --git a/src/field_poison.c b/src/field_poison.c
index 07c2b763f..aa77375a5 100644
--- a/src/field_poison.c
+++ b/src/field_poison.c
@@ -48,42 +48,45 @@ static bool32 MonFaintedFromPoison(u8 partyIdx)
return FALSE;
}
-static void Task_WhiteOut(u8 taskId)
+#define tState data[0]
+#define tPartyId data[1]
+
+static void Task_TryFieldPoisonWhiteOut(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- switch (data[0])
+ switch (tState)
{
case 0:
- for (; data[1] < PARTY_SIZE; data[1]++)
+ for (; tPartyId < PARTY_SIZE; tPartyId++)
{
- if (MonFaintedFromPoison(data[1]))
+ if (MonFaintedFromPoison(tPartyId))
{
- FaintFromFieldPoison(data[1]);
+ FaintFromFieldPoison(tPartyId);
ShowFieldMessage(gText_PkmnFainted3);
data[0]++;
return;
}
}
- data[0] = 2;
+ tState = 2;
break;
case 1:
if (IsFieldMessageBoxHidden())
- data[0]--;
+ tState--;
break;
case 2:
if (AllMonsFainted())
- gSpecialVar_Result = 1;
+ gSpecialVar_Result = TRUE;
else
- gSpecialVar_Result = 0;
+ gSpecialVar_Result = FALSE;
EnableBothScriptContexts();
DestroyTask(taskId);
break;
}
}
-void ExecuteWhiteOut(void)
+void TryFieldPoisonWhiteOut(void)
{
- CreateTask(Task_WhiteOut, 80);
+ CreateTask(Task_TryFieldPoisonWhiteOut, 80);
ScriptContext1_Stop();
}
diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c
index 0a3224cfa..85739ad24 100644
--- a/src/field_screen_effect.c
+++ b/src/field_screen_effect.c
@@ -212,7 +212,7 @@ void WriteFlashScanlineEffectBuffer(u8 flashLevel)
}
}
-void sub_807F0B0(void)
+void Script_FadeOutMapMusic(void)
{
Overworld_FadeOutMapMusic();
CreateTask(Task_EnableScriptAfterMusicFade, 80);
@@ -430,7 +430,7 @@ static void sub_807F45C(u8 taskId)
CopyWindowToVram(windowId, 1);
RemoveWindow(windowId);
palette_bg_faded_fill_black();
- sub_807DC00();
+ FadeInFromBlack();
++gTasks[taskId].data[0];
break;
case 3:
@@ -444,7 +444,7 @@ static void sub_807F45C(u8 taskId)
if (sub_807E418() == TRUE)
{
DestroyTask(taskId);
- ScriptContext1_SetupScript(EventScript_MomHeal);
+ ScriptContext1_SetupScript(EventScript_AfterWhiteOutMomHeal);
}
break;
}
diff --git a/src/field_special_scene.c b/src/field_special_scene.c
index 4f9446942..327426231 100644
--- a/src/field_special_scene.c
+++ b/src/field_special_scene.c
@@ -21,6 +21,7 @@ void nullsub_60(void)
{
}
-void nullsub_61(void)
+// From Hoenn's SS Tidal
+void LookThroughPorthole(void)
{
}
diff --git a/src/field_specials.c b/src/field_specials.c
index bb320d42a..ea4ed9449 100644
--- a/src/field_specials.c
+++ b/src/field_specials.c
@@ -41,11 +41,12 @@
#include "constants/songs.h"
#include "constants/species.h"
#include "constants/items.h"
-#include "constants/object_events.h"
#include "constants/maps.h"
-#include "constants/region_map.h"
+#include "constants/region_map_sections.h"
#include "constants/moves.h"
#include "constants/menu.h"
+#include "constants/event_objects.h"
+#include "constants/metatile_labels.h"
static EWRAM_DATA u8 sElevatorCurrentFloorWindowId = 0;
static EWRAM_DATA u16 sElevatorScroll = 0;
@@ -76,12 +77,12 @@ static void Task_SuspendListMenu(u8 taskId);
static void Task_RedrawScrollArrowsAndWaitInput(u8 taskId);
static void Task_CreateMenuRemoveScrollIndicatorArrowPair(u8 taskId);
static void Task_ListMenuRemoveScrollIndicatorArrowPair(u8 taskId);
-static u16 GetStarterPokemon(u16 starterIdx);
+static u16 GetStarterSpeciesById(u16 starterIdx);
static void ChangeBoxPokemonNickname_CB(void);
static void ChangePokemonNickname_CB(void);
static void Task_RunPokemonLeagueLightingEffect(u8 taskId);
static void Task_CancelPokemonLeagueLightingEffect(u8 taskId);
-static void Task_DoDeoxysRockInteraction(u8 taskId);
+static void Task_DoDeoxysTriangleInteraction(u8 taskId);
static void MoveDeoxysObject(u8 num);
static void Task_WaitDeoxysFieldEffect(u8 taskId);
static void Task_WingFlapSound(u8 taskId);
@@ -92,14 +93,14 @@ static u8 *const sStringVarPtrs[] = {
gStringVar3
};
-void Special_ShowDiploma(void)
+void ShowDiploma(void)
{
sub_8112364();
SetMainCallback2(CB2_ShowDiploma);
ScriptContext2_Enable();
}
-void Special_ForcePlayerOntoBike(void)
+void ForcePlayerOntoBike(void)
{
if (gPlayerAvatar.flags & 1)
SetPlayerAvatarTransitionFlags(2);
@@ -112,7 +113,7 @@ void nullsub_74(void)
}
-u8 Special_GetPlayerAvatarBike(void)
+u8 GetPlayerAvatarBike(void)
{
if (TestPlayerAvatarFlags(4))
return 1;
@@ -122,24 +123,24 @@ u8 Special_GetPlayerAvatarBike(void)
return 0;
}
-void Special_ShowStringVar4AsFieldMessage(void)
+void ShowFieldMessageStringVar4(void)
{
ShowFieldMessage(gStringVar4);
}
-void Special_GetPlayerXY(void)
+void GetPlayerXY(void)
{
gSpecialVar_0x8004 = gSaveBlock1Ptr->pos.x;
gSpecialVar_0x8005 = gSaveBlock1Ptr->pos.y;
}
-u8 Special_GetPlayerTrainerIdOnesDigit(void)
+u8 GetPlayerTrainerIdOnesDigit(void)
{
u16 playerId = (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0];
return playerId % 10;
}
-void Special_BufferBigGuyOrBigGirlString(void)
+void BufferBigGuyOrBigGirlString(void)
{
if (gSaveBlock2Ptr->playerGender == MALE)
StringCopy(gStringVar1, gText_BigGuy);
@@ -147,7 +148,7 @@ void Special_BufferBigGuyOrBigGirlString(void)
StringCopy(gStringVar1, gText_BigGirl);
}
-void Special_BufferSonOrDaughterString(void)
+void BufferSonOrDaughterString(void)
{
if (gSaveBlock2Ptr->playerGender == MALE)
StringCopy(gStringVar1, gText_Son);
@@ -155,17 +156,17 @@ void Special_BufferSonOrDaughterString(void)
StringCopy(gStringVar1, gText_Daughter);
}
-u8 Special_GetBattleOutcome(void)
+u8 GetBattleOutcome(void)
{
return gBattleOutcome;
}
-void Special_SetHiddenItemFlag(void)
+void SetHiddenItemFlag(void)
{
FlagSet(gSpecialVar_0x8004);
}
-u8 Special_GetLeadMonFriendship(void)
+u8 GetLeadMonFriendship(void)
{
struct Pokemon * pokemon = &gPlayerParty[GetLeadMonIndex()];
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) == 255)
@@ -184,13 +185,13 @@ u8 Special_GetLeadMonFriendship(void)
return 0;
}
-void Special_TownMap(void)
+void ShowTownMap(void)
{
sub_8112364();
sub_80BFF50(1, CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
-bool8 Special_PlayerHasGrassPokemonInParty(void)
+bool8 PlayerHasGrassPokemonInParty(void)
{
u8 i;
struct Pokemon * pokemon;
@@ -211,34 +212,41 @@ bool8 Special_PlayerHasGrassPokemonInParty(void)
return FALSE;
}
-void Special_AnimatePcTurnOn(void)
+#define tState data[0]
+#define tTimer data[1]
+
+void AnimatePcTurnOn(void)
{
u8 taskId;
if (FuncIsActiveTask(Task_AnimatePcTurnOn) != TRUE)
{
taskId = CreateTask(Task_AnimatePcTurnOn, 8);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[1] = 0;
+ gTasks[taskId].tState = 0;
+ gTasks[taskId].tTimer = 0;
}
}
+// PC flickers on and off while turning on
static void Task_AnimatePcTurnOn(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- if (data[1] == 6)
+ if (tTimer == 6)
{
- PcTurnOnUpdateMetatileId(data[0] & 1);
+ PcTurnOnUpdateMetatileId(tState & 1);
DrawWholeMapView();
- data[1] = 0;
- data[0]++;
- if (data[0] == 5)
+ tTimer = 0;
+ tState++;
+ if (tState == 5)
DestroyTask(taskId);
}
- data[1]++;
+ tTimer++;
}
-static void PcTurnOnUpdateMetatileId(bool16 a0)
+#undef tState
+#undef tTimer
+
+static void PcTurnOnUpdateMetatileId(bool16 flickerOff)
{
u16 metatileId = 0;
s8 deltaX = 0;
@@ -260,28 +268,28 @@ static void PcTurnOnUpdateMetatileId(bool16 a0)
deltaY = -1;
break;
}
- if (a0)
+ if (flickerOff)
{
if (gSpecialVar_0x8004 == 0)
- metatileId = 0x62;
+ metatileId = METATILE_Building_PCOff;
else if (gSpecialVar_0x8004 == 1)
- metatileId = 0x28F;
+ metatileId = METATILE_GenericBuilding1_PlayersPCOff;
else if (gSpecialVar_0x8004 == 2)
- metatileId = 0x28F;
+ metatileId = METATILE_GenericBuilding1_PlayersPCOff;
}
else
{
if (gSpecialVar_0x8004 == 0)
- metatileId = 0x63;
+ metatileId = METATILE_Building_PCOn;
else if (gSpecialVar_0x8004 == 1)
- metatileId = 0x28A;
+ metatileId = METATILE_GenericBuilding1_PlayersPCOn;
else if (gSpecialVar_0x8004 == 2)
- metatileId = 0x28A;
+ metatileId = METATILE_GenericBuilding1_PlayersPCOn;
}
- MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + deltaX + 7, gSaveBlock1Ptr->pos.y + deltaY + 7, metatileId | 0xC00);
+ MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + deltaX + 7, gSaveBlock1Ptr->pos.y + deltaY + 7, metatileId | METATILE_COLLISION_MASK);
}
-void Special_AnimatePcTurnOff()
+void AnimatePcTurnOff()
{
u16 metatileId = 0;
s8 deltaX = 0;
@@ -304,18 +312,19 @@ void Special_AnimatePcTurnOff()
break;
}
if (gSpecialVar_0x8004 == 0)
- metatileId = 0x62;
+ metatileId = METATILE_Building_PCOff;
else if (gSpecialVar_0x8004 == 1)
- metatileId = 0x28F;
+ metatileId = METATILE_GenericBuilding1_PlayersPCOff;
else if (gSpecialVar_0x8004 == 2)
- metatileId = 0x28F;
- MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + deltaX + 7, gSaveBlock1Ptr->pos.y + deltaY + 7, metatileId | 0xC00);
+ metatileId = METATILE_GenericBuilding1_PlayersPCOff;
+ MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + deltaX + 7, gSaveBlock1Ptr->pos.y + deltaY + 7, metatileId | METATILE_COLLISION_MASK);
DrawWholeMapView();
}
void SpawnCameraObject(void)
{
- u8 objectEventId = SpawnSpecialObjectEventParameterized(OBJECT_EVENT_GFX_YOUNGSTER, 8, 127, gSaveBlock1Ptr->pos.x + 7, gSaveBlock1Ptr->pos.y + 7, 3);
+
+ u8 objectEventId = SpawnSpecialObjectEventParameterized(OBJ_EVENT_GFX_YOUNGSTER, 8, OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->pos.x + 7, gSaveBlock1Ptr->pos.y + 7, 3);
gObjectEvents[objectEventId].invisible = TRUE;
CameraObjectSetFollowedObjectId(gObjectEvents[objectEventId].spriteId);
}
@@ -326,7 +335,7 @@ void RemoveCameraObject(void)
RemoveObjectEventByLocalIdAndMap(127, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
}
-void Special_BufferEReaderTrainerName5(void)
+void BufferEReaderTrainerName(void)
{
CopyEReaderTrainerName5(gStringVar1);
}
@@ -381,7 +390,7 @@ static const u8 sSlotMachineIndices[] = {
5
};
-u8 Special_GetRandomSlotMachine(void)
+u8 GetRandomSlotMachineId(void)
{
u16 rval = Random() % NELEMS(sSlotMachineIndices);
return sSlotMachineIndices[rval];
@@ -404,7 +413,7 @@ void GiveLeadMonEffortRibbon(void)
SetMonData(&gPlayerParty[leadMonIdx], MON_DATA_EFFORT_RIBBON, &param);
}
-bool8 ScrSpecial_AreLeadMonEVsMaxedOut(void)
+bool8 AreLeadMonEVsMaxedOut(void)
{
u8 leadMonIndex = GetLeadMonIndex();
if (GetMonEVCount(&gPlayerParty[leadMonIndex]) >= 510)
@@ -413,9 +422,9 @@ bool8 ScrSpecial_AreLeadMonEVsMaxedOut(void)
return FALSE;
}
-bool8 Special_IsStarterFirstStageInParty(void)
+bool8 IsStarterFirstStageInParty(void)
{
- u16 species = GetStarterPokemon(VarGet(VAR_STARTER_MON));
+ u16 species = GetStarterSpeciesById(VarGet(VAR_STARTER_MON));
u8 partyCount = CalculatePlayerPartyCount();
u8 i;
for (i = 0; i < partyCount; i++)
@@ -426,7 +435,7 @@ bool8 Special_IsStarterFirstStageInParty(void)
return FALSE;
}
-bool8 Special_IsThereRoomInAnyBoxForMorePokemon(void)
+bool8 IsThereRoomInAnyBoxForMorePokemon(void)
{
u16 i;
u16 j;
@@ -441,7 +450,7 @@ bool8 Special_IsThereRoomInAnyBoxForMorePokemon(void)
return FALSE;
}
-bool8 Special_CheckPartyPokerus(void)
+bool8 IsPokerusInParty(void)
{
if (!CheckPartyPokerus(gPlayerParty, 0x3F))
return FALSE;
@@ -455,7 +464,7 @@ bool8 Special_CheckPartyPokerus(void)
#define tDuration data[3]
#define tYtrans data[4]
-void Special_ShakeScreen(void)
+void ShakeScreen(void)
{
/*
* 0x8004 = x translation
@@ -518,12 +527,12 @@ u8 GetLeadMonIndex(void)
return 0;
}
-u16 Special_GetSpeciesOfPartySlot_x8004(void)
+u16 GetPartyMonSpecies(void)
{
return GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES2, NULL);
}
-bool8 Special_IsMonOTNameNotPlayers(void)
+bool8 IsMonOTNameNotPlayers(void)
{
GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_OT_NAME, gStringVar1);
@@ -533,7 +542,8 @@ bool8 Special_IsMonOTNameNotPlayers(void)
return TRUE;
}
-void nullsub_75(void)
+// Used to nop all the unused specials from RS
+void NullFieldSpecial(void)
{
}
@@ -545,7 +555,7 @@ void sub_80CADC4(void)
sub_809D424();
}
-void Special_SetVermilionTrashCans(void)
+void SetVermilionTrashCans(void)
{
u16 idx = (Random() % 15) + 1;
gSpecialVar_0x8004 = idx;
@@ -672,10 +682,10 @@ void IncrementResortGorgeousStepCounter(void)
}
}
-void Special_SampleResortGorgeousMonAndReward(void)
+void SampleResortGorgeousMonAndReward(void)
{
- u16 var4036 = VarGet(VAR_RESORT_GORGEOUS_REQUESTED_MON);
- if (var4036 == SPECIES_NONE || var4036 == 0xFFFF)
+ u16 requestedSpecies = VarGet(VAR_RESORT_GORGEOUS_REQUESTED_MON);
+ if (requestedSpecies == SPECIES_NONE || requestedSpecies == 0xFFFF)
{
VarSet(VAR_RESORT_GORGEOUS_REQUESTED_MON, SampleResortGorgeousMon());
VarSet(VAR_RESORT_GORGEOUS_REWARD, SampleResortGorgeousReward());
@@ -712,7 +722,7 @@ static u16 SampleResortGorgeousReward(void)
return sResortGorgeousDeluxeRewards[Random() % NELEMS(sResortGorgeousDeluxeRewards)];
}
-bool8 Special_CheckAddCoins(void)
+bool8 CheckAddCoins(void)
{
if (gSpecialVar_Result + gSpecialVar_0x8006 > 9999)
return FALSE;
@@ -769,15 +779,39 @@ static const u8 sUnused_83F5B84[] = {
};
static const u16 sElevatorWindowMetatilesGoingUp[][3] = {
- {0x2e8, 0x2e9, 0x2ea},
- {0x2f0, 0x2f1, 0x2f2},
- {0x2f8, 0x2f9, 0x2fa}
+ {
+ METATILE_SilphCo_ElevatorWindow_Top0,
+ METATILE_SilphCo_ElevatorWindow_Top1,
+ METATILE_SilphCo_ElevatorWindow_Top2
+ },
+ {
+ METATILE_SilphCo_ElevatorWindow_Mid0,
+ METATILE_SilphCo_ElevatorWindow_Mid1,
+ METATILE_SilphCo_ElevatorWindow_Mid2
+ },
+ {
+ METATILE_SilphCo_ElevatorWindow_Bottom0,
+ METATILE_SilphCo_ElevatorWindow_Bottom1,
+ METATILE_SilphCo_ElevatorWindow_Bottom2
+ }
};
static const u16 sElevatorWindowMetatilesGoingDown[][3] = {
- {0x2e8, 0x2ea, 0x2e9},
- {0x2f0, 0x2f2, 0x2f1},
- {0x2f8, 0x2fa, 0x2f9}
+ {
+ METATILE_SilphCo_ElevatorWindow_Top0,
+ METATILE_SilphCo_ElevatorWindow_Top2,
+ METATILE_SilphCo_ElevatorWindow_Top1
+ },
+ {
+ METATILE_SilphCo_ElevatorWindow_Mid0,
+ METATILE_SilphCo_ElevatorWindow_Mid2,
+ METATILE_SilphCo_ElevatorWindow_Mid1
+ },
+ {
+ METATILE_SilphCo_ElevatorWindow_Bottom0,
+ METATILE_SilphCo_ElevatorWindow_Bottom2,
+ METATILE_SilphCo_ElevatorWindow_Bottom1
+ }
};
static const u8 sElevatorAnimationDuration[] = {
@@ -804,7 +838,7 @@ static const u8 sElevatorWindowAnimDuration[] = {
27
};
-void Special_GetElevatorFloor(void)
+void GetElevatorFloor(void)
{
u16 floor = 4;
if (gSaveBlock1Ptr->warp2.mapGroup == MAP_GROUP(ROCKET_HIDEOUT_B1F))
@@ -876,22 +910,22 @@ void Special_GetElevatorFloor(void)
break;
}
}
- if (gSaveBlock1Ptr->warp2.mapGroup == MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER_1F))
+ if (gSaveBlock1Ptr->warp2.mapGroup == MAP_GROUP(TRAINER_TOWER_1F))
{
switch (gSaveBlock1Ptr->warp2.mapNum)
{
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_1F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_2F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_3F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_4F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_5F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_6F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_7F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_8F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_ROOF):
+ case MAP_NUM(TRAINER_TOWER_1F):
+ case MAP_NUM(TRAINER_TOWER_2F):
+ case MAP_NUM(TRAINER_TOWER_3F):
+ case MAP_NUM(TRAINER_TOWER_4F):
+ case MAP_NUM(TRAINER_TOWER_5F):
+ case MAP_NUM(TRAINER_TOWER_6F):
+ case MAP_NUM(TRAINER_TOWER_7F):
+ case MAP_NUM(TRAINER_TOWER_8F):
+ case MAP_NUM(TRAINER_TOWER_ROOF):
floor = 15;
break;
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_LOBBY):
+ case MAP_NUM(TRAINER_TOWER_LOBBY):
floor = 3;
break;
}
@@ -899,7 +933,7 @@ void Special_GetElevatorFloor(void)
VarSet(VAR_ELEVATOR_FLOOR, floor);
}
-u16 Special_InitElevatorFloorSelectMenuPos(void)
+u16 InitElevatorFloorSelectMenuPos(void)
{
sElevatorScroll = 0;
sElevatorCursorPos = 0;
@@ -992,23 +1026,23 @@ u16 Special_InitElevatorFloorSelectMenuPos(void)
break;
}
}
- if (gSaveBlock1Ptr->warp2.mapGroup == MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER_1F))
+ if (gSaveBlock1Ptr->warp2.mapGroup == MAP_GROUP(TRAINER_TOWER_1F))
{
switch (gSaveBlock1Ptr->warp2.mapNum)
{
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_1F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_2F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_3F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_4F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_5F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_6F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_7F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_8F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_ROOF):
+ case MAP_NUM(TRAINER_TOWER_1F):
+ case MAP_NUM(TRAINER_TOWER_2F):
+ case MAP_NUM(TRAINER_TOWER_3F):
+ case MAP_NUM(TRAINER_TOWER_4F):
+ case MAP_NUM(TRAINER_TOWER_5F):
+ case MAP_NUM(TRAINER_TOWER_6F):
+ case MAP_NUM(TRAINER_TOWER_7F):
+ case MAP_NUM(TRAINER_TOWER_8F):
+ case MAP_NUM(TRAINER_TOWER_ROOF):
sElevatorScroll = 0;
sElevatorCursorPos = 0;
break;
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_LOBBY):
+ case MAP_NUM(TRAINER_TOWER_LOBBY):
sElevatorScroll = 0;
sElevatorCursorPos = 1;
break;
@@ -1017,7 +1051,7 @@ u16 Special_InitElevatorFloorSelectMenuPos(void)
return sElevatorCursorPos;
}
-void Special_AnimateElevator(void)
+void AnimateElevator(void)
{
u16 nfloors;
s16 *data = gTasks[CreateTask(Task_ElevatorShake, 9)].data;
@@ -1062,7 +1096,7 @@ static void Task_ElevatorShake(u8 taskId)
}
}
-void Special_DrawElevatorCurrentFloorWindow(void)
+void DrawElevatorCurrentFloorWindow(void)
{
const u8 *floorname;
u32 strwidth;
@@ -1080,7 +1114,7 @@ void Special_DrawElevatorCurrentFloorWindow(void)
}
}
-void Special_CloseElevatorCurrentFloorWindow(void)
+void CloseElevatorCurrentFloorWindow(void)
{
ClearStdWindowAndFrameToTransparent(sElevatorCurrentFloorWindowId, TRUE);
RemoveWindow(sElevatorCurrentFloorWindowId);
@@ -1113,7 +1147,7 @@ static void Task_AnimateElevatorWindowView(u8 taskId)
{
for (j = 0; j < 3; j++)
{
- MapGridSetMetatileIdAt(j + 8, i + 7, sElevatorWindowMetatilesGoingUp[i][data[0] % 3] | 0xC00);
+ MapGridSetMetatileIdAt(j + 8, i + 7, sElevatorWindowMetatilesGoingUp[i][data[0] % 3] | METATILE_COLLISION_MASK);
}
}
}
@@ -1123,7 +1157,7 @@ static void Task_AnimateElevatorWindowView(u8 taskId)
{
for (j = 0; j < 3; j++)
{
- MapGridSetMetatileIdAt(j + 8, i + 7, sElevatorWindowMetatilesGoingDown[i][data[0] % 3] | 0xC00);
+ MapGridSetMetatileIdAt(j + 8, i + 7, sElevatorWindowMetatilesGoingDown[i][data[0] % 3] | METATILE_COLLISION_MASK);
}
}
}
@@ -1135,7 +1169,7 @@ static void Task_AnimateElevatorWindowView(u8 taskId)
data[1]++;
}
-void Special_ListMenu(void)
+void ListMenu(void)
{
u8 taskId;
struct Task * task;
@@ -1439,7 +1473,7 @@ static void Task_SuspendListMenu(u8 taskId)
}
}
-void Special_ReturnToListMenu(void)
+void ReturnToListMenu(void)
{
u8 taskId = FindTaskIdByFunc(Task_SuspendListMenu);
if (taskId == 0xFF)
@@ -1483,31 +1517,31 @@ static void Task_ListMenuRemoveScrollIndicatorArrowPair(u8 taskId)
RemoveScrollIndicatorArrowPair(task->data[12]);
}
-void Special_ForcePlayerToStartSurfing(void)
+void ForcePlayerToStartSurfing(void)
{
- HelpSystem_SetSomeVariable2(22);
+ SetHelpContext(HELPCONTEXT_SURFING);
SetPlayerAvatarTransitionFlags(8);
}
-static const u16 sStarterMon[] = {
+static const u16 sStarterSpecies[] = {
SPECIES_BULBASAUR,
SPECIES_SQUIRTLE,
SPECIES_CHARMANDER
};
-static u16 GetStarterPokemon(u16 idx)
+static u16 GetStarterSpeciesById(u16 idx)
{
- if (idx >= NELEMS(sStarterMon))
+ if (idx >= NELEMS(sStarterSpecies))
idx = 0;
- return sStarterMon[idx];
+ return sStarterSpecies[idx];
}
-u16 ScrSpecial_GetStarter(void)
+u16 GetStarterSpecies(void)
{
- return GetStarterPokemon(VarGet(VAR_STARTER_MON));
+ return GetStarterSpeciesById(VarGet(VAR_STARTER_MON));
}
-void Special_SetSeenMon(void)
+void SetSeenMon(void)
{
GetSetPokedexFlag(SpeciesToNationalPokedexNum(gSpecialVar_0x8004), 2);
}
@@ -1528,8 +1562,8 @@ u8 ContextNpcGetTextColor(void)
else
{
gfxId = gObjectEvents[gSelectedObjectEvent].graphicsId;
- if (gfxId >= OBJECT_EVENT_GFX_VAR_0)
- gfxId = VarGetObjectEventGraphicsId(gfxId - OBJECT_EVENT_GFX_VAR_0);
+ if (gfxId >= OBJ_EVENT_GFX_VAR_0)
+ gfxId = VarGetObjectEventGraphicsId(gfxId - OBJ_EVENT_GFX_VAR_0);
return GetColorFromTextColorTable(gfxId);
}
}
@@ -1548,7 +1582,7 @@ static bool8 HasMonBeenRenamed(u8 idx)
return FALSE;
}
-bool8 Special_HasLeadMonBeenRenamed(void)
+bool8 HasLeadMonBeenRenamed(void)
{
return HasMonBeenRenamed(GetLeadMonIndex());
}
@@ -1604,7 +1638,7 @@ void ChangeBoxPokemonNickname(void)
species = GetBoxMonData(pokemon, MON_DATA_SPECIES, NULL);
gender = GetBoxMonGender(pokemon);
personality = GetBoxMonData(pokemon, MON_DATA_PERSONALITY, NULL);
- DoNamingScreen(3, gStringVar2, species, gender, personality, ChangeBoxPokemonNickname_CB);
+ DoNamingScreen(NAMING_SCREEN_NAME_RATER, gStringVar2, species, gender, personality, ChangeBoxPokemonNickname_CB);
}
static void ChangeBoxPokemonNickname_CB(void)
@@ -1624,7 +1658,7 @@ void ChangePokemonNickname(void)
species = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES, NULL);
gender = GetMonGender(&gPlayerParty[gSpecialVar_0x8004]);
personality = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_PERSONALITY, NULL);
- DoNamingScreen(3, gStringVar2, species, gender, personality, ChangePokemonNickname_CB);
+ DoNamingScreen(NAMING_SCREEN_NAME_RATER, gStringVar2, species, gender, personality, ChangePokemonNickname_CB);
}
static void ChangePokemonNickname_CB(void)
@@ -1633,13 +1667,13 @@ static void ChangePokemonNickname_CB(void)
CB2_ReturnToFieldContinueScriptPlayMapMusic();
}
-void Special_GetMonNickname(void)
+void BufferMonNickname(void)
{
GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar1);
StringGetEnd10(gStringVar1);
}
-void Special_IsMonOTIDNotPlayers(void)
+void IsMonOTIDNotPlayers(void)
{
if (GetPlayerTrainerId() == GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_OT_ID, NULL))
gSpecialVar_Result = FALSE;
@@ -1672,7 +1706,7 @@ u8 GetUnlockedSeviiAreas(void)
return result;
}
-void Special_UpdateTrainerCardPhotoIcons(void)
+void UpdateTrainerCardPhotoIcons(void)
{
u16 species[PARTY_SIZE];
u32 personality[PARTY_SIZE];
@@ -1695,7 +1729,7 @@ void Special_UpdateTrainerCardPhotoIcons(void)
VarSet(VAR_TRAINER_CARD_MON_ICON_TINT_IDX, gSpecialVar_0x8004);
}
-u16 Special_StickerLadyGetBragFlags(void)
+u16 StickerManGetBragFlags(void)
{
u16 result = 0;
u32 numEggs;
@@ -1729,7 +1763,7 @@ u16 GetHiddenItemAttr(u32 hiddenItem, u8 attr)
return 1;
}
-bool8 Special_PlayerPartyContainsSpecies(void)
+bool8 DoesPlayerPartyContainSpecies(void)
{
u8 partyCount = CalculatePlayerPartyCount();
u8 i;
@@ -1756,7 +1790,7 @@ static const u8 sMartMaps[][3] = {
{MAP_GROUP(SIX_ISLAND_MART), MAP_NUM(SIX_ISLAND_MART), 1}
};
-u8 Special_GetMartClerkObjectId(void)
+u8 GetMartClerkObjectId(void)
{
u8 i;
for (i = 0; i < NELEMS(sMartMaps); i++)
@@ -1915,20 +1949,20 @@ void sub_80CC59C(void)
}
}
-u16 Special_BattleCardAction(void)
+u16 BattleCardAction(void)
{
switch (gSpecialVar_Result)
{
case 0:
- return sub_81445C0(3);
+ return MEvent_GetBattleCardCount(3);
case 1:
- return sub_81445C0(4);
+ return MEvent_GetBattleCardCount(4);
case 2:
- return sub_81445C0(0);
+ return MEvent_GetBattleCardCount(0);
case 3:
- return sub_81445C0(1);
+ return MEvent_GetBattleCardCount(1);
case 4:
- return sub_81445C0(2);
+ return MEvent_GetBattleCardCount(2);
default:
AGB_ASSERT_EX(0, ABSPATH("scr_tool.c"), 3873);
return 0;
@@ -2016,7 +2050,7 @@ bool8 sub_80CC87C(void)
return FALSE;
}
-bool8 Special_ItemIsTM_GetMoveName(void)
+bool8 BufferTMHMMoveName(void)
{
// 8004 = item ID
if (gSpecialVar_0x8004 >= ITEM_TM01 && gSpecialVar_0x8004 <= ITEM_HM08)
@@ -2035,7 +2069,7 @@ void RunMassageCooldownStepCounter(void)
VarSet(VAR_MASSAGE_COOLDOWN_STEP_COUNTER, count + 1);
}
-void Special_DaisyMassageServices(void)
+void DaisyMassageServices(void)
{
AdjustFriendship(&gPlayerParty[gSpecialVar_0x8004], 6);
VarSet(VAR_MASSAGE_COOLDOWN_STEP_COUNTER, 0);
@@ -2093,7 +2127,7 @@ static const u8 sChampionRoomLightingTimers[] = {
8
};
-void Special_PokemonLeagueLightingEffect(void)
+void DoPokemonLeagueLightingEffect(void)
{
u8 taskId = CreateTask(Task_RunPokemonLeagueLightingEffect, 8);
s16 *data = gTasks[taskId].data;
@@ -2183,36 +2217,36 @@ static const u8 sCapeBrinkCompatibleSpecies[] = {
SPECIES_BLASTOISE
};
-bool8 Special_CapeBrinkGetMoveToTeachLeadPokemon(void)
+bool8 CapeBrinkGetMoveToTeachLeadPokemon(void)
{
// Returns:
// 8005 = Move tutor index
// 8006 = Num moves known by lead mon
// 8007 = Index of lead mon
// to specialvar = whether a move can be taught in the first place
- u8 r7 = 0;
- u8 r6 = 0;
- u8 r8 = GetLeadMonIndex();
- u8 r4;
- gSpecialVar_0x8007 = r8;
- for (r4 = 0; r4 < NELEMS(sCapeBrinkCompatibleSpecies); r4++)
- {
- if (GetMonData(&gPlayerParty[r8], MON_DATA_SPECIES2, NULL) == sCapeBrinkCompatibleSpecies[r4])
+ u8 tutorMonId = 0;
+ u8 numMovesKnown = 0;
+ u8 leadMonSlot = GetLeadMonIndex();
+ u8 i;
+ gSpecialVar_0x8007 = leadMonSlot;
+ for (i = 0; i < NELEMS(sCapeBrinkCompatibleSpecies); i++)
+ {
+ if (GetMonData(&gPlayerParty[leadMonSlot], MON_DATA_SPECIES2, NULL) == sCapeBrinkCompatibleSpecies[i])
{
- r7 = r4;
+ tutorMonId = i;
break;
}
}
- if (r4 == NELEMS(sCapeBrinkCompatibleSpecies) || GetMonData(&gPlayerParty[r8], MON_DATA_FRIENDSHIP) != 255)
+ if (i == NELEMS(sCapeBrinkCompatibleSpecies) || GetMonData(&gPlayerParty[leadMonSlot], MON_DATA_FRIENDSHIP) != 255)
return FALSE;
- if (r7 == 0)
+ if (tutorMonId == 0)
{
StringCopy(gStringVar2, gMoveNames[MOVE_FRENZY_PLANT]);
gSpecialVar_0x8005 = MOVETUTOR_FRENZY_PLANT;
if (FlagGet(FLAG_TUTOR_FRENZY_PLANT) == TRUE)
return FALSE;
}
- else if (r7 == 1)
+ else if (tutorMonId == 1)
{
StringCopy(gStringVar2, gMoveNames[MOVE_BLAST_BURN]);
gSpecialVar_0x8005 = MOVETUTOR_BLAST_BURN;
@@ -2226,21 +2260,21 @@ bool8 Special_CapeBrinkGetMoveToTeachLeadPokemon(void)
if (FlagGet(FLAG_TUTOR_HYDRO_CANNON) == TRUE)
return FALSE;
}
- if (GetMonData(&gPlayerParty[r8], MON_DATA_MOVE1) != MOVE_NONE)
- r6++;
- if (GetMonData(&gPlayerParty[r8], MON_DATA_MOVE2) != MOVE_NONE)
- r6++;
- if (GetMonData(&gPlayerParty[r8], MON_DATA_MOVE3) != MOVE_NONE)
- r6++;
- if (GetMonData(&gPlayerParty[r8], MON_DATA_MOVE4) != MOVE_NONE)
- r6++;
- gSpecialVar_0x8006 = r6;
+ if (GetMonData(&gPlayerParty[leadMonSlot], MON_DATA_MOVE1) != MOVE_NONE)
+ numMovesKnown++;
+ if (GetMonData(&gPlayerParty[leadMonSlot], MON_DATA_MOVE2) != MOVE_NONE)
+ numMovesKnown++;
+ if (GetMonData(&gPlayerParty[leadMonSlot], MON_DATA_MOVE3) != MOVE_NONE)
+ numMovesKnown++;
+ if (GetMonData(&gPlayerParty[leadMonSlot], MON_DATA_MOVE4) != MOVE_NONE)
+ numMovesKnown++;
+ gSpecialVar_0x8006 = numMovesKnown;
return TRUE;
}
-bool8 Special_HasLearnedAllMovesFromCapeBrinkTutor(void)
+bool8 HasLearnedAllMovesFromCapeBrinkTutor(void)
{
- // 8005 is set by Special_CapeBrinkGetMoveToTeachLeadPokemon
+ // 8005 is set by CapeBrinkGetMoveToTeachLeadPokemon
u8 r4 = 0;
if (gSpecialVar_0x8005 == MOVETUTOR_FRENZY_PLANT)
FlagSet(FLAG_TUTOR_FRENZY_PLANT);
@@ -2276,7 +2310,7 @@ bool8 CutMoveRuinValleyCheck(void)
void CutMoveOpenDottedHoleDoor(void)
{
- MapGridSetMetatileIdAt(31, 31, 0x358);
+ MapGridSetMetatileIdAt(31, 31, METATILE_SeviiIslands67_DottedHoleDoor_Open);
DrawWholeMapView();
PlaySE(SE_BAN);
FlagSet(FLAG_USED_CUT_ON_RUIN_VALLEY_BRAILLE);
@@ -2324,12 +2358,12 @@ static const u8 sDeoxysStepCaps[] = {
3
};
-void DoDeoxysRockInteraction(void)
+void DoDeoxysTriangleInteraction(void)
{
- CreateTask(Task_DoDeoxysRockInteraction, 8);
+ CreateTask(Task_DoDeoxysTriangleInteraction, 8);
}
-static void Task_DoDeoxysRockInteraction(u8 taskId)
+static void Task_DoDeoxysTriangleInteraction(u8 taskId)
{
u16 r5;
u16 r6;
@@ -2389,13 +2423,13 @@ static void MoveDeoxysObject(u8 num)
gFieldEffectArguments[5] = 60;
else
gFieldEffectArguments[5] = 5;
- FieldEffectStart(FLDEFF_UNK_43);
+ FieldEffectStart(FLDEFF_MOVE_DEOXYS_ROCK);
Overworld_SetMapObjTemplateCoords(1, sDeoxysCoords[num][0], sDeoxysCoords[num][1]);
}
static void Task_WaitDeoxysFieldEffect(u8 taskId)
{
- if (!FieldEffectActiveListContains(FLDEFF_UNK_43))
+ if (!FieldEffectActiveListContains(FLDEFF_MOVE_DEOXYS_ROCK))
{
EnableBothScriptContexts();
DestroyTask(taskId);
@@ -2415,14 +2449,14 @@ void BirthIslandDeoxysStepCounter(void)
}
}
-void Special_SetDeoxysTriangleObjectPal(void)
+void SetDeoxysTrianglePalette(void)
{
u8 num = VarGet(VAR_DEOXYS_INTERACTION_NUM);
LoadPalette(sDeoxysObjectPals[num], 0x1A0, 0x08);
sub_8083598(10);
}
-bool8 Special_BadEggInParty(void)
+bool8 IsBadEggInParty(void)
{
u8 partyCount = CalculatePlayerPartyCount();
u8 i;
@@ -2434,15 +2468,15 @@ bool8 Special_BadEggInParty(void)
return FALSE;
}
-bool8 Special_PlayerIsNotInTrainerTowerLobby(void)
+bool8 IsPlayerNotInTrainerTowerLobby(void)
{
- if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER_LOBBY) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_LOBBY))
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_TOWER_LOBBY) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_LOBBY))
return FALSE;
else
return TRUE;
}
-void Special_BrailleCursorToggle(void)
+void BrailleCursorToggle(void)
{
// 8004 = x - 27
// 8005 = y
@@ -2458,14 +2492,15 @@ void Special_BrailleCursorToggle(void)
}
}
-bool8 Special_PlayerPartyContainsSpeciesWithPlayerID(void)
+bool8 PlayerPartyContainsSpeciesWithPlayerID(void)
{
// 8004 = species
u8 playerCount = CalculatePlayerPartyCount();
u8 i;
for (i = 0; i < playerCount; i++)
{
- if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) == gSpecialVar_0x8004 && GetPlayerTrainerId() == GetMonData(&gPlayerParty[i], MON_DATA_OT_ID, NULL))
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) == gSpecialVar_0x8004
+ && GetPlayerTrainerId() == GetMonData(&gPlayerParty[i], MON_DATA_OT_ID, NULL))
return TRUE;
}
return FALSE;
@@ -2475,7 +2510,7 @@ bool8 Special_PlayerPartyContainsSpeciesWithPlayerID(void)
* Determines which of Lorelei's doll collection to show
* based on how many times you've entered the Hall of Fame.
*/
-void Special_ComputeLoreleiDollCollection(void)
+void UpdateLoreleiDollCollection(void)
{
u32 numHofClears = GetGameStat(GAME_STAT_ENTERED_HOF);
if (numHofClears >= 25)
@@ -2498,7 +2533,7 @@ void Special_ComputeLoreleiDollCollection(void)
}
}
-void Special_LoopWingFlapSound(void)
+void LoopWingFlapSound(void)
{
// 8004 = Num flaps
// 8005 = Frame delay between flaps
diff --git a/src/field_tasks.c b/src/field_tasks.c
index c64fb1924..6bd4b6f46 100644
--- a/src/field_tasks.c
+++ b/src/field_tasks.c
@@ -11,10 +11,14 @@
#include "script.h"
#include "sound.h"
#include "task.h"
+#include "constants/field_tasks.h"
#include "constants/flags.h"
+#include "constants/metatile_labels.h"
#include "constants/songs.h"
#include "constants/vars.h"
+// TODO: Metatile IDs in this file
+
static void DummyPerStepCallback(u8 taskId);
static void AshGrassPerStepCallback(u8 taskId);
static void IcefallCaveIcePerStepCallback(u8 taskId);
@@ -22,27 +26,27 @@ static void CrackedFloorPerStepCallback(u8 taskId);
static const TaskFunc sPerStepCallbacks[] =
{
- DummyPerStepCallback,
- AshGrassPerStepCallback,
- DummyPerStepCallback,
- DummyPerStepCallback,
- IcefallCaveIcePerStepCallback,
- DummyPerStepCallback,
- DummyPerStepCallback,
- CrackedFloorPerStepCallback
+ [STEP_CB_DUMMY] = DummyPerStepCallback,
+ [STEP_CB_ASH] = AshGrassPerStepCallback,
+ [STEP_CB_FORTREE_BRIDGE] = DummyPerStepCallback,
+ [STEP_CB_PACIFIDLOG_BRIDGE] = DummyPerStepCallback,
+ [STEP_CB_ICE] = IcefallCaveIcePerStepCallback,
+ [STEP_CB_TRUCK] = DummyPerStepCallback,
+ [STEP_CB_SECRET_BASE] = DummyPerStepCallback,
+ [STEP_CB_CRACKED_FLOOR] = CrackedFloorPerStepCallback
};
static const u8 sIcefallCaveIceTileCoords[][2] =
{
- { 0x08, 0x03 },
- { 0x0a, 0x05 },
- { 0x0f, 0x05 },
- { 0x08, 0x09 },
- { 0x09, 0x09 },
- { 0x10, 0x09 },
- { 0x08, 0x0a },
- { 0x09, 0x0a },
- { 0x08, 0x0e }
+ { 8, 3 },
+ { 10, 5 },
+ { 15, 5 },
+ { 8, 9 },
+ { 9, 9 },
+ { 16, 9 },
+ { 8, 10 },
+ { 9, 10 },
+ { 8, 14 }
};
static void Task_RunPerStepCallback(u8 taskId)
@@ -134,7 +138,7 @@ static void MarkIcefallCaveCoordVisited(s16 x, s16 y)
}
}
-void Special_SetIcefallCaveCrackedIceMetatiles(void)
+void SetIcefallCaveCrackedIceMetatiles(void)
{
u8 i = 0;
for (; i < NELEMS(sIcefallCaveIceTileCoords); ++i)
@@ -143,7 +147,7 @@ void Special_SetIcefallCaveCrackedIceMetatiles(void)
{
int x = sIcefallCaveIceTileCoords[i][0] + 7;
int y = sIcefallCaveIceTileCoords[i][1] + 7;
- MapGridSetMetatileIdAt(x, y, 0x35a);
+ MapGridSetMetatileIdAt(x, y, METATILE_SeafoamIslands_CrackedIce);
}
}
}
@@ -196,7 +200,7 @@ static void IcefallCaveIcePerStepCallback(u8 taskId)
x = data[4];
y = data[5];
PlaySE(SE_RU_BARI);
- MapGridSetMetatileIdAt(x, y, 0x35a);
+ MapGridSetMetatileIdAt(x, y, METATILE_SeafoamIslands_CrackedIce);
CurrentMapDrawMetatileAt(x, y);
data[1] = 1;
}
@@ -211,7 +215,7 @@ static void IcefallCaveIcePerStepCallback(u8 taskId)
x = data[4];
y = data[5];
PlaySE(SE_RU_GASYAN);
- MapGridSetMetatileIdAt(x, y, 0x35b);
+ MapGridSetMetatileIdAt(x, y, METATILE_SeafoamIslands_IceHole);
CurrentMapDrawMetatileAt(x, y);
VarSet(VAR_TEMP_1, 1);
data[1] = 1;
diff --git a/src/fieldmap.c b/src/fieldmap.c
index d2598c3e6..3e61c6c29 100644
--- a/src/fieldmap.c
+++ b/src/fieldmap.c
@@ -3,7 +3,6 @@
#include "palette.h"
#include "overworld.h"
#include "script.h"
-#include "menu.h"
#include "new_menu_helpers.h"
#include "quest_log.h"
#include "fieldmap.h"
@@ -18,38 +17,39 @@ struct ConnectionFlags
u8 east:1;
};
-void sub_8058A00(struct MapHeader *mapHeader);
-void map_copy_with_padding(u16 *map, u16 width, u16 height);
-void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader);
-void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset);
-void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset);
-void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset);
-void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset);
-void LoadSavedMapView(void);
-struct MapConnection *sub_8059600(u8 direction, s32 x, s32 y);
-bool8 sub_8059658(u8 direction, s32 x, s32 y, struct MapConnection *connection);
-bool8 sub_80596BC(s32 x, s32 src_width, s32 dest_width, s32 offset);
+static void InitMapLayoutData(struct MapHeader *mapHeader);
+static void map_copy_with_padding(u16 *map, u16 width, u16 height);
+static void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader);
+static void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset);
+static void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset);
+static void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset);
+static void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset);
+static void LoadSavedMapView(void);
+static struct MapConnection *sub_8059600(u8 direction, s32 x, s32 y);
+static bool8 sub_8059658(u8 direction, s32 x, s32 y, struct MapConnection *connection);
+static bool8 sub_80596BC(s32 x, s32 src_width, s32 dest_width, s32 offset);
struct BackupMapLayout gBackupMapLayout;
EWRAM_DATA u16 gBackupMapData[VIRTUAL_MAP_SIZE] = {};
EWRAM_DATA struct MapHeader gMapHeader = {};
EWRAM_DATA struct Camera gCamera = {};
-EWRAM_DATA struct ConnectionFlags gMapConnectionFlags = {};
+static EWRAM_DATA struct ConnectionFlags gMapConnectionFlags = {};
+EWRAM_DATA u8 gUnknown_2036E28 = 0;
-const struct ConnectionFlags sDummyConnectionFlags = {};
+static const struct ConnectionFlags sDummyConnectionFlags = {};
-const u32 gUnknown_8352EF0[] = {
- 0x1ff,
- 0x3e00,
- 0x3c000,
- 0xfc0000,
- 0x7000000,
+static const u32 sMetatileAttrMasks[] = {
+ 0x000001ff,
+ 0x00003e00,
+ 0x0003c000,
+ 0x00fc0000,
+ 0x07000000,
0x18000000,
0x60000000,
0x80000000
};
-const u8 gUnknown_8352F10[] = {
+static const u8 sMetatileAttrShifts[] = {
0,
9,
14,
@@ -65,20 +65,20 @@ const struct MapHeader * mapconnection_get_mapheader(struct MapConnection * conn
return Overworld_GetMapHeaderByGroupAndId(connection->mapGroup, connection->mapNum);
}
-void not_trainer_hill_battle_pyramid(void)
+void InitMap(void)
{
- sub_8058A00(&gMapHeader);
- mapheader_run_script_with_tag_x1();
+ InitMapLayoutData(&gMapHeader);
+ RunOnLoadMapScript();
}
-void sub_80589E8(void)
+void InitMapFromSavedGame(void)
{
- sub_8058A00(&gMapHeader);
+ InitMapLayoutData(&gMapHeader);
LoadSavedMapView();
- mapheader_run_script_with_tag_x1();
+ RunOnLoadMapScript();
}
-void sub_8058A00(struct MapHeader * mapHeader)
+static void InitMapLayoutData(struct MapHeader * mapHeader)
{
const struct MapLayout * mapLayout = mapHeader->mapLayout;
CpuFastFill(0x03FF03FF, gBackupMapData, sizeof(gBackupMapData));
@@ -90,7 +90,7 @@ void sub_8058A00(struct MapHeader * mapHeader)
mapheader_copy_mapdata_of_adjacent_maps(mapHeader);
}
-void map_copy_with_padding(u16 *map, u16 width, u16 height)
+static void map_copy_with_padding(u16 *map, u16 width, u16 height)
{
s32 y;
u16 *dest = gBackupMapLayout.map;
@@ -104,7 +104,7 @@ void map_copy_with_padding(u16 *map, u16 width, u16 height)
}
}
-void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader)
+static void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader)
{
s32 count;
struct MapConnection *connection;
@@ -150,7 +150,7 @@ void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader)
}
}
-void sub_8058B54(s32 x, s32 y, const struct MapHeader *connectedMapHeader, s32 x2, s32 y2, s32 width, s32 height)
+static void sub_8058B54(s32 x, s32 y, const struct MapHeader *connectedMapHeader, s32 x2, s32 y2, s32 width, s32 height)
{
s32 i;
u16 *src;
@@ -169,7 +169,7 @@ void sub_8058B54(s32 x, s32 y, const struct MapHeader *connectedMapHeader, s32 x
}
}
-void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
+static void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
{
s32 x, y;
s32 x2;
@@ -216,7 +216,7 @@ void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader con
}
}
-void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
+static void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
{
s32 x;
s32 x2, y2;
@@ -265,7 +265,7 @@ void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader con
}
}
-void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
+static void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
{
s32 y;
s32 x2, y2;
@@ -311,7 +311,7 @@ void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader cons
}
}
-void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
+static void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
{
s32 x, y;
s32 y2;
@@ -446,28 +446,28 @@ u32 MapGridGetMetatileIdAt(s32 x, s32 y)
return block & 0x3FF;
}
-u32 sub_8058F1C(u32 original, u8 bit)
+u32 GetMetatileAttributeFromRawMetatileBehavior(u32 original, u8 bit)
{
if (bit >= 8)
return original;
- return (original & gUnknown_8352EF0[bit]) >> gUnknown_8352F10[bit];
+ return (original & sMetatileAttrMasks[bit]) >> sMetatileAttrShifts[bit];
}
-u32 sub_8058F48(s16 x, s16 y, u8 z)
+u32 MapGridGetMetatileAttributeAt(s16 x, s16 y, u8 attr)
{
u16 metatileId = MapGridGetMetatileIdAt(x, y);
- return GetBehaviorByMetatileIdAndMapLayout(gMapHeader.mapLayout, metatileId, z);
+ return GetBehaviorByMetatileIdAndMapLayout(gMapHeader.mapLayout, metatileId, attr);
}
u32 MapGridGetMetatileBehaviorAt(s32 x, s32 y)
{
- return sub_8058F48(x, y, 0);
+ return MapGridGetMetatileAttributeAt(x, y, 0);
}
u8 MapGridGetMetatileLayerTypeAt(s16 x, s16 y)
{
- return sub_8058F48(x, y, 6);
+ return MapGridGetMetatileAttributeAt(x, y, 6);
}
void MapGridSetMetatileIdAt(s32 x, s32 y, u16 metatile)
@@ -492,7 +492,7 @@ void MapGridSetMetatileEntryAt(s32 x, s32 y, u16 metatile)
}
}
-void sub_8059024(s32 x, s32 y, bool32 arg2)
+void MapGridSetMetatileImpassabilityAt(s32 x, s32 y, bool32 arg2)
{
if (x >= 0 && x < gBackupMapLayout.Xsize
&& y >= 0 && y < gBackupMapLayout.Ysize)
@@ -515,12 +515,12 @@ u32 GetBehaviorByMetatileIdAndMapLayout(struct MapLayout *mapLayout, u16 metatil
if (metatile < NUM_METATILES_IN_PRIMARY)
{
attributes = mapLayout->primaryTileset->metatileAttributes;
- return sub_8058F1C(attributes[metatile], attr);
+ return GetMetatileAttributeFromRawMetatileBehavior(attributes[metatile], attr);
}
else if (metatile < 0x400)
{
attributes = mapLayout->secondaryTileset->metatileAttributes;
- return sub_8058F1C(attributes[metatile - NUM_METATILES_IN_PRIMARY], attr);
+ return GetMetatileAttributeFromRawMetatileBehavior(attributes[metatile - NUM_METATILES_IN_PRIMARY], attr);
}
else
{
@@ -547,7 +547,7 @@ void save_serialize_map(void)
}
}
-bool32 SavedMapViewIsEmpty(void)
+static bool32 SavedMapViewIsEmpty(void)
{
u16 i;
u32 marker = 0;
@@ -562,12 +562,12 @@ bool32 SavedMapViewIsEmpty(void)
return FALSE;
}
-void ClearSavedMapView(void)
+static void ClearSavedMapView(void)
{
CpuFill16(0, gSaveBlock2Ptr->mapView, sizeof(gSaveBlock2Ptr->mapView));
}
-void LoadSavedMapView(void)
+static void LoadSavedMapView(void)
{
s32 i, j;
s32 x, y;
@@ -591,7 +591,7 @@ void LoadSavedMapView(void)
}
}
-void sub_8059250(u8 a1)
+static void sub_8059250(u8 a1)
{
s32 width;
u16 *mapView;
@@ -693,7 +693,7 @@ s32 GetMapBorderIdAt(s32 x, s32 y)
return 0;
}
-s32 GetPostCameraMoveMapBorderId(s32 x, s32 y)
+static s32 GetPostCameraMoveMapBorderId(s32 x, s32 y)
{
return GetMapBorderIdAt(7 + gSaveBlock1Ptr->pos.x + x, 7 + gSaveBlock1Ptr->pos.y + y);
}
@@ -711,7 +711,7 @@ bool32 CanCameraMoveInDirection(s32 direction)
return TRUE;
}
-void sub_80594AC(struct MapConnection *connection, int direction, s32 x, s32 y)
+static void sub_80594AC(struct MapConnection *connection, int direction, s32 x, s32 y)
{
struct MapHeader const *mapHeader;
mapHeader = mapconnection_get_mapheader(connection);
@@ -782,7 +782,7 @@ struct MapConnection *sub_8059600(u8 direction, s32 x, s32 y)
}
-bool8 sub_8059658(u8 direction, s32 x, s32 y, struct MapConnection *connection)
+static bool8 sub_8059658(u8 direction, s32 x, s32 y, struct MapConnection *connection)
{
struct MapHeader const *mapHeader;
mapHeader = mapconnection_get_mapheader(connection);
@@ -798,7 +798,7 @@ bool8 sub_8059658(u8 direction, s32 x, s32 y, struct MapConnection *connection)
return FALSE;
}
-bool8 sub_80596BC(s32 x, s32 src_width, s32 dest_width, s32 offset)
+static bool8 sub_80596BC(s32 x, s32 src_width, s32 dest_width, s32 offset)
{
s32 offset2 = max(offset, 0);
@@ -811,7 +811,7 @@ bool8 sub_80596BC(s32 x, s32 src_width, s32 dest_width, s32 offset)
return FALSE;
}
-bool32 sub_80596E8(s32 x, s32 width)
+static bool32 sub_80596E8(s32 x, s32 width)
{
if (x >= 0 && x < width)
return TRUE;
@@ -819,7 +819,7 @@ bool32 sub_80596E8(s32 x, s32 width)
return FALSE;
}
-s32 sub_80596FC(struct MapConnection *connection, s32 x, s32 y)
+static s32 sub_80596FC(struct MapConnection *connection, s32 x, s32 y)
{
struct MapHeader const *mapHeader;
mapHeader = mapconnection_get_mapheader(connection);
@@ -881,7 +881,7 @@ void GetCameraFocusCoords(u16 *x, u16 *y)
*y = gSaveBlock1Ptr->pos.y + 7;
}
-void SetCameraCoords(u16 x, u16 y)
+static void SetCameraCoords(u16 x, u16 y)
{
gSaveBlock1Ptr->pos.x = x;
gSaveBlock1Ptr->pos.y = y;
@@ -892,7 +892,7 @@ void GetCameraCoords(u16 *x, u16 *y)
*x = gSaveBlock1Ptr->pos.x;
*y = gSaveBlock1Ptr->pos.y;
}
-void copy_tileset_patterns_to_vram(struct Tileset const *tileset, u16 numTiles, u16 offset)
+static void copy_tileset_patterns_to_vram(struct Tileset const *tileset, u16 numTiles, u16 offset)
{
if (tileset)
{
@@ -903,7 +903,7 @@ void copy_tileset_patterns_to_vram(struct Tileset const *tileset, u16 numTiles,
}
}
-void copy_tileset_patterns_to_vram2(struct Tileset const *tileset, u16 numTiles, u16 offset)
+static void copy_tileset_patterns_to_vram2(struct Tileset const *tileset, u16 numTiles, u16 offset)
{
if (tileset)
{
@@ -914,7 +914,7 @@ void copy_tileset_patterns_to_vram2(struct Tileset const *tileset, u16 numTiles,
}
}
-void sub_80598CC(u16 a0, u16 a1)
+static void sub_80598CC(u16 a0, u16 a1)
{
switch (gUnknown_2036E28)
{
@@ -958,7 +958,7 @@ void sub_8059948(u8 a0, u8 a1)
CpuFastCopy(gPlttBufferUnfaded + a0 * 16, gPlttBufferFaded + a0 * 16, a1 * 16 * sizeof(u16));
}
-void apply_map_tileset_palette(struct Tileset const *tileset, u16 destOffset, u16 size)
+static void apply_map_tileset_palette(struct Tileset const *tileset, u16 destOffset, u16 size)
{
u16 black = RGB_BLACK;
diff --git a/src/fldeff_berrytree.c b/src/fldeff_berrytree.c
index 90ca36508..3826e1d33 100644
--- a/src/fldeff_berrytree.c
+++ b/src/fldeff_berrytree.c
@@ -1,4 +1,4 @@
-void nullsub_56(void)
+// From R/S, removed
+void DoWateringBerryTreeAnim(void)
{
-
}
diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c
new file mode 100644
index 000000000..8617a1aaa
--- /dev/null
+++ b/src/fldeff_cut.c
@@ -0,0 +1,299 @@
+#include "global.h"
+#include "gflib.h"
+#include "event_object_lock.h"
+#include "event_object_movement.h"
+#include "event_scripts.h"
+#include "fieldmap.h"
+#include "field_camera.h"
+#include "field_specials.h"
+#include "fldeff.h"
+#include "field_effect.h"
+#include "field_player_avatar.h"
+#include "metatile_behavior.h"
+#include "overworld.h"
+#include "party_menu.h"
+#include "script.h"
+#include "trig.h"
+#include "constants/event_objects.h"
+#include "constants/songs.h"
+#include "constants/metatile_labels.h"
+
+#define CUT_GRASS_SPRITE_COUNT 8
+
+static EWRAM_DATA u8 *sCutGrassSpriteArrayPtr = NULL;
+static EWRAM_DATA bool8 sScheduleOpenDottedHole = FALSE;
+
+static void FieldCallback_CutGrass(void);
+static void FieldCallback_CutTree(void);
+static void FieldMoveCallback_CutGrass(void);
+static void SetCutGrassMetatileAt(s16 x, s16 y);
+static void SpriteCallback_CutGrass_Init(struct Sprite * sprite);
+static void SpriteCallback_CutGrass_Run(struct Sprite * sprite);
+static void SpriteCallback_CutGrass_Cleanup(struct Sprite * sprite);
+static void FieldMoveCallback_CutTree(void);
+
+static const u16 sCutGrassMetatileMapping[][2] = {
+ {
+ METATILE_ID(General, Plain_Grass),
+ METATILE_ID(General, Plain_Mowed)
+ }, {
+ METATILE_ID(General, ThinTreeTop_Grass),
+ METATILE_ID(General, ThinTreeTop_Mowed)
+ }, {
+ METATILE_ID(General, WideTreeTopLeft_Grass),
+ METATILE_ID(General, WideTreeTopLeft_Mowed)
+ }, {
+ METATILE_ID(General, WideTreeTopRight_Grass),
+ METATILE_ID(General, WideTreeTopRight_Mowed)
+ }, {
+ METATILE_ID(CeladonCity, CyclingRoad_Grass),
+ METATILE_ID(CeladonCity, CyclingRoad_Mowed)
+ }, {
+ METATILE_ID(FuchsiaCity, SafariZoneTreeTopLeft_Grass),
+ METATILE_ID(FuchsiaCity, SafariZoneTreeTopLeft_Mowed)
+ }, {
+ METATILE_ID(FuchsiaCity, SafariZoneTreeTopMiddle_Grass),
+ METATILE_ID(FuchsiaCity, SafariZoneTreeTopMiddle_Mowed)
+ }, {
+ METATILE_ID(FuchsiaCity, SafariZoneTreeTopRight_Grass),
+ METATILE_ID(FuchsiaCity, SafariZoneTreeTopRight_Mowed)
+ }, {
+ METATILE_ID(ViridianForest, HugeTreeTopMiddle_Grass),
+ METATILE_ID(ViridianForest, HugeTreeTopMiddle_Mowed)
+ }, {
+ 0xffff,
+ 0xffff
+ }
+};
+
+static const struct OamData sOamData_FldEff_CutGrass = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x8),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(8x8),
+ .tileNum = 0x001,
+ .priority = 1,
+ .paletteNum = 0x1,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_Fldeff_CutGrass_0[] = {
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSpriteAnimTable_FldEff_CutGrass[] = {
+ sSpriteAnim_Fldeff_CutGrass_0
+};
+
+static const struct SpriteFrameImage sSpriteFrameImages_FldEff_CutGrass[] = {
+ {gUnknown_8398648, 0x20}
+};
+
+const struct SpritePalette gFldEffPalette_CutGrass[] = {
+ gUnknown_8398688, 4096
+};
+
+static const struct SpriteTemplate sSpriteTemplate_FldEff_CutGrass = {
+ .tileTag = 0xFFFF,
+ .paletteTag = 4096,
+ .oam = &sOamData_FldEff_CutGrass,
+ .anims = sSpriteAnimTable_FldEff_CutGrass,
+ .images = sSpriteFrameImages_FldEff_CutGrass,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallback_CutGrass_Init
+};
+
+static u8 MetatileAtCoordsIsGrassTile(s16 x, s16 y)
+{
+ return TestMetatileAttributeBit(MapGridGetMetatileAttributeAt(x, y, 1), 1);
+}
+
+bool8 SetUpFieldMove_Cut(void)
+{
+ s16 x, y;
+ u8 i, j;
+ sScheduleOpenDottedHole = FALSE;
+ if (CutMoveRuinValleyCheck() == TRUE)
+ {
+ sScheduleOpenDottedHole = TRUE;
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = FieldCallback_CutGrass;
+ return TRUE;
+ }
+
+ if (CheckObjectGraphicsInFrontOfPlayer(OBJ_EVENT_GFX_CUT_TREE) == TRUE)
+ {
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = FieldCallback_CutTree;
+ return TRUE;
+ }
+ else
+ {
+ // FIXME: this fakematch
+ register s32 neg1 asm("r8");
+ struct MapPosition *pos;
+ PlayerGetDestCoords(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);
+
+ for (i = 0, pos = &gPlayerFacingPosition, neg1 = 0xFFFF; i < 3; i++)
+ {
+
+ y = i + neg1 + pos->y;
+ for (j = 0; j < 3; j++)
+ {
+ x = j + neg1 + pos->x;
+ if (MapGridGetZCoordAt(x, y) == pos->height)
+ {
+ if (MetatileAtCoordsIsGrassTile(x, y) == TRUE)
+ {
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = FieldCallback_CutGrass;
+ return TRUE;
+ }
+ }
+ }
+ }
+ return FALSE;
+ }
+}
+
+static void FieldCallback_CutGrass(void)
+{
+ FieldEffectStart(FLDEFF_USE_CUT_ON_GRASS);
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+}
+
+bool8 FldEff_UseCutOnGrass(void)
+{
+ u8 taskId = CreateFieldEffectShowMon();
+ FLDEFF_SET_FUNC_TO_DATA(FieldMoveCallback_CutGrass);
+ IncrementGameStat(GAME_STAT_USED_CUT);
+ return FALSE;
+}
+
+static void FieldCallback_CutTree(void)
+{
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+ ScriptContext1_SetupScript(EventScript_FldEffCut);
+}
+
+bool8 FldEff_UseCutOnTree(void)
+{
+ u8 taskId = CreateFieldEffectShowMon();
+ FLDEFF_SET_FUNC_TO_DATA(FieldMoveCallback_CutTree);
+ IncrementGameStat(GAME_STAT_USED_CUT);
+ return FALSE;
+}
+
+static void FieldMoveCallback_CutGrass(void)
+{
+ FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_GRASS);
+ if (sScheduleOpenDottedHole == TRUE)
+ CutMoveOpenDottedHoleDoor();
+ else
+ FieldEffectStart(FLDEFF_CUT_GRASS);
+}
+
+bool8 FldEff_CutGrass(void)
+{
+ u8 i, j;
+ s16 x, y;
+ // FIXME: this fakematch
+ register s32 neg1 asm("r9");
+ struct MapPosition *pos;
+
+ i = 0;
+ PlaySE(SE_W015);
+ PlayerGetDestCoords(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);
+
+ for (i = 0, pos = &gPlayerFacingPosition, neg1 = 0xFFFF; i < 3; i++)
+ {
+
+ y = i + neg1 + pos->y;
+ for (j = 0; j < 3; j++)
+ {
+ x = j + neg1 + pos->x;
+ if (MapGridGetZCoordAt(x, y) == pos->height)
+ {
+ if (MetatileAtCoordsIsGrassTile(x, y) == TRUE)
+ {
+ SetCutGrassMetatileAt(x, y);
+ sub_805F378(x, y);
+ }
+ }
+ }
+ }
+ DrawWholeMapView();
+ sCutGrassSpriteArrayPtr = Alloc(CUT_GRASS_SPRITE_COUNT);
+ for (i = 0; i < 8; i++)
+ {
+ sCutGrassSpriteArrayPtr[i] = CreateSprite(&sSpriteTemplate_FldEff_CutGrass, gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y + 20, 0);
+ gSprites[sCutGrassSpriteArrayPtr[i]].data[2] = i * (0x100 / CUT_GRASS_SPRITE_COUNT);
+ }
+ return FALSE;
+}
+
+static void SetCutGrassMetatileAt(s16 x, s16 y)
+{
+ u16 i = 0;
+ u16 metatileId = MapGridGetMetatileIdAt(x, y);
+ while (1)
+ {
+ if (sCutGrassMetatileMapping[i][0] == 0xFFFF)
+ return;
+ if (sCutGrassMetatileMapping[i][0] == metatileId)
+ {
+ MapGridSetMetatileIdAt(x, y, sCutGrassMetatileMapping[i][1]);
+ break;
+ }
+ i++;
+ }
+}
+
+static void SpriteCallback_CutGrass_Init(struct Sprite * sprite)
+{
+ sprite->data[0] = 8;
+ sprite->data[1] = 0;
+ sprite->data[3] = 0;
+ sprite->callback = SpriteCallback_CutGrass_Run;
+}
+
+static void SpriteCallback_CutGrass_Run(struct Sprite * sprite)
+{
+ sprite->pos2.x = Sin(sprite->data[2], sprite->data[0]);
+ sprite->pos2.y = Cos(sprite->data[2], sprite->data[0]);
+ sprite->data[2] += 8;
+ sprite->data[2] &= 0xFF;
+ sprite->data[0]++;
+ sprite->data[0] += sprite->data[3] >> 2;
+ sprite->data[3]++;
+ if (sprite->data[1] != 28)
+ sprite->data[1]++;
+ else
+ sprite->callback = SpriteCallback_CutGrass_Cleanup;
+}
+
+static void SpriteCallback_CutGrass_Cleanup(struct Sprite * sprite)
+{
+ u8 i;
+ for (i = 1; i < CUT_GRASS_SPRITE_COUNT; i++)
+ {
+ DestroySprite(&gSprites[sCutGrassSpriteArrayPtr[i]]);
+ }
+ FieldEffectStop(&gSprites[sCutGrassSpriteArrayPtr[0]], FLDEFF_CUT_GRASS);
+ Free(sCutGrassSpriteArrayPtr);
+ sub_80696C0();
+ ScriptContext2_Disable();
+}
+
+static void FieldMoveCallback_CutTree(void)
+{
+ PlaySE(SE_W015);
+ FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_TREE);
+ EnableBothScriptContexts();
+}
diff --git a/src/fldeff_dig.c b/src/fldeff_dig.c
index 7d229ce3f..0eb0d3c1e 100644
--- a/src/fldeff_dig.c
+++ b/src/fldeff_dig.c
@@ -5,8 +5,6 @@
#include "item_use.h"
#include "overworld.h"
#include "party_menu.h"
-#include "sprite.h"
-#include "constants/object_events.h"
static void FieldCallback_Dig(void);
static void sub_80C9AFC(void);
@@ -31,7 +29,7 @@ static void FieldCallback_Dig(void)
bool8 FldEff_UseDig(void)
{
- u8 taskId = oei_task_add();
+ u8 taskId = CreateFieldEffectShowMon();
FLDEFF_SET_FUNC_TO_DATA(sub_80C9AFC);
SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);
diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c
new file mode 100644
index 000000000..58cb4c251
--- /dev/null
+++ b/src/fldeff_flash.c
@@ -0,0 +1,479 @@
+#include "global.h"
+#include "gflib.h"
+#include "event_data.h"
+#include "event_scripts.h"
+#include "fldeff.h"
+#include "field_effect.h"
+#include "map_preview_screen.h"
+#include "overworld.h"
+#include "party_menu.h"
+#include "script.h"
+#include "constants/songs.h"
+#include "constants/map_types.h"
+
+struct FlashStruct
+{
+ u8 fromType;
+ u8 toType;
+ bool8 isEnter;
+ bool8 isExit;
+ void (*func1)(void);
+ void (*func2)(u8 mapSecId);
+};
+
+static void FieldCallback_Flash(void);
+static void FldEff_UseFlash(void);
+static bool8 TryDoMapTransition(void);
+static void FlashTransition_Exit(void);
+static void Task_FlashTransition_Exit_0(u8 taskId);
+static void Task_FlashTransition_Exit_1(u8 taskId);
+static void Task_FlashTransition_Exit_2(u8 taskId);
+static void Task_FlashTransition_Exit_3(u8 taskId);
+static void Task_FlashTransition_Exit_4(u8 taskId);
+static void FlashTransition_Enter(void);
+static void Task_FlashTransition_Enter_0(u8 taskId);
+static void Task_FlashTransition_Enter_1(u8 taskId);
+static void Task_FlashTransition_Enter_2(u8 taskId);
+static void Task_FlashTransition_Enter_3(u8 taskId);
+static void RunMapPreviewScreen(u8 mapsecId);
+static void Task_MapPreviewScreen_0(u8 taskId);
+
+static const struct FlashStruct sTransitionTypes[] = {
+ {
+ .fromType = MAP_TYPE_TOWN,
+ .toType = MAP_TYPE_UNDERGROUND,
+ .isEnter = TRUE,
+ .isExit = FALSE,
+ .func1 = FlashTransition_Enter,
+ .func2 = RunMapPreviewScreen
+ }, {
+ .fromType = MAP_TYPE_CITY,
+ .toType = MAP_TYPE_UNDERGROUND,
+ .isEnter = TRUE,
+ .isExit = FALSE,
+ .func1 = FlashTransition_Enter,
+ .func2 = RunMapPreviewScreen
+ }, {
+ .fromType = MAP_TYPE_ROUTE,
+ .toType = MAP_TYPE_UNDERGROUND,
+ .isEnter = TRUE,
+ .isExit = FALSE,
+ .func1 = FlashTransition_Enter,
+ .func2 = RunMapPreviewScreen
+ }, {
+ .fromType = MAP_TYPE_UNDERWATER,
+ .toType = MAP_TYPE_UNDERGROUND,
+ .isEnter = TRUE,
+ .isExit = FALSE,
+ .func1 = FlashTransition_Enter,
+ .func2 = RunMapPreviewScreen
+ }, {
+ .fromType = MAP_TYPE_OCEAN_ROUTE,
+ .toType = MAP_TYPE_UNDERGROUND,
+ .isEnter = TRUE,
+ .isExit = FALSE,
+ .func1 = FlashTransition_Enter,
+ .func2 = RunMapPreviewScreen
+ }, {
+ .fromType = MAP_TYPE_UNKNOWN,
+ .toType = MAP_TYPE_UNDERGROUND,
+ .isEnter = TRUE,
+ .isExit = FALSE,
+ .func1 = FlashTransition_Enter,
+ .func2 = RunMapPreviewScreen
+ }, {
+ .fromType = MAP_TYPE_INDOOR,
+ .toType = MAP_TYPE_UNDERGROUND,
+ .isEnter = TRUE,
+ .isExit = FALSE,
+ .func1 = FlashTransition_Enter,
+ .func2 = RunMapPreviewScreen
+ }, {
+ .fromType = MAP_TYPE_SECRET_BASE,
+ .toType = MAP_TYPE_UNDERGROUND,
+ .isEnter = TRUE,
+ .isExit = FALSE,
+ .func1 = FlashTransition_Enter,
+ .func2 = RunMapPreviewScreen
+ }, {
+ .fromType = MAP_TYPE_UNDERGROUND,
+ .toType = MAP_TYPE_TOWN,
+ .isEnter = FALSE,
+ .isExit = TRUE,
+ .func1 = FlashTransition_Exit,
+ .func2 = RunMapPreviewScreen
+ }, {
+ .fromType = MAP_TYPE_UNDERGROUND,
+ .toType = MAP_TYPE_CITY,
+ .isEnter = FALSE,
+ .isExit = TRUE,
+ .func1 = FlashTransition_Exit,
+ .func2 = RunMapPreviewScreen
+ }, {
+ .fromType = MAP_TYPE_UNDERGROUND,
+ .toType = MAP_TYPE_ROUTE,
+ .isEnter = FALSE,
+ .isExit = TRUE,
+ .func1 = FlashTransition_Exit,
+ .func2 = RunMapPreviewScreen
+ }, {
+ .fromType = MAP_TYPE_UNDERGROUND,
+ .toType = MAP_TYPE_UNDERWATER,
+ .isEnter = FALSE,
+ .isExit = TRUE,
+ .func1 = FlashTransition_Exit,
+ .func2 = RunMapPreviewScreen
+ }, {
+ .fromType = MAP_TYPE_UNDERGROUND,
+ .toType = MAP_TYPE_OCEAN_ROUTE,
+ .isEnter = FALSE,
+ .isExit = TRUE,
+ .func1 = FlashTransition_Exit,
+ .func2 = RunMapPreviewScreen
+ }, {
+ .fromType = MAP_TYPE_UNDERGROUND,
+ .toType = MAP_TYPE_UNKNOWN,
+ .isEnter = FALSE,
+ .isExit = TRUE,
+ .func1 = FlashTransition_Exit,
+ .func2 = RunMapPreviewScreen
+ }, {
+ .fromType = MAP_TYPE_UNDERGROUND,
+ .toType = MAP_TYPE_INDOOR,
+ .isEnter = FALSE,
+ .isExit = TRUE,
+ .func1 = FlashTransition_Exit,
+ .func2 = RunMapPreviewScreen
+ }, {
+ .fromType = MAP_TYPE_UNDERGROUND,
+ .toType = MAP_TYPE_SECRET_BASE,
+ .isEnter = FALSE,
+ .isExit = TRUE,
+ .func1 = FlashTransition_Exit,
+ .func2 = RunMapPreviewScreen
+ }, {0}
+};
+
+static const u16 sCaveTransitionPalette_White[] = INCBIN_U16("graphics/field_effects/flash_white.gbapal");
+static const u16 sCaveTransitionPalette_Black[] = INCBIN_U16("graphics/field_effects/flash_black.gbapal");
+static const u16 sCaveTransitionPalette_Gradient[] = INCBIN_U16("graphics/field_effects/flash_gradient.gbapal");
+static const u32 sCaveTransitionTilemap[] = INCBIN_U32("graphics/field_effects/flash_effect_map.bin.lz");
+static const u32 sCaveTransitionTiles[] = INCBIN_U32("graphics/field_effects/flash_effect_tiles.4bpp.lz");
+
+bool8 SetUpFieldMove_Flash(void)
+{
+ if (gMapHeader.cave != TRUE)
+ return FALSE;
+
+ if (FlagGet(FLAG_SYS_FLASH_ACTIVE))
+ return FALSE;
+
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = FieldCallback_Flash;
+ return TRUE;
+}
+
+static void FieldCallback_Flash(void)
+{
+ u8 taskId = CreateFieldEffectShowMon();
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+ gTasks[taskId].data[8] = ((uintptr_t)FldEff_UseFlash) >> 16;
+ gTasks[taskId].data[9] = ((uintptr_t)FldEff_UseFlash);
+}
+
+static void FldEff_UseFlash(void)
+{
+ PlaySE(SE_W115);
+ FlagSet(FLAG_SYS_FLASH_ACTIVE);
+ ScriptContext1_SetupScript(EventScript_FldEffFlash);
+}
+
+// Map transition animatics
+
+static void CB2_ChangeMapMain(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void VBC_ChangeMapVBlank(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void CB2_DoChangeMap(void)
+{
+ SetVBlankCallback(NULL);
+
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BG2CNT, 0);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+
+ DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, (void *)OAM, OAM_SIZE);
+ DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2);
+ ResetPaletteFade();
+ ResetTasks();
+ ResetSpriteData();
+ EnableInterrupts(INTR_FLAG_VBLANK);
+ SetVBlankCallback(VBC_ChangeMapVBlank);
+ SetMainCallback2(CB2_ChangeMapMain);
+ if (!TryDoMapTransition())
+ SetMainCallback2(gMain.savedCallback);
+}
+
+static bool8 TryDoMapTransition(void)
+{
+ u8 fromType = GetLastUsedWarpMapType();
+ u8 toType = GetCurrentMapType();
+ u8 i = 0;
+ if (GetLastUsedWarpMapSectionId() != gMapHeader.regionMapSectionId && MapHasPreviewScreen_HandleQLState2(gMapHeader.regionMapSectionId, MPS_TYPE_CAVE) == TRUE)
+ {
+ RunMapPreviewScreen(gMapHeader.regionMapSectionId);
+ return TRUE;
+ }
+ for (; sTransitionTypes[i].fromType != 0; i++)
+ {
+ if (sTransitionTypes[i].fromType == fromType && sTransitionTypes[i].toType == toType)
+ {
+ sTransitionTypes[i].func1();
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+bool8 MapTransitionIsEnter(u8 _fromType, u8 _toType)
+{
+ u8 fromType = _fromType;
+ u8 toType = _toType;
+ u8 i = 0;
+ for (; sTransitionTypes[i].fromType != 0; i++)
+ {
+ if (sTransitionTypes[i].fromType == fromType && sTransitionTypes[i].toType == toType)
+ {
+ return sTransitionTypes[i].isEnter;
+ }
+ }
+ return FALSE;
+}
+
+bool8 MapTransitionIsExit(u8 _fromType, u8 _toType)
+{
+ u8 fromType = _fromType;
+ u8 toType = _toType;
+ u8 i = 0;
+ for (; sTransitionTypes[i].fromType != 0; i++)
+ {
+ if (sTransitionTypes[i].fromType == fromType && sTransitionTypes[i].toType == toType)
+ {
+ return sTransitionTypes[i].isExit;
+ }
+ }
+ return FALSE;
+}
+
+static void FlashTransition_Exit(void)
+{
+ CreateTask(Task_FlashTransition_Exit_0, 0);
+}
+
+static void Task_FlashTransition_Exit_0(u8 taskId)
+{
+ gTasks[taskId].func = Task_FlashTransition_Exit_1;
+}
+
+static void Task_FlashTransition_Exit_1(u8 taskId)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ LZ77UnCompVram(sCaveTransitionTiles, (void *)BG_CHAR_ADDR(3));
+ LZ77UnCompVram(sCaveTransitionTilemap, (void *)BG_SCREEN_ADDR(31));
+ LoadPalette(sCaveTransitionPalette_White, 0xE0, 0x20);
+ LoadPalette(sCaveTransitionPalette_Gradient + 8, 0xE0, 0x10);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(31));
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_OBJ_ON);
+ gTasks[taskId].func = Task_FlashTransition_Exit_2;
+ gTasks[taskId].data[0] = 16;
+ gTasks[taskId].data[1] = 0;
+}
+
+static void Task_FlashTransition_Exit_2(u8 taskId)
+{
+ u16 r4 = gTasks[taskId].data[1];
+ SetGpuReg(REG_OFFSET_BLDALPHA, (16 << 8) + r4);
+ if (r4 <= 16)
+ {
+ gTasks[taskId].data[1]++;
+ }
+ else
+ {
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].func = Task_FlashTransition_Exit_3;
+ }
+}
+
+static void Task_FlashTransition_Exit_3(u8 taskId)
+{
+ u16 r4;
+ SetGpuReg(REG_OFFSET_BLDALPHA, (16 << 8) + 16);
+ r4 = gTasks[taskId].data[2];
+ if (r4 < 8)
+ {
+ gTasks[taskId].data[2]++;
+ LoadPalette(sCaveTransitionPalette_Gradient + 8 + r4, 0xE0, 0x10 - 2 * r4);
+ }
+ else
+ {
+ LoadPalette(sCaveTransitionPalette_White, 0x00, 0x20);
+ gTasks[taskId].func = Task_FlashTransition_Exit_4;
+ gTasks[taskId].data[2] = 8;
+ }
+}
+
+static void Task_FlashTransition_Exit_4(u8 taskId)
+{
+ if (gTasks[taskId].data[2] != 0)
+ gTasks[taskId].data[2]--;
+ else
+ SetMainCallback2(gMain.savedCallback);
+}
+
+static void FlashTransition_Enter(void)
+{
+ CreateTask(Task_FlashTransition_Enter_0, 0);
+}
+
+static void Task_FlashTransition_Enter_0(u8 taskId)
+{
+ gTasks[taskId].func = Task_FlashTransition_Enter_1;
+}
+
+static void Task_FlashTransition_Enter_1(u8 taskId)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ LZ77UnCompVram(sCaveTransitionTiles, (void *)BG_CHAR_ADDR(3));
+ LZ77UnCompVram(sCaveTransitionTilemap, (void *)BG_SCREEN_ADDR(31));
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(31));
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_OBJ_ON);
+ LoadPalette(sCaveTransitionPalette_White, 0xE0, 0x20);
+ LoadPalette(sCaveTransitionPalette_Black, 0, 0x20);
+ gTasks[taskId].func = Task_FlashTransition_Enter_2;
+ gTasks[taskId].data[0] = 16;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = 0;
+}
+
+static void Task_FlashTransition_Enter_2(u8 taskId)
+{
+ u16 r4;
+ r4 = gTasks[taskId].data[2];
+ if (r4 < 16)
+ {
+ gTasks[taskId].data[2]++;
+ gTasks[taskId].data[2]++;
+ LoadPalette(&sCaveTransitionPalette_Gradient[16 - (r4 + 1)], 0xE0, 2 * (r4 + 1));
+ }
+ else
+ {
+ SetGpuReg(REG_OFFSET_BLDALPHA, (16 << 8) + 16);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD);
+ gTasks[taskId].func = Task_FlashTransition_Enter_3;
+ }
+}
+
+static void Task_FlashTransition_Enter_3(u8 taskId)
+{
+ u16 r4 = 16 - gTasks[taskId].data[1];
+ SetGpuReg(REG_OFFSET_BLDALPHA, (16 << 8) + r4);
+ if (r4 != 0)
+ {
+ gTasks[taskId].data[1]++;
+ }
+ else
+ {
+ LoadPalette(sCaveTransitionPalette_Black, 0x00, 0x20);
+ SetMainCallback2(gMain.savedCallback);
+ }
+}
+
+static void RunMapPreviewScreen(u8 mapSecId)
+{
+ u8 taskId = CreateTask(Task_MapPreviewScreen_0, 0);
+ gTasks[taskId].data[3] = mapSecId;
+}
+
+static void Task_MapPreviewScreen_0(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ switch (data[0])
+ {
+ case 0:
+ SetWordTaskArg(taskId, 5, (uintptr_t)gMain.vblankCallback);
+ SetVBlankCallback(NULL);
+ MapPreview_InitBgs();
+ MapPreview_LoadGfx(data[3]);
+ BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK);
+ data[0]++;
+ break;
+ case 1:
+ if (!MapPreview_IsGfxLoadFinished())
+ {
+ data[4] = MapPreview_CreateMapNameWindow(data[3]);
+ CopyWindowToVram(data[4], 3);
+ data[0]++;
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ SetVBlankCallback((IntrCallback)GetWordTaskArg(taskId, 5));
+ data[0]++;
+ }
+ break;
+ case 3:
+ if (!UpdatePaletteFade())
+ {
+ data[2] = MapPreview_GetDuration(data[3]);
+ data[0]++;
+ }
+ break;
+ case 4:
+ data[1]++;
+ if (data[1] > data[2] || JOY_HELD(B_BUTTON))
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -2, 0, 16, RGB_WHITE);
+ data[0]++;
+ }
+ break;
+ case 5:
+ if (!UpdatePaletteFade())
+ {
+ int i;
+ for (i = 0; i < 16; i++)
+ {
+ data[i] = 0;
+ }
+ MapPreview_Unload(data[4]);
+ gTasks[taskId].func = Task_FlashTransition_Enter_1;
+ }
+ break;
+ }
+}
diff --git a/src/fldeff_rocksmash.c b/src/fldeff_rocksmash.c
index 2cca37f7a..dc372ce18 100644
--- a/src/fldeff_rocksmash.c
+++ b/src/fldeff_rocksmash.c
@@ -3,25 +3,22 @@
#include "field_player_avatar.h"
#include "field_effect.h"
#include "party_menu.h"
-#include "malloc.h"
#include "event_data.h"
#include "script.h"
#include "fldeff.h"
#include "event_scripts.h"
-#include "field_weather.h"
#include "sound.h"
-#include "palette.h"
#include "overworld.h"
-#include "wild_encounter.h"
#include "event_object_movement.h"
#include "constants/songs.h"
-#include "constants/object_events.h"
-#include "constants/map_types.h"
+#include "constants/event_objects.h"
+#include "constants/event_object_movement.h"
+#include "constants/maps.h"
-static void task08_080C9820(u8 taskId);
-static void sub_80C98FC(u8 taskId);
-static void sub_80C98B0(u8 taskId);
-static void sub_80C99A0(u8 taskId);
+static void Task_FieldEffectShowMon_Init(u8 taskId);
+static void Task_FieldEffectShowMon_WaitFldeff(u8 taskId);
+static void Task_FieldEffectShowMon_WaitPlayerAnim(u8 taskId);
+static void Task_FieldEffectShowMon_Cleanup(u8 taskId);
static void sub_80C9A10(void);
static void sub_80C9A60(void);
@@ -40,75 +37,76 @@ bool8 CheckObjectGraphicsInFrontOfPlayer(u8 graphicsId)
return TRUE;
}
-u8 oei_task_add(void)
+u8 CreateFieldEffectShowMon(void)
{
GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);
- return CreateTask(task08_080C9820, 8);
+ return CreateTask(Task_FieldEffectShowMon_Init, 8);
}
-static void task08_080C9820(u8 taskId)
+static void Task_FieldEffectShowMon_Init(u8 taskId)
{
u8 mapObjId;
ScriptContext2_Enable();
- gPlayerAvatar.unk6 = TRUE;
+ gPlayerAvatar.preventStep = TRUE;
mapObjId = gPlayerAvatar.objectEventId;
if (!ObjectEventIsMovementOverridden(&gObjectEvents[mapObjId])
|| ObjectEventClearHeldMovementIfFinished(&gObjectEvents[mapObjId]))
{
if (gMapHeader.mapType == MAP_TYPE_UNDERWATER)
{
+ // Leftover from RS, inhibits the player anim while underwater.
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
- gTasks[taskId].func = sub_80C98FC;
+ gTasks[taskId].func = Task_FieldEffectShowMon_WaitFldeff;
}
else
{
sub_805CB70();
- ObjectEventSetHeldMovement(&gObjectEvents[mapObjId], 0x45);
- gTasks[taskId].func = sub_80C98B0;
+ ObjectEventSetHeldMovement(&gObjectEvents[mapObjId], MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);
+ gTasks[taskId].func = Task_FieldEffectShowMon_WaitPlayerAnim;
}
}
}
-static void sub_80C98B0(u8 taskId)
+static void Task_FieldEffectShowMon_WaitPlayerAnim(u8 taskId)
{
if (ObjectEventCheckHeldMovementStatus(&gObjectEvents[gPlayerAvatar.objectEventId]) == TRUE)
{
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
- gTasks[taskId].func = sub_80C98FC;
+ gTasks[taskId].func = Task_FieldEffectShowMon_WaitFldeff;
}
}
-static void sub_80C98FC(u8 taskId)
+static void Task_FieldEffectShowMon_WaitFldeff(u8 taskId)
{
if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
{
gFieldEffectArguments[1] = GetPlayerFacingDirection();
- if (gFieldEffectArguments[1] == 1)
+ if (gFieldEffectArguments[1] == DIR_SOUTH)
gFieldEffectArguments[2] = 0;
- if (gFieldEffectArguments[1] == 2)
+ if (gFieldEffectArguments[1] == DIR_NORTH)
gFieldEffectArguments[2] = 1;
- if (gFieldEffectArguments[1] == 3)
+ if (gFieldEffectArguments[1] == DIR_WEST)
gFieldEffectArguments[2] = 2;
- if (gFieldEffectArguments[1] == 4)
+ if (gFieldEffectArguments[1] == DIR_EAST)
gFieldEffectArguments[2] = 3;
ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByCurrentState());
StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gFieldEffectArguments[2]);
- FieldEffectActiveListRemove(6);
- gTasks[taskId].func = sub_80C99A0;
+ FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON);
+ gTasks[taskId].func = Task_FieldEffectShowMon_Cleanup;
}
}
-static void sub_80C99A0(u8 taskId)
+static void Task_FieldEffectShowMon_Cleanup(u8 taskId)
{
FLDEFF_CALL_FUNC_IN_DATA();
- gPlayerAvatar.unk6 = FALSE;
+ gPlayerAvatar.preventStep = FALSE;
DestroyTask(taskId);
}
bool8 SetUpFieldMove_RockSmash(void)
{
- if (CheckObjectGraphicsInFrontOfPlayer(OBJECT_EVENT_GFX_ROCK_SMASH_ROCK) == TRUE)
+ if (CheckObjectGraphicsInFrontOfPlayer(OBJ_EVENT_GFX_ROCK_SMASH_ROCK) == TRUE)
{
gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
gPostMenuFieldCallback = sub_80C9A10;
@@ -125,7 +123,7 @@ static void sub_80C9A10(void)
bool8 FldEff_UseRockSmash(void)
{
- u8 taskId = oei_task_add();
+ u8 taskId = CreateFieldEffectShowMon();
FLDEFF_SET_FUNC_TO_DATA(sub_80C9A60);
IncrementGameStat(GAME_STAT_USED_ROCK_SMASH);
diff --git a/src/fldeff_softboiled.c b/src/fldeff_softboiled.c
index 60437c125..966a7934c 100644
--- a/src/fldeff_softboiled.c
+++ b/src/fldeff_softboiled.c
@@ -5,7 +5,6 @@
#include "menu.h"
#include "new_menu_helpers.h"
#include "constants/songs.h"
-#include "fldeff.h"
static void sub_80E57E8(u8 taskId);
static void sub_80E583C(u8 taskId);
diff --git a/src/fldeff_strength.c b/src/fldeff_strength.c
index b8d5af31d..c6b92b28c 100644
--- a/src/fldeff_strength.c
+++ b/src/fldeff_strength.c
@@ -6,15 +6,14 @@
#include "script.h"
#include "fldeff.h"
#include "event_scripts.h"
-#include "constants/songs.h"
-#include "constants/object_events.h"
+#include "constants/event_objects.h"
-static void FldEff_UseStrength(void);
-static void sub_80D08A8(void);
+static void FieldCB_UseStrength(void);
+static void ShowMonCB_UseStrength(void);
bool8 SetUpFieldMove_Strength(void)
{
- if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) || CheckObjectGraphicsInFrontOfPlayer(OBJECT_EVENT_GFX_STRENGTH_BOULDER) != TRUE)
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) || CheckObjectGraphicsInFrontOfPlayer(OBJ_EVENT_GFX_STRENGTH_BOULDER) != TRUE)
{
return FALSE;
}
@@ -22,25 +21,25 @@ bool8 SetUpFieldMove_Strength(void)
{
gSpecialVar_Result = GetCursorSelectionMonId();
gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
- gPostMenuFieldCallback = FldEff_UseStrength;
+ gPostMenuFieldCallback = FieldCB_UseStrength;
return TRUE;
}
}
-static void FldEff_UseStrength(void)
+static void FieldCB_UseStrength(void)
{
gFieldEffectArguments[0] = GetCursorSelectionMonId();
ScriptContext1_SetupScript(EventScript_FldEffStrength);
}
-bool8 sub_80D0860(void)
+bool8 FldEff_UseStrength(void)
{
- u8 taskId = oei_task_add();
- FLDEFF_SET_FUNC_TO_DATA(sub_80D08A8);
+ u8 taskId = CreateFieldEffectShowMon();
+ FLDEFF_SET_FUNC_TO_DATA(ShowMonCB_UseStrength);
GetMonNickname(&gPlayerParty[gFieldEffectArguments[0]], gStringVar1);
return FALSE;
}
-static void sub_80D08A8(void)
+static void ShowMonCB_UseStrength(void)
{
FieldEffectActiveListRemove(FLDEFF_USE_STRENGTH);
EnableBothScriptContexts();
diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c
index 943d8504c..d827aff4d 100644
--- a/src/fldeff_sweetscent.c
+++ b/src/fldeff_sweetscent.c
@@ -3,7 +3,6 @@
#include "field_effect.h"
#include "party_menu.h"
#include "malloc.h"
-#include "event_data.h"
#include "script.h"
#include "fldeff.h"
#include "event_scripts.h"
@@ -44,7 +43,7 @@ bool8 FldEff_SweetScent(void)
u8 taskId;
SetWeatherScreenFadeOut();
- taskId = oei_task_add();
+ taskId = CreateFieldEffectShowMon();
FLDEFF_SET_FUNC_TO_DATA(StartSweetScentFieldEffect);
return FALSE;
}
diff --git a/src/fldeff_teleport.c b/src/fldeff_teleport.c
index a66a332bf..44a7af732 100644
--- a/src/fldeff_teleport.c
+++ b/src/fldeff_teleport.c
@@ -28,7 +28,7 @@ static void FieldCallback_Teleport(void)
bool8 FldEff_UseTeleport(void)
{
- u8 taskId = oei_task_add();
+ u8 taskId = CreateFieldEffectShowMon();
FLDEFF_SET_FUNC_TO_DATA(StartTeleportFieldEffect);
SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);
return FALSE;
diff --git a/src/flying.c b/src/flying.c
index 6d4a1eb56..4ecfa2899 100644
--- a/src/flying.c
+++ b/src/flying.c
@@ -178,7 +178,7 @@ const struct SpriteTemplate gUnknown_83E6C00 =
};
// not used
-static const u16 gUnknown_83E6C18[] = INCBIN_U16("graphics/battle_anims/sprites/unk_83E6C18.gbapal");
+static const u16 gUnknown_83E6C18[] = INCBIN_U16("graphics/battle_anims/unk_83E6C18.gbapal");
const struct SpriteTemplate gUnknown_83E6C38 =
{
diff --git a/src/graphics.c b/src/graphics.c
new file mode 100644
index 000000000..69e804fd9
--- /dev/null
+++ b/src/graphics.c
@@ -0,0 +1,1419 @@
+#include "global.h"
+
+const u32 gBattleTextboxTiles[] = INCBIN_U32("graphics/battle_interface/window.4bpp.lz");
+const u32 gBattleTextboxPalette[] = INCBIN_U32("graphics/battle_interface/window.gbapal.lz");
+const u32 gBattleTextboxTilemap[] = INCBIN_U32("graphics/interface/menu_map.bin.lz");
+
+const u32 gMonFrontPic_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/circled/front.4bpp.lz");
+const u32 gMonBackPic_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/circled/back.4bpp.lz");
+const u32 gMonPalette_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/circled/normal.gbapal.lz");
+const u32 gMonShinyPalette_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/question_mark/circled/shiny.gbapal.lz");
+
+// From Ruby.
+const u32 gUnusedGfx_OldCharmap[] = INCBIN_U32("graphics/unused/old_charmap.4bpp.lz");
+const u32 gUnusedTimemap_OldCharmap[] = INCBIN_U32("graphics/unused/old_charmap.bin.lz");
+const u32 gUnusedPal_OldCharmap[] = INCBIN_U32("graphics/unused/old_charmap.gbapal.lz");
+
+const u32 gSmokescreenImpactTiles[] = INCBIN_U32("graphics/battle_anims/sprites/smokescreen_impact.4bpp.lz");
+const u32 gSmokescreenImpactPalette[] = INCBIN_U32("graphics/battle_anims/sprites/smokescreen_impact.gbapal.lz");
+
+#include "data/graphics/interface_pokeballs.h"
+
+const u32 gBlankGfxCompressed[] = INCBIN_U32("graphics/interface/blank.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_Bubble[] = INCBIN_U32("graphics/battle_anims/sprites/bubble.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Bone[] = INCBIN_U32("graphics/battle_anims/sprites/bone.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_AirWave[] = INCBIN_U32("graphics/battle_anims/sprites/air_wave.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Orb[] = INCBIN_U32("graphics/battle_anims/sprites/orb.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Sword[] = INCBIN_U32("graphics/battle_anims/sprites/sword.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Seed[] = INCBIN_U32("graphics/battle_anims/sprites/seed.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_RainDrops[] = INCBIN_U32("graphics/battle_anims/sprites/rain_drops.gbapal.lz");
+const u32 gBattleAnimSpritePal_Bone[] = INCBIN_U32("graphics/battle_anims/sprites/bone.gbapal.lz");
+const u32 gBattleAnimSpritePal_AirWave[] = INCBIN_U32("graphics/battle_anims/sprites/air_wave.gbapal.lz");
+const u32 gBattleAnimSpritePal_Orb[] = INCBIN_U32("graphics/battle_anims/sprites/orb.gbapal.lz");
+const u32 gBattleAnimSpritePal_Sword[] = INCBIN_U32("graphics/battle_anims/sprites/sword.gbapal.lz");
+const u32 gBattleAnimSpritePal_Seed[] = INCBIN_U32("graphics/battle_anims/sprites/seed.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Needle[] = INCBIN_U32("graphics/battle_anims/sprites/needle.4bpp.lz");
+const u32 gBattleAnimSpritePal_Needle[] = INCBIN_U32("graphics/battle_anims/sprites/needle.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Explosion6[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_6.4bpp.lz");
+const u32 gBattleAnimSpritePal_Explosion6[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_6.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_PinkOrb[] = INCBIN_U32("graphics/battle_anims/sprites/pink_orb.4bpp.lz");
+const u32 gBattleAnimSpritePal_PinkOrb[] = INCBIN_U32("graphics/battle_anims/sprites/pink_orb.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_IceCube[] = INCBIN_U32("graphics/battle_anims/sprites/ice_cube.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_IceCube[] = INCBIN_U32("graphics/battle_anims/sprites/ice_cube.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_Gust[] = INCBIN_U32("graphics/battle_anims/sprites/gust.4bpp.lz");
+const u32 gBattleAnimSpritePal_Gust[] = INCBIN_U32("graphics/battle_anims/sprites/gust.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Spark2[] = INCBIN_U32("graphics/battle_anims/sprites/spark_2.4bpp.lz");
+const u32 gBattleAnimSpritePal_Spark2[] = INCBIN_U32("graphics/battle_anims/sprites/spark_2.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Orange[] = INCBIN_U32("graphics/battle_anims/sprites/orange.4bpp.lz");
+const u32 gBattleAnimSpritePal_Orange[] = INCBIN_U32("graphics/battle_anims/sprites/orange.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Spikes[] = INCBIN_U32("graphics/battle_anims/sprites/spikes.4bpp.lz");
+const u32 gBattleAnimSpritePal_Spikes[] = INCBIN_U32("graphics/battle_anims/sprites/spikes.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_YellowBall[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_ball.4bpp.lz");
+const u32 gBattleAnimSpritePal_YellowBall[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_ball.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_TiedBag[] = INCBIN_U32("graphics/battle_anims/sprites/tied_bag.4bpp.lz");
+const u32 gBattleAnimSpritePal_TiedBag[] = INCBIN_U32("graphics/battle_anims/sprites/tied_bag.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_BlackSmoke[] = INCBIN_U32("graphics/battle_anims/sprites/black_smoke.4bpp.lz");
+const u32 gBattleAnimSpritePal_BlackSmoke[] = INCBIN_U32("graphics/battle_anims/sprites/black_smoke.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_BlackBall[] = INCBIN_U32("graphics/battle_anims/sprites/black_ball.4bpp.lz");
+
+const u32 gUnknownGfx_8D035A0[] = INCBIN_U32("graphics/unknown/unknown_D035A0.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_Glass[] = INCBIN_U32("graphics/battle_anims/sprites/glass.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_Glass[] = INCBIN_U32("graphics/battle_anims/sprites/glass.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_HornHit[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit.4bpp.lz");
+const u32 gBattleAnimSpritePal_HornHit[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_BlueShards[] = INCBIN_U32("graphics/battle_anims/sprites/blue_shards.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_BlueShards[] = INCBIN_U32("graphics/battle_anims/sprites/blue_shards.4bpp.lz");
+
+const u32 gUnused_BattleSpritePalette_023[] = INCBIN_U32("graphics/unused/battle_anim_023.gbapal.lz");
+
+const u32 gUnusedGfx_MusicNotes[] = INCBIN_U32("graphics/unused/music_notes.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_Hit[] = INCBIN_U32("graphics/battle_anims/sprites/hit.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_Hit[] = INCBIN_U32("graphics/battle_anims/sprites/hit.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_Hit2[] = INCBIN_U32("graphics/battle_anims/sprites/hit_2.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_WavingHand[] = INCBIN_U32("graphics/battle_anims/sprites/waving_hand.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_WavingHand[] = INCBIN_U32("graphics/battle_anims/sprites/waving_hand.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_ClosingEye[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye.4bpp.lz");
+const u32 gBattleAnimSpritePal_ClosingEye[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_BlueStar[] = INCBIN_U32("graphics/battle_anims/sprites/blue_star.4bpp.lz");
+const u32 gBattleAnimSpritePal_BlueStar[] = INCBIN_U32("graphics/battle_anims/sprites/blue_star.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_BubbleBurst[] = INCBIN_U32("graphics/battle_anims/sprites/bubble_burst.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_BubbleBurst[] = INCBIN_U32("graphics/battle_anims/sprites/bubble_burst.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_HitDuplicate[] = INCBIN_U32("graphics/battle_anims/sprites/hit_duplicate.4bpp.lz");
+const u32 gBattleAnimSpritePal_HitDuplicate[] = INCBIN_U32("graphics/battle_anims/sprites/hit_duplicate.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_Leer[] = INCBIN_U32("graphics/battle_anims/sprites/leer.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_Leer[] = INCBIN_U32("graphics/battle_anims/sprites/leer.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_BlueBurst[] = INCBIN_U32("graphics/battle_anims/sprites/blue_burst.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_BlueBurst[] = INCBIN_U32("graphics/battle_anims/sprites/blue_burst.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_SmallEmber[] = INCBIN_U32("graphics/battle_anims/sprites/small_ember.4bpp.lz");
+const u32 gBattleAnimSpritePal_SmallEmber[] = INCBIN_U32("graphics/battle_anims/sprites/small_ember.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_GraySmoke[] = INCBIN_U32("graphics/battle_anims/sprites/gray_smoke.4bpp.lz");
+const u32 gBattleAnimSpritePal_GraySmoke[] = INCBIN_U32("graphics/battle_anims/sprites/gray_smoke.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_Fire[] = INCBIN_U32("graphics/battle_anims/sprites/fire.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_Fire[] = INCBIN_U32("graphics/battle_anims/sprites/fire.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_SpinningFire[] = INCBIN_U32("graphics/battle_anims/sprites/spinning_fire.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_FirePlume[] = INCBIN_U32("graphics/battle_anims/sprites/fire_plume.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_Lightning2[] = INCBIN_U32("graphics/battle_anims/sprites/lightning_2.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_Lightning2[] = INCBIN_U32("graphics/battle_anims/sprites/lightning_2.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_Lightning[] = INCBIN_U32("graphics/battle_anims/sprites/lightning.4bpp.lz");
+
+const u32 gUnknownGfx_D06D80[] = INCBIN_U32("graphics/unknown/unknown_D06D80.4bpp.lz");
+const u32 gUnknownPal_D06DC4[] = INCBIN_U32("graphics/unknown/unknown_D06D80.gbapal.lz");
+const u32 gUnknownPal_D06DD8[] = INCBIN_U32("graphics/unknown/unknown_D06D80_2.gbapal.lz");
+
+// old battle interface data, unused
+const u32 gOldBattleInterfaceGfx[] = INCBIN_U32("graphics/unused/obi1.4bpp.lz");
+const u32 gOldBattleInterfacePal_1_2_3[] = INCBIN_U32("graphics/unused/obi_palpak1.gbapal.lz"); // palettes 1-3
+const u32 gOldBattleInterfacePal4[] = INCBIN_U32("graphics/unused/old_pal4.gbapal.lz"); // 4 is by itself
+const u32 gOldBattleInterfacePal_5_6_7[] = INCBIN_U32("graphics/unused/obi_palpak3.gbapal.lz"); // palettes 5-7
+const u32 gOldBattleInterfaceGfx2[] = INCBIN_U32("graphics/unused/obi2.4bpp.lz");
+const u32 gOldBattleInterfaceTilemap[] = INCBIN_U32("graphics/unused/old_battle_interface_tilemap.bin.lz");
+
+const u32 gBattleAnimSpritePal_ClawSlash2[] = INCBIN_U32("graphics/battle_anims/sprites/claw_slash_2.gbapal.lz");
+const u32 gBattleAnimSpritePal_ClawSlash[] = INCBIN_U32("graphics/battle_anims/sprites/claw_slash.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_ClawSlash2[] = INCBIN_U32("graphics/battle_anims/sprites/claw_slash_2.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_ClawSlash[] = INCBIN_U32("graphics/battle_anims/sprites/claw_slash.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Scratch3[] = INCBIN_U32("graphics/battle_anims/sprites/scratch_3.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Scratch2[] = INCBIN_U32("graphics/battle_anims/sprites/scratch_2.4bpp.lz");
+
+const u32 gPartyMenuHpBar_Gfx[] = INCBIN_U32("graphics/interface/party_menu_hpbar.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_BubbleBurst2[] = INCBIN_U32("graphics/battle_anims/sprites/bubble_burst_2.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_BubbleBurst2[] = INCBIN_U32("graphics/battle_anims/sprites/bubble_burst_2.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_IceChunk[] = INCBIN_U32("graphics/battle_anims/sprites/ice_chunk.4bpp.lz");
+const u32 gBattleAnimSpritePal_IceChunk[] = INCBIN_U32("graphics/battle_anims/sprites/ice_chunk.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_Glass2[] = INCBIN_U32("graphics/battle_anims/sprites/glass_2.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_Glass2[] = INCBIN_U32("graphics/battle_anims/sprites/glass_2.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_PinkHeart2[] = INCBIN_U32("graphics/battle_anims/sprites/pink_heart_2.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_PinkHeart2[] = INCBIN_U32("graphics/battle_anims/sprites/pink_heart_2.4bpp.lz");
+
+const u32 gInterfaceGfx_UnusedWindow[] = INCBIN_U32("graphics/battle_interface/unused_window.4bpp.lz");
+const u32 gInterfacePal_UnusedWindow[] = INCBIN_U32("graphics/battle_interface/unused_window.gbapal.lz");
+
+const u32 gInterfaceGfx_HPNumbers[] = INCBIN_U32("graphics/interface/hp_numbers.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_SapDrip[] = INCBIN_U32("graphics/battle_anims/sprites/sap_drip.4bpp.lz");
+const u32 gBattleAnimSpritePal_SapDrip[] = INCBIN_U32("graphics/battle_anims/sprites/sap_drip.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_SapDrip2[] = INCBIN_U32("graphics/battle_anims/sprites/sap_drip_2.gbapal.lz");
+
+const u32 gUnusedGfx_Window2[] = INCBIN_U32("graphics/battle_interface/unused_window2.4bpp.lz");
+const u32 gUnusedGfx_Window2Bar[] = INCBIN_U32("graphics/battle_interface/unused_window2bar.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_Sparkle1[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_1.4bpp.lz");
+const u32 gBattleAnimSpritePal_Sparkle1[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_1.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_Sparkle2[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_2.gbapal.lz");
+const u32 gBattleAnimSpritePal_HumanoidFoot[] = INCBIN_U32("graphics/battle_anims/sprites/humanoid_foot.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_HumanoidFoot[] = INCBIN_U32("graphics/battle_anims/sprites/humanoid_foot.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_MonsterFoot[] = INCBIN_U32("graphics/battle_anims/sprites/monster_foot.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_HumanoidHand[] = INCBIN_U32("graphics/battle_anims/sprites/humanoid_hand.4bpp.lz");
+
+const u32 gUnusedGfx_LineSketch[] = INCBIN_U32("graphics/unused/line_sketch.4bpp.lz");
+const u32 gUnusedPal_LineSketch[] = INCBIN_U32("graphics/unused/line_sketch.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_YellowUnk[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_unk.4bpp.lz");
+const u32 gBattleAnimSpritePal_YellowUnk[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_unk.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_SlamHit[] = INCBIN_U32("graphics/battle_anims/sprites/slam_hit.4bpp.lz");
+const u32 gBattleAnimSpritePal_SlamHit[] = INCBIN_U32("graphics/battle_anims/sprites/slam_hit.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_RedFist[] = INCBIN_U32("graphics/battle_anims/sprites/red_fist.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_Ring[] = INCBIN_U32("graphics/battle_anims/sprites/ring.4bpp.lz");
+const u32 gBattleAnimSpritePal_Ring[] = INCBIN_U32("graphics/battle_anims/sprites/ring.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Rocks[] = INCBIN_U32("graphics/battle_anims/sprites/rocks.4bpp.lz");
+const u32 gBattleAnimSpritePal_Rocks[] = INCBIN_U32("graphics/battle_anims/sprites/rocks.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Z[] = INCBIN_U32("graphics/battle_anims/sprites/z.4bpp.lz");
+const u32 gBattleAnimSpritePal_Z[] = INCBIN_U32("graphics/battle_anims/sprites/z.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_YellowUnk2[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_unk_2.4bpp.lz");
+const u32 gBattleAnimSpritePal_YellowUnk2[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_unk_2.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_AirSlash[] = INCBIN_U32("graphics/battle_anims/sprites/air_slash.4bpp.lz");
+const u32 gBattleAnimSpritePal_AirSlash[] = INCBIN_U32("graphics/battle_anims/sprites/air_slash.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_SpinningGreenOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/spinning_green_orbs.4bpp.lz");
+const u32 gBattleAnimSpritePal_SpinningGreenOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/spinning_green_orbs.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Leaf[] = INCBIN_U32("graphics/battle_anims/sprites/leaf.4bpp.lz");
+const u32 gBattleAnimSpritePal_Leaf[] = INCBIN_U32("graphics/battle_anims/sprites/leaf.gbapal.lz");
+
+const u32 gUnusedGfx_Metronome[] = INCBIN_U32("graphics/unused/metronome_hand_small.4bpp.lz"); // unused, was for metronome at one point
+
+const u32 gBattleAnimSpritePal_Clapping[] = INCBIN_U32("graphics/battle_anims/sprites/clapping.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_PoisonPowder[] = INCBIN_U32("graphics/battle_anims/sprites/poison_powder.4bpp.lz");
+const u32 gBattleAnimSpritePal_PoisonPowder[] = INCBIN_U32("graphics/battle_anims/sprites/poison_powder.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_BrownTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/brown_triangle.4bpp.lz");
+const u32 gBattleAnimSpritePal_BrownTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/brown_triangle.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Sparkle3[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_3.4bpp.lz");
+const u32 gBattleAnimSpritePal_Sparkle3[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_3.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Sparkle4[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_4.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_MusicNotes[] = INCBIN_U32("graphics/battle_anims/sprites/music_notes.4bpp.lz");
+const u32 gBattleAnimSpritePal_MusicNotes[] = INCBIN_U32("graphics/battle_anims/sprites/music_notes.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Duck[] = INCBIN_U32("graphics/battle_anims/sprites/duck.4bpp.lz");
+const u32 gBattleAnimSpritePal_Duck[] = INCBIN_U32("graphics/battle_anims/sprites/duck.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Alert[] = INCBIN_U32("graphics/battle_anims/sprites/alert.4bpp.lz");
+const u32 gBattleAnimSpritePal_Alert[] = INCBIN_U32("graphics/battle_anims/sprites/alert.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Shock4[] = INCBIN_U32("graphics/battle_anims/sprites/shock_4.4bpp.lz");
+const u32 gBattleAnimSpritePal_Shock4[] = INCBIN_U32("graphics/battle_anims/sprites/shock_4.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Shock[] = INCBIN_U32("graphics/battle_anims/sprites/shock.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_Bell2[] = INCBIN_U32("graphics/battle_anims/sprites/bell_2.4bpp.lz");
+const u32 gBattleAnimSpritePal_Bell2[] = INCBIN_U32("graphics/battle_anims/sprites/bell_2.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_PinkGlove[] = INCBIN_U32("graphics/battle_anims/sprites/pink_glove.4bpp.lz");
+const u32 gBattleAnimSpritePal_PinkGlove[] = INCBIN_U32("graphics/battle_anims/sprites/pink_glove.gbapal.lz");
+
+const u16 gUnknown_D0CA04[] = INCBIN_U16("graphics/unknown/unknown_D0CA04.bin");
+const u16 gUnknown_D0CA28[] = INCBIN_U16("graphics/unknown/unknown_D0CA28.bin");
+const u16 gUnknown_D0CA4C[] = INCBIN_U16("graphics/unknown/unknown_D0CA4C.bin");
+const u32 gUnusedGfx8bpp_LineSketch2[] = INCBIN_U32("graphics/unused/line_sketch_2.8bpp.lz");
+const u16 gUnknown_D0CAC8[] = INCBIN_U16("graphics/unknown/unknown_D0CAC8.bin");
+const u32 gUnusedTilemap_LineSketch2[] = INCBIN_U32("graphics/unused/line_sketch_2.bin.lz");
+
+const u32 gBattleAnimSpriteGfx_BlueLines[] = INCBIN_U32("graphics/battle_anims/sprites/blue_lines.4bpp.lz");
+const u32 gBattleAnimSpritePal_BlueLines[] = INCBIN_U32("graphics/battle_anims/sprites/blue_lines.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_Impact3[] = INCBIN_U32("graphics/battle_anims/sprites/impact_3.gbapal.lz");
+const u32 gBattleAnimSpritePal_Impact2[] = INCBIN_U32("graphics/battle_anims/sprites/impact_2.gbapal.lz");
+const u32 gBattleAnimSpritePal_Reticle[] = INCBIN_U32("graphics/battle_anims/sprites/reticle.gbapal.lz");
+const u32 gBattleAnimSpritePal_Breath[] = INCBIN_U32("graphics/battle_anims/sprites/breath.gbapal.lz");
+const u32 gBattleAnimSpritePal_Snowball[] = INCBIN_U32("graphics/battle_anims/sprites/snowball.gbapal.lz");
+const u32 gBattleAnimSpritePal_Vine[] = INCBIN_U32("graphics/battle_anims/sprites/vine.gbapal.lz");
+const u32 gBattleAnimSpritePal_Sword2[] = INCBIN_U32("graphics/battle_anims/sprites/sword_2.gbapal.lz");
+const u32 gBattleAnimSpritePal_RedTube[] = INCBIN_U32("graphics/battle_anims/sprites/red_tube.gbapal.lz");
+const u32 gBattleAnimSpritePal_Amnesia[] = INCBIN_U32("graphics/battle_anims/sprites/amnesia.gbapal.lz");
+const u32 gBattleAnimSpritePal_String2[] = INCBIN_U32("graphics/battle_anims/sprites/string_2.gbapal.lz");
+
+const u32 gFile_graphics_unknown_unknown_D0CD0C[] = INCBIN_U32("graphics/unknown/unknown_D0CD0C.bin.lz");
+
+const u32 gBattleAnimSpritePal_Pencil2[] = INCBIN_U32("graphics/battle_anims/sprites/pencil_2.gbapal.lz");
+const u32 gBattleAnimSpritePal_Petal[] = INCBIN_U32("graphics/battle_anims/sprites/petal.gbapal.lz");
+const u32 gBattleAnimSpritePal_BentSpoon[] = INCBIN_U32("graphics/battle_anims/sprites/bent_spoon.gbapal.lz");
+const u32 gBattleAnimSpritePal_Coin[] = INCBIN_U32("graphics/battle_anims/sprites/coin.gbapal.lz");
+const u32 gBattleAnimSpritePal_CrackedEgg[] = INCBIN_U32("graphics/battle_anims/sprites/cracked_egg.gbapal.lz");
+const u32 gBattleAnimSpritePal_FreshEgg[] = INCBIN_U32("graphics/battle_anims/sprites/fresh_egg.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Impact3[] = INCBIN_U32("graphics/battle_anims/sprites/impact_3.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Impact2[] = INCBIN_U32("graphics/battle_anims/sprites/impact_2.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Reticle[] = INCBIN_U32("graphics/battle_anims/sprites/reticle.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Breath[] = INCBIN_U32("graphics/battle_anims/sprites/breath.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Snowball[] = INCBIN_U32("graphics/battle_anims/sprites/snowball.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Vine[] = INCBIN_U32("graphics/battle_anims/sprites/vine.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Sword2[] = INCBIN_U32("graphics/battle_anims/sprites/sword_2.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Clapping[] = INCBIN_U32("graphics/battle_anims/sprites/clapping.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_RedTube[] = INCBIN_U32("graphics/battle_anims/sprites/red_tube.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Amnesia[] = INCBIN_U32("graphics/battle_anims/sprites/amnesia.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_String2[] = INCBIN_U32("graphics/battle_anims/sprites/string_2.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Pencil2[] = INCBIN_U32("graphics/battle_anims/sprites/pencil_2.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Petal[] = INCBIN_U32("graphics/battle_anims/sprites/petal.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_BentSpoon[] = INCBIN_U32("graphics/battle_anims/sprites/bent_spoon.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Web[] = INCBIN_U32("graphics/battle_anims/sprites/web.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Coin[] = INCBIN_U32("graphics/battle_anims/sprites/coin.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_CrackedEgg[] = INCBIN_U32("graphics/battle_anims/sprites/cracked_egg.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_HatchedEgg[] = INCBIN_U32("graphics/battle_anims/sprites/hatched_egg.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_FreshEgg[] = INCBIN_U32("graphics/battle_anims/sprites/fresh_egg.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_Fangs[] = INCBIN_U32("graphics/battle_anims/sprites/fangs.4bpp.lz");
+const u32 gBattleAnimSpritePal_Fangs[] = INCBIN_U32("graphics/battle_anims/sprites/fangs.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Explosion2[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_2.4bpp.lz");
+const u32 gBattleAnimSpritePal_Explosion2[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_2.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Explosion3[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_3.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_WaterDroplet[] = INCBIN_U32("graphics/battle_anims/sprites/water_droplet.4bpp.lz");
+const u32 gBattleAnimSpritePal_WaterDroplet[] = INCBIN_U32("graphics/battle_anims/sprites/water_droplet.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_WaterDroplet2[] = INCBIN_U32("graphics/battle_anims/sprites/water_droplet_2.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_Seed2[] = INCBIN_U32("graphics/battle_anims/sprites/seed_2.4bpp.lz");
+const u32 gBattleAnimSpritePal_Seed2[] = INCBIN_U32("graphics/battle_anims/sprites/seed_2.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Sprout[] = INCBIN_U32("graphics/battle_anims/sprites/sprout.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_RedWand[] = INCBIN_U32("graphics/battle_anims/sprites/red_wand.4bpp.lz");
+const u32 gBattleAnimSpritePal_RedWand[] = INCBIN_U32("graphics/battle_anims/sprites/red_wand.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_PurpleGreenUnk[] = INCBIN_U32("graphics/battle_anims/sprites/purple_green_unk.4bpp.lz");
+const u32 gBattleAnimSpritePal_PurpleGreenUnk[] = INCBIN_U32("graphics/battle_anims/sprites/purple_green_unk.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_WaterColumn[] = INCBIN_U32("graphics/battle_anims/sprites/water_column.4bpp.lz");
+const u32 gBattleAnimSpritePal_WaterColumn[] = INCBIN_U32("graphics/battle_anims/sprites/water_column.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_MudUnk[] = INCBIN_U32("graphics/battle_anims/sprites/mud_unk.4bpp.lz");
+const u32 gBattleAnimSpritePal_MudUnk[] = INCBIN_U32("graphics/battle_anims/sprites/mud_unk.gbapal.lz");
+
+const u32 gUnusedTilemap_BlueFrame[] = INCBIN_U32("graphics/unused/blue_frame.bin.lz"); // P1, P2, P3 and P4 tilemaps?
+const u32 gUnusedTilemap_RedYellowGreenFrame[] = INCBIN_U32("graphics/unused/redyellowgreen_frame.bin.lz");
+const u32 gUnusedGfx_ColorFrames[] = INCBIN_U32("graphics/unused/color_frames.4bpp.lz");
+const u32 gUnusedPal_ColorFrames[] = INCBIN_U32("graphics/unused/color_frames.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_RainDrops[] = INCBIN_U32("graphics/battle_anims/sprites/rain_drops.4bpp.lz");
+
+const u32 gUnusedGfx8bpp_WaterSplash [] = INCBIN_U32("graphics/unused/water_splash.8bpp.lz");
+const u32 gUnusedTilemap_WaterSplash[] = INCBIN_U32("graphics/unused/water_splash.bin.lz");
+const u32 gUnusedPalette_WaterSplash[] = INCBIN_U32("graphics/unused/water_splash.gbapal.lz");
+
+const u32 gUnusedGfx_BasicFrame[] = INCBIN_U32("graphics/unused/basic_frame.4bpp.lz");
+const u32 gUnusedPal_BasicFrame[] = INCBIN_U32("graphics/unused/basic_frame.gbapal.lz");
+const u32 gUnusedTilemap_BasicFrame[] = INCBIN_U32("graphics/unused/basic_frame.bin.lz");
+
+// Battle Interface
+
+const u16 gBattleInterface_BallStatusBarPal[] = INCBIN_U16("graphics/battle_interface/ball_status_bar.gbapal");
+
+const u16 gBattleInterface_BallDisplayPal[] = INCBIN_U16("graphics/battle_interface/ball_display.gbapal");
+
+//Originally an array?
+const u8 gHealthboxElementsGfxTable[] = INCBIN_U8("graphics/battle_interface/hp_bar.4bpp");
+const u8 gHealthboxElementsGfxTable_ExpBar[] = INCBIN_U8("graphics/battle_interface/exp_bar.4bpp");
+const u8 gHealthboxElementsGfxTable_StatusPsn[] = INCBIN_U8("graphics/battle_interface/status_psn.4bpp");
+const u8 gHealthboxElementsGfxTable_StatusPar[] = INCBIN_U8("graphics/battle_interface/status_par.4bpp");
+const u8 gHealthboxElementsGfxTable_StatusSlp[] = INCBIN_U8("graphics/battle_interface/status_slp.4bpp");
+const u8 gHealthboxElementsGfxTable_StatusFrz[] = INCBIN_U8("graphics/battle_interface/status_frz.4bpp");
+const u8 gHealthboxElementsGfxTable_StatusBrn[] = INCBIN_U8("graphics/battle_interface/status_brn.4bpp");
+const u8 gHealthboxElementsGfxTable_Misc[] = INCBIN_U8("graphics/battle_interface/misc.4bpp");
+const u8 gHealthboxElementsGfxTable_HpBarAnim[] = INCBIN_U8("graphics/battle_interface/hp_bar_anim.4bpp");
+const u8 gHealthboxElementsGfxTable_MiscFrameEnd[] = INCBIN_U8("graphics/battle_interface/misc_frame_end.4bpp");
+
+const u8 gUnknown_8D12404[] = INCBIN_U8("graphics/battle_interface/ball_display.4bpp");
+
+//Originally an array?
+const u8 gUnknown_08C1249C[] = INCBIN_U8("graphics/battle_interface/ball_display_unused_extra.4bpp");
+const u8 gBattleInterfaceGfx_Status2[] = INCBIN_U8("graphics/battle_interface/status2.4bpp"); // these three duplicate sets of graphics are for the opponent pokemon
+const u8 gBattleInterfaceGfx_Status3[] = INCBIN_U8("graphics/battle_interface/status3.4bpp"); // and are also for use in double battles. they use dynamic palettes so
+const u8 gBattleInterfaceGfx_Status4[] = INCBIN_U8("graphics/battle_interface/status4.4bpp"); // coloring them is an extreme headache and wont be done for now
+const u8 gUnknown_8D12A44[] = INCBIN_U8("graphics/unknown/unknown_D12A44.4bpp");
+const u8 gUnknown_8D12A64[] = INCBIN_U8("graphics/unknown/unknown_D12A64.4bpp");
+const u32 gBattleInterfaceGfx_UnusedWindow3[] = INCBIN_U32("graphics/battle_interface/unused_window3.4bpp.lz");
+const u32 gBattleInterfaceGfx_UnusedWindow4[] = INCBIN_U32("graphics/battle_interface/unused_window4.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_FurySwipes[] = INCBIN_U32("graphics/battle_anims/sprites/fury_swipes.4bpp.lz");
+const u32 gBattleAnimSpritePal_FurySwipes[] = INCBIN_U32("graphics/battle_anims/sprites/fury_swipes.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Vine2[] = INCBIN_U32("graphics/battle_anims/sprites/vine_2.4bpp.lz");
+const u32 gBattleAnimSpritePal_Vine2[] = INCBIN_U32("graphics/battle_anims/sprites/vine_2.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Teeth[] = INCBIN_U32("graphics/battle_anims/sprites/teeth.4bpp.lz");
+const u32 gBattleAnimSpritePal_Teeth[] = INCBIN_U32("graphics/battle_anims/sprites/teeth.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Bone2[] = INCBIN_U32("graphics/battle_anims/sprites/bone_2.4bpp.lz");
+const u32 gBattleAnimSpritePal_Bone2[] = INCBIN_U32("graphics/battle_anims/sprites/bone_2.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_WhiteBag[] = INCBIN_U32("graphics/battle_anims/sprites/white_bag.4bpp.lz");
+const u32 gBattleAnimSpritePal_WhiteBag[] = INCBIN_U32("graphics/battle_anims/sprites/white_bag.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Unknown[] = INCBIN_U32("graphics/battle_anims/sprites/unknown.4bpp.lz");
+const u32 gBattleAnimSpritePal_Unknown[] = INCBIN_U32("graphics/battle_anims/sprites/unknown.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_PurpleCoral[] = INCBIN_U32("graphics/battle_anims/sprites/purple_coral.4bpp.lz");
+const u32 gBattleAnimSpritePal_PurpleCoral[] = INCBIN_U32("graphics/battle_anims/sprites/purple_coral.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_PurpleDroplet[] = INCBIN_U32("graphics/battle_anims/sprites/purple_droplet.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_Shock2[] = INCBIN_U32("graphics/battle_anims/sprites/shock_2.4bpp.lz");
+const u32 gBattleAnimSpritePal_Shock2[] = INCBIN_U32("graphics/battle_anims/sprites/shock_2.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_ClosingEye2[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye_2.4bpp.lz");
+const u32 gBattleAnimSpritePal_ClosingEye2[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye_2.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_MetalBall[] = INCBIN_U32("graphics/battle_anims/sprites/metal_ball.4bpp.lz");
+const u32 gBattleAnimSpritePal_MetalBall[] = INCBIN_U32("graphics/battle_anims/sprites/metal_ball.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_MonsterDoll[] = INCBIN_U32("graphics/battle_anims/sprites/monster_doll.4bpp.lz");
+const u32 gBattleAnimSpritePal_MonsterDoll[] = INCBIN_U32("graphics/battle_anims/sprites/monster_doll.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Whirlwind[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind.4bpp.lz");
+const u32 gBattleAnimSpritePal_Whirlwind[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Whirlwind2[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind_2.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_Explosion4[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_4.4bpp.lz");
+const u32 gBattleAnimSpritePal_Explosion4[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_4.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Explosion5[] = INCBIN_U32("graphics/battle_anims/sprites/explosion_5.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_Tongue[] = INCBIN_U32("graphics/battle_anims/sprites/tongue.4bpp.lz");
+const u32 gBattleAnimSpritePal_Tongue[] = INCBIN_U32("graphics/battle_anims/sprites/tongue.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Smoke[] = INCBIN_U32("graphics/battle_anims/sprites/smoke.4bpp.lz");
+const u32 gBattleAnimSpritePal_Smoke[] = INCBIN_U32("graphics/battle_anims/sprites/smoke.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Smoke2[] = INCBIN_U32("graphics/battle_anims/sprites/smoke_2.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_BlueFlames[] = INCBIN_U32("graphics/battle_anims/sprites/blue_flames.4bpp.lz");
+const u32 gBattleAnimSpritePal_BlueFlames[] = INCBIN_U32("graphics/battle_anims/sprites/blue_flames.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_BlueFlames2[] = INCBIN_U32("graphics/battle_anims/sprites/blue_flames_2.4bpp.lz");
+
+// Contest
+
+const u32 gUnusedGfx_OldContest[] = INCBIN_U32("graphics/unused/old_contest.4bpp.lz");
+const u32 gUnusedPal_OldContest[] = INCBIN_U32("graphics/unused/old_contest.gbapal.lz");
+const u32 gUnusedTilemap_OldContest[] = INCBIN_U32("graphics/unused/old_contest.bin.lz");
+
+const u32 gFile_graphics_unknown_unknown_D15BE8_tilemap[] = INCBIN_U32("graphics/unknown/unknown_D15BE8.bin.lz");
+
+const u32 gFile_graphics_unused_numbers_sheet[] = INCBIN_U32("graphics/unused/numbers.4bpp.lz"); // From ruby
+const u32 gFile_graphics_unused_numbers_palette[] = INCBIN_U32("graphics/unused/numbers.gbapal.lz"); // From ruby
+
+const u32 gUnusedGfx_OldContest2[] = INCBIN_U32("graphics/unused/old_contest_2.4bpp.lz");
+const u32 gOldContestPalette[] = INCBIN_U32("graphics/unused/old_contest_2.gbapal.lz");
+const u32 gOldContestGfx[] = INCBIN_U32("graphics/unused/old_contest_2.bin.lz");
+
+const u32 gFile_graphics_unknown_unknown_D172A8_tilemap[] = INCBIN_U32("graphics/unknown/unknown_D172A8.bin.lz");
+
+const u32 gFile_graphics_unknown_unknown_D17548_tilemap[] = INCBIN_U32("graphics/unknown/unknown_D17548.bin.lz");
+
+const u32 gFile_graphics_unknown_unknown_D17654_tilemap[] = INCBIN_U32("graphics/unknown/unknown_D17654.bin.lz");
+
+const u32 gFile_graphics_unknown_unknown_D17AB8_tilemap[] = INCBIN_U32("graphics/unknown/unknown_D17AB8.bin.lz");
+
+const u32 gContestMiscGfx[] = INCBIN_U32("graphics/contest/misc.4bpp.lz");
+
+const u32 gFile_graphics_contest_audience_sheet[] = INCBIN_U32("graphics/contest/audience.4bpp.lz");
+
+const u32 gFile_graphics_contest_faces_sheet[] = INCBIN_U32("graphics/contest/faces.4bpp.lz");
+
+const u32 gFile_graphics_contest_judge_symbols_sheet[] = INCBIN_U32("graphics/contest/judge_symbols.4bpp.lz");
+const u32 gFile_graphics_contest_judge_symbols_palette[] = INCBIN_U32("graphics/contest/judge_symbols.gbapal.lz");
+
+const u8 gFile_graphics_contest_heart[] = INCBIN_U8("graphics/contest/heart.4bpp");
+
+const u32 gFile_graphics_unknown_unknown_D196E4_sheet[] = INCBIN_U32("graphics/unknown/unknown_D196E4.4bpp.lz");
+const u32 gFile_graphics_unknown_unknown_D196E4_palette[] = INCBIN_U32("graphics/unknown/unknown_D196E4.gbapal.lz");
+
+const u32 gUnknown_8D197FC[] = INCBIN_U32("graphics/contest/misc_2.4bpp.lz");
+
+const u32 gFile_graphics_contest_misc_2_tilemap_1_tilemap[] = INCBIN_U32("graphics/contest/misc_2_tilemap_1.bin.lz");
+const u32 gFile_graphics_contest_misc_2_tilemap_2_tilemap[] = INCBIN_U32("graphics/contest/misc_2_tilemap_2.bin.lz");
+const u32 gFile_graphics_contest_misc_2_tilemap_3_tilemap[] = INCBIN_U32("graphics/contest/misc_2_tilemap_3.bin.lz");
+
+const u32 gFile_graphics_contest_misc_2_palette[] = INCBIN_U32("graphics/contest/misc_2.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Impact[] = INCBIN_U32("graphics/battle_anims/sprites/impact.4bpp.lz");
+const u32 gBattleAnimSpritePal_Impact[] = INCBIN_U32("graphics/battle_anims/sprites/impact.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Particles[] = INCBIN_U32("graphics/battle_anims/sprites/particles.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_CircleImpact[] = INCBIN_U32("graphics/battle_anims/sprites/circle_impact.4bpp.lz");
+const u32 gBattleAnimSpritePal_CircleImpact[] = INCBIN_U32("graphics/battle_anims/sprites/circle_impact.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Scratch[] = INCBIN_U32("graphics/battle_anims/sprites/scratch.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_SharpTeeth[] = INCBIN_U32("graphics/battle_anims/sprites/sharp_teeth.4bpp.lz");
+const u32 gBattleAnimSpritePal_SharpTeeth[] = INCBIN_U32("graphics/battle_anims/sprites/sharp_teeth.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Clamp[] = INCBIN_U32("graphics/battle_anims/sprites/clamp.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_Cut[] = INCBIN_U32("graphics/battle_anims/sprites/cut.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_RainbowRings[] = INCBIN_U32("graphics/battle_anims/sprites/rainbow_rings.4bpp.lz");
+const u32 gBattleAnimSpritePal_RainbowRings[] = INCBIN_U32("graphics/battle_anims/sprites/rainbow_rings.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_IceCrystals[] = INCBIN_U32("graphics/battle_anims/sprites/ice_crystals.4bpp.lz");
+const u32 gBattleAnimSpritePal_IceCrystals[] = INCBIN_U32("graphics/battle_anims/sprites/ice_crystals.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_IceSpikes[] = INCBIN_U32("graphics/battle_anims/sprites/ice_spikes.4bpp.lz");
+
+const u32 gUnusedGfx_OldBeatUp[] = INCBIN_U32("graphics/unused/old_beatup.4bpp.lz");
+const u32 gUnusedPal_OldBeatUp[] = INCBIN_U32("graphics/unused/old_beatup.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Orbs[] = INCBIN_U32("graphics/battle_anims/sprites/orbs.4bpp.lz");
+const u32 gBattleAnimSpritePal_Orbs[] = INCBIN_U32("graphics/battle_anims/sprites/orbs.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_WaterOrb[] = INCBIN_U32("graphics/battle_anims/sprites/water_orb.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_WaterImpact[] = INCBIN_U32("graphics/battle_anims/sprites/water_impact.4bpp.lz");
+const u32 gBattleAnimSpritePal_WaterImpact[] = INCBIN_U32("graphics/battle_anims/sprites/water_impact.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_BrownOrb[] = INCBIN_U32("graphics/battle_anims/sprites/brown_orb.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_MudSand[] = INCBIN_U32("graphics/battle_anims/sprites/mud_sand.4bpp.lz");
+const u32 gBattleAnimSpritePal_MudSand[] = INCBIN_U32("graphics/battle_anims/sprites/mud_sand.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_PoisonBubble[] = INCBIN_U32("graphics/battle_anims/sprites/poison_bubble.4bpp.lz");
+const u32 gBattleAnimSpritePal_PoisonBubble[] = INCBIN_U32("graphics/battle_anims/sprites/poison_bubble.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_ToxicBubble[] = INCBIN_U32("graphics/battle_anims/sprites/toxic_bubble.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_HornHit2[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit_2.4bpp.lz");
+const u32 gBattleAnimSpritePal_HornHit2[] = INCBIN_U32("graphics/battle_anims/sprites/horn_hit_2.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_AirWave2[] = INCBIN_U32("graphics/battle_anims/sprites/air_wave_2.4bpp.lz");
+const u32 gBattleAnimSpritePal_AirWave2[] = INCBIN_U32("graphics/battle_anims/sprites/air_wave_2.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_SmallBubbles[] = INCBIN_U32("graphics/battle_anims/sprites/small_bubbles.4bpp.lz");
+const u32 gBattleAnimSpritePal_SmallBubbles[] = INCBIN_U32("graphics/battle_anims/sprites/small_bubbles.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_RoundShadow[] = INCBIN_U32("graphics/battle_anims/sprites/round_shadow.4bpp.lz");
+const u32 gBattleAnimSpritePal_RoundShadow[] = INCBIN_U32("graphics/battle_anims/sprites/round_shadow.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Sunlight[] = INCBIN_U32("graphics/battle_anims/sprites/sunlight.4bpp.lz");
+const u32 gBattleAnimSpritePal_Sunlight[] = INCBIN_U32("graphics/battle_anims/sprites/sunlight.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Spore[] = INCBIN_U32("graphics/battle_anims/sprites/spore.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_Spore[] = INCBIN_U32("graphics/battle_anims/sprites/spore.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Flower[] = INCBIN_U32("graphics/battle_anims/sprites/flower.4bpp.lz");
+const u32 gBattleAnimSpritePal_Flower[] = INCBIN_U32("graphics/battle_anims/sprites/flower.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_RazorLeaf[] = INCBIN_U32("graphics/battle_anims/sprites/razor_leaf.4bpp.lz");
+const u32 gBattleAnimSpritePal_RazorLeaf[] = INCBIN_U32("graphics/battle_anims/sprites/razor_leaf.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_MistCloud[] = INCBIN_U32("graphics/battle_anims/sprites/mist_cloud.4bpp.lz");
+const u32 gBattleAnimSpritePal_MistCloud[] = INCBIN_U32("graphics/battle_anims/sprites/mist_cloud.gbapal.lz");
+
+const u32 gFile_graphics_unknown_unknown_D1BE74_sheet[] = INCBIN_U32("graphics/unknown/unknown_D1BE74.4bpp.lz");
+const u32 gFile_graphics_unknown_unknown_D1BE74_palette[] = INCBIN_U32("graphics/unknown/unknown_D1BE74.gbapal.lz");
+const u32 gFile_graphics_unknown_unknown_D1BE74_tilemap[] = INCBIN_U32("graphics/unknown/unknown_D1BE74.bin.lz");
+
+const u32 gBattleAnimSpriteGfx_WhirlwindLines[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind_lines.4bpp.lz");
+const u32 gBattleAnimSpritePal_WhirlwindLines[] = INCBIN_U32("graphics/battle_anims/sprites/whirlwind_lines.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_GoldRing[] = INCBIN_U32("graphics/battle_anims/sprites/gold_ring.4bpp.lz");
+const u32 gBattleAnimSpritePal_GoldRing[] = INCBIN_U32("graphics/battle_anims/sprites/gold_ring.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_BlueRing2[] = INCBIN_U32("graphics/battle_anims/sprites/blue_ring_2.gbapal.lz");
+const u32 gBattleAnimSpritePal_PurpleRing[] = INCBIN_U32("graphics/battle_anims/sprites/purple_ring.gbapal.lz");
+const u32 gBattleAnimSpritePal_BlueRing[] = INCBIN_U32("graphics/battle_anims/sprites/blue_ring.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_GreenLightWall[] = INCBIN_U32("graphics/battle_anims/sprites/green_light_wall.4bpp.lz");
+const u32 gBattleAnimSpritePal_GreenLightWall[] = INCBIN_U32("graphics/battle_anims/sprites/green_light_wall.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_BlueLightWall[] = INCBIN_U32("graphics/battle_anims/sprites/blue_light_wall.gbapal.lz");
+const u32 gBattleAnimSpritePal_RedLightWall[] = INCBIN_U32("graphics/battle_anims/sprites/red_light_wall.gbapal.lz");
+const u32 gBattleAnimSpritePal_GrayLightWall[] = INCBIN_U32("graphics/battle_anims/sprites/gray_light_wall.gbapal.lz");
+const u32 gBattleAnimSpritePal_OrangeLightWall[] = INCBIN_U32("graphics/battle_anims/sprites/orange_light_wall.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_BlackBall2[] = INCBIN_U32("graphics/battle_anims/sprites/black_ball_2.4bpp.lz");
+const u32 gBattleAnimSpritePal_BlackBall2[] = INCBIN_U32("graphics/battle_anims/sprites/black_ball_2.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_PurpleGasCloud[] = INCBIN_U32("graphics/battle_anims/sprites/purple_gas_cloud.gbapal.lz");
+
+const u32 gFile_graphics_contest_judge_sheet[] = INCBIN_U32("graphics/contest/judge.4bpp.lz");
+const u32 gFile_graphics_contest_judge_palette[] = INCBIN_U32("graphics/contest/judge.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Spark[] = INCBIN_U32("graphics/battle_anims/sprites/spark.4bpp.lz");
+const u32 gBattleAnimSpritePal_Spark[] = INCBIN_U32("graphics/battle_anims/sprites/spark.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_SparkH[] = INCBIN_U32("graphics/battle_anims/sprites/spark_h.4bpp.lz");
+
+const u32 gBattleAnimBgImage_Dark[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark.4bpp.lz");
+const u32 gBattleAnimBgPalette_Dark[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark.gbapal.lz");
+const u32 gBattleAnimBgTilemap_Dark[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark.bin.lz");
+
+const u32 gMetalShineGfx[] = INCBIN_U32("graphics/battle_anims/masks/metal_shine.4bpp.lz");
+const u32 gMetalShinePalette[] = INCBIN_U32("graphics/battle_anims/masks/metal_shine.gbapal.lz");
+const u32 gMetalShineTilemap[] = INCBIN_U32("graphics/battle_anims/masks/metal_shine.bin.lz");
+
+const u32 gUnusedGfx_Goosuto[] = INCBIN_U32("graphics/unused/goosuto.4bpp.lz"); // ghost
+const u32 gUnusedPal_Goosuto[] = INCBIN_U32("graphics/unused/goosuto.gbapal.lz");
+const u32 gUnusedTilemap_Goosuto[] = INCBIN_U32("graphics/unused/goosuto.bin.lz");
+
+const u32 gBattleAnimSpriteGfx_YellowStar[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_star.4bpp.lz");
+const u32 gBattleAnimSpritePal_YellowStar[] = INCBIN_U32("graphics/battle_anims/sprites/yellow_star.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_LargeFreshEgg[] = INCBIN_U32("graphics/battle_anims/sprites/large_fresh_egg.4bpp.lz");
+const u32 gBattleAnimSpritePal_LargeFreshEgg[] = INCBIN_U32("graphics/battle_anims/sprites/large_fresh_egg.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_ShadowBall[] = INCBIN_U32("graphics/battle_anims/sprites/shadow_ball.4bpp.lz");
+const u32 gBattleAnimSpritePal_ShadowBall[] = INCBIN_U32("graphics/battle_anims/sprites/shadow_ball.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Lick[] = INCBIN_U32("graphics/battle_anims/sprites/lick.4bpp.lz");
+const u32 gBattleAnimSpritePal_Lick[] = INCBIN_U32("graphics/battle_anims/sprites/lick.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_VoidLines[] = INCBIN_U32("graphics/battle_anims/sprites/void_lines.4bpp.lz");
+const u32 gBattleAnimSpritePal_VoidLines[] = INCBIN_U32("graphics/battle_anims/sprites/void_lines.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_String[] = INCBIN_U32("graphics/battle_anims/sprites/string.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_String[] = INCBIN_U32("graphics/battle_anims/sprites/string.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_WebThread[] = INCBIN_U32("graphics/battle_anims/sprites/web_thread.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_SpiderWeb[] = INCBIN_U32("graphics/battle_anims/sprites/spider_web.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_Lightbulb[] = INCBIN_U32("graphics/battle_anims/sprites/lightbulb.4bpp.lz");
+const u32 gBattleAnimSpritePal_Lightbulb[] = INCBIN_U32("graphics/battle_anims/sprites/lightbulb.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Slash[] = INCBIN_U32("graphics/battle_anims/sprites/slash.4bpp.lz");
+const u32 gBattleAnimSpritePal_Slash[] = INCBIN_U32("graphics/battle_anims/sprites/slash.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_FocusEnergy[] = INCBIN_U32("graphics/battle_anims/sprites/focus_energy.4bpp.lz");
+const u32 gBattleAnimSpritePal_FocusEnergy[] = INCBIN_U32("graphics/battle_anims/sprites/focus_energy.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_SphereToCube[] = INCBIN_U32("graphics/battle_anims/sprites/sphere_to_cube.4bpp.lz");
+const u32 gBattleAnimSpritePal_SphereToCube[] = INCBIN_U32("graphics/battle_anims/sprites/sphere_to_cube.gbapal.lz");
+
+const u32 gBattleAnimBgImage_Psychic[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic.4bpp.lz");
+const u32 gBattleAnimBgPalette_Psychic[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic.gbapal.lz");
+const u32 gBattleAnimBgTilemap_Psychic[] = INCBIN_U32("graphics/battle_anims/backgrounds/psychic.bin.lz");
+
+const u32 gBattleAnimSpriteGfx_Eye[] = INCBIN_U32("graphics/battle_anims/sprites/eye.4bpp.lz");
+const u32 gBattleAnimSpritePal_Eye[] = INCBIN_U32("graphics/battle_anims/sprites/eye.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Tendrils[] = INCBIN_U32("graphics/battle_anims/sprites/tendrils.4bpp.lz");
+const u32 gBattleAnimSpritePal_Tendrils[] = INCBIN_U32("graphics/battle_anims/sprites/tendrils.gbapal.lz");
+
+const u32 gHealthboxSinglesPlayerGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_singles_player.4bpp.lz");
+const u32 gHealthboxSinglesOpponentGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_singles_opponent.4bpp.lz");
+const u32 gHealthboxDoublesPlayerGfx[] = INCBIN_U32( "graphics/battle_interface/healthbox_doubles_player.4bpp.lz");
+const u32 gHealthboxDoublesOpponentGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_doubles_opponent.4bpp.lz");
+const u32 gHealthboxSafariGfx[] = INCBIN_U32("graphics/battle_interface/healthbox_safari.4bpp.lz");
+
+const u32 gUnusedGfx_Shadow[] = INCBIN_U32("graphics/unused/shadow.4bpp.lz");
+const u32 gUnusedPal_Shadow[] = INCBIN_U32("graphics/unused/shadow.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_LockOn[] = INCBIN_U32("graphics/battle_anims/sprites/lock_on.4bpp.lz");
+const u32 gBattleAnimSpritePal_LockOn[] = INCBIN_U32("graphics/battle_anims/sprites/lock_on.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_OpeningEye[] = INCBIN_U32("graphics/battle_anims/sprites/opening_eye.4bpp.lz");
+const u32 gBattleAnimSpritePal_OpeningEye[] = INCBIN_U32("graphics/battle_anims/sprites/opening_eye.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_RoundWhiteHalo[] = INCBIN_U32("graphics/battle_anims/sprites/round_white_halo.4bpp.lz");
+const u32 gBattleAnimSpritePal_RoundWhiteHalo[] = INCBIN_U32("graphics/battle_anims/sprites/round_white_halo.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_TealAlert[] = INCBIN_U32("graphics/battle_anims/sprites/teal_alert.4bpp.lz");
+const u32 gBattleAnimSpritePal_TealAlert[] = INCBIN_U32("graphics/battle_anims/sprites/teal_alert.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_FangAttack[] = INCBIN_U32("graphics/battle_anims/sprites/fang_attack.4bpp.lz");
+const u32 gBattleAnimSpritePal_FangAttack[] = INCBIN_U32("graphics/battle_anims/sprites/fang_attack.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_PurpleHandOutline[] = INCBIN_U32("graphics/battle_anims/sprites/purple_hand_outline.4bpp.lz");
+const u32 gBattleAnimSpritePal_PurpleHandOutline[] = INCBIN_U32("graphics/battle_anims/sprites/purple_hand_outline.gbapal.lz");
+
+const u32 gFile_graphics_battle_anims_masks_curse_sheet[] = INCBIN_U32("graphics/battle_anims/masks/curse.4bpp.lz");
+const u32 gFile_graphics_battle_anims_masks_curse_tilemap[] = INCBIN_U32("graphics/battle_anims/masks/curse.bin.lz");
+
+const u32 gBattleAnimSpriteGfx_Pencil[] = INCBIN_U32("graphics/battle_anims/sprites/pencil.4bpp.lz");
+const u32 gBattleAnimSpritePal_Pencil[] = INCBIN_U32("graphics/battle_anims/sprites/pencil.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Spiral[] = INCBIN_U32("graphics/battle_anims/sprites/spiral.4bpp.lz");
+const u32 gBattleAnimSpritePal_Spiral[] = INCBIN_U32("graphics/battle_anims/sprites/spiral.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Moon[] = INCBIN_U32("graphics/battle_anims/sprites/moon.4bpp.lz");
+const u32 gBattleAnimSpritePal_Moon[] = INCBIN_U32("graphics/battle_anims/sprites/moon.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_GreenSparkle[] = INCBIN_U32("graphics/battle_anims/sprites/green_sparkle.4bpp.lz");
+const u32 gBattleAnimSpritePal_GreenSparkle[] = INCBIN_U32("graphics/battle_anims/sprites/green_sparkle.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_SnoreZ[] = INCBIN_U32("graphics/battle_anims/sprites/snore_z.4bpp.lz");
+const u32 gBattleAnimSpritePal_SnoreZ[] = INCBIN_U32("graphics/battle_anims/sprites/snore_z.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Explosion[] = INCBIN_U32("graphics/battle_anims/sprites/explosion.4bpp.lz");
+const u32 gBattleAnimSpritePal_Explosion[] = INCBIN_U32("graphics/battle_anims/sprites/explosion.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Nail[] = INCBIN_U32("graphics/battle_anims/sprites/nail.4bpp.lz");
+const u32 gBattleAnimSpritePal_Nail[] = INCBIN_U32("graphics/battle_anims/sprites/nail.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_GhostlySpirit[] = INCBIN_U32("graphics/battle_anims/sprites/ghostly_spirit.4bpp.lz");
+const u32 gBattleAnimSpritePal_GhostlySpirit[] = INCBIN_U32("graphics/battle_anims/sprites/ghostly_spirit.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_WarmRock[] = INCBIN_U32("graphics/battle_anims/sprites/warm_rock.4bpp.lz");
+const u32 gBattleAnimSpritePal_WarmRock[] = INCBIN_U32("graphics/battle_anims/sprites/warm_rock.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_PunchImpact[] = INCBIN_U32("graphics/battle_anims/sprites/punch_impact.4bpp.lz");
+const u32 gBattleAnimSpritePal_PunchImpact[] = INCBIN_U32("graphics/battle_anims/sprites/punch_impact.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_BreakingEgg[] = INCBIN_U32("graphics/battle_anims/sprites/breaking_egg.4bpp.lz");
+const u32 gBattleAnimSpritePal_BreakingEgg[] = INCBIN_U32("graphics/battle_anims/sprites/breaking_egg.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_ThinRing[] = INCBIN_U32("graphics/battle_anims/sprites/thin_ring.4bpp.lz");
+const u32 gBattleAnimSpritePal_ThinRing[] = INCBIN_U32("graphics/battle_anims/sprites/thin_ring.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_MusicNotes2[] = INCBIN_U32("graphics/battle_anims/sprites/music_notes_2.4bpp.lz");
+const u32 gBattleAnimSpritePal_MusicNotes2[] = INCBIN_U32("graphics/battle_anims/sprites/music_notes_2.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Bell[] = INCBIN_U32("graphics/battle_anims/sprites/bell.4bpp.lz");
+const u32 gBattleAnimSpritePal_Bell[] = INCBIN_U32("graphics/battle_anims/sprites/bell.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_SpeedDust[] = INCBIN_U32("graphics/battle_anims/sprites/speed_dust.4bpp.lz");
+const u32 gBattleAnimSpritePal_SpeedDust[] = INCBIN_U32("graphics/battle_anims/sprites/speed_dust.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_TornMetal[] = INCBIN_U32("graphics/battle_anims/sprites/torn_metal.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_ThoughtBubble[] = INCBIN_U32("graphics/battle_anims/sprites/thought_bubble.4bpp.lz");
+const u32 gBattleAnimSpritePal_ThoughtBubble[] = INCBIN_U32("graphics/battle_anims/sprites/thought_bubble.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Finger[] = INCBIN_U32("graphics/battle_anims/sprites/finger.4bpp.lz");
+const u32 gBattleAnimSpritePal_Finger[] = INCBIN_U32("graphics/battle_anims/sprites/finger.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_MagentaHeart[] = INCBIN_U32("graphics/battle_anims/sprites/magenta_heart.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_PinkHeart[] = INCBIN_U32("graphics/battle_anims/sprites/pink_heart.gbapal.lz");
+const u32 gBattleAnimSpritePal_MagentaHeart[] = INCBIN_U32("graphics/battle_anims/sprites/magenta_heart.gbapal.lz");
+const u32 gBattleAnimSpritePal_RedHeart[] = INCBIN_U32("graphics/battle_anims/sprites/red_heart.gbapal.lz");
+
+const u32 gBattleAnimBg_AttractGfx[] = INCBIN_U32("graphics/battle_anims/backgrounds/attract.4bpp.lz");
+const u32 gBattleAnimBg_AttractPal[] = INCBIN_U32("graphics/battle_anims/backgrounds/attract.gbapal.lz");
+const u32 gBattleAnimBg_AttractTilemap[] = INCBIN_U32("graphics/battle_anims/backgrounds/attract.bin.lz");
+
+const u32 gBattleAnimSpriteGfx_RedOrb[] = INCBIN_U32("graphics/battle_anims/sprites/red_orb.4bpp.lz");
+const u32 gBattleAnimSpritePal_RedOrb[] = INCBIN_U32("graphics/battle_anims/sprites/red_orb.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_CircleOfLight[] = INCBIN_U32("graphics/battle_anims/sprites/circle_of_light.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_ElectricOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/electric_orbs.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Electricity[] = INCBIN_U32("graphics/battle_anims/sprites/electricity.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_ElectricOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/electric_orbs.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Finger2[] = INCBIN_U32("graphics/battle_anims/sprites/finger_2.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_MovementWaves[] = INCBIN_U32("graphics/battle_anims/sprites/movement_waves.4bpp.lz");
+const u32 gBattleAnimSpritePal_MovementWaves[] = INCBIN_U32("graphics/battle_anims/sprites/movement_waves.gbapal.lz");
+
+const u32 gBattleAnim_ScaryFacePal[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face.gbapal.lz");
+const u32 gBattleAnim_ScaryFaceGfx[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_EyeSparkle[] = INCBIN_U32("graphics/battle_anims/sprites/eye_sparkle.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_EyeSparkle[] = INCBIN_U32("graphics/battle_anims/sprites/eye_sparkle.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_Anger[] = INCBIN_U32("graphics/battle_anims/sprites/anger.4bpp.lz");
+const u32 gBattleAnimSpritePal_Anger[] = INCBIN_U32("graphics/battle_anims/sprites/anger.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Conversion[] = INCBIN_U32("graphics/battle_anims/sprites/conversion.4bpp.lz");
+const u32 gBattleAnimSpritePal_Conversion[] = INCBIN_U32("graphics/battle_anims/sprites/conversion.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_Angel[] = INCBIN_U32("graphics/battle_anims/sprites/angel.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_Angel[] = INCBIN_U32("graphics/battle_anims/sprites/angel.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_Devil[] = INCBIN_U32("graphics/battle_anims/sprites/devil.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_Devil[] = INCBIN_U32("graphics/battle_anims/sprites/devil.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_Swipe[] = INCBIN_U32("graphics/battle_anims/sprites/swipe.4bpp.lz");
+const u32 gBattleAnimSpritePal_Swipe[] = INCBIN_U32("graphics/battle_anims/sprites/swipe.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_Roots[] = INCBIN_U32("graphics/battle_anims/sprites/roots.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_Roots[] = INCBIN_U32("graphics/battle_anims/sprites/roots.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_ItemBag[] = INCBIN_U32("graphics/battle_anims/sprites/item_bag.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_ItemBag[] = INCBIN_U32("graphics/battle_anims/sprites/item_bag.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_TriForceTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/tri_attack_triangle.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_TriForceTriangle[] = INCBIN_U32("graphics/battle_anims/sprites/tri_attack_triangle.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_LetterZ[] = INCBIN_U32("graphics/battle_anims/sprites/letter_z.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_LetterZ[] = INCBIN_U32("graphics/battle_anims/sprites/letter_z.4bpp.lz");
+
+const u32 gBattleAnimBgPalette_Impact[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact.gbapal.lz");
+const u32 gBattleAnimBgImage_Impact[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact.4bpp.lz");
+const u32 gBattleAnimBgTilemap_ImpactOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_opponent.bin.lz");
+
+const u32 gBattleAnimBgTilemap_ImpactPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_player.bin.lz");
+const u32 gBattleAnimBgTilemap_ImpactContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/impact_contests.bin.lz");
+
+const u32 gBattleAnimSpriteGfx_JaggedMusicNote[] = INCBIN_U32("graphics/battle_anims/sprites/jagged_music_note.4bpp.lz");
+const u32 gBattleAnimSpritePal_JaggedMusicNote[] = INCBIN_U32("graphics/battle_anims/sprites/jagged_music_note.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Spotlight[] = INCBIN_U32("graphics/battle_anims/sprites/spotlight.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_Pokeball[] = INCBIN_U32("graphics/battle_anims/sprites/pokeball.4bpp.lz");
+const u32 gBattleAnimSpritePal_Pokeball[] = INCBIN_U32("graphics/battle_anims/sprites/pokeball.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_RapidSpin[] = INCBIN_U32("graphics/battle_anims/sprites/rapid_spin.4bpp.lz");
+const u32 gBattleAnimSpritePal_RapidSpin[] = INCBIN_U32("graphics/battle_anims/sprites/rapid_spin.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_MilkBottle[] = INCBIN_U32("graphics/battle_anims/sprites/milk_bottle.4bpp.lz");
+const u32 gBattleAnimSpritePal_MilkBottle[] = INCBIN_U32("graphics/battle_anims/sprites/milk_bottle.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_WispFire[] = INCBIN_U32("graphics/battle_anims/sprites/wisp_fire.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_WispOrb[] = INCBIN_U32("graphics/battle_anims/sprites/wisp_orb.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_WispOrb[] = INCBIN_U32("graphics/battle_anims/sprites/wisp_orb.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_GoldStars[] = INCBIN_U32("graphics/battle_anims/sprites/gold_stars.4bpp.lz");
+const u32 gBattleAnimSpritePal_GoldStars[] = INCBIN_U32("graphics/battle_anims/sprites/gold_stars.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_EclipsingOrb[] = INCBIN_U32("graphics/battle_anims/sprites/eclipsing_orb.4bpp.lz");
+const u32 gBattleAnimSpritePal_EclipsingOrb[] = INCBIN_U32("graphics/battle_anims/sprites/eclipsing_orb.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_PinkPetal[] = INCBIN_U32("graphics/battle_anims/sprites/pink_petal.4bpp.lz");
+const u32 gBattleAnimSpritePal_PinkPetal[] = INCBIN_U32("graphics/battle_anims/sprites/pink_petal.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_GrayOrb[] = INCBIN_U32("graphics/battle_anims/sprites/gray_orb.4bpp.lz");
+const u32 gBattleAnimSpritePal_GrayOrb[] = INCBIN_U32("graphics/battle_anims/sprites/gray_orb.gbapal.lz");
+
+const u32 gBattleAnimSpritePal_BlueOrb[] = INCBIN_U32("graphics/battle_anims/sprites/blue_orb.gbapal.lz");
+const u32 gBattleAnimSpritePal_RedOrb2[] = INCBIN_U32("graphics/battle_anims/sprites/red_orb_2.gbapal.lz");
+
+const u32 gBattleAnimBgImage_Drill[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill.4bpp.lz");
+const u32 gBattleAnimBgPalette_Drill[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill.gbapal.lz");
+
+const u32 gBattleAnimBgPalette_Sky[] = INCBIN_U32("graphics/battle_anims/backgrounds/sky.gbapal.lz");
+
+const u32 gBattleAnimBgTilemap_Drill[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill.bin.lz");
+const u32 gBattleAnimBgTilemap_DrillContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/drill_contests.bin.lz");
+
+const u32 gBattleAnimBgImage_Aurora[] = INCBIN_U32("graphics/battle_anims/backgrounds/aurora.4bpp.lz");
+const u32 gBattleAnimBgPalette_Aurora[] = INCBIN_U32("graphics/battle_anims/backgrounds/aurora.gbapal.lz");
+const u32 gBattleAnimBgTilemap_Aurora[] = INCBIN_U32("graphics/battle_anims/backgrounds/aurora.bin.lz");
+
+const u32 gBattleAnimBgTilemap_HighspeedOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed_opponent.bin.lz");
+const u32 gBattleAnimBgPalette_Highspeed[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed.gbapal.lz");
+
+const u32 gBattleAnimBgPalette_Bug[] = INCBIN_U32("graphics/battle_anims/backgrounds/bug.gbapal.lz");
+
+const u32 gBattleAnimBgImage_Highspeed[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed.4bpp.lz");
+const u32 gBattleAnimBgTilemap_HighspeedPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/highspeed_player.bin.lz");
+
+const u32 gBattleAnim_MorningSunGfx[] = INCBIN_U32("graphics/battle_anims/masks/light_beam.4bpp.lz");
+const u32 gBattleAnim_MorningSunPal[] = INCBIN_U32("graphics/battle_anims/masks/light_beam.gbapal.lz");
+const u32 gBattleAnim_MorningSunTilemap[] = INCBIN_U32("graphics/battle_anims/masks/light_beam.bin.lz");
+
+const u32 gBattleAnimBgTilemap_GuillotineOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_opponent.bin.lz");
+const u32 gBattleAnimBgTilemap_GuillotinePlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_player.bin.lz");
+const u32 gBattleAnimBgTilemap_GuillotineContests[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine_contests.bin.lz");
+
+const u32 gBattleAnimBgImage_Guillotine[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine.4bpp.lz");
+const u32 gBattleAnimBgPalette_Guillotine[] = INCBIN_U32("graphics/battle_anims/backgrounds/guillotine.gbapal.lz");
+
+const u32 gBattleAnimBgImage_Thunder[] = INCBIN_U32("graphics/battle_anims/backgrounds/thunder.4bpp.lz");
+const u32 gBattleAnimBgPalette_Thunder[] = INCBIN_U32("graphics/battle_anims/backgrounds/thunder.gbapal.lz");
+const u32 gBattleAnimBgTilemap_Thunder[] = INCBIN_U32("graphics/battle_anims/backgrounds/thunder.bin.lz");
+
+const u32 gBattleAnimSpriteGfx_PainSplit[] = INCBIN_U32("graphics/battle_anims/sprites/pain_split.4bpp.lz");
+const u32 gBattleAnimSpritePal_PainSplit[] = INCBIN_U32("graphics/battle_anims/sprites/pain_split.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_HandsAndFeet[] = INCBIN_U32("graphics/battle_anims/sprites/hands_and_feet.4bpp.lz");
+const u32 gBattleAnimSpritePal_HandsAndFeet[] = INCBIN_U32("graphics/battle_anims/sprites/hands_and_feet.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Confetti[] = INCBIN_U32("graphics/battle_anims/sprites/confetti.4bpp.lz");
+const u32 gBattleAnimSpritePal_Confetti[] = INCBIN_U32("graphics/battle_anims/sprites/confetti.gbapal.lz");
+
+const u32 gSubstituteDollPal[] = INCBIN_U32("graphics/battle_anims/sprites/substitute.gbapal.lz");
+const u32 gSubstituteDollGfx[] = INCBIN_U32("graphics/battle_anims/sprites/substitute.4bpp.lz");
+const u32 gSubstituteDollTilemap[] = INCBIN_U32("graphics/battle_anims/sprites/substitute.bin.lz");
+
+const u32 gBattleAnimSpriteGfx_GreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/green_star.4bpp.lz");
+const u32 gBattleAnimSpritePal_GreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/green_star.gbapal.lz");
+
+const u32 gFile_graphics_misc_confetti_sheet[] = INCBIN_U32("graphics/misc/confetti.4bpp.lz");
+const u32 gFile_graphics_misc_confetti_palette[] = INCBIN_U32("graphics/misc/confetti.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_PinkCloud[] = INCBIN_U32("graphics/battle_anims/sprites/pink_cloud.4bpp.lz");
+const u32 gBattleAnimSpritePal_PinkCloud[] = INCBIN_U32("graphics/battle_anims/sprites/pink_cloud.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_SweatDrop[] = INCBIN_U32("graphics/battle_anims/sprites/sweat_drop.4bpp.lz");
+const u32 gBattleAnimSpritePal_SweatDrop[] = INCBIN_U32("graphics/battle_anims/sprites/sweat_drop.gbapal.lz");
+
+const u32 gBattleStatMask_Gfx[] = INCBIN_U32("graphics/battle_anims/masks/stat.4bpp.lz");
+const u32 gBattleStatMask1_Tilemap[] = INCBIN_U32("graphics/battle_anims/masks/stat_tilemap_1.bin.lz");
+const u32 gBattleStatMask2_Tilemap[] = INCBIN_U32("graphics/battle_anims/masks/stat_tilemap_2.bin.lz");
+
+const u32 gBattleStatMask1_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat1.gbapal.lz");
+const u32 gBattleStatMask2_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat2.gbapal.lz");
+const u32 gBattleStatMask3_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat3.gbapal.lz");
+const u32 gBattleStatMask4_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat4.gbapal.lz");
+const u32 gBattleStatMask5_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat5.gbapal.lz");
+const u32 gBattleStatMask6_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat6.gbapal.lz");
+const u32 gBattleStatMask7_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat7.gbapal.lz");
+const u32 gBattleStatMask8_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat8.gbapal.lz");
+
+const u32 gCureBubblesGfx[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.4bpp.lz");
+const u32 gCureBubblesPal[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.gbapal.lz");
+const u32 gCureBubblesTilemap[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.bin.lz");
+
+const u32 gBattleAnimSpritePal_PurpleScratch[] = INCBIN_U32("graphics/battle_anims/sprites/purple_scratch.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_PurpleScratch[] = INCBIN_U32("graphics/battle_anims/sprites/purple_scratch.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_PurpleSwipe[] = INCBIN_U32("graphics/battle_anims/sprites/purple_swipe.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_GuardRing[] = INCBIN_U32("graphics/battle_anims/sprites/guard_ring.4bpp.lz");
+const u32 gBattleAnimSpritePal_GuardRing[] = INCBIN_U32("graphics/battle_anims/sprites/guard_ring.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_TagHand[] = INCBIN_U32("graphics/battle_anims/sprites/tag_hand.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_NoiseLine[] = INCBIN_U32("graphics/battle_anims/sprites/noise_line.4bpp.lz");
+
+const u32 gUnknown_D2EC24_Gfx[] = INCBIN_U32("graphics/battle_anims/masks/unknown_D2EC24.4bpp.lz");
+const u32 gUnknown_D2EC24_Tilemap[] = INCBIN_U32("graphics/battle_anims/masks/unknown_D2EC24.bin.lz");
+
+const u32 gBattleAnimSpriteGfx_SmallRedEye[] = INCBIN_U32("graphics/battle_anims/sprites/small_red_eye.4bpp.lz");
+const u32 gBattleAnimSpritePal_SmallRedEye[] = INCBIN_U32("graphics/battle_anims/sprites/small_red_eye.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_HollowOrb[] = INCBIN_U32("graphics/battle_anims/sprites/hollow_orb.4bpp.lz");
+const u32 gBattleAnimSpritePal_HollowOrb[] = INCBIN_U32("graphics/battle_anims/sprites/hollow_orb.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_XSign[] = INCBIN_U32("graphics/battle_anims/sprites/x_sign.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_BluegreenOrb[] = INCBIN_U32("graphics/battle_anims/sprites/bluegreen_orb.4bpp.lz");
+const u32 gBattleAnimSpritePal_BluegreenOrb[] = INCBIN_U32("graphics/battle_anims/sprites/bluegreen_orb.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_PawPrint[] = INCBIN_U32("graphics/battle_anims/sprites/paw_print.4bpp.lz");
+const u32 gBattleAnimSpritePal_PawPrint[] = INCBIN_U32("graphics/battle_anims/sprites/paw_print.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_PurpleFlame[] = INCBIN_U32("graphics/battle_anims/sprites/purple_flame.4bpp.lz");
+const u32 gBattleAnimSpritePal_PurpleFlame[] = INCBIN_U32("graphics/battle_anims/sprites/purple_flame.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_RedBall[] = INCBIN_U32("graphics/battle_anims/sprites/red_ball.4bpp.lz");
+const u32 gBattleAnimSpritePal_RedBall[] = INCBIN_U32("graphics/battle_anims/sprites/red_ball.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_SmellingsaltEffect[] = INCBIN_U32("graphics/battle_anims/sprites/smellingsalt_effect.4bpp.lz");
+const u32 gBattleAnimSpritePal_SmellingsaltEffect[] = INCBIN_U32("graphics/battle_anims/sprites/smellingsalt_effect.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_MagnifyingGlass[] = INCBIN_U32("graphics/battle_anims/sprites/magnifying_glass.4bpp.lz");
+const u32 gBattleAnimSpritePal_MagnifyingGlass[] = INCBIN_U32("graphics/battle_anims/sprites/magnifying_glass.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Meteor[] = INCBIN_U32("graphics/battle_anims/sprites/meteor.4bpp.lz");
+const u32 gBattleAnimSpritePal_Meteor[] = INCBIN_U32("graphics/battle_anims/sprites/meteor.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_FlatRock[] = INCBIN_U32("graphics/battle_anims/sprites/flat_rock.4bpp.lz");
+const u32 gBattleAnimSpritePal_FlatRock[] = INCBIN_U32("graphics/battle_anims/sprites/flat_rock.gbapal.lz");
+
+const u16 gUnknown_8D2FBB4[] = INCBIN_U16("graphics/interface/unk_8D2FBB4.gbapal");
+
+#include "data/graphics/pokemon.h"
+#include "data/graphics/trainers.h"
+
+const u8 gMonIcon_QuestionMark[] = INCBIN_U8("graphics/pokemon/question_mark/icon.4bpp");
+const u8 gMonFootprint_QuestionMark[] = INCBIN_U8("graphics/pokemon/question_mark/footprint.1bpp");
+
+const u32 gFile_graphics_battle_transitions_vs_frame_sheet[] = INCBIN_U32("graphics/battle_transitions/vs_frame.4bpp.lz");
+const u32 gFile_graphics_battle_transitions_vs_frame_tilemap[] = INCBIN_U32("graphics/battle_transitions/vs_frame.bin.lz");
+const u32 gFile_graphics_battle_transitions_vs_frame_palette[] = INCBIN_U32("graphics/battle_transitions/vs_frame.gbapal.lz");
+
+const u32 gVsLettersGfx[] = INCBIN_U32("graphics/battle_transitions/vs.4bpp.lz");
+
+#include "data/graphics/battle_terrain.h"
+
+const u32 gBattleAnimSpriteGfx_FlyingDirt[] = INCBIN_U32("graphics/battle_anims/sprites/flying_dirt.4bpp.lz");
+
+const u32 gFile_graphics_battle_anims_backgrounds_sandstorm_brew_tilemap[] = INCBIN_U32("graphics/battle_anims/backgrounds/sandstorm_brew.bin.lz");
+const u32 gFile_graphics_battle_anims_backgrounds_sandstorm_brew_sheet[] = INCBIN_U32("graphics/battle_anims/backgrounds/sandstorm_brew.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_FlyingDirt[] = INCBIN_U32("graphics/battle_anims/sprites/flying_dirt.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_MetalSoundWaves[] = INCBIN_U32("graphics/battle_anims/sprites/metal_sound_waves.4bpp.lz");
+const u32 gBattleAnimSpritePal_MetalSoundWaves[] = INCBIN_U32("graphics/battle_anims/sprites/metal_sound_waves.gbapal.lz");
+
+const u32 gBattleAnimBgImage_Ice[] = INCBIN_U32("graphics/battle_anims/backgrounds/ice.4bpp.lz");
+const u32 gBattleAnimBgPalette_Ice[] = INCBIN_U32("graphics/battle_anims/backgrounds/ice.gbapal.lz");
+const u32 gBattleAnimBgTilemap_Ice[] = INCBIN_U32("graphics/battle_anims/backgrounds/ice.bin.lz");
+
+const u32 gBattleAnimSpriteGfx_IcicleSpear[] = INCBIN_U32("graphics/battle_anims/sprites/icicle_spear.4bpp.lz");
+const u32 gBattleAnimSpritePal_IcicleSpear[] = INCBIN_U32("graphics/battle_anims/sprites/icicle_spear.gbapal.lz");
+
+const u32 gContestNextTurnGfx[] = INCBIN_U32("graphics/contest/next_turn.4bpp.lz");
+const u8 gFile_graphics_contest_nextturn_numbers[] = INCBIN_U8("graphics/contest/next_turn_numbers.4bpp");
+const u8 gFile_graphics_contest_nextturn_random[] = INCBIN_U8("graphics/contest/next_turn_random.4bpp");
+
+const u32 gBattleAnimSpriteGfx_GlowyRedOrb[] = INCBIN_U32("graphics/battle_anims/sprites/glowy_red_orb.4bpp.lz");
+const u32 gBattleAnimSpritePal_GlowyRedOrb[] = INCBIN_U32("graphics/battle_anims/sprites/glowy_red_orb.gbapal.lz");
+const u32 gBattleAnimSpritePal_GlowyGreenOrb[] = INCBIN_U32("graphics/battle_anims/sprites/glowy_green_orb.gbapal.lz");
+const u32 gBattleAnimSpritePal_SleepPowder[] = INCBIN_U32("graphics/battle_anims/sprites/sleep_powder.gbapal.lz");
+const u32 gBattleAnimSpritePal_StunSpore[] = INCBIN_U32("graphics/battle_anims/sprites/stun_spore.gbapal.lz");
+
+const u32 gContestApplauseGfx[] = INCBIN_U32("graphics/contest/applause.4bpp.lz");
+const u8 gFile_graphics_contest_applause_meter[] = INCBIN_U8("graphics/contest/applause_meter.4bpp");
+
+const u16 gFile_graphics_contest_nextturn[] = INCBIN_U16("graphics/contest/next_turn.gbapal");
+
+const u32 gBattleAnimSpriteGfx_Splash[] = INCBIN_U32("graphics/battle_anims/sprites/splash.4bpp.lz");
+const u32 gBattleAnimSpritePal_Splash[] = INCBIN_U32("graphics/battle_anims/sprites/splash.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_SweatBead[] = INCBIN_U32("graphics/battle_anims/sprites/sweat_bead.4bpp.lz");
+
+const u32 gBattleAnimSpriteGfx_Pokeblock[] = INCBIN_U32("graphics/battle_anims/sprites/pokeblock.4bpp.lz");
+const u32 gBattleAnimSpritePal_Pokeblock[] = INCBIN_U32("graphics/battle_anims/sprites/pokeblock.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Gem1[] = INCBIN_U32("graphics/battle_anims/sprites/gem_1.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Gem2[] = INCBIN_U32("graphics/battle_anims/sprites/gem_2.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Gem3[] = INCBIN_U32("graphics/battle_anims/sprites/gem_3.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_Gem1[] = INCBIN_U32("graphics/battle_anims/sprites/gem_1.gbapal.lz");
+
+const u32 gBattleAnimBgImage_InAir[] = INCBIN_U32("graphics/battle_anims/backgrounds/in_air.4bpp.lz");
+const u32 gBattleAnimBgPalette_InAir[] = INCBIN_U32("graphics/battle_anims/backgrounds/in_air.gbapal.lz");
+const u32 gBattleAnimBgTilemap_InAir[] = INCBIN_U32("graphics/battle_anims/backgrounds/in_air.bin.lz");
+
+const u32 gBattleAnimSpriteGfx_Protect[] = INCBIN_U32("graphics/battle_anims/sprites/protect.4bpp.lz");
+const u32 gBattleAnimSpritePal_Protect[] = INCBIN_U32("graphics/battle_anims/sprites/protect.gbapal.lz");
+
+const u32 gFile_graphics_battle_anims_backgrounds_water_muddy_palette[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_muddy.gbapal.lz");
+
+const u32 gFile_graphics_battle_interface_enemy_mon_shadow_sheet[] = INCBIN_U32("graphics/battle_interface/enemy_mon_shadow.4bpp.lz");
+
+const u32 gFile_graphics_battle_interface_ball_status_bar_sheet[] = INCBIN_U32("graphics/battle_interface/ball_status_bar.4bpp.lz");
+
+const u8 gMonIcon_Egg[] = INCBIN_U8("graphics/pokemon/egg/icon.4bpp");
+
+const u32 gBattleAnimBgImage_Ghost[] = INCBIN_U32("graphics/battle_anims/backgrounds/ghost.4bpp.lz");
+const u32 gBattleAnimBgPalette_Ghost[] = INCBIN_U32("graphics/battle_anims/backgrounds/ghost.gbapal.lz");
+const u32 gBattleAnimBgTilemap_Ghost[] = INCBIN_U32("graphics/battle_anims/backgrounds/ghost.bin.lz");
+
+const u32 gBattleAnimSpritePal_WhipHit[] = INCBIN_U32("graphics/battle_anims/sprites/whip_hit.gbapal.lz");
+
+const u32 gBattleAnimBgPalette_Solarbeam[] = INCBIN_U32("graphics/battle_anims/backgrounds/solarbeam.gbapal.lz");
+
+const u32 gFile_graphics_unknown_unknown_E7CFB0_tilemap[] = INCBIN_U32("graphics/unknown/unknown_E7CFB0.bin.lz");
+
+const u32 gFile_graphics_berry_blender_center_sheet[] = INCBIN_U32("graphics/berry_blender/center.8bpp.lz");
+
+const u32 gFile_graphics_berry_blender_outer_sheet[] = INCBIN_U32("graphics/berry_blender/outer.4bpp.lz");
+const u32 gFile_graphics_berry_blender_outer_map_tilemap[] = INCBIN_U32("graphics/berry_blender/outer_map.bin.lz");
+
+const u32 gBattleAnimBgPalette_Cosmic[] = INCBIN_U32("graphics/battle_anims/backgrounds/cosmic.gbapal.lz");
+const u32 gBattleAnimBgImage_Cosmic[] = INCBIN_U32("graphics/battle_anims/backgrounds/cosmic.4bpp.lz");
+const u32 gBattleAnimBgTilemap_Cosmic[] = INCBIN_U32("graphics/battle_anims/backgrounds/cosmic.bin.lz");
+
+const u32 gBattleAnimSpritePal_SlamHit2[] = INCBIN_U32("graphics/battle_anims/sprites/slam_hit_2.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_SlamHit2[] = INCBIN_U32("graphics/battle_anims/sprites/slam_hit_2.4bpp.lz");
+
+const u32 gBattleAnimFogTilemap[] = INCBIN_U32("graphics/battle_anims/backgrounds/fog.bin.lz");
+
+const u32 gBattleAnimSpritePal_WeatherBall[] = INCBIN_U32("graphics/battle_anims/sprites/weather_ball.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_WeatherBall[] = INCBIN_U32("graphics/battle_anims/sprites/weather_ball.4bpp.lz");
+
+const u32 gBattleAnimBgTilemap_ScaryFacePlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_player.bin.lz");
+const u32 gBattleAnimBgTilemap_ScaryFaceOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_opponent.bin.lz");
+const u32 gBattleAnimBgTilemap_ScaryFaceContest[] = INCBIN_U32("graphics/battle_anims/backgrounds/scary_face_contest.bin.lz");
+
+const u32 gBattleAnimSpriteGfx_Hail[] = INCBIN_U32("graphics/battle_anims/sprites/hail.4bpp.lz");
+const u32 gBattleAnimSpritePal_Hail[] = INCBIN_U32("graphics/battle_anims/sprites/hail.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_GreenSpike[] = INCBIN_U32("graphics/battle_anims/sprites/green_spike.4bpp.lz");
+const u32 gBattleAnimSpritePal_GreenSpike[] = INCBIN_U32("graphics/battle_anims/sprites/green_spike.gbapal.lz");
+const u32 gBattleAnimSpritePal_WhiteCircleOfLight[] = INCBIN_U32("graphics/battle_anims/sprites/white_circle_of_light.gbapal.lz");
+const u32 gBattleAnimSpritePal_GlowyBlueOrb[] = INCBIN_U32("graphics/battle_anims/sprites/glowy_blue_orb.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_Recycle[] = INCBIN_U32("graphics/battle_anims/sprites/recycle.4bpp.lz");
+const u32 gBattleAnimSpritePal_Recycle[] = INCBIN_U32("graphics/battle_anims/sprites/recycle.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_RedParticles[] = INCBIN_U32("graphics/battle_anims/sprites/red_particles.4bpp.lz");
+const u32 gBattleAnimSpritePal_RedParticles[] = INCBIN_U32("graphics/battle_anims/sprites/red_particles.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_DirtMound[] = INCBIN_U32("graphics/battle_anims/sprites/dirt_mound.4bpp.lz");
+const u32 gBattleAnimSpritePal_DirtMound[] = INCBIN_U32("graphics/battle_anims/sprites/dirt_mound.gbapal.lz");
+
+const u32 gBattleAnimBgImage_Fissure[] = INCBIN_U32("graphics/battle_anims/backgrounds/fissure.4bpp.lz");
+const u32 gBattleAnimBgPalette_Fissure[] = INCBIN_U32("graphics/battle_anims/backgrounds/fissure.gbapal.lz");
+const u32 gBattleAnimBgTilemap_Fissure[] = INCBIN_U32("graphics/battle_anims/backgrounds/fissure.bin.lz");
+
+const u32 gBattleAnimSpriteGfx_Bird[] = INCBIN_U32("graphics/battle_anims/sprites/bird.4bpp.lz");
+const u32 gBattleAnimSpritePal_Bird[] = INCBIN_U32("graphics/battle_anims/sprites/bird.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_CrossImpact[] = INCBIN_U32("graphics/battle_anims/sprites/cross_impact.4bpp.lz");
+const u32 gBattleAnimSpritePal_CrossImpact[] = INCBIN_U32("graphics/battle_anims/sprites/cross_impact.gbapal.lz");
+
+const u32 gFile_graphics_battle_anims_backgrounds_water_sheet[] = INCBIN_U32("graphics/battle_anims/backgrounds/water.4bpp.lz");
+const u32 gFile_graphics_battle_anims_backgrounds_water_palette[] = INCBIN_U32("graphics/battle_anims/backgrounds/water.gbapal.lz");
+const u32 gFile_graphics_unknown_unknown_E81D14_tilemap[] = INCBIN_U32("graphics/unknown/unknown_E81D14.bin.lz");
+const u32 gFile_graphics_unknown_unknown_E81FE4_tilemap[] = INCBIN_U32("graphics/unknown/unknown_E81FE4.bin.lz");
+const u32 gFile_graphics_unknown_unknown_E822B8_tilemap[] = INCBIN_U32("graphics/unknown/unknown_E822B8.bin.lz");
+
+const u32 gBattleAnimSpritePal_Slash2[] = INCBIN_U32("graphics/battle_anims/sprites/slash_2.gbapal.lz");
+
+const u32 gBattleAnimSpriteGfx_WhiteShadow[] = INCBIN_U32("graphics/battle_anims/sprites/white_shadow.4bpp.lz");
+const u32 gBattleAnimSpritePal_WhiteShadow[] = INCBIN_U32("graphics/battle_anims/sprites/white_shadow.gbapal.lz");
+
+const u32 gPartyMenuBg_Gfx[] = INCBIN_U32("graphics/interface/party_menu_misc.4bpp.lz");
+const u32 gPartyMenuBg_Pal[] = INCBIN_U32("graphics/interface/party_menu_misc.gbapal.lz");
+const u32 gPartyMenuBg_Tilemap[] = INCBIN_U32("graphics/interface/party_menu_misc.bin.lz");
+
+const u32 gPartyMenuPokeball_Gfx[] = INCBIN_U32("graphics/interface/party_menu_pokeball.4bpp.lz");
+const u32 gPartyMenuPokeballSmall_Gfx[] = INCBIN_U32("graphics/interface/party_menu_pokeball_small.4bpp.lz"); //unused
+const u32 gPartyMenuPokeball_Pal[] = INCBIN_U32("graphics/interface/party_menu_pokeball.gbapal.lz");
+
+const u32 gStatusGfx_Icons[] = INCBIN_U32("graphics/interface/status_icons.4bpp.lz");
+const u32 gStatusPal_Icons[] = INCBIN_U32("graphics/interface/status_icons.gbapal.lz");
+
+const u32 gUnknown_8E830CC[] = INCBIN_U32("graphics/item_menu/bag_tiles.4bpp.lz");
+
+const u32 gUnknown_8E832C0[] = INCBIN_U32("graphics/item_menu/bag_tilemap1.bin.lz"); // bag menu
+const u32 gUnknown_8E83444[] = INCBIN_U32("graphics/item_menu/bag_tilemap2.bin.lz"); // PC deposit items
+
+const u32 gBagBgPalette[] = INCBIN_U32("graphics/item_menu/bag_pal1.gbapal.lz"); // palette 1 (Boy + misc Pal)
+const u32 gBagBgPalette_FemaleOverride[] = INCBIN_U32("graphics/item_menu/bag_pal2.gbapal.lz"); // palette 2 (Girl)
+
+const u32 gUnknown_8E8362C[] = INCBIN_U32("graphics/interface/unk_8E8362C.4bpp.lz");
+const u32 gUnknown_8E83DBC[] = INCBIN_U32("graphics/interface/unk_8E83DBC.4bpp.lz");
+const u32 gUnknown_8E84560[] = INCBIN_U32("graphics/interface/unk_8E84560.gbapal.lz");
+
+const u32 gFile_graphics_interface_bag_swap_sheet[] = INCBIN_U32("graphics/interface/bag_swap.4bpp.lz");
+const u32 gFile_graphics_interface_bag_swap_palette[] = INCBIN_U32("graphics/interface/bag_swap.gbapal.lz");
+
+const u32 gUnknown_8E845D8[] = INCBIN_U32("graphics/tm_case/unk_8E845D8.4bpp.lz");
+const u32 gUnknown_8E84A24[] = INCBIN_U32("graphics/tm_case/unk_8E84A24.bin.lz");
+const u32 gUnknown_8E84B70[] = INCBIN_U32("graphics/tm_case/unk_8E84B70.bin.lz");
+const u32 gUnknown_8E84CB0[] = INCBIN_U32("graphics/tm_case/unk_8E84CB0.gbapal.lz");
+const u32 gUnknown_8E84D20[] = INCBIN_U32("graphics/tm_case/unk_8E84D20.gbapal.lz");
+const u32 gTMCase_TMSpriteGfx[] = INCBIN_U32("graphics/tm_case/unk_8E84D90.4bpp.lz");
+const u32 gUnknown_8E84F20[] = INCBIN_U32("graphics/tm_case/unk_8E84F20.gbapal.lz");
+const u32 gUnknown_8E85068[] = INCBIN_U32("graphics/tm_case/unk_8E85068.gbapal.lz");
+
+const u8 gItemPcTiles[] = INCBIN_U8("graphics/item_pc/unk_8E85090.4bpp.lz");
+const u32 gItemPcBgPals[] = INCBIN_U32("graphics/item_pc/unk_8E85408.gbapal.lz");
+const u8 gItemPcTilemap[] = INCBIN_U8("graphics/item_pc/unk_8E85458.bin.lz");
+
+const u32 gBerryPouchSpriteTiles[] = INCBIN_U32("graphics/berry_pouch/unk_8E8560C.4bpp.lz");
+const u8 gBerryPouchBgGfx[] = INCBIN_U8("graphics/berry_pouch/unk_8E859D0.4bpp.lz");
+const u32 gBerryPouchBgPals[] = INCBIN_U32("graphics/berry_pouch/unk_8E85BA4.gbapal.lz");
+const u32 gBerryPouchBgPal0FemaleOverride[] = INCBIN_U32("graphics/berry_pouch/unk_8E85BF4.gbapal.lz");
+const u32 gBerryPouchSpritePalette[] = INCBIN_U32("graphics/berry_pouch/unk_8E85C1C.gbapal.lz");
+const u8 gBerryPouchBg1Tilemap[] = INCBIN_U8("graphics/berry_pouch/unk_8E85C44.bin.lz");
+
+const u32 gBuyMenuFrame_Gfx[] = INCBIN_U32("graphics/shop_menu/shop_menu.4bpp.lz");
+const u32 gBuyMenuFrame_Tilemap[] = INCBIN_U32("graphics/shop_menu/shop_tilemap.bin");
+const u32 gBuyMenuFrame_TmHmTilemap[] = INCBIN_U32("graphics/shop_menu/shop_tm_hm_tilemap.bin");
+const u32 gBuyMenuFrame_Pal[] = INCBIN_U32("graphics/shop_menu/shop_menu.gbapal.lz");
+
+const u32 gUnknown_8E861A8[] = INCBIN_U32("graphics/unknown/unknown_E861A8.bin.lz");
+
+const u8 gUnknown_8E86240[] = INCBIN_U8("graphics/teachy_tv/tiles.4bpp.lz");
+const u8 gUnknown_8E86BE8[] = INCBIN_U8("graphics/teachy_tv/bg1_tilemap.bin.lz");
+const u8 gUnknown_8E86D6C[] = INCBIN_U8("graphics/teachy_tv/bg2_tilemap.bin.lz");
+const u32 gUnknown_8E86F98[] = INCBIN_U32("graphics/teachy_tv/palettes.gbapal.lz");
+
+const u32 gUnknown_8E87010[] = INCBIN_U32("graphics/unknown/unknown_E87010.gbapal.lz");
+
+#include "data/graphics/items.h"
+
+const u32 gBattleAnimSpritePal_Shock3[] = INCBIN_U32("graphics/battle_anims/sprites/shock_3.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_Shock3[] = INCBIN_U32("graphics/battle_anims/sprites/shock_3.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_WhiteFeather[] = INCBIN_U32("graphics/battle_anims/sprites/white_feather.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_WhiteFeather[] = INCBIN_U32("graphics/battle_anims/sprites/white_feather.4bpp.lz");
+
+const u32 gBattleAnimSpritePal_Sparkle6[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_6.gbapal.lz");
+const u32 gBattleAnimSpriteGfx_Sparkle6[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_6.4bpp.lz");
+
+const u32 gGhostPalette[] = INCBIN_U32("graphics/pokemon/ghost/front.gbapal.lz");
+const u32 gGhostFrontPic[] = INCBIN_U32("graphics/pokemon/ghost/front.4bpp.lz");
+
+#include "data/graphics/mail.h"
+
+const u16 gFireRedMenuElements1_Pal[] = INCBIN_U16("graphics/interface/dex_caught_pokeball.gbapal");
+const u16 gFireRedMenuElements2_Pal[] = INCBIN_U16("graphics/interface/pokemon_types.gbapal");
+const u8 gFireRedMenuElements_Gfx[] = INCBIN_U8("graphics/interface/dex_caught_pokeball_and_pokemon_types.4bpp");
+
+const u16 gUnknown_8E97DDC[] = INCBIN_U16("graphics/interface/learn_move.gbapal");
+const u32 gUnknown_8E97DFC[] = INCBIN_U32("graphics/interface/learn_move.4bpp.lz");
+const u32 gUnknown_8E97EC4[] = INCBIN_U32("graphics/interface/learn_move.bin.lz");
+
+const u16 gUnknown_8E97FE4[] = INCBIN_U16("graphics/interface/naming_screen_8E97FE4.gbapal");
+const u16 gUnknown_8E98004[] = INCBIN_U16("graphics/interface/naming_screen_8E98004.gbapal");
+const u16 gNamingScreenMenu_Pal[] = INCBIN_U16("graphics/interface/naming_screen_8E98024.gbapal");
+const u16 gUnknown_8E98044[] = INCBIN_U16("graphics/interface/naming_screen_8E98044.gbapal");
+const u16 gUnknown_8E98064[] = INCBIN_U16("graphics/interface/naming_screen_8E98064.gbapal");
+const u16 gUnknown_8E98084[] = INCBIN_U16("graphics/interface/naming_screen_8E98084.gbapal");
+const u16 gUnknown_8E980A4[] = INCBIN_U16("graphics/interface/naming_screen_8E980A4.gbapal");
+const u16 gUnknown_8E980C4[] = INCBIN_U16("graphics/interface/naming_screen_8E980C4.gbapal");
+
+const u32 gNamingScreenMenu_Gfx[] = INCBIN_U32("graphics/interface/naming_screen_menu.4bpp.lz");
+const u32 gUnknown_8E982BC[] = INCBIN_U32("graphics/interface/naming_screen_menu.bin.lz");
+const u32 gUnknown_8E98398[] = INCBIN_U32("graphics/interface/naming_screen_E98398.bin.lz");
+const u32 gUnknown_8E98458[] = INCBIN_U32("graphics/interface/naming_screen_E98458.bin.lz");
+const u32 gUnknown_8E98518[] = INCBIN_U32("graphics/interface/naming_screen_E98518.bin.lz");
+
+const u32 gUnknown_8E985D8[] = INCBIN_U32("graphics/interface/naming_screen_8E985D8.4bpp");
+const u32 gUnknown_8E98858[] = INCBIN_U32("graphics/interface/naming_screen_8E98858.4bpp");
+const u32 gUnknown_8E98A38[] = INCBIN_U32("graphics/interface/naming_screen_8E98A38.4bpp");
+const u32 gUnknown_8E98C18[] = INCBIN_U32("graphics/interface/naming_screen_8E98C18.4bpp");
+const u32 gUnknown_8E98CB8[] = INCBIN_U32("graphics/interface/naming_screen_8E98CB8.4bpp");
+const u32 gUnknown_8E98D58[] = INCBIN_U32("graphics/interface/naming_screen_8E98D58.4bpp");
+const u32 gUnknown_8E98DF8[] = INCBIN_U32("graphics/interface/naming_screen_8E98DF8.4bpp");
+const u32 gUnknown_8E98E98[] = INCBIN_U32("graphics/interface/naming_screen_8E98E98.4bpp");
+const u32 gUnknown_8E98F38[] = INCBIN_U32("graphics/interface/naming_screen_8E98F38.4bpp");
+const u32 gUnknown_8E98FD8[] = INCBIN_U32("graphics/interface/naming_screen_8E98FD8.4bpp");
+const u32 gUnknown_8E990D8[] = INCBIN_U32("graphics/interface/naming_screen_8E990D8.4bpp");
+const u32 gUnknown_8E990F8[] = INCBIN_U32("graphics/interface/naming_screen_8E990F8.4bpp");
+
+const u8 gUnknown_8E99118[] = INCBIN_U8("graphics/tm_case/unk_8E99118.4bpp");
+
+const u16 gKantoTrainerCard_Pal[] = INCBIN_U16("graphics/trainer_card/0star.gbapal");
+const u32 gKantoTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/card.4bpp.lz");
+const u16 gHoennTrainerCard_Pal[] = INCBIN_U16("graphics/trainer_card/0star_em.gbapal");
+const u32 gHoennTrainerCard_Gfx[] = INCBIN_U32("graphics/trainer_card/card_em.4bpp.lz");
+
+const u16 gEasyChatMode_Pal[] = INCBIN_U16("graphics/link_rfu/unk_8E99DAC.gbapal");
+const u32 gEasyChatWindow_Gfx[] = INCBIN_U32("graphics/link_rfu/unk_8E99DAC.4bpp.lz");
+const u32 gEasyChatWindow_Tilemap[] = INCBIN_U32("graphics/link_rfu/unk_8E99E74.bin.lz");
+
+const u16 gUnknown_8E99F24[] = INCBIN_U16("graphics/link_rfu/unk_8E9A168.gbapal");
+const u32 gEasyChatSelectGroupHelp_Tiles[] = INCBIN_U32("graphics/link_rfu/unk_8E99F44.4bpp.lz");
+const u32 gEasyChatModeIcons_Tiles[] = INCBIN_U32("graphics/link_rfu/unk_8E9A168.4bpp.lz");
+
+const u32 gUnknown_8E9A460[] = INCBIN_U32("graphics/interface/trainer_memo.4bpp.lz");
+const u32 gUnknown_8E9B310[] = INCBIN_U32("graphics/interface/trainer_memo_pal1.gbapal");
+const u32 gUnknown_8E9B3B0[] = INCBIN_U32("graphics/interface/trainer_memo_pal2.gbapal");
+const u32 gUnknown_8E9B3D0[] = INCBIN_U32("graphics/interface/trainer_memo_pal3.gbapal");
+
+const u32 gUnknown_8E9B3F0[] = INCBIN_U32("graphics/interface/summary_exp_bar.4bpp.lz");
+const u32 gUnknown_8E9B4B8[] = INCBIN_U32("graphics/interface/summary_hp_bar.4bpp.lz");
+const u16 gUnknown_8E9B578[] = INCBIN_U16("graphics/interface/summary_exp_bar.gbapal"); // hp bar uses this too
+
+const u32 gUnknown_8E9B598[] = INCBIN_U32("graphics/interface/trainer_memo.bin.lz");
+const u32 gUnknown_8E9B750[] = INCBIN_U32("graphics/interface/trainer_memo_2.bin.lz");
+const u32 gUnknown_8E9B950[] = INCBIN_U32("graphics/interface/trainer_memo_3.bin.lz");
+const u32 gUnknown_8E9BA9C[] = INCBIN_U32("graphics/interface/trainer_memo_4.bin.lz");
+const u32 gUnknown_8E9BBCC[] = INCBIN_U32("graphics/interface/trainer_memo_5.bin.lz");
+
+const u16 gUnknown_8E9BD08[] = INCBIN_U16("graphics/unknown/unknown_E9BD08.gbapal"); // might be an alternate unused palette of the link_rfu gfx below.
+
+const u32 gEasyChatRedRectangularCursor_Tiles[] = INCBIN_U32("graphics/interface/link_rfu_frame.4bpp.lz");
+const u16 gUnknown_8E9BF28[] = INCBIN_U16("graphics/interface/link_rfu_frame.gbapal");
+const u32 gUnknown_8E9BF48[] = INCBIN_U32("graphics/interface/link_rfu_status.4bpp.lz");
+
+const u16 gUnknown_8E9C14C[] = INCBIN_U16("graphics/interface/pokedex_abc.gbapal");
+const u32 gUnknown_8E9C16C[] = INCBIN_U32("graphics/interface/pokedex_abc.4bpp.lz");
+
+const u16 gUnknown_8E9C3D8[] = INCBIN_U16("graphics/interface/box_tiles_pal1.gbapal");
+const u16 gUnknown_8E9C3F8[] = INCBIN_U16("graphics/interface/box_tiles_pal2.gbapal");
+const u16 gUnknown_8E9C418[] = INCBIN_U16("graphics/interface/box_tiles_pal3.gbapal");
+const u32 gUnknown_8E9C438[] = INCBIN_U32("graphics/interface/box_tiles.4bpp.lz");
+
+const u32 gUnknown_8E9CAEC[] = INCBIN_U32("graphics/unknown/unknown_E9CAEC.bin.lz");
+
+const u16 gUnknown_8E9CB9C[] = INCBIN_U16("graphics/misc/markings2.gbapal");
+const u16 gUnknown_8E9CBBC[] = INCBIN_U16("graphics/misc/markings2.4bpp");
+
+const u16 gTradeMenu_Pal[] = INCBIN_U16("graphics/trade/menu.gbapal");
+const u16 gTradeButtons_Pal[] = INCBIN_U16("graphics/trade/unknown_DDB444.gbapal");
+const u16 gTradeMenu_Gfx[] = INCBIN_U16("graphics/trade/menu.4bpp");
+const u16 gTradeButtons_Gfx[] = INCBIN_U16("graphics/trade/buttons.4bpp");
+const u16 gUnknown_8E9E9DC[] = INCBIN_U16("graphics/unused/unused_DDCEE4.bin");
+const u16 gUnknown_8E9E9FC[] = INCBIN_U16("graphics/trade/unknown_DDCF04.bin");
+const u16 gTradeMenuMonBox_Tilemap[] = INCBIN_U16("graphics/trade/menu_mon_box.bin");
+
+const u16 gFameCheckerBgPals[] = INCBIN_U16("data/graphics/fame_checker_bg.gbapal");
+const u16 gFameCheckerBgTiles[] = INCBIN_U16("data/graphics/fame_checker_bg.4bpp");
+const u16 gFameCheckerBg3Tilemap[] = INCBIN_U16("data/graphics/fame_checker_tilemap3.bin");
+const u16 gFameCheckerBg2Tilemap[] = INCBIN_U16("data/graphics/fame_checker_tilemap2.bin");
+
+const u16 gLinkMiscMenu_Pal[] = INCBIN_U16("graphics/interface/union_room_chat.gbapal");
+const u32 gLinkMiscMenu_Gfx[] = INCBIN_U32("graphics/interface/union_room_chat.4bpp.lz");
+const u32 gLinkMiscMenu_Tilemap[] = INCBIN_U32("graphics/interface/union_room_chat.bin.lz");
+const u32 gUnionRoomChatIcons[] = INCBIN_U32("graphics/interface/union_room_chat_icons.4bpp.lz");
+
+const u16 gTilesetPalettes_General[][16] =
+{
+ INCBIN_U16("data/tilesets/primary/general/palettes/00.gbapal"),
+ INCBIN_U16("data/tilesets/primary/general/palettes/01.gbapal"),
+ INCBIN_U16("data/tilesets/primary/general/palettes/02.gbapal"),
+ INCBIN_U16("data/tilesets/primary/general/palettes/03.gbapal"),
+ INCBIN_U16("data/tilesets/primary/general/palettes/04.gbapal"),
+ INCBIN_U16("data/tilesets/primary/general/palettes/05.gbapal"),
+ INCBIN_U16("data/tilesets/primary/general/palettes/06.gbapal"),
+ INCBIN_U16("data/tilesets/primary/general/palettes/07.gbapal"),
+ INCBIN_U16("data/tilesets/primary/general/palettes/08.gbapal"),
+ INCBIN_U16("data/tilesets/primary/general/palettes/09.gbapal"),
+ INCBIN_U16("data/tilesets/primary/general/palettes/10.gbapal"),
+ INCBIN_U16("data/tilesets/primary/general/palettes/11.gbapal"),
+ INCBIN_U16("data/tilesets/primary/general/palettes/12.gbapal"),
+ INCBIN_U16("data/tilesets/primary/general/palettes/13.gbapal"),
+ INCBIN_U16("data/tilesets/primary/general/palettes/14.gbapal"),
+ INCBIN_U16("data/tilesets/primary/general/palettes/15.gbapal"),
+};
+
+const u32 gTilesetTiles_General[] = INCBIN_U32("data/tilesets/primary/general/tiles.4bpp.lz");
+
+const u8 gBerryFixGameboy_Pal[] = INCBIN_U8("graphics/berry_fix/gba_small.gbapal");
+const u8 gBerryFixGameboy_Gfx[] = INCBIN_U8("graphics/berry_fix/gba_small.4bpp.lz");
+const u8 gBerryFixGameboy_Tilemap[] = INCBIN_U8("graphics/berry_fix/gba_small.bin.lz");
+const u8 gBerryFixGameboyLogo_Pal[] = INCBIN_U8("graphics/berry_fix/logo.gbapal");
+const u8 gBerryFixGameboyLogo_Gfx[] = INCBIN_U8("graphics/berry_fix/logo.4bpp.lz");
+const u8 gBerryFixGameboyLogo_Tilemap[] = INCBIN_U8("graphics/berry_fix/logo.bin.lz");
+const u8 gBerryFixGbaTransfer_Pal[] = INCBIN_U8("graphics/berry_fix/gba_transfer.gbapal");
+const u8 gBerryFixGbaTransfer_Gfx[] = INCBIN_U8("graphics/berry_fix/gba_transfer.4bpp.lz");
+const u8 gBerryFixGbaTransfer_Tilemap[] = INCBIN_U8("graphics/berry_fix/gba_transfer.bin.lz");
+const u8 gBerryFixGbaTransferHighlight_Pal[] = INCBIN_U8("graphics/berry_fix/gba_transfer_highlight.gbapal");
+const u8 gBerryFixGbaTransferHighlight_Gfx[] = INCBIN_U8("graphics/berry_fix/gba_transfer_highlight.4bpp.lz");
+const u8 gBerryFixGbaTransferHighlight_Tilemap[] = INCBIN_U8("graphics/berry_fix/gba_transfer_highlight.bin.lz");
+const u8 gBerryFixGbaTransferError_Pal[] = INCBIN_U8("graphics/berry_fix/gba_transfer_error.gbapal");
+const u8 gBerryFixGbaTransferError_Gfx[] = INCBIN_U8("graphics/berry_fix/gba_transfer_error.4bpp.lz");
+const u8 gBerryFixGbaTransferError_Tilemap[] = INCBIN_U8("graphics/berry_fix/gba_transfer_error.bin.lz");
+const u8 gBerryFixWindow_Pal[] = INCBIN_U8("graphics/berry_fix/window.gbapal");
+const u8 gBerryFixWindow_Gfx[] = INCBIN_U8("graphics/berry_fix/window.4bpp.lz");
+const u8 gBerryFixWindow_Tilemap[] = INCBIN_U8("graphics/berry_fix/window.bin.lz");
+
+const u16 gTilesetPalettes_GenericBuilding1[][16] =
+{
+ INCBIN_U16("data/tilesets/secondary/generic_building1/palettes/00.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/generic_building1/palettes/01.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/generic_building1/palettes/02.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/generic_building1/palettes/03.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/generic_building1/palettes/04.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/generic_building1/palettes/05.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/generic_building1/palettes/06.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/generic_building1/palettes/07.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/generic_building1/palettes/08.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/generic_building1/palettes/09.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/generic_building1/palettes/10.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/generic_building1/palettes/11.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/generic_building1/palettes/12.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/generic_building1/palettes/13.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/generic_building1/palettes/14.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/generic_building1/palettes/15.gbapal"),
+};
+
+const u32 gTilesetTiles_GenericBuilding1[] = INCBIN_U32("data/tilesets/secondary/generic_building1/tiles.4bpp.lz");
+
+const u16 gTilesetPalettes_DepartmentStore[][16] =
+{
+ INCBIN_U16("data/tilesets/secondary/department_store/palettes/00.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/department_store/palettes/01.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/department_store/palettes/02.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/department_store/palettes/03.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/department_store/palettes/04.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/department_store/palettes/05.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/department_store/palettes/06.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/department_store/palettes/07.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/department_store/palettes/08.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/department_store/palettes/09.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/department_store/palettes/10.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/department_store/palettes/11.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/department_store/palettes/12.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/department_store/palettes/13.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/department_store/palettes/14.gbapal"),
+ INCBIN_U16("data/tilesets/secondary/department_store/palettes/15.gbapal"),
+};
+
+const u32 gTilesetTiles_DepartmentStore[] = INCBIN_U32("data/tilesets/secondary/department_store/tiles.4bpp.lz");
+
+const u16 gUnionRoomChatPanelBgPal_7[] = INCBIN_U16("graphics/interface/union_room_chat_panel.gbapal");
+const u32 gUnionRoomChatPanelBgTiles[] = INCBIN_U32("graphics/interface/union_room_chat_panel.4bpp.lz");
+const u32 gUnionRoomChatPanelBgMap[] = INCBIN_U32("graphics/interface/union_room_chat_panel.bin.lz");
+
+const u16 gCreditsMonBackdropPals[][16] =
+{
+ INCBIN_U16("graphics/credits/charizard.gbapal"),
+ INCBIN_U16("graphics/credits/venusaur.gbapal"),
+ INCBIN_U16("graphics/credits/blastoise.gbapal"),
+ INCBIN_U16("graphics/credits/pikachu.gbapal"),
+};
+
+const u32 gCreditsPokeballBgGfxTiles[] = INCBIN_U32("graphics/credits/unk_8EAAB98.4bpp.lz");
+const u32 gCreditsPokeballBgGfxMap[] = INCBIN_U32("graphics/credits/unk_8EAB30C.bin.lz");
+
+#ifdef FIRERED
+const u16 gGraphics_TitleScreen_GameTitleLogoPals[] = INCBIN_U16("graphics/title_screen/unk_8eab6c4.gbapal");
+const u8 gGraphics_TitleScreen_GameTitleLogoTiles[] = INCBIN_U8("graphics/title_screen/unk_8eab8c4.8bpp.lz");
+const u8 gGraphics_TitleScreen_GameTitleLogoMap[] = INCBIN_U8("graphics/title_screen/unk_8ead390.bin.lz");
+const u16 gGraphics_TitleScreen_BoxArtMonPals[] = INCBIN_U16("graphics/title_screen/unk_8ead5e8.gbapal");
+const u8 gGraphics_TitleScreen_BoxArtMonTiles[] = INCBIN_U8("graphics/title_screen/unk_8ead608.4bpp.lz");
+const u8 gGraphics_TitleScreen_BoxArtMonMap[] = INCBIN_U8("graphics/title_screen/unk_8eadee4.bin.lz");
+const u16 gGraphics_TitleScreen_BackgroundPals[] = INCBIN_U16("graphics/title_screen/unk_8eae094.gbapal");
+const u8 gGraphics_TitleScreen_CopyrightPressStartTiles[] = INCBIN_U8("graphics/title_screen/unk_8eae0b4.4bpp.lz");
+const u8 gGraphics_TitleScreen_CopyrightPressStartMap[] = INCBIN_U8("graphics/title_screen/unk_8eae374.bin.lz");
+const u16 gGraphics_TitleScreen_FireOrLeafPals[] = INCBIN_U16("graphics/title_screen/unk_8eae488.gbapal");
+const u32 gGraphics_TitleScreen_BlankObjTiles[] = INCBIN_U32("graphics/title_screen/unk_8eae4a8.4bpp.lz");
+#endif
+
+#ifdef LEAFGREEN
+const u16 gGraphics_TitleScreen_GameTitleLogoPals[] = INCBIN_U16("graphics/title_screen/unk_lg_8eab744.gbapal");
+const u8 gGraphics_TitleScreen_GameTitleLogoTiles[] = INCBIN_U8("graphics/title_screen/unk_lg_8eab944.8bpp.lz");
+const u8 gGraphics_TitleScreen_GameTitleLogoMap[] = INCBIN_U8("graphics/title_screen/unk_lg_8ead508.bin.lz");
+const u16 gGraphics_TitleScreen_BoxArtMonPals[] = INCBIN_U16("graphics/title_screen/unk_lg_8ead768.gbapal");
+const u8 gGraphics_TitleScreen_BoxArtMonTiles[] = INCBIN_U8("graphics/title_screen/unk_lg_8ead788.4bpp.lz");
+const u8 gGraphics_TitleScreen_BoxArtMonMap[] = INCBIN_U8("graphics/title_screen/unk_lg_8eae1ec.bin.lz");
+const u16 gGraphics_TitleScreen_BackgroundPals[] = INCBIN_U16("graphics/title_screen/unk_lg_8eae388.gbapal");
+const u8 gGraphics_TitleScreen_CopyrightPressStartTiles[] = INCBIN_U8("graphics/title_screen/unk_8eae0b4.4bpp.lz");
+const u8 gGraphics_TitleScreen_CopyrightPressStartMap[] = INCBIN_U8("graphics/title_screen/unk_8eae374.bin.lz");
+const u16 gGraphics_TitleScreen_FireOrLeafPals[] = INCBIN_U16("graphics/title_screen/unk_lg_8eae77c.gbapal");
+const u32 gGraphics_TitleScreen_BlankObjTiles[] = INCBIN_U32("graphics/title_screen/unk_8eae4a8.4bpp.lz");
+#endif
+
+const u16 gCreditsAllRightsReservedGfxPal[] = INCBIN_U16("graphics/credits/unk_8EAE548.gbapal");
+const u8 gCreditsAllRightsReservedGfxTiles[] = INCBIN_U8("graphics/credits/unk_8EAE548.4bpp.lz");
+const u8 gCreditsAllRightsReservedGfxMap[] = INCBIN_U8("graphics/credits/unk_8EAE548.bin.lz");
+
+const u32 gUnknown_8EAEA00[] = INCBIN_U32("graphics/link/gba.gbapal");
+const u32 gTradeGba2_Pal[] = INCBIN_U32("graphics/link/gba_pal2.gbapal");
+const u32 gTradeGba_Gfx[] = INCBIN_U32("graphics/link/gba.4bpp");
+
+const u16 gUnknown_8EAFE80[] = INCBIN_U16("graphics/interface/blank2.gbapal");
+
+const u16 gUnknown_8EAFEA0[] = INCBIN_U16("graphics/berry_crush/berry_crush.gbapal");
+const u16 gUnknown_8EAFF60[] = INCBIN_U16("graphics/unknown/unknown_EAFF60.gbapal");
+const u32 gUnknown_8EAFFC0[] = INCBIN_U32("graphics/berry_crush/berry_crush.4bpp.lz");
+const u32 gUnknown_8EB0ADC[] = INCBIN_U32("graphics/berry_crush/data_EB0ADC.bin.lz");
diff --git a/src/heal_location.c b/src/heal_location.c
index 89d9478c0..5c31e2df3 100644
--- a/src/heal_location.c
+++ b/src/heal_location.c
@@ -124,13 +124,13 @@ void SetBlackoutRespawnWarpAndHealerNpc(struct WarpData * warp)
if (VarGet(VAR_MAP_SCENE_TRAINER_TOWER) == 1)
{
- if (!gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_2)
+ if (!gSaveBlock1Ptr->trainerTower[gSaveBlock1Ptr->towerChallengeId].spokeToOwner)
VarSet(VAR_MAP_SCENE_TRAINER_TOWER, 0);
gSpecialVar_LastTalked = 1;
warp->x = 4;
warp->y = 11;
- warp->mapGroup = MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER_LOBBY);
- warp->mapNum = MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_LOBBY);
+ warp->mapGroup = MAP_GROUP(TRAINER_TOWER_LOBBY);
+ warp->mapNum = MAP_NUM(TRAINER_TOWER_LOBBY);
warp->warpId = 0xFF;
}
else
@@ -155,7 +155,7 @@ void SetBlackoutRespawnWarpAndHealerNpc(struct WarpData * warp)
warp->x = 5;
warp->y = 4;
}
- else if (sBlackoutRespawnHealCenterMapIdxs[healLocationIdx - 1][0] == MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER_LOBBY) && sBlackoutRespawnHealCenterMapIdxs[healLocationIdx - 1][1] == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_LOBBY))
+ else if (sBlackoutRespawnHealCenterMapIdxs[healLocationIdx - 1][0] == MAP_GROUP(TRAINER_TOWER_LOBBY) && sBlackoutRespawnHealCenterMapIdxs[healLocationIdx - 1][1] == MAP_NUM(TRAINER_TOWER_LOBBY))
{
warp->x = 4;
warp->y = 11;
diff --git a/src/help_system.c b/src/help_system.c
index 4a4d927c5..8eabd4e1d 100644
--- a/src/help_system.c
+++ b/src/help_system.c
@@ -10,9 +10,7 @@
#include "strings.h"
#include "text.h"
#include "blit.h"
-#include "event_data.h"
#include "constants/songs.h"
-#include "constants/flags.h"
extern u8 gGlyphInfo[];
@@ -33,7 +31,7 @@ struct HelpSystemVideoState
static EWRAM_DATA u8 sMapTilesBackup[BG_CHAR_SIZE] = {0};
EWRAM_DATA u8 gUnknown_203F174 = 0;
-EWRAM_DATA u8 gUnknown_203F175 = 0;
+EWRAM_DATA bool8 gHelpSystemToggleWithRButtonDisabled = FALSE;
static EWRAM_DATA u8 sDelayTimer = 0;
static EWRAM_DATA u8 sInHelpSystem = 0;
static EWRAM_DATA struct HelpSystemVideoState sVideoState = {0};
@@ -53,7 +51,7 @@ u8 RunHelpSystemCallback(void)
sInHelpSystem = 0;
if (gSaveBlock2Ptr->optionsButtonMode != OPTIONS_BUTTON_MODE_HELP)
return 0;
- if (JOY_NEW(R_BUTTON) && gUnknown_203F175 == 1)
+ if (JOY_NEW(R_BUTTON) && gHelpSystemToggleWithRButtonDisabled == TRUE)
return 0;
if (JOY_NEW(L_BUTTON | R_BUTTON))
{
@@ -92,10 +90,10 @@ u8 RunHelpSystemCallback(void)
HelpSystem_FillPanel2();
HelpSystem_PrintText_Row61(gString_Help);
sub_813BD14(1);
- if (sub_812B40C() == TRUE)
- sub_812BC54(&gHelpSystemListMenu, gHelpSystemListMenuItems);
+ if (HelpSystem_UpdateHasntSeenIntro() == TRUE)
+ HelpSystemSubroutine_PrintWelcomeMessage(&gHelpSystemListMenu, gHelpSystemListMenuItems);
else
- sub_812BCA8(&gHelpSystemListMenu, gHelpSystemListMenuItems);
+ HelpSystemSubroutine_WelcomeEndGotoMenu(&gHelpSystemListMenu, gHelpSystemListMenuItems);
sub_813BE78(1);
sub_813BF50(1);
CommitTilemap();
@@ -110,7 +108,7 @@ u8 RunHelpSystemCallback(void)
sVideoState.state = 5;
break;
case 5:
- if (!sub_812BB9C(&gHelpSystemListMenu, gHelpSystemListMenuItems))
+ if (!RunHelpMenuSubroutine(&gHelpSystemListMenu, gHelpSystemListMenuItems))
{
PlaySE(SE_HELP_CL);
sVideoState.state = 6;
@@ -981,9 +979,9 @@ void HelpSystem_FillPanel1(void)
void HelpSystem_InitListMenuController(struct HelpSystemListMenu * a0, u8 a1, u8 a2)
{
gHelpSystemListMenu.sub = a0->sub;
- gHelpSystemListMenu.field_0C = a1;
- gHelpSystemListMenu.field_0D = a2;
- gHelpSystemListMenu.field_0E = 0;
+ gHelpSystemListMenu.itemsAbove = a1;
+ gHelpSystemListMenu.cursorPos = a2;
+ gHelpSystemListMenu.state = 0;
if (gHelpSystemListMenu.sub.totalItems < gHelpSystemListMenu.sub.maxShowed)
gHelpSystemListMenu.sub.maxShowed = gHelpSystemListMenu.sub.totalItems;
sub_813BDA4(0);
@@ -1007,7 +1005,7 @@ s32 HelpSystem_GetMenuInput(void)
else if (JOY_NEW(A_BUTTON))
{
PlaySE(SE_SELECT);
- return gHelpSystemListMenu.sub.items[gHelpSystemListMenu.field_0C + gHelpSystemListMenu.field_0D].index;
+ return gHelpSystemListMenu.sub.items[gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos].index;
}
else if (JOY_NEW(B_BUTTON))
{
@@ -1051,15 +1049,15 @@ void sub_813C75C(void)
u8 r6 = gHelpSystemListMenu.sub.totalItems - 7;
if (gHelpSystemListMenu.sub.totalItems > 7)
{
- s32 r4 = gHelpSystemListMenu.field_0C + gHelpSystemListMenu.field_0D;
+ s32 r4 = gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos;
sub_813C004(0, 0);
if (r4 == 0)
sub_813C004(1, 1);
- else if (gHelpSystemListMenu.field_0C == 0 && gHelpSystemListMenu.field_0D != 0)
+ else if (gHelpSystemListMenu.itemsAbove == 0 && gHelpSystemListMenu.cursorPos != 0)
sub_813C004(1, 1);
- else if (gHelpSystemListMenu.field_0C == r6)
+ else if (gHelpSystemListMenu.itemsAbove == r6)
sub_813C004(0, 1);
- else if (gHelpSystemListMenu.field_0C != 0)
+ else if (gHelpSystemListMenu.itemsAbove != 0)
{
sub_813C004(0, 1);
sub_813C004(1, 1);
@@ -1071,7 +1069,7 @@ void PrintListMenuItems(void)
{
u8 glyphHeight = GetFontAttribute(2, 1) + 1;
s32 i;
- s32 r5 = gHelpSystemListMenu.field_0C;
+ s32 r5 = gHelpSystemListMenu.itemsAbove;
for (i = 0; i < gHelpSystemListMenu.sub.maxShowed; i++)
{
@@ -1086,8 +1084,8 @@ void PlaceListMenuCursor(void)
{
u8 glyphHeight = GetFontAttribute(2, 1) + 1;
u8 x = gHelpSystemListMenu.sub.left;
- u8 y = gHelpSystemListMenu.sub.top + glyphHeight * gHelpSystemListMenu.field_0D;
- HelpSystem_PrintTextAt(gFameCheckerText_ListMenuCursor, x, y);
+ u8 y = gHelpSystemListMenu.sub.top + glyphHeight * gHelpSystemListMenu.cursorPos;
+ HelpSystem_PrintTextAt(gText_SelectorArrow2, x, y);
}
void sub_813C860(u8 i)
@@ -1107,24 +1105,24 @@ u8 TryMoveCursor1(u8 dirn)
r4 = 0;
else
r4 = gHelpSystemListMenu.sub.maxShowed - (gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1)) - 1;
- if (gHelpSystemListMenu.field_0C == 0)
+ if (gHelpSystemListMenu.itemsAbove == 0)
{
- if (gHelpSystemListMenu.field_0D != 0)
+ if (gHelpSystemListMenu.cursorPos != 0)
{
- gHelpSystemListMenu.field_0D--;
+ gHelpSystemListMenu.cursorPos--;
return 1;
}
else
return 0;
}
- if (gHelpSystemListMenu.field_0D > r4)
+ if (gHelpSystemListMenu.cursorPos > r4)
{
- gHelpSystemListMenu.field_0D--;
+ gHelpSystemListMenu.cursorPos--;
return 1;
}
else
{
- gHelpSystemListMenu.field_0C--;
+ gHelpSystemListMenu.itemsAbove--;
return 2;
}
}
@@ -1134,24 +1132,24 @@ u8 TryMoveCursor1(u8 dirn)
r4 = 0;
else
r4 = gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1);
- if (gHelpSystemListMenu.field_0C == gHelpSystemListMenu.sub.totalItems - gHelpSystemListMenu.sub.maxShowed)
+ if (gHelpSystemListMenu.itemsAbove == gHelpSystemListMenu.sub.totalItems - gHelpSystemListMenu.sub.maxShowed)
{
- if (gHelpSystemListMenu.field_0D < gHelpSystemListMenu.sub.maxShowed - 1)
+ if (gHelpSystemListMenu.cursorPos < gHelpSystemListMenu.sub.maxShowed - 1)
{
- gHelpSystemListMenu.field_0D++;
+ gHelpSystemListMenu.cursorPos++;
return 1;
}
else
return 0;
}
- else if (gHelpSystemListMenu.field_0D < r4)
+ else if (gHelpSystemListMenu.cursorPos < r4)
{
- gHelpSystemListMenu.field_0D++;
+ gHelpSystemListMenu.cursorPos++;
return 1;
}
else
{
- gHelpSystemListMenu.field_0C++;
+ gHelpSystemListMenu.itemsAbove++;
return 2;
}
}
@@ -1159,7 +1157,7 @@ u8 TryMoveCursor1(u8 dirn)
bool8 MoveCursor(u8 by, u8 dirn)
{
- u8 r7 = gHelpSystemListMenu.field_0D;
+ u8 r7 = gHelpSystemListMenu.cursorPos;
u8 flags = 0;
s32 i;
for (i = 0; i < by; i++)
@@ -1172,21 +1170,21 @@ bool8 MoveCursor(u8 by, u8 dirn)
// neither changed
return TRUE;
case 1:
- // changed field_0D only
+ // changed cursorPos only
sub_813C860(r7);
PlaceListMenuCursor();
CommitTilemap();
break;
case 2:
case 3:
- // changed field_0C
+ // changed itemsAbove
if (sub_812BF88() == TRUE)
{
HelpSystem_SetInputDelay(2);
HelpSystem_FillPanel1();
PrintListMenuItems();
PlaceListMenuCursor();
- sub_812BDEC();
+ HelpSystem_PrintTopicLabel();
sub_813C75C();
}
else
diff --git a/src/help_system_812B1E0.c b/src/help_system_812B1E0.c
index df892152a..ee26c6de5 100644
--- a/src/help_system_812B1E0.c
+++ b/src/help_system_812B1E0.c
@@ -16,812 +16,1678 @@
#include "constants/maps.h"
#include "constants/songs.h"
-static EWRAM_DATA u16 sSomeVariable = 0;
-static EWRAM_DATA u8 gUnknown_203B0EE = 0;
+static EWRAM_DATA u16 sHelpSystemContextId = 0;
+static EWRAM_DATA u8 sSeenHelpSystemIntro = 0;
-u8 gUnknown_3005E9C[4];
-u16 gSomeVariableBackup;
+u8 gHelpSystemState[4];
+u16 gHelpContextIdBackup;
static bool32 IsCurrentMapInArray(const u16 * mapIdxs);
-static void sub_812B520(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
-static void sub_812B614(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
-static bool8 sub_812B754(void);
-static bool8 sub_812B780(u8);
-static bool8 sub_812BB10(void);
-
-static void sub_812BF5C(void);
-static void sub_812BF74(const u8 *);
-static void sub_812BF94(struct HelpSystemListMenu * a0);
-static void sub_812BF9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
-
-static const u8 *const gUnknown_845B080[] = {
- gUnknown_81B2DF8,
- gUnknown_81B2E1C,
- gUnknown_81B2E2E,
- gUnknown_81B2E48,
- gUnknown_81B2E58,
- gUnknown_81B2E6A
-};
-
-static const u8 *const gUnknown_845B098[] = {
- gUnknown_81B2E88,
- gUnknown_81B2EC8,
- gUnknown_81B2F00,
- gUnknown_81B2F43,
- gUnknown_81B2F74,
- gUnknown_81B2FA9
-};
-
-static const u8 *const gUnknown_845B0B0[] = {
- NULL,
- gUnknown_81B3083,
- gUnknown_81B30A9,
- gUnknown_81B30C1,
- gUnknown_81B30DC,
- gUnknown_81B30FC,
- gUnknown_81B311F,
- gUnknown_81B3140,
- gUnknown_81B314F,
- gUnknown_81B3168,
- gUnknown_81B3189,
- gUnknown_81B31AE,
- gUnknown_81B31D3,
- gUnknown_81B31EC,
- gUnknown_81B31FF,
- gUnknown_81B3215,
- gUnknown_81B3226,
- gUnknown_81B3243,
- gUnknown_81B3261,
- gUnknown_81B3276,
- gUnknown_81B3290,
- gUnknown_81B32B6,
- gUnknown_81B32CD,
- gUnknown_81B32E3,
- gUnknown_81B32F9,
- gUnknown_81B330B,
- gUnknown_81B332B,
- gUnknown_81B3344,
- gUnknown_81B335C,
- gUnknown_81B3373,
- gUnknown_81B338C,
- gUnknown_81B33A6,
- gUnknown_81B33CA,
- gUnknown_81B33EA,
- gUnknown_81B3402,
- gUnknown_81B3427,
- gUnknown_81B3440,
- gUnknown_81B3457,
- gUnknown_81B346F,
- gUnknown_81B3481,
- gUnknown_81B349B,
- gUnknown_81B34B7,
- gUnknown_81B34D6,
- gUnknown_81B34F6,
- gUnknown_81B3516
-};
-
-static const u8 *const gUnknown_845B164[] = {
- NULL,
- gUnknown_81B3525,
- gUnknown_81B35E6,
- gUnknown_81B36EB,
- gUnknown_81B379A,
- gUnknown_81B3849,
- gUnknown_81B3876,
- gUnknown_81B3972,
- gUnknown_81B3A51,
- gUnknown_81B3ACC,
- gUnknown_81B3BB6,
- gUnknown_81B3C99,
- gUnknown_81B3D1B,
- gUnknown_81B3DE3,
- gUnknown_81B3EBC,
- gUnknown_81B3F7F,
- gUnknown_81B406C,
- gUnknown_81B410B,
- gUnknown_81B41D7,
- gUnknown_81B42B3,
- gUnknown_81B439D,
- gUnknown_81B4483,
- gUnknown_81B457C,
- gUnknown_81B4645,
- gUnknown_81B470A,
- gUnknown_81B47F0,
- gUnknown_81B48C6,
- gUnknown_81B497A,
- gUnknown_81B4A72,
- gUnknown_81B4B65,
- gUnknown_81B4C54,
- gUnknown_81B4D26,
- gUnknown_81B4E0B,
- gUnknown_81B4ED8,
- gUnknown_81B4FB2,
- gUnknown_81B4FFD,
- gUnknown_81B50FF,
- gUnknown_81B51B1,
- gUnknown_81B5272,
- gUnknown_81B5325,
- gUnknown_81B5382,
- gUnknown_81B547C,
- gUnknown_81B54E1,
- gUnknown_81B5589,
- gUnknown_81B55F4
-};
-
-static const u8 *const gUnknown_845B218[] = {
- NULL,
- gUnknown_81B56E3,
- gUnknown_81B56F4,
- gUnknown_81B5705,
- gUnknown_81B5717,
- gUnknown_81B5728,
- gUnknown_81B5737,
- gUnknown_81B5744,
- gUnknown_81B5754,
- gUnknown_81B5767,
- gUnknown_81B577B,
- gUnknown_81B5787,
- gUnknown_81B5795,
- gUnknown_81B57A5,
- gUnknown_81B57B8,
- gUnknown_81B57CF,
- gUnknown_81B57DE,
- gUnknown_81B57EE,
- gUnknown_81B580D,
- gUnknown_81B5824,
- gUnknown_81B5834,
- gUnknown_81B583F,
- gUnknown_81B5850,
- gUnknown_81B5863,
- gUnknown_81B5875,
- gUnknown_81B5884,
- gUnknown_81B5893,
- gUnknown_81B58A4,
- gUnknown_81B58BC,
- gUnknown_81B58D3,
- gUnknown_81B58E5,
- gUnknown_81B58FD,
- gUnknown_81B590E,
- gUnknown_81B591D,
- gUnknown_81B592E,
- gUnknown_81B593E,
- gUnknown_81B5950,
- gUnknown_81B595D,
- gUnknown_81B5974,
- gUnknown_81B5989,
- gUnknown_81B59A7,
- gUnknown_81B59BF,
- gUnknown_81B59D6,
- gUnknown_81B59E8,
- gUnknown_81B59F5,
- gUnknown_81B5A0D,
- gUnknown_81B5A1B,
- gUnknown_81B5A29,
- gUnknown_81B5A37
-};
-
-static const u8 *const gUnknown_845B2DC[] = {
- NULL,
- gUnknown_81B5A4D,
- gUnknown_81B5B0C,
- gUnknown_81B5B7D,
- gUnknown_81B5C13,
- gUnknown_81B5CDF,
- gUnknown_81B5D87,
- gUnknown_81B5E41,
- gUnknown_81B5F10,
- gUnknown_81B5FA6,
- gUnknown_81B606C,
- gUnknown_81B6140,
- gUnknown_81B6203,
- gUnknown_81B62E4,
- gUnknown_81B6397,
- gUnknown_81B6478,
- gUnknown_81B6525,
- gUnknown_81B65E7,
- gUnknown_81B66BA,
- gUnknown_81B678E,
- gUnknown_81B6883,
- gUnknown_81B68CD,
- gUnknown_81B69B9,
- gUnknown_81B6A9A,
- gUnknown_81B6B6E,
- gUnknown_81B6C4F,
- gUnknown_81B6D4A,
- gUnknown_81B6E02,
- gUnknown_81B6EC1,
- gUnknown_81B6FA8,
- gUnknown_81B7075,
- gUnknown_81B7108,
- gUnknown_81B71EA,
- gUnknown_81B723B,
- gUnknown_81B7319,
- gUnknown_81B73E8,
- gUnknown_81B747E,
- gUnknown_81B752C,
- gUnknown_81B7611,
- gUnknown_81B7692,
- gUnknown_81B771E,
- gUnknown_81B77DD,
- gUnknown_81B7884,
- gUnknown_81B7931,
- gUnknown_81B79CB,
- gUnknown_81B7A60,
- gUnknown_81B7AEE,
- gUnknown_81B7BBE,
- gUnknown_81B7C57
-};
-
-static const u8 *const gUnknown_845B3A0[] = {
- NULL,
- gUnknown_81B7CC1,
- gUnknown_81B7CC4,
- gUnknown_81B7CD9,
- gUnknown_81B7CDF,
- gUnknown_81B7CE6,
- gUnknown_81B7CEE,
- gUnknown_81B7CF6,
- gUnknown_81B7CFE,
- gUnknown_81B7D04,
- gUnknown_81B7D12,
- gUnknown_81B7D17,
- gUnknown_81B7D1A,
- gUnknown_81B7D1F,
- gUnknown_81B7D27,
- gUnknown_81B7D2D,
- gUnknown_81B7D37,
- gUnknown_81B7D3E,
- gUnknown_81B7D45,
- gUnknown_81B7D48,
- gUnknown_81B7D4E,
- gUnknown_81B7D57,
- gUnknown_81B7D5B,
- gUnknown_81B7D61,
- gUnknown_81B7D6B,
- gUnknown_81B7D76,
- gUnknown_81B7D7E,
- gUnknown_81B7D88,
- gUnknown_81B7D8F,
- gUnknown_81B7D9A,
- gUnknown_81B7DA7,
- gUnknown_81B7DB4,
- gUnknown_81B7DBA,
- gUnknown_81B7DC6,
- gUnknown_81B7DCC,
- gUnknown_81B7DD3,
- gUnknown_81B7DD6,
- gUnknown_81B7DD9,
- gUnknown_81B7DE1,
- gUnknown_81B7DEB,
- gUnknown_81B7DFA,
- gUnknown_81B7E02,
- gUnknown_81B7E09,
- gUnknown_81B7E0F
-};
-
-static const u8 *const gUnknown_845B450[] = {
- NULL,
- gUnknown_81B7E16,
- gUnknown_81B7F0A,
- gUnknown_81B800A,
- gUnknown_81B80EC,
- gUnknown_81B81C2,
- gUnknown_81B8256,
- gUnknown_81B8348,
- gUnknown_81B83EF,
- gUnknown_81B847B,
- gUnknown_81B8550,
- gUnknown_81B8647,
- gUnknown_81B86E2,
- gUnknown_81B87B8,
- gUnknown_81B8897,
- gUnknown_81B8924,
- gUnknown_81B8A04,
- gUnknown_81B8A84,
- gUnknown_81B8B62,
- gUnknown_81B8C18,
- gUnknown_81B8C94,
- gUnknown_81B8D1D,
- gUnknown_81B8DD4,
- gUnknown_81B8E67,
- gUnknown_81B8F4D,
- gUnknown_81B901B,
- gUnknown_81B90A7,
- gUnknown_81B90E8,
- gUnknown_81B9170,
- gUnknown_81B91C2,
- gUnknown_81B91F9,
- gUnknown_81B92B8,
- gUnknown_81B92ED,
- gUnknown_81B93D8,
- gUnknown_81B9439,
- gUnknown_81B9497,
- gUnknown_81B9560,
- gUnknown_81B9656,
- gUnknown_81B9749,
- gUnknown_81B984F,
- gUnknown_81B991C,
- gUnknown_81B99C4,
- gUnknown_81B9AA2,
- gUnknown_81B9B2F
-};
-
-static const u8 *const gUnknown_845B500[] = {
- NULL,
- gUnknown_81B9BB7,
- gUnknown_81B9BC7,
- gUnknown_81B9BD0,
- gUnknown_81B9BE1,
- gUnknown_81B9BF5,
- gUnknown_81B9C09,
- gUnknown_81B9C1D
-};
-
-static const u8 *const gUnknown_845B520[] = {
- NULL,
- gUnknown_81B9C2F,
- gUnknown_81B9D04,
- gUnknown_81B9DC5,
- gUnknown_81B9E75,
- gUnknown_81B9F09,
- gUnknown_81B9FCE,
- gUnknown_81BA027
-};
-
-static const u8 *const gUnknown_845B540[] = {
- NULL,
- gUnknown_81BA0F1,
- gUnknown_81BA10D,
- gUnknown_81BA121,
- gUnknown_81BA138,
- gUnknown_81BA14C,
- gUnknown_81BA163,
- gUnknown_81BA17A,
- gUnknown_81BA194,
- gUnknown_81BA1AC,
- gUnknown_81BA1C7,
- gUnknown_81BA1DC,
- gUnknown_81BA1F4,
- gUnknown_81BA209,
- gUnknown_81BA221,
- gUnknown_81BA234,
- gUnknown_81BA24A,
- gUnknown_81BA260,
- gUnknown_81BA279,
- gUnknown_81BA291,
- gUnknown_81BA2AC,
- gUnknown_81BA2C2,
- gUnknown_81BA2DB,
- gUnknown_81BA2F1,
- gUnknown_81BA30A,
- gUnknown_81BA320,
- gUnknown_81BA339,
- gUnknown_81BA34E,
- gUnknown_81BA366,
- gUnknown_81BA37C,
- gUnknown_81BA395,
- gUnknown_81BA3A9,
- gUnknown_81BA3C0,
- gUnknown_81BA3D5,
- gUnknown_81BA3ED,
- gUnknown_81BA400
-};
-
-static const u8 *const gUnknown_845B5D0[] = {
- NULL,
- gUnknown_81BA416,
- gUnknown_81BA4E6,
- gUnknown_81BA539,
- gUnknown_81BA595,
- gUnknown_81BA5F2,
- gUnknown_81BA66F,
- gUnknown_81BA6C9,
- gUnknown_81BA71F,
- gUnknown_81BA796,
- gUnknown_81BA7E9,
- gUnknown_81BA862,
- gUnknown_81BA8D3,
- gUnknown_81BA92A,
- gUnknown_81BA98D,
- gUnknown_81BA9F1,
- gUnknown_81BAA44,
- gUnknown_81BAAB6,
- gUnknown_81BAB18,
- gUnknown_81BAB7A,
- gUnknown_81BABCC,
- gUnknown_81BAC29,
- gUnknown_81BAC89,
- gUnknown_81BACC4,
- gUnknown_81BAD20,
- gUnknown_81BAD60,
- gUnknown_81BADA2,
- gUnknown_81BADF7,
- gUnknown_81BAEA8,
- gUnknown_81BAF01,
- gUnknown_81BAF6B,
- gUnknown_81BAFCA,
- gUnknown_81BB02E,
- gUnknown_81BB084,
- gUnknown_81BB0DF,
- gUnknown_81BB156
-};
-
-
-static const u8 gUnknown_845B660[] = {
- 0x01, 0x02, 0x03, 0xff
-};
-
-static const u8 gUnknown_845B664[] = {
- 0x01, 0x02, 0x03, 0xff
-};
-
-static const u8 gUnknown_845B668[] = {
- 0x13, 0xff
-};
-
-static const u8 gUnknown_845B66A[] = {
- 0x01, 0x02, 0x03, 0xff
-};
-
-static const u8 gUnknown_845B66E[] = {
- 0x01, 0x25, 0xff
-};
-
-static const u8 gUnknown_845B671[] = {
- 0x02, 0x03, 0x04, 0x05, 0x11, 0xff
-};
-
-static const u8 gUnknown_845B677[] = {
- 0x09, 0x01, 0xff
-};
-
-static const u8 gUnknown_845B67A[] = {
- 0x02, 0x03, 0xff
-};
-
-static const u8 gUnknown_845B67D[] = {
- 0x09, 0x0a, 0x0b, 0x11, 0x0c, 0x10, 0xff
-};
-
-static const u8 gUnknown_845B684[] = {
- 0x09, 0x01, 0x04, 0x05, 0x06, 0x07, 0x08, 0x02, 0x0d, 0xff
-};
-
-static const u8 gUnknown_845B68E[] = {
- 0x09, 0x03, 0x0a, 0x0f, 0x12, 0x13, 0x14, 0xff
-};
-
-static const u8 gUnknown_845B696[] = {
- 0x06, 0x07, 0x08, 0x2c, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x12, 0xff
-};
-
-static const u8 gUnknown_845B6A1[] = {
- 0x16, 0x17, 0x18, 0xff
-};
-
-static const u8 gUnknown_845B6A5[] = {
- 0x0a, 0xff
-};
-
-static const u8 gUnknown_845B6A7[] = {
- 0x11, 0x0e, 0x19, 0x1a, 0x1b, 0xff
-};
-
-static const u8 gUnknown_845B6AD[] = {
- 0x0a, 0xff
-};
-
-static const u8 gUnknown_845B6AF[] = {
- 0x0b, 0xff
-};
-
-static const u8 gUnknown_845B6B1[] = {
- 0x2b, 0x19, 0x1a, 0xff
-};
-
-static const u8 gUnknown_845B6B5[] = {
- 0x0c, 0xff
-};
-
-static const u8 gUnknown_845B6B7[] = {
- 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0xff
-};
-
-static const u8 gUnknown_845B6BF[] = {
- 0x02, 0x03, 0x04, 0xff
-};
-
-static const u8 gUnknown_845B6C3[] = {
- 0x01, 0x02, 0x03, 0x07, 0xff
-};
-
-static const u8 gUnknown_845B6C8[] = {
- 0x02, 0x04, 0x05, 0x09, 0x25, 0xff
-};
-
-static const u8 gUnknown_845B6CE[] = {
- 0x1f, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x2c, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x0a, 0x0b, 0x0c, 0x11, 0xff
-};
-
-static const u8 gUnknown_845B6E2[] = {
- 0x09, 0x01, 0x02, 0x03, 0x0a, 0x28, 0xff
-};
-
-static const u8 gUnknown_845B6E9[] = {
- 0x02, 0x05, 0x06, 0x0a, 0x23, 0x24, 0x09, 0x25, 0xff
-};
-
-static const u8 gUnknown_845B6F2[] = {
- 0x1f, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x2c, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x0a, 0x0b, 0x0c, 0x11, 0x14, 0xff
-};
-
-static const u8 gUnknown_845B707[] = {
- 0x09, 0x01, 0x02, 0x03, 0x0a, 0x28, 0xff
-};
-
-static const u8 gUnknown_845B70E[] = {
- 0x03, 0x07, 0x04, 0x05, 0x06, 0xff
-};
-
-static const u8 gUnknown_845B714[] = {
- 0x02, 0x05, 0x06, 0x0a, 0x23, 0x24, 0x09, 0x25, 0xff
-};
-
-static const u8 gUnknown_845B71D[] = {
- 0x1f, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x2c, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x0a, 0x0b, 0x0c, 0x11, 0xff
-};
-
-static const u8 gUnknown_845B731[] = {
- 0x09, 0x01, 0x02, 0x03, 0x0a, 0x0c, 0x0e, 0x16, 0x17, 0x18, 0x15, 0xff
-};
-
-static const u8 gUnknown_845B73D[] = {
- 0x06, 0x0a, 0x23, 0x24, 0x09, 0x25, 0xff
-};
-
-static const u8 gUnknown_845B744[] = {
- 0x1f, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x2c, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x0a, 0x0b, 0x0c, 0x11, 0xff
-};
-
-static const u8 gUnknown_845B758[] = {
- 0x09, 0x01, 0x02, 0x03, 0x0a, 0x15, 0xff
-};
-
-static const u8 gUnknown_845B75F[] = {
- 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0xff
-};
-
-static const u8 gUnknown_845B783[] = {
- 0x02, 0x0a, 0x04, 0x05, 0x06, 0x07, 0x0d, 0x27, 0x08, 0x0b, 0x21, 0x23, 0x24, 0x2c, 0x09, 0x0e, 0x16, 0x17, 0x0f, 0x10, 0x11, 0x1a, 0x15, 0x1f, 0x20, 0x12, 0x13, 0x14, 0x18, 0x19, 0x1b, 0x1e, 0x1c, 0x28, 0x25, 0xff
-};
-
-static const u8 gUnknown_845B7A7[] = {
- 0x1f, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x2c, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x0a, 0x0b, 0x0c, 0x11, 0xff
-};
-
-static const u8 gUnknown_845B7BB[] = {
- 0x09, 0x01, 0x02, 0x0a, 0x0b, 0x0c, 0x0d, 0x15, 0xff
-};
-
-static const u8 gUnknown_845B7C4[] = {
- 0x02, 0x0a, 0x04, 0x05, 0x06, 0x07, 0x0d, 0x27, 0x08, 0x0b, 0x21, 0x23, 0x24, 0x2c, 0x09, 0x0e, 0x16, 0x17, 0x0f, 0x10, 0x11, 0x1a, 0x15, 0x1f, 0x20, 0x12, 0x13, 0x14, 0x18, 0x19, 0x1b, 0x1e, 0x1c, 0x28, 0x25, 0xff
-};
-
-static const u8 gUnknown_845B7E8[] = {
- 0x1f, 0x01, 0x02, 0x06, 0x0a, 0x0b, 0x0c, 0x11, 0xff
-};
-
-static const u8 gUnknown_845B7F1[] = {
- 0x09, 0x01, 0x02, 0x0a, 0x0b, 0x0c, 0x0d, 0x15, 0x28, 0xff
-};
-
-static const u8 gUnknown_845B7FB[] = {
- 0x0a, 0x07, 0x0d, 0x27, 0x08, 0x0b, 0x21, 0x23, 0x24, 0x2c, 0x09, 0x0e, 0x16, 0x0f, 0x10, 0x11, 0x1a, 0x15, 0x1f, 0x20, 0x12, 0x13, 0x14, 0x18, 0x19, 0x1b, 0x1e, 0x1c, 0x28, 0x25, 0xff
-};
-
-static const u8 gUnknown_845B81A[] = {
- 0x1f, 0x01, 0x02, 0x06, 0x0a, 0x0b, 0x0c, 0x11, 0xff
-};
-
-static const u8 gUnknown_845B823[] = {
- 0x09, 0x01, 0x02, 0x0a, 0x0b, 0x0c, 0x0d, 0x15, 0xff
-};
-
-static const u8 gUnknown_845B82C[] = {
- 0x07, 0x27, 0x08, 0x2c, 0x15, 0x1f, 0x20, 0x12, 0x13, 0x14, 0x18, 0x19, 0x1b, 0x1e, 0x1c, 0x28, 0x25, 0xff
-};
-
-static const u8 gUnknown_845B83E[] = {
- 0x1f, 0x01, 0x02, 0x06, 0x0a, 0x0b, 0x0c, 0x11, 0xff
-};
-
-static const u8 gUnknown_845B847[] = {
- 0x09, 0x01, 0x02, 0x0a, 0x0b, 0x0c, 0x0d, 0x15, 0xff
-};
-
-static const u8 gUnknown_845B850[] = {
- 0x0f, 0x1b, 0x1d, 0x11, 0x12, 0x15, 0x17, 0x16, 0x1f, 0x20, 0x13, 0x14, 0xff
-};
-
-static const u8 gUnknown_845B85D[] = {
- 0x20, 0x21, 0x22, 0x23, 0x24, 0x07, 0x09, 0x2b, 0xff
-};
-
-static const u8 gUnknown_845B866[] = {
- 0x09, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0a, 0x0d, 0x0f, 0x12, 0x13, 0x14, 0x27, 0x15, 0xff
-};
-
-static const u8 gUnknown_845B878[] = {
- 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0xff
-};
-
-static const u8 gUnknown_845B89C[] = {
- 0x0f, 0x1b, 0x1d, 0x11, 0x12, 0x16, 0x1f, 0x20, 0x13, 0x14, 0xff
-};
-
-static const u8 gUnknown_845B8A7[] = {
- 0x20, 0x21, 0x22, 0x23, 0x24, 0x07, 0x2b, 0xff
-};
-
-static const u8 gUnknown_845B8AF[] = {
- 0x09, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0a, 0x0d, 0x0f, 0x12, 0x13, 0x14, 0x27, 0x15, 0xff
-};
-
-static const u8 gUnknown_845B8C1[] = {
- 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0xff
-};
-
-static const u8 gUnknown_845B8E5[] = {
- 0x0f, 0x1b, 0x1d, 0x11, 0x12, 0x16, 0x1f, 0x20, 0x13, 0x14, 0xff
-};
-
-static const u8 gUnknown_845B8F0[] = {
- 0x20, 0x21, 0x22, 0x23, 0x24, 0x07, 0x2b, 0xff
-};
-
-static const u8 gUnknown_845B8F8[] = {
- 0x09, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0a, 0x0d, 0x0f, 0x12, 0x13, 0x14, 0x27, 0x15, 0xff
-};
-
-static const u8 gUnknown_845B90A[] = {
- 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0xff
-};
-
-static const u8 gUnknown_845B92E[] = {
- 0x29, 0x2a, 0x2b, 0xff
-};
-
-static const u8 gUnknown_845B932[] = {
- 0x2d, 0x2e, 0x2f, 0x2b, 0xff
-};
-
-static const u8 gUnknown_845B937[] = {
- 0x09, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0a, 0x0d, 0x0f, 0x12, 0x13, 0x14, 0xff
-};
-
-static const u8 gUnknown_845B947[] = {
- 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0xff
-};
-
-static const u8 gUnknown_845B96B[] = {
- 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x30, 0xff
-};
-
-static const u8 gUnknown_845B978[] = {
- 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x30, 0xff
-};
-
-static const u8 gUnknown_845B985[] = {
- 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x30, 0xff
-};
-
-static const u8 gUnknown_845B992[] = {
- 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x30, 0xff
-};
-
-static const u8 gUnknown_845B99F[] = {
- 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x30, 0xff
-};
-
-static const u8 gUnknown_845B9AC[] = {
- 0x26, 0x27, 0x28, 0x29, 0x2a, 0xff
-};
-
-static const u8 gUnknown_845B9B2[] = {
- 0x26, 0x27, 0x28, 0x29, 0x2a, 0xff
-};
-
-static const u8 gUnknown_845B9B8[] = {
- 0x26, 0x27, 0x28, 0x29, 0x2a, 0xff
-};
-
-static const u8 gUnknown_845B9BE[] = {
- 0x09, 0x01, 0x02, 0x03, 0x23, 0x25, 0x24, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x27, 0x15, 0x26, 0x16, 0x17, 0x18, 0x1a, 0x0e, 0x1b, 0xff
-};
-
-static const u8 *const gUnknown_845B9E0[] = {
- NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, gUnknown_845B660, NULL,
- NULL, NULL, NULL, gUnknown_845B664, NULL,
- NULL, gUnknown_845B668, NULL, gUnknown_845B66A, NULL,
- NULL, gUnknown_845B66E, NULL, NULL, NULL,
- NULL, gUnknown_845B671, gUnknown_845B677, NULL, NULL,
- NULL, gUnknown_845B67A, gUnknown_845B67D, NULL, NULL,
- NULL, NULL, gUnknown_845B684, NULL, NULL,
- NULL, NULL, gUnknown_845B68E, NULL, NULL,
- NULL, gUnknown_845B696, gUnknown_845B6A1, NULL, NULL,
- NULL, gUnknown_845B6A5, gUnknown_845B6A7, NULL, NULL,
- NULL, gUnknown_845B6AD, NULL, NULL, NULL,
- NULL, gUnknown_845B6AF, gUnknown_845B6B1, NULL, NULL,
- NULL, gUnknown_845B6B5, gUnknown_845B6B7, NULL, NULL,
- gUnknown_845B6BF, NULL, NULL, gUnknown_845B6C3, NULL,
- gUnknown_845B6C8, gUnknown_845B6CE, gUnknown_845B6E2, NULL, NULL,
- gUnknown_845B6E9, gUnknown_845B6F2, gUnknown_845B707, gUnknown_845B70E, NULL,
- gUnknown_845B714, gUnknown_845B71D, gUnknown_845B731, NULL, NULL,
- gUnknown_845B73D, gUnknown_845B744, gUnknown_845B758, NULL, gUnknown_845B75F,
- gUnknown_845B783, gUnknown_845B7A7, gUnknown_845B7BB, NULL, NULL,
- gUnknown_845B7C4, gUnknown_845B7E8, gUnknown_845B7F1, NULL, NULL,
- gUnknown_845B7FB, gUnknown_845B81A, gUnknown_845B823, NULL, NULL,
- gUnknown_845B82C, gUnknown_845B83E, gUnknown_845B847, NULL, NULL,
- gUnknown_845B850, gUnknown_845B85D, gUnknown_845B866, NULL, gUnknown_845B878,
- gUnknown_845B89C, gUnknown_845B8A7, gUnknown_845B8AF, NULL, gUnknown_845B8C1,
- gUnknown_845B8E5, gUnknown_845B8F0, gUnknown_845B8F8, NULL, gUnknown_845B90A,
- gUnknown_845B92E, gUnknown_845B932, gUnknown_845B937, NULL, gUnknown_845B947,
- NULL, gUnknown_845B96B, NULL, NULL, NULL,
- NULL, gUnknown_845B978, NULL, NULL, NULL,
- NULL, gUnknown_845B985, NULL, NULL, NULL,
- NULL, gUnknown_845B992, NULL, NULL, NULL,
- NULL, gUnknown_845B99F, NULL, NULL, NULL,
- NULL, gUnknown_845B9AC, NULL, NULL, NULL,
- NULL, gUnknown_845B9B2, NULL, NULL, NULL,
- NULL, gUnknown_845B9B8, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL
+static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
+static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
+static bool8 HelpSystem_ShouldShowBasicTerms(void);
+static bool8 IsHelpSystemSubmenuEnabled(u8);
+static bool8 HasGottenAtLeastOneHM(void);
+
+static void PrintWelcomeMessageOnPanel1(void);
+static void PrintTextOnPanel2Row52RightAlign(const u8 *);
+static void ResetHelpSystemCursor(struct HelpSystemListMenu * a0);
+static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
+
+#define HELP_NONE 0
+#define HELP_END 0xFF
+
+// Help Main Topics
+enum
+{
+ TOPIC_WHAT_TO_DO,
+ TOPIC_HOW_TO_DO,
+ TOPIC_TERMS,
+ TOPIC_ABOUT_GAME,
+ TOPIC_TYPE_MATCHUP,
+ TOPIC_EXIT,
+ TOPIC_COUNT
+};
+
+static const u8 *const sHelpSystemTopicPtrs[TOPIC_COUNT] = {
+ [TOPIC_WHAT_TO_DO] = Help_Text_WhatShouldIDo,
+ [TOPIC_HOW_TO_DO] = Help_Text_HowDoIDoThis,
+ [TOPIC_TERMS] = Help_Text_WhatDoesThisTermMean,
+ [TOPIC_ABOUT_GAME] = Help_Text_AboutThisGame,
+ [TOPIC_TYPE_MATCHUP] = Help_Text_TypeMatchupList,
+ [TOPIC_EXIT] = Help_Text_Exit
+};
+
+static const u8 *const sHelpSystemTopicMouseoverDescriptionPtrs[TOPIC_COUNT] = {
+ [TOPIC_WHAT_TO_DO] = Help_Text_DescWhatShouldIDo,
+ [TOPIC_HOW_TO_DO] = Help_Text_DescHowDoIDoThis,
+ [TOPIC_TERMS] = Help_Text_DescWhatDoesThisTermMean,
+ [TOPIC_ABOUT_GAME] = Help_Text_DescAboutThisGame,
+ [TOPIC_TYPE_MATCHUP] = Help_Text_DescTypeMatchupList,
+ [TOPIC_EXIT] = Help_Text_DescExit
+};
+
+// Submenu IDs for TOPIC_WHAT_TO_DO
+enum
+{
+ HELP_PLAYING_FOR_FIRST_TIME = 1,
+ HELP_WHAT_SHOULD_I_BE_DOING,
+ HELP_CANT_GET_OUT_OF_ROOM,
+ HELP_CANT_FIND_PERSON_I_WANT,
+ HELP_TALKED_TO_EVERYONE_NOW_WHAT,
+ HELP_SOMEONE_BLOCKING_MY_WAY,
+ HELP_I_CANT_GO_ON,
+ HELP_OUT_OF_THINGS_TO_DO,
+ HELP_WHAT_HAPPENED_TO_ITEM_I_GOT,
+ HELP_WHAT_ARE_MY_ADVENTURE_BASICS,
+ HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT,
+ HELP_HOW_ARE_CAVES_DIFFERENT,
+ HELP_HOW_DO_I_PROGRESS,
+ HELP_WHEN_CAN_I_USE_ITEM,
+ HELP_WHATS_A_BATTLE,
+ HELP_HOW_DO_I_PREPARE_FOR_BATTLE,
+ HELP_WHAT_IS_A_MONS_VITALITY,
+ HELP_MY_MONS_ARE_HURT,
+ HELP_WHAT_IS_STATUS_PROBLEM,
+ HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT,
+ HELP_CANT_CATCH_MONS,
+ HELP_RAN_OUT_OF_POTIONS,
+ HELP_CAN_I_BUY_POKEBALLS,
+ HELP_WHATS_A_TRAINER,
+ HELP_HOW_DO_I_WIN_AGAINST_TRAINER,
+ HELP_WHERE_DO_MONS_APPEAR,
+ HELP_WHAT_ARE_MOVES,
+ HELP_WHAT_ARE_HIDDEN_MOVES,
+ HELP_WHAT_MOVES_SHOULD_I_USE,
+ HELP_WANT_TO_ADD_MORE_MOVES,
+ HELP_WANT_TO_MAKE_MON_STRONGER,
+ HELP_FOE_MONS_TOO_STRONG,
+ HELP_WHAT_DO_I_DO_IN_CAVE,
+ HELP_NOTHING_I_WANT_TO_KNOW,
+ HELP_WHATS_POKEMON_CENTER,
+ HELP_WHATS_POKEMON_MART,
+ HELP_WANT_TO_END_GAME,
+ HELP_WHATS_A_MON,
+ HELP_WHAT_IS_THAT_PERSON_LIKE,
+ HELP_WHAT_DOES_HIDDEN_MOVE_DO,
+ HELP_WHAT_DO_I_DO_IN_SAFARI,
+ HELP_WHAT_ARE_SAFARI_RULES,
+ HELP_WANT_TO_END_SAFARI,
+ HELP_WHAT_IS_A_GYM,
+};
+
+static const u8 *const sHelpSystemSpecializedQuestionTextPtrs[] = {
+ [HELP_NONE] = NULL,
+ [HELP_PLAYING_FOR_FIRST_TIME] = Help_Text_PlayingForFirstTime,
+ [HELP_WHAT_SHOULD_I_BE_DOING] = Help_Text_WhatShouldIBeDoing,
+ [HELP_CANT_GET_OUT_OF_ROOM] = Help_Text_CantGetOutOfRoom,
+ [HELP_CANT_FIND_PERSON_I_WANT] = Help_Text_CantFindPersonIWant,
+ [HELP_TALKED_TO_EVERYONE_NOW_WHAT] = Help_Text_TalkedToEveryoneNowWhat,
+ [HELP_SOMEONE_BLOCKING_MY_WAY] = Help_Text_SomeoneBlockingMyWay,
+ [HELP_I_CANT_GO_ON] = Help_Text_ICantGoOn,
+ [HELP_OUT_OF_THINGS_TO_DO] = Help_Text_OutOfThingsToDo,
+ [HELP_WHAT_HAPPENED_TO_ITEM_I_GOT] = Help_Text_WhatHappenedToItemIGot,
+ [HELP_WHAT_ARE_MY_ADVENTURE_BASICS] = Help_Text_WhatAreMyAdventureBasics,
+ [HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT] = Help_Text_HowAreRoadsForestsDifferent,
+ [HELP_HOW_ARE_CAVES_DIFFERENT] = Help_Text_HowAreCavesDifferent,
+ [HELP_HOW_DO_I_PROGRESS] = Help_Text_HowDoIProgress,
+ [HELP_WHEN_CAN_I_USE_ITEM] = Help_Text_WhenCanIUseItem,
+ [HELP_WHATS_A_BATTLE] = Help_Text_WhatsABattle,
+ [HELP_HOW_DO_I_PREPARE_FOR_BATTLE] = Help_Text_HowDoIPrepareForBattle,
+ [HELP_WHAT_IS_A_MONS_VITALITY] = Help_Text_WhatIsAMonsVitality,
+ [HELP_MY_MONS_ARE_HURT] = Help_Text_MyMonsAreHurt,
+ [HELP_WHAT_IS_STATUS_PROBLEM] = Help_Text_WhatIsStatusProblem,
+ [HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT] = Help_Text_WhatHappensIfAllMyMonsFaint,
+ [HELP_CANT_CATCH_MONS] = Help_Text_CantCatchMons,
+ [HELP_RAN_OUT_OF_POTIONS] = Help_Text_RanOutOfPotions,
+ [HELP_CAN_I_BUY_POKEBALLS] = Help_Text_CanIBuyPokeBalls,
+ [HELP_WHATS_A_TRAINER] = Help_Text_WhatsATrainer,
+ [HELP_HOW_DO_I_WIN_AGAINST_TRAINER] = Help_Text_HowDoIWinAgainstTrainer,
+ [HELP_WHERE_DO_MONS_APPEAR] = Help_Text_WhereDoMonsAppear,
+ [HELP_WHAT_ARE_MOVES] = Help_Text_WhatAreMoves,
+ [HELP_WHAT_ARE_HIDDEN_MOVES] = Help_Text_WhatAreHiddenMoves,
+ [HELP_WHAT_MOVES_SHOULD_I_USE] = Help_Text_WhatMovesShouldIUse,
+ [HELP_WANT_TO_ADD_MORE_MOVES] = Help_Text_WantToAddMoreMoves,
+ [HELP_WANT_TO_MAKE_MON_STRONGER] = Help_Text_WantToMakeMonStronger,
+ [HELP_FOE_MONS_TOO_STRONG] = Help_Text_FoeMonsTooStrong,
+ [HELP_WHAT_DO_I_DO_IN_CAVE] = Help_Text_WhatDoIDoInCave,
+ [HELP_NOTHING_I_WANT_TO_KNOW] = Help_Text_NothingIWantToKnow,
+ [HELP_WHATS_POKEMON_CENTER] = Help_Text_WhatsPokemonCenter,
+ [HELP_WHATS_POKEMON_MART] = Help_Text_WhatsPokemonMart,
+ [HELP_WANT_TO_END_GAME] = Help_Text_WantToEndGame,
+ [HELP_WHATS_A_MON] = Help_Text_WhatsAMon,
+ [HELP_WHAT_IS_THAT_PERSON_LIKE] = Help_Text_WhatIsThatPersonLike,
+ [HELP_WHAT_DOES_HIDDEN_MOVE_DO] = Help_Text_WhatDoesHiddenMoveDo,
+ [HELP_WHAT_DO_I_DO_IN_SAFARI] = Help_Text_WhatDoIDoInSafari,
+ [HELP_WHAT_ARE_SAFARI_RULES] = Help_Text_WhatAreSafariRules,
+ [HELP_WANT_TO_END_SAFARI] = Help_Text_WantToEndSafari,
+ [HELP_WHAT_IS_A_GYM] = Help_Text_WhatIsAGym
+};
+
+static const u8 *const sHelpSystemSpecializedAnswerTextPtrs[] = {
+ [HELP_NONE] = NULL,
+ [HELP_PLAYING_FOR_FIRST_TIME] = Help_Text_AnswerPlayingForFirstTime,
+ [HELP_WHAT_SHOULD_I_BE_DOING] = Help_Text_AnswerWhatShouldIBeDoing,
+ [HELP_CANT_GET_OUT_OF_ROOM] = Help_Text_AnswerCantGetOutOfRoom,
+ [HELP_CANT_FIND_PERSON_I_WANT] = Help_Text_AnswerCantFindPersonIWant,
+ [HELP_TALKED_TO_EVERYONE_NOW_WHAT] = Help_Text_AnswerTalkedToEveryoneNowWhat,
+ [HELP_SOMEONE_BLOCKING_MY_WAY] = Help_Text_AnswerSomeoneBlockingMyWay,
+ [HELP_I_CANT_GO_ON] = Help_Text_AnswerICantGoOn,
+ [HELP_OUT_OF_THINGS_TO_DO] = Help_Text_AnswerOutOfThingsToDo,
+ [HELP_WHAT_HAPPENED_TO_ITEM_I_GOT] = Help_Text_AnswerWhatHappenedToItemIGot,
+ [HELP_WHAT_ARE_MY_ADVENTURE_BASICS] = Help_Text_AnswerWhatAreMyAdventureBasics,
+ [HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT] = Help_Text_AnswerHowAreRoadsForestsDifferent,
+ [HELP_HOW_ARE_CAVES_DIFFERENT] = Help_Text_AnswerHowAreCavesDifferent,
+ [HELP_HOW_DO_I_PROGRESS] = Help_Text_AnswerHowDoIProgress,
+ [HELP_WHEN_CAN_I_USE_ITEM] = Help_Text_AnswerWhenCanIUseItem,
+ [HELP_WHATS_A_BATTLE] = Help_Text_AnswerWhatsABattle,
+ [HELP_HOW_DO_I_PREPARE_FOR_BATTLE] = Help_Text_AnswerHowDoIPrepareForBattle,
+ [HELP_WHAT_IS_A_MONS_VITALITY] = Help_Text_AnswerWhatIsAMonsVitality,
+ [HELP_MY_MONS_ARE_HURT] = Help_Text_AnswerMyMonsAreHurt,
+ [HELP_WHAT_IS_STATUS_PROBLEM] = Help_Text_AnswerWhatIsStatusProblem,
+ [HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT] = Help_Text_AnswerWhatHappensIfAllMyMonsFaint,
+ [HELP_CANT_CATCH_MONS] = Help_Text_AnswerCantCatchMons,
+ [HELP_RAN_OUT_OF_POTIONS] = Help_Text_AnswerRanOutOfPotions,
+ [HELP_CAN_I_BUY_POKEBALLS] = Help_Text_AnswerCanIBuyPokeBalls,
+ [HELP_WHATS_A_TRAINER] = Help_Text_AnswerWhatsATrainer,
+ [HELP_HOW_DO_I_WIN_AGAINST_TRAINER] = Help_Text_AnswerHowDoIWinAgainstTrainer,
+ [HELP_WHERE_DO_MONS_APPEAR] = Help_Text_AnswerWhereDoMonsAppear,
+ [HELP_WHAT_ARE_MOVES] = Help_Text_AnswerWhatAreMoves,
+ [HELP_WHAT_ARE_HIDDEN_MOVES] = Help_Text_AnswerWhatAreHiddenMoves,
+ [HELP_WHAT_MOVES_SHOULD_I_USE] = Help_Text_AnswerWhatMovesShouldIUse,
+ [HELP_WANT_TO_ADD_MORE_MOVES] = Help_Text_AnswerWantToAddMoreMoves,
+ [HELP_WANT_TO_MAKE_MON_STRONGER] = Help_Text_AnswerWantToMakeMonStronger,
+ [HELP_FOE_MONS_TOO_STRONG] = Help_Text_AnswerFoeMonsTooStrong,
+ [HELP_WHAT_DO_I_DO_IN_CAVE] = Help_Text_AnswerWhatDoIDoInCave,
+ [HELP_NOTHING_I_WANT_TO_KNOW] = Help_Text_AnswerNothingIWantToKnow,
+ [HELP_WHATS_POKEMON_CENTER] = Help_Text_AnswerWhatsPokemonCenter,
+ [HELP_WHATS_POKEMON_MART] = Help_Text_AnswerWhatsPokemonMart,
+ [HELP_WANT_TO_END_GAME] = Help_Text_AnswerWantToEndGame,
+ [HELP_WHATS_A_MON] = Help_Text_AnswerWhatsAMon,
+ [HELP_WHAT_IS_THAT_PERSON_LIKE] = Help_Text_AnswerWhatIsThatPersonLike,
+ [HELP_WHAT_DOES_HIDDEN_MOVE_DO] = Help_Text_AnswerWhatDoesHiddenMoveDo,
+ [HELP_WHAT_DO_I_DO_IN_SAFARI] = Help_Text_AnswerWhatDoIDoInSafari,
+ [HELP_WHAT_ARE_SAFARI_RULES] = Help_Text_AnswerWhatAreSafariRules,
+ [HELP_WANT_TO_END_SAFARI] = Help_Text_AnswerWantToEndSafari,
+ [HELP_WHAT_IS_A_GYM] = Help_Text_AnswerWhatIsAGym
+};
+
+// Submenu IDs for TOPIC_HOW_TO_DO
+enum
+{
+ HELP_USING_POKEDEX = 1,
+ HELP_USING_POKEMON,
+ HELP_USING_SUMMARY,
+ HELP_USING_SWITCH,
+ HELP_USING_ITEM,
+ HELP_USING_BAG,
+ HELP_USING_AN_ITEM,
+ HELP_USING_KEYITEM,
+ HELP_USING_POKEBALL,
+ HELP_USING_PLAYER,
+ HELP_USING_SAVE,
+ HELP_USING_OPTION,
+ HELP_USING_POTION,
+ HELP_USING_TOWN_MAP,
+ HELP_USING_TM,
+ HELP_USING_HM,
+ HELP_USING_MOVE_OUTSIDE_OF_BATTLE,
+ HELP_RIDING_BICYCLE,
+ HELP_ENTERING_NAME,
+ HELP_USING_PC,
+ HELP_USING_BILLS_PC,
+ HELP_USING_WITHDRAW,
+ HELP_USING_DEPOSIT,
+ HELP_USING_MOVE,
+ HELP_MOVING_ITEMS,
+ HELP_USING_PLAYERS_PC,
+ HELP_USING_WITHDRAW_ITEM,
+ HELP_USING_DEPOSIT_ITEM,
+ HELP_USING_MAILBOX,
+ HELP_USING_PROF_OAKS_PC,
+ HELP_OPENING_MENU,
+ HELP_USING_FIGHT,
+ HELP_USING_POKEMON2,
+ HELP_USING_SHIFT,
+ HELP_USING_SUMMARY2,
+ HELP_USING_BAG2,
+ HELP_READING_POKEDEX,
+ HELP_USING_HOME_PC,
+ HELP_USING_ITEM_STORAGE,
+ HELP_USING_WITHDRAW_ITEM2,
+ HELP_USING_DEPOSIT_ITEM2,
+ HELP_USING_MAILBOX2,
+ HELP_USING_RUN,
+ HELP_REGISTER_KEY_ITEM,
+ HELP_USING_BALL,
+ HELP_USING_BAIT,
+ HELP_USING_ROCK,
+ HELP_USING_HALL_OF_FAME,
+};
+
+static const u8 *const sHelpSystemMenuTopicTextPtrs[] = {
+ [HELP_NONE] = NULL,
+ [HELP_USING_POKEDEX] = Help_Text_UsingPokedex,
+ [HELP_USING_POKEMON] = Help_Text_UsingPokemon,
+ [HELP_USING_SUMMARY] = Help_Text_UsingSummary,
+ [HELP_USING_SWITCH] = Help_Text_UsingSwitch,
+ [HELP_USING_ITEM] = Help_Text_UsingItem,
+ [HELP_USING_BAG] = Help_Text_UsingBag,
+ [HELP_USING_AN_ITEM] = Help_Text_UsingAnItem,
+ [HELP_USING_KEYITEM] = Help_Text_UsingKeyItem,
+ [HELP_USING_POKEBALL] = Help_Text_UsingPokeBall,
+ [HELP_USING_PLAYER] = Help_Text_UsingPlayer,
+ [HELP_USING_SAVE] = Help_Text_UsingSave,
+ [HELP_USING_OPTION] = Help_Text_UsingOption,
+ [HELP_USING_POTION] = Help_Text_UsingPotion,
+ [HELP_USING_TOWN_MAP] = Help_Text_UsingTownMap,
+ [HELP_USING_TM] = Help_Text_UsingTM,
+ [HELP_USING_HM] = Help_Text_UsingHM,
+ [HELP_USING_MOVE_OUTSIDE_OF_BATTLE] = Help_Text_UsingMoveOutsideOfBattle,
+ [HELP_RIDING_BICYCLE] = Help_Text_RidingBicycle,
+ [HELP_ENTERING_NAME] = Help_Text_EnteringName,
+ [HELP_USING_PC] = Help_Text_UsingPC,
+ [HELP_USING_BILLS_PC] = Help_Text_UsingBillsPC,
+ [HELP_USING_WITHDRAW] = Help_Text_UsingWithdraw,
+ [HELP_USING_DEPOSIT] = Help_Text_UsingDeposit,
+ [HELP_USING_MOVE] = Help_Text_UsingMove,
+ [HELP_MOVING_ITEMS] = Help_Text_MovingItems,
+ [HELP_USING_PLAYERS_PC] = Help_Text_UsingPlayersPC,
+ [HELP_USING_WITHDRAW_ITEM] = Help_Text_UsingWithdrawItem,
+ [HELP_USING_DEPOSIT_ITEM] = Help_Text_UsingDepositItem,
+ [HELP_USING_MAILBOX] = Help_Text_UsingMailbox,
+ [HELP_USING_PROF_OAKS_PC] = Help_Text_UsingProfOaksPC,
+ [HELP_OPENING_MENU] = Help_Text_OpeningMenu,
+ [HELP_USING_FIGHT] = Help_Text_UsingFight,
+ [HELP_USING_POKEMON2] = Help_Text_UsingPokemon2,
+ [HELP_USING_SHIFT] = Help_Text_UsingShift,
+ [HELP_USING_SUMMARY2] = Help_Text_UsingSummary2,
+ [HELP_USING_BAG2] = Help_Text_UsingBag2,
+ [HELP_READING_POKEDEX] = Help_Text_ReadingPokedex,
+ [HELP_USING_HOME_PC] = Help_Text_UsingHomePC,
+ [HELP_USING_ITEM_STORAGE] = Help_Text_UsingItemStorage,
+ [HELP_USING_WITHDRAW_ITEM2] = Help_Text_UsingWithdrawItem2,
+ [HELP_USING_DEPOSIT_ITEM2] = Help_Text_UsingDepositItem2,
+ [HELP_USING_MAILBOX2] = Help_Text_UsingMailbox2,
+ [HELP_USING_RUN] = Help_Text_UsingRun,
+ [HELP_REGISTER_KEY_ITEM] = Help_Text_RegisterKeyItem,
+ [HELP_USING_BALL] = Help_Text_UsingBall,
+ [HELP_USING_BAIT] = Help_Text_UsingBait,
+ [HELP_USING_ROCK] = Help_Text_UsingRock,
+ [HELP_USING_HALL_OF_FAME] = Help_Text_UsingHallOfFame
+};
+
+static const u8 *const sHelpSystemHowToUseMenuTextPtrs[] = {
+ [HELP_NONE] = NULL,
+ [HELP_USING_POKEDEX] = Help_Text_HowToUsePokedex,
+ [HELP_USING_POKEMON] = Help_Text_HowToUsePokemon,
+ [HELP_USING_SUMMARY] = Help_Text_HowToUseSummary,
+ [HELP_USING_SWITCH] = Help_Text_HowToUseSwitch,
+ [HELP_USING_ITEM] = Help_Text_HowToUseItem,
+ [HELP_USING_BAG] = Help_Text_HowToUseBag,
+ [HELP_USING_AN_ITEM] = Help_Text_HowToUseAnItem,
+ [HELP_USING_KEYITEM] = Help_Text_HowToUseKeyItem,
+ [HELP_USING_POKEBALL] = Help_Text_HowToUsePokeBall,
+ [HELP_USING_PLAYER] = Help_Text_HowToUsePlayer,
+ [HELP_USING_SAVE] = Help_Text_HowToUseSave,
+ [HELP_USING_OPTION] = Help_Text_HowToUseOption,
+ [HELP_USING_POTION] = Help_Text_HowToUsePotion,
+ [HELP_USING_TOWN_MAP] = Help_Text_HowToUseTownMap,
+ [HELP_USING_TM] = Help_Text_HowToUseTM,
+ [HELP_USING_HM] = Help_Text_HowToUseHM,
+ [HELP_USING_MOVE_OUTSIDE_OF_BATTLE] = Help_Text_HowToUseMoveOutsideOfBattle,
+ [HELP_RIDING_BICYCLE] = Help_Text_HowToRideBicycle,
+ [HELP_ENTERING_NAME] = Help_Text_HowToEnterName,
+ [HELP_USING_PC] = Help_Text_HowToUsePC,
+ [HELP_USING_BILLS_PC] = Help_Text_HowToUseBillsPC,
+ [HELP_USING_WITHDRAW] = Help_Text_HowToUseWithdraw,
+ [HELP_USING_DEPOSIT] = Help_Text_HowToUseDeposit,
+ [HELP_USING_MOVE] = Help_Text_HowToUseMove,
+ [HELP_MOVING_ITEMS] = Help_Text_HowToMoveItems,
+ [HELP_USING_PLAYERS_PC] = Help_Text_HowToUsePlayersPC,
+ [HELP_USING_WITHDRAW_ITEM] = Help_Text_HowToUseWithdrawItem,
+ [HELP_USING_DEPOSIT_ITEM] = Help_Text_HowToUseDepositItem,
+ [HELP_USING_MAILBOX] = Help_Text_HowToUseMailbox,
+ [HELP_USING_PROF_OAKS_PC] = Help_Text_HowToUseProfOaksPC,
+ [HELP_OPENING_MENU] = Help_Text_HowToOpenMenu,
+ [HELP_USING_FIGHT] = Help_Text_HowToUseFight,
+ [HELP_USING_POKEMON2] = Help_Text_HowToUsePokemon2,
+ [HELP_USING_SHIFT] = Help_Text_HowToUseShift,
+ [HELP_USING_SUMMARY2] = Help_Text_HowToUseSummary2,
+ [HELP_USING_BAG2] = Help_Text_HowToUseBag2,
+ [HELP_READING_POKEDEX] = Help_Text_HowToReadPokedex,
+ [HELP_USING_HOME_PC] = Help_Text_HowToUseHomePC,
+ [HELP_USING_ITEM_STORAGE] = Help_Text_HowToUseItemStorage,
+ [HELP_USING_WITHDRAW_ITEM2] = Help_Text_HowToUseWithdrawItem2,
+ [HELP_USING_DEPOSIT_ITEM2] = Help_Text_HowToUseDepositItem2,
+ [HELP_USING_MAILBOX2] = Help_Text_HowToUseMailbox2,
+ [HELP_USING_RUN] = Help_Text_HowToUseRun,
+ [HELP_REGISTER_KEY_ITEM] = Help_Text_HowToRegisterKeyItem,
+ [HELP_USING_BALL] = Help_Text_HowToUseBall,
+ [HELP_USING_BAIT] = Help_Text_HowToUseBait,
+ [HELP_USING_ROCK] = Help_Text_HowToUseRock,
+ [HELP_USING_HALL_OF_FAME] = Help_Text_HowToUseHallOfFame
+};
+
+// Submenu IDs for TOPIC_TERMS
+enum
+{
+ HELP_TERM_HP = 1,
+ HELP_TERM_EXP,
+ HELP_TERM_MOVES,
+ HELP_TERM_ATTACK,
+ HELP_TERM_DEFENSE,
+ HELP_TERM_SPATK,
+ HELP_TERM_SPDEF,
+ HELP_TERM_SPEED,
+ HELP_TERM_LEVEL,
+ HELP_TERM_TYPE,
+ HELP_TERM_OT,
+ HELP_TERM_ITEM,
+ HELP_TERM_ABILITY,
+ HELP_TERM_MONEY,
+ HELP_TERM_MOVE_TYPE,
+ HELP_TERM_NATURE,
+ HELP_TERM_ID_NO,
+ HELP_TERM_PP,
+ HELP_TERM_POWER,
+ HELP_TERM_ACCURACY,
+ HELP_TERM_FNT,
+ HELP_TERM_ITEMS,
+ HELP_TERM_KEYITEMS,
+ HELP_TERM_POKEBALLS,
+ HELP_TERM_POKEDEX,
+ HELP_TERM_PLAY_TIME,
+ HELP_TERM_BADGES,
+ HELP_TERM_TEXT_SPEED,
+ HELP_TERM_BATTLE_SCENE,
+ HELP_TERM_BATTLE_STYLE,
+ HELP_TERM_SOUND,
+ HELP_TERM_BUTTON_MODE,
+ HELP_TERM_FRAME,
+ HELP_TERM_CANCEL,
+ HELP_TERM_TM,
+ HELP_TERM_HM,
+ HELP_TERM_HM_MOVE,
+ HELP_TERM_EVOLUTION,
+ HELP_TERM_STATUS_PROBLEM,
+ HELP_TERM_POKEMON,
+ HELP_TERM_ID_NO2,
+ HELP_TERM_MONEY2,
+ HELP_TERM_BADGES2,
+};
+
+static const u8 *const sHelpSystemTermTextPtrs[] = {
+ [HELP_NONE] = NULL,
+ [HELP_TERM_HP] = Help_Text_HP,
+ [HELP_TERM_EXP] = Help_Text_EXP,
+ [HELP_TERM_MOVES] = Help_Text_Moves,
+ [HELP_TERM_ATTACK] = Help_Text_Attack,
+ [HELP_TERM_DEFENSE] = Help_Text_Defense,
+ [HELP_TERM_SPATK] = Help_Text_SpAtk,
+ [HELP_TERM_SPDEF] = Help_Text_SpDef,
+ [HELP_TERM_SPEED] = Help_Text_Speed,
+ [HELP_TERM_LEVEL] = Help_Text_Level,
+ [HELP_TERM_TYPE] = Help_Text_Type,
+ [HELP_TERM_OT] = Help_Text_OT,
+ [HELP_TERM_ITEM] = Help_Text_Item,
+ [HELP_TERM_ABILITY] = Help_Text_Ability,
+ [HELP_TERM_MONEY] = Help_Text_Money,
+ [HELP_TERM_MOVE_TYPE] = Help_Text_MoveType,
+ [HELP_TERM_NATURE] = Help_Text_Nature,
+ [HELP_TERM_ID_NO] = Help_Text_IDNo,
+ [HELP_TERM_PP] = Help_Text_PP,
+ [HELP_TERM_POWER] = Help_Text_Power,
+ [HELP_TERM_ACCURACY] = Help_Text_Accuracy,
+ [HELP_TERM_FNT] = Help_Text_FNT,
+ [HELP_TERM_ITEMS] = Help_Text_Items,
+ [HELP_TERM_KEYITEMS] = Help_Text_KeyItems,
+ [HELP_TERM_POKEBALLS] = Help_Text_PokeBalls,
+ [HELP_TERM_POKEDEX] = Help_Text_Pokedex,
+ [HELP_TERM_PLAY_TIME] = Help_Text_PlayTime,
+ [HELP_TERM_BADGES] = Help_Text_Badges,
+ [HELP_TERM_TEXT_SPEED] = Help_Text_TextSpeed,
+ [HELP_TERM_BATTLE_SCENE] = Help_Text_BattleScene,
+ [HELP_TERM_BATTLE_STYLE] = Help_Text_BattleStyle,
+ [HELP_TERM_SOUND] = Help_Text_Sound,
+ [HELP_TERM_BUTTON_MODE] = Help_Text_ButtonMode,
+ [HELP_TERM_FRAME] = Help_Text_Frame,
+ [HELP_TERM_CANCEL] = Help_Text_Cancel2,
+ [HELP_TERM_TM] = Help_Text_TM,
+ [HELP_TERM_HM] = Help_Text_HM,
+ [HELP_TERM_HM_MOVE] = Help_Text_HMMove,
+ [HELP_TERM_EVOLUTION] = Help_Text_Evolution,
+ [HELP_TERM_STATUS_PROBLEM] = Help_Text_StatusProblem,
+ [HELP_TERM_POKEMON] = Help_Text_Pokemon,
+ [HELP_TERM_ID_NO2] = Help_Text_IDNo2,
+ [HELP_TERM_MONEY2] = Help_Text_Money2,
+ [HELP_TERM_BADGES2] = Help_Text_Badges2
+};
+
+static const u8 *const sHelpSystemTermDefinitionsTextPtrs[] = {
+ [HELP_NONE] = NULL,
+ [HELP_TERM_HP] = Help_Text_DefineHP,
+ [HELP_TERM_EXP] = Help_Text_DefineEXP,
+ [HELP_TERM_MOVES] = Help_Text_DefineMoves,
+ [HELP_TERM_ATTACK] = Help_Text_DefineAttack,
+ [HELP_TERM_DEFENSE] = Help_Text_DefineDefense,
+ [HELP_TERM_SPATK] = Help_Text_DefineSpAtk,
+ [HELP_TERM_SPDEF] = Help_Text_DefineSpDef,
+ [HELP_TERM_SPEED] = Help_Text_DefineSpeed,
+ [HELP_TERM_LEVEL] = Help_Text_DefineLevel,
+ [HELP_TERM_TYPE] = Help_Text_DefineType,
+ [HELP_TERM_OT] = Help_Text_DefineOT,
+ [HELP_TERM_ITEM] = Help_Text_DefineItem,
+ [HELP_TERM_ABILITY] = Help_Text_DefineAbility,
+ [HELP_TERM_MONEY] = Help_Text_DefineMoney,
+ [HELP_TERM_MOVE_TYPE] = Help_Text_DefineMoveType,
+ [HELP_TERM_NATURE] = Help_Text_DefineNature,
+ [HELP_TERM_ID_NO] = Help_Text_DefineIDNo,
+ [HELP_TERM_PP] = Help_Text_DefinePP,
+ [HELP_TERM_POWER] = Help_Text_DefinePower,
+ [HELP_TERM_ACCURACY] = Help_Text_DefineAccuracy,
+ [HELP_TERM_FNT] = Help_Text_DefineFNT,
+ [HELP_TERM_ITEMS] = Help_Text_DefineItems,
+ [HELP_TERM_KEYITEMS] = Help_Text_DefineKeyItems,
+ [HELP_TERM_POKEBALLS] = Help_Text_DefinePokeBalls,
+ [HELP_TERM_POKEDEX] = Help_Text_DefinePokedex,
+ [HELP_TERM_PLAY_TIME] = Help_Text_DefinePlayTime,
+ [HELP_TERM_BADGES] = Help_Text_DefineBadges,
+ [HELP_TERM_TEXT_SPEED] = Help_Text_DefineTextSpeed,
+ [HELP_TERM_BATTLE_SCENE] = Help_Text_DefineBattleScene,
+ [HELP_TERM_BATTLE_STYLE] = Help_Text_DefineBattleStyle,
+ [HELP_TERM_SOUND] = Help_Text_DefineSound,
+ [HELP_TERM_BUTTON_MODE] = Help_Text_DefineButtonMode,
+ [HELP_TERM_FRAME] = Help_Text_DefineFrame,
+ [HELP_TERM_CANCEL] = Help_Text_DefineCancel2,
+ [HELP_TERM_TM] = Help_Text_DefineTM,
+ [HELP_TERM_HM] = Help_Text_DefineHM,
+ [HELP_TERM_HM_MOVE] = Help_Text_DefineHMMove,
+ [HELP_TERM_EVOLUTION] = Help_Text_DefineEvolution,
+ [HELP_TERM_STATUS_PROBLEM] = Help_Text_DefineStatusProblem,
+ [HELP_TERM_POKEMON] = Help_Text_DefinePokemon,
+ [HELP_TERM_ID_NO2] = Help_Text_DefineIDNo2,
+ [HELP_TERM_MONEY2] = Help_Text_DefineMoney2,
+ [HELP_TERM_BADGES2] = Help_Text_DefineBadges2
+};
+
+// Submenu IDs for TOPIC_ABOUT_GAME
+enum
+{
+ HELP_THE_HELP_SYSTEM = 1,
+ HELP_THE_GAME,
+ HELP_WIRELESS_ADAPTER,
+ HELP_GAME_FUNDAMENTALS_1,
+ HELP_GAME_FUNDAMENTALS_2,
+ HELP_GAME_FUNDAMENTALS_3,
+ HELP_WHAT_ARE_POKEMON,
+};
+
+static const u8 *const sHelpSystemGeneralTopicTextPtrs[] = {
+ [HELP_NONE] = NULL,
+ [HELP_THE_HELP_SYSTEM] = Help_Text_TheHelpSystem,
+ [HELP_THE_GAME] = Help_Text_TheGame,
+ [HELP_WIRELESS_ADAPTER] = Help_Text_WirelessAdapter,
+ [HELP_GAME_FUNDAMENTALS_1] = Help_Text_GameFundamentals1,
+ [HELP_GAME_FUNDAMENTALS_2] = Help_Text_GameFundamentals2,
+ [HELP_GAME_FUNDAMENTALS_3] = Help_Text_GameFundamentals3,
+ [HELP_WHAT_ARE_POKEMON] = Help_Text_WhatArePokemon
+};
+
+static const u8 *const sHelpSystemGeneralTopicDescriptionTextPtrs[] = {
+ [HELP_NONE] = NULL,
+ [HELP_THE_HELP_SYSTEM] = Help_Text_DescTheHelpSystem,
+ [HELP_THE_GAME] = Help_Text_DescTheGame,
+ [HELP_WIRELESS_ADAPTER] = Help_Text_DescWirelessAdapter,
+ [HELP_GAME_FUNDAMENTALS_1] = Help_Text_DescGameFundamentals1,
+ [HELP_GAME_FUNDAMENTALS_2] = Help_Text_DescGameFundamentals2,
+ [HELP_GAME_FUNDAMENTALS_3] = Help_Text_DescGameFundamentals3,
+ [HELP_WHAT_ARE_POKEMON] = Help_Text_DescWhatArePokemon
+};
+
+// An enum for the type matchups isn't necessary, when used they're always used in their entirety
+// Macro below is used to reference the entire group at once
+#define HELP_TYPE_MATCHUPS \
+ 1, \
+ 2, 3, \
+ 4, 5, \
+ 6, 7, \
+ 8, 9, \
+ 10, 11, \
+ 12, 13, \
+ 14, 15, \
+ 16, 17, \
+ 18, 19, \
+ 20, 21, \
+ 22, 23, \
+ 24, 25, \
+ 26, 27, \
+ 28, 29, \
+ 30, 31, \
+ 32, 33, \
+ 34, 35 \
+
+static const u8 *const sHelpSystemTypeMatchupTextPtrs[] = {
+ [HELP_NONE] = NULL,
+ [1] = Help_Text_UsingTypeMatchupList,
+ [2] = Help_Text_OwnMoveDark,
+ [3] = Help_Text_OwnPokemonDark,
+ [4] = Help_Text_OwnMoveRock,
+ [5] = Help_Text_OwnPokemonRock,
+ [6] = Help_Text_OwnMovePsychic,
+ [7] = Help_Text_OwnPokemonPsychic,
+ [8] = Help_Text_OwnMoveFighting,
+ [9] = Help_Text_OwnPokemonFighting,
+ [10] = Help_Text_OwnMoveGrass,
+ [11] = Help_Text_OwnPokemonGrass,
+ [12] = Help_Text_OwnMoveGhost,
+ [13] = Help_Text_OwnPokemonGhost,
+ [14] = Help_Text_OwnMoveIce,
+ [15] = Help_Text_OwnPokemonIce,
+ [16] = Help_Text_OwnMoveGround,
+ [17] = Help_Text_OwnPokemonGround,
+ [18] = Help_Text_OwnMoveElectric,
+ [19] = Help_Text_OwnPokemonElectric,
+ [20] = Help_Text_OwnMovePoison,
+ [21] = Help_Text_OwnPokemonPoison,
+ [22] = Help_Text_OwnMoveDragon,
+ [23] = Help_Text_OwnPokemonDragon,
+ [24] = Help_Text_OwnMoveNormal,
+ [25] = Help_Text_OwnPokemonNormal,
+ [26] = Help_Text_OwnMoveSteel,
+ [27] = Help_Text_OwnPokemonSteel,
+ [28] = Help_Text_OwnMoveFlying,
+ [29] = Help_Text_OwnPokemonFlying,
+ [30] = Help_Text_OwnMoveFire,
+ [31] = Help_Text_OwnPokemonFire,
+ [32] = Help_Text_OwnMoveWater,
+ [33] = Help_Text_OwnPokemonWater,
+ [34] = Help_Text_OwnMoveBug,
+ [35] = Help_Text_OwnPokemonBug
+};
+
+static const u8 *const sHelpSystemTypeMatchupDescriptionTextPtrs[] = {
+ [HELP_NONE] = NULL,
+ [1] = Help_Text_HowToUseTypeMatchupList,
+ [2] = Help_Text_TypeMatchupOwnMoveDark,
+ [3] = Help_Text_TypeMatchupOwnPokemonDark,
+ [4] = Help_Text_TypeMatchupOwnMoveRock,
+ [5] = Help_Text_TypeMatchupOwnPokemonRock,
+ [6] = Help_Text_TypeMatchupOwnMovePsychic,
+ [7] = Help_Text_TypeMatchupOwnPokemonPsychic,
+ [8] = Help_Text_TypeMatchupOwnMoveFighting,
+ [9] = Help_Text_TypeMatchupOwnPokemonFighting,
+ [10] = Help_Text_TypeMatchupOwnMoveGrass,
+ [11] = Help_Text_TypeMatchupOwnPokemonGrass,
+ [12] = Help_Text_TypeMatchupOwnMoveGhost,
+ [13] = Help_Text_TypeMatchupOwnPokemonGhost,
+ [14] = Help_Text_TypeMatchupOwnMoveIce,
+ [15] = Help_Text_TypeMatchupOwnPokemonIce,
+ [16] = Help_Text_TypeMatchupOwnMoveGround,
+ [17] = Help_Text_TypeMatchupOwnPokemonGround,
+ [18] = Help_Text_TypeMatchupOwnMoveElectric,
+ [19] = Help_Text_TypeMatchupOwnPokemonElectric,
+ [20] = Help_Text_TypeMatchupOwnMovePoison,
+ [21] = Help_Text_TypeMatchupOwnPokemonPoison,
+ [22] = Help_Text_TypeMatchupOwnMoveDragon,
+ [23] = Help_Text_TypeMatchupOwnPokemonDragon,
+ [24] = Help_Text_TypeMatchupOwnMoveNormal,
+ [25] = Help_Text_TypeMatchupOwnPokemonNormal,
+ [26] = Help_Text_TypeMatchupOwnMoveSteel,
+ [27] = Help_Text_TypeMatchupOwnPokemonSteel,
+ [28] = Help_Text_TypeMatchupOwnMoveFlying,
+ [29] = Help_Text_TypeMatchupOwnPokemonFlying,
+ [30] = Help_Text_TypeMatchupOwnMoveFire,
+ [31] = Help_Text_TypeMatchupOwnPokemonFire,
+ [32] = Help_Text_TypeMatchupOwnMoveWater,
+ [33] = Help_Text_TypeMatchupOwnPokemonWater,
+ [34] = Help_Text_TypeMatchupOwnMoveBug,
+ [35] = Help_Text_TypeMatchupOwnPokemonBug
+};
+
+static const u8 sAboutGame_TitleScreen[] = {
+ HELP_THE_HELP_SYSTEM,
+ HELP_THE_GAME,
+ HELP_WIRELESS_ADAPTER,
+ HELP_END
+};
+
+static const u8 sAboutGame_NewGame[] = {
+ HELP_THE_HELP_SYSTEM,
+ HELP_THE_GAME,
+ HELP_WIRELESS_ADAPTER,
+ HELP_END
+};
+
+static const u8 sHowTo_NamingScreen[] = {
+ HELP_ENTERING_NAME,
+ HELP_END
+};
+
+static const u8 sAboutGame_NamingScreen[] = {
+ HELP_THE_HELP_SYSTEM,
+ HELP_THE_GAME,
+ HELP_WIRELESS_ADAPTER,
+ HELP_END
+};
+
+static const u8 sHowTo_Pokedex[] = {
+ HELP_USING_POKEDEX,
+ HELP_READING_POKEDEX,
+ HELP_END
+};
+
+static const u8 sHowTo_PartyMenu[] = {
+ HELP_USING_POKEMON,
+ HELP_USING_SUMMARY,
+ HELP_USING_SWITCH,
+ HELP_USING_ITEM,
+ HELP_USING_MOVE_OUTSIDE_OF_BATTLE,
+ HELP_END
+};
+
+static const u8 sTerms_PartyMenu[] = {
+ HELP_TERM_LEVEL,
+ HELP_TERM_HP,
+ HELP_END
+};
+
+static const u8 sHowTo_PokemonInfo[] = {
+ HELP_USING_POKEMON,
+ HELP_USING_SUMMARY,
+ HELP_END
+};
+
+static const u8 sTerms_PokemonInfo[] = {
+ HELP_TERM_LEVEL,
+ HELP_TERM_TYPE,
+ HELP_TERM_OT,
+ HELP_TERM_ID_NO,
+ HELP_TERM_ITEM,
+ HELP_TERM_NATURE,
+ HELP_END
+};
+
+static const u8 sTerms_PokemonSkills[] = {
+ HELP_TERM_LEVEL,
+ HELP_TERM_HP,
+ HELP_TERM_ATTACK,
+ HELP_TERM_DEFENSE,
+ HELP_TERM_SPATK,
+ HELP_TERM_SPDEF,
+ HELP_TERM_SPEED,
+ HELP_TERM_EXP,
+ HELP_TERM_ABILITY,
+ HELP_END
+};
+
+static const u8 sTerms_PokemonMoves[] = {
+ HELP_TERM_LEVEL,
+ HELP_TERM_MOVES,
+ HELP_TERM_TYPE,
+ HELP_TERM_MOVE_TYPE,
+ HELP_TERM_PP,
+ HELP_TERM_POWER,
+ HELP_TERM_ACCURACY,
+ HELP_END
+};
+
+static const u8 sHowTo_Bag[] = {
+ HELP_USING_BAG,
+ HELP_USING_AN_ITEM,
+ HELP_USING_KEYITEM,
+ HELP_REGISTER_KEY_ITEM,
+ HELP_USING_POKEBALL,
+ HELP_USING_POTION,
+ HELP_USING_TOWN_MAP,
+ HELP_USING_TM,
+ HELP_USING_HM,
+ HELP_RIDING_BICYCLE,
+ HELP_END
+};
+
+static const u8 sTerms_Bag[] = {
+ HELP_TERM_ITEMS,
+ HELP_TERM_KEYITEMS,
+ HELP_TERM_POKEBALLS,
+ HELP_END
+};
+
+static const u8 sHowTo_TrainerCardFront[] = {
+ HELP_USING_PLAYER,
+ HELP_END
+};
+
+static const u8 sTerms_TrainerCardFront[] = {
+ HELP_TERM_ID_NO,
+ HELP_TERM_MONEY,
+ HELP_TERM_POKEDEX,
+ HELP_TERM_PLAY_TIME,
+ HELP_TERM_BADGES,
+ HELP_END
+};
+
+static const u8 sHowTo_TrainerCardBack[] = {
+ HELP_USING_PLAYER,
+ HELP_END
+};
+
+static const u8 sHowTo_Save[] = {
+ HELP_USING_SAVE,
+ HELP_END
+};
+
+static const u8 sTerms_Save[] = {
+ HELP_TERM_BADGES2,
+ HELP_TERM_POKEDEX,
+ HELP_TERM_PLAY_TIME,
+ HELP_END
+};
+
+static const u8 sHowTo_Options[] = {
+ HELP_USING_OPTION,
+ HELP_END
+};
+
+static const u8 sTerms_Options[] = {
+ HELP_TERM_TEXT_SPEED,
+ HELP_TERM_BATTLE_SCENE,
+ HELP_TERM_BATTLE_STYLE,
+ HELP_TERM_SOUND,
+ HELP_TERM_BUTTON_MODE,
+ HELP_TERM_FRAME,
+ HELP_TERM_CANCEL,
+ HELP_END
+};
+
+static const u8 sWhatToDo_PlayersHouse[] = {
+ HELP_WHAT_SHOULD_I_BE_DOING,
+ HELP_CANT_GET_OUT_OF_ROOM,
+ HELP_CANT_FIND_PERSON_I_WANT,
+ HELP_END
+};
+
+static const u8 sAboutGame_PlayersHouse[] = {
+ HELP_THE_HELP_SYSTEM,
+ HELP_THE_GAME,
+ HELP_WIRELESS_ADAPTER,
+ HELP_WHAT_ARE_POKEMON,
+ HELP_END
+};
+
+static const u8 sWhatToDo_OaksLab[] = {
+ HELP_WHAT_SHOULD_I_BE_DOING,
+ HELP_CANT_FIND_PERSON_I_WANT,
+ HELP_TALKED_TO_EVERYONE_NOW_WHAT,
+ HELP_WHAT_HAPPENED_TO_ITEM_I_GOT,
+ HELP_WANT_TO_END_GAME,
+ HELP_END
+};
+
+static const u8 sHowTo_OaksLab[] = {
+ HELP_OPENING_MENU,
+ HELP_USING_POKEDEX,
+ HELP_USING_POKEMON,
+ HELP_USING_SUMMARY,
+ HELP_USING_SWITCH,
+ HELP_USING_ITEM,
+ HELP_USING_BAG,
+ HELP_USING_AN_ITEM,
+ HELP_USING_KEYITEM,
+ HELP_REGISTER_KEY_ITEM,
+ HELP_USING_POKEBALL,
+ HELP_USING_POTION,
+ HELP_USING_TOWN_MAP,
+ HELP_USING_TM,
+ HELP_USING_HM,
+ HELP_USING_PLAYER,
+ HELP_USING_SAVE,
+ HELP_USING_OPTION,
+ HELP_USING_MOVE_OUTSIDE_OF_BATTLE,
+ HELP_END
+};
+
+static const u8 sTerms_OaksLab[] = {
+ HELP_TERM_LEVEL,
+ HELP_TERM_HP,
+ HELP_TERM_EXP,
+ HELP_TERM_MOVES,
+ HELP_TERM_TYPE,
+ HELP_TERM_POKEMON,
+ HELP_END
+};
+
+static const u8 sWhatToDo_PokeCenter[] = {
+ HELP_WHAT_SHOULD_I_BE_DOING,
+ HELP_TALKED_TO_EVERYONE_NOW_WHAT,
+ HELP_SOMEONE_BLOCKING_MY_WAY,
+ HELP_WHAT_ARE_MY_ADVENTURE_BASICS,
+ HELP_WHATS_POKEMON_CENTER,
+ HELP_WHATS_POKEMON_MART,
+ HELP_WHAT_HAPPENED_TO_ITEM_I_GOT,
+ HELP_WANT_TO_END_GAME,
+ HELP_END
+};
+
+static const u8 sHowTo_PokeCenter[] = {
+ HELP_OPENING_MENU,
+ HELP_USING_POKEDEX,
+ HELP_USING_POKEMON,
+ HELP_USING_SUMMARY,
+ HELP_USING_SWITCH,
+ HELP_USING_ITEM,
+ HELP_USING_BAG,
+ HELP_USING_AN_ITEM,
+ HELP_USING_KEYITEM,
+ HELP_REGISTER_KEY_ITEM,
+ HELP_USING_POKEBALL,
+ HELP_USING_POTION,
+ HELP_USING_TOWN_MAP,
+ HELP_USING_TM,
+ HELP_USING_HM,
+ HELP_USING_PLAYER,
+ HELP_USING_SAVE,
+ HELP_USING_OPTION,
+ HELP_USING_MOVE_OUTSIDE_OF_BATTLE,
+ HELP_USING_PC,
+ HELP_END
+};
+
+static const u8 sTerms_PokeCenter[] = {
+ HELP_TERM_LEVEL,
+ HELP_TERM_HP,
+ HELP_TERM_EXP,
+ HELP_TERM_MOVES,
+ HELP_TERM_TYPE,
+ HELP_TERM_POKEMON,
+ HELP_END
+};
+
+static const u8 sAboutGame_PokeCenter[] = {
+ HELP_WIRELESS_ADAPTER,
+ HELP_WHAT_ARE_POKEMON,
+ HELP_GAME_FUNDAMENTALS_1,
+ HELP_GAME_FUNDAMENTALS_2,
+ HELP_GAME_FUNDAMENTALS_3,
+ HELP_END
+};
+
+static const u8 sWhatToDo_Mart[] = {
+ HELP_WHAT_SHOULD_I_BE_DOING,
+ HELP_TALKED_TO_EVERYONE_NOW_WHAT,
+ HELP_SOMEONE_BLOCKING_MY_WAY,
+ HELP_WHAT_ARE_MY_ADVENTURE_BASICS,
+ HELP_WHATS_POKEMON_CENTER,
+ HELP_WHATS_POKEMON_MART,
+ HELP_WHAT_HAPPENED_TO_ITEM_I_GOT,
+ HELP_WANT_TO_END_GAME,
+ HELP_END
+};
+
+static const u8 sHowTo_Mart[] = {
+ HELP_OPENING_MENU,
+ HELP_USING_POKEDEX,
+ HELP_USING_POKEMON,
+ HELP_USING_SUMMARY,
+ HELP_USING_SWITCH,
+ HELP_USING_ITEM,
+ HELP_USING_BAG,
+ HELP_USING_AN_ITEM,
+ HELP_USING_KEYITEM,
+ HELP_REGISTER_KEY_ITEM,
+ HELP_USING_POKEBALL,
+ HELP_USING_POTION,
+ HELP_USING_TOWN_MAP,
+ HELP_USING_TM,
+ HELP_USING_HM,
+ HELP_USING_PLAYER,
+ HELP_USING_SAVE,
+ HELP_USING_OPTION,
+ HELP_USING_MOVE_OUTSIDE_OF_BATTLE,
+ HELP_END
+};
+
+static const u8 sTerms_Mart[] = {
+ HELP_TERM_LEVEL,
+ HELP_TERM_HP,
+ HELP_TERM_EXP,
+ HELP_TERM_MOVES,
+ HELP_TERM_TYPE,
+ HELP_TERM_ITEM,
+ HELP_TERM_MONEY,
+ HELP_TERM_ITEMS,
+ HELP_TERM_KEYITEMS,
+ HELP_TERM_POKEBALLS,
+ HELP_TERM_FNT,
+ HELP_END
+};
+
+static const u8 sWhatToDo_Gym[] = {
+ HELP_SOMEONE_BLOCKING_MY_WAY,
+ HELP_WHAT_ARE_MY_ADVENTURE_BASICS,
+ HELP_WHATS_POKEMON_CENTER,
+ HELP_WHATS_POKEMON_MART,
+ HELP_WHAT_HAPPENED_TO_ITEM_I_GOT,
+ HELP_WANT_TO_END_GAME,
+ HELP_END
+};
+
+static const u8 sHowTo_Gym[] = {
+ HELP_OPENING_MENU,
+ HELP_USING_POKEDEX,
+ HELP_USING_POKEMON,
+ HELP_USING_SUMMARY,
+ HELP_USING_SWITCH,
+ HELP_USING_ITEM,
+ HELP_USING_BAG,
+ HELP_USING_AN_ITEM,
+ HELP_USING_KEYITEM,
+ HELP_REGISTER_KEY_ITEM,
+ HELP_USING_POKEBALL,
+ HELP_USING_POTION,
+ HELP_USING_TOWN_MAP,
+ HELP_USING_TM,
+ HELP_USING_HM,
+ HELP_USING_PLAYER,
+ HELP_USING_SAVE,
+ HELP_USING_OPTION,
+ HELP_USING_MOVE_OUTSIDE_OF_BATTLE,
+ HELP_END
+};
+
+static const u8 sTerms_Gym[] = {
+ HELP_TERM_LEVEL,
+ HELP_TERM_HP,
+ HELP_TERM_EXP,
+ HELP_TERM_MOVES,
+ HELP_TERM_TYPE,
+ HELP_TERM_FNT,
+ HELP_END
+};
+
+static const u8 sTypeMatchups_Gym[] = {
+ HELP_TYPE_MATCHUPS,
+ HELP_END
+};
+
+static const u8 sWhatToDo_Indoors[] = {
+ HELP_WHAT_SHOULD_I_BE_DOING,
+ HELP_WHAT_ARE_MY_ADVENTURE_BASICS,
+ HELP_CANT_FIND_PERSON_I_WANT,
+ HELP_TALKED_TO_EVERYONE_NOW_WHAT,
+ HELP_SOMEONE_BLOCKING_MY_WAY,
+ HELP_I_CANT_GO_ON,
+ HELP_HOW_DO_I_PROGRESS,
+ HELP_WHAT_IS_THAT_PERSON_LIKE,
+ HELP_OUT_OF_THINGS_TO_DO,
+ HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT,
+ HELP_WHAT_DO_I_DO_IN_CAVE,
+ HELP_WHATS_POKEMON_CENTER,
+ HELP_WHATS_POKEMON_MART,
+ HELP_WHAT_IS_A_GYM,
+ HELP_WHAT_HAPPENED_TO_ITEM_I_GOT,
+ HELP_WHEN_CAN_I_USE_ITEM,
+ HELP_RAN_OUT_OF_POTIONS,
+ HELP_CAN_I_BUY_POKEBALLS,
+ HELP_WHATS_A_BATTLE,
+ HELP_HOW_DO_I_PREPARE_FOR_BATTLE,
+ HELP_WHAT_IS_A_MONS_VITALITY,
+ HELP_WHERE_DO_MONS_APPEAR,
+ HELP_CANT_CATCH_MONS,
+ HELP_WANT_TO_MAKE_MON_STRONGER,
+ HELP_FOE_MONS_TOO_STRONG,
+ HELP_MY_MONS_ARE_HURT,
+ HELP_WHAT_IS_STATUS_PROBLEM,
+ HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT,
+ HELP_WHATS_A_TRAINER,
+ HELP_HOW_DO_I_WIN_AGAINST_TRAINER,
+ HELP_WHAT_ARE_MOVES,
+ HELP_WANT_TO_ADD_MORE_MOVES,
+ HELP_WHAT_ARE_HIDDEN_MOVES,
+ HELP_WHAT_DOES_HIDDEN_MOVE_DO,
+ HELP_WANT_TO_END_GAME,
+ HELP_END
+};
+
+static const u8 sHowTo_Indoors[] = {
+ HELP_OPENING_MENU,
+ HELP_USING_POKEDEX,
+ HELP_USING_POKEMON,
+ HELP_USING_SUMMARY,
+ HELP_USING_SWITCH,
+ HELP_USING_ITEM,
+ HELP_USING_BAG,
+ HELP_USING_AN_ITEM,
+ HELP_USING_KEYITEM,
+ HELP_REGISTER_KEY_ITEM,
+ HELP_USING_POKEBALL,
+ HELP_USING_POTION,
+ HELP_USING_TOWN_MAP,
+ HELP_USING_TM,
+ HELP_USING_HM,
+ HELP_USING_PLAYER,
+ HELP_USING_SAVE,
+ HELP_USING_OPTION,
+ HELP_USING_MOVE_OUTSIDE_OF_BATTLE,
+ HELP_END
+};
+
+static const u8 sTerms_Indoors[] = {
+ HELP_TERM_LEVEL,
+ HELP_TERM_HP,
+ HELP_TERM_EXP,
+ HELP_TERM_TYPE,
+ HELP_TERM_OT,
+ HELP_TERM_ITEM,
+ HELP_TERM_ABILITY,
+ HELP_TERM_FNT,
+ HELP_END
+};
+
+static const u8 sWhatToDo_Overworld[] = {
+ HELP_WHAT_SHOULD_I_BE_DOING,
+ HELP_WHAT_ARE_MY_ADVENTURE_BASICS,
+ HELP_CANT_FIND_PERSON_I_WANT,
+ HELP_TALKED_TO_EVERYONE_NOW_WHAT,
+ HELP_SOMEONE_BLOCKING_MY_WAY,
+ HELP_I_CANT_GO_ON,
+ HELP_HOW_DO_I_PROGRESS,
+ HELP_WHAT_IS_THAT_PERSON_LIKE,
+ HELP_OUT_OF_THINGS_TO_DO,
+ HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT,
+ HELP_WHAT_DO_I_DO_IN_CAVE,
+ HELP_WHATS_POKEMON_CENTER,
+ HELP_WHATS_POKEMON_MART,
+ HELP_WHAT_IS_A_GYM,
+ HELP_WHAT_HAPPENED_TO_ITEM_I_GOT,
+ HELP_WHEN_CAN_I_USE_ITEM,
+ HELP_RAN_OUT_OF_POTIONS,
+ HELP_CAN_I_BUY_POKEBALLS,
+ HELP_WHATS_A_BATTLE,
+ HELP_HOW_DO_I_PREPARE_FOR_BATTLE,
+ HELP_WHAT_IS_A_MONS_VITALITY,
+ HELP_WHERE_DO_MONS_APPEAR,
+ HELP_CANT_CATCH_MONS,
+ HELP_WANT_TO_MAKE_MON_STRONGER,
+ HELP_FOE_MONS_TOO_STRONG,
+ HELP_MY_MONS_ARE_HURT,
+ HELP_WHAT_IS_STATUS_PROBLEM,
+ HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT,
+ HELP_WHATS_A_TRAINER,
+ HELP_HOW_DO_I_WIN_AGAINST_TRAINER,
+ HELP_WHAT_ARE_MOVES,
+ HELP_WANT_TO_ADD_MORE_MOVES,
+ HELP_WHAT_ARE_HIDDEN_MOVES,
+ HELP_WHAT_DOES_HIDDEN_MOVE_DO,
+ HELP_WANT_TO_END_GAME,
+ HELP_END
+};
+
+static const u8 sHowTo_Overworld[] = {
+ HELP_OPENING_MENU,
+ HELP_USING_POKEDEX,
+ HELP_USING_POKEMON,
+ HELP_USING_BAG,
+ HELP_USING_PLAYER,
+ HELP_USING_SAVE,
+ HELP_USING_OPTION,
+ HELP_USING_MOVE_OUTSIDE_OF_BATTLE,
+ HELP_END
+};
+
+static const u8 sTerms_Overworld[] = {
+ HELP_TERM_LEVEL,
+ HELP_TERM_HP,
+ HELP_TERM_EXP,
+ HELP_TERM_TYPE,
+ HELP_TERM_OT,
+ HELP_TERM_ITEM,
+ HELP_TERM_ABILITY,
+ HELP_TERM_FNT,
+ HELP_TERM_POKEMON,
+ HELP_END
+};
+
+static const u8 sWhatToDo_Dungeon[] = {
+ HELP_WHAT_ARE_MY_ADVENTURE_BASICS,
+ HELP_I_CANT_GO_ON,
+ HELP_HOW_DO_I_PROGRESS,
+ HELP_WHAT_IS_THAT_PERSON_LIKE,
+ HELP_OUT_OF_THINGS_TO_DO,
+ HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT,
+ HELP_WHAT_DO_I_DO_IN_CAVE,
+ HELP_WHATS_POKEMON_CENTER,
+ HELP_WHATS_POKEMON_MART,
+ HELP_WHAT_IS_A_GYM,
+ HELP_WHAT_HAPPENED_TO_ITEM_I_GOT,
+ HELP_WHEN_CAN_I_USE_ITEM,
+ HELP_RAN_OUT_OF_POTIONS,
+ HELP_WHATS_A_BATTLE,
+ HELP_HOW_DO_I_PREPARE_FOR_BATTLE,
+ HELP_WHAT_IS_A_MONS_VITALITY,
+ HELP_WHERE_DO_MONS_APPEAR,
+ HELP_CANT_CATCH_MONS,
+ HELP_WANT_TO_MAKE_MON_STRONGER,
+ HELP_FOE_MONS_TOO_STRONG,
+ HELP_MY_MONS_ARE_HURT,
+ HELP_WHAT_IS_STATUS_PROBLEM,
+ HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT,
+ HELP_WHATS_A_TRAINER,
+ HELP_HOW_DO_I_WIN_AGAINST_TRAINER,
+ HELP_WHAT_ARE_MOVES,
+ HELP_WANT_TO_ADD_MORE_MOVES,
+ HELP_WHAT_ARE_HIDDEN_MOVES,
+ HELP_WHAT_DOES_HIDDEN_MOVE_DO,
+ HELP_WANT_TO_END_GAME,
+ HELP_END
+};
+
+static const u8 sHowTo_Dungeon[] = {
+ HELP_OPENING_MENU,
+ HELP_USING_POKEDEX,
+ HELP_USING_POKEMON,
+ HELP_USING_BAG,
+ HELP_USING_PLAYER,
+ HELP_USING_SAVE,
+ HELP_USING_OPTION,
+ HELP_USING_MOVE_OUTSIDE_OF_BATTLE,
+ HELP_END
+};
+
+static const u8 sTerms_Dungeon[] = {
+ HELP_TERM_LEVEL,
+ HELP_TERM_HP,
+ HELP_TERM_EXP,
+ HELP_TERM_TYPE,
+ HELP_TERM_OT,
+ HELP_TERM_ITEM,
+ HELP_TERM_ABILITY,
+ HELP_TERM_FNT,
+ HELP_END
+};
+
+static const u8 sWhatToDo_Surfing[] = {
+ HELP_I_CANT_GO_ON,
+ HELP_WHAT_IS_THAT_PERSON_LIKE,
+ HELP_OUT_OF_THINGS_TO_DO,
+ HELP_WHAT_IS_A_GYM,
+ HELP_CANT_CATCH_MONS,
+ HELP_WANT_TO_MAKE_MON_STRONGER,
+ HELP_FOE_MONS_TOO_STRONG,
+ HELP_MY_MONS_ARE_HURT,
+ HELP_WHAT_IS_STATUS_PROBLEM,
+ HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT,
+ HELP_WHATS_A_TRAINER,
+ HELP_HOW_DO_I_WIN_AGAINST_TRAINER,
+ HELP_WHAT_ARE_MOVES,
+ HELP_WANT_TO_ADD_MORE_MOVES,
+ HELP_WHAT_ARE_HIDDEN_MOVES,
+ HELP_WHAT_DOES_HIDDEN_MOVE_DO,
+ HELP_WANT_TO_END_GAME,
+ HELP_END
+};
+
+static const u8 sHowTo_Surfing[] = {
+ HELP_OPENING_MENU,
+ HELP_USING_POKEDEX,
+ HELP_USING_POKEMON,
+ HELP_USING_BAG,
+ HELP_USING_PLAYER,
+ HELP_USING_SAVE,
+ HELP_USING_OPTION,
+ HELP_USING_MOVE_OUTSIDE_OF_BATTLE,
+ HELP_END
+};
+
+static const u8 sTerms_Surfing[] = {
+ HELP_TERM_LEVEL,
+ HELP_TERM_HP,
+ HELP_TERM_EXP,
+ HELP_TERM_TYPE,
+ HELP_TERM_OT,
+ HELP_TERM_ITEM,
+ HELP_TERM_ABILITY,
+ HELP_TERM_FNT,
+ HELP_END
+};
+
+static const u8 sWhatToDo_WildBattle[] = {
+ HELP_WHATS_A_BATTLE,
+ HELP_WHAT_ARE_MOVES,
+ HELP_WHAT_MOVES_SHOULD_I_USE,
+ HELP_WHAT_IS_A_MONS_VITALITY,
+ HELP_MY_MONS_ARE_HURT,
+ HELP_CANT_CATCH_MONS,
+ HELP_CAN_I_BUY_POKEBALLS,
+ HELP_RAN_OUT_OF_POTIONS,
+ HELP_WANT_TO_MAKE_MON_STRONGER,
+ HELP_FOE_MONS_TOO_STRONG,
+ HELP_WHAT_IS_STATUS_PROBLEM,
+ HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT,
+ HELP_END
+};
+
+static const u8 sHowTo_WildBattle[] = {
+ HELP_USING_FIGHT,
+ HELP_USING_POKEMON2,
+ HELP_USING_SHIFT,
+ HELP_USING_SUMMARY2,
+ HELP_USING_BAG2,
+ HELP_USING_AN_ITEM,
+ HELP_USING_POKEBALL,
+ HELP_USING_RUN,
+ HELP_END
+};
+
+static const u8 sTerms_WildBattle[] = {
+ HELP_TERM_LEVEL,
+ HELP_TERM_HP,
+ HELP_TERM_EXP,
+ HELP_TERM_MOVES,
+ HELP_TERM_ATTACK,
+ HELP_TERM_DEFENSE,
+ HELP_TERM_SPATK,
+ HELP_TERM_SPDEF,
+ HELP_TERM_SPEED,
+ HELP_TERM_TYPE,
+ HELP_TERM_ABILITY,
+ HELP_TERM_MOVE_TYPE,
+ HELP_TERM_PP,
+ HELP_TERM_POWER,
+ HELP_TERM_ACCURACY,
+ HELP_TERM_STATUS_PROBLEM,
+ HELP_TERM_FNT,
+ HELP_END
+};
+
+static const u8 sTypeMatchups_WildBattle[] = {
+ HELP_TYPE_MATCHUPS,
+ HELP_END
+};
+
+static const u8 sWhatToDo_TrainerBattleSingle[] = {
+ HELP_WHATS_A_BATTLE,
+ HELP_WHAT_ARE_MOVES,
+ HELP_WHAT_MOVES_SHOULD_I_USE,
+ HELP_WHAT_IS_A_MONS_VITALITY,
+ HELP_MY_MONS_ARE_HURT,
+ HELP_RAN_OUT_OF_POTIONS,
+ HELP_WANT_TO_MAKE_MON_STRONGER,
+ HELP_FOE_MONS_TOO_STRONG,
+ HELP_WHAT_IS_STATUS_PROBLEM,
+ HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT,
+ HELP_END
+};
+
+static const u8 sHowTo_TrainerBattleSingle[] = {
+ HELP_USING_FIGHT,
+ HELP_USING_POKEMON2,
+ HELP_USING_SHIFT,
+ HELP_USING_SUMMARY2,
+ HELP_USING_BAG2,
+ HELP_USING_AN_ITEM,
+ HELP_USING_RUN,
+ HELP_END
+};
+
+static const u8 sTerms_TrainerBattleSingle[] = {
+ HELP_TERM_LEVEL,
+ HELP_TERM_HP,
+ HELP_TERM_EXP,
+ HELP_TERM_MOVES,
+ HELP_TERM_ATTACK,
+ HELP_TERM_DEFENSE,
+ HELP_TERM_SPATK,
+ HELP_TERM_SPDEF,
+ HELP_TERM_SPEED,
+ HELP_TERM_TYPE,
+ HELP_TERM_ABILITY,
+ HELP_TERM_MOVE_TYPE,
+ HELP_TERM_PP,
+ HELP_TERM_POWER,
+ HELP_TERM_ACCURACY,
+ HELP_TERM_STATUS_PROBLEM,
+ HELP_TERM_FNT,
+ HELP_END
+};
+
+static const u8 sTypeMatchups_TrainerBattleSingle[] = {
+ HELP_TYPE_MATCHUPS,
+ HELP_END
+};
+
+static const u8 sWhatToDo_TrainerBattleDouble[] = {
+ HELP_WHATS_A_BATTLE,
+ HELP_WHAT_ARE_MOVES,
+ HELP_WHAT_MOVES_SHOULD_I_USE,
+ HELP_WHAT_IS_A_MONS_VITALITY,
+ HELP_MY_MONS_ARE_HURT,
+ HELP_RAN_OUT_OF_POTIONS,
+ HELP_WANT_TO_MAKE_MON_STRONGER,
+ HELP_FOE_MONS_TOO_STRONG,
+ HELP_WHAT_IS_STATUS_PROBLEM,
+ HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT,
+ HELP_END
+};
+
+static const u8 sHowTo_TrainerBattleDouble[] = {
+ HELP_USING_FIGHT,
+ HELP_USING_POKEMON2,
+ HELP_USING_SHIFT,
+ HELP_USING_SUMMARY2,
+ HELP_USING_BAG2,
+ HELP_USING_AN_ITEM,
+ HELP_USING_RUN,
+ HELP_END
+};
+
+static const u8 sTerms_TrainerBattleDouble[] = {
+ HELP_TERM_LEVEL,
+ HELP_TERM_HP,
+ HELP_TERM_EXP,
+ HELP_TERM_MOVES,
+ HELP_TERM_ATTACK,
+ HELP_TERM_DEFENSE,
+ HELP_TERM_SPATK,
+ HELP_TERM_SPDEF,
+ HELP_TERM_SPEED,
+ HELP_TERM_TYPE,
+ HELP_TERM_ABILITY,
+ HELP_TERM_MOVE_TYPE,
+ HELP_TERM_PP,
+ HELP_TERM_POWER,
+ HELP_TERM_ACCURACY,
+ HELP_TERM_STATUS_PROBLEM,
+ HELP_TERM_FNT,
+ HELP_END
+};
+
+static const u8 sTypeMatchups_TrainerBattleDouble[] = {
+ HELP_TYPE_MATCHUPS,
+ HELP_END
+};
+
+static const u8 sWhatToDo_SafariBattle[] = {
+ HELP_WHAT_DO_I_DO_IN_SAFARI,
+ HELP_WHAT_ARE_SAFARI_RULES,
+ HELP_WANT_TO_END_SAFARI,
+ HELP_END
+};
+
+static const u8 sHowTo_SafariBattle[] = {
+ HELP_USING_BALL,
+ HELP_USING_BAIT,
+ HELP_USING_ROCK,
+ HELP_USING_RUN,
+ HELP_END
+};
+
+static const u8 sTerms_SafariBattle[] = {
+ HELP_TERM_LEVEL,
+ HELP_TERM_HP,
+ HELP_TERM_EXP,
+ HELP_TERM_MOVES,
+ HELP_TERM_ATTACK,
+ HELP_TERM_DEFENSE,
+ HELP_TERM_SPATK,
+ HELP_TERM_SPDEF,
+ HELP_TERM_SPEED,
+ HELP_TERM_TYPE,
+ HELP_TERM_ABILITY,
+ HELP_TERM_MOVE_TYPE,
+ HELP_TERM_PP,
+ HELP_TERM_POWER,
+ HELP_TERM_ACCURACY,
+ HELP_END
+};
+
+static const u8 sTypeMatchups_SafariBattle[] = {
+ HELP_TYPE_MATCHUPS,
+ HELP_END
+};
+
+static const u8 sHowTo_PC[] = {
+ HELP_USING_PC,
+ HELP_USING_BILLS_PC,
+ HELP_USING_WITHDRAW,
+ HELP_USING_DEPOSIT,
+ HELP_USING_MOVE,
+ HELP_MOVING_ITEMS,
+ HELP_USING_PLAYERS_PC,
+ HELP_USING_WITHDRAW_ITEM,
+ HELP_USING_DEPOSIT_ITEM,
+ HELP_USING_MAILBOX,
+ HELP_USING_PROF_OAKS_PC,
+ HELP_USING_HALL_OF_FAME,
+ HELP_END
+};
+
+static const u8 sHowTo_BillsPC[] = {
+ HELP_USING_PC,
+ HELP_USING_BILLS_PC,
+ HELP_USING_WITHDRAW,
+ HELP_USING_DEPOSIT,
+ HELP_USING_MOVE,
+ HELP_MOVING_ITEMS,
+ HELP_USING_PLAYERS_PC,
+ HELP_USING_WITHDRAW_ITEM,
+ HELP_USING_DEPOSIT_ITEM,
+ HELP_USING_MAILBOX,
+ HELP_USING_PROF_OAKS_PC,
+ HELP_USING_HALL_OF_FAME,
+ HELP_END
+};
+
+static const u8 sHowTo_PlayersPCItems[] = {
+ HELP_USING_PC,
+ HELP_USING_BILLS_PC,
+ HELP_USING_WITHDRAW,
+ HELP_USING_DEPOSIT,
+ HELP_USING_MOVE,
+ HELP_MOVING_ITEMS,
+ HELP_USING_PLAYERS_PC,
+ HELP_USING_WITHDRAW_ITEM,
+ HELP_USING_DEPOSIT_ITEM,
+ HELP_USING_MAILBOX,
+ HELP_USING_PROF_OAKS_PC,
+ HELP_USING_HALL_OF_FAME,
+ HELP_END
+};
+
+static const u8 sHowTo_PlayersPCMailbox[] = {
+ HELP_USING_PC,
+ HELP_USING_BILLS_PC,
+ HELP_USING_WITHDRAW,
+ HELP_USING_DEPOSIT,
+ HELP_USING_MOVE,
+ HELP_MOVING_ITEMS,
+ HELP_USING_PLAYERS_PC,
+ HELP_USING_WITHDRAW_ITEM,
+ HELP_USING_DEPOSIT_ITEM,
+ HELP_USING_MAILBOX,
+ HELP_USING_PROF_OAKS_PC,
+ HELP_USING_HALL_OF_FAME,
+ HELP_END
+};
+
+static const u8 sHowTo_PCMisc[] = {
+ HELP_USING_PC,
+ HELP_USING_BILLS_PC,
+ HELP_USING_WITHDRAW,
+ HELP_USING_DEPOSIT,
+ HELP_USING_MOVE,
+ HELP_MOVING_ITEMS,
+ HELP_USING_PLAYERS_PC,
+ HELP_USING_WITHDRAW_ITEM,
+ HELP_USING_DEPOSIT_ITEM,
+ HELP_USING_MAILBOX,
+ HELP_USING_PROF_OAKS_PC,
+ HELP_USING_HALL_OF_FAME,
+ HELP_END
+};
+
+static const u8 sHowTo_BedroomPC[] = {
+ HELP_USING_HOME_PC,
+ HELP_USING_ITEM_STORAGE,
+ HELP_USING_WITHDRAW_ITEM2,
+ HELP_USING_DEPOSIT_ITEM2,
+ HELP_USING_MAILBOX2,
+ HELP_END
+};
+
+static const u8 sHowTo_BedroomPCItems[] = {
+ HELP_USING_HOME_PC,
+ HELP_USING_ITEM_STORAGE,
+ HELP_USING_WITHDRAW_ITEM2,
+ HELP_USING_DEPOSIT_ITEM2,
+ HELP_USING_MAILBOX2,
+ HELP_END
+};
+
+static const u8 sHowTo_BedroomPCMailbox[] = {
+ HELP_USING_HOME_PC,
+ HELP_USING_ITEM_STORAGE,
+ HELP_USING_WITHDRAW_ITEM2,
+ HELP_USING_DEPOSIT_ITEM2,
+ HELP_USING_MAILBOX2,
+ HELP_END
+};
+
+static const u8 sTerms_Basic[] = {
+ HELP_TERM_LEVEL,
+ HELP_TERM_HP,
+ HELP_TERM_EXP,
+ HELP_TERM_MOVES,
+ HELP_TERM_TM,
+ HELP_TERM_HM_MOVE,
+ HELP_TERM_HM,
+ HELP_TERM_ATTACK,
+ HELP_TERM_DEFENSE,
+ HELP_TERM_SPATK,
+ HELP_TERM_SPDEF,
+ HELP_TERM_SPEED,
+ HELP_TERM_TYPE,
+ HELP_TERM_OT,
+ HELP_TERM_ITEM,
+ HELP_TERM_ABILITY,
+ HELP_TERM_MOVE_TYPE,
+ HELP_TERM_NATURE,
+ HELP_TERM_ID_NO,
+ HELP_TERM_PP,
+ HELP_TERM_POWER,
+ HELP_TERM_ACCURACY,
+ HELP_TERM_STATUS_PROBLEM,
+ HELP_TERM_FNT,
+ HELP_TERM_EVOLUTION,
+ HELP_TERM_ITEMS,
+ HELP_TERM_KEYITEMS,
+ HELP_TERM_POKEBALLS,
+ HELP_TERM_PLAY_TIME,
+ HELP_TERM_MONEY,
+ HELP_TERM_BADGES,
+ HELP_END
+};
+
+
+// Cant get this to match as a 2D array but it probably should be one, [HELPCONTEXT_COUNT][TOPIC_COUNT - 1] (Excludes TOPIC_EXIT)
+static const u8 *const sHelpSystemSubmenuItemLists[HELPCONTEXT_COUNT * (TOPIC_COUNT - 1)] = {
+ NULL, NULL, NULL, NULL, NULL, // HELPCONTEXT_NONE
+ NULL, NULL, NULL, sAboutGame_TitleScreen, NULL, // HELPCONTEXT_TITLE_SCREEN
+ NULL, NULL, NULL, sAboutGame_NewGame, NULL, // HELPCONTEXT_NEW_GAME
+ NULL, sHowTo_NamingScreen, NULL, sAboutGame_NamingScreen, NULL, // HELPCONTEXT_NAMING_SCREEN
+ NULL, sHowTo_Pokedex, NULL, NULL, NULL, // HELPCONTEXT_POKEDEX
+ NULL, sHowTo_PartyMenu, sTerms_PartyMenu, NULL, NULL, // HELPCONTEXT_PARTY_MENU
+ NULL, sHowTo_PokemonInfo, sTerms_PokemonInfo, NULL, NULL, // HELPCONTEXT_POKEMON_INFO
+ NULL, NULL, sTerms_PokemonSkills, NULL, NULL, // HELPCONTEXT_POKEMON_SKILLS
+ NULL, NULL, sTerms_PokemonMoves, NULL, NULL, // HELPCONTEXT_POKEMON_MOVES
+ NULL, sHowTo_Bag, sTerms_Bag, NULL, NULL, // HELPCONTEXT_BAG
+ NULL, sHowTo_TrainerCardFront, sTerms_TrainerCardFront, NULL, NULL, // HELPCONTEXT_TRAINER_CARD_FRONT
+ NULL, sHowTo_TrainerCardBack, NULL, NULL, NULL, // HELPCONTEXT_TRAINER_CARD_BACK
+ NULL, sHowTo_Save, sTerms_Save, NULL, NULL, // HELPCONTEXT_SAVE
+ NULL, sHowTo_Options, sTerms_Options, NULL, NULL, // HELPCONTEXT_OPTIONS
+ sWhatToDo_PlayersHouse, NULL, NULL, sAboutGame_PlayersHouse, NULL, // HELPCONTEXT_PLAYERS_HOUSE
+ sWhatToDo_OaksLab, sHowTo_OaksLab, sTerms_OaksLab, NULL, NULL, // HELPCONTEXT_OAKS_LAB
+ sWhatToDo_PokeCenter, sHowTo_PokeCenter, sTerms_PokeCenter, sAboutGame_PokeCenter, NULL, // HELPCONTEXT_POKECENTER
+ sWhatToDo_Mart, sHowTo_Mart, sTerms_Mart, NULL, NULL, // HELPCONTEXT_MART
+ sWhatToDo_Gym, sHowTo_Gym, sTerms_Gym, NULL, sTypeMatchups_Gym, // HELPCONTEXT_GYM
+ sWhatToDo_Indoors, sHowTo_Indoors, sTerms_Indoors, NULL, NULL, // HELPCONTEXT_INDOORS
+ sWhatToDo_Overworld, sHowTo_Overworld, sTerms_Overworld, NULL, NULL, // HELPCONTEXT_OVERWORLD
+ sWhatToDo_Dungeon, sHowTo_Dungeon, sTerms_Dungeon, NULL, NULL, // HELPCONTEXT_DUNGEON
+ sWhatToDo_Surfing, sHowTo_Surfing, sTerms_Surfing, NULL, NULL, // HELPCONTEXT_SURFING
+ sWhatToDo_WildBattle, sHowTo_WildBattle, sTerms_WildBattle, NULL, sTypeMatchups_WildBattle, // HELPCONTEXT_WILD_BATTLE
+ sWhatToDo_TrainerBattleSingle, sHowTo_TrainerBattleSingle, sTerms_TrainerBattleSingle, NULL, sTypeMatchups_TrainerBattleSingle, // HELPCONTEXT_TRAINER_BATTLE_SINGLE
+ sWhatToDo_TrainerBattleDouble, sHowTo_TrainerBattleDouble, sTerms_TrainerBattleDouble, NULL, sTypeMatchups_TrainerBattleDouble, // HELPCONTEXT_TRAINER_BATTLE_DOUBLE
+ sWhatToDo_SafariBattle, sHowTo_SafariBattle, sTerms_SafariBattle, NULL, sTypeMatchups_SafariBattle, // HELPCONTEXT_SAFARI_BATTLE
+ NULL, sHowTo_PC, NULL, NULL, NULL, // HELPCONTEXT_PC
+ NULL, sHowTo_BillsPC, NULL, NULL, NULL, // HELPCONTEXT_BILLS_PC
+ NULL, sHowTo_PlayersPCItems, NULL, NULL, NULL, // HELPCONTEXT_PLAYERS_PC_ITEMS
+ NULL, sHowTo_PlayersPCMailbox, NULL, NULL, NULL, // HELPCONTEXT_PLAYERS_PC_MAILBOX
+ NULL, sHowTo_PCMisc, NULL, NULL, NULL, // HELPCONTEXT_PC_MISC
+ NULL, sHowTo_BedroomPC, NULL, NULL, NULL, // HELPCONTEXT_BEDROOM_PC
+ NULL, sHowTo_BedroomPCItems, NULL, NULL, NULL, // HELPCONTEXT_BEDROOM_PC_ITEMS
+ NULL, sHowTo_BedroomPCMailbox, NULL, NULL, NULL, // HELPCONTEXT_BEDROOM_PC_MAILBOX
+ NULL, NULL, NULL, NULL, NULL // HELPCONTEXT_UNUSED
};
static const u16 unref_845BCB0[] = INCBIN_U16("graphics/help_system/unk_845BCB0.bin");
-static const u8 gUnknown_845C4B0[] = {
- 3, 0, 1, 2, 4, 5
-};
-
-static const u8 gUnknown_845C4B6[][6] = {
- {0, 0, 0, 0, 0, 1},
- {0, 0, 0, 1, 0, 1},
- {0, 0, 0, 1, 0, 1},
- {0, 1, 0, 1, 0, 1},
- {0, 1, 0, 0, 0, 1},
- {0, 1, 1, 0, 0, 1},
- {0, 1, 1, 0, 0, 1},
- {0, 0, 1, 0, 0, 1},
- {0, 0, 1, 0, 0, 1},
- {0, 1, 1, 0, 0, 1},
- {0, 1, 1, 0, 0, 1},
- {0, 1, 0, 0, 0, 1},
- {0, 1, 1, 0, 0, 1},
- {0, 1, 1, 0, 0, 1},
- {1, 0, 0, 1, 0, 1},
- {1, 1, 1, 0, 0, 1},
- {1, 1, 1, 1, 0, 1},
- {1, 1, 1, 0, 0, 1},
- {1, 1, 1, 0, 1, 1},
- {1, 1, 1, 0, 0, 1},
- {1, 1, 1, 0, 0, 1},
- {1, 1, 1, 0, 0, 1},
- {1, 1, 1, 0, 0, 1},
- {1, 1, 1, 0, 1, 1},
- {1, 1, 1, 0, 1, 1},
- {1, 1, 1, 0, 1, 1},
- {1, 1, 1, 0, 1, 1},
- {0, 1, 0, 0, 0, 1},
- {0, 1, 0, 0, 0, 1},
- {0, 1, 0, 0, 0, 1},
- {0, 1, 0, 0, 0, 1},
- {0, 1, 0, 0, 0, 1},
- {0, 1, 0, 0, 0, 1},
- {0, 1, 0, 0, 0, 1},
- {0, 1, 0, 0, 0, 1},
- {0, 0, 0, 0, 0, 0},
- {0, 0, 0, 0, 0, 0}
+static const u8 sHelpSystemContextTopicOrder[TOPIC_COUNT] = {
+ TOPIC_ABOUT_GAME,
+ TOPIC_WHAT_TO_DO,
+ TOPIC_HOW_TO_DO,
+ TOPIC_TERMS,
+ TOPIC_TYPE_MATCHUP,
+ TOPIC_EXIT
+};
+
+#define CONTEXT_TOPIC_FLAGS(whatToDo, howToDo, terms, aboutGame, typeMatchup, exit) \
+ { \
+ [TOPIC_WHAT_TO_DO] = whatToDo, \
+ [TOPIC_HOW_TO_DO] = howToDo, \
+ [TOPIC_TERMS] = terms, \
+ [TOPIC_ABOUT_GAME] = aboutGame, \
+ [TOPIC_TYPE_MATCHUP] = typeMatchup, \
+ [TOPIC_EXIT] = exit \
+ } \
+
+static const bool8 sHelpSystemContextTopicFlags[HELPCONTEXT_COUNT + 1][TOPIC_COUNT] = {
+ [HELPCONTEXT_NONE] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, FALSE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_TITLE_SCREEN] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, FALSE, TRUE, FALSE, TRUE),
+ [HELPCONTEXT_NEW_GAME] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, FALSE, TRUE, FALSE, TRUE),
+ [HELPCONTEXT_NAMING_SCREEN] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, TRUE, FALSE, TRUE),
+ [HELPCONTEXT_POKEDEX] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_PARTY_MENU] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_POKEMON_INFO] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_POKEMON_SKILLS] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, TRUE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_POKEMON_MOVES] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, TRUE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_BAG] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_TRAINER_CARD_FRONT] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_TRAINER_CARD_BACK] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_SAVE] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_OPTIONS] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_PLAYERS_HOUSE] = CONTEXT_TOPIC_FLAGS( TRUE, FALSE, FALSE, TRUE, FALSE, TRUE),
+ [HELPCONTEXT_OAKS_LAB] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_POKECENTER] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, TRUE, FALSE, TRUE),
+ [HELPCONTEXT_MART] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_GYM] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE),
+ [HELPCONTEXT_INDOORS] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_OVERWORLD] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_DUNGEON] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_SURFING] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_WILD_BATTLE] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE),
+ [HELPCONTEXT_TRAINER_BATTLE_SINGLE] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE),
+ [HELPCONTEXT_TRAINER_BATTLE_DOUBLE] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE),
+ [HELPCONTEXT_SAFARI_BATTLE] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE),
+ [HELPCONTEXT_PC] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_BILLS_PC] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_PLAYERS_PC_ITEMS] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_PLAYERS_PC_MAILBOX] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_PC_MISC] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_BEDROOM_PC] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_BEDROOM_PC_ITEMS] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_BEDROOM_PC_MAILBOX] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE),
+ [HELPCONTEXT_UNUSED] = {},
+ [HELPCONTEXT_COUNT] = {}
};
static const u16 sMartMaps[] = {
@@ -878,41 +1744,45 @@ static const u8 sDungeonMaps[][3] = {
{ MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), 7 }
};
-void HelpSystem_SetSomeVariable(u8 a0)
+void SetHelpContextDontCheckBattle(u8 contextId)
{
- sSomeVariable = a0;
+ sHelpSystemContextId = contextId;
}
-void HelpSystem_SetSomeVariable2(u8 a0)
+void SetHelpContext(u8 contextId)
{
- switch (sSomeVariable)
+ switch (sHelpSystemContextId)
{
- case 23:
- case 24:
- case 25:
- case 26:
- if (a0 == 9 || a0 == 5 || a0 == 6 || a0 == 7 || a0 == 8)
+ case HELPCONTEXT_WILD_BATTLE:
+ case HELPCONTEXT_TRAINER_BATTLE_SINGLE:
+ case HELPCONTEXT_TRAINER_BATTLE_DOUBLE:
+ case HELPCONTEXT_SAFARI_BATTLE:
+ if (contextId == HELPCONTEXT_BAG
+ || contextId == HELPCONTEXT_PARTY_MENU
+ || contextId == HELPCONTEXT_POKEMON_INFO
+ || contextId == HELPCONTEXT_POKEMON_SKILLS
+ || contextId == HELPCONTEXT_POKEMON_MOVES)
break;
// fallthrough
default:
- sSomeVariable = a0;
+ sHelpSystemContextId = contextId;
break;
}
}
-void Special_SetSomeVariable(void)
+void Script_SetHelpContext(void)
{
- sSomeVariable = gSpecialVar_0x8004;
+ sHelpSystemContextId = gSpecialVar_0x8004;
}
-void HelpSystem_BackupSomeVariable(void)
+void BackupHelpContext(void)
{
- gSomeVariableBackup = sSomeVariable;
+ gHelpContextIdBackup = sHelpSystemContextId;
}
-void HelpSystem_RestoreSomeVariable(void)
+void RestoreHelpContext(void)
{
- sSomeVariable = gSomeVariableBackup;
+ sHelpSystemContextId = gHelpContextIdBackup;
}
static bool32 IsInMartMap(void)
@@ -943,7 +1813,7 @@ static bool8 IsInDungeonMap(void)
{
u8 i, j;
- for (i = 0; i < 16; i++)
+ for (i = 0; i < NELEMS(sDungeonMaps); i++)
{
for (j = 0; j < sDungeonMaps[i][2]; j++)
{
@@ -959,42 +1829,52 @@ static bool8 IsInDungeonMap(void)
return FALSE;
}
-void sub_812B35C(void)
+#define IN_PLAYERS_HOUSE \
+ ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_1F) \
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_1F)) \
+ || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_2F) \
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_2F))) \
+
+ #define IN_OAKS_LAB \
+ (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PROFESSOR_OAKS_LAB) \
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PROFESSOR_OAKS_LAB)) \
+
+void SetHelpContextForMap(void)
{
- sub_812B4B8();
+ HelpSystem_EnableToggleWithRButton();
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
- HelpSystem_SetSomeVariable2(0x16);
+ SetHelpContext(HELPCONTEXT_SURFING);
else if (IsInDungeonMap())
- HelpSystem_SetSomeVariable2(0x15);
- else if (is_light_level_8_or_9(gMapHeader.mapType))
+ SetHelpContext(HELPCONTEXT_DUNGEON);
+ else if (IsMapTypeIndoors(gMapHeader.mapType))
{
- if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_1F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_1F)) || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_2F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_2F)))
- HelpSystem_SetSomeVariable2(0x0E);
- else if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PROFESSOR_OAKS_LAB) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PROFESSOR_OAKS_LAB))
- HelpSystem_SetSomeVariable2(0x0F);
+ if (IN_PLAYERS_HOUSE)
+ SetHelpContext(HELPCONTEXT_PLAYERS_HOUSE);
+ else if (IN_OAKS_LAB)
+ SetHelpContext(HELPCONTEXT_OAKS_LAB);
else if (IsCurMapPokeCenter() == TRUE)
- HelpSystem_SetSomeVariable2(0x10);
+ SetHelpContext(HELPCONTEXT_POKECENTER);
else if (IsInMartMap() == TRUE)
- HelpSystem_SetSomeVariable2(0x11);
+ SetHelpContext(HELPCONTEXT_MART);
else if (IsInGymMap() == TRUE)
- HelpSystem_SetSomeVariable2(0x12);
+ SetHelpContext(HELPCONTEXT_GYM);
else
- HelpSystem_SetSomeVariable2(0x13);
+ SetHelpContext(HELPCONTEXT_INDOORS);
}
else
- HelpSystem_SetSomeVariable2(0x14);
+ SetHelpContext(HELPCONTEXT_OVERWORLD);
}
-bool8 sub_812B40C(void)
+bool8 HelpSystem_UpdateHasntSeenIntro(void)
{
- if (gUnknown_203B0EE == 1)
+ if (sSeenHelpSystemIntro == TRUE)
return FALSE;
if (gSaveFileStatus != SAVE_STATUS_EMPTY && gSaveFileStatus != SAVE_STATUS_INVALID && FlagGet(FLAG_SYS_SAW_HELP_SYSTEM_INTRO))
return FALSE;
FlagSet(FLAG_SYS_SAW_HELP_SYSTEM_INTRO);
- gUnknown_203B0EE = 1;
+ sSeenHelpSystemIntro = TRUE;
return TRUE;
}
@@ -1015,323 +1895,326 @@ void HelpSystem_Enable(void)
if (gQuestLogState != 2 && gQuestLogState != 3)
{
gHelpSystemEnabled = TRUE;
- sub_812B4B8();
+ HelpSystem_EnableToggleWithRButton();
}
}
-void sub_812B4AC(void)
+void HelpSystem_DisableToggleWithRButton(void)
{
- gUnknown_203F175 = 1;
+ gHelpSystemToggleWithRButtonDisabled = TRUE;
}
-void sub_812B4B8(void)
+void HelpSystem_EnableToggleWithRButton(void)
{
- gUnknown_203F175 = 0;
+ gHelpSystemToggleWithRButtonDisabled = FALSE;
}
-static void sub_812B4C4(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+static void ResetHelpSystemListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
- a0->sub.items = a1;
- a0->sub.totalItems = 1;
- a0->sub.maxShowed = 1;
- a0->sub.left = 1;
- a0->sub.top = 4;
+ helpListMenu->sub.items = listMenuItemsBuffer;
+ helpListMenu->sub.totalItems = 1;
+ helpListMenu->sub.maxShowed = 1;
+ helpListMenu->sub.left = 1;
+ helpListMenu->sub.top = 4;
}
-static void sub_812B4D8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+static void BuildAndPrintMainTopicsListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
- sub_812B4C4(a0, a1);
- sub_812B520(a0, a1);
- sub_812BF74(gUnknown_841DFAC);
- HelpSystem_InitListMenuController(a0, 0, gUnknown_3005E9C[2]);
- sub_812BF9C(a0, a1);
+ ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer);
+ BuildMainTopicsListAndMoveToH00(helpListMenu, listMenuItemsBuffer);
+ PrintTextOnPanel2Row52RightAlign(gUnknown_841DFAC);
+ HelpSystem_InitListMenuController(helpListMenu, 0, gHelpSystemState[2]);
+ PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer);
sub_813BDA4(1);
sub_813BD5C(1);
}
-static void sub_812B520(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
u8 i;
- u8 r4 = 0;
- for (i = 0; i < 6; i++)
+ u8 totalItems = 0;
+ for (i = 0; i < TOPIC_COUNT; i++)
{
- if (gUnknown_845C4B6[sSomeVariable][gUnknown_845C4B0[i]] == 1)
+ if (sHelpSystemContextTopicFlags[sHelpSystemContextId][sHelpSystemContextTopicOrder[i]] == TRUE)
{
- a1[r4].label = gUnknown_845B080[gUnknown_845C4B0[i]];
- a1[r4].index = gUnknown_845C4B0[i];
- r4++;
+ listMenuItemsBuffer[totalItems].label = sHelpSystemTopicPtrs[sHelpSystemContextTopicOrder[i]];
+ listMenuItemsBuffer[totalItems].index = sHelpSystemContextTopicOrder[i];
+ totalItems++;
}
}
- a1[r4 - 1].index = -2;
- a0->sub.totalItems = r4;
- a0->sub.maxShowed = r4;
- a0->sub.left = 0;
+ listMenuItemsBuffer[totalItems - 1].index = -2;
+ helpListMenu->sub.totalItems = totalItems;
+ helpListMenu->sub.maxShowed = totalItems;
+ helpListMenu->sub.left = 0;
}
-static void sub_812B5A8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+static void BuildAndPrintSubmenuList(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
sub_813BDE8(0);
sub_813BFC0(0);
sub_813BE78(1);
- sub_812B4C4(a0, a1);
- sub_812B614(a0, a1);
- sub_812BF74(gUnknown_841DFC9);
- HelpSystem_InitListMenuController(a0, a0->field_0C, a0->field_0D);
- HelpSystem_PrintTextAt(gUnknown_845B080[gUnknown_3005E9C[1]], 0, 0);
+ ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer);
+ SetHelpSystemSubmenuItems(helpListMenu, listMenuItemsBuffer);
+ PrintTextOnPanel2Row52RightAlign(gUnknown_841DFC9);
+ HelpSystem_InitListMenuController(helpListMenu, helpListMenu->itemsAbove, helpListMenu->cursorPos);
+ HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[gHelpSystemState[1]], 0, 0);
sub_813BDA4(1);
sub_813BD5C(1);
}
-static void sub_812B614(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
- u8 r6 = 0;
- const u8 * r3 = gUnknown_845B9E0[sSomeVariable * 5 + gUnknown_3005E9C[1]];
+ u8 totalItems = 0;
+ const u8 * submenuItems = sHelpSystemSubmenuItemLists[sHelpSystemContextId * 5 + gHelpSystemState[1]]; // accessing as 2D array
u8 i;
- for (i = 0; r3[i] != 0xFF; i++)
+ for (i = 0; submenuItems[i] != HELP_END; i++)
{
- if (sub_812B780(r3[i]) == TRUE)
+ if (IsHelpSystemSubmenuEnabled(submenuItems[i]) == TRUE)
{
- if (gUnknown_3005E9C[1] == 0)
- a1[r6].label = gUnknown_845B0B0[r3[i]];
- else if (gUnknown_3005E9C[1] == 1)
- a1[r6].label = gUnknown_845B218[r3[i]];
- else if (gUnknown_3005E9C[1] == 2)
- a1[r6].label = gUnknown_845B3A0[r3[i]];
- else if (gUnknown_3005E9C[1] == 3)
- a1[r6].label = gUnknown_845B500[r3[i]];
- else
- a1[r6].label = gUnknown_845B540[r3[i]];
- a1[r6].index = r3[i];
- r6++;
+ if (gHelpSystemState[1] == TOPIC_WHAT_TO_DO)
+ listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedQuestionTextPtrs[submenuItems[i]];
+ else if (gHelpSystemState[1] == TOPIC_HOW_TO_DO)
+ listMenuItemsBuffer[totalItems].label = sHelpSystemMenuTopicTextPtrs[submenuItems[i]];
+ else if (gHelpSystemState[1] == TOPIC_TERMS)
+ listMenuItemsBuffer[totalItems].label = sHelpSystemTermTextPtrs[submenuItems[i]];
+ else if (gHelpSystemState[1] == TOPIC_ABOUT_GAME)
+ listMenuItemsBuffer[totalItems].label = sHelpSystemGeneralTopicTextPtrs[submenuItems[i]];
+ else // TOPIC_TYPE_MATCHUP
+ listMenuItemsBuffer[totalItems].label = sHelpSystemTypeMatchupTextPtrs[submenuItems[i]];
+ listMenuItemsBuffer[totalItems].index = submenuItems[i];
+ totalItems++;
}
}
- if (sub_812B754() == TRUE)
+ if (HelpSystem_ShouldShowBasicTerms() == TRUE)
{
- for (i = 0, r3 = gUnknown_845B9BE; r3[i] != 0xFF; i++)
+ for (i = 0, submenuItems = sTerms_Basic; submenuItems[i] != HELP_END; i++)
{
- a1[r6].label = gUnknown_845B3A0[r3[i]];
- a1[r6].index = r3[i];
- r6++;
+ listMenuItemsBuffer[totalItems].label = sHelpSystemTermTextPtrs[submenuItems[i]];
+ listMenuItemsBuffer[totalItems].index = submenuItems[i];
+ totalItems++;
}
}
- a1[r6].label = gUnknown_81B2E6F;
- a1[r6].index = -2;
- r6++;
- a0->sub.totalItems = r6;
- a0->sub.maxShowed = 7;
- a0->sub.left = 0;
- a0->sub.top = 21;
+ listMenuItemsBuffer[totalItems].label = Help_Text_Cancel;
+ listMenuItemsBuffer[totalItems].index = -2;
+ totalItems++;
+ helpListMenu->sub.totalItems = totalItems;
+ helpListMenu->sub.maxShowed = 7;
+ helpListMenu->sub.left = 0;
+ helpListMenu->sub.top = 21;
}
-static bool8 sub_812B754(void)
+static bool8 HelpSystem_ShouldShowBasicTerms(void)
{
- if (FlagGet(FLAG_DEFEATED_BROCK) == TRUE && gUnknown_3005E9C[1] == 2)
+ if (FlagGet(FLAG_DEFEATED_BROCK) == TRUE && gHelpSystemState[1] == TOPIC_TERMS)
return TRUE;
return FALSE;
}
-static bool8 sub_812B780(u8 id)
+static bool8 IsHelpSystemSubmenuEnabled(u8 id)
{
u8 i = 0;
- if (gUnknown_3005E9C[1] == 0)
+ if (gHelpSystemState[1] == TOPIC_WHAT_TO_DO)
{
switch (id)
{
- case 1:
- case 2:
- case 3:
- case 5:
- case 8:
- case 34:
- case 38:
- case 41:
- case 42:
- case 43:
+ case HELP_PLAYING_FOR_FIRST_TIME:
+ case HELP_WHAT_SHOULD_I_BE_DOING:
+ case HELP_CANT_GET_OUT_OF_ROOM:
+ case HELP_TALKED_TO_EVERYONE_NOW_WHAT:
+ case HELP_OUT_OF_THINGS_TO_DO:
+ case HELP_NOTHING_I_WANT_TO_KNOW:
+ case HELP_WHATS_A_MON:
+ case HELP_WHAT_DO_I_DO_IN_SAFARI:
+ case HELP_WHAT_ARE_SAFARI_RULES:
+ case HELP_WANT_TO_END_SAFARI:
return TRUE;
- case 4:
+ case HELP_CANT_FIND_PERSON_I_WANT:
return FlagGet(FLAG_VISITED_OAKS_LAB);
- case 6:
- case 10:
- case 16:
- case 19:
- case 22:
- case 35:
- case 36:
+ case HELP_SOMEONE_BLOCKING_MY_WAY:
+ case HELP_WHAT_ARE_MY_ADVENTURE_BASICS:
+ case HELP_HOW_DO_I_PREPARE_FOR_BATTLE:
+ case HELP_WHAT_IS_STATUS_PROBLEM:
+ case HELP_RAN_OUT_OF_POTIONS:
+ case HELP_WHATS_POKEMON_CENTER:
+ case HELP_WHATS_POKEMON_MART:
return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_CITY);
- case 7:
+ case HELP_I_CANT_GO_ON:
return FlagGet(FLAG_WORLD_MAP_VERMILION_CITY);
- case 11:
- case 24:
+ case HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT:
+ case HELP_WHATS_A_TRAINER:
return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_FOREST);
- case 9:
- case 13:
- case 14:
- case 15:
- case 17:
- case 18:
- case 20:
- case 26:
- case 29:
- case 31:
- case 37:
+ case HELP_WHAT_HAPPENED_TO_ITEM_I_GOT:
+ case HELP_WHEN_CAN_I_USE_ITEM:
+ case HELP_HOW_DO_I_PROGRESS:
+ case HELP_WHATS_A_BATTLE:
+ case HELP_WHAT_IS_A_MONS_VITALITY:
+ case HELP_MY_MONS_ARE_HURT:
+ case HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT:
+ case HELP_WHERE_DO_MONS_APPEAR:
+ case HELP_WHAT_MOVES_SHOULD_I_USE:
+ case HELP_WANT_TO_MAKE_MON_STRONGER:
+ case HELP_WANT_TO_END_GAME:
return FlagGet(FLAG_SYS_POKEMON_GET);
- case 21:
- case 23:
+ case HELP_CANT_CATCH_MONS:
+ case HELP_CAN_I_BUY_POKEBALLS:
return FlagGet(FLAG_SYS_POKEDEX_GET);
- case 12:
- case 25:
- case 27:
- case 30:
- case 32:
- case 33:
+ case HELP_HOW_ARE_CAVES_DIFFERENT:
+ case HELP_WHAT_DO_I_DO_IN_CAVE:
+ case HELP_HOW_DO_I_WIN_AGAINST_TRAINER:
+ case HELP_FOE_MONS_TOO_STRONG:
+ case HELP_WHAT_ARE_MOVES:
+ case HELP_WANT_TO_ADD_MORE_MOVES:
return FlagGet(FLAG_BADGE01_GET);
- case 28:
- case 40:
- return sub_812BB10();
- case 39:
+ case HELP_WHAT_ARE_HIDDEN_MOVES:
+ case HELP_WHAT_DOES_HIDDEN_MOVE_DO:
+ return HasGottenAtLeastOneHM();
+ case HELP_WHAT_IS_THAT_PERSON_LIKE:
return FlagGet(FLAG_GOT_FAME_CHECKER);
- case 44:
+ case HELP_WHAT_IS_A_GYM:
return FlagGet(FLAG_WORLD_MAP_PEWTER_CITY);
}
return FALSE;
}
- if (gUnknown_3005E9C[1] == 1)
+ if (gHelpSystemState[1] == TOPIC_HOW_TO_DO)
{
switch (id)
{
- case 06:
- case 10:
- case 11:
- case 12:
- case 19:
- case 20:
- case 21:
- case 22:
- case 23:
- case 24:
- case 25:
- case 26:
- case 27:
- case 28:
- case 29:
- case 31:
- case 36:
- case 38:
- case 39:
- case 40:
- case 41:
- case 42:
- case 45:
- case 46:
- case 47:
+ case HELP_USING_BAG:
+ case HELP_USING_PLAYER:
+ case HELP_USING_SAVE:
+ case HELP_USING_OPTION:
+ case HELP_ENTERING_NAME:
+ case HELP_USING_PC:
+ case HELP_USING_BILLS_PC:
+ case HELP_USING_WITHDRAW:
+ case HELP_USING_DEPOSIT:
+ case HELP_USING_MOVE:
+ case HELP_MOVING_ITEMS:
+ case HELP_USING_PLAYERS_PC:
+ case HELP_USING_WITHDRAW_ITEM:
+ case HELP_USING_DEPOSIT_ITEM:
+ case HELP_USING_MAILBOX:
+ case HELP_OPENING_MENU:
+ case HELP_USING_BAG2:
+ case HELP_USING_HOME_PC:
+ case HELP_USING_ITEM_STORAGE:
+ case HELP_USING_WITHDRAW_ITEM2:
+ case HELP_USING_DEPOSIT_ITEM2:
+ case HELP_USING_MAILBOX2:
+ case HELP_USING_BALL:
+ case HELP_USING_BAIT:
+ case HELP_USING_ROCK:
return TRUE;
- case 1:
- case 30:
- case 37:
+ case HELP_USING_POKEDEX:
+ case HELP_USING_PROF_OAKS_PC:
+ case HELP_READING_POKEDEX:
return FlagGet(FLAG_SYS_POKEDEX_GET);
- case 14:
+ case HELP_USING_TOWN_MAP:
return CheckBagHasItem(ITEM_TOWN_MAP, 1);
- case 2:
- case 3:
- case 5:
- case 7:
- case 8:
- case 9:
- case 13:
- case 32:
- case 33:
- case 35:
- case 43:
- case 44:
+ case HELP_USING_POKEMON:
+ case HELP_USING_SUMMARY:
+ case HELP_USING_ITEM:
+ case HELP_USING_AN_ITEM:
+ case HELP_USING_KEYITEM:
+ case HELP_USING_POKEBALL:
+ case HELP_USING_POTION:
+ case HELP_USING_FIGHT:
+ case HELP_USING_POKEMON2:
+ case HELP_USING_SUMMARY2:
+ case HELP_USING_RUN:
+ case HELP_REGISTER_KEY_ITEM:
return FlagGet(FLAG_SYS_POKEMON_GET);
- case 4:
- case 34:
+ case HELP_USING_SWITCH:
+ case HELP_USING_SHIFT:
+ // Only show if player has caught mon after starter
if (GetKantoPokedexCount(1) > 1)
return TRUE;
return FALSE;
- case 15:
+ case HELP_USING_TM:
return FlagGet(FLAG_BADGE01_GET);
- case 16:
- case 17:
- return sub_812BB10();
- case 18:
+ case HELP_USING_HM:
+ case HELP_USING_MOVE_OUTSIDE_OF_BATTLE:
+ return HasGottenAtLeastOneHM();
+ case HELP_RIDING_BICYCLE:
return FlagGet(FLAG_GOT_BICYCLE);
- case 48:
+ case HELP_USING_HALL_OF_FAME:
return FlagGet(FLAG_SYS_GAME_CLEAR);
}
return FALSE;
}
- if (gUnknown_3005E9C[1] == 2)
+ if (gHelpSystemState[1] == TOPIC_TERMS)
{
- if (sub_812B754() == TRUE)
+ if (HelpSystem_ShouldShowBasicTerms() == TRUE)
{
- for (i = 0; gUnknown_845B9BE[i] != 0xFF; i++)
+ // After defeating Brock, all basic terms are added
+ // This checks to make sure they arent added twice
+ for (i = 0; sTerms_Basic[i] != HELP_END; i++)
{
- if (gUnknown_845B9BE[i] == id)
+ if (sTerms_Basic[i] == id)
return FALSE;
}
}
switch (id)
{
- case 14:
- case 17:
- case 22:
- case 23:
- case 24:
- case 25:
- case 26:
- case 27:
- case 28:
- case 29:
- case 30:
- case 31:
- case 32:
- case 33:
- case 34:
- case 35:
- case 38:
+ case HELP_TERM_MONEY:
+ case HELP_TERM_ID_NO:
+ case HELP_TERM_ITEMS:
+ case HELP_TERM_KEYITEMS:
+ case HELP_TERM_POKEBALLS:
+ case HELP_TERM_POKEDEX:
+ case HELP_TERM_PLAY_TIME:
+ case HELP_TERM_BADGES:
+ case HELP_TERM_TEXT_SPEED:
+ case HELP_TERM_BATTLE_SCENE:
+ case HELP_TERM_BATTLE_STYLE:
+ case HELP_TERM_SOUND:
+ case HELP_TERM_BUTTON_MODE:
+ case HELP_TERM_FRAME:
+ case HELP_TERM_CANCEL:
+ case HELP_TERM_TM:
+ case HELP_TERM_EVOLUTION:
return TRUE;
- case 1:
- case 2:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- case 10:
- case 11:
- case 12:
- case 13:
- case 16:
- case 19:
- case 20:
- case 21:
+ case HELP_TERM_HP:
+ case HELP_TERM_EXP:
+ case HELP_TERM_ATTACK:
+ case HELP_TERM_DEFENSE:
+ case HELP_TERM_SPATK:
+ case HELP_TERM_SPDEF:
+ case HELP_TERM_SPEED:
+ case HELP_TERM_LEVEL:
+ case HELP_TERM_TYPE:
+ case HELP_TERM_OT:
+ case HELP_TERM_ITEM:
+ case HELP_TERM_ABILITY:
+ case HELP_TERM_NATURE:
+ case HELP_TERM_POWER:
+ case HELP_TERM_ACCURACY:
+ case HELP_TERM_FNT:
return FlagGet(FLAG_SYS_POKEMON_GET);
- case 36:
- case 37:
- return sub_812BB10();
- case 3:
- case 15:
- case 18:
- case 39:
+ case HELP_TERM_HM:
+ case HELP_TERM_HM_MOVE:
+ return HasGottenAtLeastOneHM();
+ case HELP_TERM_MOVES:
+ case HELP_TERM_MOVE_TYPE:
+ case HELP_TERM_PP:
+ case HELP_TERM_STATUS_PROBLEM:
return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_FOREST);
}
return TRUE;
}
- if (gUnknown_3005E9C[1] == 3)
+ if (gHelpSystemState[1] == TOPIC_ABOUT_GAME)
{
switch (id)
{
- case 5:
+ case HELP_GAME_FUNDAMENTALS_2:
return FlagGet(FLAG_BADGE01_GET);
- case 6:
+ case HELP_GAME_FUNDAMENTALS_3:
return FlagGet(FLAG_BADGE02_GET);
}
return TRUE;
}
- if (gUnknown_3005E9C[1] == 4)
+ if (gHelpSystemState[1] == TOPIC_TYPE_MATCHUP)
{
return TRUE;
}
@@ -1339,7 +2222,7 @@ static bool8 sub_812B780(u8 id)
return FALSE;
}
-static bool8 sub_812BB10(void)
+static bool8 HasGottenAtLeastOneHM(void)
{
if (FlagGet(FLAG_GOT_HM01) == TRUE)
return TRUE;
@@ -1358,117 +2241,117 @@ static bool8 sub_812BB10(void)
return FALSE;
}
-bool8 sub_812BB9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+bool8 RunHelpMenuSubroutine(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
- switch (a0->field_0E)
+ switch (helpListMenu->state)
{
case 8:
- return sub_812BC54(a0, a1);
+ return HelpSystemSubroutine_PrintWelcomeMessage(helpListMenu, listMenuItemsBuffer);
case 9:
- return sub_812BC80(a0, a1);
+ return HelpSystemSubroutine_WelcomeWaitButton(helpListMenu, listMenuItemsBuffer);
case 10:
- return sub_812BCA8(a0, a1);
+ return HelpSystemSubroutine_WelcomeEndGotoMenu(helpListMenu, listMenuItemsBuffer);
case 0:
- return sub_812BCD0(a0, a1);
+ return HelpSystemSubroutine_MenuInputHandlerMain(helpListMenu, listMenuItemsBuffer);
case 1:
- return sub_812BD2C(a0, a1);
+ return HelpMenuSubroutine_InitSubmenu(helpListMenu, listMenuItemsBuffer);
case 2:
- return sub_812BD64(a0, a1);
+ return HelpMenuSubroutine_ReturnFromSubmenu(helpListMenu, listMenuItemsBuffer);
case 3:
- return sub_812BD98(a0, a1);
+ return HelpMenuSubroutine_SubmenuInputHandler(helpListMenu, listMenuItemsBuffer);
case 4:
- return sub_812BE10(a0, a1);
+ return HelpMenuSubroutine_HelpItemPrint(helpListMenu, listMenuItemsBuffer);
case 5:
- return sub_812BEEC(a0, a1);
+ return HelpMenuSubroutine_ReturnFromHelpItem(helpListMenu, listMenuItemsBuffer);
case 6:
- return sub_812BF18(a0, a1);
+ return HelpMenuSubroutine_HelpItemWaitButton(helpListMenu, listMenuItemsBuffer);
}
return FALSE;
}
-bool8 sub_812BC54(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+bool8 HelpSystemSubroutine_PrintWelcomeMessage(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
- sub_812BF74(gUnknown_841DFA5);
- sub_812BF5C();
+ PrintTextOnPanel2Row52RightAlign(gUnknown_841DFA5);
+ PrintWelcomeMessageOnPanel1();
sub_813BDA4(1);
sub_813BD5C(1);
- a0->field_0E = 9;
+ helpListMenu->state = 9;
return TRUE;
}
-bool8 sub_812BC80(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+bool8 HelpSystemSubroutine_WelcomeWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
if (JOY_NEW(A_BUTTON))
{
PlaySE(SE_SELECT);
- a0->field_0E = 10;
+ helpListMenu->state = 10;
}
return TRUE;
}
-bool8 sub_812BCA8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+bool8 HelpSystemSubroutine_WelcomeEndGotoMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
- gUnknown_3005E9C[2] = 0;
- sub_812BF94(a0);
- sub_812B4D8(a0, a1);
- a0->field_0E = 0;
+ gHelpSystemState[2] = 0;
+ ResetHelpSystemCursor(helpListMenu);
+ BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer);
+ helpListMenu->state = 0;
return TRUE;
}
-bool8 sub_812BCD0(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+bool8 HelpSystemSubroutine_MenuInputHandlerMain(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
- s32 v0 = HelpSystem_GetMenuInput();
- switch (v0)
+ s32 input = HelpSystem_GetMenuInput();
+ switch (input)
{
case -6:
case -2:
return FALSE;
case -5:
case -4:
- sub_812BF9C(a0, a1);
+ PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer);
break;
case -3:
case -1:
break;
default:
- gUnknown_3005E9C[1] = v0;
- a0->field_0E = 1;
+ gHelpSystemState[1] = input;
+ helpListMenu->state = 1;
break;
}
return TRUE;
}
-bool8 sub_812BD2C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+bool8 HelpMenuSubroutine_InitSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
- gUnknown_3005E9C[0] = 1;
- gUnknown_3005E9C[2] = a0->field_0D;
- sub_812BF94(a0);
- sub_812B5A8(a0, a1);
+ gHelpSystemState[0] = 1;
+ gHelpSystemState[2] = helpListMenu->cursorPos;
+ ResetHelpSystemCursor(helpListMenu);
+ BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer);
sub_813C75C();
HelpSystem_SetInputDelay(2);
- a0->field_0E = 3;
+ helpListMenu->state = 3;
return TRUE;
}
-bool8 sub_812BD64(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+bool8 HelpMenuSubroutine_ReturnFromSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
sub_813C004(0, 0);
sub_813C004(1, 0);
- gUnknown_3005E9C[0] = 0;
- sub_812B4D8(a0, a1);
- a0->field_0E = 0;
+ gHelpSystemState[0] = 0;
+ BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer);
+ helpListMenu->state = 0;
return TRUE;
}
-bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+bool8 HelpMenuSubroutine_SubmenuInputHandler(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
- s32 v0 = HelpSystem_GetMenuInput();
- switch (v0)
+ s32 input = HelpSystem_GetMenuInput();
+ switch (input)
{
case -6:
return FALSE;
case -2:
- a0->field_0E = 2;
+ helpListMenu->state = 2;
break;
case -5:
case -4:
@@ -1476,69 +2359,69 @@ bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
case -1:
break;
default:
- gUnknown_3005E9C[3] = v0;
- a0->field_0E = 4;
+ gHelpSystemState[3] = input;
+ helpListMenu->state = 4;
break;
}
return TRUE;
}
-void sub_812BDEC(void)
+void HelpSystem_PrintTopicLabel(void)
{
- HelpSystem_PrintTextAt(gUnknown_845B080[gUnknown_3005E9C[1]], 0, 0);
+ HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[gHelpSystemState[1]], 0, 0);
}
-bool8 sub_812BE10(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+bool8 HelpMenuSubroutine_HelpItemPrint(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
- gUnknown_3005E9C[0] = 2;
+ gHelpSystemState[0] = 2;
sub_813BDA4(0);
HelpSystem_FillPanel1();
- sub_812BF74(gUnknown_841DFBE);
+ PrintTextOnPanel2Row52RightAlign(gUnknown_841DFBE);
sub_813BDE8(1);
sub_813BEE4(1);
- if (gUnknown_3005E9C[1] == 0)
+ if (gHelpSystemState[1] == TOPIC_WHAT_TO_DO)
{
- HelpSystem_PrintTwoStrings(gUnknown_845B0B0[gUnknown_3005E9C[3]], gUnknown_845B164[gUnknown_3005E9C[3]]);
+ HelpSystem_PrintTwoStrings(sHelpSystemSpecializedQuestionTextPtrs[gHelpSystemState[3]], sHelpSystemSpecializedAnswerTextPtrs[gHelpSystemState[3]]);
}
- else if (gUnknown_3005E9C[1] == 1)
+ else if (gHelpSystemState[1] == TOPIC_HOW_TO_DO)
{
- HelpSystem_PrintTwoStrings(gUnknown_845B218[gUnknown_3005E9C[3]], gUnknown_845B2DC[gUnknown_3005E9C[3]]);
+ HelpSystem_PrintTwoStrings(sHelpSystemMenuTopicTextPtrs[gHelpSystemState[3]], sHelpSystemHowToUseMenuTextPtrs[gHelpSystemState[3]]);
}
- else if (gUnknown_3005E9C[1] == 2)
+ else if (gHelpSystemState[1] == TOPIC_TERMS)
{
- HelpSystem_PrintTwoStrings(gUnknown_845B3A0[gUnknown_3005E9C[3]], gUnknown_845B450[gUnknown_3005E9C[3]]);
+ HelpSystem_PrintTwoStrings(sHelpSystemTermTextPtrs[gHelpSystemState[3]], sHelpSystemTermDefinitionsTextPtrs[gHelpSystemState[3]]);
}
- else if (gUnknown_3005E9C[1] == 3)
+ else if (gHelpSystemState[1] == TOPIC_ABOUT_GAME)
{
- HelpSystem_PrintTwoStrings(gUnknown_845B500[gUnknown_3005E9C[3]], gUnknown_845B520[gUnknown_3005E9C[3]]);
+ HelpSystem_PrintTwoStrings(sHelpSystemGeneralTopicTextPtrs[gHelpSystemState[3]], sHelpSystemGeneralTopicDescriptionTextPtrs[gHelpSystemState[3]]);
}
- else
+ else // TOPIC_TYPE_MATCHUP
{
- HelpSystem_PrintTwoStrings(gUnknown_845B540[gUnknown_3005E9C[3]], gUnknown_845B5D0[gUnknown_3005E9C[3]]);
+ HelpSystem_PrintTwoStrings(sHelpSystemTypeMatchupTextPtrs[gHelpSystemState[3]], sHelpSystemTypeMatchupDescriptionTextPtrs[gHelpSystemState[3]]);
}
sub_813BDA4(1);
sub_813BD5C(1);
- a0->field_0E = 6;
+ helpListMenu->state = 6;
return TRUE;
}
-bool8 sub_812BEEC(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+bool8 HelpMenuSubroutine_ReturnFromHelpItem(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
- gUnknown_3005E9C[0] = 1;
- sub_812B5A8(a0, a1);
+ gHelpSystemState[0] = 1;
+ BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer);
sub_813C75C();
HelpSystem_SetInputDelay(2);
- a0->field_0E = 3;
+ helpListMenu->state = 3;
return TRUE;
}
-bool8 sub_812BF18(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+bool8 HelpMenuSubroutine_HelpItemWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON))
{
PlaySE(SE_SELECT);
- a0->field_0E = 5;
+ helpListMenu->state = 5;
return TRUE;
}
if (JOY_NEW(L_BUTTON | R_BUTTON))
@@ -1546,13 +2429,13 @@ bool8 sub_812BF18(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
return TRUE;
}
-static void sub_812BF5C(void)
+static void PrintWelcomeMessageOnPanel1(void)
{
HelpSystem_FillPanel1();
- HelpSystem_PrintTextAt(gUnknown_81B2FC9, 0, 0);
+ HelpSystem_PrintTextAt(Help_Text_Greetings, 0, 0);
}
-static void sub_812BF74(const u8 * str)
+static void PrintTextOnPanel2Row52RightAlign(const u8 * str)
{
HelpSystem_FillPanel2();
HelpSystem_PrintTextRightAlign_Row52(str);
@@ -1560,21 +2443,21 @@ static void sub_812BF74(const u8 * str)
u8 sub_812BF88(void)
{
- return gUnknown_3005E9C[0];
+ return gHelpSystemState[0];
}
-static void sub_812BF94(struct HelpSystemListMenu * a0)
+static void ResetHelpSystemCursor(struct HelpSystemListMenu * helpListMenu)
{
- a0->field_0C = 0;
- a0->field_0D = 0;
+ helpListMenu->itemsAbove = 0;
+ helpListMenu->cursorPos = 0;
}
-static void sub_812BF9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
- s32 index = a1[a0->field_0C + a0->field_0D].index;
+ s32 index = listMenuItemsBuffer[helpListMenu->itemsAbove + helpListMenu->cursorPos].index;
if (index == -2)
- HelpSystem_PrintText_813C584(gUnknown_845B098[5]);
+ HelpSystem_PrintText_813C584(sHelpSystemTopicMouseoverDescriptionPtrs[5]);
else
- HelpSystem_PrintText_813C584(gUnknown_845B098[index]);
+ HelpSystem_PrintText_813C584(sHelpSystemTopicMouseoverDescriptionPtrs[index]);
sub_813BE30(1);
}
diff --git a/src/hof_pc.c b/src/hof_pc.c
index 76fd06abf..173625774 100644
--- a/src/hof_pc.c
+++ b/src/hof_pc.c
@@ -5,7 +5,6 @@
#include "script.h"
#include "script_menu.h"
#include "task.h"
-#include "hall_of_fame.h"
#include "bg.h"
#include "window.h"
@@ -40,7 +39,7 @@ static void ReshowPCMenuAfterHallOfFamePC(void)
{
ScriptContext2_Enable();
Overworld_PlaySpecialMapMusic();
- ScrSpecial_CreatePCMenu();
+ CreatePCMenu();
ScriptMenu_DisplayPCStartupPrompt();
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
CreateTask(Task_WaitForPaletteFade, 10);
diff --git a/src/ice.c b/src/ice.c
index 4ed6e0ece..6843538f9 100644
--- a/src/ice.c
+++ b/src/ice.c
@@ -1,10 +1,8 @@
#include "global.h"
#include "battle_anim.h"
#include "bg.h"
-#include "field_weather.h"
#include "gpu_regs.h"
#include "graphics.h"
-#include "main.h"
#include "palette.h"
#include "random.h"
#include "sprite.h"
diff --git a/src/intro.c b/src/intro.c
index cee1c8fec..837d4f905 100644
--- a/src/intro.c
+++ b/src/intro.c
@@ -1431,7 +1431,7 @@ static void sub_80EDB70(struct IntroSequenceData * this)
{
this->field_0018->pos1.x += this->field_0018->pos2.x;
this->field_0018->pos1.y += this->field_0018->pos2.y;
- sub_8007FFC(this->field_0018, 0, 0x2A);
+ obj_pos2_update_enable(this->field_0018, 0, 0x2A);
this->field_0018->callback = SpriteCallbackDummy;
StartSpriteAffineAnim(this->field_0018, 1);
}
@@ -1448,7 +1448,7 @@ static void sub_80EDBAC(struct IntroSequenceData * this)
{
StartSpriteAffineAnim(this->field_0028[i], 1);
this->field_0028[i]->callback = nullsub_83;
- sub_8007FFC(this->field_0028[i], gUnknown_840BBB8[i][0], gUnknown_840BBB8[i][1]);
+ obj_pos2_update_enable(this->field_0028[i], gUnknown_840BBB8[i][0], gUnknown_840BBB8[i][1]);
}
}
diff --git a/src/item.c b/src/item.c
index d1f732b4d..296ba8ec7 100644
--- a/src/item.c
+++ b/src/item.c
@@ -12,6 +12,8 @@
#include "constants/items.h"
#include "constants/maps.h"
+EWRAM_DATA struct BagPocket gBagPockets[NUM_BAG_POCKETS] = {};
+
void SortAndCompactBagPocket(struct BagPocket * pocket);
// Item descriptions and data
diff --git a/src/item_menu.c b/src/item_menu.c
index ffba2eae9..4131e7fd5 100644
--- a/src/item_menu.c
+++ b/src/item_menu.c
@@ -5,7 +5,7 @@
#include "berry_pouch.h"
#include "decompress.h"
#include "event_scripts.h"
-#include "event_object_80688E4.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "graphics.h"
#include "help_system.h"
@@ -496,9 +496,9 @@ static bool8 LoadBagMenuGraphics(void)
break;
case 19:
if (gBagMenuState.location == ITEMMENULOCATION_ITEMPC)
- HelpSystem_SetSomeVariable2(29);
+ SetHelpContext(HELPCONTEXT_PLAYERS_PC_ITEMS);
else
- HelpSystem_SetSomeVariable2(9);
+ SetHelpContext(HELPCONTEXT_BAG);
gPaletteFade.bufferTransferDisabled = FALSE;
gMain.state++;
break;
@@ -740,7 +740,7 @@ static void bag_menu_print_cursor(u8 y, u8 colorIdx)
}
else
{
- BagPrintTextOnWindow(0, 2, gFameCheckerText_ListMenuCursor, 1, y, 0, 0, 0, colorIdx);
+ BagPrintTextOnWindow(0, 2, gText_SelectorArrow2, 1, y, 0, 0, 0, colorIdx);
}
}
@@ -1434,7 +1434,7 @@ static void OpenContextMenu(u8 taskId)
Menu_InitCursor(r6, 2, 0, 2, GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) + 2, sContextMenuNumItems, 0);
r4 = ShowBagWindow(6, 0);
CopyItemName(gSpecialVar_ItemId, gStringVar1);
- StringExpandPlaceholders(gStringVar4, gOtherText_StrVar1);
+ StringExpandPlaceholders(gStringVar4, gText_Var1IsSelected);
BagPrintTextOnWindow(r4, 2, gStringVar4, 0, 2, 1, 0, 0, 1);
}
diff --git a/src/item_pc.c b/src/item_pc.c
index 7c7abdce3..46419f2f3 100644
--- a/src/item_pc.c
+++ b/src/item_pc.c
@@ -361,7 +361,7 @@ static bool8 ItemPc_DoGfxSetup(void)
gMain.state++;
break;
case 17:
- HelpSystem_SetSomeVariable2(29);
+ SetHelpContext(HELPCONTEXT_PLAYERS_PC_ITEMS);
gMain.state++;
break;
case 18:
@@ -577,7 +577,7 @@ static void ItemPc_PrintOrRemoveCursorAt(u8 y, u8 colorIdx)
}
else
{
- ItemPc_AddTextPrinterParameterized(0, 2, gFameCheckerText_ListMenuCursor, 0, y, 0, 0, 0, colorIdx);
+ ItemPc_AddTextPrinterParameterized(0, 2, gText_SelectorArrow2, 0, y, 0, 0, 0, colorIdx);
}
}
@@ -848,7 +848,7 @@ static void Task_ItemPcSubmenuInit(u8 taskId)
PrintTextArray(4, 2, 8, 2, GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) + 2, 3, sItemPcSubmenuOptions);
Menu_InitCursor(4, 2, 0, 2, GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) + 2, 3, 0);
CopyItemName(ItemPc_GetItemIdBySlotId(data[1]), gStringVar1);
- StringExpandPlaceholders(gStringVar4, gOtherText_StrVar1);
+ StringExpandPlaceholders(gStringVar4, gText_Var1IsSelected);
ItemPc_AddTextPrinterParameterized(windowId, 2, gStringVar4, 0, 2, 1, 0, 0, 1);
ScheduleBgCopyTilemapToVram(0);
gTasks[taskId].func = Task_ItemPcSubmenuRun;
diff --git a/src/item_use.c b/src/item_use.c
index 57771754a..6f81ee0e3 100644
--- a/src/item_use.c
+++ b/src/item_use.c
@@ -19,7 +19,6 @@
#include "mail.h"
#include "main.h"
#include "malloc.h"
-#include "event_object_80688E4.h"
#include "event_object_lock.h"
#include "metatile_behavior.h"
#include "new_menu_helpers.h"
@@ -42,7 +41,7 @@
#include "constants/maps.h"
#include "constants/moves.h"
#include "constants/songs.h"
-#include "constants/map_types.h"
+#include "constants/field_weather.h"
static EWRAM_DATA void (*sItemUseOnFieldCB)(u8 taskId) = NULL;
@@ -172,7 +171,7 @@ static void sub_80A103C(u8 taskId)
static void sub_80A1084(void)
{
- sub_807DC00();
+ FadeInFromBlack();
CreateTask(sub_80A109C, 8);
}
@@ -225,7 +224,7 @@ static bool8 sub_80A1194(void)
{
FreezeObjectEvents();
ScriptContext2_Enable();
- sub_807DC00();
+ FadeInFromBlack();
CreateTask(sub_80A11C0, 10);
gUnknown_2031DE0 = 0;
return TRUE;
@@ -458,7 +457,7 @@ void FieldUseFunc_TmCase(u8 taskId)
else
{
StopPokemonLeagueLightingEffectTask();
- FadeScreen(1, 0);
+ FadeScreen(FADE_TO_BLACK, 0);
gTasks[taskId].func = Task_InitTMCaseFromField;
}
}
@@ -489,7 +488,7 @@ void FieldUseFunc_BerryPouch(u8 taskId)
else
{
StopPokemonLeagueLightingEffectTask();
- FadeScreen(1, 0);
+ FadeScreen(FADE_TO_BLACK, 0);
gTasks[taskId].func = Task_InitBerryPouchFromField;
}
}
@@ -532,7 +531,7 @@ void FieldUseFunc_TeachyTv(u8 taskId)
else
{
StopPokemonLeagueLightingEffectTask();
- FadeScreen(1, 0);
+ FadeScreen(FADE_TO_BLACK, 0);
gTasks[taskId].func = Task_InitTeachyTvFromField;
}
}
@@ -648,7 +647,7 @@ static void sub_80A1C08(u8 taskId)
void sub_80A1C44(u8 taskId)
{
ResetInitialPlayerAvatarState();
- sub_8085620();
+ StartEscapeRopeFieldEffect();
DestroyTask(taskId);
}
@@ -662,7 +661,7 @@ void FieldUseFunc_TownMap(u8 taskId)
else
{
StopPokemonLeagueLightingEffectTask();
- FadeScreen(1, 0);
+ FadeScreen(FADE_TO_BLACK, 0);
gTasks[taskId].func = sub_80A1CC0;
}
}
@@ -694,7 +693,7 @@ void FieldUseFunc_FameChecker(u8 taskId)
else
{
StopPokemonLeagueLightingEffectTask();
- FadeScreen(1, 0);
+ FadeScreen(FADE_TO_BLACK, 0);
gTasks[taskId].func = sub_80A1D68;
}
}
diff --git a/src/itemfinder.c b/src/itemfinder.c
index 370fce841..5d6950acc 100644
--- a/src/itemfinder.c
+++ b/src/itemfinder.c
@@ -10,7 +10,6 @@
#include "field_player_avatar.h"
#include "field_specials.h"
#include "fieldmap.h"
-#include "itemfinder.h"
#include "constants/songs.h"
static void Task_NoResponse_CleanUp(u8 taskId);
diff --git a/src/keyboard_text.c b/src/keyboard_text.c
new file mode 100644
index 000000000..5db1a6aaa
--- /dev/null
+++ b/src/keyboard_text.c
@@ -0,0 +1,61 @@
+#include "global.h"
+
+// easy_chat_3
+const u8 gUnknown_847A8D8[] = _("{CLEAR 11}A{CLEAR 6}B{CLEAR 6}C{CLEAR 26}D{CLEAR 6}E{CLEAR 6}F{CLEAR 26}others");
+const u8 gUnknown_847A8FA[] = _("{CLEAR 11}G{CLEAR 6}H{CLEAR 6}I{CLEAR 26}J{CLEAR 6}K{CLEAR 6}L");
+const u8 gUnknown_847A913[] = _("{CLEAR 11}M{CLEAR 6}N{CLEAR 6}O{CLEAR 26}P{CLEAR 6}Q{CLEAR 6}R{CLEAR 6}S{CLEAR 26} ");
+const u8 gUnknown_847A934[] = _("{CLEAR 11}T{CLEAR 6}U{CLEAR 6}V{CLEAR 26}W{CLEAR 6}X{CLEAR 6}Y{CLEAR 6}Z{CLEAR 26} ");
+
+// naming_screen
+const u8 gText_NamingScreenKeyboard_abcdef[] = _("{CLEAR 11}a{CLEAR 6}b{CLEAR 6}c{CLEAR 26}d{CLEAR 6}e{CLEAR 6}f{CLEAR 6} {CLEAR 26}.");
+const u8 gText_NamingScreenKeyboard_ghijkl[] = _("{CLEAR 11}g{CLEAR 6}h{CLEAR 7}i{CLEAR 27}j{CLEAR 6}k{CLEAR 6}l{CLEAR 7} {CLEAR 26},");
+const u8 gText_NamingScreenKeyboard_mnopqrs[] = _("{CLEAR 11}m{CLEAR 6}n{CLEAR 7}o{CLEAR 26}p{CLEAR 6}q{CLEAR 7}r{CLEAR 6}s{CLEAR 27} ");
+const u8 gText_NamingScreenKeyboard_tuvwxyz[] = _("{CLEAR 12}t{CLEAR 6}u{CLEAR 6}v{CLEAR 26}w{CLEAR 6}x{CLEAR 6}y{CLEAR 6}z{CLEAR 26} ");
+const u8 gText_NamingScreenKeyboard_ABCDEF[] = _("{CLEAR 11}A{CLEAR 6}B{CLEAR 6}C{CLEAR 26}D{CLEAR 6}E{CLEAR 6}F{CLEAR 6} {CLEAR 26}.");
+const u8 gText_NamingScreenKeyboard_GHIJKL[] = _("{CLEAR 11}G{CLEAR 6}H{CLEAR 6}I{CLEAR 26}J{CLEAR 6}K{CLEAR 6}L{CLEAR 6} {CLEAR 26},");
+const u8 gText_NamingScreenKeyboard_MNOPQRS[] = _("{CLEAR 11}M{CLEAR 6}N{CLEAR 6}O{CLEAR 26}P{CLEAR 6}Q{CLEAR 6}R{CLEAR 6}S{CLEAR 26} ");
+const u8 gText_NamingScreenKeyboard_TUVWXYZ[] = _("{CLEAR 11}T{CLEAR 6}U{CLEAR 6}V{CLEAR 26}W{CLEAR 6}X{CLEAR 6}Y{CLEAR 6}Z{CLEAR 26} ");
+const u8 gText_NamingScreenKeyboard_01234[] = _("{CLEAR 11}0{CLEAR 16}1{CLEAR 16}2{CLEAR 16}3{CLEAR 16}4{CLEAR 16} ");
+const u8 gText_NamingScreenKeyboard_56789[] = _("{CLEAR 11}5{CLEAR 16}6{CLEAR 16}7{CLEAR 16}8{CLEAR 16}9{CLEAR 16} ");
+const u8 gText_NamingScreenKeyboard_Symbols1[] = _("{CLEAR 11}!{CLEAR 16}?{CLEAR 16}♂{CLEAR 16}♀{CLEAR 16}/{CLEAR 16}-");
+const u8 gText_NamingScreenKeyboard_Symbols2[] = _("{CLEAR 11}…{CLEAR 16}“{CLEAR 16}”{CLEAR 18}‘{CLEAR 18}'{CLEAR 18} ");
+
+// union_room_chat
+const u8 gText_UnionRoomChatKeyboard_ABCDE[] = _("ABCDE");
+const u8 gText_UnionRoomChatKeyboard_FGHIJ[] = _("FGHIJ");
+const u8 gText_UnionRoomChatKeyboard_KLMNO[] = _("KLMNO");
+const u8 gText_UnionRoomChatKeyboard_PQRST[] = _("PQRST");
+const u8 gText_UnionRoomChatKeyboard_UVWXY[] = _("UVWXY");
+const u8 gText_UnionRoomChatKeyboard_Z[] = _("Z ");
+const u8 gText_UnionRoomChatKeyboard_01234Upper[] = _("01234");
+const u8 gText_UnionRoomChatKeyboard_56789Upper[] = _("56789");
+const u8 gText_UnionRoomChatKeyboard_PunctuationUpper[] = _(".,!? ");
+const u8 gText_UnionRoomChatKeyboard_SymbolsUpper[] = _("-/&… ");
+const u8 gText_UnionRoomChatKeyboard_abcde[] = _("abcde");
+const u8 gText_UnionRoomChatKeyboard_fghij[] = _("fghij");
+const u8 gText_UnionRoomChatKeyboard_klmno[] = _("klmno");
+const u8 gText_UnionRoomChatKeyboard_pqrst[] = _("pqrst");
+const u8 gText_UnionRoomChatKeyboard_uvwxy[] = _("uvwxy");
+const u8 gText_UnionRoomChatKeyboard_z[] = _("z ");
+const u8 gText_UnionRoomChatKeyboard_01234Lower[] = _("01234");
+const u8 gText_UnionRoomChatKeyboard_56789Lower[] = _("56789");
+const u8 gText_UnionRoomChatKeyboard_PunctuationLower[] = _(".,!? ");
+const u8 gText_UnionRoomChatKeyboard_SymbolsLower[] = _("-/&… ");
+const u8 gText_BlankString_847AB39[] = _("");
+const u8 gText_BlankString_847AB3A[] = _("");
+const u8 gText_BlankString_847AB3B[] = _("");
+const u8 gText_BlankString_847AB3C[] = _("");
+const u8 gText_BlankString_847AB3D[] = _("");
+const u8 gText_BlankString_847AB3E[] = _("");
+const u8 gText_BlankString_847AB3F[] = _("");
+const u8 gText_BlankString_847AB40[] = _("");
+const u8 gText_UnionRoomChatKeyboard_Emoji1[] = _("{EXTRA 245}{EXTRA 246}{EXTRA 247}{EXTRA 248}{EXTRA 254}");
+const u8 gText_UnionRoomChatKeyboard_Emoji2[] = _("{EXTRA 249}{EXTRA 250}{EXTRA 252}{EXTRA 251}{EXTRA 253}");
+const u8 gText_UnionRoomChatKeyboard_Emoji3[] = _("{EXTRA 236}{EXTRA 237}{EXTRA 238}{EXTRA 235}{EXTRA 234}");
+const u8 gText_UnionRoomChatKeyboard_Emoji4[] = _("♂♀{EXTRA 212}{EXTRA 213}{EXTRA 211}");
+const u8 gText_UnionRoomChatKeyboard_Emoji5[] = _("{EXTRA 216}{EXTRA 217}{EXTRA 242}{EXTRA 243}{EXTRA 244}");
+const u8 gText_UnionRoomChatKeyboard_Emoji6[] = _("{EXTRA 218}{EXTRA 241}{EXTRA 224}{EXTRA 226}{EXTRA 227}");
+const u8 gText_UnionRoomChatKeyboard_Emoji7[] = _("{EXTRA 240}{EXTRA 239}{EXTRA 225}{EXTRA 214}{EXTRA 215}");
+const u8 gText_UnionRoomChatKeyboard_Emoji8[] = _("{EXTRA 228}{EXTRA 229}{EXTRA 230}{EXTRA 231}{EXTRA 232}");
+const u8 gText_UnionRoomChatKeyboard_Emoji9[] = _("{EXTRA 233}{EXTRA 220}{EXTRA 221}{EXTRA 222}{EXTRA 209}");
+const u8 gText_UnionRoomChatKeyboard_Emoji10[] = _("{EXTRA 210}{EXTRA 208}ょ: ");
diff --git a/src/learn_move.c b/src/learn_move.c
index e22922528..8a2f5781b 100644
--- a/src/learn_move.c
+++ b/src/learn_move.c
@@ -309,7 +309,7 @@ static void MoveRelearnerLoadBgGfx(void)
FillBgTilemapBufferRect(0, 0x000, 0, 0, 30, 20, 0xF);
SetBgTilemapBuffer(1, sMoveRelearner->bg1TilemapBuffer);
TextWindow_SetUserSelectedFrame(0, 1, 0xE0);
- sub_8107D38(0xD0, 1);
+ ListMenuLoadStdPalAt(0xD0, 1);
LoadPalette(gUnknown_8E97DDC, 0x00, 0x20);
DecompressAndLoadBgGfxUsingHeap(1, gUnknown_8E97DFC, 0, 0, 0);
CopyToBgTilemapBuffer(1, gUnknown_8E97EC4, 0, 0);
diff --git a/src/librfu_intr.c b/src/librfu_intr.c
new file mode 100644
index 000000000..23962a937
--- /dev/null
+++ b/src/librfu_intr.c
@@ -0,0 +1,402 @@
+#include "global.h"
+#include "librfu.h"
+
+static void sio32intr_clock_master(void);
+static void sio32intr_clock_slave(void);
+static u16 handshake_wait(u16 slot);
+static void STWI_set_timer_in_RAM(u8 count);
+static void STWI_stop_timer_in_RAM(void);
+static void STWI_init_slave(void);
+static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)());
+static void Callback_Dummy_S(u16 reqCommandId, void (*callbackS)(u16));
+static void Callback_Dummy_ID(void (*callbackId)(void));
+
+void IntrSIO32(void)
+{
+ if (gSTWIStatus->state == 10)
+ {
+ if (gSTWIStatus->callbackID != NULL)
+ Callback_Dummy_ID(gSTWIStatus->callbackID);
+ }
+ else
+ {
+ if (gSTWIStatus->msMode == AGB_CLK_MASTER)
+ sio32intr_clock_master();
+ else
+ sio32intr_clock_slave();
+ }
+}
+
+static void sio32intr_clock_master(void)
+{
+ u32 regSIODATA32;
+ u32 ackLen;
+
+ STWI_set_timer_in_RAM(80);
+ regSIODATA32 = REG_SIODATA32;
+
+ if (gSTWIStatus->state == 0) // master send req
+ {
+ if (regSIODATA32 == 0x80000000)
+ {
+ if (gSTWIStatus->reqNext <= gSTWIStatus->reqLength)
+ {
+ REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket->rfuPacket8.data)[gSTWIStatus->reqNext];
+ gSTWIStatus->reqNext++;
+ }
+ else
+ {
+ gSTWIStatus->state = 1; // master wait ack
+ REG_SIODATA32 = 0x80000000;
+ }
+ }
+ else
+ {
+ STWI_stop_timer_in_RAM();
+ STWI_set_timer_in_RAM(130);
+ return;
+ }
+ }
+ else if (gSTWIStatus->state == 1) // master wait ack
+ {
+ if ((regSIODATA32 & 0xFFFF0000) == 0x99660000)
+ {
+ gSTWIStatus->ackNext = 0;
+ ((u32*)gSTWIStatus->rxPacket)[gSTWIStatus->ackNext] = regSIODATA32;
+ gSTWIStatus->ackNext++;
+ gSTWIStatus->ackActiveCommand = regSIODATA32;
+ gSTWIStatus->ackLength = ackLen = regSIODATA32 >> 8;
+ if ((ackLen = gSTWIStatus->ackLength) >= gSTWIStatus->ackNext)
+ {
+ gSTWIStatus->state = 2; // master receive ack
+ REG_SIODATA32 = 0x80000000;
+ }
+ else
+ {
+ gSTWIStatus->state = 3; // master done ack
+ }
+ }
+ else
+ {
+ STWI_stop_timer_in_RAM();
+ STWI_set_timer_in_RAM(130);
+ return;
+ }
+ }
+ else if (gSTWIStatus->state == 2) // master receive ack
+ {
+ ((u32*)gSTWIStatus->rxPacket)[gSTWIStatus->ackNext] = regSIODATA32;
+ gSTWIStatus->ackNext++;
+ if (gSTWIStatus->ackLength < gSTWIStatus->ackNext)
+ gSTWIStatus->state = 3; // master done ack
+ else
+ REG_SIODATA32 = 0x80000000;
+ }
+
+ if (handshake_wait(1) == 1)
+ return;
+
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS | SIO_MULTI_SD;
+
+ if (handshake_wait(0) == 1)
+ return;
+
+ STWI_stop_timer_in_RAM();
+
+ if (gSTWIStatus->state == 3) // master done ack
+ {
+ if (
+ gSTWIStatus->ackActiveCommand == (0x80 | ID_MS_CHANGE_REQ)
+ || gSTWIStatus->ackActiveCommand == (0x80 | ID_DATA_TX_AND_CHANGE_REQ)
+ || gSTWIStatus->ackActiveCommand == (0x80 | ID_UNK35_REQ)
+ || gSTWIStatus->ackActiveCommand == (0x80 | ID_RESUME_RETRANSMIT_AND_CHANGE_REQ)
+ )
+ {
+
+ gSTWIStatus->msMode = AGB_CLK_SLAVE;
+ REG_SIODATA32 = 0x80000000;
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS;
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE;
+ gSTWIStatus->state = 5; // slave receive req init
+ }
+ else
+ {
+ if (gSTWIStatus->ackActiveCommand == 0xEE)
+ {
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
+ gSTWIStatus->state = 4; // error
+ gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION;
+ }
+ else
+ {
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
+ gSTWIStatus->state = 4; // error
+ }
+ }
+ gSTWIStatus->sending = 0;
+ if (gSTWIStatus->callbackM != NULL)
+ Callback_Dummy_M(gSTWIStatus->reqActiveCommand, gSTWIStatus->error, gSTWIStatus->callbackM);
+ }
+ else
+ {
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS | SIO_ENABLE;
+ }
+}
+
+static void sio32intr_clock_slave(void)
+{
+ u32 regSIODATA32;
+ u32 r0;
+ register u32 reqLen asm("r2");
+
+ gSTWIStatus->timerActive = 0;
+ STWI_set_timer_in_RAM(100);
+ if (handshake_wait(0) == 1)
+ return;
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_MULTI_SD;
+ regSIODATA32 = REG_SIODATA32;
+ if (gSTWIStatus->state == 5) // slave receive req init
+ {
+ ((u32*)gSTWIStatus->rxPacket)[0] = regSIODATA32;
+ gSTWIStatus->reqNext = 1;
+ r0 = 0x99660000;
+ if ((regSIODATA32 >> 16) == (r0 >> 16))
+ {
+ gSTWIStatus->reqLength = reqLen = regSIODATA32 >> 8;
+ gSTWIStatus->reqActiveCommand = regSIODATA32;
+ if (gSTWIStatus->reqLength == 0)
+ {
+ if (
+ gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ
+ || gSTWIStatus->reqActiveCommand == ID_DATA_READY_AND_CHANGE_REQ
+ || gSTWIStatus->reqActiveCommand == ID_DISCONNECTED_AND_CHANGE_REQ
+ || gSTWIStatus->reqActiveCommand == ID_UNK36_REQ
+ )
+ {
+ gSTWIStatus->ackActiveCommand = gSTWIStatus->reqActiveCommand + 0x80;
+ ((u32*)gSTWIStatus->txPacket)[0] = 0x99660000 + gSTWIStatus->ackActiveCommand;
+ gSTWIStatus->ackLength = 0;
+ }
+ else
+ {
+ ((u32*)gSTWIStatus->txPacket)[0] = 0x996601EE;
+ if (gSTWIStatus->reqActiveCommand >= 0x10 && gSTWIStatus->reqActiveCommand <= 0x3D)
+ {
+ ((u32*)gSTWIStatus->txPacket)[1] = 1;
+ }
+ else
+ {
+ ((u32*)gSTWIStatus->txPacket)[1] = 2;
+ }
+ gSTWIStatus->ackLength = 1;
+ gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION;
+ }
+ REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket)[0];
+ gSTWIStatus->ackNext = 1;
+ gSTWIStatus->state = 7; // slave send ack
+ }
+ else
+ {
+ REG_SIODATA32 = 0x80000000;
+ gSTWIStatus->reqNext = 1;
+ gSTWIStatus->state = 6; // slave receive req
+ }
+ }
+ else
+ {
+ STWI_stop_timer_in_RAM();
+ STWI_set_timer_in_RAM(100);
+ return;
+ }
+ }
+ else if (gSTWIStatus->state == 6) // slave receive req
+ {
+ ((u32*)gSTWIStatus->rxPacket)[gSTWIStatus->reqNext] = regSIODATA32;
+ gSTWIStatus->reqNext++;
+ if (gSTWIStatus->reqLength < gSTWIStatus->reqNext)
+ {
+ if (
+ gSTWIStatus->reqActiveCommand == ID_DATA_READY_AND_CHANGE_REQ
+ || gSTWIStatus->reqActiveCommand == ID_DISCONNECTED_AND_CHANGE_REQ
+ || gSTWIStatus->reqActiveCommand == ID_UNK36_REQ
+ )
+ {
+ gSTWIStatus->ackActiveCommand = gSTWIStatus->reqActiveCommand + 0x80;
+ ((u32*)gSTWIStatus->txPacket)[0] = 0x99660000 | gSTWIStatus->ackActiveCommand;
+ gSTWIStatus->ackLength = 0;
+ }
+ else
+ {
+ ((u32*)gSTWIStatus->txPacket)[0] = 0x996601EE;
+ if (gSTWIStatus->reqActiveCommand >= 0x10 && gSTWIStatus->reqActiveCommand <= 0x3D)
+ {
+ ((u32*)gSTWIStatus->txPacket)[1] = 1;
+ }
+ else
+ {
+ ((u32*)gSTWIStatus->txPacket)[1] = 2;
+ }
+ gSTWIStatus->ackLength = 1;
+ gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION;
+ }
+ REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket)[0];
+ gSTWIStatus->ackNext = 1;
+ gSTWIStatus->state = 7; // slave send ack
+ }
+ else
+ {
+ REG_SIODATA32 = 0x80000000;
+ }
+ }
+ else if (gSTWIStatus->state == 7) // slave send ack
+ {
+ if (regSIODATA32 == 0x80000000)
+ {
+ if (gSTWIStatus->ackLength < gSTWIStatus->ackNext)
+ {
+ gSTWIStatus->state = 8; // slave done ack
+ }
+ else
+ {
+ REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket)[gSTWIStatus->ackNext];
+ gSTWIStatus->ackNext++;
+ }
+ }
+ else
+ {
+ STWI_stop_timer_in_RAM();
+ STWI_set_timer_in_RAM(100);
+ return;
+ }
+ }
+ if (handshake_wait(1) == 1)
+ return;
+ if (gSTWIStatus->state == 8) // slave done ack
+ {
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS;
+ STWI_stop_timer_in_RAM();
+ if (gSTWIStatus->error == ERR_REQ_CMD_ACK_REJECTION)
+ {
+ STWI_init_slave();
+ if (gSTWIStatus->callbackS != NULL)
+ {
+ Callback_Dummy_S(0x1EE, gSTWIStatus->callbackS);
+ }
+ }
+ else
+ {
+ REG_SIODATA32 = 0;
+ REG_SIOCNT = 0;
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
+ gSTWIStatus->msMode = AGB_CLK_MASTER;
+ gSTWIStatus->state = 0; // master send req
+ if (gSTWIStatus->callbackS != NULL)
+ {
+ Callback_Dummy_S((gSTWIStatus->reqLength << 8) | (gSTWIStatus->reqActiveCommand), gSTWIStatus->callbackS);
+ }
+ }
+ }
+ else
+ {
+ REG_IME = 0;
+ if (REG_TM0CNT_H & TIMER_ENABLE)
+ {
+ if ((REG_TM0CNT_H & 0x03) == TIMER_1CLK)
+ {
+ while (REG_TM0CNT_L > 0xFF9B);
+ }
+ else
+ {
+ while (REG_TM0CNT_L > 0xFFFE);
+ }
+ }
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS;
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE;
+ REG_IME = 1;
+ }
+}
+
+static u16 handshake_wait(u16 slot)
+{
+ do
+ {
+ if ((gSTWIStatus->timerActive & 0xFF) == 1)
+ {
+ gSTWIStatus->timerActive = 0;
+ return 1;
+ }
+ } while ((REG_SIOCNT & SIO_MULTI_SI) != (slot << SIO_MULTI_SI_SHIFT));
+ return 0;
+}
+
+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);
+ REG_IME = 0;
+ switch (count)
+ {
+ case 50:
+ *regTMCNTL = 0xFCCB;
+ gSTWIStatus->timerState = 1;
+ break;
+ case 80:
+ *regTMCNTL = 0xFAE0;
+ gSTWIStatus->timerState = 2;
+ break;
+ case 100:
+ *regTMCNTL = 0xF996;
+ gSTWIStatus->timerState = 3;
+ break;
+ case 130:
+ *regTMCNTL = 0xF7AD;
+ gSTWIStatus->timerState = 4;
+ break;
+ }
+ *regTMCNTH = TIMER_ENABLE | TIMER_64CLK | TIMER_256CLK | TIMER_INTR_ENABLE;
+ REG_IF = INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect;
+ REG_IME = 1;
+}
+
+static void STWI_stop_timer_in_RAM(void)
+{
+ gSTWIStatus->timerState = 0;
+ REG_TMCNT_L(gSTWIStatus->timerSelect) = 0;
+ REG_TMCNT_H(gSTWIStatus->timerSelect) = 0;
+}
+
+static void STWI_init_slave(void)
+{
+ gSTWIStatus->state = 5; // slave receive req init
+ gSTWIStatus->msMode = AGB_CLK_SLAVE;
+ gSTWIStatus->reqLength = 0;
+ gSTWIStatus->reqNext = 0;
+ gSTWIStatus->reqActiveCommand = 0;
+ gSTWIStatus->ackLength = 0;
+ gSTWIStatus->ackNext = 0;
+ gSTWIStatus->ackActiveCommand = 0;
+ gSTWIStatus->timerState = 0;
+ gSTWIStatus->timerActive = 0;
+ gSTWIStatus->error = 0;
+ gSTWIStatus->recoveryCount = 0;
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE;
+}
+
+NAKED
+static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)())
+{
+ asm("bx r2");
+}
+
+NAKED
+static void Callback_Dummy_S(u16 reqCommandId, void (*callbackS)(u16))
+{
+ asm("bx r1");
+}
+
+NAKED
+static void Callback_Dummy_ID(void (*callbackId)(void))
+{
+ asm("bx r0");
+}
diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c
index dccd342f2..582060f78 100644
--- a/src/librfu_rfu.c
+++ b/src/librfu_rfu.c
@@ -2,54 +2,54 @@
struct LLSFStruct
{
- u8 unk00;
- u8 unk01;
- u8 unk02;
- u8 unk03;
- u8 unk04;
- u8 unk05;
- u8 unk06;
- u8 unk07;
- u8 unk08;
- u8 unk09;
- u8 unk0A;
- u8 unk0B;
- u8 unk0C;
- u16 unk0E;
+ u8 frameSize;
+ u8 recvFirstShift;
+ u8 connSlotFlagShift;
+ u8 slotStateShift;
+ u8 ackShift;
+ u8 phaseShit;
+ u8 nShift;
+ u8 recvFirstMask;
+ u8 connSlotFlagMask;
+ u8 slotStateMask;
+ u8 ackMask;
+ u8 phaseMask;
+ u8 nMask;
+ u16 framesMask;
};
struct RfuLocalStruct
{
- u8 unk00;
- u8 unk01;
- u8 unk02;
- u8 unk03;
- u8 unk04;
- u8 unk05;
- u16 unk06;
+ u8 recvFirst;
+ u8 connSlotFlag;
+ u8 slotState;
+ u8 ack;
+ u8 phase;
+ u8 n;
+ u16 frame;
};
-static void rfu_CB_defaultCallback(u8, u16);
-static void rfu_CB_reset(u8, u16);
-static void rfu_CB_configGameData(u8, u16);
-static void rfu_CB_stopMode(u8, u16);
-static void rfu_CB_startSearchChild(u8, u16);
-static void rfu_CB_pollAndEndSearchChild(u8, u16);
-static void rfu_CB_startSearchParent(u8, u16);
-static void rfu_CB_pollSearchParent(u8, u16);
-static void rfu_CB_pollConnectParent(u8, u16);
-static void rfu_CB_pollConnectParent(u8, u16);
-static void rfu_CB_disconnect(u8, u16);
-static void rfu_CB_CHILD_pollConnectRecovery(u8, u16);
-static void rfu_CB_sendData(UNUSED u8, u16);
-static void rfu_CB_sendData2(UNUSED u8, u16);
-static void rfu_CB_sendData3(u8, u16);
-static void rfu_CB_recvData(u8, u16);
-static void rfu_enableREQCallback(bool8);
+static void rfu_CB_defaultCallback(u8 reqCommand, u16 reqResult);
+static void rfu_CB_reset(u8 reqCommand, u16 reqResult);
+static void rfu_CB_configGameData(u8 reqCommand, u16 reqResult);
+static void rfu_CB_stopMode(u8 reqCommand, u16 reqResult);
+static void rfu_CB_startSearchChild(u8 reqCommand, u16 reqResult);
+static void rfu_CB_pollAndEndSearchChild(u8 reqCommand, u16 reqResult);
+static void rfu_CB_startSearchParent(u8 reqCommand, u16 reqResult);
+static void rfu_CB_pollSearchParent(u8 reqCommand, u16 reqResult);
+static void rfu_CB_pollConnectParent(u8 reqCommand, u16 reqResult);
+static void rfu_CB_pollConnectParent(u8 reqCommand, u16 reqResult);
+static void rfu_CB_disconnect(u8 reqCommand, u16 reqResult);
+static void rfu_CB_CHILD_pollConnectRecovery(u8 reqCommand, u16 reqResult);
+static void rfu_CB_sendData(UNUSED u8 reqCommand, u16 reqResult);
+static void rfu_CB_sendData2(UNUSED u8 reqCommand, u16 reqResult);
+static void rfu_CB_sendData3(u8 reqCommand, u16 reqResult);
+static void rfu_CB_recvData(u8 reqCommand, u16 reqResult);
+static void rfu_enableREQCallback(bool8 enable);
static void rfu_STC_clearAPIVariables(void);
static void rfu_STC_readChildList(void);
static void rfu_STC_readParentCandidateList(void);
-static void rfu_STC_REQ_callback(u8, u16);
+static void rfu_STC_REQ_callback(u8 reqCommand, u16 reqResult);
static void rfu_STC_removeLinkData(u8, u8);
static void rfu_STC_fastCopy(const u8 **, u8 **, s32);
static void rfu_STC_clearLinkStatus(u8);
@@ -74,63 +74,94 @@ struct RfuStatic *gRfuStatic;
struct RfuFixed *gRfuFixed;
static const struct LLSFStruct llsf_struct[2] = {
- {
- 2, 14, 0, 10, 9, 5, 7, 2,
- 0, 15, 1, 3, 3, 0x1f
- }, {
- 3, 22, 18, 14, 13, 9, 11, 3,
- 15, 15, 1, 3, 3, 0x7f
- }
+ [MODE_CHILD] = {
+ .frameSize = 2,
+ .recvFirstShift = 14,
+ .connSlotFlagShift = 0,
+ .slotStateShift = 10,
+ .ackShift = 9,
+ .phaseShit = 5,
+ .nShift = 7,
+ .recvFirstMask = 2,
+ .connSlotFlagMask = 0,
+ .slotStateMask = 15,
+ .ackMask = 1,
+ .phaseMask = 3,
+ .nMask = 3,
+ .framesMask = 0x1f
+ },
+ [MODE_PARENT] = {
+ .frameSize = 3,
+ .recvFirstShift = 22,
+ .connSlotFlagShift = 18,
+ .slotStateShift = 14,
+ .ackShift = 13,
+ .phaseShit = 9,
+ .nShift = 11,
+ .recvFirstMask = 3,
+ .connSlotFlagMask = 15,
+ .slotStateMask = 15,
+ .ackMask = 1,
+ .phaseMask = 3,
+ .nMask = 3,
+ .framesMask = 0x7f
+ }
};
-#ifdef EMERALD
-static const char lib_ver[] = "RFU_V1026";
-#else
-static const char lib_ver[] = "RFU_V1024";
-#endif
+#define xstr(s) str(s)
+#define str(s) #s
+const char version_string[] = "RFU_V" xstr(LIBRFU_VERSION);
static const char str_checkMbootLL[] = "RFU-MBOOT";
-u16 rfu_initializeAPI(struct RfuAPIBuffer *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam)
+#define COPY(src, dst, iterator, size) do { \
+ const u16 *_src = (const u16 *)(src); \
+ u16 *_dst = (u16 *)(dst); \
+ (iterator) = (size); \
+ while ((iterator)-- != 0) \
+ *_dst++ = *_src++; \
+} while (0)
+
+u16 rfu_initializeAPI(u32 *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam)
{
u16 i;
u16 *dst;
const u16 *src;
- u16 r3;
+ u16 buffByteSizeMax;
- // is in EWRAM?
- if (((u32)APIBuffer & 0xF000000) == 0x2000000 && copyInterruptToRam)
+ // is in EWRAM?
+ if (((uintptr_t)APIBuffer & 0xF000000) == 0x2000000 && copyInterruptToRam)
return ERR_RFU_API_BUFF_ADR;
- // is not 4-byte aligned?
+ // is not 4-byte aligned?
if ((u32)APIBuffer & 3)
return ERR_RFU_API_BUFF_ADR;
if (copyInterruptToRam)
{
// An assert/debug print may have existed before, ie
// printf("%s %u < %u", "somefile.c:12345", buffByteSize, num)
- // to push this into r3?
- r3 = sizeof(struct RfuAPIBuffer);
- if (buffByteSize < r3)
+ // to push this into buffByteSizeMax?
+ buffByteSizeMax = RFU_API_BUFF_SIZE_RAM;
+ if (buffByteSize < buffByteSizeMax)
return ERR_RFU_API_BUFF_SIZE;
}
if (!copyInterruptToRam)
{
- r3 = 0x504; // same issue as above
- if (buffByteSize < r3)
+ buffByteSizeMax = RFU_API_BUFF_SIZE_ROM; // same issue as above
+ if (buffByteSize < buffByteSizeMax)
return ERR_RFU_API_BUFF_SIZE;
}
- gRfuLinkStatus = &APIBuffer->linkStatus;
- gRfuStatic = &APIBuffer->static_;
- gRfuFixed = &APIBuffer->fixed;
- gRfuSlotStatusNI[0] = &APIBuffer->NI[0];
- gRfuSlotStatusUNI[0] = &APIBuffer->UNI[0];
+ gRfuLinkStatus = (void *)APIBuffer + 0;
+ gRfuStatic = (void *)APIBuffer + 0xb4; // + sizeof(*gRfuLinkStatus)
+ gRfuFixed = (void *)APIBuffer + 0xdc; // + sizeof(*gRfuStatic)
+ gRfuSlotStatusNI[0] = (void *)APIBuffer + 0x1bc; // + sizeof(*gRfuFixed)
+ gRfuSlotStatusUNI[0] = (void *)APIBuffer + 0x37c; // + sizeof(*gRfuSlotStatusNI[0])
for (i = 1; i < RFU_CHILD_MAX; ++i)
{
gRfuSlotStatusNI[i] = &gRfuSlotStatusNI[i - 1][1];
gRfuSlotStatusUNI[i] = &gRfuSlotStatusUNI[i - 1][1];
}
- // TODO: Is it possible to fix the following 2 statements?
- // It's equivalent to:
+ // TODO: Is it possible to fix the following 2 statements?
+ // It's equivalent to:
// gRfuFixed->STWIBuffer = &APIBuffer->intr;
// STWI_init_all(&APIBuffer->intr, sioIntrTable_p, copyInterruptToRam);
gRfuFixed->STWIBuffer = (struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1];
@@ -143,11 +174,21 @@ u16 rfu_initializeAPI(struct RfuAPIBuffer *APIBuffer, u16 buffByteSize, IntrFunc
gRfuSlotStatusUNI[i]->recvBuffer = NULL;
gRfuSlotStatusUNI[i]->recvBufferSize = 0;
}
- src = (const u16 *)((u32)&rfu_STC_fastCopy & ~1);
- dst = gRfuFixed->fastCopyBuffer;
// rfu_REQ_changeMasterSlave is the function next to rfu_STC_fastCopy
- for (r3 = ((void *)rfu_REQ_changeMasterSlave - (void *)rfu_STC_fastCopy) / sizeof(u16), --r3; r3 != 0xFFFF; --r3)
+#if LIBRFU_VERSION < 1026
+ src = (const u16 *)((uintptr_t)&rfu_STC_fastCopy & ~1);
+ dst = gRfuFixed->fastCopyBuffer;
+ buffByteSizeMax = ((void *)rfu_REQ_changeMasterSlave - (void *)rfu_STC_fastCopy) / sizeof(u16);
+ while (buffByteSizeMax-- != 0)
*dst++ = *src++;
+#else
+ COPY(
+ (uintptr_t)&rfu_STC_fastCopy & ~1,
+ gRfuFixed->fastCopyBuffer,
+ buffByteSizeMax,
+ 0x60 / sizeof(u16)
+ );
+#endif
gRfuFixed->fastCopyPtr = (void *)gRfuFixed->fastCopyBuffer + 1;
return 0;
}
@@ -155,19 +196,19 @@ u16 rfu_initializeAPI(struct RfuAPIBuffer *APIBuffer, u16 buffByteSize, IntrFunc
static void rfu_STC_clearAPIVariables(void)
{
u16 IMEBackup = REG_IME;
- u8 i, r4;
+ u8 i, flags;
REG_IME = 0;
- r4 = gRfuStatic->flags;
+ flags = gRfuStatic->flags;
CpuFill16(0, gRfuStatic, sizeof(struct RfuStatic));
- gRfuStatic->flags = r4 & 8;
+ gRfuStatic->flags = flags & 8;
CpuFill16(0, gRfuLinkStatus, sizeof(struct RfuLinkStatus));
gRfuLinkStatus->watchInterval = 4;
gRfuStatic->nowWatchInterval = 0;
gRfuLinkStatus->parentChild = MODE_NEUTRAL;
rfu_clearAllSlot();
gRfuStatic->SCStartFlag = 0;
- for (i = 0; i < NELEMS(gRfuStatic->cidBak); ++i)
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
gRfuStatic->cidBak[i] = 0;
REG_IME = IMEBackup;
}
@@ -180,20 +221,20 @@ void rfu_REQ_PARENT_resumeRetransmitAndChange(void)
u16 rfu_UNI_PARENT_getDRAC_ACK(u8 *ackFlag)
{
- struct RfuIntrStruct *buf;
+ u8 *buf;
*ackFlag = 0;
if (gRfuLinkStatus->parentChild != MODE_PARENT)
return ERR_MODE_NOT_PARENT;
buf = rfu_getSTWIRecvBuffer();
- switch (buf->rxPacketAlloc.rfuPacket8.data[0])
+ switch (*buf)
{
case 40:
case 54:
- if (buf->rxPacketAlloc.rfuPacket8.data[1] == 0)
+ if (buf[1] == 0)
*ackFlag = gRfuLinkStatus->connSlotFlag;
else
- *ackFlag = buf->rxPacketAlloc.rfuPacket8.data[4];
+ *ackFlag = buf[4];
return 0;
default:
return ERR_REQ_CMD_ID;
@@ -205,9 +246,9 @@ void rfu_setTimerInterrupt(u8 timerNo, IntrFunc *timerIntrTable_p)
STWI_init_timer(timerIntrTable_p, timerNo);
}
-struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void)
+u8 *rfu_getSTWIRecvBuffer(void)
{
- return gRfuFixed->STWIBuffer;
+ return (u8 *)gRfuFixed->STWIBuffer;
}
void rfu_setMSCCallback(void (*callback)(u16 reqCommandId))
@@ -229,26 +270,26 @@ static void rfu_enableREQCallback(bool8 enable)
gRfuStatic->flags &= 0xF7;
}
-static void rfu_STC_REQ_callback(u8 r5, u16 reqResult)
+static void rfu_STC_REQ_callback(u8 reqCommand, u16 reqResult)
{
STWI_set_Callback_M(rfu_CB_defaultCallback);
gRfuStatic->reqResult = reqResult;
if (gRfuStatic->flags & 8)
- gRfuFixed->reqCallback(r5, reqResult);
+ gRfuFixed->reqCallback(reqCommand, reqResult);
}
-static void rfu_CB_defaultCallback(u8 r0, u16 reqResult)
+static void rfu_CB_defaultCallback(u8 reqCommand, u16 reqResult)
{
- s32 r5;
+ s32 bmSlotFlags;
u8 i;
- if (r0 == 0xFF)
+ if (reqCommand == ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ)
{
if (gRfuStatic->flags & 8)
- gRfuFixed->reqCallback(r0, reqResult);
- r5 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag;
+ gRfuFixed->reqCallback(reqCommand, reqResult);
+ bmSlotFlags = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag;
for (i = 0; i < RFU_CHILD_MAX; ++i)
- if ((r5 >> i) & 1)
+ if ((bmSlotFlags >> i) & 1)
rfu_STC_removeLinkData(i, 1);
gRfuLinkStatus->parentChild = MODE_NEUTRAL;
}
@@ -277,25 +318,39 @@ u16 rfu_getRFUStatus(u8 *rfuState)
return 0;
}
+/*
+ * RFU Multiboot images are loaded into IWRAM
+ * struct RfuMbootLL
+ * {
+ * struct RfuLinkStatus status;
+ * u8 filler_B4[0x3C];
+ * char name[10];
+ * u16 checksum;
+ * }
+ * Returns 1 if the packet to inherit is malformed.
+ */
u16 rfu_MBOOT_CHILD_inheritanceLinkStatus(void)
{
const char *s1 = str_checkMbootLL;
char *s2 = (char *)0x30000F0;
u16 checksum;
- u16 *r2;
+ u16 *mb_buff_iwram_p;
u8 i;
+ // if (strcmp(s1, s2) != 0) return 1;
while (*s1 != '\0')
if (*s1++ != *s2++)
return 1;
- r2 = (u16 *)0x3000000;
+ mb_buff_iwram_p = (u16 *)0x3000000;
+
+ // The size of struct RfuLinkStatus is 180
checksum = 0;
- for (i = 0; i < 90; ++i)
- checksum += *r2++;
+ for (i = 0; i < 180/2; ++i)
+ checksum += *mb_buff_iwram_p++;
if (checksum != *(u16 *)0x30000FA)
return 1;
CpuCopy16((u16 *)0x3000000, gRfuLinkStatus, sizeof(struct RfuLinkStatus));
- gRfuStatic->flags |= 0x80;
+ gRfuStatic->flags |= 0x80; // mboot
return 0;
}
@@ -305,14 +360,14 @@ void rfu_REQ_stopMode(void)
if (REG_IME == 0)
{
- rfu_STC_REQ_callback(61, 6);
+ rfu_STC_REQ_callback(ID_STOP_MODE_REQ, 6);
gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE;
}
else
{
AgbRFU_SoftReset();
rfu_STC_clearAPIVariables();
- if (AgbRFU_checkID(8) == 0x8001)
+ if (AgbRFU_checkID(8) == RFU_ID)
{
timerReg = &REG_TMCNT(gSTWIStatus->timerSelect);
*timerReg = 0;
@@ -326,29 +381,29 @@ void rfu_REQ_stopMode(void)
else
{
REG_SIOCNT = SIO_MULTI_MODE;
- rfu_STC_REQ_callback(61, 0);
+ rfu_STC_REQ_callback(ID_STOP_MODE_REQ, 0);
}
}
}
-static void rfu_CB_stopMode(u8 a1, u16 reqResult)
+static void rfu_CB_stopMode(u8 reqCommand, u16 reqResult)
{
if (reqResult == 0)
REG_SIOCNT = SIO_MULTI_MODE;
- rfu_STC_REQ_callback(a1, reqResult);
+ rfu_STC_REQ_callback(reqCommand, reqResult);
}
u32 rfu_REQBN_softReset_and_checkID(void)
{
- u32 r2;
+ u32 id;
if (REG_IME == 0)
return ERR_ID_CHECK_IME_DISABLE;
AgbRFU_SoftReset();
rfu_STC_clearAPIVariables();
- if ((r2 = AgbRFU_checkID(30)) == 0)
+ if ((id = AgbRFU_checkID(30)) == 0)
REG_SIOCNT = SIO_MULTI_MODE;
- return r2;
+ return id;
}
void rfu_REQ_reset(void)
@@ -357,11 +412,11 @@ void rfu_REQ_reset(void)
STWI_send_ResetREQ();
}
-static void rfu_CB_reset(u8 a1, u16 reqResult)
+static void rfu_CB_reset(u8 reqCommand, u16 reqResult)
{
if (reqResult == 0)
rfu_STC_clearAPIVariables();
- rfu_STC_REQ_callback(a1, reqResult);
+ rfu_STC_REQ_callback(reqCommand, reqResult);
}
void rfu_REQ_configSystem(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer)
@@ -370,59 +425,59 @@ void rfu_REQ_configSystem(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer)
STWI_send_SystemConfigREQ((availSlotFlag & AVAIL_SLOT1) | 0x3C, maxMFrame, mcTimer);
if (mcTimer == 0)
{
- gRfuStatic->unk_1a = 1;
+ gRfuStatic->linkEmergencyLimit = 1;
}
else
{
u16 IMEBackup = REG_IME;
REG_IME = 0;
- gRfuStatic->unk_1a = Div(600, mcTimer);
+ gRfuStatic->linkEmergencyLimit = Div(600, mcTimer);
REG_IME = IMEBackup;
}
}
void rfu_REQ_configGameData(u8 mbootFlag, u16 serialNo, const u8 *gname, const u8 *uname)
{
- u8 sp[16];
+ u8 packet[16];
u8 i;
- u8 r3;
+ u8 check_sum;
const u8 *gnameBackup = gname;
const u8 *unameBackup;
- sp[0] = serialNo;
- sp[1] = serialNo >> 8;
+ packet[0] = serialNo;
+ packet[1] = serialNo >> 8;
if (mbootFlag != 0)
- sp[1] = (serialNo >> 8) | 0x80;
+ packet[1] = (serialNo >> 8) | 0x80;
for (i = 2; i < 15; ++i)
- sp[i] = *gname++;
- r3 = 0;
+ packet[i] = *gname++;
+ check_sum = 0;
unameBackup = uname;
for (i = 0; i < 8; ++i)
{
- r3 += *unameBackup++;
- r3 += *gnameBackup++;
+ check_sum += *unameBackup++;
+ check_sum += *gnameBackup++;
}
- sp[15] = ~r3;
+ packet[15] = ~check_sum;
if (mbootFlag != 0)
- sp[14] = 0;
+ packet[14] = 0;
STWI_set_Callback_M(rfu_CB_configGameData);
- STWI_send_GameConfigREQ(sp, uname);
+ STWI_send_GameConfigREQ(packet, uname);
}
-static void rfu_CB_configGameData(u8 ip, u16 r7)
+static void rfu_CB_configGameData(u8 reqCommand, u16 reqResult)
{
- s32 r2, r3;
- u8 *r4;
+ s32 serialNo;
+ u8 *gname_uname_p;
u8 i;
- u8 *r1;
+ u8 *packet_p;
- if (r7 == 0)
+ if (reqResult == 0)
{
- r1 = gSTWIStatus->txPacket->rfuPacket8.data;
- r2 = gRfuLinkStatus->my.serialNo = r1[4];
- gRfuLinkStatus->my.serialNo = (r1[5] << 8) | r2;
- r4 = &r1[6];
+ packet_p = gSTWIStatus->txPacket->rfuPacket8.data;
+ serialNo = gRfuLinkStatus->my.serialNo = packet_p[4];
+ gRfuLinkStatus->my.serialNo = (packet_p[5] << 8) | serialNo;
+ gname_uname_p = &packet_p[6];
if (gRfuLinkStatus->my.serialNo & 0x8000)
{
gRfuLinkStatus->my.serialNo = gRfuLinkStatus->my.serialNo ^ 0x8000;
@@ -433,47 +488,54 @@ static void rfu_CB_configGameData(u8 ip, u16 r7)
gRfuLinkStatus->my.mbootFlag = 0;
}
for (i = 0; i < RFU_GAME_NAME_LENGTH; ++i)
- gRfuLinkStatus->my.gname[i] = *r4++;
- ++r4;
+ gRfuLinkStatus->my.gname[i] = *gname_uname_p++;
+ ++gname_uname_p;
for (i = 0; i < RFU_USER_NAME_LENGTH; ++i)
- gRfuLinkStatus->my.uname[i] = *r4++;
+ gRfuLinkStatus->my.uname[i] = *gname_uname_p++;
}
- rfu_STC_REQ_callback(ip, r7);
+ rfu_STC_REQ_callback(reqCommand, reqResult);
}
void rfu_REQ_startSearchChild(void)
{
- u16 r1;
-
+ u16 result;
+#if LIBRFU_VERSION >= 1026
+ u16 i;
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ {
+ gRfuStatic->lsFixedCount[i] = 0;
+ }
+#endif
+
STWI_set_Callback_M(rfu_CB_defaultCallback);
STWI_send_SystemStatusREQ();
- r1 = STWI_poll_CommandEnd();
- if (r1 == 0)
+ result = STWI_poll_CommandEnd();
+ if (result == 0)
{
if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0)
- rfu_STC_clearLinkStatus(1);
+ rfu_STC_clearLinkStatus(MODE_PARENT);
}
else
{
- rfu_STC_REQ_callback(25, r1);
+ rfu_STC_REQ_callback(ID_SC_START_REQ, result);
}
STWI_set_Callback_M(rfu_CB_startSearchChild);
STWI_send_SC_StartREQ();
}
-static void rfu_CB_startSearchChild(u8 r3, u16 reqResult)
+static void rfu_CB_startSearchChild(u8 reqCommand, u16 reqResult)
{
if (reqResult == 0)
gRfuStatic->SCStartFlag = 1;
- rfu_STC_REQ_callback(r3, reqResult);
+ rfu_STC_REQ_callback(reqCommand, reqResult);
}
-static void rfu_STC_clearLinkStatus(u8 r4)
+static void rfu_STC_clearLinkStatus(u8 parentChild)
{
u8 i;
-
+
rfu_clearAllSlot();
- if (r4 != 0)
+ if (parentChild != MODE_CHILD)
{
CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner));
gRfuLinkStatus->findParentCount = 0;
@@ -498,11 +560,11 @@ void rfu_REQ_endSearchChild(void)
STWI_send_SC_EndREQ();
}
-static void rfu_CB_pollAndEndSearchChild(u8 r4, u16 reqResult)
+static void rfu_CB_pollAndEndSearchChild(u8 reqCommand, u16 reqResult)
{
if (reqResult == 0)
rfu_STC_readChildList();
- if (r4 == 26)
+ if (reqCommand == ID_SC_POLL_REQ)
{
if (gRfuLinkStatus->my.id == 0)
{
@@ -512,60 +574,76 @@ static void rfu_CB_pollAndEndSearchChild(u8 r4, u16 reqResult)
gRfuLinkStatus->my.id = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0];
}
}
- else if (r4 == 27)
+ else if (reqCommand == ID_SC_END_REQ)
{
if (gRfuLinkStatus->parentChild == MODE_NEUTRAL)
gRfuLinkStatus->my.id = 0;
gRfuStatic->SCStartFlag = 0;
}
- rfu_STC_REQ_callback(r4, reqResult);
+ rfu_STC_REQ_callback(reqCommand, reqResult);
}
static void rfu_STC_readChildList(void)
{
- u32 r5;
- u8 r8 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1];
- u8 *r4;
+ u32 stwiParam;
+ u8 numSlots = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1];
+ u8 *data_p;
u8 i;
- u8 sp[4];
- u8 r2;
+ u8 bm_slot_id;
+#if LIBRFU_VERSION < 1026
+ u8 true_slots[RFU_CHILD_MAX];
+#endif
- if (r8 != 0)
+#if LIBRFU_VERSION < 1026
+ if (numSlots != 0)
{
- r5 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0];
+ stwiParam = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0];
STWI_set_Callback_M(rfu_CB_defaultCallback);
STWI_send_LinkStatusREQ();
if (STWI_poll_CommandEnd() == 0)
{
- r4 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4];
- for (i = 0; i < NELEMS(sp); ++i)
- sp[i] = *r4++;
+ data_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4];
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
+ true_slots[i] = *data_p++;
}
- gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = r5;
+ gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = stwiParam;
}
- for (r4 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4];
- r8 != 0;
- r4 += 4)
+#endif
+ for (data_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4];
+ numSlots != 0;
+ data_p += 4)
{
- r2 = r4[2];
- if (r2 < RFU_CHILD_MAX && !((gRfuLinkStatus->connSlotFlag >> r2) & 1) && !((gRfuLinkStatus->linkLossSlotFlag >> r2) & 1))
+ bm_slot_id = data_p[2];
+ if (bm_slot_id < RFU_CHILD_MAX && !((gRfuLinkStatus->connSlotFlag >> bm_slot_id) & 1) && !((gRfuLinkStatus->linkLossSlotFlag >> bm_slot_id) & 1))
{
- if (sp[r2] != 0)
- ++gRfuStatic->lsFixedCount[r2];
- if (gRfuStatic->lsFixedCount[r2] >= 4)
+ #if LIBRFU_VERSION < 1026
+ if (true_slots[bm_slot_id] != 0)
+ ++gRfuStatic->lsFixedCount[bm_slot_id];
+ if (gRfuStatic->lsFixedCount[bm_slot_id] >= 4)
{
- gRfuStatic->lsFixedCount[r2] = 0;
- gRfuLinkStatus->strength[r2] = 0xFF;
- gRfuLinkStatus->connSlotFlag |= 1 << r2;
+ gRfuStatic->lsFixedCount[bm_slot_id] = 0;
+ gRfuLinkStatus->strength[bm_slot_id] = 255;
+ gRfuLinkStatus->connSlotFlag |= 1 << bm_slot_id;
++gRfuLinkStatus->connCount;
- gRfuLinkStatus->partner[r2].id = *(u16 *)r4;
- gRfuLinkStatus->partner[r2].slot = r2;
+ gRfuLinkStatus->partner[bm_slot_id].id = *(u16 *)data_p;
+ gRfuLinkStatus->partner[bm_slot_id].slot = bm_slot_id;
gRfuLinkStatus->parentChild = MODE_PARENT;
gRfuStatic->flags &= 0x7F;
- gRfuStatic->cidBak[r2] = gRfuLinkStatus->partner[r2].id;
+ gRfuStatic->cidBak[bm_slot_id] = gRfuLinkStatus->partner[bm_slot_id].id;
}
+ #else
+ gRfuStatic->lsFixedCount[bm_slot_id] = 0xF0;
+ gRfuLinkStatus->strength[bm_slot_id] = 16;
+ gRfuLinkStatus->connSlotFlag |= 1 << bm_slot_id;
+ ++gRfuLinkStatus->connCount;
+ gRfuLinkStatus->partner[bm_slot_id].id = *(u16 *)data_p;
+ gRfuLinkStatus->partner[bm_slot_id].slot = bm_slot_id;
+ gRfuLinkStatus->parentChild = MODE_PARENT;
+ gRfuStatic->flags &= 0x7F;
+ gRfuStatic->cidBak[bm_slot_id] = gRfuLinkStatus->partner[bm_slot_id].id;
+ #endif
}
- --r8;
+ --numSlots;
}
}
@@ -575,11 +653,11 @@ void rfu_REQ_startSearchParent(void)
STWI_send_SP_StartREQ();
}
-static void rfu_CB_startSearchParent(u8 r5, u16 reqResult)
+static void rfu_CB_startSearchParent(u8 reqCommand, u16 reqResult)
{
if (reqResult == 0)
- rfu_STC_clearLinkStatus(0);
- rfu_STC_REQ_callback(r5, reqResult);
+ rfu_STC_clearLinkStatus(MODE_CHILD);
+ rfu_STC_REQ_callback(reqCommand, reqResult);
}
void rfu_REQ_pollSearchParent(void)
@@ -588,11 +666,11 @@ void rfu_REQ_pollSearchParent(void)
STWI_send_SP_PollingREQ();
}
-static void rfu_CB_pollSearchParent(u8 r5, u16 reqResult)
+static void rfu_CB_pollSearchParent(u8 reqCommand, u16 reqResult)
{
if (reqResult == 0)
rfu_STC_readParentCandidateList();
- rfu_STC_REQ_callback(r5, reqResult);
+ rfu_STC_REQ_callback(reqCommand, reqResult);
}
void rfu_REQ_endSearchParent(void)
@@ -603,47 +681,47 @@ void rfu_REQ_endSearchParent(void)
static void rfu_STC_readParentCandidateList(void)
{
- u8 r7, r6, r5, r4, r3;
- u8 *r1, *r2;
- struct RfuTgtData *r4_;
+ u8 numSlots, i, check_sum, my_check_sum, j;
+ u8 *uname_p, *packet_p;
+ struct RfuTgtData *target;
CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner));
- r2 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0];
- r7 = r2[1];
- r2 += 4;
+ packet_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0];
+ numSlots = packet_p[1];
+ packet_p += 4;
gRfuLinkStatus->findParentCount = 0;
- for (r6 = 0; r6 < 4 && r7 != 0; ++r6)
- {
- r7 -= 7;
- r1 = r2 + 6;
- r2 += 19;
- r5 = ~*r2;
- ++r2;
- r4 = 0;
- for (r3 = 0; r3 < 8; ++r3)
+ for (i = 0; i < RFU_CHILD_MAX && numSlots != 0; ++i)
+ {
+ numSlots -= 7;
+ uname_p = packet_p + 6;
+ packet_p += 19;
+ check_sum = ~*packet_p;
+ ++packet_p;
+ my_check_sum = 0;
+ for (j = 0; j < 8; ++j)
{
- r4 += *r2++;
- r4 += *r1++;
+ my_check_sum += *packet_p++;
+ my_check_sum += *uname_p++;
}
- if (r4 == r5)
+ if (my_check_sum == check_sum)
{
- r2 -= 28;
- r4_ = &gRfuLinkStatus->partner[gRfuLinkStatus->findParentCount];
- r4_->id = *(u16 *)r2;
- r2 += 2;
- r4_->slot = *r2;
- r2 += 2;
- r4_->serialNo = *(u16 *)r2 & 0x7FFF;
- if (*(u16 *)r2 & 0x8000)
- r4_->mbootFlag = 1;
+ packet_p -= 28;
+ target = &gRfuLinkStatus->partner[gRfuLinkStatus->findParentCount];
+ target->id = *(u16 *)packet_p;
+ packet_p += 2;
+ target->slot = *packet_p;
+ packet_p += 2;
+ target->serialNo = *(u16 *)packet_p & 0x7FFF;
+ if (*(u16 *)packet_p & 0x8000)
+ target->mbootFlag = 1;
else
- r4_->mbootFlag = 0;
- r2 += 2;
- for (r3 = 0; r3 < RFU_GAME_NAME_LENGTH; ++r3)
- r4_->gname[r3] = *r2++;
- ++r2;
- for (r3 = 0; r3 < RFU_USER_NAME_LENGTH; ++r3)
- r4_->uname[r3] = *r2++;
+ target->mbootFlag = 0;
+ packet_p += 2;
+ for (j = 0; j < RFU_GAME_NAME_LENGTH; ++j)
+ target->gname[j] = *packet_p++;
+ ++packet_p;
+ for (j = 0; j < RFU_USER_NAME_LENGTH; ++j)
+ target->uname[j] = *packet_p++;
++gRfuLinkStatus->findParentCount;
}
}
@@ -651,13 +729,13 @@ static void rfu_STC_readParentCandidateList(void)
void rfu_REQ_startConnectParent(u16 pid)
{
- u16 r3 = 0;
+ u16 result = 0;
u8 i;
for (i = 0; i < RFU_CHILD_MAX && gRfuLinkStatus->partner[i].id != pid; ++i)
;
- if (i == 4)
- r3 = 256;
- if (r3 == 0)
+ if (i == RFU_CHILD_MAX)
+ result = ERR_PID_NOT_FOUND;
+ if (result == 0)
{
gRfuStatic->tryPid = pid;
STWI_set_Callback_M(rfu_STC_REQ_callback);
@@ -665,7 +743,7 @@ void rfu_REQ_startConnectParent(u16 pid)
}
else
{
- rfu_STC_REQ_callback(31, r3);
+ rfu_STC_REQ_callback(ID_CP_START_REQ, result);
}
}
@@ -675,70 +753,69 @@ void rfu_REQ_pollConnectParent(void)
STWI_send_CP_PollingREQ();
}
-static void rfu_CB_pollConnectParent(u8 sp24, u16 sp28)
+static void rfu_CB_pollConnectParent(u8 reqCommand, u16 reqResult)
{
u16 id;
u8 slot;
- u8 r2, r5;
- struct RfuTgtData *r9;
- struct RfuTgtData sp;
+ u8 bm_slot_flag, i;
+ struct RfuTgtData *target_p;
+ struct RfuTgtData target_local;
- if (sp28 == 0)
+ if (reqResult == 0)
{
id = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0];
slot = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6];
if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0)
{
- r2 = 1 << slot;
- if (!(r2 & gRfuLinkStatus->connSlotFlag))
+ bm_slot_flag = 1 << slot;
+ if (!(bm_slot_flag & gRfuLinkStatus->connSlotFlag))
{
- gRfuLinkStatus->connSlotFlag |= r2;
- gRfuLinkStatus->linkLossSlotFlag &= ~r2;
+ gRfuLinkStatus->connSlotFlag |= bm_slot_flag;
+ gRfuLinkStatus->linkLossSlotFlag &= ~bm_slot_flag;
gRfuLinkStatus->my.id = id;
++gRfuLinkStatus->connCount;
gRfuLinkStatus->parentChild = MODE_CHILD;
gRfuStatic->flags |= 0x80;
- for (r5 = 0; r5 < RFU_CHILD_MAX; ++r5)
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
{
- if (gRfuLinkStatus->partner[r5].id == gRfuStatic->tryPid)
+ if (gRfuLinkStatus->partner[i].id == gRfuStatic->tryPid)
{
if (gRfuLinkStatus->findParentCount != 0)
{
- r9 = &sp;
- CpuCopy16(&gRfuLinkStatus->partner[r5], &sp, sizeof(struct RfuTgtData));
+ target_p = &target_local;
+ CpuCopy16(&gRfuLinkStatus->partner[i], &target_local, sizeof(struct RfuTgtData));
CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner));
gRfuLinkStatus->findParentCount = 0;
}
else
{
- r9 = &gRfuLinkStatus->partner[r5];
+ target_p = &gRfuLinkStatus->partner[i];
}
break;
}
}
- if (r5 < RFU_CHILD_MAX)
+ if (i < RFU_CHILD_MAX)
{
- CpuCopy16(r9, &gRfuLinkStatus->partner[slot], sizeof(struct RfuTgtData));
+ CpuCopy16(target_p, &gRfuLinkStatus->partner[slot], sizeof(struct RfuTgtData));
gRfuLinkStatus->partner[slot].slot = slot;
}
}
}
}
- rfu_STC_REQ_callback(sp24, sp28);
+ rfu_STC_REQ_callback(reqCommand, reqResult);
}
u16 rfu_getConnectParentStatus(u8 *status, u8 *connectSlotNo)
{
- u8 r0, *r2;
+ u8 *packet_p;
*status = 0xFF;
- r2 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data;
- r0 = r2[0] + 96;
- if (r0 <= 1)
+ packet_p = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data;
+ if (packet_p[0] == 0xa0 || packet_p[0] == 0xa1)
{
- r2 += 6;
- *connectSlotNo = r2[0];
- *status = r2[1];
+ packet_p += 6;
+ *connectSlotNo = packet_p[0];
+ *status = packet_p[1];
return 0;
}
return ERR_REQ_CMD_ID;
@@ -754,28 +831,28 @@ void rfu_REQ_endConnectParent(void)
u16 rfu_syncVBlank(void)
{
- u8 r3, r4;
- s32 r5;
+ u8 masterSlave, i;
+ s32 bmSlotFlag;
rfu_NI_checkCommFailCounter();
if (gRfuLinkStatus->parentChild == MODE_NEUTRAL)
return 0;
if (gRfuStatic->nowWatchInterval != 0)
--gRfuStatic->nowWatchInterval;
- r3 = rfu_getMasterSlave();
+ masterSlave = rfu_getMasterSlave();
if (!(gRfuStatic->flags & 2))
{
- if (r3 == 0)
+ if (masterSlave == AGB_CLK_SLAVE)
{
gRfuStatic->flags |= 4;
gRfuStatic->watchdogTimer = 360;
}
}
- else if (r3 != 0)
+ else if (masterSlave != AGB_CLK_SLAVE)
{
gRfuStatic->flags &= 0xFB;
}
- if (r3 != 0)
+ if (masterSlave != AGB_CLK_SLAVE)
gRfuStatic->flags &= 0xFD;
else
gRfuStatic->flags |= 2;
@@ -784,10 +861,10 @@ u16 rfu_syncVBlank(void)
if (gRfuStatic->watchdogTimer == 0)
{
gRfuStatic->flags &= 0xFB;
- r5 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag;
- for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4)
- if ((r5 >> r4) & 1)
- rfu_STC_removeLinkData(r4, 1);
+ bmSlotFlag = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag;
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
+ if ((bmSlotFlag >> i) & 1)
+ rfu_STC_removeLinkData(i, 1);
gRfuLinkStatus->parentChild = MODE_NEUTRAL;
return 1;
}
@@ -797,13 +874,13 @@ u16 rfu_syncVBlank(void)
u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason, u8 *parentBmLinkRecoverySlot)
{
- u8 sp08 = 0;
- u8 sp0C = 0;
+ u8 reasonMaybe = 0;
+ u8 reqResult = 0;
u8 i;
- s32 sp10, sp14;
- u8 *r2;
- u8 r9, r6, r3, connSlotFlag, r0;
-
+ s32 stwiCommand, stwiParam;
+ u8 *packet_p;
+ u8 to_req_disconnect, newLinkLossFlag, num_packets, connSlotFlag, to_disconnect;
+
*bmLinkLossSlot = 0;
*linkLossReason = REASON_DISCONNECTED;
*parentBmLinkRecoverySlot = 0;
@@ -813,26 +890,30 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason
gRfuStatic->watchdogTimer = 360;
if (gRfuStatic->nowWatchInterval == 0)
{
+ #if LIBRFU_VERSION < 1026
gRfuStatic->nowWatchInterval = gRfuLinkStatus->watchInterval;
- sp08 = 1;
+ #else
+ gRfuStatic->nowWatchInterval = 4;
+ #endif
+ reasonMaybe = 1;
}
- if ((u8)reqCommandId == 41)
+ if ((u8)reqCommandId == ID_DISCONNECTED_AND_CHANGE_REQ)
{
- u8 *r1 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data;
-
- *bmLinkLossSlot = r1[4];
- *linkLossReason = r1[5];
+ u8 *packet_p_2 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data;
+
+ *bmLinkLossSlot = packet_p_2[4];
+ *linkLossReason = packet_p_2[5];
if (*linkLossReason == REASON_LINK_LOSS)
*bmLinkLossSlot = gRfuLinkStatus->connSlotFlag;
- sp08 = 2;
+ reasonMaybe = 2;
}
else
{
- if (reqCommandId == 310)
+ if (reqCommandId == 0x0136)
{
- r6 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[5];
- r6 ^= gRfuLinkStatus->connSlotFlag;
- *bmLinkLossSlot = r6 & gRfuLinkStatus->connSlotFlag;
+ newLinkLossFlag = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[5];
+ newLinkLossFlag ^= gRfuLinkStatus->connSlotFlag;
+ *bmLinkLossSlot = newLinkLossFlag & gRfuLinkStatus->connSlotFlag;
*linkLossReason = REASON_LINK_LOSS;
for (i = 0; i < RFU_CHILD_MAX; ++i)
{
@@ -843,33 +924,41 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason
}
}
}
- if (sp08 == 0)
+ if (reasonMaybe == 0)
return 0;
}
- sp10 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command;
- sp14 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0];
+ stwiCommand = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command;
+ stwiParam = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0];
STWI_set_Callback_M(rfu_CB_defaultCallback);
STWI_send_LinkStatusREQ();
- sp0C = STWI_poll_CommandEnd();
- if (sp0C == 0)
+ reqResult = STWI_poll_CommandEnd();
+ if (reqResult == 0)
{
- r2 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4];
+ packet_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4];
for (i = 0; i < RFU_CHILD_MAX; ++i)
- gRfuLinkStatus->strength[i] = *r2++;
- r9 = 0;
+ gRfuLinkStatus->strength[i] = *packet_p++;
+ to_req_disconnect = 0;
i = 0;
}
else
{
- rfu_STC_REQ_callback(17, sp0C);
- return sp0C;
+ rfu_STC_REQ_callback(ID_LINK_STATUS_REQ, reqResult);
+ return reqResult;
}
for (; i < RFU_CHILD_MAX; ++i)
{
- r6 = 1 << i;
- if (sp0C == 0)
+ #if LIBRFU_VERSION >= 1026
+ if (gRfuStatic->lsFixedCount[i] != 0)
+ {
+ gRfuStatic->lsFixedCount[i] -= 4;
+ if (gRfuLinkStatus->strength[i] <= 15)
+ gRfuLinkStatus->strength[i] = 16;
+ }
+ #endif
+ newLinkLossFlag = 1 << i;
+ if (reqResult == 0)
{
- if (sp08 == 1 && (gRfuLinkStatus->connSlotFlag & r6))
+ if (reasonMaybe == 1 && (gRfuLinkStatus->connSlotFlag & newLinkLossFlag))
{
if (gRfuLinkStatus->strength[i] == 0)
{
@@ -878,8 +967,8 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason
++gRfuStatic->linkEmergencyFlag[i];
if (gRfuStatic->linkEmergencyFlag[i] > 3)
{
- *bmLinkLossSlot |= r6;
- *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS?
+ *bmLinkLossSlot |= newLinkLossFlag;
+ *linkLossReason = REASON_LINK_LOSS;
}
}
else
@@ -889,18 +978,18 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason
{
if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0)
{
- *bmLinkLossSlot |= r6;
- *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS?
+ *bmLinkLossSlot |= newLinkLossFlag;
+ *linkLossReason = REASON_LINK_LOSS;
}
else
{
- if (++gRfuStatic->linkEmergencyFlag[i] > gRfuStatic->unk_1a)
+ if (++gRfuStatic->linkEmergencyFlag[i] > gRfuStatic->linkEmergencyLimit)
{
gRfuStatic->linkEmergencyFlag[i] = 0;
STWI_send_DisconnectREQ(gRfuLinkStatus->connSlotFlag);
STWI_poll_CommandEnd();
- *bmLinkLossSlot |= r6;
- *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS?
+ *bmLinkLossSlot |= newLinkLossFlag;
+ *linkLossReason = REASON_LINK_LOSS;
}
}
}
@@ -908,18 +997,18 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason
}
else
{
- gRfuStatic->linkEmergencyFlag[i] = sp0C; // why not directly use 0?
+ gRfuStatic->linkEmergencyFlag[i] = 0;
}
}
if (gRfuLinkStatus->parentChild == MODE_PARENT && gRfuLinkStatus->strength[i] != 0)
{
- if (r6 & gRfuLinkStatus->linkLossSlotFlag)
+ if (newLinkLossFlag & gRfuLinkStatus->linkLossSlotFlag)
{
if (gRfuLinkStatus->strength[i] > 10)
{
- *parentBmLinkRecoverySlot |= r6;
- gRfuLinkStatus->connSlotFlag |= r6;
- gRfuLinkStatus->linkLossSlotFlag &= ~r6;
+ *parentBmLinkRecoverySlot |= newLinkLossFlag;
+ gRfuLinkStatus->connSlotFlag |= newLinkLossFlag;
+ gRfuLinkStatus->linkLossSlotFlag &= ~newLinkLossFlag;
++gRfuLinkStatus->connCount;
gRfuStatic->linkEmergencyFlag[i] = 0;
}
@@ -930,19 +1019,19 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason
}
else
{
- if (!((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & r6))
+ if (!((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & newLinkLossFlag))
{
STWI_send_SlotStatusREQ();
STWI_poll_CommandEnd();
- r2 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data;
- r3 = r2[1] - 1;
- for (r2 += 8; r3 != 0; r2 += 4, --r3)
+ packet_p = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data;
+ num_packets = packet_p[1] - 1;
+ for (packet_p += 8; num_packets != 0; packet_p += 4, --num_packets)
{
- u16 r4 = *(u16 *)r2;
+ u16 cid = *(u16 *)packet_p;
- if (r2[2] == i && r4 == gRfuStatic->cidBak[i])
+ if (packet_p[2] == i && cid == gRfuStatic->cidBak[i])
{
- r9 |= 1 << i;
+ to_req_disconnect |= 1 << i;
break;
}
}
@@ -951,46 +1040,49 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason
}
}
connSlotFlag = gRfuLinkStatus->connSlotFlag;
- r0 = *bmLinkLossSlot;
- r0 &= connSlotFlag;
- if (r6 & r0)
+ to_disconnect = *bmLinkLossSlot;
+ to_disconnect &= connSlotFlag;
+ if (newLinkLossFlag & to_disconnect)
rfu_STC_removeLinkData(i, 0);
}
- if (r9 != 0)
+ if (to_req_disconnect != 0)
{
- STWI_send_DisconnectREQ(r9);
+ STWI_send_DisconnectREQ(to_req_disconnect);
STWI_poll_CommandEnd();
}
// equivalent to:
- // gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command = sp10;
- *(u32 *)gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data = sp10;
- gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = sp14;
+ // gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command = stwiCommand;
+ *(u32 *)gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data = stwiCommand;
+ gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = stwiParam;
return 0;
}
-static void rfu_STC_removeLinkData(u8 r7, u8 r12)
+static void rfu_STC_removeLinkData(u8 bmConnectedPartnerId, u8 bmDisconnect)
{
- u8 r5 = 1 << r7;
- s32 r6;
+ u8 bmLinkLossFlag = 1 << bmConnectedPartnerId;
+ s32 bmLinkRetainedFlag;
- if ((gRfuLinkStatus->connSlotFlag & r5) && gRfuLinkStatus->connCount != 0)
+#if LIBRFU_VERSION >= 1026
+ gRfuStatic->lsFixedCount[bmConnectedPartnerId] = 0;
+#endif
+ if ((gRfuLinkStatus->connSlotFlag & bmLinkLossFlag) && gRfuLinkStatus->connCount != 0)
--gRfuLinkStatus->connCount;
- gRfuLinkStatus->connSlotFlag &= r6 = ~r5;
- gRfuLinkStatus->linkLossSlotFlag |= r5;
- if ((*(u32 *)gRfuLinkStatus & 0xFF00FF) == 0)
+ gRfuLinkStatus->connSlotFlag &= bmLinkRetainedFlag = ~bmLinkLossFlag;
+ gRfuLinkStatus->linkLossSlotFlag |= bmLinkLossFlag;
+ if (gRfuLinkStatus->parentChild == MODE_CHILD && gRfuLinkStatus->connSlotFlag == 0)
gRfuLinkStatus->parentChild = MODE_NEUTRAL;
- if (r12 != 0)
+ if (bmDisconnect)
{
- CpuFill16(0, &gRfuLinkStatus->partner[r7], sizeof(struct RfuTgtData));
- gRfuLinkStatus->linkLossSlotFlag &= r6;
- gRfuLinkStatus->getNameFlag &= r6;
- gRfuLinkStatus->strength[r7] = 0;
+ CpuFill16(0, &gRfuLinkStatus->partner[bmConnectedPartnerId], sizeof(struct RfuTgtData));
+ gRfuLinkStatus->linkLossSlotFlag &= bmLinkRetainedFlag;
+ gRfuLinkStatus->getNameFlag &= bmLinkRetainedFlag;
+ gRfuLinkStatus->strength[bmConnectedPartnerId] = 0;
}
}
void rfu_REQ_disconnect(u8 bmDisconnectSlot)
{
- u16 r1;
+ u16 result;
if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & bmDisconnectSlot)
{
@@ -1003,9 +1095,9 @@ void rfu_REQ_disconnect(u8 bmDisconnectSlot)
else if (gRfuStatic->SCStartFlag
&& (STWI_set_Callback_M(rfu_CB_defaultCallback),
STWI_send_SC_EndREQ(),
- (r1 = STWI_poll_CommandEnd()) != 0))
+ (result = STWI_poll_CommandEnd()) != 0))
{
- rfu_STC_REQ_callback(27, r1);
+ rfu_STC_REQ_callback(ID_SC_END_REQ, result);
}
else
{
@@ -1015,38 +1107,38 @@ void rfu_REQ_disconnect(u8 bmDisconnectSlot)
}
}
-static void rfu_CB_disconnect(u8 r6, u16 r5)
+static void rfu_CB_disconnect(u8 reqCommand, u16 reqResult)
{
- u8 r4, r0;
+ u8 i, bm_slot_flag;
- if (r5 == 3 && gRfuLinkStatus->parentChild == MODE_CHILD)
+ if (reqResult == 3 && gRfuLinkStatus->parentChild == MODE_CHILD)
{
STWI_set_Callback_M(rfu_CB_defaultCallback);
STWI_send_SystemStatusREQ();
if (STWI_poll_CommandEnd() == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0)
- r5 = 0;
+ reqResult = 0;
}
gRfuStatic->recoveryBmSlot &= gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag;
gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8] = gRfuStatic->recoveryBmSlot;
- if (r5 == 0)
+ if (reqResult == 0)
{
- for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4)
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
{
- r0 = 1 << r4;
- if (r0 & gRfuStatic->recoveryBmSlot)
- rfu_STC_removeLinkData(r4, 1);
+ bm_slot_flag = 1 << i;
+ if (bm_slot_flag & gRfuStatic->recoveryBmSlot)
+ rfu_STC_removeLinkData(i, 1);
}
}
if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) == 0)
gRfuLinkStatus->parentChild = MODE_NEUTRAL;
- rfu_STC_REQ_callback(r6, r5);
+ rfu_STC_REQ_callback(reqCommand, reqResult);
if (gRfuStatic->SCStartFlag)
{
STWI_set_Callback_M(rfu_CB_defaultCallback);
STWI_send_SC_StartREQ();
- r5 = STWI_poll_CommandEnd();
- if (r5 != 0)
- rfu_STC_REQ_callback(25, r5);
+ reqResult = STWI_poll_CommandEnd();
+ if (reqResult != 0)
+ rfu_STC_REQ_callback(ID_SC_START_REQ, reqResult);
}
}
@@ -1068,38 +1160,35 @@ void rfu_REQ_CHILD_pollConnectRecovery(void)
STWI_send_CPR_PollingREQ();
}
-static void rfu_CB_CHILD_pollConnectRecovery(u8 r8, u16 r7)
+static void rfu_CB_CHILD_pollConnectRecovery(u8 reqCommand, u16 reqResult)
{
- u8 r3, r4;
- struct RfuLinkStatus *r2;
+ u8 bm_slot_flag, i;
+ struct RfuLinkStatus *rfuLinkStatus;
- if (r7 == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] == 0 && gRfuStatic->recoveryBmSlot)
+ if (reqResult == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] == 0 && gRfuStatic->recoveryBmSlot)
{
gRfuLinkStatus->parentChild = MODE_CHILD;
- for (r4 = 0; r4 < NELEMS(gRfuStatic->linkEmergencyFlag); ++r4)
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
{
- r3 = 1 << r4;
- r2 = gRfuLinkStatus; // ???
- if (gRfuStatic->recoveryBmSlot & r3 & r2->linkLossSlotFlag)
+ bm_slot_flag = 1 << i;
+ rfuLinkStatus = gRfuLinkStatus; // ???
+ if (gRfuStatic->recoveryBmSlot & bm_slot_flag & rfuLinkStatus->linkLossSlotFlag)
{
- gRfuLinkStatus->connSlotFlag |= r3;
- gRfuLinkStatus->linkLossSlotFlag &= ~r3;
+ gRfuLinkStatus->connSlotFlag |= bm_slot_flag;
+ gRfuLinkStatus->linkLossSlotFlag &= ~bm_slot_flag;
++gRfuLinkStatus->connCount;
- gRfuStatic->linkEmergencyFlag[r4] = 0;
+ gRfuStatic->linkEmergencyFlag[i] = 0;
}
}
gRfuStatic->recoveryBmSlot = 0;
}
- rfu_STC_REQ_callback(r8, r7);
+ rfu_STC_REQ_callback(reqCommand, reqResult);
}
u16 rfu_CHILD_getConnectRecoveryStatus(u8 *status)
{
- u8 r0;
-
*status = 0xFF;
- r0 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] + 77;
- if (r0 <= 1)
+ if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] == 0xB3 || gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] == 0xB4)
{
*status = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4];
return 0;
@@ -1127,14 +1216,14 @@ static void rfu_STC_fastCopy(const u8 **src_p, u8 **dst_p, s32 size)
void rfu_REQ_changeMasterSlave(void)
{
- if (STWI_read_status(1) == 1)
+ if (STWI_read_status(1) == AGB_CLK_MASTER)
{
STWI_set_Callback_M(rfu_STC_REQ_callback);
STWI_send_MS_ChangeREQ();
}
else
{
- rfu_STC_REQ_callback(39, 0);
+ rfu_STC_REQ_callback(ID_MS_CHANGE_REQ, 0);
}
}
@@ -1144,11 +1233,11 @@ bool8 rfu_getMasterSlave(void)
if (masterSlave == AGB_CLK_MASTER)
{
- if (gSTWIStatus->unk_2c)
+ if (gSTWIStatus->sending)
{
- if (gSTWIStatus->reqActiveCommand == 39
- || gSTWIStatus->reqActiveCommand == 37
- || gSTWIStatus->reqActiveCommand == 55)
+ if (gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ
+ || gSTWIStatus->reqActiveCommand == ID_DATA_TX_AND_CHANGE_REQ
+ || gSTWIStatus->reqActiveCommand == ID_RESUME_RETRANSMIT_AND_CHANGE_REQ)
masterSlave = AGB_CLK_SLAVE;
}
}
@@ -1159,7 +1248,7 @@ void rfu_clearAllSlot(void)
{
u16 i;
u16 IMEBackup = REG_IME;
-
+
REG_IME = 0;
for (i = 0; i < RFU_CHILD_MAX; ++i)
{
@@ -1175,87 +1264,87 @@ void rfu_clearAllSlot(void)
REG_IME = IMEBackup;
}
-static void rfu_STC_releaseFrame(u8 r5, u8 r3, struct NIComm *r4)
+static void rfu_STC_releaseFrame(u8 bm_slot_id, u8 send_recv, struct NIComm *NI_comm)
{
if (!(gRfuStatic->flags & 0x80))
{
- if (r3 == 0)
- gRfuLinkStatus->remainLLFrameSizeParent += r4->payloadSize;
+ if (send_recv == 0)
+ gRfuLinkStatus->remainLLFrameSizeParent += NI_comm->payloadSize;
gRfuLinkStatus->remainLLFrameSizeParent += 3;
}
else
{
- if (r3 == 0)
- gRfuLinkStatus->remainLLFrameSizeChild[r5] += r4->payloadSize;
- gRfuLinkStatus->remainLLFrameSizeChild[r5] += 2;
+ if (send_recv == 0)
+ gRfuLinkStatus->remainLLFrameSizeChild[bm_slot_id] += NI_comm->payloadSize;
+ gRfuLinkStatus->remainLLFrameSizeChild[bm_slot_id] += 2;
}
}
u16 rfu_clearSlot(u8 connTypeFlag, u8 slotStatusIndex)
{
- u16 r10, r3, r1;
- struct NIComm *r4;
+ u16 imeBak, send_recv, i;
+ struct NIComm *NI_comm;
if (slotStatusIndex >= RFU_CHILD_MAX)
return ERR_SLOT_NO;
if (!(connTypeFlag & (TYPE_UNI_SEND | TYPE_UNI_RECV | TYPE_NI_SEND | TYPE_NI_RECV)))
return ERR_COMM_TYPE;
- r10 = REG_IME;
+ imeBak = REG_IME;
REG_IME = 0;
if (connTypeFlag & (TYPE_NI_SEND | TYPE_NI_RECV))
{
- for (r3 = 0; r3 < 2; ++r3)
+ for (send_recv = 0; send_recv < 2; ++send_recv)
{
- r4 = NULL;
- if (r3 == 0)
+ NI_comm = NULL;
+ if (send_recv == 0)
{
if (connTypeFlag & TYPE_NI_SEND)
{
- r4 = &gRfuSlotStatusNI[slotStatusIndex]->send;
- gRfuLinkStatus->sendSlotNIFlag &= ~r4->bmSlotOrg;
+ NI_comm = &gRfuSlotStatusNI[slotStatusIndex]->send;
+ gRfuLinkStatus->sendSlotNIFlag &= ~NI_comm->bmSlotOrg;
}
}
else
{
if (connTypeFlag & TYPE_NI_RECV)
{
- r4 = &gRfuSlotStatusNI[slotStatusIndex]->recv;
+ NI_comm = &gRfuSlotStatusNI[slotStatusIndex]->recv;
gRfuLinkStatus->recvSlotNIFlag &= ~(1 << slotStatusIndex);
}
}
- if (r4 != NULL)
+ if (NI_comm != NULL)
{
- if (r4->state & SLOT_BUSY_FLAG)
+ if (NI_comm->state & SLOT_BUSY_FLAG)
{
- rfu_STC_releaseFrame(slotStatusIndex, r3, r4);
- for (r1 = 0; r1 < RFU_CHILD_MAX; ++r1)
- if ((r4->bmSlotOrg >> r1) & 1)
- r4->failCounter = 0;
+ rfu_STC_releaseFrame(slotStatusIndex, send_recv, NI_comm);
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
+ if ((NI_comm->bmSlotOrg >> i) & 1)
+ NI_comm->failCounter = 0;
}
- CpuFill16(0, r4, sizeof(struct NIComm));
+ CpuFill16(0, NI_comm, sizeof(struct NIComm));
}
}
}
if (connTypeFlag & TYPE_UNI_SEND)
{
- struct RfuSlotStatusUNI *r3 = gRfuSlotStatusUNI[slotStatusIndex];
+ struct RfuSlotStatusUNI *slotStatusUNI = gRfuSlotStatusUNI[slotStatusIndex];
- if (r3->send.state & SLOT_BUSY_FLAG)
+ if (slotStatusUNI->send.state & SLOT_BUSY_FLAG)
{
if (!(gRfuStatic->flags & 0x80))
- gRfuLinkStatus->remainLLFrameSizeParent += 3 + (u8)r3->send.payloadSize;
+ gRfuLinkStatus->remainLLFrameSizeParent += 3 + (u8)slotStatusUNI->send.payloadSize;
else
- gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] += 2 + (u8)r3->send.payloadSize;
- gRfuLinkStatus->sendSlotUNIFlag &= ~r3->send.bmSlot;
+ gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] += 2 + (u8)slotStatusUNI->send.payloadSize;
+ gRfuLinkStatus->sendSlotUNIFlag &= ~slotStatusUNI->send.bmSlot;
}
- CpuFill16(0, &r3->send, sizeof(struct UNISend));
+ CpuFill16(0, &slotStatusUNI->send, sizeof(struct UNISend));
}
if (connTypeFlag & TYPE_UNI_RECV)
{
CpuFill16(0, &gRfuSlotStatusUNI[slotStatusIndex]->recv, sizeof(struct UNIRecv));
}
- REG_IME = r10;
+ REG_IME = imeBak;
return 0;
}
@@ -1301,16 +1390,16 @@ u16 rfu_NI_CHILD_setSendGameName(u8 slotNo, u8 subFrameSize)
return rfu_STC_setSendData_org(64, 1 << slotNo, subFrameSize, &gRfuLinkStatus->my.serialNo, 26);
}
-static u16 rfu_STC_setSendData_org(u8 r6, u8 bmSendSlot, u8 subFrameSize, const void *src, u32 sp28)
+static u16 rfu_STC_setSendData_org(u8 ni_or_uni, u8 bmSendSlot, u8 subFrameSize, const void *src, u32 dataSize)
{
- u8 r2, r0;
- u8 r4;
- u8 *r9;
- u8 r5;
+ u8 bm_slot_id, sendSlotFlag;
+ u8 frameSize;
+ u8 *llFrameSize_p;
+ u8 sending;
u8 i;
- u16 sp04;
- struct RfuSlotStatusUNI *r1;
- struct RfuSlotStatusNI *r12;
+ u16 imeBak;
+ struct RfuSlotStatusUNI *slotStatus_UNI;
+ struct RfuSlotStatusNI *slotStatus_NI;
if (gRfuLinkStatus->parentChild == MODE_NEUTRAL)
return ERR_MODE_NOT_CONNECTED;
@@ -1318,108 +1407,108 @@ static u16 rfu_STC_setSendData_org(u8 r6, u8 bmSendSlot, u8 subFrameSize, const
return ERR_SLOT_NO;
if (((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & bmSendSlot) != bmSendSlot)
return ERR_SLOT_NOT_CONNECTED;
- if (r6 & 0x10)
- r0 = gRfuLinkStatus->sendSlotUNIFlag;
+ if (ni_or_uni & 0x10)
+ sendSlotFlag = gRfuLinkStatus->sendSlotUNIFlag;
else
- r0 = gRfuLinkStatus->sendSlotNIFlag;
- if (r0 & bmSendSlot)
+ sendSlotFlag = gRfuLinkStatus->sendSlotNIFlag;
+ if (sendSlotFlag & bmSendSlot)
return ERR_SLOT_BUSY;
- for (r2 = 0; r2 < RFU_CHILD_MAX && !((bmSendSlot >> r2) & 1); ++r2)
+ for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX && !((bmSendSlot >> bm_slot_id) & 1); ++bm_slot_id)
;
if (gRfuLinkStatus->parentChild == MODE_PARENT)
- r9 = &gRfuLinkStatus->remainLLFrameSizeParent;
+ llFrameSize_p = &gRfuLinkStatus->remainLLFrameSizeParent;
else if (gRfuLinkStatus->parentChild == MODE_CHILD)
- r9 = &gRfuLinkStatus->remainLLFrameSizeChild[r2];
- r4 = llsf_struct[gRfuLinkStatus->parentChild].unk00;
- if (subFrameSize > *r9 || subFrameSize <= r4)
+ llFrameSize_p = &gRfuLinkStatus->remainLLFrameSizeChild[bm_slot_id];
+ frameSize = llsf_struct[gRfuLinkStatus->parentChild].frameSize;
+ if (subFrameSize > *llFrameSize_p || subFrameSize <= frameSize)
return ERR_SUBFRAME_SIZE;
- sp04 = REG_IME;
+ imeBak = REG_IME;
REG_IME = 0;
- r5 = r6 & 0x20;
- if (r5 || r6 == 0x40)
- {
- u8 *r1; // a hack to swap instructions
-
- r12 = gRfuSlotStatusNI[r2];
- r1 = NULL;
- r12->send.errorCode = 0;
- *r12->send.now_p = r1 = &r12->send.dataType;
- r12->send.remainSize = 7;
- r12->send.bmSlotOrg = bmSendSlot;
- r12->send.bmSlot = bmSendSlot;
- r12->send.payloadSize = subFrameSize - r4;
- if (r5 != 0)
- *r1 = 0;
+ sending = ni_or_uni & 0x20;
+ if (sending || ni_or_uni == 0x40)
+ {
+ u8 *dataType_p; // a hack to swap instructions
+
+ slotStatus_NI = gRfuSlotStatusNI[bm_slot_id];
+ slotStatus_UNI = NULL;
+ slotStatus_NI->send.errorCode = 0;
+ *slotStatus_NI->send.now_p = dataType_p = &slotStatus_NI->send.dataType;
+ slotStatus_NI->send.remainSize = 7;
+ slotStatus_NI->send.bmSlotOrg = bmSendSlot;
+ slotStatus_NI->send.bmSlot = bmSendSlot;
+ slotStatus_NI->send.payloadSize = subFrameSize - frameSize;
+ if (sending != 0)
+ *dataType_p = 0;
else
- *r1 = 1;
- r12->send.dataSize = sp28;
- r12->send.src = src;
- r12->send.ack = 0;
- r12->send.phase = 0;
+ *dataType_p = 1;
+ slotStatus_NI->send.dataSize = dataSize;
+ slotStatus_NI->send.src = src;
+ slotStatus_NI->send.ack = 0;
+ slotStatus_NI->send.phase = 0;
#ifndef NONMATCHING // to fix r2, r3, r4, r5 register roulette
asm("":::"r2");
#endif
for (i = 0; i < WINDOW_COUNT; ++i)
{
- r12->send.recvAckFlag[i] = 0;
- r12->send.n[i] = 1;
+ slotStatus_NI->send.recvAckFlag[i] = 0;
+ slotStatus_NI->send.n[i] = 1;
}
- for (r2 = 0; r2 < RFU_CHILD_MAX; ++r2)
- if ((bmSendSlot >> r2) & 1)
- gRfuSlotStatusNI[r2]->send.failCounter = 0;
+ for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX; ++bm_slot_id)
+ if ((bmSendSlot >> bm_slot_id) & 1)
+ gRfuSlotStatusNI[bm_slot_id]->send.failCounter = 0;
gRfuLinkStatus->sendSlotNIFlag |= bmSendSlot;
- *r9 -= subFrameSize;
- r12->send.state = SLOT_STATE_SEND_START;
+ *llFrameSize_p -= subFrameSize;
+ slotStatus_NI->send.state = SLOT_STATE_SEND_START;
}
- else if (r6 & 0x10)
+ else if (ni_or_uni & 0x10)
{
- r1 = gRfuSlotStatusUNI[r2];
- r1->send.bmSlot = bmSendSlot;
- r1->send.src = src;
- r1->send.payloadSize = subFrameSize - r4;
- *r9 -= subFrameSize;
- r1->send.state = SLOT_STATE_SEND_UNI;
+ slotStatus_UNI = gRfuSlotStatusUNI[bm_slot_id];
+ slotStatus_UNI->send.bmSlot = bmSendSlot;
+ slotStatus_UNI->send.src = src;
+ slotStatus_UNI->send.payloadSize = subFrameSize - frameSize;
+ *llFrameSize_p -= subFrameSize;
+ slotStatus_UNI->send.state = SLOT_STATE_SEND_UNI;
gRfuLinkStatus->sendSlotUNIFlag |= bmSendSlot;
}
- REG_IME = sp04;
+ REG_IME = imeBak;
return 0;
}
u16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot)
{
- struct RfuSlotStatusNI *r5;
- u16 r8;
- u8 r2;
+ struct RfuSlotStatusNI *slotStatusNI;
+ u16 imeBak;
+ u8 i;
if (slotStatusIndex >= RFU_CHILD_MAX)
return ERR_SLOT_NO;
if (connType == 0x20)
{
- r5 = gRfuSlotStatusNI[slotStatusIndex];
- if ((r5->send.state & SLOT_BUSY_FLAG)
- && (r5->send.state & SLOT_SEND_FLAG))
+ slotStatusNI = gRfuSlotStatusNI[slotStatusIndex];
+ if ((slotStatusNI->send.state & SLOT_BUSY_FLAG)
+ && (slotStatusNI->send.state & SLOT_SEND_FLAG))
{
- connType = bmNewTgtSlot ^ r5->send.bmSlot;
-
+ connType = bmNewTgtSlot ^ slotStatusNI->send.bmSlot;
+
if (!(connType & bmNewTgtSlot))
{
if (connType)
{
- r8 = REG_IME;
+ imeBak = REG_IME;
REG_IME = 0;
- for (r2 = 0; r2 < RFU_CHILD_MAX; ++r2)
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
{
- if ((connType >> r2) & 1)
- gRfuSlotStatusNI[r2]->send.failCounter = 0;
+ if ((connType >> i) & 1)
+ gRfuSlotStatusNI[i]->send.failCounter = 0;
}
gRfuLinkStatus->sendSlotNIFlag &= ~connType;
- r5->send.bmSlot = bmNewTgtSlot;
- if (r5->send.bmSlot == 0)
+ slotStatusNI->send.bmSlot = bmNewTgtSlot;
+ if (slotStatusNI->send.bmSlot == 0)
{
- rfu_STC_releaseFrame(slotStatusIndex, 0, &r5->send);
- r5->send.state = SLOT_STATE_SEND_FAILED;
+ rfu_STC_releaseFrame(slotStatusIndex, 0, &slotStatusNI->send);
+ slotStatusNI->send.state = SLOT_STATE_SEND_FAILED;
}
- REG_IME = r8;
+ REG_IME = imeBak;
}
}
else
@@ -1436,21 +1525,21 @@ u16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot)
{
if (connType == 16)
{
- s32 r3;
+ s32 bmSlot;
if (gRfuSlotStatusUNI[slotStatusIndex]->send.state != SLOT_STATE_SEND_UNI)
return ERR_SLOT_NOT_SENDING;
- for (r3 = 0, r2 = 0; r2 < RFU_CHILD_MAX; ++r2)
- if (r2 != slotStatusIndex)
- r3 |= gRfuSlotStatusUNI[r2]->send.bmSlot;
- if (bmNewTgtSlot & r3)
+ for (bmSlot = 0, i = 0; i < RFU_CHILD_MAX; ++i)
+ if (i != slotStatusIndex)
+ bmSlot |= gRfuSlotStatusUNI[i]->send.bmSlot;
+ if (bmNewTgtSlot & bmSlot)
return ERR_SLOT_TARGET;
- r8 = REG_IME;
+ imeBak = REG_IME;
REG_IME = 0;
gRfuLinkStatus->sendSlotUNIFlag &= ~gRfuSlotStatusUNI[slotStatusIndex]->send.bmSlot;
gRfuLinkStatus->sendSlotUNIFlag |= bmNewTgtSlot;
gRfuSlotStatusUNI[slotStatusIndex]->send.bmSlot = bmNewTgtSlot;
- REG_IME = r8;
+ REG_IME = imeBak;
}
else
{
@@ -1462,14 +1551,14 @@ u16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot)
u16 rfu_NI_stopReceivingData(u8 slotStatusIndex)
{
- struct NIComm *r5;
- u16 r4, r1;
+ struct NIComm *NI_comm;
+ u16 imeBak;
if (slotStatusIndex >= RFU_CHILD_MAX)
return ERR_SLOT_NO;
- r5 = &gRfuSlotStatusNI[slotStatusIndex]->recv;
- r4 = REG_IME;
- ++r4; --r4; // fix r4, r5 register swap
+ NI_comm = &gRfuSlotStatusNI[slotStatusIndex]->recv;
+ imeBak = REG_IME;
+ ++imeBak; --imeBak; // fix imeBak, NI_comm register swap
REG_IME = 0;
if (gRfuSlotStatusNI[slotStatusIndex]->recv.state & SLOT_BUSY_FLAG)
{
@@ -1478,43 +1567,43 @@ u16 rfu_NI_stopReceivingData(u8 slotStatusIndex)
else
gRfuSlotStatusNI[slotStatusIndex]->recv.state = SLOT_STATE_RECV_FAILED;
gRfuLinkStatus->recvSlotNIFlag &= ~(1 << slotStatusIndex);
- rfu_STC_releaseFrame(slotStatusIndex, 1, r5);
+ rfu_STC_releaseFrame(slotStatusIndex, 1, NI_comm);
}
- REG_IME = r4;
+ REG_IME = imeBak;
return 0;
}
u16 rfu_UNI_changeAndReadySendData(u8 slotStatusIndex, const void *src, u8 size)
{
- struct UNISend *r4;
- u8 *r6;
- u16 r1;
- u8 r3_;
+ struct UNISend *UNI_send;
+ u8 *frame_p;
+ u16 imeBak;
+ u8 frameEnd;
if (slotStatusIndex >= RFU_CHILD_MAX)
return ERR_SLOT_NO;
- r4 = &gRfuSlotStatusUNI[slotStatusIndex]->send;
- if (r4->state != SLOT_STATE_SEND_UNI)
+ UNI_send = &gRfuSlotStatusUNI[slotStatusIndex]->send;
+ if (UNI_send->state != SLOT_STATE_SEND_UNI)
return ERR_SLOT_NOT_SENDING;
if (gRfuLinkStatus->parentChild == MODE_PARENT)
{
- r6 = &gRfuLinkStatus->remainLLFrameSizeParent;
- r3_ = gRfuLinkStatus->remainLLFrameSizeParent + (u8)r4->payloadSize;
+ frame_p = &gRfuLinkStatus->remainLLFrameSizeParent;
+ frameEnd = gRfuLinkStatus->remainLLFrameSizeParent + (u8)UNI_send->payloadSize;
}
else
{
- r6 = &gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex];
- r3_ = gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] + (u8)r4->payloadSize;
+ frame_p = &gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex];
+ frameEnd = gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] + (u8)UNI_send->payloadSize;
}
- if (r3_ < size)
+ if (frameEnd < size)
return ERR_SUBFRAME_SIZE;
- r1 = REG_IME;
+ imeBak = REG_IME;
REG_IME = 0;
- r4->src = src;
- *r6 = r3_ - size;
- r4->payloadSize = size;
- r4->dataReadyFlag = 1;
- REG_IME = r1;
+ UNI_send->src = src;
+ *frame_p = frameEnd - size;
+ UNI_send->payloadSize = size;
+ UNI_send->dataReadyFlag = 1;
+ REG_IME = imeBak;
return 0;
}
@@ -1593,184 +1682,184 @@ void rfu_REQ_sendData(bool8 clockChangeFlag)
}
}
-static void rfu_CB_sendData(UNUSED u8 r0, u16 r7)
+static void rfu_CB_sendData(UNUSED u8 reqCommand, u16 reqResult)
{
- u8 r6;
- struct NIComm *r4;
+ u8 i;
+ struct NIComm *NI_comm;
- if (r7 == 0)
+ if (reqResult == 0)
{
- for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6)
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
{
- if (gRfuSlotStatusUNI[r6]->send.dataReadyFlag)
- gRfuSlotStatusUNI[r6]->send.dataReadyFlag = 0;
- r4 = &gRfuSlotStatusNI[r6]->send;
- if (r4->state == SLOT_STATE_SEND_NULL)
+ if (gRfuSlotStatusUNI[i]->send.dataReadyFlag)
+ gRfuSlotStatusUNI[i]->send.dataReadyFlag = 0;
+ NI_comm = &gRfuSlotStatusNI[i]->send;
+ if (NI_comm->state == SLOT_STATE_SEND_NULL)
{
- rfu_STC_releaseFrame(r6, 0, r4);
- gRfuLinkStatus->sendSlotNIFlag &= ~r4->bmSlot;
- if (r4->dataType == 1)
- gRfuLinkStatus->getNameFlag |= 1 << r6;
- r4->state = SLOT_STATE_SEND_SUCCESS;
+ rfu_STC_releaseFrame(i, 0, NI_comm);
+ gRfuLinkStatus->sendSlotNIFlag &= ~NI_comm->bmSlot;
+ if (NI_comm->dataType == 1)
+ gRfuLinkStatus->getNameFlag |= 1 << i;
+ NI_comm->state = SLOT_STATE_SEND_SUCCESS;
}
}
}
gRfuLinkStatus->LLFReadyFlag = 0;
- rfu_STC_REQ_callback(36, r7);
+ rfu_STC_REQ_callback(ID_DATA_TX_REQ, reqResult);
}
-static void rfu_CB_sendData2(UNUSED u8 r0, u16 r1)
+static void rfu_CB_sendData2(UNUSED u8 reqCommand, u16 reqResult)
{
- rfu_STC_REQ_callback(36, r1);
+ rfu_STC_REQ_callback(ID_DATA_TX_REQ, reqResult);
}
-static void rfu_CB_sendData3(u8 r0, u16 r1)
+static void rfu_CB_sendData3(u8 reqCommand, u16 reqResult)
{
- if (r1 != 0)
- rfu_STC_REQ_callback(36, r1);
- else if (r0 == 0xFF)
- rfu_STC_REQ_callback(0xFF, 0);
+ if (reqResult != 0)
+ rfu_STC_REQ_callback(ID_DATA_TX_REQ, reqResult);
+ else if (reqCommand == ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ)
+ rfu_STC_REQ_callback(ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ, 0);
}
static void rfu_constructSendLLFrame(void)
{
- u32 r8, r5;
- u8 r6;
- u8 *sp00;
- struct RfuSlotStatusNI *r2;
+ u32 pakcketSize, currSize;
+ u8 i;
+ u8 *llf_p;
+ struct RfuSlotStatusNI *slotStatusNI;
if (gRfuLinkStatus->parentChild != MODE_NEUTRAL
&& gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag)
{
gRfuLinkStatus->LLFReadyFlag = 0;
- r8 = 0;
- sp00 = (u8 *)&gRfuFixed->LLFBuffer[1];
- for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6)
+ pakcketSize = 0;
+ llf_p = (u8 *)&gRfuFixed->LLFBuffer[1];
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
{
- r5 = 0;
- if (gRfuSlotStatusNI[r6]->send.state & SLOT_BUSY_FLAG)
- r5 = rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->send);
- if (gRfuSlotStatusNI[r6]->recv.state & SLOT_BUSY_FLAG)
- r5 += rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->recv);
- if (gRfuSlotStatusUNI[r6]->send.state == SLOT_STATE_SEND_UNI)
- r5 += rfu_STC_UNI_constructLLSF(r6, &sp00);
- if (r5 != 0)
+ currSize = 0;
+ if (gRfuSlotStatusNI[i]->send.state & SLOT_BUSY_FLAG)
+ currSize = rfu_STC_NI_constructLLSF(i, &llf_p, &gRfuSlotStatusNI[i]->send);
+ if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG)
+ currSize += rfu_STC_NI_constructLLSF(i, &llf_p, &gRfuSlotStatusNI[i]->recv);
+ if (gRfuSlotStatusUNI[i]->send.state == SLOT_STATE_SEND_UNI)
+ currSize += rfu_STC_UNI_constructLLSF(i, &llf_p);
+ if (currSize != 0)
{
if (gRfuLinkStatus->parentChild == MODE_PARENT)
- r8 += r5;
+ pakcketSize += currSize;
else
- r8 |= r5 << (5 * r6 + 8);
+ pakcketSize |= currSize << (5 * i + 8);
}
}
- if (r8 != 0)
+ if (pakcketSize != 0)
{
- while ((u32)sp00 & 3)
- *sp00++ = 0;
- gRfuFixed->LLFBuffer[0] = r8;
+ while ((u32)llf_p & 3)
+ *llf_p++ = 0;
+ gRfuFixed->LLFBuffer[0] = pakcketSize;
if (gRfuLinkStatus->parentChild == MODE_CHILD)
{
- u8 *r0 = sp00 - offsetof(struct RfuFixed, LLFBuffer[1]);
-
- // Does the volatile qualifier make sense?
- // It's the same as:
+ u8 *maxSize = llf_p - offsetof(struct RfuFixed, LLFBuffer[1]);
+
+ // Does the volatile qualifier make sense?
+ // It's the same as:
// asm("":::"memory");
- r8 = r0 - *(u8 *volatile *)&gRfuFixed;
+ pakcketSize = maxSize - *(u8 *volatile *)&gRfuFixed;
}
}
- gRfuStatic->totalPacketSize = r8;
+ gRfuStatic->totalPacketSize = pakcketSize;
}
}
-static u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4)
+static u16 rfu_STC_NI_constructLLSF(u8 bm_slot_id, u8 **dest_pp, struct NIComm *NI_comm)
{
- u16 r5;
- u32 sp00;
+ u16 size;
+ u32 frame;
u8 i;
- u8 *r2;
- const struct LLSFStruct *r8 = &llsf_struct[gRfuLinkStatus->parentChild];
+ u8 *frame8_p;
+ const struct LLSFStruct *llsf = &llsf_struct[gRfuLinkStatus->parentChild];
- if (r4->state == SLOT_STATE_SENDING)
+ if (NI_comm->state == SLOT_STATE_SENDING)
{
- while (r4->now_p[r4->phase] >= (const u8 *)r4->src + r4->dataSize)
+ while (NI_comm->now_p[NI_comm->phase] >= (const u8 *)NI_comm->src + NI_comm->dataSize)
{
- ++r4->phase;
- if (r4->phase == 4)
- r4->phase = 0;
+ ++NI_comm->phase;
+ if (NI_comm->phase == 4)
+ NI_comm->phase = 0;
}
}
- if (r4->state & SLOT_RECV_FLAG)
+ if (NI_comm->state & SLOT_RECV_FLAG)
{
- r5 = 0;
+ size = 0;
}
- else if (r4->state == SLOT_STATE_SENDING)
+ else if (NI_comm->state == SLOT_STATE_SENDING)
{
- if (r4->now_p[r4->phase] + r4->payloadSize > (const u8 *)r4->src + r4->dataSize)
- r5 = (const u8 *)r4->src + r4->dataSize - r4->now_p[r4->phase];
+ if (NI_comm->now_p[NI_comm->phase] + NI_comm->payloadSize > (const u8 *)NI_comm->src + NI_comm->dataSize)
+ size = (const u8 *)NI_comm->src + NI_comm->dataSize - NI_comm->now_p[NI_comm->phase];
else
- r5 = r4->payloadSize;
+ size = NI_comm->payloadSize;
}
else
{
- if ((u32)r4->remainSize >= r4->payloadSize)
- r5 = r4->payloadSize;
+ if ((u32)NI_comm->remainSize >= NI_comm->payloadSize)
+ size = NI_comm->payloadSize;
else
- r5 = r4->remainSize;
+ size = NI_comm->remainSize;
}
- sp00 = (r4->state & 0xF) << r8->unk03
- | r4->ack << r8->unk04
- | r4->phase << r8->unk05
- | r4->n[r4->phase] << r8->unk06
- | r5;
+ frame = (NI_comm->state & 0xF) << llsf->slotStateShift
+ | NI_comm->ack << llsf->ackShift
+ | NI_comm->phase << llsf->phaseShit
+ | NI_comm->n[NI_comm->phase] << llsf->nShift
+ | size;
if (gRfuLinkStatus->parentChild == MODE_PARENT)
- sp00 |= r4->bmSlot << 18;
- r2 = (u8 *)&sp00;
- for (i = 0; i < r8->unk00; ++i)
- *(*r12)++ = *r2++;
- if (r5 != 0)
+ frame |= NI_comm->bmSlot << 18;
+ frame8_p = (u8 *)&frame;
+ for (i = 0; i < llsf->frameSize; ++i)
+ *(*dest_pp)++ = *frame8_p++;
+ if (size != 0)
{
- const u8 *sp04 = r4->now_p[r4->phase];
+ const u8 *src = NI_comm->now_p[NI_comm->phase];
- gRfuFixed->fastCopyPtr(&sp04, r12, r5);
+ gRfuFixed->fastCopyPtr(&src, dest_pp, size);
}
- if (r4->state == SLOT_STATE_SENDING)
+ if (NI_comm->state == SLOT_STATE_SENDING)
{
- ++r4->phase;
- if (r4->phase == 4)
- r4->phase = 0;
+ ++NI_comm->phase;
+ if (NI_comm->phase == 4)
+ NI_comm->phase = 0;
}
if (gRfuLinkStatus->parentChild == MODE_PARENT)
gRfuLinkStatus->LLFReadyFlag = 1;
else
- gRfuLinkStatus->LLFReadyFlag |= 1 << r10;
- return r5 + r8->unk00;
+ gRfuLinkStatus->LLFReadyFlag |= 1 << bm_slot_id;
+ return size + llsf->frameSize;
}
-static u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6)
+static u16 rfu_STC_UNI_constructLLSF(u8 bm_slot_id, u8 **dest_p)
{
- const struct LLSFStruct *r5;
- const u8 *sp04;
- u32 sp00;
- u8 *r2;
+ const struct LLSFStruct *llsf;
+ const u8 *src_p;
+ u32 frame;
+ u8 *frame8_p;
u8 i;
- struct UNISend *r4 = &gRfuSlotStatusUNI[r8]->send;
+ struct UNISend *UNI_send = &gRfuSlotStatusUNI[bm_slot_id]->send;
- if (!r4->dataReadyFlag || !r4->bmSlot)
+ if (!UNI_send->dataReadyFlag || !UNI_send->bmSlot)
return 0;
- r5 = &llsf_struct[gRfuLinkStatus->parentChild];
- sp00 = (r4->state & 0xF) << r5->unk03
- | r4->payloadSize;
+ llsf = &llsf_struct[gRfuLinkStatus->parentChild];
+ frame = (UNI_send->state & 0xF) << llsf->slotStateShift
+ | UNI_send->payloadSize;
if (gRfuLinkStatus->parentChild == MODE_PARENT)
- sp00 |= r4->bmSlot << 18;
- r2 = (u8 *)&sp00;
- for (i = 0; i < r5->unk00; ++i)
- *(*r6)++ = *r2++;
- sp04 = r4->src;
- gRfuFixed->fastCopyPtr(&sp04, r6, r4->payloadSize);
+ frame |= UNI_send->bmSlot << 18;
+ frame8_p = (u8 *)&frame;
+ for (i = 0; i < llsf->frameSize; ++i)
+ *(*dest_p)++ = *frame8_p++;
+ src_p = UNI_send->src;
+ gRfuFixed->fastCopyPtr(&src_p, dest_p, UNI_send->payloadSize);
if (gRfuLinkStatus->parentChild == MODE_PARENT)
gRfuLinkStatus->LLFReadyFlag = 16;
else
- gRfuLinkStatus->LLFReadyFlag |= 16 << r8;
- return r5->unk00 + r4->payloadSize;
+ gRfuLinkStatus->LLFReadyFlag |= 16 << bm_slot_id;
+ return llsf->frameSize + UNI_send->payloadSize;
}
void rfu_REQ_recvData(void)
@@ -1784,434 +1873,433 @@ void rfu_REQ_recvData(void)
}
}
-static void rfu_CB_recvData(u8 r9, u16 r7)
+static void rfu_CB_recvData(u8 reqCommand, u16 reqResult)
{
- u8 r6;
- struct RfuSlotStatusNI *r4;
- struct NIComm *r5;
+ u8 i;
+ struct RfuSlotStatusNI *slotStatusNI;
+ struct NIComm *NI_comm;
- if (r7 == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1])
+ if (reqResult == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1])
{
gRfuStatic->NIEndRecvFlag = 0;
if (gRfuLinkStatus->parentChild == MODE_PARENT)
rfu_STC_PARENT_analyzeRecvPacket();
else
rfu_STC_CHILD_analyzeRecvPacket();
- for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6)
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
{
- r4 = gRfuSlotStatusNI[r6];
- if (r4->recv.state == SLOT_STATE_RECV_LAST && !((gRfuStatic->NIEndRecvFlag >> r6) & 1))
+ slotStatusNI = gRfuSlotStatusNI[i];
+ if (slotStatusNI->recv.state == SLOT_STATE_RECV_LAST && !((gRfuStatic->NIEndRecvFlag >> i) & 1))
{
- r5 = &r4->recv;
- if (r5->dataType == 1)
- gRfuLinkStatus->getNameFlag |= 1 << r6;
- rfu_STC_releaseFrame(r6, 1, r5);
- gRfuLinkStatus->recvSlotNIFlag &= ~r5->bmSlot;
- r4->recv.state = SLOT_STATE_RECV_SUCCESS;
+ NI_comm = &slotStatusNI->recv;
+ if (NI_comm->dataType == 1)
+ gRfuLinkStatus->getNameFlag |= 1 << i;
+ rfu_STC_releaseFrame(i, 1, NI_comm);
+ gRfuLinkStatus->recvSlotNIFlag &= ~NI_comm->bmSlot;
+ slotStatusNI->recv.state = SLOT_STATE_RECV_SUCCESS;
}
}
if (gRfuStatic->recvErrorFlag)
- r7 = gRfuStatic->recvErrorFlag | ERR_DATA_RECV;
+ reqResult = gRfuStatic->recvErrorFlag | ERR_DATA_RECV;
}
- rfu_STC_REQ_callback(r9, r7);
+ rfu_STC_REQ_callback(reqCommand, reqResult);
}
static void rfu_STC_PARENT_analyzeRecvPacket(void)
{
- u32 r3;
- u8 r5;
- u8 sp[4];
- u8 *r6;
+ u32 frames32;
+ u8 bm_slot_id;
+ u8 frame_counts[RFU_CHILD_MAX];
+ u8 *packet_p;
- r3 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] >> 8;
- for (r5 = 0; r5 < NELEMS(sp); ++r5)
+ frames32 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] >> 8;
+ for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX; ++bm_slot_id)
{
- sp[r5] = r3 & 0x1F;
- r3 >>= 5;
- if (sp[r5] == 0)
- gRfuStatic->NIEndRecvFlag |= 1 << r5;
+ frame_counts[bm_slot_id] = frames32 & 0x1F;
+ frames32 >>= 5;
+ if (frame_counts[bm_slot_id] == 0)
+ gRfuStatic->NIEndRecvFlag |= 1 << bm_slot_id;
}
- r6 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8];
- for (r5 = 0; r5 < NELEMS(sp); ++r5)
+ packet_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8];
+ for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX; ++bm_slot_id)
{
- if (sp[r5])
+ if (frame_counts[bm_slot_id])
{
- u8 *r4 = &sp[r5];
+ u8 *frames_p = &frame_counts[bm_slot_id];
do
{
- u8 r0 = rfu_STC_analyzeLLSF(r5, r6, *r4);
+ u8 analyzed_frames = rfu_STC_analyzeLLSF(bm_slot_id, packet_p, *frames_p);
- r6 += r0;
- *r4 -= r0;
- } while (!(*r4 & 0x80) && (*r4));
+ packet_p += analyzed_frames;
+ *frames_p -= analyzed_frames;
+ } while (!(*frames_p & 0x80) && (*frames_p));
}
}
}
static void rfu_STC_CHILD_analyzeRecvPacket(void)
{
- u16 r4;
- u8 *r5;
- u16 r0;
+ u16 frames_remaining;
+ u8 *packet_p;
+ u16 analyzed_frames;
- r4 = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] & 0x7F;
- r5 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8];
- if (r4 == 0)
+ frames_remaining = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] & 0x7F;
+ packet_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8];
+ if (frames_remaining == 0)
gRfuStatic->NIEndRecvFlag = 15;
do
{
- if (r4 == 0)
+ if (frames_remaining == 0)
break;
- r0 = rfu_STC_analyzeLLSF(0, r5, r4);
- r5 += r0;
- r4 -= r0;
- } while (!(r4 & 0x8000));
-}
-
-static u16 rfu_STC_analyzeLLSF(u8 r12, const u8 *r7, u16 r3)
-{
- struct RfuLocalStruct sp00;
- const struct LLSFStruct *r6;
- u32 r5;
- u8 r4;
- u32 r0;
- u16 r10;
-
- r6 = &llsf_struct[~gRfuLinkStatus->parentChild & (MODE_NEUTRAL & MODE_PARENT)];
- if (r3 < r6->unk00)
- return r3;
- r5 = 0;
- for (r4 = 0; r4 < r6->unk00; ++r4)
- r5 |= *r7++ << 8 * r4;
- sp00.unk00 = (r5 >> r6->unk01) & r6->unk07;
- sp00.unk01 = (r5 >> r6->unk02) & r6->unk08;
- sp00.unk02 = (r5 >> r6->unk03) & r6->unk09;
- sp00.unk03 = (r5 >> r6->unk04) & r6->unk0A;
- sp00.unk04 = (r5 >> r6->unk05) & r6->unk0B;
- sp00.unk05 = (r5 >> r6->unk06) & r6->unk0C;
- sp00.unk06 = (r5 & r6->unk0E) & r5;
- r10 = sp00.unk06 + r6->unk00;
- if (sp00.unk00 == 0)
+ analyzed_frames = rfu_STC_analyzeLLSF(0, packet_p, frames_remaining);
+ packet_p += analyzed_frames;
+ frames_remaining -= analyzed_frames;
+ } while (!(frames_remaining & 0x8000));
+}
+
+static u16 rfu_STC_analyzeLLSF(u8 slot_id, const u8 *src, u16 last_frame)
+{
+ struct RfuLocalStruct llsf_NI;
+ const struct LLSFStruct *llsf_p;
+ u32 frames;
+ u8 i;
+ u16 retVal;
+
+ llsf_p = &llsf_struct[~gRfuLinkStatus->parentChild & (MODE_NEUTRAL & MODE_PARENT)];
+ if (last_frame < llsf_p->frameSize)
+ return last_frame;
+ frames = 0;
+ for (i = 0; i < llsf_p->frameSize; ++i)
+ frames |= *src++ << 8 * i;
+ llsf_NI.recvFirst = (frames >> llsf_p->recvFirstShift) & llsf_p->recvFirstMask;
+ llsf_NI.connSlotFlag = (frames >> llsf_p->connSlotFlagShift) & llsf_p->connSlotFlagMask;
+ llsf_NI.slotState = (frames >> llsf_p->slotStateShift) & llsf_p->slotStateMask;
+ llsf_NI.ack = (frames >> llsf_p->ackShift) & llsf_p->ackMask;
+ llsf_NI.phase = (frames >> llsf_p->phaseShit) & llsf_p->phaseMask;
+ llsf_NI.n = (frames >> llsf_p->nShift) & llsf_p->nMask;
+ llsf_NI.frame = (frames & llsf_p->framesMask) & frames;
+ retVal = llsf_NI.frame + llsf_p->frameSize;
+ if (llsf_NI.recvFirst == 0)
{
if (gRfuLinkStatus->parentChild == MODE_PARENT)
{
- if ((gRfuLinkStatus->connSlotFlag >> r12) & 1)
+ if ((gRfuLinkStatus->connSlotFlag >> slot_id) & 1)
{
- if (sp00.unk02 == 4)
+ if (llsf_NI.slotState == LCOM_UNI)
{
- rfu_STC_UNI_receive(r12, &sp00, r7);
+ rfu_STC_UNI_receive(slot_id, &llsf_NI, src);
}
- else if (sp00.unk03 == 0)
+ else if (llsf_NI.ack == 0)
{
- rfu_STC_NI_receive_Receiver(r12, &sp00, r7);
+ rfu_STC_NI_receive_Receiver(slot_id, &llsf_NI, src);
}
else
{
- for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4)
- if (((gRfuSlotStatusNI[r4]->send.bmSlot >> r12) & 1)
- && ((gRfuLinkStatus->sendSlotNIFlag >> r12) & 1))
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
+ if (((gRfuSlotStatusNI[i]->send.bmSlot >> slot_id) & 1)
+ && ((gRfuLinkStatus->sendSlotNIFlag >> slot_id) & 1))
break;
- if (r4 <= 3)
- rfu_STC_NI_receive_Sender(r4, r12, &sp00, r7);
+ if (i < RFU_CHILD_MAX)
+ rfu_STC_NI_receive_Sender(i, slot_id, &llsf_NI, src);
}
}
}
else
{
- s32 r5 = gRfuLinkStatus->connSlotFlag & sp00.unk01;
+ s32 conSlots = gRfuLinkStatus->connSlotFlag & llsf_NI.connSlotFlag;
- if (r5)
+ if (conSlots)
{
- for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4)
+ for (i = 0; i < RFU_CHILD_MAX; ++i)
{
- if ((r5 >> r4) & 1)
+ if ((conSlots >> i) & 1)
{
- if (sp00.unk02 == 4)
- rfu_STC_UNI_receive(r4, &sp00, r7);
- else if (sp00.unk03 == 0)
- rfu_STC_NI_receive_Receiver(r4, &sp00, r7);
- else if ((gRfuLinkStatus->sendSlotNIFlag >> r4) & 1)
- rfu_STC_NI_receive_Sender(r4, r4, &sp00, r7);
+ if (llsf_NI.slotState == LCOM_UNI)
+ rfu_STC_UNI_receive(i, &llsf_NI, src);
+ else if (llsf_NI.ack == 0)
+ rfu_STC_NI_receive_Receiver(i, &llsf_NI, src);
+ else if ((gRfuLinkStatus->sendSlotNIFlag >> i) & 1)
+ rfu_STC_NI_receive_Sender(i, i, &llsf_NI, src);
}
}
}
}
}
- return r10;
+ return retVal;
}
-static void rfu_STC_UNI_receive(u8 r7, const struct RfuLocalStruct *r6, const u8 *sp00)
+static void rfu_STC_UNI_receive(u8 bm_slot_id, const struct RfuLocalStruct *llsf_NI, const u8 *src)
{
- u8 *sp04;
- u32 r2;
- struct RfuSlotStatusUNI *r3 = gRfuSlotStatusUNI[r7];
- struct UNIRecv *r5 = &r3->recv;
+ u8 *dest;
+ u32 size;
+ struct RfuSlotStatusUNI *slotStatusUNI = gRfuSlotStatusUNI[bm_slot_id];
+ struct UNIRecv *UNI_recv = &slotStatusUNI->recv;
- r5->errorCode = 0;
- if (gRfuSlotStatusUNI[r7]->recvBufferSize < r6->unk06)
+ UNI_recv->errorCode = 0;
+ if (gRfuSlotStatusUNI[bm_slot_id]->recvBufferSize < llsf_NI->frame)
{
- r3->recv.state = SLOT_STATE_RECV_IGNORE;
- r5->errorCode = ERR_RECV_BUFF_OVER;
+ slotStatusUNI->recv.state = SLOT_STATE_RECV_IGNORE;
+ UNI_recv->errorCode = ERR_RECV_BUFF_OVER;
}
else
- {
- if (r5->dataBlockFlag)
+ {
+ if (UNI_recv->dataBlockFlag)
{
- if (r5->newDataFlag)
+ if (UNI_recv->newDataFlag)
{
- r5->errorCode = ERR_RECV_UNK;
- goto _081E2F0E;
+ UNI_recv->errorCode = ERR_RECV_UNK;
+ goto force_tail_merge;
}
}
else
{
- if (r5->newDataFlag)
- r5->errorCode = ERR_RECV_DATA_OVERWRITED;
+ if (UNI_recv->newDataFlag)
+ UNI_recv->errorCode = ERR_RECV_DATA_OVERWRITED;
}
- r5->state = SLOT_STATE_RECEIVING;
- r2 = r5->dataSize = r6->unk06;
- sp04 = gRfuSlotStatusUNI[r7]->recvBuffer;
- gRfuFixed->fastCopyPtr(&sp00, &sp04, r2);
- r5->newDataFlag = 1;
- r5->state = 0;
+ UNI_recv->state = SLOT_STATE_RECEIVING;
+ size = UNI_recv->dataSize = llsf_NI->frame;
+ dest = gRfuSlotStatusUNI[bm_slot_id]->recvBuffer;
+ gRfuFixed->fastCopyPtr(&src, &dest, size);
+ UNI_recv->newDataFlag = 1;
+ UNI_recv->state = 0;
}
-_081E2F0E:
- if (r5->errorCode)
- gRfuStatic->recvErrorFlag |= 16 << r7;
+force_tail_merge:
+ if (UNI_recv->errorCode)
+ gRfuStatic->recvErrorFlag |= 16 << bm_slot_id;
}
-static void rfu_STC_NI_receive_Sender(u8 r0, u8 r10, const struct RfuLocalStruct *r6, const u8 *r3)
+static void rfu_STC_NI_receive_Sender(u8 NI_slot, u8 bm_flag, const struct RfuLocalStruct *llsf_NI, const u8 *data_p)
{
- struct NIComm *r12 = &gRfuSlotStatusNI[r0]->send;
- u16 r9 = r12->state;
- u8 sp00 = r12->n[r6->unk04];
- u8 *r8;
- u8 r4;
- u16 r2;
+ struct NIComm *NI_comm = &gRfuSlotStatusNI[NI_slot]->send;
+ u16 state = NI_comm->state;
+ u8 n = NI_comm->n[llsf_NI->phase];
+ u8 i;
+ u16 imeBak;
- if ((r6->unk02 == 2 && r9 == SLOT_STATE_SENDING)
- || (r6->unk02 == 1 && r9 == SLOT_STATE_SEND_START)
- || (r6->unk02 == 3 && r9 == SLOT_STATE_SEND_LAST))
+ if ((llsf_NI->slotState == LCOM_NI && state == SLOT_STATE_SENDING)
+ || (llsf_NI->slotState == LCOM_NI_START && state == SLOT_STATE_SEND_START)
+ || (llsf_NI->slotState == LCOM_NI_END && state == SLOT_STATE_SEND_LAST))
{
- if (r12->n[r6->unk04] == r6->unk05)
- r12->recvAckFlag[r6->unk04] |= 1 << r10;
+ if (NI_comm->n[llsf_NI->phase] == llsf_NI->n)
+ NI_comm->recvAckFlag[llsf_NI->phase] |= 1 << bm_flag;
}
- if ((r12->recvAckFlag[r6->unk04] & r12->bmSlot) == r12->bmSlot)
+ if ((NI_comm->recvAckFlag[llsf_NI->phase] & NI_comm->bmSlot) == NI_comm->bmSlot)
{
- r12->n[r6->unk04] = (r12->n[r6->unk04] + 1) & 3;
- r12->recvAckFlag[r6->unk04] = 0;
- if ((u16)(r12->state + ~SLOT_STATE_SEND_NULL) <= 1)
+ NI_comm->n[llsf_NI->phase] = (NI_comm->n[llsf_NI->phase] + 1) & 3;
+ NI_comm->recvAckFlag[llsf_NI->phase] = 0;
+ if ((u16)(NI_comm->state + ~SLOT_STATE_SEND_NULL) <= 1)
{
- if (r12->state == SLOT_STATE_SEND_START)
- r12->now_p[r6->unk04] += r12->payloadSize;
+ if (NI_comm->state == SLOT_STATE_SEND_START)
+ NI_comm->now_p[llsf_NI->phase] += NI_comm->payloadSize;
else
- r12->now_p[r6->unk04] += r12->payloadSize << 2;
- r12->remainSize -= r12->payloadSize;
- if (r12->remainSize != 0)
- if (r12->remainSize >= 0)
+ NI_comm->now_p[llsf_NI->phase] += NI_comm->payloadSize << 2;
+ NI_comm->remainSize -= NI_comm->payloadSize;
+ if (NI_comm->remainSize != 0)
+ if (NI_comm->remainSize >= 0)
goto _081E30AE;
- // Above is a hack to avoid optimization over comparison.
- // rfu_STC_NI_constructLLSF uses this field as u32.
- // It's equivalent to the following condition:
- // if (r12->remainSize == 0 || r12->remainSize < 0)
- {
- r12->phase = 0;
- if (r12->state == SLOT_STATE_SEND_START)
+ // Above is a hack to avoid optimization over comparison.
+ // rfu_STC_NI_constructLLSF uses this field as u32.
+ // It's equivalent to the following condition:
+ // if (NI_comm->remainSize == 0 || NI_comm->remainSize < 0)
{
- for (r4 = 0; r4 < WINDOW_COUNT; ++r4)
+ NI_comm->phase = 0;
+ if (NI_comm->state == SLOT_STATE_SEND_START)
{
- r12->n[r4] = 1;
- r12->now_p[r4] = r12->src + r12->payloadSize * r4;
+ for (i = 0; i < WINDOW_COUNT; ++i)
+ {
+ NI_comm->n[i] = 1;
+ NI_comm->now_p[i] = NI_comm->src + NI_comm->payloadSize * i;
+ }
+ NI_comm->remainSize = NI_comm->dataSize;
+ NI_comm->state = SLOT_STATE_SENDING;
+ }
+ else
+ {
+ NI_comm->n[0] = 0;
+ NI_comm->remainSize = 0;
+ NI_comm->state = SLOT_STATE_SEND_LAST;
}
- r12->remainSize = r12->dataSize;
- r12->state = SLOT_STATE_SENDING;
- }
- else
- {
- r12->n[0] = 0;
- r12->remainSize = 0;
- r12->state = SLOT_STATE_SEND_LAST;
}
- }
_081E30AE:
+ ;
}
- else if (r12->state == SLOT_STATE_SEND_LAST)
+ else if (NI_comm->state == SLOT_STATE_SEND_LAST)
{
- r12->state = SLOT_STATE_SEND_NULL;
+ NI_comm->state = SLOT_STATE_SEND_NULL;
}
}
- if (r12->state != r9
- || r12->n[r6->unk04] != sp00
- || (r12->recvAckFlag[r6->unk04] >> r10) & 1)
+ if (NI_comm->state != state
+ || NI_comm->n[llsf_NI->phase] != n
+ || (NI_comm->recvAckFlag[llsf_NI->phase] >> bm_flag) & 1)
{
- r2 = REG_IME;
+ imeBak = REG_IME;
REG_IME = 0;
- gRfuStatic->recvRenewalFlag |= 16 << r10;
- gRfuSlotStatusNI[r10]->send.failCounter = 0;
- REG_IME = r2;
+ gRfuStatic->recvRenewalFlag |= 16 << bm_flag;
+ gRfuSlotStatusNI[bm_flag]->send.failCounter = 0;
+ REG_IME = imeBak;
}
}
-static void rfu_STC_NI_receive_Receiver(u8 r8, const struct RfuLocalStruct *r6, const u8 *sp00)
+static void rfu_STC_NI_receive_Receiver(u8 bm_slot_id, const struct RfuLocalStruct *llsf_NI, const u8 *data_p)
{
- u16 r2;
- u32 r7 = 0;
- struct RfuSlotStatusNI *r4 = gRfuSlotStatusNI[r8];
- struct NIComm *r5 = &r4->recv;
- u16 r9 = r4->recv.state;
- u8 r10 = r4->recv.n[r6->unk04];
+ u16 imeBak;
+ u32 state_check = 0;
+ struct RfuSlotStatusNI *slotStatus_NI = gRfuSlotStatusNI[bm_slot_id];
+ struct NIComm *recvSlot = &slotStatus_NI->recv;
+ u16 state = slotStatus_NI->recv.state;
+ u8 n = slotStatus_NI->recv.n[llsf_NI->phase];
- if (r6->unk02 == 3)
+ if (llsf_NI->slotState == LCOM_NI_END)
{
- gRfuStatic->NIEndRecvFlag |= 1 << r8;
- if (r4->recv.state == SLOT_STATE_RECEIVING)
+ gRfuStatic->NIEndRecvFlag |= 1 << bm_slot_id;
+ if (slotStatus_NI->recv.state == SLOT_STATE_RECEIVING)
{
- r4->recv.phase = 0;
- r4->recv.n[0] = 0;
- r4->recv.state = SLOT_STATE_RECV_LAST;
+ slotStatus_NI->recv.phase = 0;
+ slotStatus_NI->recv.n[0] = 0;
+ slotStatus_NI->recv.state = SLOT_STATE_RECV_LAST;
}
}
- else if (r6->unk02 == 2)
+ else if (llsf_NI->slotState == LCOM_NI)
{
- if (r9 == SLOT_STATE_RECV_START && !r5->remainSize)
- rfu_STC_NI_initSlot_asRecvDataEntity(r8, r5);
- if (r5->state == SLOT_STATE_RECEIVING)
- r7 = 1;
+ if (state == SLOT_STATE_RECV_START && !recvSlot->remainSize)
+ rfu_STC_NI_initSlot_asRecvDataEntity(bm_slot_id, recvSlot);
+ if (recvSlot->state == SLOT_STATE_RECEIVING)
+ state_check = 1;
}
- else if (r6->unk02 == 1)
+ else if (llsf_NI->slotState == LCOM_NI_START)
{
- if (r9 == SLOT_STATE_RECV_START)
+ if (state == SLOT_STATE_RECV_START)
{
- r7 = 1;
+ state_check = 1;
}
else
{
- rfu_STC_NI_initSlot_asRecvControllData(r8, r5);
- if (r4->recv.state != SLOT_STATE_RECV_START)
+ rfu_STC_NI_initSlot_asRecvControllData(bm_slot_id, recvSlot);
+ if (slotStatus_NI->recv.state != SLOT_STATE_RECV_START)
return;
- r7 = 1;
+ state_check = 1;
}
}
- if (r7 != 0)
+ if (state_check != 0)
{
- if (r6->unk05 == ((r5->n[r6->unk04] + 1) & 3))
+ if (llsf_NI->n == ((recvSlot->n[llsf_NI->phase] + 1) & 3))
{
- gRfuFixed->fastCopyPtr(&sp00, (u8 **)&r5->now_p[r6->unk04], r6->unk06);
- if (r5->state == SLOT_STATE_RECEIVING)
- r5->now_p[r6->unk04] += 3 * r5->payloadSize;
- r5->remainSize -= r6->unk06;
- r5->n[r6->unk04] = r6->unk05;
+ gRfuFixed->fastCopyPtr(&data_p, (u8 **)&recvSlot->now_p[llsf_NI->phase], llsf_NI->frame);
+ if (recvSlot->state == SLOT_STATE_RECEIVING)
+ recvSlot->now_p[llsf_NI->phase] += 3 * recvSlot->payloadSize;
+ recvSlot->remainSize -= llsf_NI->frame;
+ recvSlot->n[llsf_NI->phase] = llsf_NI->n;
}
}
- if (r5->errorCode == 0)
+ if (recvSlot->errorCode == 0)
{
- r5->phase = r6->unk04;
- if (r5->state != r9 || r5->n[r6->unk04] != r10 || r5->n[r6->unk04] == r6->unk05)
+ recvSlot->phase = llsf_NI->phase;
+ if (recvSlot->state != state || recvSlot->n[llsf_NI->phase] != n || recvSlot->n[llsf_NI->phase] == llsf_NI->n)
{
- r2 = REG_IME;
+ imeBak = REG_IME;
REG_IME = 0;
- gRfuStatic->recvRenewalFlag |= 1 << r8;
- r5->failCounter = 0;
- REG_IME = r2;
+ gRfuStatic->recvRenewalFlag |= 1 << bm_slot_id;
+ recvSlot->failCounter = 0;
+ REG_IME = imeBak;
}
}
}
-static void rfu_STC_NI_initSlot_asRecvControllData(u8 r4, struct NIComm *r2)
+static void rfu_STC_NI_initSlot_asRecvControllData(u8 bm_slot_id, struct NIComm *NI_comm)
{
- u8 *r1;
- u32 r5;
- u8 r6;
+ u8 *llFrameSize_p;
+ u32 llFrameSize;
+ u8 bm_slot_flag;
if (gRfuLinkStatus->parentChild == MODE_PARENT)
{
- r5 = 3;
- r1 = &gRfuLinkStatus->remainLLFrameSizeParent;
+ llFrameSize = 3;
+ llFrameSize_p = &gRfuLinkStatus->remainLLFrameSizeParent;
}
else
{
- r5 = 2;
- r1 = &gRfuLinkStatus->remainLLFrameSizeChild[r4];
+ llFrameSize = 2;
+ llFrameSize_p = &gRfuLinkStatus->remainLLFrameSizeChild[bm_slot_id];
}
- r6 = 1 << r4;
- if (r2->state == 0)
+ bm_slot_flag = 1 << bm_slot_id;
+ if (NI_comm->state == 0)
{
- if (*r1 < r5)
+ if (*llFrameSize_p < llFrameSize)
{
- r2->state = SLOT_STATE_RECV_IGNORE;
- r2->errorCode = ERR_RECV_REPLY_SUBFRAME_SIZE;
- gRfuStatic->recvErrorFlag |= r6;
+ NI_comm->state = SLOT_STATE_RECV_IGNORE;
+ NI_comm->errorCode = ERR_RECV_REPLY_SUBFRAME_SIZE;
+ gRfuStatic->recvErrorFlag |= bm_slot_flag;
}
else
{
- r2->errorCode = 0;
- *r1 -= r5;
- r2->now_p[0] = &r2->dataType;
- r2->remainSize = 7;
- r2->ack = 1;
- r2->payloadSize = 0;
- r2->bmSlot = r6;
- r2->state = SLOT_STATE_RECV_START;
- gRfuLinkStatus->recvSlotNIFlag |= r6;
+ NI_comm->errorCode = 0;
+ *llFrameSize_p -= llFrameSize;
+ NI_comm->now_p[0] = &NI_comm->dataType;
+ NI_comm->remainSize = 7;
+ NI_comm->ack = 1;
+ NI_comm->payloadSize = 0;
+ NI_comm->bmSlot = bm_slot_flag;
+ NI_comm->state = SLOT_STATE_RECV_START;
+ gRfuLinkStatus->recvSlotNIFlag |= bm_slot_flag;
}
}
}
-static void rfu_STC_NI_initSlot_asRecvDataEntity(u8 r5, struct NIComm *r4)
+static void rfu_STC_NI_initSlot_asRecvDataEntity(u8 bm_slot_id, struct NIComm *NI_comm)
{
- u8 r1, r3;
+ u8 bm_slot_flag, win_id;
- if (r4->dataType == 1)
+ if (NI_comm->dataType == 1)
{
- r4->now_p[0] = (void *)&gRfuLinkStatus->partner[r5].serialNo;
+ NI_comm->now_p[0] = (void *)&gRfuLinkStatus->partner[bm_slot_id].serialNo;
}
else
{
- if (r4->dataSize > gRfuSlotStatusNI[r5]->recvBufferSize)
+ if (NI_comm->dataSize > gRfuSlotStatusNI[bm_slot_id]->recvBufferSize)
{
- r1 = 1 << r5;
- gRfuStatic->recvErrorFlag |= r1;
- gRfuLinkStatus->recvSlotNIFlag &= ~r1;
- r4->errorCode = ERR_RECV_BUFF_OVER;
- r4->state = SLOT_STATE_RECV_FAILED;
- rfu_STC_releaseFrame(r5, 1, r4);
+ bm_slot_flag = 1 << bm_slot_id;
+ gRfuStatic->recvErrorFlag |= bm_slot_flag;
+ gRfuLinkStatus->recvSlotNIFlag &= ~bm_slot_flag;
+ NI_comm->errorCode = ERR_RECV_BUFF_OVER;
+ NI_comm->state = SLOT_STATE_RECV_FAILED;
+ rfu_STC_releaseFrame(bm_slot_id, 1, NI_comm);
return;
}
- r4->now_p[0] = gRfuSlotStatusNI[r5]->recvBuffer;
+ NI_comm->now_p[0] = gRfuSlotStatusNI[bm_slot_id]->recvBuffer;
}
- for (r3 = 0; r3 < WINDOW_COUNT; ++r3)
+ for (win_id = 0; win_id < WINDOW_COUNT; ++win_id)
{
- r4->n[r3] = 0;
- r4->now_p[r3] = &r4->now_p[0][r4->payloadSize * r3];
+ NI_comm->n[win_id] = 0;
+ NI_comm->now_p[win_id] = &NI_comm->now_p[0][NI_comm->payloadSize * win_id];
}
- r4->remainSize = r4->dataSize;
- r4->state = SLOT_STATE_RECEIVING;
+ NI_comm->remainSize = NI_comm->dataSize;
+ NI_comm->state = SLOT_STATE_RECEIVING;
}
static void rfu_NI_checkCommFailCounter(void)
{
- u16 r12;
- u32 r7;
- u8 r2, r3;
+ u16 imeBak;
+ u32 recvRenewalFlag;
+ u8 bm_slot_flag, bm_slot_id;
if (gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag)
{
- r12 = REG_IME;
+ imeBak = REG_IME;
REG_IME = 0;
- r7 = gRfuStatic->recvRenewalFlag >> 4;
- for (r3 = 0; r3 < RFU_CHILD_MAX; ++r3)
+ recvRenewalFlag = gRfuStatic->recvRenewalFlag >> 4;
+ for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX; ++bm_slot_id)
{
- r2 = 1 << r3;
- if (gRfuLinkStatus->sendSlotNIFlag & r2
- && !(gRfuStatic->recvRenewalFlag & r2))
- ++gRfuSlotStatusNI[r3]->send.failCounter;
- if (gRfuLinkStatus->recvSlotNIFlag & r2
- && !(r7 & r2))
- ++gRfuSlotStatusNI[r3]->recv.failCounter;
+ bm_slot_flag = 1 << bm_slot_id;
+ if (gRfuLinkStatus->sendSlotNIFlag & bm_slot_flag
+ && !(gRfuStatic->recvRenewalFlag & bm_slot_flag))
+ ++gRfuSlotStatusNI[bm_slot_id]->send.failCounter;
+ if (gRfuLinkStatus->recvSlotNIFlag & bm_slot_flag
+ && !(recvRenewalFlag & bm_slot_flag))
+ ++gRfuSlotStatusNI[bm_slot_id]->recv.failCounter;
}
gRfuStatic->recvRenewalFlag = 0;
- REG_IME = r12;
+ REG_IME = imeBak;
}
}
diff --git a/src/librfu_sio32id.c b/src/librfu_sio32id.c
index fc5701986..b6623540f 100644
--- a/src/librfu_sio32id.c
+++ b/src/librfu_sio32id.c
@@ -4,44 +4,56 @@ static void Sio32IDIntr(void);
static void Sio32IDInit(void);
static s32 Sio32IDMain(void);
+struct RfuSIO32Id
+{
+ u8 MS_mode;
+ u8 state;
+ u16 count;
+ u16 send_id;
+ u16 recv_id;
+ u16 unk8; // unused
+ u16 lastId;
+};
+
struct RfuSIO32Id gRfuSIO32Id;
static const u16 Sio32ConnectionData[] = { 0x494e, 0x544e, 0x4e45, 0x4f44 }; // NINTENDO
static const char Sio32IDLib_Var[] = "Sio32ID_030820";
-s32 AgbRFU_checkID(u8 r5)
+s32 AgbRFU_checkID(u8 maxTries)
{
- u16 r8;
- vu16 *r4;
- s32 r6;
+ u16 ieBak;
+ vu16 *regTMCNTL;
+ s32 id;
+ // Interrupts must be enabled
if (REG_IME == 0)
return -1;
- r8 = REG_IE;
+ ieBak = REG_IE;
gSTWIStatus->state = 10;
STWI_set_Callback_ID(Sio32IDIntr);
Sio32IDInit();
- r4 = &REG_TMCNT_L(gSTWIStatus->timerSelect);
- r5 *= 8;
- while (--r5 != 0xFF)
+ regTMCNTL = &REG_TMCNT_L(gSTWIStatus->timerSelect);
+ maxTries *= 8;
+ while (--maxTries != 0xFF)
{
- r6 = Sio32IDMain();
- if (r6 != 0)
+ id = Sio32IDMain();
+ if (id != 0)
break;
- r4[1] = 0;
- r4[0] = 0;
- r4[1] = TIMER_1024CLK | TIMER_ENABLE;
- while (r4[0] < 32)
+ regTMCNTL[1] = 0;
+ regTMCNTL[0] = 0;
+ regTMCNTL[1] = TIMER_1024CLK | TIMER_ENABLE;
+ while (regTMCNTL[0] < 32)
;
- r4[1] = 0;
- r4[0] = 0;
+ regTMCNTL[1] = 0;
+ regTMCNTL[0] = 0;
}
REG_IME = 0;
- REG_IE = r8;
+ REG_IE = ieBak;
REG_IME = 1;
gSTWIStatus->state = 0;
STWI_set_Callback_ID(NULL);
- return r6;
+ return id;
}
static void Sio32IDInit(void)
@@ -58,107 +70,105 @@ static void Sio32IDInit(void)
static s32 Sio32IDMain(void)
{
- u8 r12;
-
- switch (r12 = gRfuSIO32Id.unk1)
+ switch (gRfuSIO32Id.state)
{
case 0:
- gRfuSIO32Id.unk0 = 1;
+ gRfuSIO32Id.MS_mode = AGB_CLK_MASTER;
REG_SIOCNT |= SIO_38400_BPS;
- REG_IME = r12;
+ REG_IME = 0;
REG_IE |= INTR_FLAG_SERIAL;
REG_IME = 1;
- gRfuSIO32Id.unk1 = 1;
+ gRfuSIO32Id.state = 1;
*(vu8 *)&REG_SIOCNT |= SIO_ENABLE;
break;
case 1:
- if (gRfuSIO32Id.unkA == 0)
+ if (gRfuSIO32Id.lastId == 0)
{
- if (gRfuSIO32Id.unk0 == 1)
+ if (gRfuSIO32Id.MS_mode == AGB_CLK_MASTER)
{
- if (gRfuSIO32Id.unk2 == 0)
+ if (gRfuSIO32Id.count == 0)
{
- REG_IME = gRfuSIO32Id.unk2;
+ REG_IME = 0;
REG_SIOCNT |= SIO_ENABLE;
- REG_IME = r12;
+ REG_IME = 1;
}
}
- else if (gRfuSIO32Id.unk4 != 0x8001 && !gRfuSIO32Id.unk2)
+ else if (gRfuSIO32Id.send_id != RFU_ID && !gRfuSIO32Id.count)
{
- REG_IME = gRfuSIO32Id.unk2;
+ REG_IME = 0;
REG_IE &= ~INTR_FLAG_SERIAL;
- REG_IME = r12;
- REG_SIOCNT = gRfuSIO32Id.unk2;
+ REG_IME = 1;
+ REG_SIOCNT = 0;
REG_SIOCNT = SIO_32BIT_MODE;
REG_IF = INTR_FLAG_SERIAL;
REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE;
- REG_IME = gRfuSIO32Id.unk2;
+ REG_IME = 0;
REG_IE |= INTR_FLAG_SERIAL;
- REG_IME = r12;
+ REG_IME = 1;
}
break;
}
else
{
- gRfuSIO32Id.unk1 = 2;
+ gRfuSIO32Id.state = 2;
// fallthrough
}
default:
- return gRfuSIO32Id.unkA;
+ return gRfuSIO32Id.lastId;
}
return 0;
}
static void Sio32IDIntr(void)
{
- u32 r5;
- u16 r0;
+ u32 regSIODATA32;
+ u16 delay;
#ifndef NONMATCHING
- register u32 r1 asm("r1");
- register u16 r0_ asm("r0");
+ register u32 rfuSIO32IdUnk0_times_16 asm("r1");
+ register u16 negRfuSIO32IdUnk6 asm("r0");
#else
- u32 r1;
- u16 r0_;
+ u32 rfuSIO32IdUnk0_times_16;
+ u16 negRfuSIO32IdUnk6;
#endif
- r5 = REG_SIODATA32;
- if (gRfuSIO32Id.unk0 != 1)
+ regSIODATA32 = REG_SIODATA32;
+ if (gRfuSIO32Id.MS_mode != AGB_CLK_MASTER)
REG_SIOCNT |= SIO_ENABLE;
- r1 = 16 * gRfuSIO32Id.unk0; // to handle side effect of inline asm
- r1 = (r5 << r1) >> 16;
- r5 = (r5 << 16 * (1 - gRfuSIO32Id.unk0)) >> 16;
- if (gRfuSIO32Id.unkA == 0)
+ rfuSIO32IdUnk0_times_16 = 16 * gRfuSIO32Id.MS_mode; // to handle side effect of inline asm
+ rfuSIO32IdUnk0_times_16 = (regSIODATA32 << rfuSIO32IdUnk0_times_16) >> 16;
+ regSIODATA32 = (regSIODATA32 << 16 * (1 - gRfuSIO32Id.MS_mode)) >> 16;
+ if (gRfuSIO32Id.lastId == 0)
{
- if (r1 == gRfuSIO32Id.unk6)
+ if (rfuSIO32IdUnk0_times_16 == gRfuSIO32Id.recv_id)
{
- if (gRfuSIO32Id.unk2 > 3)
+ if (gRfuSIO32Id.count > 3)
{
- gRfuSIO32Id.unkA = r5;
+ gRfuSIO32Id.lastId = regSIODATA32;
}
- else if (r1 == (u16)~gRfuSIO32Id.unk4)
+ else if (rfuSIO32IdUnk0_times_16 == (u16)~gRfuSIO32Id.send_id)
{
- r0_ = ~gRfuSIO32Id.unk6;
- if (r5 == r0_)
- ++gRfuSIO32Id.unk2;
+ negRfuSIO32IdUnk6 = ~gRfuSIO32Id.recv_id;
+ if (regSIODATA32 == negRfuSIO32IdUnk6)
+ ++gRfuSIO32Id.count;
}
}
else
{
- gRfuSIO32Id.unk2 = gRfuSIO32Id.unkA;
+ gRfuSIO32Id.count = 0;
}
}
- if (gRfuSIO32Id.unk2 < 4)
- gRfuSIO32Id.unk4 = *(gRfuSIO32Id.unk2 + Sio32ConnectionData);
+ if (gRfuSIO32Id.count < 4)
+ gRfuSIO32Id.send_id = *(gRfuSIO32Id.count + Sio32ConnectionData);
else
- gRfuSIO32Id.unk4 = 0x8001;
- gRfuSIO32Id.unk6 = ~r5;
- REG_SIODATA32 = (gRfuSIO32Id.unk4 << 16 * (1 - gRfuSIO32Id.unk0))
- + (gRfuSIO32Id.unk6 << 16 * gRfuSIO32Id.unk0);
- if (gRfuSIO32Id.unk0 == 1 && (gRfuSIO32Id.unk2 || r5 == 0x494E))
+ gRfuSIO32Id.send_id = RFU_ID;
+ gRfuSIO32Id.recv_id = ~regSIODATA32;
+ REG_SIODATA32 = (gRfuSIO32Id.send_id << 16 * (1 - gRfuSIO32Id.MS_mode))
+ + (gRfuSIO32Id.recv_id << 16 * gRfuSIO32Id.MS_mode);
+ if (gRfuSIO32Id.MS_mode == AGB_CLK_MASTER && (gRfuSIO32Id.count != 0 || regSIODATA32 == 0x494e))
{
- for (r0 = 0; r0 < 600; ++r0)
+ for (delay = 0; delay < 600; ++delay)
;
- if (gRfuSIO32Id.unkA == 0)
+ if (gRfuSIO32Id.lastId == 0)
REG_SIOCNT |= SIO_ENABLE;
}
}
diff --git a/src/librfu_stwi.c b/src/librfu_stwi.c
index b88f21737..0287b358a 100644
--- a/src/librfu_stwi.c
+++ b/src/librfu_stwi.c
@@ -28,8 +28,8 @@ void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, b
}
gSTWIStatus->rxPacket = &interruptStruct->rxPacketAlloc;
gSTWIStatus->txPacket = &interruptStruct->txPacketAlloc;
- gSTWIStatus->msMode = 1;
- gSTWIStatus->state = 0;
+ gSTWIStatus->msMode = AGB_CLK_MASTER;
+ gSTWIStatus->state = 0; // master send req
gSTWIStatus->reqLength = 0;
gSTWIStatus->reqNext = 0;
gSTWIStatus->ackLength = 0;
@@ -39,7 +39,7 @@ void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, b
gSTWIStatus->timerActive = 0;
gSTWIStatus->error = 0;
gSTWIStatus->recoveryCount = 0;
- gSTWIStatus->unk_2c = 0;
+ gSTWIStatus->sending = 0;
REG_RCNT = 0x100; // TODO: mystery bit?
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
STWI_init_Callback_M();
@@ -71,7 +71,7 @@ void AgbRFU_SoftReset(void)
*timerH = 3;
REG_RCNT = 0x80A0;
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
- gSTWIStatus->state = 0;
+ gSTWIStatus->state = 0; // master send req
gSTWIStatus->reqLength = 0;
gSTWIStatus->reqNext = 0;
gSTWIStatus->reqActiveCommand = 0;
@@ -81,9 +81,9 @@ void AgbRFU_SoftReset(void)
gSTWIStatus->timerState = 0;
gSTWIStatus->timerActive = 0;
gSTWIStatus->error = 0;
- gSTWIStatus->msMode = 1;
+ gSTWIStatus->msMode = AGB_CLK_MASTER;
gSTWIStatus->recoveryCount = 0;
- gSTWIStatus->unk_2c = 0;
+ gSTWIStatus->sending = 0;
}
void STWI_set_MS_mode(u8 mode)
@@ -131,12 +131,12 @@ void STWI_set_Callback_S(void (*callbackS)(u16))
void STWI_set_Callback_ID(void (*func)(void)) // name in SDK, but is actually setting a function pointer
{
- gSTWIStatus->unk_20 = func;
+ gSTWIStatus->callbackID = func;
}
u16 STWI_poll_CommandEnd(void)
{
- while (gSTWIStatus->unk_2c == TRUE)
+ while (gSTWIStatus->sending == 1)
;
return gSTWIStatus->error;
}
@@ -195,7 +195,7 @@ void STWI_send_ConfigStatusREQ(void)
}
}
-void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data)
+void STWI_send_GameConfigREQ(const u8 *serial_gname, const u8 *uname)
{
u8 *packetBytes;
s32 i;
@@ -203,29 +203,28 @@ void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data)
if (!STWI_init(ID_GAME_CONFIG_REQ))
{
gSTWIStatus->reqLength = 6;
- // TODO: what is unk1
packetBytes = gSTWIStatus->txPacket->rfuPacket8.data;
packetBytes += sizeof(u32);
- *(u16 *)packetBytes = *(u16 *)unk1;
+ *(u16 *)packetBytes = *(u16 *)serial_gname;
packetBytes += sizeof(u16);
- unk1 += sizeof(u16);
+ serial_gname += sizeof(u16);
for (i = 0; i < 14; ++i)
{
- *packetBytes = *unk1;
+ *packetBytes = *serial_gname;
++packetBytes;
- ++unk1;
+ ++serial_gname;
}
for (i = 0; i < 8; ++i)
{
- *packetBytes = *data;
+ *packetBytes = *uname;
++packetBytes;
- ++data;
+ ++uname;
}
STWI_start_Command();
}
}
-void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3)
+void STWI_send_SystemConfigREQ(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer)
{
if (!STWI_init(ID_SYSTEM_CONFIG_REQ))
{
@@ -234,9 +233,9 @@ void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3)
gSTWIStatus->reqLength = 1;
packetBytes = gSTWIStatus->txPacket->rfuPacket8.data;
packetBytes += sizeof(u32);
- *packetBytes++ = unk3;
- *packetBytes++ = unk2;
- *(u16*)packetBytes = unk1;
+ *packetBytes++ = mcTimer;
+ *packetBytes++ = maxMFrame;
+ *(u16*)packetBytes = availSlotFlag;
STWI_start_Command();
}
}
@@ -499,20 +498,17 @@ static void STWI_intr_timer(void)
STWI_stop_timer();
STWI_reset_ClockCounter();
if (gSTWIStatus->callbackM != NULL)
- gSTWIStatus->callbackM(255, 0);
+ gSTWIStatus->callbackM(ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ, 0);
break;
}
}
-static void STWI_set_timer(u8 unk)
+static void STWI_set_timer(u8 count)
{
- vu16 *timerL;
- vu16 *timerH;
-
- timerL = &REG_TMCNT_L(gSTWIStatus->timerSelect);
- timerH = &REG_TMCNT_H(gSTWIStatus->timerSelect);
+ vu16 *timerL = &REG_TMCNT_L(gSTWIStatus->timerSelect);
+ vu16 *timerH = &REG_TMCNT_H(gSTWIStatus->timerSelect);
REG_IME = 0;
- switch (unk)
+ switch (count)
{
case 50:
*timerL = 0xFCCB;
@@ -543,25 +539,31 @@ static void STWI_stop_timer(void)
REG_TMCNT_H(gSTWIStatus->timerSelect) = 0;
}
+/*
+ * Set up STWI to send REQ. Returns 1 if error (see below).
+ */
static u16 STWI_init(u8 request)
{
if (!REG_IME)
{
+ // Can't start sending if IME is disabled.
gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE;
if (gSTWIStatus->callbackM != NULL)
gSTWIStatus->callbackM(request, gSTWIStatus->error);
return TRUE;
}
- else if (gSTWIStatus->unk_2c == TRUE)
+ else if (gSTWIStatus->sending == 1)
{
+ // Already sending something. Cancel and error.
gSTWIStatus->error = ERR_REQ_CMD_SENDING;
- gSTWIStatus->unk_2c = FALSE;
+ gSTWIStatus->sending = 0;
if (gSTWIStatus->callbackM != NULL)
gSTWIStatus->callbackM(request, gSTWIStatus->error);
return TRUE;
}
- else if(!gSTWIStatus->msMode)
+ else if (gSTWIStatus->msMode == AGB_CLK_SLAVE)
{
+ // Can't send if clock slave
gSTWIStatus->error = ERR_REQ_CMD_CLOCK_SLAVE;
if (gSTWIStatus->callbackM != NULL)
gSTWIStatus->callbackM(request, gSTWIStatus->error, gSTWIStatus);
@@ -569,9 +571,10 @@ static u16 STWI_init(u8 request)
}
else
{
- gSTWIStatus->unk_2c = TRUE;
+ // Good to go, start sending
+ gSTWIStatus->sending = 1;
gSTWIStatus->reqActiveCommand = request;
- gSTWIStatus->state = 0;
+ gSTWIStatus->state = 0; // master send req
gSTWIStatus->reqLength = 0;
gSTWIStatus->reqNext = 0;
gSTWIStatus->ackLength = 0;
@@ -595,7 +598,7 @@ static s32 STWI_start_Command(void)
// but the cast here is required to avoid register issue
*(u32 *)gSTWIStatus->txPacket->rfuPacket8.data = 0x99660000 | (gSTWIStatus->reqLength << 8) | gSTWIStatus->reqActiveCommand;
REG_SIODATA32 = gSTWIStatus->txPacket->rfuPacket32.command;
- gSTWIStatus->state = 0;
+ gSTWIStatus->state = 0; // master send req
gSTWIStatus->reqNext = 1;
imeTemp = REG_IME;
REG_IME = 0;
@@ -608,7 +611,7 @@ static s32 STWI_start_Command(void)
static s32 STWI_restart_Command(void)
{
- if (gSTWIStatus->recoveryCount <= 1)
+ if (gSTWIStatus->recoveryCount < 2)
{
++gSTWIStatus->recoveryCount;
STWI_start_Command();
@@ -618,17 +621,17 @@ static s32 STWI_restart_Command(void)
if (gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_DATA_TX_AND_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_UNK35_REQ || gSTWIStatus->reqActiveCommand == ID_RESUME_RETRANSMIT_AND_CHANGE_REQ)
{
gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT;
- gSTWIStatus->unk_2c = 0;
+ gSTWIStatus->sending = 0;
if (gSTWIStatus->callbackM != NULL)
gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error);
}
else
{
gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT;
- gSTWIStatus->unk_2c = 0;
+ gSTWIStatus->sending = 0;
if (gSTWIStatus->callbackM != NULL)
gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error);
- gSTWIStatus->state = 4; // TODO: what's 4
+ gSTWIStatus->state = 4; // error
}
}
return 0;
@@ -636,7 +639,7 @@ static s32 STWI_restart_Command(void)
static s32 STWI_reset_ClockCounter(void)
{
- gSTWIStatus->state = 5; // TODO: what is 5
+ gSTWIStatus->state = 5; // slave receive req init
gSTWIStatus->reqLength = 0;
gSTWIStatus->reqNext = 0;
REG_SIODATA32 = (1 << 31);
diff --git a/src/link.c b/src/link.c
index dfb21f126..cb46a50ff 100644
--- a/src/link.c
+++ b/src/link.c
@@ -82,14 +82,14 @@ u32 gFiller_3003EC0;
u16 gLinkHeldKeys;
u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH];
u32 gLinkStatus;
-bool8 gUnknown_3003F24;
+bool8 gLinkAllAcked5FFF;
bool8 gUnknown_3003F28;
-bool8 gUnknown_3003F2C[MAX_LINK_PLAYERS];
-bool8 gUnknown_3003F30[MAX_LINK_PLAYERS];
-u16 gUnknown_3003F34;
+bool8 gLinkCommand2FFEAck[MAX_LINK_PLAYERS];
+bool8 gLinkCommand5FFFAck[MAX_LINK_PLAYERS];
+u16 gLinkCmd5FFFparam;
u8 gSuppressLinkErrorMessage;
-bool8 gWirelessCommType;
-bool8 gSavedLinkPlayerCount;
+u8 gWirelessCommType;
+u8 gSavedLinkPlayerCount;
u16 gSendCmd[CMD_LENGTH];
u8 gSavedMultiplayerId;
bool8 gReceivedRemoteLinkPlayers;
@@ -123,8 +123,8 @@ EWRAM_DATA struct {
u8 lastSendQueueCount;
u8 unk_06;
} sLinkErrorBuffer = {};
-EWRAM_DATA u16 gUnknown_202285C = 0;
-EWRAM_DATA void *gUnknown_2022860 = NULL;
+static EWRAM_DATA u16 sStartSend5FFFfailures = 0;
+static EWRAM_DATA void *sLinkErrorBgTilemapBuffer = NULL;
static void InitLocalLinkPlayer(void);
static void sub_800978C(void);
@@ -142,13 +142,13 @@ static u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size);
static void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2);
static void LinkCB_RequestPlayerDataExchange(void);
static void Task_PrintTestData(u8 taskId);
-static void sub_800AB0C(void);
-static void sub_800AB38(void);
-static void sub_800ABD4(void);
-static void sub_800AC00(void);
+static void LinkCB_BuildCommand5FFF(void);
+static void LinkCB_WaitAckCommand5FFF(void);
+static void LinkFunc_Send2FFE_1(void);
+static void LinkFunc_Send2FFE_2(void);
static void CheckErrorStatus(void);
static void CB2_PrintErrorMessage(void);
-static void sub_800B210(void);
+static void SetWirelessCommType0(void);
static void DisableSerial(void);
static void EnableSerial(void);
static bool8 IsSioMultiMaster(void);
@@ -232,16 +232,16 @@ bool8 IsWirelessAdapterConnected(void)
if (gQuestLogState == 2 || gQuestLogState == 3)
return FALSE;
- sub_800B1F4();
+ SetWirelessCommType1();
sub_80F86F4();
sub_80FB128(TRUE);
- if (sub_80FD3A4() == RFU_ID)
+ if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID)
{
rfu_REQ_stopMode();
rfu_waitREQComplete();
return TRUE;
}
- sub_800B210();
+ SetWirelessCommType0();
CloseLink();
RestoreSerialTimer3IntrHandlers();
return FALSE;
@@ -379,8 +379,8 @@ void OpenLink(void)
ResetBlockSend();
gUnknown_3000E4C = 0;
gUnknown_3003F28 = FALSE;
- gUnknown_3003F24 = FALSE;
- gUnknown_3003F34 = 0;
+ gLinkAllAcked5FFF = FALSE;
+ gLinkCmd5FFFparam = 0;
CreateTask(Task_TriggerHandshake, 2);
}
else
@@ -391,8 +391,8 @@ void OpenLink(void)
for (i = 0; i < MAX_LINK_PLAYERS; i++)
{
gRemoteLinkPlayersNotReceived[i] = TRUE;
- gUnknown_3003F30[i] = FALSE;
- gUnknown_3003F2C[i] = FALSE;
+ gLinkCommand5FFFAck[i] = FALSE;
+ gLinkCommand2FFEAck[i] = FALSE;
}
}
@@ -401,7 +401,7 @@ void CloseLink(void)
gReceivedRemoteLinkPlayers = FALSE;
if (gWirelessCommType)
{
- sub_80F8DC0();
+ LinkRfu_Shutdown();
}
gLinkOpen = FALSE;
DisableSerial();
@@ -468,7 +468,7 @@ void LinkTestProcessKeyInput(void)
}
if (JOY_NEW(SELECT_BUTTON))
{
- sub_800AAC0();
+ Link_TryStartSend5FFF();
}
if (gLinkTestDebugValuesEnabled)
{
@@ -613,7 +613,7 @@ void ProcessRecvCmds(u8 unused)
linkPlayer->name[9] = 0;
linkPlayer->name[8] = 0;
}
- sub_800B284(linkPlayer);
+ IntlConvertLinkPlayerName(linkPlayer);
if (strcmp(block->magic1, sASCIIGameFreakInc) != 0
|| strcmp(block->magic2, sASCIIGameFreakInc) != 0)
{
@@ -632,10 +632,10 @@ void ProcessRecvCmds(u8 unused)
}
break;
case LINKCMD_0x5FFF:
- gUnknown_3003F30[i] = TRUE;
+ gLinkCommand5FFFAck[i] = TRUE;
break;
case LINKCMD_0x2FFE:
- gUnknown_3003F2C[i] = TRUE;
+ gLinkCommand2FFEAck[i] = TRUE;
break;
case LINKCMD_0xAAAA:
sub_800A3CC();
@@ -701,7 +701,7 @@ void BuildSendCmd(u16 command)
break;
case LINKCMD_0x5FFF:
gSendCmd[0] = LINKCMD_0x5FFF;
- gSendCmd[1] = gUnknown_3003F34;
+ gSendCmd[1] = gLinkCmd5FFFparam;
break;
case LINKCMD_0x5566:
gSendCmd[0] = LINKCMD_0x5566;
@@ -721,7 +721,7 @@ void sub_8009FE8(void)
{
if (gWirelessCommType)
{
- sub_80F9828();
+ StartSendingKeysToRfu();
}
gLinkCallback = sub_800A040;
}
@@ -796,7 +796,7 @@ u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int upper)
if (lower > cmpVal || cmpVal > upper)
{
sPlayerDataExchangeStatus = EXCHANGE_STAT_6;
- return 6;
+ return EXCHANGE_STAT_6;
}
else
{
@@ -1006,15 +1006,15 @@ bool8 SendBlock(u8 unused, const void *src, u16 size)
return InitBlockSend(src, size);
}
-bool8 sub_800A474(u8 a0)
+bool8 sub_800A474(u8 blockRequestType)
{
if (gWirelessCommType == 1)
{
- return sub_80FA0F8(a0);
+ return sub_80FA0F8(blockRequestType);
}
if (gLinkCallback == NULL)
{
- gBlockRequestType = a0;
+ gBlockRequestType = blockRequestType;
BuildSendCmd(LINKCMD_0xCCCC);
return TRUE;
}
@@ -1312,54 +1312,54 @@ u8 sub_800AA74(void)
return gUnknown_3000E50;
}
-void sub_800AA80(u16 a0)
+void Link_StartSend5FFFwithParam(u16 a0)
{
if (gWirelessCommType == 1)
{
- task_add_05_task_del_08FA224_when_no_RfuFunc();
+ Rfu_BeginBuildAndSendCommand5F();
}
else
{
if (gLinkCallback == NULL)
{
- gLinkCallback = sub_800AB0C;
- gUnknown_3003F24 = FALSE;
- gUnknown_3003F34 = a0;
+ gLinkCallback = LinkCB_BuildCommand5FFF;
+ gLinkAllAcked5FFF = FALSE;
+ gLinkCmd5FFFparam = a0;
}
}
}
-void sub_800AAC0(void)
+void Link_TryStartSend5FFF(void)
{
if (gWirelessCommType == 1)
{
- task_add_05_task_del_08FA224_when_no_RfuFunc();
+ Rfu_BeginBuildAndSendCommand5F();
}
else
{
if (gLinkCallback != NULL)
{
- gUnknown_202285C++;
+ sStartSend5FFFfailures++;
}
else
{
- gLinkCallback = sub_800AB0C;
- gUnknown_3003F24 = FALSE;
- gUnknown_3003F34 = 0;
+ gLinkCallback = LinkCB_BuildCommand5FFF;
+ gLinkAllAcked5FFF = FALSE;
+ gLinkCmd5FFFparam = 0;
}
}
}
-static void sub_800AB0C(void)
+static void LinkCB_BuildCommand5FFF(void)
{
if (gLastRecvQueueCount == 0)
{
BuildSendCmd(LINKCMD_0x5FFF);
- gLinkCallback = sub_800AB38;
+ gLinkCallback = LinkCB_WaitAckCommand5FFF;
}
}
-static void sub_800AB38(void)
+static void LinkCB_WaitAckCommand5FFF(void)
{
int i;
unsigned count;
@@ -1369,7 +1369,7 @@ static void sub_800AB38(void)
count = 0;
for (i = 0; i < linkPlayerCount; i++)
{
- if (gUnknown_3003F30[i])
+ if (gLinkCommand5FFFAck[i])
{
count++;
}
@@ -1380,36 +1380,36 @@ static void sub_800AB38(void)
gLinkVSyncDisabled = TRUE;
CloseLink();
gLinkCallback = NULL;
- gUnknown_3003F24 = TRUE;
+ gLinkAllAcked5FFF = TRUE;
}
}
-void sub_800AB9C(void)
+void PrepareSendLinkCmd2FFE_or_RfuCmd6600(void)
{
if (gWirelessCommType == 1)
{
- sub_80FA42C();
+ LinkRfu_SetRfuFuncToSend6600();
}
else
{
if (gLinkCallback == NULL)
{
- gLinkCallback = sub_800ABD4;
+ gLinkCallback = LinkFunc_Send2FFE_1;
}
- gUnknown_3003F24 = FALSE;
+ gLinkAllAcked5FFF = FALSE;
}
}
-static void sub_800ABD4(void)
+static void LinkFunc_Send2FFE_1(void)
{
if (gLastRecvQueueCount == 0)
{
BuildSendCmd(LINKCMD_0x2FFE);
- gLinkCallback = sub_800AC00;
+ gLinkCallback = LinkFunc_Send2FFE_2;
}
}
-static void sub_800AC00(void)
+static void LinkFunc_Send2FFE_2(void)
{
u8 i;
u8 linkPlayerCount;
@@ -1417,7 +1417,7 @@ static void sub_800AC00(void)
linkPlayerCount = GetLinkPlayerCount();
for (i = 0; i < linkPlayerCount; i++)
{
- if (!gUnknown_3003F2C[i])
+ if (!gLinkCommand2FFEAck[i])
{
break;
}
@@ -1426,7 +1426,7 @@ static void sub_800AC00(void)
{
for (i = 0; i < MAX_LINK_PLAYERS; i++)
{
- gUnknown_3003F2C[i] = FALSE;
+ gLinkCommand2FFEAck[i] = FALSE;
}
gLinkCallback = NULL;
}
@@ -1448,7 +1448,7 @@ static void CheckErrorStatus(void)
}
}
-void sub_800ACBC(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06)
+void SetLinkErrorFromRfu(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06)
{
sLinkErrorBuffer.status = status;
sLinkErrorBuffer.lastSendQueueCount = lastSendQueueCount;
@@ -1477,12 +1477,12 @@ void CB2_LinkError(void)
{
gWirelessCommType = 3;
}
- sub_80F85F8();
+ ResetLinkRfuGFLayer();
}
SetVBlankCallback(sub_800978C);
- ResetBgsAndClearDma3BusyFlags(0);
+ ResetBgsAndClearDma3BusyFlags(FALSE);
InitBgsFromTemplates(0, sLinkErrorBgTemplates, 2);
- gUnknown_2022860 = tilemapBuffer = malloc(0x800);
+ sLinkErrorBgTilemapBuffer = tilemapBuffer = malloc(0x800);
SetBgTilemapBuffer(1, tilemapBuffer);
if (InitWindows(sLinkErrorWindowTemplates))
{
@@ -1603,12 +1603,12 @@ static void CB2_PrintErrorMessage(void)
bool8 GetSioMultiSI(void)
{
- return (REG_SIOCNT & 0x04) != 0;
+ return (REG_SIOCNT & SIO_MULTI_SI) != 0;
}
static bool8 IsSioMultiMaster(void)
{
- return (REG_SIOCNT & 0x8) && !(REG_SIOCNT & 0x04);
+ return (REG_SIOCNT & SIO_MULTI_SD) && !(REG_SIOCNT & SIO_MULTI_SI);
}
bool8 IsLinkConnectionEstablished(void)
@@ -1626,7 +1626,7 @@ bool8 HasLinkErrorOccurred(void)
return gLinkErrorOccurred;
}
-void sub_800B0B4(void)
+void PrepareLocalLinkPlayerBlock(void)
{
struct LinkPlayerBlock * block;
@@ -1638,7 +1638,7 @@ void sub_800B0B4(void)
memcpy(gBlockSendBuffer, block, sizeof(*block));
}
-void sub_800B110(u32 who)
+void LinkPlayerFromBlock(u32 who)
{
u8 who_ = who;
struct LinkPlayerBlock * block;
@@ -1647,7 +1647,7 @@ void sub_800B110(u32 who)
block = (struct LinkPlayerBlock *)gBlockRecvBuffer[who_];
player = &gLinkPlayers[who_];
*player = block->linkPlayer;
- sub_800B284(player);
+ IntlConvertLinkPlayerName(player);
if (strcmp(block->magic1, sASCIIGameFreakInc) != 0 || strcmp(block->magic2, sASCIIGameFreakInc) != 0)
{
SetMainCallback2(CB2_LinkError);
@@ -1670,8 +1670,8 @@ bool8 HandleLinkConnection(void)
}
else
{
- r4 = sub_80FAE94();
- r5 = sub_80FAEF0();
+ r4 = LinkRfuMain1();
+ r5 = LinkRfuMain2();
if (sub_8058318() == TRUE)
{
if (r4 == TRUE || IsRfuRecvQueueEmpty() || r5)
@@ -1683,7 +1683,7 @@ bool8 HandleLinkConnection(void)
return FALSE;
}
-void sub_800B1F4(void)
+void SetWirelessCommType1(void)
{
if (gReceivedRemoteLinkPlayers == 0)
{
@@ -1691,7 +1691,7 @@ void sub_800B1F4(void)
}
}
-static void sub_800B210(void)
+static void SetWirelessCommType0(void)
{
if (gReceivedRemoteLinkPlayers == 0)
{
@@ -1699,7 +1699,7 @@ static void sub_800B210(void)
}
}
-void sub_800B22C(void)
+void SetWirelessCommType0_UnusedCopy(void)
{
if (gReceivedRemoteLinkPlayers == 0)
{
@@ -1725,7 +1725,7 @@ bool32 sub_800B270(void)
return FALSE;
}
-void sub_800B284(struct LinkPlayer * player)
+void IntlConvertLinkPlayerName(struct LinkPlayer * player)
{
player->name[10] = player->name[8];
ConvertInternationalString(player->name, player->language);
diff --git a/src/link_rfu.c b/src/link_rfu.c
deleted file mode 100644
index 8ab76ffd5..000000000
--- a/src/link_rfu.c
+++ /dev/null
@@ -1,1381 +0,0 @@
-#include "global.h"
-#include "librfu.h"
-#include "link_rfu.h"
-
-struct UnkRfuStruct_1 gUnknown_3005E10;
-
-static void sub_80FD4E4(void);
-static void sub_80FDC28(u32 a0);
-static void sub_80FDC98(u16 reqCommandId, u16 reqResult);
-static void sub_80FE394(u16 reqCommandId);
-static void sub_80FE418(void);
-static void sub_80FE63C(void);
-static void sub_80FE6F0(void);
-static void sub_80FE74C(void);
-static u8 sub_80FE778(void);
-static void sub_80FE7F0(u8 a0, u8 a1);
-static void sub_80FE818(u8 bmDisconnectSlot);
-static void sub_80FE83C(u8 a0);
-static void sub_80FE918(void);
-static void sub_80FEAF4(void);
-
-u32 sub_80FD3A4(void)
-{
- u32 id = rfu_REQBN_softReset_and_checkID();
- if (id == RFU_ID)
- gUnknown_3005E10.unk_08 = 1;
- if (gUnknown_3005E10.unk_04 != 0x17 && gUnknown_3005E10.unk_04 != 0x01)
- {
- gUnknown_3005E10.unk_05 = 0;
- gUnknown_3005E10.unk_04 = 0;
- }
- gUnknown_3005E10.unk_07 = 0;
- gUnknown_3005E10.unk_0d = 0;
- gUnknown_3005E10.unk_01 = 0;
- gUnknown_3005E10.unk_00 = 0;
- gUnknown_3005E10.unk_06 = -1;
- sub_80FEAF4();
- return id;
-}
-
-void LinkRfu_REQ_SendData_HandleParentRelationship(u8 clockChangeFlag)
-{
- if (gRfuLinkStatus->parentChild == MODE_CHILD)
- {
- if (gUnknown_3005E10.unk_02 == TRUE)
- clockChangeFlag = TRUE;
- else
- clockChangeFlag = FALSE;
- }
- else
- gUnknown_3005E10.unk_03 = 0;
- rfu_REQ_sendData(clockChangeFlag);
-}
-
-s32 sub_80FD430(void (*func1)(u8, u8), void (*func2)(u16))
-{
- if (func1 == NULL)
- {
- return 4;
- }
- CpuFill16(0, &gUnknown_3005E10, sizeof(struct UnkRfuStruct_1));
- gUnknown_3005E10.unk_06 = -1;
- gUnknown_3005E10.unk_40 = func1;
- gUnknown_3005E10.unk_44 = func2;
- rfu_setMSCCallback(sub_80FE394);
- rfu_setREQCallback(sub_80FDC98);
- return 0;
-}
-
-static void sub_80FD484(void)
-{
- CpuFill16(0, &gUnknown_3005E10, offsetof(struct UnkRfuStruct_1, unk_40));
- gUnknown_3005E10.unk_06 = -1;
-}
-
-void sub_80FD4B0(const struct UnkLinkRfuStruct_02022B2C *unk0)
-{
- sub_80FD4E4();
- gUnknown_3005E10.unk_04 = 1;
- gUnknown_3005E10.unk_05 = 2;
- gUnknown_3005E10.unk_3c = unk0;
- gUnknown_3005E10.unk_09 = unk0->unk_11;
- gUnknown_3005E10.unk_32 = unk0->unk_12;
- gUnknown_3005E10.unk_18 = unk0->unk_14;
- if (unk0->unk_10)
- {
- gUnknown_3005E10.unk_0b = 1;
- }
-}
-
-static void sub_80FD4E4(void)
-{
- u8 i;
-
- gUnknown_3005E10.unk_05 = 0;
- gUnknown_3005E10.unk_04 = 0;
- gUnknown_3005E10.unk_06 = -1;
- gUnknown_3005E10.unk_07 = 0;
- gUnknown_3005E10.unk_10 = 0;
- gUnknown_3005E10.unk_0c = 0;
- gUnknown_3005E10.unk_24 = 0;
- gUnknown_3005E10.unk_30 = 0;
- for (i = 0; i < RFU_CHILD_MAX; i++)
- {
- gUnknown_3005E10.unk_28[i] = 0;
- gUnknown_3005E10.unk_34[i] = 0;
- }
-}
-
-void sub_80FD52C(void)
-{
- gUnknown_3005E10.unk_04 = 0x15;
-}
-
-u8 sub_80FD538(u8 r5, u16 r7, u16 r8, const u16 *r6)
-{
- u8 i;
- const u16 *buffer;
-
- if (gUnknown_3005E10.unk_04 != 0 && (gUnknown_3005E10.unk_04 != 0x08 || r5 != 1))
- {
- gUnknown_3005E10.unk_14 = 1;
- sub_80FE7F0(0xf3, 0x01);
- return 1;
- }
- if (rfu_getMasterSlave() == AGB_CLK_SLAVE)
- {
- gUnknown_3005E10.unk_14 = 2;
- sub_80FE7F0(0xf3, 0x01);
- return 2;
- }
- for (i = 0, buffer = r6; i < 16; i++)
- {
- if (*buffer++ == 0xFFFF)
- {
- break;
- }
- }
- if (i == 16)
- {
- gUnknown_3005E10.unk_14 = 4;
- sub_80FE7F0(0xf3, 0x01);
- return 4;
- }
- if (r5 > 1)
- {
- gUnknown_3005E10.unk_07 = 1;
- r5 = 1;
- r7 = 0;
- }
- else
- {
- gUnknown_3005E10.unk_07 = 0;
- }
- if (r5 != 0)
- {
- gUnknown_3005E10.unk_04 = 5;
- }
- else
- {
- gUnknown_3005E10.unk_04 = 9;
- if (gUnknown_3005E10.unk_0b)
- {
- gUnknown_3005E10.unk_0b = 2;
- }
- }
- gUnknown_3005E10.unk_06 = r5;
- gUnknown_3005E10.unk_1a = r7;
- gUnknown_3005E10.unk_26 = r8;
- gUnknown_3005E10.unk_20 = r6;
- return 0;
-}
-
-u8 sub_80FD610(u16 parentId, u16 unk_1a)
-{
- u8 i;
-
- if (gUnknown_3005E10.unk_04 != 0 && (gUnknown_3005E10.unk_04 < 9 || gUnknown_3005E10.unk_04 > 11))
- {
- gUnknown_3005E10.unk_14 = 1;
- sub_80FE7F0(0xF3, 0x01);
- return 1;
- }
- if (rfu_getMasterSlave() == AGB_CLK_SLAVE)
- {
- gUnknown_3005E10.unk_14 = 2;
- sub_80FE7F0(0xF3, 0x01);
- return 2;
- }
- for (i = 0; i < gRfuLinkStatus->findParentCount; i++)
- {
- if (gRfuLinkStatus->partner[i].id == parentId)
- {
- break;
- }
- }
- if (gRfuLinkStatus->findParentCount == 0 || i == gRfuLinkStatus->findParentCount)
- {
- gUnknown_3005E10.unk_14 = 3;
- sub_80FE7F0(0xF3, 0x01);
- return 3;
- }
- if (gUnknown_3005E10.unk_04 == 0 || gUnknown_3005E10.unk_04 == 9)
- {
- gUnknown_3005E10.unk_04 = 12;
- gUnknown_3005E10.unk_05 = 13;
- }
- else
- {
- gUnknown_3005E10.unk_04 = 11;
- gUnknown_3005E10.unk_05 = 12;
- }
- gUnknown_3005E10.unk_1e = parentId;
- gUnknown_3005E10.unk_1a = unk_1a;
- if (gUnknown_3005E10.unk_07 != 0)
- {
- gUnknown_3005E10.unk_07 = 7;
- }
- return 0;
-}
-
-static void sub_80FD6F4(u8 lossSlot)
-{
- u8 i;
-
- if (lossSlot & gUnknown_3005E10.unk_30)
- {
- gUnknown_3005E10.unk_30 &= ~lossSlot;
- for (i = 0; i < RFU_CHILD_MAX; i++)
- {
- if ((lossSlot >> i) & 1)
- {
- gUnknown_3005E10.unk_34[i] = 0;
- }
- }
- i = gRfuLinkStatus->linkLossSlotFlag & lossSlot;
- if (i)
- {
- sub_80FE818(i);
- }
- gUnknown_3005E10.unk_14 = i;
- sub_80FE7F0(0x33, i);
- }
-}
-
-void sub_80FD760(bool8 a0)
-{
- u8 r2;
-
- r2 = 0;
- gUnknown_3005E10.unk_07 = 0;
- if (a0)
- {
- sub_80FD4E4();
- gUnknown_3005E10.unk_04 = 23;
- }
- else
- {
- switch (gUnknown_3005E10.unk_04)
- {
- case 5:
- gUnknown_3005E10.unk_04 = 8;
- gUnknown_3005E10.unk_05 = 0;
- r2 = 0x13;
- break;
- case 6:
- gUnknown_3005E10.unk_04 = 7;
- gUnknown_3005E10.unk_05 = 8;
- break;
- case 7:
- gUnknown_3005E10.unk_04 = 7;
- gUnknown_3005E10.unk_05 = 8;
- break;
- case 8:
- break;
- case 9:
- gUnknown_3005E10.unk_05 = 0;
- gUnknown_3005E10.unk_04 = 0;
- r2 = 0x21;
- break;
- case 10:
- gUnknown_3005E10.unk_04 = 11;
- gUnknown_3005E10.unk_05 = 0;
- break;
- case 11:
- gUnknown_3005E10.unk_04 = 11;
- gUnknown_3005E10.unk_05 = 0;
- break;
- case 12:
- gUnknown_3005E10.unk_05 = 0;
- gUnknown_3005E10.unk_04 = 0;
- r2 = 0x23;
- break;
- case 13:
- gUnknown_3005E10.unk_04 = 14;
- break;
- case 14:
- gUnknown_3005E10.unk_04 = 14;
- break;
- case 15:
- break;
- case 16:
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_11;
- gUnknown_3005E10.unk_05 = gUnknown_3005E10.unk_12;
- sub_80FE818(gRfuLinkStatus->linkLossSlotFlag);
- gUnknown_3005E10.unk_14 = gRfuLinkStatus->linkLossSlotFlag;
- sub_80FE7F0(0x33, 0x01);
- return;
- case 17:
- gUnknown_3005E10.unk_04 = 18;
- break;
- case 18:
- gUnknown_3005E10.unk_04 = 18;
- break;
- default:
- gUnknown_3005E10.unk_05 = 0;
- gUnknown_3005E10.unk_04 = 0;
- r2 = 0x43;
- break;
- }
- if (gUnknown_3005E10.unk_04 == 0)
- {
- sub_80FE7F0(r2, 0);
- }
- }
-}
-
-static bool8 sub_80FD850(u16 reqCommandId)
-{
- bool8 retVal;
- u8 i;
- u8 bmLinkLossSlot;
- u8 linkLossReason;
- u8 parentBmLinkRecoverySlot;
- u8 flags;
-
- retVal = FALSE;
- rfu_REQBN_watchLink(reqCommandId, &bmLinkLossSlot, &linkLossReason, &parentBmLinkRecoverySlot);
- if (bmLinkLossSlot)
- {
- gUnknown_3005E10.unk_14 = bmLinkLossSlot;
- gUnknown_3005E10.unk_16 = linkLossReason;
- if (gUnknown_3005E10.unk_09)
- {
- gUnknown_3005E10.unk_0a = 1;
- if (gUnknown_3005E10.unk_06 == 0 && linkLossReason == REASON_DISCONNECTED)
- {
- gUnknown_3005E10.unk_0a = 4;
- }
- if (gUnknown_3005E10.unk_0a == 1)
- {
- for (i = 0; i < RFU_CHILD_MAX; i++)
- {
- if ((bmLinkLossSlot >> i) & 1)
- {
- gUnknown_3005E10.unk_30 |= (1 << i);
- gUnknown_3005E10.unk_34[i] = gUnknown_3005E10.unk_32;
- }
- }
- sub_80FE7F0(0x31, 0x01);
- }
- else
- {
- gUnknown_3005E10.unk_0a = 0;
- sub_80FE818(bmLinkLossSlot);
- retVal = TRUE;
- sub_80FE7F0(0x33, 0x01);
- }
- }
- else
- {
- sub_80FE818(bmLinkLossSlot);
- retVal = TRUE;
- sub_80FE7F0(0x30, 0x02);
- }
- sub_80FEAF4();
- }
- if (gRfuLinkStatus->parentChild == MODE_PARENT)
- {
- if (parentBmLinkRecoverySlot)
- {
- for (i = 0; i < RFU_CHILD_MAX; i++)
- {
- if ((gUnknown_3005E10.unk_30 >> i) & 1 && (parentBmLinkRecoverySlot >> i) & 1)
- {
- gUnknown_3005E10.unk_34[i] = 0;
- }
- }
- gUnknown_3005E10.unk_30 &= ~parentBmLinkRecoverySlot;
- gUnknown_3005E10.unk_14 = parentBmLinkRecoverySlot;
- sub_80FE7F0(0x32, 0x01);
- }
- if (gUnknown_3005E10.unk_30)
- {
- flags = 0;
- for (i = 0; i < RFU_CHILD_MAX; i++)
- {
- if ((gUnknown_3005E10.unk_30 >> i) & 1 && gUnknown_3005E10.unk_34[i] && --gUnknown_3005E10.unk_34[i] == 0)
- {
- gUnknown_3005E10.unk_30 &= ~(1 << i);
- flags |= (1 << i);
- }
- }
- if (flags)
- {
- sub_80FE818(flags);
- retVal = TRUE;
- gUnknown_3005E10.unk_14 = flags;
- sub_80FE7F0(0x33, 0x01);
- }
- }
- if (!gUnknown_3005E10.unk_30)
- {
- gUnknown_3005E10.unk_0a = 0;
- }
- }
- return retVal;
-}
-
-void LinkRfu_syncVBlank_(void)
-{
- if (rfu_syncVBlank())
- {
- sub_80FE7F0(0xF1, 0x00);
- sub_80FEAF4();
- }
-}
-
-void sub_80FDA30(u32 a0)
-{
- u8 r2;
-
- if (gUnknown_3005E10.unk_40 == NULL && gUnknown_3005E10.unk_04 != 0)
- {
- gUnknown_3005E10.unk_04 = 0;
- }
- else
- {
- if (gUnknown_3005E10.unk_07 != 0)
- {
- sub_80FDC28(a0);
- }
- do
- {
- if (gUnknown_3005E10.unk_04 != 0)
- {
- rfu_waitREQComplete();
- gUnknown_3005E10.unk_0e = 1;
- switch (gUnknown_3005E10.unk_04)
- {
- case 23:
- r2 = sub_80FD3A4() == RFU_ID ? 0x44 : 0xFF;
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0;
- sub_80FE7F0(r2, 0);
- break;
- case 1:
- if (sub_80FD3A4() == RFU_ID)
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05;
- gUnknown_3005E10.unk_05 = 3;
- }
- else
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0;
- sub_80FE7F0(0xFF, 0);
- }
- break;
- case 2:
- rfu_REQ_reset();
- break;
- case 3:
- rfu_REQ_configSystem(gUnknown_3005E10.unk_3c->availSlotFlag, gUnknown_3005E10.unk_3c->maxMFrame, gUnknown_3005E10.unk_3c->mcTimer);
- break;
- case 4:
- rfu_REQ_configGameData(gUnknown_3005E10.unk_3c->mbootFlag, gUnknown_3005E10.unk_3c->serialNo, (const u8 *)gUnknown_3005E10.unk_3c->gname, gUnknown_3005E10.unk_3c->uname);
- break;
- case 5:
- rfu_REQ_startSearchChild();
- break;
- case 6:
- rfu_REQ_pollSearchChild();
- break;
- case 7:
- rfu_REQ_endSearchChild();
- break;
- case 8:
- break;
- case 9:
- rfu_REQ_startSearchParent();
- break;
- case 10:
- rfu_REQ_pollSearchParent();
- break;
- case 11:
- rfu_REQ_endSearchParent();
- break;
- case 12:
- rfu_REQ_startConnectParent(gUnknown_3005E10.unk_1e);
- break;
- case 13:
- rfu_REQ_pollConnectParent();
- break;
- case 14:
- rfu_REQ_endConnectParent();
- break;
- case 15:
- break;
- case 16:
- rfu_REQ_CHILD_startConnectRecovery(gRfuLinkStatus->linkLossSlotFlag);
- break;
- case 17:
- rfu_REQ_CHILD_pollConnectRecovery();
- break;
- case 18:
- rfu_REQ_CHILD_endConnectRecovery();
- break;
- case 19:
- rfu_REQ_changeMasterSlave();
- break;
- case 20:
- break;
- case 21:
- rfu_REQ_stopMode();
- break;
- case 22:
- break;
- }
- rfu_waitREQComplete();
- gUnknown_3005E10.unk_0e = 0;
- }
- } while (gUnknown_3005E10.unk_04 == 18 || gUnknown_3005E10.unk_04 == 19);
- if (gRfuLinkStatus->parentChild != MODE_PARENT || !sub_80FD850(0))
- {
- sub_80FE418();
- sub_80FE63C();
- sub_80FE74C();
- sub_80FE918();
- }
- }
-}
-
-static void sub_80FDC28(u32 a0)
-{
- if (gUnknown_3005E10.unk_07 == 5)
- {
- gUnknown_3005E10.unk_06 = 1;
- gUnknown_3005E10.unk_04 = 5;
- gUnknown_3005E10.unk_1a = gUnknown_3005E10.unk_1c;
- if (gUnknown_3005E10.unk_1a)
- {
- gUnknown_3005E10.unk_07 = 6;
- }
- else
- {
- gUnknown_3005E10.unk_07 = 1;
- }
- }
- if (gUnknown_3005E10.unk_07 == 1)
- {
- gUnknown_3005E10.unk_06 = 1;
- gUnknown_3005E10.unk_04 = 5;
- gUnknown_3005E10.unk_1a = a0 % 140;
- gUnknown_3005E10.unk_1c = 140 - gUnknown_3005E10.unk_1a;
- if (gUnknown_3005E10.unk_1a)
- {
- gUnknown_3005E10.unk_07 = 2;
- }
- else
- {
- gUnknown_3005E10.unk_07 = 3;
- }
- }
- if (gUnknown_3005E10.unk_07 == 3)
- {
- gUnknown_3005E10.unk_06 = 0;
- gUnknown_3005E10.unk_1a = 40;
- gUnknown_3005E10.unk_07 = 4;
- gUnknown_3005E10.unk_04 = 9;
- }
-}
-
-static void sub_80FDC98(u16 reqCommandId, u16 reqResult)
-{
- u8 sp0;
- register u8 *stwiRecvBuffer asm("r0");
- u8 *tmp;
- u8 i;
-
- if (gUnknown_3005E10.unk_0e != 0)
- {
- gUnknown_3005E10.unk_0e = 0;
- switch (reqCommandId)
- {
- case ID_RESET_REQ:
- if (reqResult == 0)
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05;
- gUnknown_3005E10.unk_05 = 4;
- }
- break;
- case ID_SYSTEM_CONFIG_REQ:
- if (reqResult == 0)
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05;
- gUnknown_3005E10.unk_05 = 0;
- }
- break;
- case ID_GAME_CONFIG_REQ:
- if (reqResult == 0)
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0;
- sub_80FE7F0(0x00, 0x00);
- }
- break;
- case ID_SC_START_REQ:
- if (reqResult == 0)
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 6;
- }
- break;
- case ID_SC_POLL_REQ:
- if (gUnknown_3005E10.unk_1a && --gUnknown_3005E10.unk_1a == 0)
- {
- gUnknown_3005E10.unk_04 = 7;
- gUnknown_3005E10.unk_05 = 8;
- }
- break;
- case ID_SC_END_REQ:
- if (reqResult == 0)
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05;
- gUnknown_3005E10.unk_05 = 0;
- if (gUnknown_3005E10.unk_07 == 0)
- {
- sub_80FE7F0(0x13, 0x00);
- }
- }
- break;
- case ID_SP_START_REQ:
- if (reqResult == 0)
- {
- if (gUnknown_3005E10.unk_0b == 1 && gUnknown_3005E10.unk_1a > 1)
- {
- gUnknown_3005E10.unk_1a--;
- }
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 10;
- }
- break;
- case ID_SP_POLL_REQ:
- if (reqResult == 0)
- {
- sp0 = sub_80FE778();
- gUnknown_3005E10.unk_14 = sp0;
- if (sp0)
- {
- sub_80FE7F0(0x20, 0x01);
- }
- if (gUnknown_3005E10.unk_0b && gUnknown_3005E10.unk_1a != 1 && gRfuLinkStatus->findParentCount == RFU_CHILD_MAX)
- {
- rfu_REQ_endSearchParent();
- rfu_waitREQComplete();
- gUnknown_3005E10.unk_04 = 9;
- gUnknown_3005E10.unk_0b = 1;
- }
- }
- if (gUnknown_3005E10.unk_1a && --gUnknown_3005E10.unk_1a == 0)
- {
- gUnknown_3005E10.unk_04 = 11;
- gUnknown_3005E10.unk_05 = 0;
- }
- break;
- case ID_SP_END_REQ:
- if (reqResult == 0)
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05;
- if (gUnknown_3005E10.unk_07 == 0)
- {
- if (gUnknown_3005E10.unk_04 == 0)
- {
- sub_80FE7F0(0x21, 0x00);
- }
- }
- else if (gUnknown_3005E10.unk_07 != 7)
- {
- gUnknown_3005E10.unk_04 = 5;
- gUnknown_3005E10.unk_07 = 5;
- }
- }
- break;
- case ID_CP_START_REQ:
- if (reqResult == 0)
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 13;
- }
- break;
- case ID_CP_POLL_REQ:
- if (reqResult == 0 && !rfu_getConnectParentStatus(&sp0, &gUnknown_3005E10.unk_10) && !sp0)
- {
- gUnknown_3005E10.unk_04 = 14;
- }
- if (gUnknown_3005E10.unk_1a && --gUnknown_3005E10.unk_1a == 0)
- {
- gUnknown_3005E10.unk_04 = 14;
- }
- break;
- case ID_CP_END_REQ:
- if (reqResult == 0 && !rfu_getConnectParentStatus(&sp0, &gUnknown_3005E10.unk_10))
- {
- if (!sp0)
- {
- gUnknown_3005E10.unk_04 = 19;
- gUnknown_3005E10.unk_05 = 15;
- gUnknown_3005E10.unk_1e = 0x22;
- gUnknown_3005E10.unk_14 = gUnknown_3005E10.unk_10;
- }
- else
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0;
- gUnknown_3005E10.unk_1e = 0x23;
- gUnknown_3005E10.unk_14 = sp0;
- if (gUnknown_3005E10.unk_07)
- {
- gUnknown_3005E10.unk_07 = 3;
- gUnknown_3005E10.unk_04 = 9;
- }
- }
- sub_80FE7F0(gUnknown_3005E10.unk_1e, 0x01);
- gUnknown_3005E10.unk_1e = 0;
- }
- break;
- case ID_CPR_START_REQ:
- if (reqResult == 0)
- {
- gUnknown_3005E10.unk_14 = gRfuLinkStatus->linkLossSlotFlag;
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 17;
- for (gUnknown_3005E10.unk_10 = 0; gUnknown_3005E10.unk_10 < RFU_CHILD_MAX; gUnknown_3005E10.unk_10++)
- {
- if ((gRfuLinkStatus->linkLossSlotFlag >> gUnknown_3005E10.unk_10) & 1)
- {
- break;
- }
- }
- }
- break;
- case ID_CPR_POLL_REQ:
- if (reqResult == 0 && !rfu_CHILD_getConnectRecoveryStatus(&sp0) && sp0 < 2)
- {
- gUnknown_3005E10.unk_04 = 18;
- }
- if (gUnknown_3005E10.unk_34[gUnknown_3005E10.unk_10] && --gUnknown_3005E10.unk_34[gUnknown_3005E10.unk_10] == 0)
- {
- gUnknown_3005E10.unk_04 = 18;
- }
- break;
- case ID_CPR_END_REQ:
- if (reqResult == 0 && !rfu_CHILD_getConnectRecoveryStatus(&sp0))
- {
- if (!sp0)
- {
- gUnknown_3005E10.unk_04 = 19;
- gUnknown_3005E10.unk_05 = 22;
- gUnknown_3005E10.unk_1e = 0x32;
- }
- else
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0;
- sub_80FE818(gRfuLinkStatus->linkLossSlotFlag);
- gUnknown_3005E10.unk_1e = 0x33;
- }
- gUnknown_3005E10.unk_34[gUnknown_3005E10.unk_10] = 0;
- gUnknown_3005E10.unk_30 = 0;
- gUnknown_3005E10.unk_0a = 0;
- sub_80FE7F0(gUnknown_3005E10.unk_1e, 0x01);
- gUnknown_3005E10.unk_1e = 0;
- }
- break;
- case ID_MS_CHANGE_REQ:
- if (reqResult == 0)
- {
- if (gUnknown_3005E10.unk_05 == 22)
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_11;
- gUnknown_3005E10.unk_05 = gUnknown_3005E10.unk_12;
- gUnknown_3005E10.unk_02 = 1;
- sub_80FE7F0(0x41, 0x00);
- }
- else if (gUnknown_3005E10.unk_05 == 15)
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05;
- gUnknown_3005E10.unk_02 = 1;
- sub_80FE7F0(0x41, 0x00);
- gUnknown_3005E10.unk_24 |= 1 << gUnknown_3005E10.unk_10;
- gUnknown_3005E10.unk_28[gUnknown_3005E10.unk_10] = gUnknown_3005E10.unk_26;
- rfu_clearSlot(TYPE_NI_SEND, gUnknown_3005E10.unk_10);
- tmp = &sp0;
- *tmp = rfu_NI_CHILD_setSendGameName(gUnknown_3005E10.unk_10, 0x0e);
- if (*tmp)
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0;
- sub_80FEAF4();
- sub_80FE818(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag);
- gUnknown_3005E10.unk_14 = sp0;
- sub_80FE7F0(0x25, 0x01);
- }
- }
- }
- break;
- case ID_STOP_MODE_REQ:
- if (reqResult == 0)
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0;
- sub_80FE7F0(0x42, 0x00);
- }
- break;
- }
- gUnknown_3005E10.unk_0e = 1;
- }
- else if (reqResult == 3 && gUnknown_3005E10.unk_0f && (reqCommandId == ID_DATA_TX_REQ || reqCommandId == ID_DATA_RX_REQ || reqCommandId == ID_MS_CHANGE_REQ))
- {
- rfu_REQ_RFUStatus();
- rfu_waitREQComplete();
- rfu_getRFUStatus(&sp0);
- if (sp0 == 0 && gRfuLinkStatus->parentChild == MODE_CHILD)
- {
- stwiRecvBuffer = rfu_getSTWIRecvBuffer()->rxPacketAlloc.rfuPacket8.data;
- stwiRecvBuffer[4] = gRfuLinkStatus->connSlotFlag;
- stwiRecvBuffer[5] = 1;
- sub_80FD850(0x29);
- reqResult = 0;
- }
- }
- switch (reqCommandId)
- {
- case ID_DISCONNECT_REQ:
- if (reqResult == 0)
- {
- stwiRecvBuffer = rfu_getSTWIRecvBuffer()->rxPacketAlloc.rfuPacket8.data;
- gUnknown_3005E10.unk_14 = stwiRecvBuffer[8];
- sub_80FE83C(gUnknown_3005E10.unk_14);
- if (gUnknown_3005E10.unk_30)
- {
- gUnknown_3005E10.unk_30 &= ~gUnknown_3005E10.unk_14;
- for (i = 0; i < RFU_CHILD_MAX; i++)
- {
- if ((gUnknown_3005E10.unk_14 >> i) & 1)
- {
- gUnknown_3005E10.unk_34[i] = 0;
- }
- }
- if (gUnknown_3005E10.unk_06 == 0)
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0;
- }
- }
- sp0 = gUnknown_3005E10.unk_00 & gUnknown_3005E10.unk_14;
- for (i = 0; i < RFU_CHILD_MAX; i++)
- {
- if ((sp0 >> i) & 1 && gUnknown_3005E10.unk_01)
- {
- gUnknown_3005E10.unk_01--;
- }
- }
- gUnknown_3005E10.unk_00 &= ~gUnknown_3005E10.unk_14;
- if (gUnknown_3005E10.unk_07)
- {
- if (gRfuLinkStatus->parentChild == MODE_NEUTRAL)
- {
- if (gUnknown_3005E10.unk_07 == 8)
- {
- gUnknown_3005E10.unk_1a = gUnknown_3005E10.unk_1c;
- gUnknown_3005E10.unk_07 = 6;
- gUnknown_3005E10.unk_04 = 6;
- }
- else if (gUnknown_3005E10.unk_04 != 6 && gUnknown_3005E10.unk_04 != 7)
- {
- gUnknown_3005E10.unk_07 = 1;
- gUnknown_3005E10.unk_04 = 5;
- }
- }
- }
- if (gRfuLinkStatus->parentChild == MODE_NEUTRAL)
- {
- if (gUnknown_3005E10.unk_04 == 0)
- {
- gUnknown_3005E10.unk_06 = -1;
- }
- }
- if (gUnknown_3005E10.unk_0e == 0)
- {
- sub_80FE7F0(0x40, 0x01);
- }
- }
- break;
- case ID_DATA_RX_REQ:
- sub_80FE6F0();
- if (gRfuLinkStatus->parentChild != MODE_NEUTRAL)
- {
- sub_80FE7F0(0x50, 0x00);
- }
- break;
- case ID_RESET_REQ:
- case ID_STOP_MODE_REQ:
- if (reqResult == 0)
- {
- gUnknown_3005E10.unk_0d = 0;
- gUnknown_3005E10.unk_01 = 0;
- gUnknown_3005E10.unk_00 = 0;;
- gUnknown_3005E10.unk_06 = -1;
- sub_80FEAF4();
- if (reqCommandId == 61)
- {
- sub_80FD484();
- }
- }
- break;
- }
- if (reqResult != 0)
- {
- if (reqCommandId == ID_SP_START_REQ && reqResult != 0 && gUnknown_3005E10.unk_07 == 4)
- {
- gRfuLinkStatus->parentChild = MODE_PARENT;
- gRfuLinkStatus->connSlotFlag = 0xF;
- sub_80FE818(15);
- rfu_waitREQComplete();
- return;
- }
- else
- {
- gUnknown_3005E10.unk_14 = reqCommandId;
- gUnknown_3005E10.unk_16 = reqResult;
- if (gUnknown_3005E10.unk_0e)
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0;
- }
- sub_80FE7F0(0xf0, 0x02);
- sub_80FEAF4();
- }
- }
- if (reqCommandId == ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ)
- {
- sub_80FE7F0(0xf2, 0x00);
- sub_80FEAF4();
- }
-}
-
-static void sub_80FE394(u16 reqCommandId)
-{
- u8 r7;
- u8 ackFlag;
-
- r7 = gUnknown_3005E10.unk_0e;
- gUnknown_3005E10.unk_0e = 0;
- gUnknown_3005E10.unk_0f = 1;
- if (gRfuLinkStatus->parentChild == MODE_CHILD)
- {
- sub_80FD850(reqCommandId);
- if (gUnknown_3005E10.unk_02 != 1)
- {
- sub_80FEAF4();
- gUnknown_3005E10.unk_0f = 0;
- gUnknown_3005E10.unk_0e = r7;
- return;
- }
- }
- else
- {
- if (!rfu_UNI_PARENT_getDRAC_ACK(&ackFlag))
- {
- gUnknown_3005E10.unk_03 |= ackFlag;
- }
- }
- if (gUnknown_3005E10.unk_44 != NULL)
- {
- gUnknown_3005E10.unk_44(reqCommandId);
- rfu_waitREQComplete();
- if (gUnknown_3005E10.unk_02 == 2)
- {
- sub_80FEAF4();
- }
- }
- gUnknown_3005E10.unk_0f = 0;
- gUnknown_3005E10.unk_0e = r7;
-}
-
-static void sub_80FE418(void)
-{
- u8 flags;
- u8 sp0;
- u8 i;
- u8 r5;
- u8 r4;
- const u16 *ptr;
-
- if (gUnknown_3005E10.unk_04 == 5 || gUnknown_3005E10.unk_04 == 6 || gUnknown_3005E10.unk_04 == 7 || gUnknown_3005E10.unk_04 == 8)
- {
- flags = ((gRfuLinkStatus->connSlotFlag ^ gUnknown_3005E10.unk_0c) & gRfuLinkStatus->connSlotFlag) & ~gRfuLinkStatus->getNameFlag;
- gUnknown_3005E10.unk_0c = gRfuLinkStatus->connSlotFlag;
- if (flags)
- {
- gUnknown_3005E10.unk_14 = flags;
- sub_80FE7F0(0x10, 0x01);
- }
- sp0 = 0x00;
- for (i = 0; i < RFU_CHILD_MAX; i++)
- {
- r4 = 1 << i;
- r5 = 0x00;
- if (flags & r4)
- {
- gUnknown_3005E10.unk_28[i] = gUnknown_3005E10.unk_26;
- gUnknown_3005E10.unk_24 |= r4;
- }
- else if (gUnknown_3005E10.unk_24 & r4)
- {
- if (gRfuSlotStatusNI[i]->recv.state == SLOT_STATE_RECV_SUCCESS)
- {
- if (gRfuSlotStatusNI[i]->recv.dataType == 1) // Game identification information
- {
- r5 = 0x02;
- for (ptr = gUnknown_3005E10.unk_20; *ptr != 0xFFFF; ptr++)
- {
- if (gRfuLinkStatus->partner[i].serialNo == *ptr)
- {
- gUnknown_3005E10.unk_00 |= r4;
- gUnknown_3005E10.unk_01++;
- sp0 |= r4;
- r5 |= 0x01;
- break;
- }
- }
- if (!(r5 & 0x01))
- {
- r5 |= 0x04;
- }
- }
- }
- else if (--gUnknown_3005E10.unk_28[i] == 0)
- {
- r5 = 0x06;
- }
- if (r5 & 0x02)
- {
- gUnknown_3005E10.unk_24 &= ~r4;
- gUnknown_3005E10.unk_28[i] = 0;
- rfu_clearSlot(TYPE_NI_RECV, i);
- }
- if (r5 & 0x04)
- {
- gUnknown_3005E10.unk_0d |= r4;
- }
- }
- }
- if (sp0)
- {
- gUnknown_3005E10.unk_14 = sp0;
- sub_80FE7F0(0x11, 0x01);
- }
- if (gUnknown_3005E10.unk_0d)
- {
- r5 = 0x01;
- if (gRfuLinkStatus->sendSlotUNIFlag && ((gUnknown_3005E10.unk_03 & gUnknown_3005E10.unk_00) != gUnknown_3005E10.unk_00))
- {
- r5 = 0x00;
- }
- if (r5)
- {
- sub_80FE818(gUnknown_3005E10.unk_0d);
- gUnknown_3005E10.unk_14 = gUnknown_3005E10.unk_0d;
- gUnknown_3005E10.unk_0d = 0;
- sub_80FE7F0(0x12, 0x01);
- }
- }
- if (gUnknown_3005E10.unk_24 == 0 && gUnknown_3005E10.unk_04 == 8)
- {
- if (gUnknown_3005E10.unk_07 == 0)
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0;
- sub_80FE7F0(0x14, 0x00);
- }
- else
- {
- if (gUnknown_3005E10.unk_07 == 2)
- {
- gUnknown_3005E10.unk_07 = 3;
- gUnknown_3005E10.unk_04 = 9;
- }
- else
- {
- gUnknown_3005E10.unk_07 = 1;
- gUnknown_3005E10.unk_04 = 5;
- }
- if (gUnknown_3005E10.unk_00)
- {
- gUnknown_3005E10.unk_1a = 0;
- gUnknown_3005E10.unk_07 = 8;
- gUnknown_3005E10.unk_04 = 5;
- }
- }
- }
- }
-}
-
-static void sub_80FE63C(void)
-{
- u16 imeBak = REG_IME;
- REG_IME = 0;
- if (gUnknown_3005E10.unk_04 == 15)
- {
- if (--gUnknown_3005E10.unk_28[gUnknown_3005E10.unk_10] == 0 || gRfuSlotStatusNI[gUnknown_3005E10.unk_10]->send.state == SLOT_STATE_SEND_FAILED)
- {
- sub_80FEB14();
- gUnknown_3005E10.unk_04 = 24;
- rfu_clearSlot(TYPE_NI_SEND, gUnknown_3005E10.unk_10);
- gUnknown_3005E10.unk_24 &= ~(1 << gUnknown_3005E10.unk_10);
- gUnknown_3005E10.unk_28[gUnknown_3005E10.unk_10] = 0;
- }
- }
- REG_IME = imeBak;
- if (gUnknown_3005E10.unk_04 == 24)
- {
- if (gUnknown_3005E10.unk_02 == 1)
- {
- sub_80FEB14();
- }
- if (gUnknown_3005E10.unk_02 == 0)
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0;
- sub_80FE818(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag);
- gUnknown_3005E10.unk_14 = 0;
- sub_80FE7F0(0x25, 0x01);
- }
- }
-}
-
-static void sub_80FE6F0(void)
-{
- if (gUnknown_3005E10.unk_04 == 15 && gRfuSlotStatusNI[gUnknown_3005E10.unk_10]->send.state == SLOT_STATE_SEND_SUCCESS)
- {
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0;
- rfu_clearSlot(TYPE_NI_SEND, gUnknown_3005E10.unk_10);
- gUnknown_3005E10.unk_24 &= ~(1 << gUnknown_3005E10.unk_10);
- gUnknown_3005E10.unk_28[gUnknown_3005E10.unk_10] = 0;
- sub_80FE7F0(0x24, 0x00);
- }
-}
-
-static void sub_80FE74C(void)
-{
- if (gUnknown_3005E10.unk_06 == 0 && gUnknown_3005E10.unk_0a == 1)
- {
- gUnknown_3005E10.unk_11 = gUnknown_3005E10.unk_04;
- gUnknown_3005E10.unk_12 = gUnknown_3005E10.unk_05;
- gUnknown_3005E10.unk_04 = 16;
- gUnknown_3005E10.unk_05 = 17;
- gUnknown_3005E10.unk_0a = 2;
- }
-}
-
-static u8 sub_80FE778(void)
-{
- u8 i;
- const u16 *ptr;
- u8 flags = 0x00;
-
- for (i = 0; i < gRfuLinkStatus->findParentCount; i++)
- {
- for (ptr = gUnknown_3005E10.unk_20; *ptr != 0xFFFF; ptr++)
- {
- if (gRfuLinkStatus->partner[i].serialNo == *ptr)
- {
- flags |= (1 << i);
- }
- }
- }
- return flags;
-}
-
-static void sub_80FE7F0(u8 a0, u8 a1)
-{
- if (gUnknown_3005E10.unk_40 != NULL)
- {
- gUnknown_3005E10.unk_40(a0, a1);
- }
- gUnknown_3005E10.unk_14 = gUnknown_3005E10.unk_16 = 0;
-}
-
-static void sub_80FE818(u8 a0)
-{
- u8 unk_0e_bak = gUnknown_3005E10.unk_0e;
- gUnknown_3005E10.unk_0e = 1;
- rfu_REQ_disconnect(a0);
- rfu_waitREQComplete();
- gUnknown_3005E10.unk_0e = unk_0e_bak;
-}
-
-static void sub_80FE83C(u8 a0)
-{
- u8 i;
-
- if (gRfuLinkStatus->sendSlotNIFlag)
- {
- for (i = 0; i < RFU_CHILD_MAX; i++)
- {
- if (gRfuSlotStatusNI[i]->send.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->send.bmSlot & a0)
- {
- rfu_changeSendTarget(TYPE_NI, i, gRfuSlotStatusNI[i]->send.bmSlot & ~a0);
- }
- }
- }
- if (gRfuLinkStatus->recvSlotNIFlag)
- {
- for (i = 0; i < RFU_CHILD_MAX; i++)
- {
- if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->recv.bmSlot & a0)
- {
- rfu_NI_stopReceivingData(i);
- }
- }
- }
- if (gRfuLinkStatus->sendSlotUNIFlag)
- {
- gRfuLinkStatus->sendSlotUNIFlag &= ~a0;
- for (i = 0; i < RFU_CHILD_MAX; i++)
- {
- if (gRfuSlotStatusUNI[i]->send.state == SLOT_STATE_SEND_UNI && a0 & gRfuSlotStatusUNI[i]->send.bmSlot)
- {
- gRfuSlotStatusUNI[i]->send.bmSlot &= ~a0;
- }
- }
- }
-}
-
-static void sub_80FE918(void)
-{
- u8 i;
- u8 j;
- u8 flags;
-
- if (gUnknown_3005E10.unk_18)
- {
- if (gRfuLinkStatus->sendSlotNIFlag)
- {
- for (i = 0; i < RFU_CHILD_MAX; i++)
- {
- if (gRfuSlotStatusNI[i]->send.state & SLOT_BUSY_FLAG)
- {
- flags = 0;
- for (j = 0; j < RFU_CHILD_MAX; j++)
- {
- if ((gRfuSlotStatusNI[i]->send.bmSlot >> j) & 1 && gRfuSlotStatusNI[j]->send.failCounter > gUnknown_3005E10.unk_18)
- {
- flags |= (1 << j);
- }
- if (flags)
- {
- rfu_changeSendTarget(TYPE_NI, i, flags ^ gRfuSlotStatusNI[i]->send.bmSlot);
- }
- }
- }
- }
- }
- if (gRfuLinkStatus->recvSlotNIFlag)
- {
- for (i = 0; i < RFU_CHILD_MAX; i++)
- {
- if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->recv.failCounter > gUnknown_3005E10.unk_18)
- {
- rfu_NI_stopReceivingData(i);
- }
- }
- }
- }
-}
-
-void sub_80FEA10(void (*func)(u16))
-{
- gUnknown_3005E10.unk_44 = func;
- rfu_setMSCCallback(sub_80FE394);
-}
-
-static void sub_80FEA28(void (*func)(u8, u8))
-{
- gUnknown_3005E10.unk_40 = func;
-}
-
-u8 sub_80FEA34(u8 a0, u16 a1)
-{
- u16 imeBak;
- if (gUnknown_3005E10.unk_09 && a0 == 0 && gUnknown_3005E10.unk_30)
- {
- return 5;
- }
- imeBak = REG_IME;
- REG_IME = 0;
- gUnknown_3005E10.unk_09 = a0;
- gUnknown_3005E10.unk_32 = a1;
- REG_IME = imeBak;
- return 0;
-}
-
-static u8 sub_80FEA78(u16 a0)
-{
- if (gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag)
- {
- gUnknown_3005E10.unk_14 = 6;
- sub_80FE7F0(0xf3, 0x01);
- return 6;
- }
- gUnknown_3005E10.unk_18 = a0;
- return 0;
-}
-
-static u8 sub_80FEAB4(u8 a0)
-{
- if (gUnknown_3005E10.unk_04 == 9 || gUnknown_3005E10.unk_04 == 10 || gUnknown_3005E10.unk_04 == 11)
- {
- gUnknown_3005E10.unk_14 = 7;
- sub_80FE7F0(0xf3, 0x01);
- return 7;
- }
- if (a0)
- {
- gUnknown_3005E10.unk_0b = 1;
- }
- else
- {
- gUnknown_3005E10.unk_0b = 0;
- }
- return 0;
-}
-
-static void sub_80FEAF4(void)
-{
- if (gUnknown_3005E10.unk_02)
- {
- gUnknown_3005E10.unk_02 = 0;
- sub_80FE7F0(0x45, 0x00);
- }
-}
-
-void sub_80FEB14(void)
-{
- if (gUnknown_3005E10.unk_02 == 0)
- {
- sub_80FE7F0(0x45, 0x00);
- }
- else if (gUnknown_3005E10.unk_02 == 1)
- {
- gUnknown_3005E10.unk_02 = 2;
- }
-}
-
-void sub_80FEB3C(void)
-{
- if (gUnknown_3005E10.unk_07)
- {
- switch (gUnknown_3005E10.unk_04)
- {
- case 5:
- gUnknown_3005E10.unk_07 = 3;
- gUnknown_3005E10.unk_04 = 9;
- break;
- case 6:
- gUnknown_3005E10.unk_07 = 2;
- gUnknown_3005E10.unk_1a = 1;
- break;
- case 7:
- case 8:
- gUnknown_3005E10.unk_07 = 2;
- break;
- case 9:
- case 10:
- gUnknown_3005E10.unk_1a = 40;
- break;
- case 11:
- gUnknown_3005E10.unk_1a = 40;
- gUnknown_3005E10.unk_04 = 10;
- break;
- }
- }
-}
diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c
index a27948650..2259e9214 100644
--- a/src/link_rfu_2.c
+++ b/src/link_rfu_2.c
@@ -12,67 +12,69 @@
#include "string_util.h"
#include "task.h"
#include "constants/species.h"
+#include "constants/union_room.h"
-struct UnkRfuStruct_8010A14{
- char unk_00[15]; // PokemonSioInfo
- u8 unk_0f;
- u8 unk_10[4];
- struct LinkPlayer unk_14[5];
+struct SioInfo
+{
+ char magic[15]; // PokemonSioInfo
+ u8 playerCount;
+ u8 linkPlayerIdx[RFU_CHILD_MAX];
+ struct LinkPlayer linkPlayers[MAX_RFU_PLAYERS];
u8 fill_a0[0x5c];
};
-static EWRAM_DATA struct UnkLinkRfuStruct_02022B2C sRfuReqConfig = {};
+static EWRAM_DATA struct InitializeParametersTag sRfuReqConfig = {};
static EWRAM_DATA struct UnkLinkRfuStruct_02022B44 gUnknown_203AC08 = {};
-static struct RfuAPIBuffer gRfuAPIBuffer;
-static u8 gUnknown_3001FF8[14];
-static u16 gUnknown_3002008[7];
+static u32 gf_rfu_REQ_api[RFU_API_BUFF_SIZE_RAM / 4];
+static u8 sResendBlock8[14];
+static u16 sResendBlock16[7];
struct GFtgtGname gHostRFUtgtGnameBuffer;
-struct UnkRfuStruct_2 Rfu;
+GF_RFU_MANAGER Rfu;
u8 gHostRFUtgtUnameBuffer[PLAYER_NAME_LENGTH + 1];
static void sub_80F8AA4(void);
static void sub_80F8AEC(void);
-static void sub_80F8D20(u16 a0);
-static void sub_80F8DA8(u16 a0);
+static void MscCallback_Child(u16 a0);
+static void MSCCallback_SetUnkCDB(u16 a0);
static void sub_80F906C(void);
-static void sub_80F9868(u8 unused);
-static void sub_80F9CB4(struct UnkRfuStruct_2_Sub_6c *data);
-static void sub_80F9D04(u16 command);
-static void rfufunc_80F9F44(void);
-static void sub_80F9FA8(void);
-static void rfufunc_80FA020(void);
+static void RfuHandleReceiveCommand(u8 unused);
+static void ResetSendDataManager(struct RfuBlockSend *data);
+static void RfuPrepareSendBuffer(u16 command);
+static void RfuFunc_HandleBlockSend(void);
+static void RfuFunc_SendNextBlock(void);
+static void RfuFunc_SendLastBlock(void);
static void CallRfuFunc(void);
static void sub_80FA738(void);
static int sub_80FA788(void);
static void sub_80FA834(u8 taskId);
static void sub_80FA9D0(u16 a0);
-static void sub_80FAA58(void * a0);
-static void sub_80FAA94(u8 taskId);
+static void ValidateAndReceivePokemonSioInfo(void * a0);
+static void Task_ExchangeLinkPlayers(u8 taskId);
static void sub_80FACF0(u8 taskId);
-static void sub_80FB0E8(u32 a0);
-static void sub_80FB564(s32 a0);
+static void GetLinkmanErrorParams(u32 msg);
+static void sub_80FB564(s32 bmConnectedFlag);
static void sub_80FBB74(void);
-static u8 sub_80FBC70(const u8 *a0, u16 a1);
-static void sub_80FBCF8(u32 a0);
+static u8 GetPartnerIndexByNameAndTrainerID(const u8 *trainerName, u16 trainerId);
+static void RfuReqDisconnectSlot(u32 bmDisconnectSlot);
static void sub_80FBE20(u32 a0, u32 a1);
static void sub_80FC028(u8 taskId);
-static void sub_80FC208(void);
-static void nullsub_89(u8 taskId);
+static void rfu_dbg_clear(void);
+static void Task_idle(u8 taskId);
-static const struct UnkLinkRfuStruct_02022B2C sRfuReqConfigTemplate = {
+static const struct InitializeParametersTag sRfuReqConfigTemplate = {
.maxMFrame = 4,
- .mcTimer = 32,
- .availSlotFlag = 0,
- .mbootFlag = 0,
+ .MC_TimerCount = 32,
+ .availSlot_flag = 0,
+ .mboot_flag = 0,
.serialNo = 0x0002,
- .gname = &gHostRFUtgtGnameBuffer,
- .uname = gHostRFUtgtUnameBuffer,
- .unk_10 = 0x01,
- .unk_11 = 0x00,
- .unk_12 = 0x0258,
- .unk_14 = 0x012c
+ .gameName = (void *)&gHostRFUtgtGnameBuffer,
+ .userName = gHostRFUtgtUnameBuffer,
+ .fastSearchParent_flag = TRUE,
+ .linkRecovery_enable = FALSE,
+ .linkRecovery_period = 600,
+ .NI_failCounter_limit = 300
};
static const u8 sAvailSlots[] = {
@@ -82,7 +84,7 @@ static const u8 sAvailSlots[] = {
[4] = AVAIL_SLOT4
};
-static const u32 gUnknown_843EBD4[] = {
+static const u32 sAllBlocksReceived[] = {
0x000000,
0x000001,
0x000003,
@@ -138,8 +140,10 @@ static const struct {
{ gBlockSendBuffer, 40 }
};
-static const u16 gUnknown_843EC8C[] = {
- 0x0002, 0x7f7d, 0xFFFF
+static const u16 sAcceptedSerialNos[] = {
+ 0x0002, // Pokemon FR/LG/EM
+ 0x7f7d,
+ 0xFFFF
};
static const char sUnref_843EC92[][15] = {
@@ -166,38 +170,38 @@ static const char sUnref_843ED37[][16] = {
static const TaskFunc gUnknown_843ED88[] = {
sub_80FA834,
- sub_80FAA94,
+ Task_ExchangeLinkPlayers,
sub_80FACF0
};
-static void nullsub_87(const void *unused_0, u8 unused_1, u8 unused_2)
+static void rfu_dbg_print_str(const void *string, u8 x, u8 y)
{
// debug?
}
-static void nullsub_88(u16 unused_0, u8 unused_1, u8 unused_2, u8 unused_3)
+static void rfu_dbg_print_num(u16 num, u8 x, u8 y, u8 ndigits)
{
}
-void sub_80F85F8(void)
+void ResetLinkRfuGFLayer(void)
{
s32 i;
- u8 unk_ee_bak = Rfu.unk_ee;
+ u8 errorState_bak = Rfu.errorState;
CpuFill16(0, &Rfu, sizeof Rfu);
- Rfu.unk_0c = 0xFF;
- Rfu.unk_ee = unk_ee_bak;
- if (Rfu.unk_ee != 4)
+ Rfu.parent_child = MODE_NEUTRAL;
+ Rfu.errorState = errorState_bak;
+ if (Rfu.errorState != 4)
{
- Rfu.unk_ee = 0;
+ Rfu.errorState = 0;
}
for (i = 0; i < 5; i++)
{
- sub_80F9CB4(Rfu.unk_80 + i);
+ ResetSendDataManager(Rfu.cmd_8800_recvbuf + i);
}
- sub_80F9CB4(&Rfu.unk_6c);
- sub_80FC478(&Rfu.unk_124);
- sub_80FC4D4(&Rfu.unk_9e8);
+ ResetSendDataManager(&Rfu.cmd_8800_sendbuf);
+ RFU_queue_20_70_reset(&Rfu.unk_124);
+ RFU_queue_40_14_reset(&Rfu.unk_9e8);
CpuFill16(0, gSendCmd, sizeof gSendCmd);
CpuFill16(0, gRecvCmds, sizeof gRecvCmds);
CpuFill16(0, gLinkPlayers, sizeof gLinkPlayers);
@@ -218,46 +222,46 @@ void InitRFU(void)
void sub_80F86F4(void)
{
- if (!rfu_initializeAPI(&gRfuAPIBuffer, sizeof gRfuAPIBuffer, gIntrTable + 1, TRUE))
+ if (!rfu_initializeAPI(gf_rfu_REQ_api, RFU_API_BUFF_SIZE_RAM, gIntrTable + 1, TRUE))
{
gLinkType = 0;
sub_80FB128(FALSE);
- sub_80F85F8();
+ ResetLinkRfuGFLayer();
rfu_setTimerInterrupt(3, gIntrTable + 2);
}
}
-static void sub_80F8738(u8 taskId)
+static void Task_LinkLeaderSearchForChildren(u8 taskId)
{
sub_80FA738();
- switch (Rfu.unk_04)
+ switch (Rfu.state)
{
case 0:
- sub_80FD4B0(&sRfuReqConfig);
- Rfu.unk_04 = 1;
+ rfu_LMAN_initializeRFU(&sRfuReqConfig);
+ Rfu.state = 1;
gTasks[taskId].data[1] = 1;
break;
case 1:
break;
case 2:
- sub_80FD538(Rfu.unk_0c, 0, 240, gUnknown_843EC8C);
- Rfu.unk_04 = 3;
+ rfu_LMAN_establishConnection(Rfu.parent_child, 0, 240, (u16*)sAcceptedSerialNos);
+ Rfu.state = 3;
gTasks[taskId].data[1] = 6;
break;
case 3:
break;
case 4:
- sub_80FD760(FALSE);
- Rfu.unk_04 = 5;
+ rfu_LMAN_stopManager(0);
+ Rfu.state = 5;
break;
case 5:
break;
case 18:
Rfu.unk_cdb = 0;
- sub_80FEA10(sub_80F8DA8);
+ rfu_LMAN_setMSCCallback(MSCCallback_SetUnkCDB);
sub_80F8AA4();
sub_80F8AEC();
- Rfu.unk_04 = 20;
+ Rfu.state = 20;
gTasks[taskId].data[1] = 8;
CreateTask(sub_80FA834, 5);
DestroyTask(taskId);
@@ -282,7 +286,7 @@ static void sub_80F887C(s32 r2, s32 r5)
{
if (r2 & 1)
{
- Rfu.unk_cde[i] = r4;
+ Rfu.linkPlayerIdx[i] = r4;
r4++;
}
}
@@ -293,12 +297,12 @@ static void sub_80F887C(s32 r2, s32 r5)
{
if (!(r1 & 1))
{
- Rfu.unk_cde[i] = 0;
+ Rfu.linkPlayerIdx[i] = 0;
}
}
for (r4 = 4; r4 != 0; r4--)
{
- for (i = 0; i < RFU_CHILD_MAX && Rfu.unk_cde[i] != r4; i++);
+ for (i = 0; i < RFU_CHILD_MAX && Rfu.linkPlayerIdx[i] != r4; i++);
if (i == 4)
{
r6 = r4;
@@ -308,26 +312,26 @@ static void sub_80F887C(s32 r2, s32 r5)
{
if (r5 & 1)
{
- Rfu.unk_cde[i] = r6++;
+ Rfu.linkPlayerIdx[i] = r6++;
}
}
}
}
-static void sub_80F893C(u8 taskId)
+static void Task_JoinGroupSearchForParent(u8 taskId)
{
- switch (Rfu.unk_04)
+ switch (Rfu.state)
{
case 0:
- sub_80FD4B0(&sRfuReqConfigTemplate);
- Rfu.unk_04 = 1;
+ rfu_LMAN_initializeRFU((INIT_PARAM*)&sRfuReqConfigTemplate);
+ Rfu.state = 1;
gTasks[taskId].data[1] = 1;
break;
case 1:
break;
case 6:
- sub_80FD538(Rfu.unk_0c, 0, 0xf0, gUnknown_843EC8C);
- Rfu.unk_04 = 7;
+ rfu_LMAN_establishConnection(Rfu.parent_child, 0, 240, (u16*)sAcceptedSerialNos);
+ Rfu.state = 7;
gTasks[taskId].data[1] = 7;
break;
case 7:
@@ -339,11 +343,11 @@ static void sub_80F893C(u8 taskId)
switch (sub_80FA788())
{
case 5:
- Rfu.unk_04 = 12;
+ Rfu.state = 12;
break;
case 6:
case 9:
- sub_80FEB14();
+ rfu_LMAN_requestChangeAgbClockMaster();
Rfu.unk_ce4 = 2;
DestroyTask(taskId);
break;
@@ -351,15 +355,15 @@ static void sub_80F893C(u8 taskId)
break;
case 12:
{
- u8 r5 = 1 << Rfu.unk_c3e;
- rfu_clearSlot(TYPE_NI_SEND | TYPE_NI_RECV, Rfu.unk_c3e);
- rfu_setRecvBuffer(TYPE_UNI, Rfu.unk_c3e, Rfu.unk_c3f, sizeof(Rfu.unk_c3f));
- rfu_UNI_setSendData(r5, Rfu.unk_4c, sizeof(Rfu.unk_4c));
+ u8 bmChildSlot = 1 << Rfu.child_slot;
+ rfu_clearSlot(TYPE_NI_SEND | TYPE_NI_RECV, Rfu.child_slot);
+ rfu_setRecvBuffer(TYPE_UNI, Rfu.child_slot, Rfu.unk_c3f, sizeof(Rfu.unk_c3f));
+ rfu_UNI_setSendData(bmChildSlot, Rfu.unk_4c, sizeof(Rfu.unk_4c));
gTasks[taskId].data[1] = 8;
DestroyTask(taskId);
if (gUnknown_203AC08.unk_0f == 0)
{
- sub_80FC208();
+ rfu_dbg_clear();
gUnknown_203AC08.unk_0f++;
}
CreateTask(sub_80FA834, 5);
@@ -371,56 +375,56 @@ static void sub_80F893C(u8 taskId)
static void sub_80F8AA4(void)
{
u8 i;
- u8 r5 = gUnknown_3005E10.unk_00;
+ u8 acceptSlot = lman.acceptSlot_flag;
for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (r5 & 1)
+ if (acceptSlot & 1)
{
rfu_setRecvBuffer(TYPE_UNI, i, Rfu.unk_14[i], sizeof(Rfu.unk_14[i]));
rfu_clearSlot(TYPE_UNI_SEND | TYPE_UNI_RECV, i);
}
- r5 >>= 1;
+ acceptSlot >>= 1;
}
}
static void sub_80F8AEC(void)
{
- u8 r5 = gUnknown_3005E10.unk_00;
- rfu_UNI_setSendData(r5, Rfu.unk_c87, sizeof(Rfu.unk_c87));
- Rfu.unk_cda = sub_80F886C(r5);
- Rfu.unk_ce2 = r5;
- sub_80F887C(r5, -1);
- Rfu.unk_0c = 1;
+ u8 acceptSlot = lman.acceptSlot_flag;
+ rfu_UNI_setSendData(acceptSlot, Rfu.recvCmds, sizeof(Rfu.recvCmds));
+ Rfu.unk_cda = sub_80F886C(acceptSlot);
+ Rfu.bm_PartnerFlags = acceptSlot;
+ sub_80F887C(acceptSlot, -1);
+ Rfu.parent_child = MODE_PARENT;
}
-static void sub_80F8B34(u8 taskId)
+static void Task_LinkRfu_UnionRoomListen(u8 taskId)
{
- if (sub_80F9800()->unk_0a_0 == 0x54 && sub_80FB9F4() == 4)
+ if (GetHostRFUtgtGname()->activity == (ACTIVITY_PLYRTALK | IN_UNION_ROOM) && RfuGetErrorStatus() == 4)
{
- rfu_REQ_disconnect(gUnknown_3005E10.unk_00);
+ rfu_REQ_disconnect(lman.acceptSlot_flag);
rfu_waitREQComplete();
- sub_80FB9E4(0, 0);
+ RfuSetErrorStatus(0, 0);
}
- switch (Rfu.unk_04)
+ switch (Rfu.state)
{
case 0:
- sub_80FD4B0(&sRfuReqConfig);
- Rfu.unk_04 = 1;
+ rfu_LMAN_initializeRFU(&sRfuReqConfig);
+ Rfu.state = 1;
gTasks[taskId].data[1] = 1;
break;
case 1:
break;
case 17:
- sub_80FD538(2, 0, 240, gUnknown_843EC8C);
- sub_80FEA10(sub_80F8D20);
- Rfu.unk_04 = 18;
+ rfu_LMAN_establishConnection(2, 0, 240, (u16*)sAcceptedSerialNos);
+ rfu_LMAN_setMSCCallback(MscCallback_Child);
+ Rfu.state = 18;
break;
case 18:
break;
case 13:
- if (rfu_UNI_setSendData(1 << Rfu.unk_c3e, Rfu.unk_4c, sizeof(Rfu.unk_4c)) == 0)
+ if (rfu_UNI_setSendData(1 << Rfu.child_slot, Rfu.unk_4c, sizeof(Rfu.unk_4c)) == 0)
{
- Rfu.unk_0c = 0;
+ Rfu.parent_child = MODE_CHILD;
DestroyTask(taskId);
if (gTasks[taskId].data[7])
{
@@ -433,20 +437,20 @@ static void sub_80F8B34(u8 taskId)
}
break;
case 14:
- sub_80FD760(0);
- Rfu.unk_04 = 15;
+ rfu_LMAN_stopManager(0);
+ Rfu.state = 15;
break;
case 15:
break;
case 16:
Rfu.unk_cdb = 0;
- sub_80FEA10(sub_80F8DA8);
- sub_80FAFE0(1);
+ rfu_LMAN_setMSCCallback(MSCCallback_SetUnkCDB);
+ UpdateGameData_GroupLockedIn(1);
sub_80F8AA4();
sub_80F8AEC();
- Rfu.unk_04 = 20;
+ Rfu.state = 20;
gTasks[taskId].data[1] = 8;
- Rfu.unk_0c = 1;
+ Rfu.parent_child = MODE_PARENT;
CreateTask(sub_80FA834, 5);
Rfu.unk_ce8 = TRUE;
DestroyTask(taskId);
@@ -454,17 +458,17 @@ static void sub_80F8B34(u8 taskId)
}
}
-void sub_80F8CFC(void)
+void LinkRfu_CreateConnectionAsParent(void)
{
- sub_80FD538(1, 0, 240, gUnknown_843EC8C);
+ rfu_LMAN_establishConnection(MODE_PARENT, 0, 240, (u16*)sAcceptedSerialNos);
}
-void sub_80F8D14(void)
+void LinkRfu_StopManagerBeforeEnteringChat(void)
{
- sub_80FD760(FALSE);
+ rfu_LMAN_stopManager(0);
}
-static void sub_80F8D20(u16 unused)
+static void MscCallback_Child(u16 unused)
{
s32 i;
@@ -474,53 +478,53 @@ static void sub_80F8D20(u16 unused)
}
rfu_REQ_recvData();
rfu_waitREQComplete();
- if (gRfuSlotStatusUNI[Rfu.unk_c3e]->recv.newDataFlag)
+ if (gRfuSlotStatusUNI[Rfu.child_slot]->recv.newDataFlag)
{
Rfu.unk_cd0++;
- sub_80FC588(&Rfu.unk_124, Rfu.unk_c3f);
+ RFU_queue_20_70_recv(&Rfu.unk_124, Rfu.unk_c3f);
gUnknown_203AC08.unk_06++;
sub_80F906C();
- rfu_UNI_readySendData(Rfu.unk_c3e);
- rfu_UNI_clearRecvNewDataFlag(Rfu.unk_c3e);
+ rfu_UNI_readySendData(Rfu.child_slot);
+ rfu_UNI_clearRecvNewDataFlag(Rfu.child_slot);
}
- LinkRfu_REQ_SendData_HandleParentRelationship(TRUE);
+ rfu_LMAN_REQ_sendData(TRUE);
}
-static void sub_80F8DA8(u16 unused)
+static void MSCCallback_SetUnkCDB(u16 unused)
{
Rfu.unk_cdb = 1;
}
-void sub_80F8DC0(void)
+void LinkRfu_Shutdown(void)
{
u8 i;
if (gQuestLogState == 2 || gQuestLogState == 3)
return;
- sub_80FD52C();
- if (Rfu.unk_0c == 1)
+ rfu_LMAN_powerDownRFU();
+ if (Rfu.parent_child == MODE_PARENT)
{
- if (FuncIsActiveTask(sub_80F8738) == TRUE)
+ if (FuncIsActiveTask(Task_LinkLeaderSearchForChildren) == TRUE)
{
DestroyTask(Rfu.unk_67);
- sub_80F85F8();
+ ResetLinkRfuGFLayer();
}
}
- else if (Rfu.unk_0c == 0)
+ else if (Rfu.parent_child == MODE_CHILD)
{
- if (FuncIsActiveTask(sub_80F893C) == TRUE)
+ if (FuncIsActiveTask(Task_JoinGroupSearchForParent) == TRUE)
{
DestroyTask(Rfu.unk_67);
- sub_80F85F8();
+ ResetLinkRfuGFLayer();
}
}
- else if (Rfu.unk_0c == 2)
+ else if (Rfu.parent_child == 2)
{
- if (FuncIsActiveTask(sub_80F8B34) == TRUE)
+ if (FuncIsActiveTask(Task_LinkRfu_UnionRoomListen) == TRUE)
{
DestroyTask(Rfu.unk_67);
- sub_80F85F8();
+ ResetLinkRfuGFLayer();
}
}
for (i = 0; i < NELEMS(gUnknown_843ED88); i++)
@@ -532,59 +536,59 @@ void sub_80F8DC0(void)
}
}
-static void sub_80F8E74(void)
+static void CreateTask_LinkLeaderSearchForChildren(void)
{
if (gQuestLogState == 2 || gQuestLogState == 3)
return;
- Rfu.unk_67 = CreateTask(sub_80F8738, 1);
+ Rfu.unk_67 = CreateTask(Task_LinkLeaderSearchForChildren, 1);
}
-static bool8 sub_80F8EA4(void)
+static bool8 RfuStateIs7AndPlayerIsChild(void)
{
- if (Rfu.unk_04 == 7 && Rfu.unk_ccd)
+ if (Rfu.state == 7 && Rfu.parentId)
{
return TRUE;
}
return FALSE;
}
-static bool32 sub_80F8ECC(void)
+static bool32 IsParentSuccessfullyReconnected(void)
{
- if (Rfu.unk_04 == 7 && !sub_80FD610(gRfuLinkStatus->partner[Rfu.unk_c3d].id, 240))
+ if (Rfu.state == 7 && !rfu_LMAN_CHILD_connectParent(gRfuLinkStatus->partner[Rfu.reconnectedParentIdx].id, 240))
{
- Rfu.unk_04 = 9;
+ Rfu.state = 9;
return TRUE;
}
return FALSE;
}
-static void sub_80F8F10(void)
+static void CreateTask_JoinGroupSearchForParent(void)
{
if (gQuestLogState == 2 || gQuestLogState == 3)
return;
- Rfu.unk_67 = CreateTask(sub_80F893C, 1);
+ Rfu.unk_67 = CreateTask(Task_JoinGroupSearchForParent, 1);
}
-bool8 sub_80F8F40(void)
+bool8 LmanAcceptSlotFlagIsNotZero(void)
{
- if (gUnknown_3005E10.unk_00)
+ if (lman.acceptSlot_flag)
{
return TRUE;
}
return FALSE;
}
-void sub_80F8F5C(void)
+void LinkRfu_StopManagerAndFinalizeSlots(void)
{
- Rfu.unk_04 = 4;
- Rfu.unk_ce7 = gUnknown_3005E10.unk_00;
+ Rfu.state = 4;
+ Rfu.acceptSlot_flag = lman.acceptSlot_flag;
}
-bool32 sub_80F8F7C(bool32 a0)
+bool32 WaitRfuState(bool32 force)
{
- if (Rfu.unk_04 == 17 || a0)
+ if (Rfu.state == 17 || force)
{
- Rfu.unk_04 = 18;
+ Rfu.state = 18;
return TRUE;
}
return FALSE;
@@ -592,7 +596,7 @@ bool32 sub_80F8F7C(bool32 a0)
void sub_80F8FA0(void)
{
- Rfu.unk_04 = 14;
+ Rfu.state = 14;
}
static void sub_80F8FAC(u8 a0)
@@ -616,11 +620,11 @@ static void sub_80F8FD4(void)
for (i = 0; i < 5; i++)
{
- struct UnkRfuStruct_2 *ptr = &Rfu;
+ GF_RFU_MANAGER *ptr = &Rfu;
for (j = 0; j < 7; j++)
{
- ptr->unk_c87[i][j][1] = gRecvCmds[i][j] >> 8;
- ptr->unk_c87[i][j][0] = gRecvCmds[i][j];
+ ptr->recvCmds[i][j][1] = gRecvCmds[i][j] >> 8;
+ ptr->recvCmds[i][j][0] = gRecvCmds[i][j];
}
}
CpuFill16(0, gRecvCmds, sizeof gRecvCmds);
@@ -643,8 +647,8 @@ static void sub_80F906C(void)
{
if (Rfu.unk_c3c)
{
- u8 r2 = sub_80FC888(&Rfu.unk_c1c, Rfu.unk_4c);
- if (Rfu.unk_c1c.unk_1e == 0)
+ u8 r2 = RFU_queue_2_14_send(&Rfu.unk_c1c, Rfu.unk_4c);
+ if (Rfu.unk_c1c.count == 0)
{
Rfu.unk_c3c = 0;
}
@@ -655,8 +659,8 @@ static void sub_80F906C(void)
}
if (Rfu.unk_c3c == 0)
{
- sub_80FC79C(&Rfu.unk_9e8, Rfu.unk_4c);
- sub_80FC828(&Rfu.unk_c1c, Rfu.unk_4c);
+ RFU_queue_40_14_send(&Rfu.unk_9e8, Rfu.unk_4c);
+ RFU_queue_2_14_recv(&Rfu.unk_c1c, Rfu.unk_4c);
}
}
@@ -684,39 +688,39 @@ bool32 IsRfuRecvQueueEmpty(void)
static bool32 sub_80F911C(void)
{
- if (Rfu.unk_04 < 20)
+ if (Rfu.state < 20)
{
rfu_REQ_recvData();
rfu_waitREQComplete();
- LinkRfu_REQ_SendData_HandleParentRelationship(FALSE);
+ rfu_LMAN_REQ_sendData(FALSE);
}
else
{
Rfu.unk_cdb = 0;
- if ((Rfu.unk_ce2 & gRfuLinkStatus->connSlotFlag) == Rfu.unk_ce2 && (Rfu.unk_ce2 & gRfuLinkStatus->connSlotFlag))
+ if ((Rfu.bm_PartnerFlags & gRfuLinkStatus->connSlotFlag) == Rfu.bm_PartnerFlags && (Rfu.bm_PartnerFlags & gRfuLinkStatus->connSlotFlag))
{
if (!Rfu.unk_cdc)
{
- if (Rfu.unk_ce3)
+ if (Rfu.bm_DisconnectSlot)
{
- sub_80FBCF8(Rfu.unk_ce3);
- Rfu.unk_ce3 = 0;
+ RfuReqDisconnectSlot(Rfu.bm_DisconnectSlot);
+ Rfu.bm_DisconnectSlot = 0;
if (Rfu.unk_ce4 == 1)
{
- sub_80FB9E4(2, 0x8000);
- sub_80FB0E8(0x8000);
+ RfuSetErrorStatus(2, 0x8000);
+ GetLinkmanErrorParams(0x8000);
return FALSE;
}
- if (!gUnknown_3005E10.unk_00)
+ if (!lman.acceptSlot_flag)
{
- sub_80F8DC0();
+ LinkRfu_Shutdown();
gReceivedRemoteLinkPlayers = 0;
return FALSE;
}
}
sub_80F8FD4();
rfu_UNI_readySendData(Rfu.unk_cda);
- LinkRfu_REQ_SendData_HandleParentRelationship(TRUE);
+ rfu_LMAN_REQ_sendData(TRUE);
}
else
{
@@ -736,23 +740,23 @@ static bool32 sub_80F9204(void)
u16 j;
u8 retval;
- if (Rfu.unk_04 >= 20 && Rfu.unk_0e == 1)
+ if (Rfu.state >= 20 && Rfu.unk_0e == 1)
{
rfu_waitREQComplete();
while (Rfu.unk_cdb == 0)
{
- if (Rfu.unk_ee != 0)
+ if (Rfu.errorState != 0)
{
return FALSE;
}
}
rfu_REQ_recvData();
rfu_waitREQComplete();
- if ((gUnknown_3005E10.unk_03 & Rfu.unk_ce2) == Rfu.unk_ce2)
+ if ((lman.parentAck_flag & Rfu.bm_PartnerFlags) == Rfu.bm_PartnerFlags)
{
Rfu.unk_cdc = 0;
gUnknown_203AC08.unk_06++;
- flags = gUnknown_3005E10.unk_00;
+ flags = lman.acceptSlot_flag;
for (i = 0; i < RFU_CHILD_MAX; i++)
{
if (flags & 1)
@@ -762,14 +766,14 @@ static bool32 sub_80F9204(void)
if (Rfu.unk_cee[i] != 0xFF && (Rfu.unk_14[i][0] >> 5) != ((Rfu.unk_cee[i] + 1) & 7))
{
if (++Rfu.unk_cea[i] > 4)
- sub_80FB0E8(0x8100);
+ GetLinkmanErrorParams(0x8100);
}
else
{
Rfu.unk_cee[i] = Rfu.unk_14[i][0] / 32;
Rfu.unk_cea[i] = 0;
Rfu.unk_14[i][0] &= 0x1f;
- r0 = Rfu.unk_cde[i];
+ r0 = Rfu.linkPlayerIdx[i];
for (j = 0; j < 7; j++)
{
gRecvCmds[r0][j] = (Rfu.unk_14[i][(j << 1) + 1] << 8) | Rfu.unk_14[i][(j << 1) + 0];
@@ -783,7 +787,7 @@ static bool32 sub_80F9204(void)
flags >>= 1;
}
sub_80F9038();
- sub_80F9868(0);
+ RfuHandleReceiveCommand(0);
CallRfuFunc();
if (Rfu.unk_ce5 && !Rfu.unk_cd9)
{
@@ -796,13 +800,13 @@ static bool32 sub_80F9204(void)
rfu_setRecvBuffer(TYPE_UNI, i, Rfu.unk_14[i], sizeof(Rfu.unk_14[i]));
}
}
- sub_80F887C(Rfu.unk_ce2, Rfu.unk_ce2 | Rfu.unk_ce5);
+ sub_80F887C(Rfu.bm_PartnerFlags, Rfu.bm_PartnerFlags | Rfu.unk_ce5);
Rfu.unk_ce9 = Rfu.unk_ce5;
- Rfu.unk_ce2 |= Rfu.unk_ce5;
+ Rfu.bm_PartnerFlags |= Rfu.unk_ce5;
Rfu.unk_ce5 = 0;
- rfu_UNI_setSendData(Rfu.unk_ce2, Rfu.unk_c87, sizeof(Rfu.unk_c87));
- Rfu.unk_cda = sub_80F886C(Rfu.unk_ce2);
- CreateTask(sub_80FAA94, 0);
+ rfu_UNI_setSendData(Rfu.bm_PartnerFlags, Rfu.recvCmds, sizeof(Rfu.recvCmds));
+ Rfu.unk_cda = sub_80F886C(Rfu.bm_PartnerFlags);
+ CreateTask(Task_ExchangeLinkPlayers, 0);
}
}
else
@@ -837,7 +841,7 @@ static void sub_80F94BC(u16 *a0, u8 *a1)
}
}
-static bool32 sub_80F9514(void)
+static bool32 RfuProcessEnqueuedRecvBlock(void)
{
u8 i;
u8 j;
@@ -845,7 +849,7 @@ static bool32 sub_80F9514(void)
u8 sp48[2 * (CMD_LENGTH - 1)];
u8 switchval;
- sub_80FC6E8(&Rfu.unk_124, sp00);
+ RFU_queue_20_70_send(&Rfu.unk_124, sp00);
for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
for (j = 0; j < CMD_LENGTH - 1; j++)
@@ -853,23 +857,23 @@ static bool32 sub_80F9514(void)
gRecvCmds[i][j] = (sp00[i * 14 + (j << 1) + 1] << 8) | sp00[i * 14 + (j << 1) + 0];
}
}
- sub_80F9868(0);
- if (gUnknown_3005E10.unk_02 == 0 && Rfu.unk_ce4)
+ RfuHandleReceiveCommand(0);
+ if (lman.childClockSlave_flag == 0 && Rfu.unk_ce4)
{
rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag);
rfu_waitREQComplete();
- switchval = sub_80FB9F4();
+ switchval = RfuGetErrorStatus();
if (switchval != 1 && switchval != 6 && switchval != 9)
- sub_80FB9E4(2, 0x9000);
+ RfuSetErrorStatus(2, 0x9000);
rfu_clearAllSlot();
gReceivedRemoteLinkPlayers = FALSE;
Rfu.RfuFunc = NULL;
if (Rfu.unk_ce4 == 1)
{
- sub_80FB9E4(2, 0x9000);
- sub_80FB0E8(0x9000);
+ RfuSetErrorStatus(2, 0x9000);
+ GetLinkmanErrorParams(0x9000);
}
- gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0;
+ lman.state = lman.next_state = 0;
Rfu.unk_ce4 = 0;
}
if (Rfu.unk_cd0)
@@ -877,36 +881,36 @@ static bool32 sub_80F9514(void)
Rfu.unk_cd0--;
CallRfuFunc();
sub_80F94BC(gSendCmd, sp48);
- sub_80FC63C(&Rfu.unk_9e8, sp48);
+ RFU_queue_40_14_recv(&Rfu.unk_9e8, sp48);
for (i = 0; i < CMD_LENGTH - 1; i++)
gSendCmd[i] = 0;
}
return IsRfuRecvQueueEmpty();
}
-static void sub_80F965C(u8 unused, u32 flags)
+static void HandleSendFailure(u8 unused, u32 flags)
{
s32 i, j;
- const u8 *r10 = Rfu.unk_6c.unk_04;
- for (i = 0; i < Rfu.unk_6c.unk_02; i++)
+ const u8 *r10 = Rfu.cmd_8800_sendbuf.payload;
+ for (i = 0; i < Rfu.cmd_8800_sendbuf.count; i++)
{
if (!(flags & 1))
{
- gUnknown_3002008[0] = (~0x76ff) | i;
+ sResendBlock16[0] = RFU_COMMAND_0x8900 | i;
for (j = 0; j < 7; j++)
{
- gUnknown_3002008[j + 1] = (r10[12 * i + (j << 1) + 1] << 8) | r10[12 * i + (j << 1) + 0];
+ sResendBlock16[j + 1] = (r10[12 * i + (j << 1) + 1] << 8) | r10[12 * i + (j << 1) + 0];
}
for (j = 0; j < 7; j++)
{
- gUnknown_3001FF8[2 * j + 1] = gUnknown_3002008[j] >> 8;
- gUnknown_3001FF8[2 * j + 0] = gUnknown_3002008[j];
+ sResendBlock8[2 * j + 1] = sResendBlock16[j] >> 8;
+ sResendBlock8[2 * j + 0] = sResendBlock16[j];
j++;j--; // Needed to match;
}
- sub_80FC63C(&Rfu.unk_9e8, gUnknown_3001FF8);
- Rfu.unk_6c.unk_0c |= (1 << i);
+ RFU_queue_40_14_recv(&Rfu.unk_9e8, sResendBlock8);
+ Rfu.cmd_8800_sendbuf.failedFlags |= (1 << i);
}
flags >>= 1;
}
@@ -914,7 +918,7 @@ static void sub_80F965C(u8 unused, u32 flags)
void Rfu_SetBlockReceivedFlag(u8 a0)
{
- if (Rfu.unk_0c == 1 && a0)
+ if (Rfu.parent_child == MODE_PARENT && a0)
Rfu.unk_61[a0] = 1;
else
Rfu.unk_5c[a0] = 1;
@@ -923,23 +927,23 @@ void Rfu_SetBlockReceivedFlag(u8 a0)
void Rfu_ResetBlockReceivedFlag(u8 a0)
{
Rfu.unk_5c[a0] = 0;
- Rfu.unk_80[a0].unk_12 = 0;
+ Rfu.cmd_8800_recvbuf[a0].receiving = 0;
}
static u8 sub_80F9770(const u8 *a0)
{
u8 i;
- if (Rfu.unk_0c == 1)
+ if (Rfu.parent_child == MODE_PARENT)
return FALSE;
for (i = 0; i < RFU_CHILD_MAX; i++)
{
- Rfu.unk_cde[i] = a0[i];
+ Rfu.linkPlayerIdx[i] = a0[i];
}
- return a0[Rfu.unk_c3e];
+ return a0[Rfu.child_slot];
}
-static void rfu_func_080F97B8(void)
+static void RfuFunc_SendKeysToRfu(void)
{
static u8 gUnknown_3001188;
if (gReceivedRemoteLinkPlayers
@@ -948,24 +952,24 @@ static void rfu_func_080F97B8(void)
{
gUnknown_3001188++;
gHeldKeyCodeToSend |= (gUnknown_3001188 << 8);
- sub_80F9D04(0xbe00);
+ RfuPrepareSendBuffer(RFU_COMMAND_0xbe00);
}
}
-struct GFtgtGname *sub_80F9800(void)
+struct GFtgtGname *GetHostRFUtgtGname(void)
{
return &gHostRFUtgtGnameBuffer;
}
bool32 IsSendingKeysToRfu(void)
{
- return Rfu.RfuFunc == rfu_func_080F97B8;
+ return Rfu.RfuFunc == RfuFunc_SendKeysToRfu;
}
-void sub_80F9828(void)
+void StartSendingKeysToRfu(void)
{
AGB_ASSERT_EX(Rfu.RfuFunc == NULL, ABSPATH("rfu.c"), 1473);
- Rfu.RfuFunc = rfu_func_080F97B8;
+ Rfu.RfuFunc = RfuFunc_SendKeysToRfu;
}
void Rfu_set_zero(void)
@@ -973,7 +977,7 @@ void Rfu_set_zero(void)
Rfu.RfuFunc = NULL;
}
-static void sub_80F9868(u8 unused)
+static void RfuHandleReceiveCommand(u8 unused)
{
u16 i;
u16 j;
@@ -982,63 +986,63 @@ static void sub_80F9868(u8 unused)
{
switch (gRecvCmds[i][0] & 0xff00)
{
- case 0x7800:
- if (Rfu.unk_0c == 0 && gReceivedRemoteLinkPlayers != 0)
+ case RFU_COMMAND_0x7800:
+ if (Rfu.parent_child == MODE_CHILD && gReceivedRemoteLinkPlayers != 0)
return;
// fallthrough
- case 0x7700:
+ case RFU_COMMAND_0x7700:
if (gRfuLinkStatus->parentChild == MODE_CHILD)
{
Rfu.playerCount = gRecvCmds[i][1];
Rfu.unk_cce = sub_80F9770((u8 *)(gRecvCmds[i] + 2));
}
break;
- case 0x8800:
- if (Rfu.unk_80[i].unk_12 == 0)
+ case RFU_COMMAND_0x8800:
+ if (Rfu.cmd_8800_recvbuf[i].receiving == 0)
{
- Rfu.unk_80[i].unk_00 = 0;
- Rfu.unk_80[i].unk_02 = gRecvCmds[i][1];
- Rfu.unk_80[i].unk_11 = gRecvCmds[i][2];
- Rfu.unk_80[i].unk_08 = 0;
- Rfu.unk_80[i].unk_12 = 1;
+ Rfu.cmd_8800_recvbuf[i].next = 0;
+ Rfu.cmd_8800_recvbuf[i].count = gRecvCmds[i][1];
+ Rfu.cmd_8800_recvbuf[i].owner = gRecvCmds[i][2];
+ Rfu.cmd_8800_recvbuf[i].receivedFlags = 0;
+ Rfu.cmd_8800_recvbuf[i].receiving = 1;
Rfu.unk_5c[i] = 0;
}
break;
- case 0x8900:
- if (Rfu.unk_80[i].unk_12 == 1)
+ case RFU_COMMAND_0x8900:
+ if (Rfu.cmd_8800_recvbuf[i].receiving == 1)
{
- Rfu.unk_80[i].unk_00 = gRecvCmds[i][0] & 0xff;
- Rfu.unk_80[i].unk_08 |= (1 << Rfu.unk_80[i].unk_00);
+ Rfu.cmd_8800_recvbuf[i].next = gRecvCmds[i][0] & 0xff;
+ Rfu.cmd_8800_recvbuf[i].receivedFlags |= (1 << Rfu.cmd_8800_recvbuf[i].next);
for (j = 0; j < 6; j++)
- gBlockRecvBuffer[i][Rfu.unk_80[i].unk_00 * 6 + j] = gRecvCmds[i][j + 1];
- if (Rfu.unk_80[i].unk_08 == gUnknown_843EBD4[Rfu.unk_80[i].unk_02])
+ gBlockRecvBuffer[i][Rfu.cmd_8800_recvbuf[i].next * 6 + j] = gRecvCmds[i][j + 1];
+ if (Rfu.cmd_8800_recvbuf[i].receivedFlags == sAllBlocksReceived[Rfu.cmd_8800_recvbuf[i].count])
{
- Rfu.unk_80[i].unk_12 = 2;
+ Rfu.cmd_8800_recvbuf[i].receiving = 2;
Rfu_SetBlockReceivedFlag(i);
- if (sub_80F9800()->unk_0a_0 == 0x45 && gReceivedRemoteLinkPlayers != 0 && Rfu.unk_0c == 0)
- sub_80FAA58(gBlockRecvBuffer);
+ if (GetHostRFUtgtGname()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM) && gReceivedRemoteLinkPlayers != 0 && Rfu.parent_child == MODE_CHILD)
+ ValidateAndReceivePokemonSioInfo(gBlockRecvBuffer);
}
}
break;
- case 0xa100:
+ case RFU_COMMAND_0xa100:
Rfu_InitBlockSend(gUnknown_843EC64[gRecvCmds[i][1]].buffer, (u16)gUnknown_843EC64[gRecvCmds[i][1]].size);
break;
- case 0x5f00:
- Rfu.unk_e4[i] = 1;
+ case RFU_COMMAND_0x5f00:
+ Rfu.cmd5f00Ack[i] = 1;
break;
- case 0x6600:
- if (Rfu.unk_100 == gRecvCmds[i][1])
- Rfu.unk_e9[i] = 1;
+ case RFU_COMMAND_0x6600:
+ if (Rfu.cmd_6600_count == gRecvCmds[i][1])
+ Rfu.cmd_6600_recvd[i] = 1;
break;
- case 0xed00:
- if (Rfu.unk_0c == 0)
+ case RFU_COMMAND_0xed00:
+ if (Rfu.parent_child == MODE_CHILD)
{
if (gReceivedRemoteLinkPlayers != 0)
{
if (gRecvCmds[i][1] & gRfuLinkStatus->connSlotFlag)
{
gReceivedRemoteLinkPlayers = 0;
- sub_80FEB14();
+ rfu_LMAN_requestChangeAgbClockMaster();
Rfu.unk_ce4 = gRecvCmds[i][2];
}
Rfu.playerCount = gRecvCmds[i][3];
@@ -1047,25 +1051,25 @@ static void sub_80F9868(u8 unused)
}
else
{
- sub_80F9D04(0xee00);
+ RfuPrepareSendBuffer(RFU_COMMAND_0xee00);
gSendCmd[1] = gRecvCmds[i][1];
gSendCmd[2] = gRecvCmds[i][2];
gSendCmd[3] = gRecvCmds[i][3];
}
break;
- case 0xee00:
- if (Rfu.unk_0c == 1)
+ case RFU_COMMAND_0xee00:
+ if (Rfu.parent_child == MODE_PARENT)
{
- Rfu.unk_ce3 |= gRecvCmds[i][1];
+ Rfu.bm_DisconnectSlot |= gRecvCmds[i][1];
Rfu.unk_ce4 = gRecvCmds[i][2];
sub_80FA9D0(gRecvCmds[i][1]);
}
break;
- case 0xbe00:
+ case RFU_COMMAND_0xbe00:
gLinkPartnersHeldKeys[i] = gRecvCmds[i][1];
break;
}
- if (Rfu.unk_0c == 1 && Rfu.unk_61[i])
+ if (Rfu.parent_child == MODE_PARENT && Rfu.unk_61[i])
{
if (Rfu.unk_61[i] == 4)
{
@@ -1078,13 +1082,13 @@ static void sub_80F9868(u8 unused)
}
}
-static bool8 sub_80F9C50(void)
+static bool8 Cmd8000recvIsFinished(void)
{
s32 i;
for (i = 0; i < 5; i++)
{
- if (Rfu.unk_80[i].unk_12)
+ if (Rfu.cmd_8800_recvbuf[i].receiving)
return FALSE;
}
return TRUE;
@@ -1096,21 +1100,21 @@ static bool8 sub_80F9C78(void)
for (i = 0; i < Rfu.playerCount; i++)
{
- if (Rfu.unk_80[i].unk_12 != 2 || Rfu.unk_5c[i] != 1)
+ if (Rfu.cmd_8800_recvbuf[i].receiving != 2 || Rfu.unk_5c[i] != 1)
return FALSE;
}
return TRUE;
}
-static void sub_80F9CB4(struct UnkRfuStruct_2_Sub_6c *data)
+static void ResetSendDataManager(struct RfuBlockSend *data)
{
- data->unk_00 = 0;
- data->unk_02 = 0;
- data->unk_04 = NULL;
- data->unk_08 = 0;
- data->unk_10 = 0;
- data->unk_11 = 0;
- data->unk_12 = 0;
+ data->next = 0;
+ data->count = 0;
+ data->payload = NULL;
+ data->receivedFlags = 0;
+ data->sending = 0;
+ data->owner = 0;
+ data->receiving = 0;
}
u8 Rfu_GetBlockReceivedStatus(void)
@@ -1120,7 +1124,7 @@ u8 Rfu_GetBlockReceivedStatus(void)
for (i = 0; i < 5; i++)
{
- if (Rfu.unk_80[i].unk_12 == 2 && Rfu.unk_5c[i] == 1)
+ if (Rfu.cmd_8800_recvbuf[i].receiving == 2 && Rfu.unk_5c[i] == 1)
{
flags |= (1 << i);
}
@@ -1128,7 +1132,7 @@ u8 Rfu_GetBlockReceivedStatus(void)
return flags;
}
-static void sub_80F9D04(u16 command)
+static void RfuPrepareSendBuffer(u16 command)
{
u8 i;
u8 *buff;
@@ -1137,47 +1141,47 @@ static void sub_80F9D04(u16 command)
gSendCmd[0] = command;
switch (command)
{
- case 0x8800:
- gSendCmd[1] = Rfu.unk_6c.unk_02;
- gSendCmd[2] = Rfu.unk_6c.unk_11 + 0x80;
+ case RFU_COMMAND_0x8800:
+ gSendCmd[1] = Rfu.cmd_8800_sendbuf.count;
+ gSendCmd[2] = Rfu.cmd_8800_sendbuf.owner + 0x80;
break;
- case 0xa100:
- if (sub_80F9C50())
+ case RFU_COMMAND_0xa100:
+ if (Cmd8000recvIsFinished())
gSendCmd[1] = Rfu.unk_5a;
break;
- case 0x7700:
- case 0x7800:
- tmp = Rfu.unk_ce2 ^ Rfu.unk_ce3;
+ case RFU_COMMAND_0x7700:
+ case RFU_COMMAND_0x7800:
+ tmp = Rfu.bm_PartnerFlags ^ Rfu.bm_DisconnectSlot;
Rfu.playerCount = gUnknown_843EC41[tmp] + 1;
gSendCmd[1] = Rfu.playerCount;
buff = (u8 *)(gSendCmd + 2);
for (i = 0; i < RFU_CHILD_MAX; i++)
- buff[i] = Rfu.unk_cde[i];
+ buff[i] = Rfu.linkPlayerIdx[i];
break;
- case 0x6600:
- case 0x5f00:
- gSendCmd[1] = Rfu.unk_100;
+ case RFU_COMMAND_0x6600:
+ case RFU_COMMAND_0x5f00:
+ gSendCmd[1] = Rfu.cmd_6600_count;
break;
- case 0x2f00:
+ case RFU_COMMAND_0x2f00:
for (i = 0; i < 6; i++)
gSendCmd[1 + i] = Rfu.unk_f2[i];
break;
- case 0xbe00:
+ case RFU_COMMAND_0xbe00:
gSendCmd[1] = gHeldKeyCodeToSend;
break;
- case 0xee00:
+ case RFU_COMMAND_0xee00:
break;
- case 0xed00:
+ case RFU_COMMAND_0xed00:
break;
}
}
-void sub_80F9E2C(void *a0)
+void RfuPrepareSend0x2f00(void * data)
{
- if (gSendCmd[0] == 0 && !sub_80FBA00())
+ if (gSendCmd[0] == 0 && !RfuIsErrorStatus1or2())
{
- memcpy(Rfu.unk_f2, a0, sizeof(Rfu.unk_f2));
- sub_80F9D04(0x2f00);
+ memcpy(Rfu.unk_f2, data, sizeof(Rfu.unk_f2));
+ RfuPrepareSendBuffer(RFU_COMMAND_0x2f00);
}
}
@@ -1189,77 +1193,77 @@ bool32 Rfu_InitBlockSend(const u8 *src, size_t size)
return FALSE;
if (gSendCmd[0] != 0)
return FALSE;
- if (Rfu.unk_6c.unk_10 != 0)
+ if (Rfu.cmd_8800_sendbuf.sending != 0)
{
gUnknown_203AC08.unk_83++;
return FALSE;
}
r4 = (size % 12) != 0;
- Rfu.unk_6c.unk_11 = GetMultiplayerId();
- Rfu.unk_6c.unk_10 = 1;
- Rfu.unk_6c.unk_02 = (size / 12) + r4;
- Rfu.unk_6c.unk_00 = 0;
- if (size > 0x100)
- Rfu.unk_6c.unk_04 = src;
+ Rfu.cmd_8800_sendbuf.owner = GetMultiplayerId();
+ Rfu.cmd_8800_sendbuf.sending = 1;
+ Rfu.cmd_8800_sendbuf.count = (size / 12) + r4;
+ Rfu.cmd_8800_sendbuf.next = 0;
+ if (size > 0x100) // should never be reached
+ Rfu.cmd_8800_sendbuf.payload = src;
else
{
if (src != gBlockSendBuffer)
memcpy(gBlockSendBuffer, src, size);
- Rfu.unk_6c.unk_04 = gBlockSendBuffer;
+ Rfu.cmd_8800_sendbuf.payload = gBlockSendBuffer;
}
- sub_80F9D04(0x8800);
- Rfu.RfuFunc = rfufunc_80F9F44;
+ RfuPrepareSendBuffer(RFU_COMMAND_0x8800);
+ Rfu.RfuFunc = RfuFunc_HandleBlockSend;
Rfu.unk_5b = 0;
return TRUE;
}
-static void rfufunc_80F9F44(void)
+static void RfuFunc_HandleBlockSend(void)
{
if (gSendCmd[0] == 0)
{
- sub_80F9D04(0x8800);
- if (Rfu.unk_0c == 1)
+ RfuPrepareSendBuffer(RFU_COMMAND_0x8800);
+ if (Rfu.parent_child == MODE_PARENT)
{
if (++Rfu.unk_5b > 2)
- Rfu.RfuFunc = sub_80F9FA8;
+ Rfu.RfuFunc = RfuFunc_SendNextBlock;
}
else
{
- if ((gRecvCmds[GetMultiplayerId()][0] & 0xff00) == 0x8800)
- Rfu.RfuFunc = sub_80F9FA8;
+ if ((gRecvCmds[GetMultiplayerId()][0] & 0xff00) == RFU_COMMAND_0x8800)
+ Rfu.RfuFunc = RfuFunc_SendNextBlock;
}
}
}
-static void sub_80F9FA8(void)
+static void RfuFunc_SendNextBlock(void)
{
s32 i;
- const u8 *src = Rfu.unk_6c.unk_04;
- gSendCmd[0] = 0x8900 | Rfu.unk_6c.unk_00;
+ const u8 *src = Rfu.cmd_8800_sendbuf.payload;
+ gSendCmd[0] = RFU_COMMAND_0x8900 | Rfu.cmd_8800_sendbuf.next;
for (i = 0; i < 7; i++)
- gSendCmd[i + 1] = (src[(i << 1) + Rfu.unk_6c.unk_00 * 12 + 1] << 8) | src[(i << 1) + Rfu.unk_6c.unk_00 * 12 + 0];
- Rfu.unk_6c.unk_00++;
- if (Rfu.unk_6c.unk_02 <= Rfu.unk_6c.unk_00)
+ gSendCmd[i + 1] = (src[(i << 1) + Rfu.cmd_8800_sendbuf.next * 12 + 1] << 8) | src[(i << 1) + Rfu.cmd_8800_sendbuf.next * 12 + 0];
+ Rfu.cmd_8800_sendbuf.next++;
+ if (Rfu.cmd_8800_sendbuf.count <= Rfu.cmd_8800_sendbuf.next)
{
- Rfu.unk_6c.unk_10 = 0;
- Rfu.RfuFunc = rfufunc_80FA020;
+ Rfu.cmd_8800_sendbuf.sending = 0;
+ Rfu.RfuFunc = RfuFunc_SendLastBlock;
}
}
-static void rfufunc_80FA020(void)
+static void RfuFunc_SendLastBlock(void)
{
- const u8 *src = Rfu.unk_6c.unk_04;
+ const u8 *src = Rfu.cmd_8800_sendbuf.payload;
u8 mpId = GetMultiplayerId();
s32 i;
- if (Rfu.unk_0c == 0)
+ if (Rfu.parent_child == MODE_CHILD)
{
- gSendCmd[0] = (~0x76ff) | (Rfu.unk_6c.unk_02 - 1);
+ gSendCmd[0] = RFU_COMMAND_0x8900 | (Rfu.cmd_8800_sendbuf.count - 1);
for (i = 0; i < 7; i++)
- gSendCmd[i + 1] = (src[(i << 1) + (Rfu.unk_6c.unk_02 - 1) * 12 + 1] << 8) | src[(i << 1) + (Rfu.unk_6c.unk_02 - 1) * 12 + 0];
- if ((u8)gRecvCmds[mpId][0] == Rfu.unk_6c.unk_02 - 1)
+ gSendCmd[i + 1] = (src[(i << 1) + (Rfu.cmd_8800_sendbuf.count - 1) * 12 + 1] << 8) | src[(i << 1) + (Rfu.cmd_8800_sendbuf.count - 1) * 12 + 0];
+ if ((u8)gRecvCmds[mpId][0] == Rfu.cmd_8800_sendbuf.count - 1)
{
- if (Rfu.unk_80[mpId].unk_08 != gUnknown_843EBD4[Rfu.unk_80[mpId].unk_02])
+ if (Rfu.cmd_8800_recvbuf[mpId].receivedFlags != sAllBlocksReceived[Rfu.cmd_8800_recvbuf[mpId].count])
{
- sub_80F965C(mpId, Rfu.unk_80[mpId].unk_08);
+ HandleSendFailure(mpId, Rfu.cmd_8800_recvbuf[mpId].receivedFlags);
gUnknown_203AC08.unk_64++;
}
else
@@ -1273,45 +1277,45 @@ static void rfufunc_80FA020(void)
bool8 sub_80FA0F8(u8 a0)
{
Rfu.unk_5a = a0;
- sub_80F9D04(0xa100);
+ RfuPrepareSendBuffer(RFU_COMMAND_0xa100);
return TRUE;
}
-static void sub_80FA114(void)
+static void RfuFunc_End5F00_PowerDownRfu(void)
{
rfu_clearAllSlot();
- sub_80FD52C();
+ rfu_LMAN_powerDownRFU();
gReceivedRemoteLinkPlayers = 0;
Rfu.unk_ef = 1;
Rfu.RfuFunc = NULL;
}
-static void sub_80FA140(void)
+static void RfuFunc_End5F00_ParentDisconnect(void)
{
rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag);
rfu_waitREQComplete();
- sub_80FA114();
+ RfuFunc_End5F00_PowerDownRfu();
}
-static void sub_80FA160(void)
+static void RfuFunc_End5F00(void)
{
- if (Rfu.unk_0c == 0)
+ if (Rfu.parent_child == MODE_CHILD)
{
- sub_80FEB14();
+ rfu_LMAN_requestChangeAgbClockMaster();
Rfu.unk_ce4 = 2;
}
else
- Rfu.RfuFunc = sub_80FA140;
+ Rfu.RfuFunc = RfuFunc_End5F00_ParentDisconnect;
}
void LinkRfu_FatalError(void)
{
- sub_80FEB14();
+ rfu_LMAN_requestChangeAgbClockMaster();
Rfu.unk_ce4 = 1;
- Rfu.unk_ce3 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag;
+ Rfu.bm_DisconnectSlot = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag;
}
-static void sub_80FA1C4(void)
+static void RfuFunc_WaitAck5F00(void)
{
s32 i;
u8 playerCount = Rfu.playerCount;
@@ -1319,132 +1323,132 @@ static void sub_80FA1C4(void)
for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
- if (Rfu.unk_e4[i])
+ if (Rfu.cmd5f00Ack[i])
count++;
}
if (count == playerCount)
{
- gBattleTypeFlags &= (u16)~BATTLE_TYPE_20;
- if (Rfu.unk_0c == 0)
+ gBattleTypeFlags &= ~(BATTLE_TYPE_20 | 0xFFFF0000);
+ if (Rfu.parent_child == MODE_CHILD)
{
- Rfu.unk_ee = 3;
- sub_80FA160();
+ Rfu.errorState = 3;
+ RfuFunc_End5F00();
}
else
- Rfu.RfuFunc = sub_80FA160;
+ Rfu.RfuFunc = RfuFunc_End5F00;
}
}
-static void sub_80FA224(void)
+static void RfuFunc_BuildCommand5F00(void)
{
if (gSendCmd[0] == 0 && !Rfu.unk_ce8)
{
- sub_80F9D04(0x5f00);
- Rfu.RfuFunc = sub_80FA1C4;
+ RfuPrepareSendBuffer(RFU_COMMAND_0x5f00);
+ Rfu.RfuFunc = RfuFunc_WaitAck5F00;
}
}
-static void sub_80FA25C(u8 taskId)
+static void Task_WaitRfuFuncAndSetBuildCmd5F00(u8 taskId)
{
if (Rfu.RfuFunc == NULL)
{
Rfu.unk_cd9 = 1;
- Rfu.RfuFunc = sub_80FA224;
+ Rfu.RfuFunc = RfuFunc_BuildCommand5F00;
DestroyTask(taskId);
}
}
-void task_add_05_task_del_08FA224_when_no_RfuFunc(void)
+void Rfu_BeginBuildAndSendCommand5F(void)
{
- if (!FuncIsActiveTask(sub_80FA25C))
- CreateTask(sub_80FA25C, 5);
+ if (!FuncIsActiveTask(Task_WaitRfuFuncAndSetBuildCmd5F00))
+ CreateTask(Task_WaitRfuFuncAndSetBuildCmd5F00, 5);
}
-static void sub_80FA2B0(void)
+static void RfuFunc_Send6600_3(void)
{
u8 playerCount;
u8 i;
- if (GetMultiplayerId() != 0)
+ if (GetMultiplayerId() != 0) // child
{
- if (Rfu.unk_124.unk_8c2 == 0 && Rfu.unk_fe > 0x3c)
+ if (Rfu.unk_124.count == 0 && Rfu.cmd_6600_timer > 60)
{
- sub_80F9D04(0x6600);
- Rfu.unk_fe = 0;
+ RfuPrepareSendBuffer(RFU_COMMAND_0x6600);
+ Rfu.cmd_6600_timer = 0;
}
}
playerCount = GetLinkPlayerCount();
for (i = 0; i < playerCount; i++)
{
- if (Rfu.unk_e9[i] == 0)
+ if (Rfu.cmd_6600_recvd[i] == 0)
break;
}
if (i == playerCount)
{
for (i = 0; i < MAX_RFU_PLAYERS; i++)
- Rfu.unk_e9[i] = 0;
- Rfu.unk_100++;
+ Rfu.cmd_6600_recvd[i] = 0;
+ Rfu.cmd_6600_count++;
Rfu.RfuFunc = NULL;
}
- Rfu.unk_fe++;
+ Rfu.cmd_6600_timer++;
}
-static void sub_80FA350(void)
+static void RfuFunc_Send6600_2(void)
{
- if (Rfu.unk_124.unk_8c2 == 0 && gSendCmd[0] == 0)
+ if (Rfu.unk_124.count == 0 && gSendCmd[0] == 0)
{
- sub_80F9D04(0x6600);
- Rfu.RfuFunc = sub_80FA2B0;
+ RfuPrepareSendBuffer(RFU_COMMAND_0x6600);
+ Rfu.RfuFunc = RfuFunc_Send6600_3;
}
}
-static void sub_80FA388(void)
+static void RfuFunc_Send6600_1(void)
{
u8 i;
u8 playerCount;
- if (GetMultiplayerId() != 0)
+ if (GetMultiplayerId() != 0) // child
{
- if (Rfu.unk_124.unk_8c2 == 0 && gSendCmd[0] == 0)
+ if (Rfu.unk_124.count == 0 && gSendCmd[0] == 0)
{
- sub_80F9D04(0x6600);
- Rfu.RfuFunc = sub_80FA2B0;
+ RfuPrepareSendBuffer(RFU_COMMAND_0x6600);
+ Rfu.RfuFunc = RfuFunc_Send6600_3;
}
}
- else
+ else // parent
{
playerCount = GetLinkPlayerCount();
for (i = 1; i < playerCount; i++)
{
- if (Rfu.unk_e9[i] == 0)
+ if (Rfu.cmd_6600_recvd[i] == 0)
break;
}
if (i == playerCount)
{
- if (Rfu.unk_124.unk_8c2 == 0 && gSendCmd[0] == 0)
+ if (Rfu.unk_124.count == 0 && gSendCmd[0] == 0)
{
- sub_80F9D04(0x6600);
- Rfu.RfuFunc = sub_80FA350;
+ RfuPrepareSendBuffer(RFU_COMMAND_0x6600);
+ Rfu.RfuFunc = RfuFunc_Send6600_2;
}
}
}
}
-void sub_80FA42C(void)
+void LinkRfu_SetRfuFuncToSend6600(void)
{
if (Rfu.RfuFunc == NULL)
{
- Rfu.RfuFunc = sub_80FA388;
- Rfu.unk_fe = 0;
+ Rfu.RfuFunc = RfuFunc_Send6600_1;
+ Rfu.cmd_6600_timer = 0;
}
}
-bool32 sub_80FA44C(u32 a0)
+bool32 RfuSerialNumberIsValid(u32 serialNo)
{
s32 i;
- for (i = 0; gUnknown_843EC8C[i] != a0; i++)
+ for (i = 0; sAcceptedSerialNos[i] != serialNo; i++)
{
- if (gUnknown_843EC8C[i] == 0xFFFF)
+ if (sAcceptedSerialNos[i] == 0xFFFF)
return FALSE;
}
return TRUE;
@@ -1453,20 +1457,20 @@ bool32 sub_80FA44C(u32 a0)
u8 sub_80FA484(bool32 a0)
{
if (!a0)
- return sub_80FEA34(0, 0);
- sub_80FEA34(1, 0x258);
+ return rfu_LMAN_setLinkRecovery(0, 0);
+ rfu_LMAN_setLinkRecovery(1, 600);
return 0;
}
void sub_80FA4A8(void)
{
Rfu.unk_cd9 = 1;
- sub_80FD760(FALSE);
+ rfu_LMAN_stopManager(0);
}
u8 LinkRfu_GetMultiplayerId(void)
{
- if (Rfu.unk_0c == 1)
+ if (Rfu.parent_child == MODE_PARENT)
return 0;
return Rfu.unk_cce;
}
@@ -1507,7 +1511,7 @@ static bool8 sub_80FA528(void)
}
}
- else if (gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == SLOT_STATE_RECV_FAILED)
+ else if (gRfuSlotStatusNI[Rfu.child_slot]->recv.state == SLOT_STATE_RECV_FAILED)
{
rfu_clearSlot(TYPE_NI_RECV, i);
}
@@ -1541,9 +1545,9 @@ bool32 sub_80FA5D4(void)
return FALSE;
}
-bool32 sub_80FA634(u16 a0, const u8 *a1)
+bool32 TrainerIdAndNameStillInPartnersList(u16 trainerId, const u8 *trainerName)
{
- u8 r1 = sub_80FBC70(a1, a0);
+ u8 r1 = GetPartnerIndexByNameAndTrainerID(trainerName, trainerId);
if (r1 == 0xFF)
return TRUE;
if (Rfu.unk_cd1[r1] == 9)
@@ -1551,27 +1555,27 @@ bool32 sub_80FA634(u16 a0, const u8 *a1)
return FALSE;
}
-void sub_80FA670(u8 a0, u16 a1, const u8 *a2)
+void SendByteToPartnerByIdAndName(u8 value, u16 trainerId, const u8 *trainerName)
{
- u8 r4 = sub_80FBC70(a2, a1);
- Rfu.unk_cd1[r4] = a0;
- rfu_clearSlot(TYPE_NI_SEND, r4);
- rfu_NI_setSendData(1 << r4, 8, Rfu.unk_cd1 + r4, 1);
+ u8 slotNo = GetPartnerIndexByNameAndTrainerID(trainerName, trainerId);
+ Rfu.unk_cd1[slotNo] = value;
+ rfu_clearSlot(TYPE_NI_SEND, slotNo);
+ rfu_NI_setSendData(1 << slotNo, 8, Rfu.unk_cd1 + slotNo, 1);
}
-void sub_80FA6BC(void)
+void LinkRfuNIsend8(void)
{
Rfu.unk_c85 = 8;
- rfu_clearSlot(TYPE_NI_SEND, Rfu.unk_c3e);
- rfu_NI_setSendData(1 << Rfu.unk_c3e, 8, &Rfu.unk_c85, 1);
+ rfu_clearSlot(TYPE_NI_SEND, Rfu.child_slot);
+ rfu_NI_setSendData(1 << Rfu.child_slot, 8, &Rfu.unk_c85, 1);
}
-u32 sub_80FA6FC(u16 a0, const u8 *a1)
+u32 WaitSendByteToPartnerByIdAndName(u16 trainerId, const u8 *trainerName)
{
- u8 r0 = sub_80FBC70(a1, a0);
+ u8 r0 = GetPartnerIndexByNameAndTrainerID(trainerName, trainerId);
if (r0 == 0xFF)
return 2;
- if (gRfuSlotStatusNI[r0]->send.state == 0)
+ if (gRfuSlotStatusNI[r0]->send.state == SLOT_STATE_READY)
return 1;
return 0;
}
@@ -1597,18 +1601,18 @@ static s32 sub_80FA788(void)
s32 retval = 0;
if (Rfu.unk_c85 == 8)
{
- if (gRfuSlotStatusNI[Rfu.unk_c3e]->send.state == SLOT_STATE_SEND_SUCCESS || gRfuSlotStatusNI[Rfu.unk_c3e]->send.state == SLOT_STATE_SEND_FAILED)
- rfu_clearSlot(TYPE_NI_SEND, Rfu.unk_c3e);
+ if (gRfuSlotStatusNI[Rfu.child_slot]->send.state == SLOT_STATE_SEND_SUCCESS || gRfuSlotStatusNI[Rfu.child_slot]->send.state == SLOT_STATE_SEND_FAILED)
+ rfu_clearSlot(TYPE_NI_SEND, Rfu.child_slot);
}
- if (gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == SLOT_STATE_RECV_SUCCESS || gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN)
+ if (gRfuSlotStatusNI[Rfu.child_slot]->recv.state == SLOT_STATE_RECV_SUCCESS || gRfuSlotStatusNI[Rfu.child_slot]->recv.state == SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN)
{
- rfu_clearSlot(TYPE_NI_RECV, Rfu.unk_c3e);
- sub_80FB9E4(Rfu.unk_c86, 0);
+ rfu_clearSlot(TYPE_NI_RECV, Rfu.child_slot);
+ RfuSetErrorStatus(Rfu.unk_c86, 0);
retval = Rfu.unk_c86;
}
- else if (gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == SLOT_STATE_RECV_FAILED)
+ else if (gRfuSlotStatusNI[Rfu.child_slot]->recv.state == SLOT_STATE_RECV_FAILED)
{
- rfu_clearSlot(TYPE_NI_RECV, Rfu.unk_c3e);
+ rfu_clearSlot(TYPE_NI_RECV, Rfu.child_slot);
retval = 6;
}
return retval;
@@ -1626,20 +1630,20 @@ static void sub_80FA834(u8 taskId)
switch (gTasks[taskId].data[0])
{
case 0:
- if (sub_80F9C50())
+ if (Cmd8000recvIsFinished())
{
ResetBlockReceivedFlags();
- sub_800B0B4();
+ PrepareLocalLinkPlayerBlock();
gTasks[taskId].data[0]++;
}
break;
case 1:
- if (Rfu.unk_0c == 1)
+ if (Rfu.parent_child == MODE_PARENT)
{
if (gReceivedRemoteLinkPlayers)
- sub_80F9D04(0x7800);
+ RfuPrepareSendBuffer(RFU_COMMAND_0x7800);
else
- sub_80F9D04(0x7700);
+ RfuPrepareSendBuffer(RFU_COMMAND_0x7700);
gTasks[taskId].data[0] = 101;
}
else
@@ -1654,12 +1658,12 @@ static void sub_80FA834(u8 taskId)
gTasks[taskId].data[0]++;
break;
case 3:
- if (Rfu.unk_0c == 1)
+ if (Rfu.parent_child == MODE_PARENT)
{
- if (sub_80F9C50())
+ if (Cmd8000recvIsFinished())
{
Rfu.unk_5a = 0;
- sub_80F9D04(0xa100);
+ RfuPrepareSendBuffer(RFU_COMMAND_0xa100);
gTasks[taskId].data[0]++;
}
}
@@ -1673,7 +1677,7 @@ static void sub_80FA834(u8 taskId)
case 5:
for (i = 0; i < Rfu.playerCount; i++)
{
- sub_800B110(i);
+ LinkPlayerFromBlock(i);
Rfu_ResetBlockReceivedFlag(i);
}
gTasks[taskId].data[0]++;
@@ -1682,15 +1686,15 @@ static void sub_80FA834(u8 taskId)
DestroyTask(taskId);
gReceivedRemoteLinkPlayers = 1;
Rfu.unk_ce8 = FALSE;
- sub_80FEA34(1, 0x258);
- if (Rfu.unk_ce6)
+ rfu_LMAN_setLinkRecovery(1, 600);
+ if (Rfu.unionRoomChatters)
{
for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if ((Rfu.unk_ce6 >> i) & 1)
+ if ((Rfu.unionRoomChatters >> i) & 1)
{
Rfu.unk_ce5 = 1 << i;
- Rfu.unk_ce6 ^= (1 << i);
+ Rfu.unionRoomChatters ^= (1 << i);
}
}
}
@@ -1705,39 +1709,39 @@ static void sub_80FA9D0(u16 a0)
for (i = 0; i < RFU_CHILD_MAX; i++)
{
if ((a0 >> i) & 1)
- Rfu.unk_cde[i] = 0;
+ Rfu.linkPlayerIdx[i] = 0;
}
}
-static void sub_80FA9FC(const struct UnkRfuStruct_8010A14 *a0)
+static void ReceiveRfuLinkPlayers(const struct SioInfo *chunk)
{
s32 i;
- Rfu.playerCount = a0->unk_0f;
+ Rfu.playerCount = chunk->playerCount;
for (i = 0; i < RFU_CHILD_MAX; i++)
- Rfu.unk_cde[i] = a0->unk_10[i];
+ Rfu.linkPlayerIdx[i] = chunk->linkPlayerIdx[i];
for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
- gLinkPlayers[i] = a0->unk_14[i];
- sub_800B284(gLinkPlayers + i);
+ gLinkPlayers[i] = chunk->linkPlayers[i];
+ IntlConvertLinkPlayerName(gLinkPlayers + i);
}
}
-static void sub_80FAA58(void *a0)
+static void ValidateAndReceivePokemonSioInfo(void *recvBuffer)
{
- if (strcmp("PokemonSioInfo", ((struct UnkRfuStruct_8010A14 *)a0)->unk_00) == 0)
+ if (strcmp("PokemonSioInfo", recvBuffer) == 0)
{
- sub_80FA9FC(a0);
- CpuFill16(0, a0, sizeof(struct UnkRfuStruct_8010A14));
+ ReceiveRfuLinkPlayers(recvBuffer);
+ CpuFill16(0, recvBuffer, sizeof(struct SioInfo));
ResetBlockReceivedFlag(0);
}
}
-static void sub_80FAA94(u8 taskId)
+static void Task_ExchangeLinkPlayers(u8 taskId)
{
s32 i;
struct LinkPlayerBlock *r2;
- struct UnkRfuStruct_8010A14 *r5;
- u8 r4 = Rfu.unk_cde[gUnknown_843EC38[Rfu.unk_ce9]];
+ struct SioInfo *r5;
+ u8 r4 = Rfu.linkPlayerIdx[gUnknown_843EC38[Rfu.unk_ce9]];
if (Rfu.unk_f1 == 1 || Rfu.unk_f1 == 2)
{
Rfu.unk_ce8 = FALSE;
@@ -1749,7 +1753,7 @@ static void sub_80FAA94(u8 taskId)
if (gSendCmd[0] == 0)
{
ResetBlockReceivedFlag(r4);
- sub_80F9D04(0x7800);
+ RfuPrepareSendBuffer(RFU_COMMAND_0x7800);
gTasks[taskId].data[0]++;
}
break;
@@ -1763,42 +1767,43 @@ static void sub_80FAA94(u8 taskId)
ResetBlockReceivedFlag(r4);
r2 = (struct LinkPlayerBlock *)gBlockRecvBuffer[r4];
gLinkPlayers[r4] = r2->linkPlayer;
- sub_800B284(gLinkPlayers + r4);
+ IntlConvertLinkPlayerName(gLinkPlayers + r4);
gTasks[taskId].data[0]++;
}
break;
case 3:
- r5 = (struct UnkRfuStruct_8010A14 *)gBlockSendBuffer;
- memcpy(r5->unk_00, "PokemonSioInfo", sizeof("PokemonSioInfo"));
- r5->unk_0f = Rfu.playerCount;
+ // Prepare send block
+ r5 = (struct SioInfo *)gBlockSendBuffer;
+ memcpy(r5->magic, "PokemonSioInfo", sizeof("PokemonSioInfo"));
+ r5->playerCount = Rfu.playerCount;
for (i = 0; i < RFU_CHILD_MAX; i++)
- r5->unk_10[i] = Rfu.unk_cde[i];
- memcpy(r5->unk_14, gLinkPlayers, sizeof gLinkPlayers);
+ r5->linkPlayerIdx[i] = Rfu.linkPlayerIdx[i];
+ memcpy(r5->linkPlayers, gLinkPlayers, sizeof gLinkPlayers);
gTasks[taskId].data[0]++;
// fallthrough
case 4:
- r5 = (struct UnkRfuStruct_8010A14 *)gBlockSendBuffer;
- r5->unk_0f = Rfu.playerCount;
+ r5 = (struct SioInfo *)gBlockSendBuffer;
+ r5->playerCount = Rfu.playerCount;
for (i = 0; i < RFU_CHILD_MAX; i++)
- r5->unk_10[i] = Rfu.unk_cde[i];
- memcpy(r5->unk_14, gLinkPlayers, sizeof gLinkPlayers);
+ r5->linkPlayerIdx[i] = Rfu.linkPlayerIdx[i];
+ memcpy(r5->linkPlayers, gLinkPlayers, sizeof gLinkPlayers);
if (SendBlock(0, gBlockSendBuffer, 0xa0))
gTasks[taskId].data[0]++;
break;
case 5:
if (IsLinkTaskFinished() && GetBlockReceivedStatus() & 1)
{
- CpuFill16(0, gBlockRecvBuffer, sizeof(struct UnkRfuStruct_8010A14));
+ CpuFill16(0, gBlockRecvBuffer, sizeof(struct SioInfo));
ResetBlockReceivedFlag(0);
Rfu.unk_ce8 = FALSE;
- if (Rfu.unk_ce6)
+ if (Rfu.unionRoomChatters)
{
for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if ((Rfu.unk_ce6 >> i) & 1)
+ if ((Rfu.unionRoomChatters >> i) & 1)
{
Rfu.unk_ce5 = 1 << i;
- Rfu.unk_ce6 ^= (1 << i);
+ Rfu.unionRoomChatters ^= (1 << i);
Rfu.unk_ce8 = TRUE;
break;
}
@@ -1819,7 +1824,7 @@ static void sub_80FACF0(u8 taskId)
case 0:
if (Rfu.playerCount)
{
- sub_800B0B4();
+ PrepareLocalLinkPlayerBlock();
SendBlock(0, gBlockSendBuffer, sizeof(struct LinkPlayerBlock));
gTasks[taskId].data[0]++;
}
@@ -1831,7 +1836,7 @@ static void sub_80FACF0(u8 taskId)
case 2:
if (GetBlockReceivedStatus() & 1)
{
- sub_80FA9FC((const struct UnkRfuStruct_8010A14 *)gBlockRecvBuffer);
+ ReceiveRfuLinkPlayers((const struct SioInfo *)gBlockRecvBuffer);
ResetBlockReceivedFlag(0);
gReceivedRemoteLinkPlayers = 1;
DestroyTask(taskId);
@@ -1840,51 +1845,51 @@ static void sub_80FACF0(u8 taskId)
}
}
-static void sub_80FAD98(void)
+static void RfuCheckErrorStatus(void)
{
- if (Rfu.unk_ee == 1 && gUnknown_3005E10.unk_02 == 0)
+ if (Rfu.errorState == 1 && lman.childClockSlave_flag == 0)
{
if (gMain.callback2 == c2_mystery_gift_e_reader_run)
gWirelessCommType = 2;
SetMainCallback2(CB2_LinkError);
gMain.savedCallback = CB2_LinkError;
- sub_800ACBC((Rfu.unk_0a << 16) | (Rfu.unk_10 << 8) | Rfu.unk_12, Rfu.unk_124.unk_8c2, Rfu.unk_9e8.unk_232, sub_80FB9F4() == 2);
- Rfu.unk_ee = 2;
+ SetLinkErrorFromRfu((Rfu.linkman_msg << 16) | (Rfu.linkman_param[0] << 8) | Rfu.linkman_param[1], Rfu.unk_124.count, Rfu.unk_9e8.count, RfuGetErrorStatus() == 2);
+ Rfu.errorState = 2;
CloseLink();
}
- else if (Rfu.unk_9e8.unk_233 == 1 || Rfu.unk_124.unk_8c3 == 1)
+ else if (Rfu.unk_9e8.full == 1 || Rfu.unk_124.full == 1)
{
- if (gUnknown_3005E10.unk_02)
- sub_80FEB14();
- sub_80FB9E4(1, 0x7000);
- sub_80FB0E8(0x7000);
+ if (lman.childClockSlave_flag)
+ rfu_LMAN_requestChangeAgbClockMaster();
+ RfuSetErrorStatus(1, 0x7000);
+ GetLinkmanErrorParams(0x7000);
}
}
static void rfu_REQ_recvData_then_sendData(void)
{
- if (gUnknown_3005E10.unk_06 == 1)
+ if (lman.parent_child == MODE_PARENT)
{
rfu_REQ_recvData();
rfu_waitREQComplete();
- LinkRfu_REQ_SendData_HandleParentRelationship(0);
+ rfu_LMAN_REQ_sendData(RFU_CHILD_CLOCK_SLAVE_OFF);
}
}
-bool32 sub_80FAE94(void)
+bool32 LinkRfuMain1(void)
{
bool32 retval = FALSE;
- Rfu.unk_ccd = 0;
- sub_80FDA30(Random());
+ Rfu.parentId = 0;
+ rfu_LMAN_manager_entity(Random());
if (Rfu.unk_ef == 0)
{
- switch (Rfu.unk_0c)
+ switch (Rfu.parent_child)
{
case 1:
sub_80F911C();
break;
case 0:
- retval = sub_80F9514();
+ retval = RfuProcessEnqueuedRecvBlock();
break;
case 2:
rfu_REQ_recvData_then_sendData();
@@ -1894,19 +1899,19 @@ bool32 sub_80FAE94(void)
return retval;
}
-bool32 sub_80FAEF0(void)
+bool32 LinkRfuMain2(void)
{
bool32 retval = FALSE;
if (Rfu.unk_ef == 0)
{
- if (Rfu.unk_0c == 1)
+ if (Rfu.parent_child == MODE_PARENT)
retval = sub_80F9204();
- sub_80FAD98();
+ RfuCheckErrorStatus();
}
return retval;
}
-static void sub_80FAF1C(void)
+static void CopyPlayerNameToUnameBuffer(void)
{
StringCopy(gHostRFUtgtUnameBuffer, gSaveBlock2Ptr->playerName);
}
@@ -1914,94 +1919,96 @@ static void sub_80FAF1C(void)
void ClearAndInitHostRFUtgtGname(void)
{
memset(&gHostRFUtgtGnameBuffer, 0, RFU_GAME_NAME_LENGTH);
- InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, 0, 0, 0);
+ InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, 0, FALSE, 0);
}
-void SetHostRFUtgtGname(u8 a0, u32 a1, u32 a2)
+void SetHostRFUtgtGname(u8 activity, u32 child_sprite_genders, u32 started)
{
- InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, a0, a2, a1);
+ InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, activity, started, child_sprite_genders);
}
-void sub_80FAF74(bool32 a0, bool32 a1)
+void SetGnameBufferWonderFlags(bool32 hasNews, bool32 hasCard)
{
- gHostRFUtgtGnameBuffer.unk_00.unk_00_4 = a0;
- gHostRFUtgtGnameBuffer.unk_00.unk_00_5 = a1;
+ gHostRFUtgtGnameBuffer.unk_00.hasNews = hasNews;
+ gHostRFUtgtGnameBuffer.unk_00.hasCard = hasCard;
}
-void sub_80FAFA0(u32 type, u32 species, u32 level)
+void RfuUpdatePlayerGnameStateAndSend(u32 type, u32 species, u32 level)
{
gHostRFUtgtGnameBuffer.type = type;
gHostRFUtgtGnameBuffer.species = species;
gHostRFUtgtGnameBuffer.level = level;
}
-void sub_80FAFE0(u8 a0)
+void UpdateGameData_GroupLockedIn(bool8 started)
{
- gHostRFUtgtGnameBuffer.unk_0a_7 = a0;
- rfu_REQ_configGameData(0, 2, (void *)&gHostRFUtgtGnameBuffer, gHostRFUtgtUnameBuffer);
+ gHostRFUtgtGnameBuffer.started = started;
+ rfu_REQ_configGameData(0, 0x0002, (void *)&gHostRFUtgtGnameBuffer, gHostRFUtgtUnameBuffer);
}
-void sub_80FB008(u8 a0, u32 a1, u32 a2)
+void UpdateGameDataWithActivitySpriteGendersFlag(u8 activity, u32 child_sprite_genders, u32 started)
{
- if (a0)
- SetHostRFUtgtGname(a0, a1, a2);
- rfu_REQ_configGameData(0, 2, (void *)&gHostRFUtgtGnameBuffer, gHostRFUtgtUnameBuffer);
+ if (activity)
+ SetHostRFUtgtGname(activity, child_sprite_genders, started);
+ rfu_REQ_configGameData(0, 0x0002, (void *)&gHostRFUtgtGnameBuffer, gHostRFUtgtUnameBuffer);
}
void sub_80FB030(u32 linkPlayerCount)
{
s32 i;
- u32 r5;
- u32 r7;
- s32 r8;
+ u32 numConnectedChildren;
+ u32 child_sprite_genders;
+ s32 bm_child_slots;
- if (sub_80F9800()->unk_0a_0 == 0x45)
+ if (GetHostRFUtgtGname()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM))
{
- r5 = 0;
- r7 = 0;
- r8 = Rfu.unk_ce2 ^ Rfu.unk_ce3;
+ numConnectedChildren = 0;
+ child_sprite_genders = 0;
+ bm_child_slots = Rfu.bm_PartnerFlags ^ Rfu.bm_DisconnectSlot;
for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if ((r8 >> i) & 1)
+ if ((bm_child_slots >> i) & 1)
{
- r7 |= ((
- 0x80 | ((gLinkPlayers[Rfu.unk_cde[i]].gender & 1) << 3) | (gLinkPlayers[Rfu.unk_cde[i]].trainerId & 7)) << (r5 << 3));
- r5++;
- if (r5 == linkPlayerCount - 1)
+ // The 0x80 prevents this element from being incorrectly read as a 0.
+ child_sprite_genders |= ((
+ 0x80 | ((gLinkPlayers[Rfu.linkPlayerIdx[i]].gender & 1) << 3) | (gLinkPlayers[Rfu.linkPlayerIdx[i]].trainerId & 7)
+ ) << (numConnectedChildren << 3));
+ numConnectedChildren++;
+ if (numConnectedChildren == linkPlayerCount - 1)
break;
}
}
- sub_80FB008(0x45, r7, 0);
+ UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_CHAT | IN_UNION_ROOM, child_sprite_genders, 0);
}
}
-static void sub_80FB0E8(u32 a0)
+static void GetLinkmanErrorParams(u32 msg)
{
- if (Rfu.unk_ee == 0)
+ if (Rfu.errorState == 0)
{
- Rfu.unk_10 = gUnknown_3005E10.unk_14;
- Rfu.unk_12 = gUnknown_3005E10.unk_16;
- Rfu.unk_0a = a0;
- Rfu.unk_ee = 1;
+ Rfu.linkman_param[0] = lman.param[0];
+ Rfu.linkman_param[1] = lman.param[1];
+ Rfu.linkman_msg = msg;
+ Rfu.errorState = 1;
}
}
-static void sub_80FB118(void)
+static void ResetErrorState(void)
{
- Rfu.unk_ee = 0;
+ Rfu.errorState = 0;
}
void sub_80FB128(bool32 a0)
{
if (!a0)
- Rfu.unk_ee = 0;
+ Rfu.errorState = 0;
else
- Rfu.unk_ee = 4;
+ Rfu.errorState = 4;
}
static void sub_80FB154(void)
{
- sub_80FBE20(gUnknown_3005E10.unk_00, 1);
+ sub_80FBE20(lman.acceptSlot_flag, 1);
Rfu.RfuFunc = NULL;
}
@@ -2010,25 +2017,25 @@ static void sub_80FB174(void)
Rfu.RfuFunc = sub_80FB154;
}
-static void sub_80FB184(u8 a0, u8 unused1)
+static void LmanCallback_Parent2(u8 msg, u8 param_count)
{
u8 i;
- u8 r6 = 0;
- switch (a0)
+ u8 bmDisconnectFlag = 0;
+ switch (msg)
{
- case 0x00:
- Rfu.unk_04 = 2;
+ case LMAN_MSG_INITIALIZE_COMPLETED:
+ Rfu.state = 2;
break;
- case 0x10:
+ case LMAN_MSG_NEW_CHILD_CONNECT_DETECTED:
break;
- case 0x11:
- sub_80FB564(gUnknown_3005E10.unk_14);
+ case LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED:
+ sub_80FB564(lman.param[0]);
for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if ((gUnknown_3005E10.unk_14 >> i) & 1)
+ if ((lman.param[0] >> i) & 1)
{
struct GFtgtGname *structPtr = (void *)&gRfuLinkStatus->partner[i].gname;
- if (structPtr->unk_0a_0 == sub_80F9800()->unk_0a_0)
+ if (structPtr->activity == GetHostRFUtgtGname()->activity)
{
Rfu.unk_cd1[i] = 0;
Rfu.unk_cd5[i] = 0;
@@ -2036,60 +2043,64 @@ static void sub_80FB184(u8 a0, u8 unused1)
}
else
{
- r6 |= (1 << i);
+ bmDisconnectFlag |= (1 << i);
}
}
}
- if (r6)
+ if (bmDisconnectFlag)
{
- rfu_REQ_disconnect(r6);
+ rfu_REQ_disconnect(bmDisconnectFlag);
rfu_waitREQComplete();
}
break;
- case 0x12:
+ case LMAN_MSG_NEW_CHILD_CONNECT_REJECTED:
break;
- case 0x13:
+ case LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED:
break;
- case 0x14:
- if (Rfu.unk_ce7 != gUnknown_3005E10.unk_00)
+ case LMAN_MSG_END_WAIT_CHILD_NAME:
+ if (Rfu.acceptSlot_flag != lman.acceptSlot_flag)
{
- rfu_REQ_disconnect(Rfu.unk_ce7 ^ gUnknown_3005E10.unk_00);
+ rfu_REQ_disconnect(Rfu.acceptSlot_flag ^ lman.acceptSlot_flag);
rfu_waitREQComplete();
}
- Rfu.unk_04 = 0x11;
+ Rfu.state = 17;
break;
- case 0x31:
- Rfu.unk_f0 = 1;
+ case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY:
+ Rfu.linkLossRecoveryState = 1;
break;
- case 0x32:
- Rfu.unk_f0 = 3;
+ case LMAN_MSG_LINK_RECOVERY_SUCCESSED:
+ Rfu.linkLossRecoveryState = 3;
break;
- case 0x30:
- case 0x33:
- Rfu.unk_f0 = 4;
- Rfu.unk_ce2 &= ~gUnknown_3005E10.unk_14;
+ case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED:
+ case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED:
+ Rfu.linkLossRecoveryState = 4;
+ Rfu.bm_PartnerFlags &= ~lman.param[0];
if (gReceivedRemoteLinkPlayers == 1)
{
- if (Rfu.unk_ce2 == 0)
- sub_80FB0E8(a0);
+ if (Rfu.bm_PartnerFlags == 0)
+ GetLinkmanErrorParams(msg);
else
sub_80FB174();
}
- sub_80FB9E4(2, a0);
+ RfuSetErrorStatus(2, msg);
break;
case 0x34:
break;
- case 0x42 ... 0x44:
+ case LMAN_MSG_RFU_POWER_DOWN:
+ case LMAN_MSG_MANAGER_STOPPED:
+ case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET:
break;
- case 0xf3:
- sub_80FB9E4(1, a0);
- sub_80FB0E8(a0);
+ case LMAN_MSG_LMAN_API_ERROR_RETURN:
+ RfuSetErrorStatus(1, msg);
+ GetLinkmanErrorParams(msg);
Rfu.unk_ef = 1;
break;
- case 0xf0 ... 0xf2:
- case 0xff:
- sub_80FB0E8(a0);
- sub_80FB9E4(1, a0);
+ case LMAN_MSG_REQ_API_ERROR:
+ case LMAN_MSG_WATCH_DOG_TIMER_ERROR:
+ case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA:
+ case LMAN_MSG_RFU_FATAL_ERROR:
+ GetLinkmanErrorParams(msg);
+ RfuSetErrorStatus(1, msg);
Rfu.unk_cdb = 1;
break;
}
@@ -2097,80 +2108,84 @@ static void sub_80FB184(u8 a0, u8 unused1)
static const u8 unref_843EDF3[] = _(" あきと");
-static void sub_80FB37C(u8 a0, u8 unused1)
+static void LmanCallback_Child(u8 msg, u8 param_count)
{
- switch (a0)
+ switch (msg)
{
- case 0x00:
- Rfu.unk_04 = 6;
+ case LMAN_MSG_INITIALIZE_COMPLETED:
+ Rfu.state = 6;
break;
- case 0x20:
- Rfu.unk_ccd = gUnknown_3005E10.unk_14;
+ case LMAN_MSG_PARENT_FOUND:
+ Rfu.parentId = lman.param[0];
break;
- case 0x21:
+ case LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED:
break;
- case 0x22:
- Rfu.unk_c3e = gUnknown_3005E10.unk_14;
+ case LMAN_MSG_CONNECT_PARENT_SUCCESSED:
+ Rfu.child_slot = lman.param[0];
break;
- case 0x23:
- sub_80FB9E4(2, a0);
+ case LMAN_MSG_CONNECT_PARENT_FAILED:
+ RfuSetErrorStatus(2, msg);
break;
- case 0x24:
- Rfu.unk_04 = 11;
+ case LMAN_MSG_CHILD_NAME_SEND_COMPLETED:
+ Rfu.state = 11;
Rfu.unk_c85 = 0;
Rfu.unk_c86 = 0;
- rfu_setRecvBuffer(TYPE_NI, Rfu.unk_c3e, &Rfu.unk_c86, 1);
- rfu_setRecvBuffer(TYPE_UNI, Rfu.unk_c3e, Rfu.unk_c3f, 70);
+ rfu_setRecvBuffer(TYPE_NI, Rfu.child_slot, &Rfu.unk_c86, 1);
+ rfu_setRecvBuffer(TYPE_UNI, Rfu.child_slot, Rfu.unk_c3f, sizeof(Rfu.unk_c3f));
break;
- case 0x25:
- sub_80FB9E4(2, 0x25);
+ case LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED:
+ RfuSetErrorStatus(2, msg);
break;
- case 0x30:
- Rfu.unk_f0 = 2;
+ case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED:
+ Rfu.linkLossRecoveryState = 2;
if (Rfu.unk_c86 == 6)
break;
- case 0x33:
- if (Rfu.unk_f0 != 2)
- Rfu.unk_f0 = 4;
+ case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED:
+ if (Rfu.linkLossRecoveryState != 2)
+ Rfu.linkLossRecoveryState = 4;
if (Rfu.unk_c86 != 9)
- sub_80FB9E4(2, a0);
- nullsub_87("LINK LOSS DISCONNECT!", 5, 5);
+ RfuSetErrorStatus(2, msg);
+ rfu_dbg_print_str("LINK LOSS DISCONNECT!", 5, 5);
if (gReceivedRemoteLinkPlayers == 1)
- sub_80FB0E8(a0);
+ GetLinkmanErrorParams(msg);
break;
- case 0x31:
- Rfu.unk_f0 = 1;
- nullsub_87("LINK LOSS RECOVERY NOW", 5, 5);
+ case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY:
+ Rfu.linkLossRecoveryState = 1;
+ rfu_dbg_print_str("LINK LOSS RECOVERY NOW", 5, 5);
break;
- case 0x32:
- Rfu.unk_f0 = 3;
+ case LMAN_MSG_LINK_RECOVERY_SUCCESSED:
+ Rfu.linkLossRecoveryState = 3;
Rfu.unk_c3c = 1;
break;
case 0x34:
break;
- case 0x42 ... 0x44:
+ case LMAN_MSG_RFU_POWER_DOWN:
+ case LMAN_MSG_MANAGER_STOPPED:
+ case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET:
break;
- case 0xF3:
- sub_80FB9E4(1, a0);
- sub_80FB0E8(a0);
+ case LMAN_MSG_LMAN_API_ERROR_RETURN:
+ RfuSetErrorStatus(1, msg);
+ GetLinkmanErrorParams(msg);
Rfu.unk_ef = 1;
break;
- case 0xF0 ... 0xF2:
- case 0xFF:
- sub_80FB9E4(1, a0);
- sub_80FB0E8(a0);
+ case LMAN_MSG_REQ_API_ERROR:
+ case LMAN_MSG_WATCH_DOG_TIMER_ERROR:
+ case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA:
+ case LMAN_MSG_RFU_FATAL_ERROR:
+ RfuSetErrorStatus(1, msg);
+ GetLinkmanErrorParams(msg);
Rfu.unk_cdb = 1;
break;
}
}
-static void sub_80FB564(s32 a0)
+static void sub_80FB564(s32 bmConnectedFlag)
{
s32 i;
for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if ((a0 >> i) & 1)
+ if ((bmConnectedFlag >> i) & 1)
{
Rfu.unk_cea[i] = 0;
Rfu.unk_cee[i] = 0xFF;
@@ -2178,17 +2193,17 @@ static void sub_80FB564(s32 a0)
}
}
-static u8 sub_80FB5A0(s32 a0)
+static u8 GetNewChildrenInUnionRoomChat(s32 bmNewChildSlot)
{
u8 ret = 0;
u8 i;
for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if ((a0 >> i) & 1)
+ if ((bmNewChildSlot >> i) & 1)
{
struct GFtgtGname *structPtr = (void *)&gRfuLinkStatus->partner[i].gname;
- if (structPtr->unk_0a_0 == 0x45)
+ if (structPtr->activity == (ACTIVITY_CHAT | IN_UNION_ROOM))
ret |= (1 << i);
}
}
@@ -2196,73 +2211,73 @@ static u8 sub_80FB5A0(s32 a0)
return ret;
}
-static void sub_80FB5EC(u8 a0, u8 unused1)
+static void LmanCallback_Parent(u8 msg, u8 param_count)
{
u8 r1;
- switch (a0)
+ switch (msg)
{
- case 0x00:
- Rfu.unk_04 = 0x11;
+ case LMAN_MSG_INITIALIZE_COMPLETED:
+ Rfu.state = 17;
break;
- case 0x10:
- sub_80FB9E4(4, 0);
+ case LMAN_MSG_NEW_CHILD_CONNECT_DETECTED:
+ RfuSetErrorStatus(4, 0);
break;
- case 0x11:
- if (sub_80F9800()->unk_0a_0 == 0x45 && Rfu.unk_cd9 == 0)
+ case LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED:
+ if (GetHostRFUtgtGname()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM) && Rfu.unk_cd9 == 0)
{
- u8 idx = sub_80FB5A0(gUnknown_3005E10.unk_14);
- if (idx != 0)
+ u8 bmAcceptSlot = GetNewChildrenInUnionRoomChat(lman.param[0]);
+ if (bmAcceptSlot != 0)
{
- r1 = 1 << sub_80F886C(idx);
- if (Rfu.unk_ce6 == 0 && !Rfu.unk_ce8)
+ r1 = 1 << sub_80F886C(bmAcceptSlot);
+ if (Rfu.unionRoomChatters == 0 && !Rfu.unk_ce8)
{
Rfu.unk_ce5 = r1;
- Rfu.unk_ce6 |= (r1 ^ idx);
+ Rfu.unionRoomChatters |= (r1 ^ bmAcceptSlot);
Rfu.unk_ce8 = TRUE;
}
else
{
- Rfu.unk_ce6 |= idx;
+ Rfu.unionRoomChatters |= bmAcceptSlot;
}
}
- if (idx != gUnknown_3005E10.unk_14)
+ if (bmAcceptSlot != lman.param[0])
{
- Rfu.unk_ce3 |= (idx ^ gUnknown_3005E10.unk_14);
+ Rfu.bm_DisconnectSlot |= (bmAcceptSlot ^ lman.param[0]);
Rfu.unk_ce4 = 2;
}
}
- else if (sub_80F9800()->unk_0a_0 == 0x54)
+ else if (GetHostRFUtgtGname()->activity == (ACTIVITY_PLYRTALK | IN_UNION_ROOM))
{
- rfu_REQ_disconnect(gUnknown_3005E10.unk_00);
+ rfu_REQ_disconnect(lman.acceptSlot_flag);
rfu_waitREQComplete();
}
- sub_80FB564(gUnknown_3005E10.unk_14);
+ sub_80FB564(lman.param[0]);
break;
- case 0x12:
+ case LMAN_MSG_NEW_CHILD_CONNECT_REJECTED:
break;
- case 0x13:
+ case LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED:
break;
- case 0x14:
- if (sub_80F9800()->unk_0a_0 != 0x45 && gUnknown_3005E10.unk_01 > 1)
+ case LMAN_MSG_END_WAIT_CHILD_NAME:
+ if (GetHostRFUtgtGname()->activity != (ACTIVITY_CHAT | IN_UNION_ROOM) && lman.acceptCount > 1)
{
- r1 = 1 << sub_80F886C(gUnknown_3005E10.unk_14);
- rfu_REQ_disconnect(gUnknown_3005E10.unk_00 ^ r1);
+ r1 = 1 << sub_80F886C(lman.param[0]);
+ rfu_REQ_disconnect(lman.acceptSlot_flag ^ r1);
rfu_waitREQComplete();
}
- if (Rfu.unk_04 == 0xF)
- Rfu.unk_04 = 0x10;
+ if (Rfu.state == 0xF)
+ Rfu.state = 16;
break;
- case 0x20:
- Rfu.unk_ccd = gUnknown_3005E10.unk_14;
+ case LMAN_MSG_PARENT_FOUND:
+ Rfu.parentId = lman.param[0];
break;
- case 0x21:
+ case LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED:
break;
- case 0x22:
- Rfu.unk_c3e = gUnknown_3005E10.unk_14;
+ case LMAN_MSG_CONNECT_PARENT_SUCCESSED:
+ Rfu.child_slot = lman.param[0];
break;
- case 0x23:
- Rfu.unk_04 = 0x12;
+ case LMAN_MSG_CONNECT_PARENT_FAILED:
+ Rfu.state = 18;
if (Rfu.unk_ccf < 2)
{
Rfu.unk_ccf++;
@@ -2270,67 +2285,72 @@ static void sub_80FB5EC(u8 a0, u8 unused1)
}
else
{
- sub_80FB9E4(2, a0);
+ RfuSetErrorStatus(2, msg);
}
break;
- case 0x24:
- Rfu.unk_04 = 0xD;
- sub_80FB9E4(3, 0);
- rfu_setRecvBuffer(TYPE_UNI, Rfu.unk_c3e, Rfu.unk_c3f, sizeof(Rfu.unk_c3f));
+ case LMAN_MSG_CHILD_NAME_SEND_COMPLETED:
+ Rfu.state = 13;
+ RfuSetErrorStatus(3, 0);
+ rfu_setRecvBuffer(TYPE_UNI, Rfu.child_slot, Rfu.unk_c3f, sizeof(Rfu.unk_c3f));
break;
- case 0x25:
- sub_80FB9E4(2, a0);
+ case LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED:
+ RfuSetErrorStatus(2, msg);
break;
- case 0x31:
- if (gUnknown_3005E10.unk_00 & gUnknown_3005E10.unk_14)
- Rfu.unk_f0 = 1;
+ case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY:
+ if (lman.acceptSlot_flag & lman.param[0])
+ Rfu.linkLossRecoveryState = 1;
break;
- case 0x32:
- Rfu.unk_f0 = 3;
+ case LMAN_MSG_LINK_RECOVERY_SUCCESSED:
+ Rfu.linkLossRecoveryState = 3;
if (gRfuLinkStatus->parentChild == MODE_CHILD)
Rfu.unk_c3c = 1;
break;
- case 0x30:
- Rfu.unk_f0 = 2;
- case 0x33:
- if (Rfu.unk_f0 != 2)
- Rfu.unk_f0 = 4;
- if (Rfu.unk_0c == 1)
+ case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED:
+ Rfu.linkLossRecoveryState = 2;
+ // fallthrough
+ case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED:
+ if (Rfu.linkLossRecoveryState != 2)
+ Rfu.linkLossRecoveryState = 4;
+ if (Rfu.parent_child == MODE_PARENT)
{
if (gReceivedRemoteLinkPlayers == 1)
{
- Rfu.unk_ce2 &= ~(gUnknown_3005E10.unk_14);
- if (Rfu.unk_ce2 == 0)
- sub_80FB0E8(a0);
+ Rfu.bm_PartnerFlags &= ~(lman.param[0]);
+ if (Rfu.bm_PartnerFlags == 0)
+ GetLinkmanErrorParams(msg);
else
sub_80FB174();
}
}
else if (Rfu.unk_ce4 != 2 && gReceivedRemoteLinkPlayers == 1)
{
- sub_80FB0E8(a0);
- sub_80FD760(0);
+ GetLinkmanErrorParams(msg);
+ rfu_LMAN_stopManager(0);
}
- if (gRfuLinkStatus->parentChild == MODE_NEUTRAL && gUnknown_3005E10.unk_07 == 0 && FuncIsActiveTask(sub_80F8B34) == TRUE)
- Rfu.unk_04 = 0x11;
+ if (gRfuLinkStatus->parentChild == MODE_NEUTRAL && lman.pcswitch_flag == 0 && FuncIsActiveTask(Task_LinkRfu_UnionRoomListen) == TRUE)
+ Rfu.state = 17;
- sub_80FB9E4(2, a0);
+ RfuSetErrorStatus(2, msg);
break;
- case 0x40:
- Rfu.unk_ce3 = 0;
+ case LMAN_MSG_LINK_DISCONNECTED_BY_USER:
+ Rfu.bm_DisconnectSlot = 0;
break;
- case 0x42 ... 0x44:
+ case LMAN_MSG_RFU_POWER_DOWN:
+ case LMAN_MSG_MANAGER_STOPPED:
+ case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET:
break;
- case 0xF3:
- sub_80FB9E4(1, a0);
- sub_80FB0E8(a0);
+ case LMAN_MSG_LMAN_API_ERROR_RETURN:
+ RfuSetErrorStatus(1, msg);
+ GetLinkmanErrorParams(msg);
Rfu.unk_ef = 1;
break;
- case 0xF0 ... 0xF2:
- case 0xFF:
- sub_80FB0E8(a0);
- sub_80FB9E4(1, a0);
+ case LMAN_MSG_REQ_API_ERROR:
+ case LMAN_MSG_WATCH_DOG_TIMER_ERROR:
+ case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA:
+ case LMAN_MSG_RFU_FATAL_ERROR:
+ GetLinkmanErrorParams(msg);
+ RfuSetErrorStatus(1, msg);
Rfu.unk_cdb = 0;
break;
}
@@ -2341,21 +2361,21 @@ void sub_80FB9D0(void)
Rfu.unk_ce4 = 2;
}
-void sub_80FB9E4(u8 a0, u16 a1)
+void RfuSetErrorStatus(u8 a0, u16 msg)
{
Rfu.unk_f1 = a0;
- Rfu.unk_0a = a1;
+ Rfu.linkman_msg = msg;
}
-u8 sub_80FB9F4(void)
+u8 RfuGetErrorStatus(void)
{
return Rfu.unk_f1;
}
-bool32 sub_80FBA00(void)
+bool32 RfuIsErrorStatus1or2(void)
{
- u32 var = sub_80FB9F4() - 1;
- if (var < 2)
+ u32 var = RfuGetErrorStatus();
+ if (var == 1 || var == 2)
return TRUE;
else
return FALSE;
@@ -2368,12 +2388,12 @@ bool32 GetRfuUnkCE8(void)
bool8 Rfu_IsMaster(void)
{
- return Rfu.unk_0c;
+ return Rfu.parent_child;
}
void RFUVSync(void)
{
- LinkRfu_syncVBlank_();
+ rfu_LMAN_syncVBlank();
}
void sub_80FBA44(void)
@@ -2400,7 +2420,7 @@ static void sub_80FBA78(void)
if (IsWirelessAdapterConnected())
{
gLinkType = LINKTYPE_0x1111;
- sub_800B1F4();
+ SetWirelessCommType1();
OpenLink();
SeedRng(gMain.vblankCounter2);
for (i = 0; i < RFU_CHILD_MAX; i++)
@@ -2411,25 +2431,25 @@ static void sub_80FBA78(void)
AnimateSprites();
BuildOamBuffer();
UpdatePaletteFade();
- sub_80FBB20();
+ LinkRfu_CreateIdleTask();
SetMainCallback2(sub_80FBB74);
}
}
-bool32 sub_80FBB0C(void)
+bool32 IsUnionRoomListenTaskActive(void)
{
- return FuncIsActiveTask(sub_80F8B34);
+ return FuncIsActiveTask(Task_LinkRfu_UnionRoomListen);
}
-void sub_80FBB20(void)
+void LinkRfu_CreateIdleTask(void)
{
- if (!FuncIsActiveTask(nullsub_89))
- Rfu.unk_66 = CreateTask(nullsub_89, 0);
+ if (!FuncIsActiveTask(Task_idle))
+ Rfu.unk_66 = CreateTask(Task_idle, 0);
}
-void sub_80FBB4C(void)
+void LinkRfu_DestroyIdleTask(void)
{
- if (FuncIsActiveTask(nullsub_89) == TRUE)
+ if (FuncIsActiveTask(Task_idle) == TRUE)
DestroyTask(Rfu.unk_66);
}
@@ -2441,35 +2461,35 @@ static void sub_80FBB74(void)
UpdatePaletteFade();
}
-void sub_80FBB8C(u32 a0)
+void InitializeRfuLinkManager_LinkLeader(u32 availSlots)
{
- Rfu.unk_0c = 1;
- sub_80FAF1C();
- sub_80FD430(sub_80FB184, NULL);
+ Rfu.parent_child = MODE_PARENT;
+ CopyPlayerNameToUnameBuffer();
+ rfu_LMAN_initializeManager(LmanCallback_Parent2, NULL);
sRfuReqConfig = sRfuReqConfigTemplate;
- sRfuReqConfig.availSlotFlag = sAvailSlots[a0 - 1];
- sub_80F8E74();
+ sRfuReqConfig.availSlot_flag = sAvailSlots[availSlots - 1];
+ CreateTask_LinkLeaderSearchForChildren();
}
-void sub_80FBBD8(void)
+void InitializeRfuLinkManager_JoinGroup(void)
{
- Rfu.unk_0c = 0;
- sub_80FAF1C();
- sub_80FD430(sub_80FB37C, sub_80F8D20);
- sub_80F8F10();
+ Rfu.parent_child = MODE_CHILD;
+ CopyPlayerNameToUnameBuffer();
+ rfu_LMAN_initializeManager(LmanCallback_Child, MscCallback_Child);
+ CreateTask_JoinGroupSearchForParent();
}
-void sub_80FBC00(void)
+void InitializeRfuLinkManager_EnterUnionRoom(void)
{
if (gQuestLogState == 2 || gQuestLogState == 3)
return;
- Rfu.unk_0c = 2;
- sub_80FAF1C();
- sub_80FD430(sub_80FB5EC, NULL);
+ Rfu.parent_child = 2;
+ CopyPlayerNameToUnameBuffer();
+ rfu_LMAN_initializeManager(LmanCallback_Parent, NULL);
sRfuReqConfig = sRfuReqConfigTemplate;
- sRfuReqConfig.unk_11 = 0;
- sRfuReqConfig.unk_12 = 0x258;
- Rfu.unk_67 = CreateTask(sub_80F8B34, 1);
+ sRfuReqConfig.linkRecovery_enable = 0;
+ sRfuReqConfig.linkRecovery_period = 600;
+ Rfu.unk_67 = CreateTask(Task_LinkRfu_UnionRoomListen, 1);
}
static u16 ReadU16(const void *ptr)
@@ -2478,17 +2498,24 @@ static u16 ReadU16(const void *ptr)
return (ptr_[1] << 8) | (ptr_[0]);
}
-static u8 sub_80FBC70(const u8 *a0, u16 a1)
+/*
+ * ================================================================
+ * Looks up the player by uname and pid. Returns the index in
+ * gRfuLinkStatus->partner of the first match with a valid slot ID.
+ * Returns 0xFF if not found.
+ * ================================================================
+ */
+static u8 GetPartnerIndexByNameAndTrainerID(const u8 *trainerName, u16 trainerId)
{
u8 i;
u8 ret = 0xFF;
for (i = 0; i < RFU_CHILD_MAX; i++)
{
- u16 trainerId = ReadU16(((struct GFtgtGname *)gRfuLinkStatus->partner[i].gname)->unk_00.playerTrainerId);
- if (sub_80FA44C(gRfuLinkStatus->partner[i].serialNo)
- && !StringCompare(a0, gRfuLinkStatus->partner[i].uname)
- && a1 == trainerId)
+ u16 partnerTrainerId = ReadU16(((struct GFtgtGname *)gRfuLinkStatus->partner[i].gname)->unk_00.playerTrainerId);
+ if (RfuSerialNumberIsValid(gRfuLinkStatus->partner[i].serialNo)
+ && !StringCompare(trainerName, gRfuLinkStatus->partner[i].uname)
+ && trainerId == partnerTrainerId)
{
ret = i;
if (gRfuLinkStatus->partner[i].slot != 0xFF)
@@ -2499,21 +2526,21 @@ static u8 sub_80FBC70(const u8 *a0, u16 a1)
return ret;
}
-static void sub_80FBCF8(u32 a0)
+static void RfuReqDisconnectSlot(u32 bmDisconnectSlot)
{
- rfu_REQ_disconnect(a0);
+ rfu_REQ_disconnect(bmDisconnectSlot);
rfu_waitREQComplete();
- Rfu.unk_ce2 &= ~(a0);
+ Rfu.bm_PartnerFlags &= ~(bmDisconnectSlot);
rfu_clearSlot(TYPE_UNI_SEND, Rfu.unk_cda);
- rfu_UNI_setSendData(Rfu.unk_ce2, Rfu.unk_c87, 70);
- Rfu.unk_cda = sub_80F886C(Rfu.unk_ce2);
+ rfu_UNI_setSendData(Rfu.bm_PartnerFlags, Rfu.recvCmds, 70);
+ Rfu.unk_cda = sub_80F886C(Rfu.bm_PartnerFlags);
}
-void sub_80FBD4C(const u8 *ptr, u16 a1)
+void RequestDisconnectSlotByTrainerNameAndId(const u8 *trainerName, u16 trainerId)
{
- u8 var = sub_80FBC70(ptr, a1);
+ u8 var = GetPartnerIndexByNameAndTrainerID(trainerName, trainerId);
if (var != 0xFF)
- sub_80FBCF8(1 << var);
+ RfuReqDisconnectSlot(1 << var);
}
void sub_80FBD6C(u32 a0)
@@ -2525,7 +2552,7 @@ void sub_80FBD6C(u32 a0)
for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (Rfu.unk_cde[i] == a0 && (Rfu.unk_ce2 >> i) & 1)
+ if (Rfu.linkPlayerIdx[i] == a0 && (Rfu.bm_PartnerFlags >> i) & 1)
var |= 1 << i;
}
if (var)
@@ -2537,7 +2564,7 @@ static void sub_80FBDB8(u8 taskId)
{
if (gSendCmd[0] == 0 && !Rfu.unk_ce8)
{
- sub_80F9D04(0xED00);
+ RfuPrepareSendBuffer(RFU_COMMAND_0xed00);
gSendCmd[1] = gTasks[taskId].data[0];
gSendCmd[2] = gTasks[taskId].data[1];
Rfu.playerCount -= gUnknown_843EC41[gTasks[taskId].data[0]];
@@ -2562,35 +2589,35 @@ static void sub_80FBE20(u32 a0, u32 a1)
gTasks[taskId].data[1] = a1;
}
-static void sub_80FBE80(u8 taskId)
+static void Task_RfuReconnectWithParent(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- if (sub_80F8EA4())
+ if (RfuStateIs7AndPlayerIsChild())
{
- u8 id = sub_80FBC70((u8*)data, ReadU16(&data[8]));
+ u8 id = GetPartnerIndexByNameAndTrainerID((u8*)data, ReadU16(&data[8]));
if (id != 0xFF)
{
if (gRfuLinkStatus->partner[id].slot != 0xFF)
{
- Rfu.unk_c3d = id;
- if (sub_80F8ECC())
+ Rfu.reconnectedParentIdx = id;
+ if (IsParentSuccessfullyReconnected())
DestroyTask(taskId);
}
- else if (sub_80F9800()->unk_0a_0 == 0x15 || sub_80F9800()->unk_0a_0 == 0x16)
+ else if (GetHostRFUtgtGname()->activity == ACTIVITY_WCARD2 || GetHostRFUtgtGname()->activity == ACTIVITY_WNEWS2)
{
data[15]++;
}
else
{
- sub_80FB9E4(2, 0x7000);
+ RfuSetErrorStatus(2, 0x7000);
DestroyTask(taskId);
}
}
else
{
data[15]++;
- Rfu.unk_c3d = id;
+ Rfu.reconnectedParentIdx = id;
}
}
else
@@ -2600,47 +2627,47 @@ static void sub_80FBE80(u8 taskId)
if (data[15] > 240)
{
- sub_80FB9E4(2, 0x7000);
+ RfuSetErrorStatus(2, 0x7000);
DestroyTask(taskId);
}
}
-void sub_80FBF54(const u8 *src, u16 trainerId)
+void CreateTask_RfuReconnectWithParent(const u8 *trainerName, u16 trainerId)
{
u8 taskId;
s16 *data;
Rfu.unk_f1 = 0;
- taskId = CreateTask(sub_80FBE80, 3);
+ taskId = CreateTask(Task_RfuReconnectWithParent, 3);
data = gTasks[taskId].data;
- StringCopy((u8*)(data), src);
+ StringCopy((u8*)(data), trainerName);
data[8] = trainerId;
}
-static bool32 sub_80FBF98(s16 a1, struct GFtgtGname *structPtr)
+static bool32 ShouldRejectPartnerConnectionBasedOnActivity(s16 activity, struct GFtgtGname *partnerGname)
{
- if (sub_80F9800()->unk_0a_0 == 0x45)
+ if (GetHostRFUtgtGname()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM))
{
- if (structPtr->unk_0a_0 != 0x45)
+ if (partnerGname->activity != (ACTIVITY_CHAT | IN_UNION_ROOM))
return TRUE;
}
- else if (structPtr->unk_0a_0 != 0x40)
+ else if (partnerGname->activity != IN_UNION_ROOM)
{
return TRUE;
}
- else if (a1 == 0x44)
+ else if (activity == (ACTIVITY_TRADE | IN_UNION_ROOM))
{
- struct GFtgtGname *structPtr2 = (struct GFtgtGname *)&Rfu.unk_104.gname;
- if (structPtr2->species == SPECIES_EGG)
+ struct GFtgtGname *myTradeGname = (struct GFtgtGname *)&Rfu.unk_104.gname;
+ if (myTradeGname->species == SPECIES_EGG)
{
- if (structPtr->species == structPtr2->species)
+ if (partnerGname->species == myTradeGname->species)
return FALSE;
else
return TRUE;
}
- else if (structPtr->species != structPtr2->species
- || structPtr->level != structPtr2->level
- || structPtr->type != structPtr2->type)
+ else if (partnerGname->species != myTradeGname->species
+ || partnerGname->level != myTradeGname->level
+ || partnerGname->type != myTradeGname->type)
{
return TRUE;
}
@@ -2656,34 +2683,34 @@ static void sub_80FC028(u8 taskId)
if (++gTasks[taskId].data[0] > 300)
{
- sub_80FB9E4(2, 0x7000);
+ RfuSetErrorStatus(2, 0x7000);
DestroyTask(taskId);
}
- if (Rfu.unk_ccd != 0 && gUnknown_3005E10.unk_06 == 0)
+ if (Rfu.parentId != 0 && lman.parent_child == MODE_CHILD)
{
u16 trainerId = ReadU16(((struct GFtgtGname *)&Rfu.unk_104.gname)->unk_00.playerTrainerId);
- u8 id = sub_80FBC70(Rfu.unk_104.uname, trainerId);
+ u8 id = GetPartnerIndexByNameAndTrainerID(Rfu.unk_104.uname, trainerId);
if (id != 0xFF)
{
- if (!sub_80FBF98(gTasks[taskId].data[1], (struct GFtgtGname *)&gRfuLinkStatus->partner[id].gname))
+ if (!ShouldRejectPartnerConnectionBasedOnActivity(gTasks[taskId].data[1], (struct GFtgtGname *)&gRfuLinkStatus->partner[id].gname))
{
- if (gRfuLinkStatus->partner[id].slot != 0xFF && !sub_80FD610(gRfuLinkStatus->partner[id].id, 0x5A))
+ if (gRfuLinkStatus->partner[id].slot != 0xFF && !rfu_LMAN_CHILD_connectParent(gRfuLinkStatus->partner[id].id, 90))
{
- Rfu.unk_04 = 0xA;
+ Rfu.state = 10;
DestroyTask(taskId);
}
}
else
{
- sub_80FB9E4(2, 0x7000);
+ RfuSetErrorStatus(2, 0x7000);
DestroyTask(taskId);
}
}
}
}
-void sub_80FC114(const u8 *name, struct GFtgtGname *structPtr, u8 a2)
+void sub_80FC114(const u8 *name, struct GFtgtGname *structPtr, u8 activity)
{
u8 taskId, taskId2;
@@ -2691,11 +2718,11 @@ void sub_80FC114(const u8 *name, struct GFtgtGname *structPtr, u8 a2)
Rfu.unk_f1 = 0;
StringCopy(Rfu.unk_104.uname, name);
memcpy(Rfu.unk_104.gname, structPtr, RFU_GAME_NAME_LENGTH);
- sub_80FEB3C();
+ rfu_LMAN_forceChangeSP();
taskId = CreateTask(sub_80FC028, 2);
- gTasks[taskId].data[1] = a2;
- taskId2 = FindTaskIdByFunc(sub_80F8B34);
- if (a2 == 0x45)
+ gTasks[taskId].data[1] = activity;
+ taskId2 = FindTaskIdByFunc(Task_LinkRfu_UnionRoomListen);
+ if (activity == (ACTIVITY_CHAT | IN_UNION_ROOM))
{
if (taskId2 != 0xFF)
gTasks[taskId2].data[7] = 1;
@@ -2709,7 +2736,7 @@ void sub_80FC114(const u8 *name, struct GFtgtGname *structPtr, u8 a2)
bool8 sub_80FC1B0(void)
{
- if (Rfu.unk_f0 == 1)
+ if (Rfu.linkLossRecoveryState == 1)
return TRUE;
else
return FALSE;
@@ -2721,19 +2748,19 @@ bool32 sub_80FC1CC(void)
for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if ((gUnknown_3005E10.unk_00 >> i) & 1 && Rfu.unk_cd1[i] == 0)
+ if ((lman.acceptSlot_flag >> i) & 1 && Rfu.unk_cd1[i] == 0)
return FALSE;
}
return TRUE;
}
-static void sub_80FC208(void)
+static void rfu_dbg_clear(void)
{
s32 i;
for (i = 0; i < 20; i++)
- nullsub_87(" ", 0, i);
+ rfu_dbg_print_str(" ", 0, i);
}
static const char gUnknown_843EE47[16] = {
@@ -2749,44 +2776,44 @@ static const char gUnknown_843EE57[9] = {
static const char gUnknown_843EE60[] = {' ', '\0'};
static const char gUnknown_843EE62[] = {'*', '\0'};
-static void sub_80FC228(void)
+static void rfu_dbg_print_status(void)
{
s32 i, j;
- nullsub_88(GetBlockReceivedStatus(), 0x1C, 0x13, 2);
- nullsub_88(gRfuLinkStatus->connSlotFlag, 0x14, 1, 1);
- nullsub_88(gRfuLinkStatus->linkLossSlotFlag, 0x17, 1, 1);
- if (Rfu.unk_0c == 1)
+ rfu_dbg_print_num(GetBlockReceivedStatus(), 0x1C, 0x13, 2);
+ rfu_dbg_print_num(gRfuLinkStatus->connSlotFlag, 0x14, 1, 1);
+ rfu_dbg_print_num(gRfuLinkStatus->linkLossSlotFlag, 0x17, 1, 1);
+ if (Rfu.parent_child == MODE_PARENT)
{
for (i = 0; i < RFU_CHILD_MAX; i++)
{
if ((gRfuLinkStatus->getNameFlag >> i) & 1)
{
- nullsub_88(gRfuLinkStatus->partner[i].serialNo, 1, i + 3, 4);
- nullsub_87((void*) &gRfuLinkStatus->partner[i].gname, 6, i + 3);
- nullsub_87(gRfuLinkStatus->partner[i].uname, 0x16, i + 3);
+ rfu_dbg_print_num(gRfuLinkStatus->partner[i].serialNo, 1, i + 3, 4);
+ rfu_dbg_print_str((void*) &gRfuLinkStatus->partner[i].gname, 6, i + 3);
+ rfu_dbg_print_str(gRfuLinkStatus->partner[i].uname, 0x16, i + 3);
}
}
for (i = 0; i < RFU_CHILD_MAX; i++)
{
for (j = 0; j < 14; j++)
{
- nullsub_88(Rfu.unk_14[i][j], j * 2, i + 11, 2);
+ rfu_dbg_print_num(Rfu.unk_14[i][j], j * 2, i + 11, 2);
}
}
- nullsub_87("NOWSLOT", 1, 0xF);
+ rfu_dbg_print_str("NOWSLOT", 1, 0xF);
}
else if (gRfuLinkStatus->connSlotFlag != 0 && gRfuLinkStatus->getNameFlag != 0)
{
for (i = 0; i < RFU_CHILD_MAX; i++)
{
- nullsub_88(0, 1, i + 3, 4);
- nullsub_87(gUnknown_843EE47, 6, i + 3);
- nullsub_87(gUnknown_843EE57, 0x16, i + 3);
+ rfu_dbg_print_num(0, 1, i + 3, 4);
+ rfu_dbg_print_str(gUnknown_843EE47, 6, i + 3);
+ rfu_dbg_print_str(gUnknown_843EE57, 0x16, i + 3);
}
- nullsub_88(gRfuLinkStatus->partner[Rfu.unk_c3e].serialNo, 1, 3, 4);
- nullsub_87(gRfuLinkStatus->partner[Rfu.unk_c3e].gname, 6, 3);
- nullsub_87(gRfuLinkStatus->partner[Rfu.unk_c3e].uname, 0x16, 3);
+ rfu_dbg_print_num(gRfuLinkStatus->partner[Rfu.child_slot].serialNo, 1, 3, 4);
+ rfu_dbg_print_str(gRfuLinkStatus->partner[Rfu.child_slot].gname, 6, 3);
+ rfu_dbg_print_str(gRfuLinkStatus->partner[Rfu.child_slot].uname, 0x16, 3);
}
else
{
@@ -2794,16 +2821,16 @@ static void sub_80FC228(void)
{
if (gRfuLinkStatus->partner[i].slot != 0xFF)
{
- nullsub_88(gRfuLinkStatus->partner[i].serialNo, 1, i + 3, 4);
- nullsub_88(gRfuLinkStatus->partner[i].id, 6, i + 3, 4);
- nullsub_87(gRfuLinkStatus->partner[i].uname, 0x16, i + 3);
+ rfu_dbg_print_num(gRfuLinkStatus->partner[i].serialNo, 1, i + 3, 4);
+ rfu_dbg_print_num(gRfuLinkStatus->partner[i].id, 6, i + 3, 4);
+ rfu_dbg_print_str(gRfuLinkStatus->partner[i].uname, 0x16, i + 3);
}
}
for (; i < RFU_CHILD_MAX; i++)
{
- nullsub_88(0, 1, i + 3, 4);
- nullsub_87(gUnknown_843EE47, 6, i + 3);
- nullsub_87(gUnknown_843EE57, 0x16, i + 3);
+ rfu_dbg_print_num(0, 1, i + 3, 4);
+ rfu_dbg_print_str(gUnknown_843EE47, 6, i + 3);
+ rfu_dbg_print_str(gUnknown_843EE57, 0x16, i + 3);
}
}
}
@@ -2824,15 +2851,15 @@ static const char gUnknown_843EEA8[][8] = {
static u32 sub_80FC44C(void)
{
- return Rfu.unk_9e8.unk_232;
+ return Rfu.unk_9e8.count;
}
u32 GetRfuRecvQueueLength(void)
{
- return Rfu.unk_124.unk_8c2;
+ return Rfu.unk_124.count;
}
-static void nullsub_89(u8 taskId)
+static void Task_idle(u8 taskId)
{
}
diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c
index 69b6603a8..d3f6e93db 100644
--- a/src/link_rfu_3.c
+++ b/src/link_rfu_3.c
@@ -166,7 +166,7 @@ static const struct SpriteTemplate sWirelessStatusIndicatorSpriteTemplate = {
SpriteCallbackDummy
};
-void sub_80FC478(struct UnkRfuStruct_2_Sub_124 *ptr)
+void RFU_queue_20_70_reset(struct UnkRfuStruct_2_Sub_124 *queue)
{
s32 i;
s32 j;
@@ -175,16 +175,16 @@ void sub_80FC478(struct UnkRfuStruct_2_Sub_124 *ptr)
{
for (j = 0; j < 70; j++)
{
- ptr->unk_00[i][j] = 0;
+ queue->slots[i][j] = 0;
}
}
- ptr->unk_8c1 = 0;
- ptr->unk_8c0 = 0;
- ptr->unk_8c2 = 0;
- ptr->unk_8c3 = 0;
+ queue->send_slot = 0;
+ queue->recv_slot = 0;
+ queue->count = 0;
+ queue->full = 0;
}
-void sub_80FC4D4(struct UnkRfuStruct_2_Sub_9e8 *ptr)
+void RFU_queue_40_14_reset(struct UnkRfuStruct_2_Sub_9e8 *ptr)
{
s32 i;
s32 j;
@@ -193,16 +193,16 @@ void sub_80FC4D4(struct UnkRfuStruct_2_Sub_9e8 *ptr)
{
for (j = 0; j < 14; j++)
{
- ptr->unk_00[i][j] = 0;
+ ptr->slots[i][j] = 0;
}
}
- ptr->unk_231 = 0;
- ptr->unk_230 = 0;
- ptr->unk_232 = 0;
- ptr->unk_233 = 0;
+ ptr->send_slot = 0;
+ ptr->recv_slot = 0;
+ ptr->count = 0;
+ ptr->full = 0;
}
-static void sub_80FC530(struct UnkRfuStruct_Sub_Unused *ptr)
+static void RFU_queue_2_256_reset(struct UnkRfuStruct_Sub_Unused *ptr)
{
s32 i;
s32 j;
@@ -211,29 +211,29 @@ static void sub_80FC530(struct UnkRfuStruct_Sub_Unused *ptr)
{
for (j = 0; j < 256; j++)
{
- ptr->unk_00[i][j] = 0;
+ ptr->slots[i][j] = 0;
}
}
- ptr->unk_201 = 0;
- ptr->unk_200 = 0;
- ptr->unk_202 = 0;
- ptr->unk_203 = 0;
+ ptr->send_slot = 0;
+ ptr->recv_slot = 0;
+ ptr->count = 0;
+ ptr->full = 0;
}
-void sub_80FC588(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2)
+void RFU_queue_20_70_recv(struct UnkRfuStruct_2_Sub_124 *queue, u8 *data)
{
s32 i;
u16 imeBak;
u8 count;
- if (q1->unk_8c2 < 20)
+ if (queue->count < 20)
{
imeBak = REG_IME;
REG_IME = 0;
count = 0;
for (i = 0; i < 70; i += 14)
{
- if (q2[i] == 0 && q2[i + 1] == 0)
+ if (data[i] == 0 && data[i + 1] == 0)
{
count++;
}
@@ -242,36 +242,36 @@ void sub_80FC588(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2)
{
for (i = 0; i < 70; i++)
{
- q1->unk_00[q1->unk_8c0][i] = q2[i];
+ queue->slots[queue->recv_slot][i] = data[i];
}
- q1->unk_8c0++;
- q1->unk_8c0 %= 20;
- q1->unk_8c2++;
+ queue->recv_slot++;
+ queue->recv_slot %= 20;
+ queue->count++;
for (i = 0; i < 70; i++)
{
- q2[i] = 0;
+ data[i] = 0;
}
}
REG_IME = imeBak;
}
else
{
- q1->unk_8c3 = 1;
+ queue->full = 1;
}
}
-void sub_80FC63C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2)
+void RFU_queue_40_14_recv(struct UnkRfuStruct_2_Sub_9e8 *queue, u8 *data)
{
s32 i;
u16 imeBak;
- if (q1->unk_232 < 40)
+ if (queue->count < 40)
{
imeBak = REG_IME;
REG_IME = 0;
for (i = 0; i < 14; i++)
{
- if (q2[i] != 0)
+ if (data[i] != 0)
{
break;
}
@@ -280,57 +280,57 @@ void sub_80FC63C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2)
{
for (i = 0; i < 14; i++)
{
- q1->unk_00[q1->unk_230][i] = q2[i];
+ queue->slots[queue->recv_slot][i] = data[i];
}
- q1->unk_230++;
- q1->unk_230 %= 40;
- q1->unk_232++;
+ queue->recv_slot++;
+ queue->recv_slot %= 40;
+ queue->count++;
for (i = 0; i < 14; i++)
{
- q2[i] = 0;
+ data[i] = 0;
}
}
REG_IME = imeBak;
}
else
{
- q1->unk_233 = 1;
+ queue->full = 1;
}
}
-bool8 sub_80FC6E8(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2)
+bool8 RFU_queue_20_70_send(struct UnkRfuStruct_2_Sub_124 *queue, u8 *dest)
{
u16 imeBak;
s32 i;
imeBak = REG_IME;
REG_IME = 0;
- if (q1->unk_8c0 == q1->unk_8c1 || q1->unk_8c3 != 0)
+ if (queue->recv_slot == queue->send_slot || queue->full)
{
for (i = 0; i < 70; i++)
{
- q2[i] = 0;
+ dest[i] = 0;
}
REG_IME = imeBak;
return FALSE;
}
for (i = 0; i < 70; i++)
{
- q2[i] = q1->unk_00[q1->unk_8c1][i];
+ dest[i] = queue->slots[queue->send_slot][i];
}
- q1->unk_8c1++;
- q1->unk_8c1 %= 20;
- q1->unk_8c2--;
+ queue->send_slot++;
+ queue->send_slot %= 20;
+ queue->count--;
REG_IME = imeBak;
return TRUE;
}
-bool8 sub_80FC79C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2)
+bool8 RFU_queue_40_14_send(struct UnkRfuStruct_2_Sub_9e8 *queue, u8 *dest)
{
s32 i;
u16 imeBak;
- if (q1->unk_230 == q1->unk_231 || q1->unk_233 != 0)
+ if (queue->recv_slot == queue->send_slot || queue->full != 0)
{
return FALSE;
}
@@ -338,98 +338,98 @@ bool8 sub_80FC79C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2)
REG_IME = 0;
for (i = 0; i < 14; i++)
{
- q2[i] = q1->unk_00[q1->unk_231][i];
+ dest[i] = queue->slots[queue->send_slot][i];
}
- q1->unk_231++;
- q1->unk_231 %= 40;
- q1->unk_232--;
+ queue->send_slot++;
+ queue->send_slot %= 40;
+ queue->count--;
REG_IME = imeBak;
return TRUE;
}
-void sub_80FC828(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2)
+void RFU_queue_2_14_recv(struct UnkRfuStruct_2_Sub_c1c *queue, const u8 *data)
{
s32 i;
- if (q2[1] == 0)
+ if (data[1] == 0)
{
- sub_80FC888(q1, NULL);
+ RFU_queue_2_14_send(queue, NULL);
}
else
{
for (i = 0; i < 14; i++)
{
- q1->unk_00[q1->unk_1c][i] = q2[i];
+ queue->slots[queue->recv_slot][i] = data[i];
}
- q1->unk_1c++;
- q1->unk_1c %= 2;
- if (q1->unk_1e < 2)
+ queue->recv_slot++;
+ queue->recv_slot %= 2;
+ if (queue->count < 2)
{
- q1->unk_1e++;
+ queue->count++;
}
else
{
- q1->unk_1d = q1->unk_1c;
+ queue->send_slot = queue->recv_slot;
}
}
}
-bool8 sub_80FC888(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2)
+bool8 RFU_queue_2_14_send(struct UnkRfuStruct_2_Sub_c1c *queue, u8 *dest)
{
s32 i;
- if (q1->unk_1e == 0)
+ if (queue->count == 0)
{
return FALSE;
}
- if (q2 != NULL)
+ if (dest != NULL)
{
for (i = 0; i < 14; i++)
{
- q2[i] = q1->unk_00[q1->unk_1d][i];
+ dest[i] = queue->slots[queue->send_slot][i];
}
}
- q1->unk_1d++;
- q1->unk_1d %= 2;
- q1->unk_1e--;
+ queue->send_slot++;
+ queue->send_slot %= 2;
+ queue->count--;
return TRUE;
}
-static void sub_80FC8D8(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2)
+static void RFU_queue_2_256_recv(struct UnkRfuStruct_Sub_Unused *queue, u8 *data)
{
s32 i;
- if (q1->unk_202 < 2)
+ if (queue->count < 2)
{
for (i = 0; i < 256; i++)
{
- q1->unk_00[q1->unk_200][i] = q2[i];
+ queue->slots[queue->recv_slot][i] = data[i];
}
- q1->unk_200++;
- q1->unk_200 %= 2;
- q1->unk_202++;
+ queue->recv_slot++;
+ queue->recv_slot %= 2;
+ queue->count++;
}
else
{
- q1->unk_203 = 1;
+ queue->full = 1;
}
}
-static bool8 sub_80FC944(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2)
+static bool8 RFU_queue_2_256_send(struct UnkRfuStruct_Sub_Unused *queue, u8 *send)
{
s32 i;
- if (q1->unk_200 == q1->unk_201 || q1->unk_203)
+ if (queue->recv_slot == queue->send_slot || queue->full)
{
return FALSE;
}
for (i = 0; i < 256; i++)
{
- q2[i] = q1->unk_00[q1->unk_201][i];
+ send[i] = queue->slots[queue->send_slot][i];
}
- q1->unk_201++;
- q1->unk_201 %= 2;
- q1->unk_202--;
+ queue->send_slot++;
+ queue->send_slot %= 2;
+ queue->count--;
return TRUE;
}
@@ -438,7 +438,7 @@ static void sub_80FC9B8(u8 *q1, u8 mode)
s32 i;
u8 rval;
u16 r5 = 0;
- static u8 _3002018;
+ static u8 counter;
switch (mode)
{
@@ -470,11 +470,11 @@ static void sub_80FC9B8(u8 *q1, u8 mode)
case 3:
for (i = 0; i < 200; i++)
{
- q1[i] = i + 1 + _3002018;
- r5 += (i + 1 + _3002018) & 0xFF;
+ q1[i] = i + 1 + counter;
+ r5 += (i + 1 + counter) & 0xFF;
}
*((u16 *)(q1 + i)) = r5;
- _3002018++;
+ counter++;
break;
}
}
@@ -603,7 +603,7 @@ static u8 GetConnectedChildStrength(u8 maxFlags)
}
#endif
-void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 r2, s32 r3)
+void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 started, s32 child_sprite_genders)
{
s32 i;
@@ -613,30 +613,37 @@ void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 r2, s32 r3
}
for (i = 0; i < RFU_CHILD_MAX; i++)
{
- data->unk_04[i] = r3;
- r3 >>= 8;
+ data->child_sprite_gender[i] = child_sprite_genders;
+ child_sprite_genders >>= 8;
}
data->playerGender = gSaveBlock2Ptr->playerGender;
- data->unk_0a_0 = activity;
- data->unk_0a_7 = r2;
- data->unk_00.unk_00_0 = GAME_LANGUAGE;
- data->unk_00.unk_01_2 = GAME_VERSION;
- data->unk_00.unk_00_4 = 0;
- data->unk_00.unk_00_5 = 0;
+ data->activity = activity;
+ data->started = started;
+ data->unk_00.language = GAME_LANGUAGE;
+ data->unk_00.version = GAME_VERSION;
+ data->unk_00.hasNews = FALSE;
+ data->unk_00.hasCard = FALSE;
data->unk_00.unk_00_6 = 0;
data->unk_00.isChampion = FlagGet(FLAG_SYS_CAN_LINK_WITH_RS);
data->unk_00.hasNationalDex = IsNationalPokedexEnabled();
data->unk_00.gameClear = FlagGet(FLAG_SYS_GAME_CLEAR);
}
-bool8 sub_80FCC3C(struct GFtgtGname *gname, u8 *uname, u8 idx)
+/*
+ * ==========================================================
+ * Returns 1 if parent, 0 if child or neutral.
+ * If partner serial number is valid, copies gname and uname.
+ * Otherwise, blanks these.
+ * ==========================================================
+ */
+bool8 LinkRfu_GetNameIfCompatible(struct GFtgtGname *gname, u8 *uname, u8 idx)
{
bool8 retVal;
- if (gUnknown_3005E10.unk_06 == 1)
+ if (lman.parent_child == MODE_PARENT)
{
retVal = TRUE;
- if (sub_80FA44C(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1))
+ if (RfuSerialNumberIsValid(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1))
{
memcpy(gname, &gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);
memcpy(uname, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH);
@@ -650,7 +657,7 @@ bool8 sub_80FCC3C(struct GFtgtGname *gname, u8 *uname, u8 idx)
else
{
retVal = FALSE;
- if (sub_80FA44C(gRfuLinkStatus->partner[idx].serialNo))
+ if (RfuSerialNumberIsValid(gRfuLinkStatus->partner[idx].serialNo))
{
memcpy(gname, &gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);
memcpy(uname, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH);
@@ -664,7 +671,13 @@ bool8 sub_80FCC3C(struct GFtgtGname *gname, u8 *uname, u8 idx)
return retVal;
}
-bool8 sub_80FCCF4(struct GFtgtGname *gname, u8 *uname, u8 idx)
+/*
+ * ==========================================================
+ * Specific check for serial number 0x7F7D,
+ * which comes from ???
+ * ==========================================================
+ */
+bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *gname, u8 *uname, u8 idx)
{
bool8 retVal = FALSE;
if (gRfuLinkStatus->partner[idx].serialNo == 0x7F7D)
@@ -824,7 +837,7 @@ void UpdateWirelessStatusIndicatorSprite(void)
gMain.oamBuffer[125].paletteNum = sprite->oam.paletteNum;
gMain.oamBuffer[125].tileNum = sprite->data[6] + sprite->anims[sprite->data[2]][sprite->data[4]].frame.imageValue;
CpuCopy16(gMain.oamBuffer + 125, (struct OamData *)OAM + 125, sizeof(struct OamData));
- if (sub_80FB9F4() == 1)
+ if (RfuGetErrorStatus() == 1)
{
DestroyWirelessStatusIndicatorSprite();
}
diff --git a/src/list_menu.c b/src/list_menu.c
index 6c4d50961..9439d712c 100644
--- a/src/list_menu.c
+++ b/src/list_menu.c
@@ -8,9 +8,7 @@
#include "main.h"
#include "task.h"
#include "graphics.h"
-#include "decompress.h"
#include "palette.h"
-#include "malloc.h"
#include "strings.h"
#include "sound.h"
#include "pokemon_icon.h"
@@ -258,7 +256,7 @@ void DestroyListMenuTask(u8 listTaskId, u16 *cursorPos, u16 *itemsAbove)
if (itemsAbove != NULL)
*itemsAbove = list->itemsAbove;
- if (list->taskId != TASK_NONE)
+ if (list->taskId != TAIL_SENTINEL)
ListMenuRemoveCursorObject(list->taskId, list->template.cursorKind - 2);
DestroyTask(listTaskId);
@@ -348,7 +346,7 @@ static u8 ListMenuInitInternal(const struct ListMenuTemplate *listMenuTemplate,
list->itemsAbove = itemsAbove;
list->unk_1C = 0;
list->unk_1D = 0;
- list->taskId = TASK_NONE;
+ list->taskId = TAIL_SENTINEL;
list->unk_1F = 0;
gListMenuOverride.cursorPal = list->template.cursorPal;
gListMenuOverride.fillValue = list->template.fillValue;
@@ -415,17 +413,17 @@ static void ListMenuDrawCursor(struct ListMenu *list)
switch (list->template.cursorKind)
{
case 0:
- ListMenuPrint(list, gFameCheckerText_ListMenuCursor, x, y);
+ ListMenuPrint(list, gText_SelectorArrow2, x, y);
break;
case 1:
break;
case 2:
- if (list->taskId == TASK_NONE)
+ if (list->taskId == TAIL_SENTINEL)
list->taskId = ListMenuAddCursorObject(list, 0);
ListMenuUpdateCursorObject(list->taskId, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 - 1, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y - 1, 0);
break;
case 3:
- if (list->taskId == TASK_NONE)
+ if (list->taskId == TAIL_SENTINEL)
list->taskId = ListMenuAddCursorObject(list, 1);
ListMenuUpdateCursorObject(list->taskId, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 + x, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y, 1);
break;
@@ -763,7 +761,7 @@ void sub_8107CF8(u8 windowId, u16 speciesId, u32 personality, u16 x, u16 y)
BlitBitmapToWindow(windowId, GetMonIconPtr(speciesId, personality, 1), x, y, 32, 32);
}
-void sub_8107D38(u8 palOffset, u8 palId)
+void ListMenuLoadStdPalAt(u8 palOffset, u8 palId)
{
const u16 *palette;
diff --git a/src/load_save.c b/src/load_save.c
index 9c30494f8..7ab28ffc3 100644
--- a/src/load_save.c
+++ b/src/load_save.c
@@ -8,7 +8,6 @@
#include "item.h"
#include "save_location.h"
#include "berry_powder.h"
-#include "item.h"
#include "overworld.h"
#include "quest_log.h"
@@ -284,8 +283,8 @@ void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey)
{
int i;
- for(i = 0; i < 4; i++)
- ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->unkArray[i].unk4, encryptionKey);
+ for(i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++)
+ ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->trainerTower[i].bestTime, encryptionKey);
sub_8054F38(encryptionKey);
ApplyNewEncryptionKeyToBagItems_(encryptionKey);
diff --git a/src/mail.c b/src/mail.c
index dbdf48ac7..b5c0343b3 100644
--- a/src/mail.c
+++ b/src/mail.c
@@ -506,10 +506,10 @@ static bool8 DoInitMailView(void)
SetVBlankCallback(NULL);
ScanlineEffect_Stop();
SetGpuReg(REG_OFFSET_DISPCNT, 0);
- if (gPlayerPcMenuManager.unk_9 == 0)
- HelpSystem_SetSomeVariable2(34);
+ if (gPlayerPcMenuManager.notInRoom == FALSE)
+ SetHelpContext(HELPCONTEXT_BEDROOM_PC_MAILBOX);
else
- HelpSystem_SetSomeVariable2(30);
+ SetHelpContext(HELPCONTEXT_PLAYERS_PC_MAILBOX);
break;
case 1:
CpuFill16(0, (void *)OAM, OAM_SIZE);
diff --git a/src/main.c b/src/main.c
index b88326cda..77f668e6f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -9,7 +9,6 @@
#include "random.h"
#include "dma3.h"
#include "gba/flash_internal.h"
-#include "battle.h"
#include "help_system.h"
#include "sound.h"
#include "new_menu_helpers.h"
@@ -17,12 +16,11 @@
#include "overworld.h"
#include "sprite.h"
#include "play_time.h"
-#include "pokemon.h"
#include "intro.h"
#include "battle_controllers.h"
#include "scanline_effect.h"
#include "save_failed_screen.h"
-#include "battle.h"
+#include "quest_log.h"
extern u32 intr_main[];
@@ -80,9 +78,6 @@ static IntrFunc * const sTimerIntrFunc = gIntrTable + 0x7;
EWRAM_DATA u8 gDecompressionBuffer[0x4000] = {0};
EWRAM_DATA u16 gTrainerId = 0;
-extern bool8 gWirelessCommType;
-extern bool8 gUnknown_3005E88;
-
static void UpdateLinkAndCallCallbacks(void);
static void InitMainCallbacks(void);
static void CallCallbacks(void);
@@ -181,7 +176,7 @@ static void InitMainCallbacks(void)
gSaveBlock2Ptr = &gSaveBlock2;
gSaveBlock1Ptr = &gSaveBlock1;
gSaveBlock2.encryptionKey = 0;
- gUnknown_3005E88 = FALSE;
+ gUnknown_3005E88 = 0;
}
static void CallCallbacks(void)
diff --git a/src/map_preview_screen.c b/src/map_preview_screen.c
index bb748ae91..1788b17cc 100644
--- a/src/map_preview_screen.c
+++ b/src/map_preview_screen.c
@@ -14,12 +14,12 @@
#include "overworld.h"
#include "event_data.h"
#include "map_preview_screen.h"
-#include "constants/region_map.h"
+#include "constants/region_map_sections.h"
-static EWRAM_DATA bool8 gUnknown_203ABEC = FALSE;
-static EWRAM_DATA bool8 gUnknown_203ABED = FALSE;
+static EWRAM_DATA bool8 sHasVisitedMapBefore = FALSE;
+static EWRAM_DATA bool8 sAllocedBg0TilemapBuffer = FALSE;
-static void sub_80F83D0(u8 taskId);
+static void Task_RunMapPreviewScreenForest(u8 taskId);
static const u8 gViridianForestMapPreviewPalette[] = INCBIN_U8("data/map_preview/viridian_forest_pal.gbapal");
static const u8 gViridianForestMapPreviewTiles[] = INCBIN_U8("data/map_preview/viridian_forest_tiles.4bpp.lz");
@@ -88,7 +88,7 @@ static const u8 gAlteringCaveMapPreviewTilemap[] = INCBIN_U8("data/map_preview/a
static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
[MPS_VIRIDIAN_FOREST] = {
.mapsec = MAPSEC_VIRIDIAN_FOREST,
- .forceFirstTime = TRUE,
+ .type = MPS_TYPE_FOREST,
.flagId = FLAG_WORLD_MAP_VIRIDIAN_FOREST,
.tilesptr = gViridianForestMapPreviewTiles,
.tilemapptr = gViridianForestMapPreviewTilemap,
@@ -96,7 +96,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_MT_MOON] = {
.mapsec = MAPSEC_MT_MOON,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_MT_MOON_1F,
.tilesptr = gMtMoonMapPreviewTiles,
.tilemapptr = gMtMoonMapPreviewTilemap,
@@ -104,7 +104,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_DIGLETTS_CAVE] = {
.mapsec = MAPSEC_DIGLETTS_CAVE,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_DIGLETTS_CAVE_B1F,
.tilesptr = gDiglettsCaveMapPreviewTiles,
.tilemapptr = gDiglettsCaveMapPreviewTilemap,
@@ -112,7 +112,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_ROCK_TUNNEL] = {
.mapsec = MAPSEC_ROCK_TUNNEL,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_ROCK_TUNNEL_1F,
.tilesptr = gRockTunnelMapPreviewTiles,
.tilemapptr = gRockTunnelMapPreviewTilemap,
@@ -120,7 +120,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_POKEMON_TOWER] = {
.mapsec = MAPSEC_POKEMON_TOWER,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_POKEMON_TOWER_1F,
.tilesptr = gPokemonTowerMapPreviewTiles,
.tilemapptr = gPokemonTowerMapPreviewTilemap,
@@ -128,7 +128,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_SAFARI_ZONE] = {
.mapsec = MAPSEC_KANTO_SAFARI_ZONE,
- .forceFirstTime = TRUE,
+ .type = MPS_TYPE_FOREST,
.flagId = FLAG_WORLD_MAP_SAFARI_ZONE_CENTER,
.tilesptr = gKantoSafariZoneMapPreviewTiles,
.tilemapptr = gKantoSafariZoneMapPreviewTilemap,
@@ -136,7 +136,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_SEAFOAM_ISLANDS] = {
.mapsec = MAPSEC_SEAFOAM_ISLANDS,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_SEAFOAM_ISLANDS_1F,
.tilesptr = gSeafoamIslandsMapPreviewTiles,
.tilemapptr = gSeafoamIslandsMapPreviewTilemap,
@@ -144,7 +144,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_POKEMON_MANSION] = {
.mapsec = MAPSEC_POKEMON_MANSION,
- .forceFirstTime = TRUE,
+ .type = MPS_TYPE_FOREST,
.flagId = FLAG_WORLD_MAP_POKEMON_MANSION_1F,
.tilesptr = gPokemonMansionMapPreviewTiles,
.tilemapptr = gPokemonMansionMapPreviewTilemap,
@@ -152,7 +152,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_ROCKET_HIDEOUT] = {
.mapsec = MAPSEC_ROCKET_HIDEOUT,
- .forceFirstTime = TRUE,
+ .type = MPS_TYPE_FOREST,
.flagId = FLAG_WORLD_MAP_ROCKET_HIDEOUT_B1F,
.tilesptr = gRocketHideoutMapPreviewTiles,
.tilemapptr = gRocketHideoutMapPreviewTilemap,
@@ -160,7 +160,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_SILPH_CO] = {
.mapsec = MAPSEC_SILPH_CO,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_SILPH_CO_1F,
.tilesptr = gSilphCoMapPreviewTiles,
.tilemapptr = gSilphCoMapPreviewTilemap,
@@ -168,7 +168,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_VICTORY_ROAD] = {
.mapsec = MAPSEC_KANTO_VICTORY_ROAD,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_VICTORY_ROAD_1F,
.tilesptr = gKantoVictoryRoadMapPreviewTiles,
.tilemapptr = gKantoVictoryRoadMapPreviewTilemap,
@@ -176,7 +176,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_CERULEAN_CAVE] = {
.mapsec = MAPSEC_CERULEAN_CAVE,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_CERULEAN_CAVE_1F,
.tilesptr = gCeruleanCaveMapPreviewTiles,
.tilemapptr = gCeruleanCaveMapPreviewTilemap,
@@ -184,7 +184,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_POWER_PLANT] = {
.mapsec = MAPSEC_POWER_PLANT,
- .forceFirstTime = TRUE,
+ .type = MPS_TYPE_FOREST,
.flagId = FLAG_WORLD_MAP_POWER_PLANT,
.tilesptr = gPowerPlantMapPreviewTiles,
.tilemapptr = gPowerPlantMapPreviewTilemap,
@@ -192,7 +192,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_MT_EMBER] = {
.mapsec = MAPSEC_MT_EMBER,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_MT_EMBER_EXTERIOR,
.tilesptr = gMtEmberMapPreviewTiles,
.tilemapptr = gMtEmberMapPreviewTilemap,
@@ -200,7 +200,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_ROCKET_WAREHOUSE] = {
.mapsec = MAPSEC_ROCKET_WAREHOUSE,
- .forceFirstTime = TRUE,
+ .type = MPS_TYPE_FOREST,
.flagId = FLAG_WORLD_MAP_THREE_ISLAND_BERRY_FOREST,
.tilesptr = gRocketWarehouseMapPreviewTiles,
.tilemapptr = gRocketWarehouseMapPreviewTilemap,
@@ -208,7 +208,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_MONEAN_CHAMBER] = {
.mapsec = MAPSEC_MONEAN_CHAMBER,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER,
.tilesptr = gMoneanChamberMapPreviewTiles,
.tilemapptr = gMoneanChamberMapPreviewTilemap,
@@ -216,7 +216,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_DOTTED_HOLE] = {
.mapsec = MAPSEC_DOTTED_HOLE,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_SIX_ISLAND_DOTTED_HOLE_1F,
.tilesptr = gDottedHoleMapPreviewTiles,
.tilemapptr = gDottedHoleMapPreviewTilemap,
@@ -224,7 +224,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_BERRY_FOREST] = {
.mapsec = MAPSEC_BERRY_FOREST,
- .forceFirstTime = TRUE,
+ .type = MPS_TYPE_FOREST,
.flagId = FLAG_WORLD_MAP_THREE_ISLAND_BERRY_FOREST,
.tilesptr = gBerryForestMapPreviewTiles,
.tilemapptr = gBerryForestMapPreviewTilemap,
@@ -232,7 +232,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_ICEFALL_CAVE] = {
.mapsec = MAPSEC_ICEFALL_CAVE,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE,
.tilesptr = gIcefallCaveMapPreviewTiles,
.tilemapptr = gIcefallCaveMapPreviewTilemap,
@@ -240,7 +240,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_LOST_CAVE] = {
.mapsec = MAPSEC_LOST_CAVE,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE,
.tilesptr = gLostCaveMapPreviewTiles,
.tilemapptr = gLostCaveMapPreviewTilemap,
@@ -248,7 +248,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_ALTERING_CAVE] = {
.mapsec = MAPSEC_ALTERING_CAVE,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_SIX_ISLAND_ALTERING_CAVE,
.tilesptr = gAlteringCaveMapPreviewTiles,
.tilemapptr = gAlteringCaveMapPreviewTilemap,
@@ -256,7 +256,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_PATTERN_BUSH] = {
.mapsec = MAPSEC_PATTERN_BUSH,
- .forceFirstTime = TRUE,
+ .type = MPS_TYPE_FOREST,
.flagId = FLAG_WORLD_MAP_SIX_ISLAND_PATTERN_BUSH,
.tilesptr = gViridianForestMapPreviewTiles,
.tilemapptr = gViridianForestMapPreviewTilemap,
@@ -264,7 +264,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_LIPTOO_CHAMBER] = {
.mapsec = MAPSEC_LIPTOO_CHAMBER,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER,
.tilesptr = gMoneanChamberMapPreviewTiles,
.tilemapptr = gMoneanChamberMapPreviewTilemap,
@@ -272,7 +272,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_WEEPTH_CHAMBER] = {
.mapsec = MAPSEC_WEEPTH_CHAMBER,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER,
.tilesptr = gMoneanChamberMapPreviewTiles,
.tilemapptr = gMoneanChamberMapPreviewTilemap,
@@ -280,7 +280,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_TDILFORD_CHAMBER] = {
.mapsec = MAPSEC_DILFORD_CHAMBER,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER,
.tilesptr = gMoneanChamberMapPreviewTiles,
.tilemapptr = gMoneanChamberMapPreviewTilemap,
@@ -288,7 +288,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_SCUFIB_CHAMBER] = {
.mapsec = MAPSEC_SCUFIB_CHAMBER,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER,
.tilesptr = gMoneanChamberMapPreviewTiles,
.tilemapptr = gMoneanChamberMapPreviewTilemap,
@@ -296,7 +296,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_RIXY_CHAMBER] = {
.mapsec = MAPSEC_RIXY_CHAMBER,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER,
.tilesptr = gMoneanChamberMapPreviewTiles,
.tilemapptr = gMoneanChamberMapPreviewTilemap,
@@ -304,7 +304,7 @@ static const struct MapPreviewScreen sMapPreviewScreenData[MPS_COUNT] = {
},
[MPS_VIAPOIS_CHAMBER] = {
.mapsec = MAPSEC_VIAPOIS_CHAMBER,
- .forceFirstTime = FALSE,
+ .type = MPS_TYPE_CAVE,
.flagId = FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER,
.tilesptr = gMoneanChamberMapPreviewTiles,
.tilemapptr = gMoneanChamberMapPreviewTilemap,
@@ -328,7 +328,7 @@ static const struct BgTemplate sMapPreviewBgTemplate[1] = {
}
};
-static u8 sub_80F80E4(u8 mapsec)
+static u8 GetMapPreviewScreenIdx(u8 mapsec)
{
s32 i;
@@ -342,20 +342,20 @@ static u8 sub_80F80E4(u8 mapsec)
return MPS_COUNT;
}
-bool8 sub_80F8110(u8 mapsec, u8 forceFirstTime)
+bool8 MapHasPreviewScreen(u8 mapsec, u8 type)
{
u8 idx;
- idx = sub_80F80E4(mapsec);
+ idx = GetMapPreviewScreenIdx(mapsec);
if (idx != MPS_COUNT)
{
- if (forceFirstTime == 2)
+ if (type == MPS_TYPE_ANY)
{
return TRUE;
}
else
{
- return sMapPreviewScreenData[idx].forceFirstTime == forceFirstTime ? TRUE : FALSE;
+ return sMapPreviewScreenData[idx].type == type ? TRUE : FALSE;
}
}
else
@@ -364,29 +364,29 @@ bool8 sub_80F8110(u8 mapsec, u8 forceFirstTime)
}
}
-bool8 sub_80F8154(u8 mapsec, u8 forceFirstTime)
+bool32 MapHasPreviewScreen_HandleQLState2(u8 mapsec, u8 type)
{
- if (gQuestLogState == 2)
+ if (gQuestLogState == QL_STATE_2)
{
return FALSE;
}
else
{
- return sub_80F8110(mapsec, forceFirstTime);
+ return MapHasPreviewScreen(mapsec, type);
}
}
-void sub_80F8180(void)
+void MapPreview_InitBgs(void)
{
InitBgsFromTemplates(0, sMapPreviewBgTemplate, NELEMS(sMapPreviewBgTemplate));
ShowBg(0);
}
-void sub_80F819C(u8 mapsec)
+void MapPreview_LoadGfx(u8 mapsec)
{
u8 idx;
- idx = sub_80F80E4(mapsec);
+ idx = GetMapPreviewScreenIdx(mapsec);
if (idx != MPS_COUNT)
{
ResetTempTileDataBuffers();
@@ -395,55 +395,55 @@ void sub_80F819C(u8 mapsec)
if (GetBgTilemapBuffer(0) == NULL)
{
SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE));
- gUnknown_203ABED = TRUE;
+ sAllocedBg0TilemapBuffer = TRUE;
}
else
{
- gUnknown_203ABED = FALSE;
+ sAllocedBg0TilemapBuffer = FALSE;
}
CopyToBgTilemapBuffer(0, sMapPreviewScreenData[idx].tilemapptr, 0, 0x000);
CopyBgTilemapBufferToVram(0);
}
}
-void sub_80F8234(s32 windowId)
+void MapPreview_Unload(s32 windowId)
{
RemoveWindow(windowId);
- if (gUnknown_203ABED)
+ if (sAllocedBg0TilemapBuffer)
{
Free(GetBgTilemapBuffer(0));
}
}
-bool32 sub_80F8258(void)
+bool32 MapPreview_IsGfxLoadFinished(void)
{
return FreeTempTileDataBuffersIfPossible();
}
-void sub_80F8268(u8 mapsec)
+void MapPreview_StartForestTransition(u8 mapsec)
{
u8 taskId;
- taskId = CreateTask(sub_80F83D0, 0);
+ taskId = CreateTask(Task_RunMapPreviewScreenForest, 0);
gTasks[taskId].data[2] = GetBgAttribute(0, BG_ATTR_PRIORITY);
gTasks[taskId].data[4] = GetGpuReg(REG_OFFSET_BLDCNT);
gTasks[taskId].data[5] = GetGpuReg(REG_OFFSET_BLDALPHA);
gTasks[taskId].data[3] = GetGpuReg(REG_OFFSET_DISPCNT);
gTasks[taskId].data[6] = GetGpuReg(REG_OFFSET_WININ);
gTasks[taskId].data[7] = GetGpuReg(REG_OFFSET_WINOUT);
- gTasks[taskId].data[10] = sub_80F856C(mapsec);
+ gTasks[taskId].data[10] = MapPreview_GetDuration(mapsec);
gTasks[taskId].data[8] = 16;
gTasks[taskId].data[9] = 0;
SetBgAttribute(0, BG_ATTR_PRIORITY, 0);
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
- SetGpuRegBits(REG_OFFSET_WININ, 0x2020);
- SetGpuRegBits(REG_OFFSET_WINOUT, 0x0020);
- gTasks[taskId].data[11] = sub_80F8318(mapsec);
+ SetGpuRegBits(REG_OFFSET_WININ, WININ_WIN0_CLR | WININ_WIN1_CLR);
+ SetGpuRegBits(REG_OFFSET_WINOUT, WINOUT_WIN01_CLR);
+ gTasks[taskId].data[11] = MapPreview_CreateMapNameWindow(mapsec);
ScriptContext2_Enable();
}
-u16 sub_80F8318(u8 mapsec)
+u16 MapPreview_CreateMapNameWindow(u8 mapsec)
{
u16 windowId;
u32 xctr;
@@ -452,18 +452,18 @@ u16 sub_80F8318(u8 mapsec)
windowId = AddWindow(&sMapNameWindow);
FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
PutWindowTilemap(windowId);
- color[0] = 1; // Access violation
- color[1] = 4; // Access violation
- color[2] = 3; // Access violation
+ color[0] = TEXT_COLOR_WHITE; // Access violation
+ color[1] = TEXT_COLOR_RED; // Access violation
+ color[2] = TEXT_COLOR_LIGHT_GREY; // Access violation
GetMapName(gStringVar4, mapsec, 0);
xctr = 104 - GetStringWidth(2, gStringVar4, 0);
AddTextPrinterParameterized4(windowId, 2, xctr / 2, 2, 0, 0, color/* Access violation */, -1, gStringVar4);
return windowId;
}
-bool32 sub_80F83B0(void)
+bool32 ForestMapPreviewScreenIsRunning(void)
{
- if (FuncIsActiveTask(sub_80F83D0) == TRUE)
+ if (FuncIsActiveTask(Task_RunMapPreviewScreenForest) == TRUE)
{
return FALSE;
}
@@ -473,7 +473,7 @@ bool32 sub_80F83B0(void)
}
}
-static void sub_80F83D0(u8 taskId)
+static void Task_RunMapPreviewScreenForest(u8 taskId)
{
s16 * data;
@@ -481,7 +481,7 @@ static void sub_80F83D0(u8 taskId)
switch (data[0])
{
case 0:
- if (!sub_80F8258() && !IsDma3ManagerBusyWithBgCopy())
+ if (!MapPreview_IsGfxLoadFinished() && !IsDma3ManagerBusyWithBgCopy())
{
CopyWindowToVram(data[11], 3);
data[0]++;
@@ -490,7 +490,7 @@ static void sub_80F83D0(u8 taskId)
case 1:
if (!IsDma3ManagerBusyWithBgCopy())
{
- sub_807DC00();
+ FadeInFromBlack();
data[0]++;
}
break;
@@ -539,7 +539,7 @@ static void sub_80F83D0(u8 taskId)
case 5:
if (!IsDma3ManagerBusyWithBgCopy())
{
- sub_80F8234(data[11]);
+ MapPreview_Unload(data[11]);
SetBgAttribute(0, BG_ATTR_PRIORITY, data[2]);
SetGpuReg(REG_OFFSET_DISPCNT, data[3]);
SetGpuReg(REG_OFFSET_BLDCNT, data[4]);
@@ -556,7 +556,7 @@ const struct MapPreviewScreen * GetDungeonMapPreviewScreenInfo(u8 mapsec)
{
u8 idx;
- idx = sub_80F80E4(mapsec);
+ idx = GetMapPreviewScreenIdx(mapsec);
if (idx == MPS_COUNT)
{
return NULL;
@@ -567,18 +567,18 @@ const struct MapPreviewScreen * GetDungeonMapPreviewScreenInfo(u8 mapsec)
}
}
-u16 sub_80F856C(u8 mapsec)
+u16 MapPreview_GetDuration(u8 mapsec)
{
u8 idx;
u16 flagId;
- idx = sub_80F80E4(mapsec);
+ idx = GetMapPreviewScreenIdx(mapsec);
if (idx == MPS_COUNT)
{
return 0;
}
flagId = sMapPreviewScreenData[idx].flagId;
- if (!sMapPreviewScreenData[idx].forceFirstTime)
+ if (sMapPreviewScreenData[idx].type == MPS_TYPE_CAVE)
{
if (!FlagGet(flagId))
{
@@ -590,7 +590,7 @@ u16 sub_80F856C(u8 mapsec)
}
}
else {
- if (gUnknown_203ABEC)
+ if (sHasVisitedMapBefore)
{
return 120;
}
@@ -601,15 +601,15 @@ u16 sub_80F856C(u8 mapsec)
}
}
-void sub_80F85BC(u16 flagId)
+void MapPreview_SetFlag(u16 flagId)
{
if (!FlagGet(flagId))
{
- gUnknown_203ABEC = TRUE;
+ sHasVisitedMapBefore = TRUE;
}
else
{
- gUnknown_203ABEC = FALSE;
+ sHasVisitedMapBefore = FALSE;
}
FlagSet(flagId);
}
diff --git a/src/menews_jisan.c b/src/menews_jisan.c
index d8971f6a2..f3b8fca78 100644
--- a/src/menews_jisan.c
+++ b/src/menews_jisan.c
@@ -54,7 +54,7 @@ void MENewsJisanStepCounter(void)
}
}
-u16 Special_GetMENewsJisanItemAndState(void)
+u16 GetMENewsJisanItemAndState(void)
{
u16 *r6 = &gSpecialVar_Result;
struct MENewsJisanStruct *r4 = GetMENewsJisanStructPtr();
diff --git a/src/menu.c b/src/menu.c
index 5a0da28b9..b7c3f54eb 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -1,12 +1,8 @@
#include "global.h"
#include "bg.h"
-#include "malloc.h"
#include "menu.h"
#include "menu_helpers.h"
-#include "new_menu_helpers.h"
-#include "string_util.h"
#include "strings.h"
-#include "task.h"
#include "text_window.h"
#include "window.h"
#include "sound.h"
@@ -307,7 +303,7 @@ static void Menu_RedrawCursor(u8 oldPos, u8 newPos)
width = GetMenuCursorDimensionByFont(sMenu.fontId, 0);
height = GetMenuCursorDimensionByFont(sMenu.fontId, 1);
FillWindowPixelRect(sMenu.windowId, 1, sMenu.left, sMenu.optionHeight * oldPos + sMenu.top, width, height);
- AddTextPrinterParameterized(sMenu.windowId, sMenu.fontId, gFameCheckerText_ListMenuCursor, sMenu.left, sMenu.optionHeight * newPos + sMenu.top, 0, 0);
+ AddTextPrinterParameterized(sMenu.windowId, sMenu.fontId, gText_SelectorArrow2, sMenu.left, sMenu.optionHeight * newPos + sMenu.top, 0, 0);
}
u8 Menu_MoveCursor(s8 cursorDelta)
@@ -649,7 +645,7 @@ static void MultichoiceGrid_RedrawCursor(u8 oldCursorPos, u8 newCursorPos)
FillWindowPixelRect(sMenu.windowId, PIXEL_FILL(1), xPos, yPos, cursorWidth, cursorHeight);
xPos = (newCursorPos % sMenu.columns) * sMenu.optionWidth + sMenu.left;
yPos = (newCursorPos / sMenu.columns) * sMenu.optionHeight + sMenu.top;
- AddTextPrinterParameterized(sMenu.windowId, sMenu.fontId, gFameCheckerText_ListMenuCursor, xPos, yPos, 0, 0);
+ AddTextPrinterParameterized(sMenu.windowId, sMenu.fontId, gText_SelectorArrow2, xPos, yPos, 0, 0);
}
static u8 MultichoiceGrid_MoveCursor(s8 deltaX, s8 deltaY)
diff --git a/src/menu_indicators.c b/src/menu_indicators.c
index c07aaf772..3044fb8b4 100644
--- a/src/menu_indicators.c
+++ b/src/menu_indicators.c
@@ -3,7 +3,6 @@
#include "task.h"
#include "decompress.h"
#include "palette.h"
-#include "strings.h"
#include "sprite.h"
#include "trig.h"
#include "list_menu.h"
diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c
index 29a296255..507bcf2b4 100644
--- a/src/metatile_behavior.c
+++ b/src/metatile_behavior.c
@@ -16,39 +16,12 @@ static const bool8 sTileSurfable[METATILE_COUNT] = {
[MB_SOUTHWARD_CURRENT] = TRUE
};
-static const u8 sTileBitAttributes[] = {
- 0x00,
- 0x01,
- 0x02,
- 0x04,
- 0x08,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00,
- 0x00
+static const u8 sTileBitAttributes[32] = {
+ [0] = 0x00,
+ [1] = 0x01,
+ [2] = 0x02,
+ [3] = 0x04,
+ [4] = 0x08,
};
bool8 MetatileBehavior_UnusedReturnTrue(u8 metatileBehavior)
@@ -769,7 +742,7 @@ bool8 MetatileBehavior_UnusedReturnFalse_11(u8 metatileBehavior) { return FALSE;
bool8 MetatileBehavior_UnusedReturnFalse_12(u8 metatileBehavior) { return FALSE; }
bool8 MetatileBehavior_UnusedReturnFalse_13(u8 metatileBehavior) { return FALSE; }
-bool8 sub_805A2BC(u8 arg1, u8 arg2)
+bool8 TestMetatileAttributeBit(u8 arg1, u8 arg2)
{
if(sTileBitAttributes[arg1] & arg2)
return TRUE;
diff --git a/src/mevent.c b/src/mevent.c
index afad326b5..9eabcad61 100644
--- a/src/mevent.c
+++ b/src/mevent.c
@@ -9,7 +9,7 @@
#include "decompress.h"
#include "link.h"
#include "link_rfu.h"
-#include "unk_815c27c.h"
+#include "ereader_helpers.h"
#include "util.h"
#include "script.h"
#include "event_data.h"
@@ -21,77 +21,65 @@
#include "mystery_gift_menu.h"
#include "help_system.h"
#include "mevent.h"
+#include "strings.h"
struct MEventTaskData1
{
- u16 t00;
+ u16 stateAdvanceDelay;
u16 t02;
u16 t04;
u16 t06;
u8 state;
- u8 t09;
+ u8 textOrReceiveState;
u8 t0A;
u8 t0B;
u8 t0C;
u8 t0D;
- u8 t0E;
+ u8 initialSendResult;
struct MEvent_Str_2 *t10;
};
-void sub_8143910(u8 taskId);
-bool32 sub_8143E64(const struct MEWonderNewsData * src);
-void sub_8143E9C(void);
-void sub_8143ED0(void);
-bool32 sub_8144018(const struct MEWonderCardData * src);
-void BlankSavedWonderCard(void);
-void BlankMEventBuffer2(void);
-void sub_8144824(u32, u32, u32 *, s32);
-void sub_8144790(void);
-
-extern const u8 gUnknown_841DE52[];
-extern const u8 gUnknown_841DE53[];
-extern const u8 gUnknown_841DE54[];
-extern const u8 gUnknown_841DE7C[];
-extern const u8 gUnknown_841DE7D[];
-extern const u8 gUnknown_841DE95[];
-extern const u8 gUnknown_841DE96[];
-extern const u8 gUnknown_841DE97[];
-extern const u8 gUnknown_841DE98[];
-extern const u8 gUnknown_841DE99[];
-extern const u8 gUnknown_841DE9A[];
-extern const u8 gUnknown_841DE9B[];
-extern const u8 gUnknown_841DE9C[];
+static void Task_EReaderComm(u8 taskId);
+static bool32 IsReceivedWonderNewsHeaderValid(const struct MEWonderNewsData * src);
+static void BlankWonderNews(void);
+static void BlankMENewsJisan(void);
+static bool32 IsReceivedWonderCardHeaderValid(const struct MEWonderCardData * src);
+static void BlankSavedWonderCard(void);
+static void BlankMEventBuffer2(void);
+static void RecordIdOfWonderCardSender(u32 eventId, u32 trainerId, u32 *idsList, s32 count);
+static void BlankBuffer344(void);
+
extern const u8 gUnknownSerialData_Start[];
extern const u8 gUnknownSerialData_End[];
-const u16 gUnknown_8466F00[] = {
- 0x02a7,
- 0x02a8,
- 0x02a9,
- 0x02aa,
- 0x02ab,
- 0x02ac,
- 0x02ad,
- 0x02ae,
- 0x02af,
- 0x02b0,
- 0x02b1,
- 0x02b2,
- 0x02b3,
- 0x02b4,
- 0x02b5,
- 0x02b6,
- 0x02b7,
- 0x02b8,
- 0x02b9,
- 0x02ba
+static const u16 sGiftItemFlagIds[] = {
+ FLAG_GOT_AURORA_TICKET,
+ FLAG_GOT_MYSTIC_TICKET,
+ FLAG_0x2A9,
+ FLAG_0x2AA,
+ FLAG_0x2AB,
+ FLAG_0x2AC,
+ FLAG_0x2AD,
+ FLAG_0x2AE,
+ FLAG_0x2AF,
+ FLAG_0x2B0,
+ FLAG_0x2B1,
+ FLAG_0x2B2,
+ FLAG_0x2B3,
+ FLAG_0x2B4,
+ FLAG_0x2B5,
+ FLAG_0x2B6,
+ FLAG_0x2B7,
+ FLAG_0x2B8,
+ FLAG_0x2B9,
+ FLAG_0x2BA
};
-struct MEvent_Str_1 gUnknown_3005ED0;
+struct MEvent_Str_1 sMEventSendToEReaderManager;
-static EWRAM_DATA bool32 gUnknown_203F3BC = FALSE;
+static EWRAM_DATA bool32 sReceivedWonderCardIsValid = FALSE;
-void sub_81435DC(struct MEvent_Str_1 *mgr, size_t size, const void * data)
+void SendUnknownSerialData_Init(struct MEvent_Str_1 *mgr, size_t size, const void * data)
{
vu16 imeBak = REG_IME;
REG_IME = 0;
@@ -106,7 +94,7 @@ void sub_81435DC(struct MEvent_Str_1 *mgr, size_t size, const void * data)
mgr->data = data;
}
-void sub_8143644(struct MEvent_Str_1 *unused)
+void SendUnknownSerialData_Teardown(struct MEvent_Str_1 *unused)
{
vu16 imeBak = REG_IME;
REG_IME = 0;
@@ -116,15 +104,15 @@ void sub_8143644(struct MEvent_Str_1 *unused)
REG_IME = imeBak;
}
-u8 sub_8143674(struct MEvent_Str_1 *mgr)
+u8 SendUnknownSerialData_Run(struct MEvent_Str_1 *mgr)
{
u8 resp = 0;
mgr->status = EReaderHandleTransfer(1, mgr->size, mgr->data, 0);
- if ((mgr->status & 0x13) == 0x10)
+ if ((mgr->status & 0x13) == 0x10) // checksum OK and xfer off
resp = 1;
- if (mgr->status & 8)
+ if (mgr->status & 8) // cancelled by player
resp = 2;
- if (mgr->status & 4)
+ if (mgr->status & 4) // timed out
resp = 3;
gShouldAdvanceLinkState = 0;
return resp;
@@ -161,32 +149,32 @@ static bool32 IsEReaderConnectionSane(void)
return FALSE;
}
-u32 sub_8143770(u8 * r4, u16 * r5)
+static u32 EReaderReceive(u8 * state_p, u16 * receiveDelay)
{
- if ((*r4 == 3 || *r4 == 4 || *r4 == 5) && HasLinkErrorOccurred())
+ if ((*state_p == 3 || *state_p == 4 || *state_p == 5) && HasLinkErrorOccurred())
{
- *r4 = 0;
+ *state_p = 0;
return 3;
}
- switch (*r4)
+ switch (*state_p)
{
case 0:
if (IsLinkMaster() && GetLinkPlayerCount_2() > 1)
{
- *r4 = 1;
+ *state_p = 1;
;
}
else if (JOY_NEW(B_BUTTON))
{
- *r4 = 0;
+ *state_p = 0;
return 1;
}
break;
case 1:
- if (++(*r5) > 5)
+ if (++(*receiveDelay) > 5)
{
- *r5 = 0;
- *r4 = 2;
+ *receiveDelay = 0;
+ *state_p = 2;
}
break;
case 2:
@@ -194,19 +182,19 @@ u32 sub_8143770(u8 * r4, u16 * r5)
{
PlaySE(SE_PINPON);
CheckShouldAdvanceLinkState();
- *r5 = 0;
- *r4 = 3;
+ *receiveDelay = 0;
+ *state_p = 3;
}
else if (JOY_NEW(B_BUTTON))
{
- *r4 = 0;
+ *state_p = 0;
return 1;
}
break;
case 3:
- if (++(*r5) > 30)
+ if (++(*receiveDelay) > 30)
{
- *r4 = 0;
+ *state_p = 0;
return 5;
}
else if (IsLinkConnectionEstablished())
@@ -215,24 +203,24 @@ u32 sub_8143770(u8 * r4, u16 * r5)
{
if (IsLinkPlayerDataExchangeComplete())
{
- *r4 = 0;
+ *state_p = 0;
return 2;
}
else
- *r4 = 4;
+ *state_p = 4;
}
else
- *r4 = 3;
+ *state_p = 3;
}
break;
case 4:
- sub_800AA80(0);
- *r4 = 5;
+ Link_StartSend5FFFwithParam(0);
+ *state_p = 5;
break;
case 5:
if (!gReceivedRemoteLinkPlayers)
{
- *r4 = 0;
+ *state_p = 0;
return 4;
}
break;
@@ -242,19 +230,19 @@ u32 sub_8143770(u8 * r4, u16 * r5)
void task_add_00_ereader(void)
{
- u8 taskId = CreateTask(sub_8143910, 0);
+ u8 taskId = CreateTask(Task_EReaderComm, 0);
struct MEventTaskData1 *data = (struct MEventTaskData1 *)gTasks[taskId].data;
data->state = 0;
- data->t09 = 0;
+ data->textOrReceiveState = 0;
data->t0A = 0;
data->t0B = 0;
data->t0C = 0;
data->t0D = 0;
- data->t00 = 0;
+ data->stateAdvanceDelay = 0;
data->t02 = 0;
data->t04 = 0;
data->t06 = 0;
- data->t0E = 0;
+ data->initialSendResult = 0;
data->t10 = AllocZeroed(sizeof(struct MEvent_Str_2));
}
@@ -273,22 +261,22 @@ static bool32 AdvanceDelayTimerCheckTimeout(u16 * a0, u16 a1)
return FALSE;
}
-void sub_8143910(u8 taskId)
+static void Task_EReaderComm(u8 taskId)
{
struct MEventTaskData1 *data = (struct MEventTaskData1 *)gTasks[taskId].data;
switch (data->state)
{
case 0:
- if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE52))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textOrReceiveState, gJPText_ReceiveMysteryGiftWithEReader))
data->state = 1;
break;
case 1:
ResetTTDataBuffer();
- ResetDelayTimer(&data->t00);
+ ResetDelayTimer(&data->stateAdvanceDelay);
data->state = 2;
break;
case 2:
- if (AdvanceDelayTimerCheckTimeout(&data->t00, 10))
+ if (AdvanceDelayTimerCheckTimeout(&data->stateAdvanceDelay, 10))
data->state = 3;
break;
case 3:
@@ -301,22 +289,22 @@ void sub_8143910(u8 taskId)
data->state = 13;
break;
case 4:
- if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE53))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textOrReceiveState, gJPText_SelectConnectFromEReaderMenu))
{
- AddTextPrinterToWindow1(gUnknown_841DE54);
- ResetDelayTimer(&data->t00);
+ AddTextPrinterToWindow1(gJPText_SelectConnectWithGBA);
+ ResetDelayTimer(&data->stateAdvanceDelay);
data->state = 5;
}
break;
case 5:
- if (AdvanceDelayTimerCheckTimeout(&data->t00, 90))
+ if (AdvanceDelayTimerCheckTimeout(&data->stateAdvanceDelay, 90))
{
ResetTTDataBuffer();
data->state = 6;
}
else if (JOY_NEW(B_BUTTON))
{
- ResetDelayTimer(&data->t00);
+ ResetDelayTimer(&data->stateAdvanceDelay);
PlaySE(SE_SELECT);
data->state = 23;
}
@@ -326,12 +314,12 @@ void sub_8143910(u8 taskId)
{
PlaySE(SE_SELECT);
CloseLink();
- ResetDelayTimer(&data->t00);
+ ResetDelayTimer(&data->stateAdvanceDelay);
data->state = 23;
}
else if (GetLinkPlayerCount_2() > 1)
{
- ResetDelayTimer(&data->t00);
+ ResetDelayTimer(&data->stateAdvanceDelay);
CloseLink();
data->state = 7;
}
@@ -339,72 +327,80 @@ void sub_8143910(u8 taskId)
{
PlaySE(SE_SELECT);
CloseLink();
- ResetDelayTimer(&data->t00);
+ ResetDelayTimer(&data->stateAdvanceDelay);
data->state = 8;
}
- else if (AdvanceDelayTimerCheckTimeout(&data->t00, 10))
+ else if (AdvanceDelayTimerCheckTimeout(&data->stateAdvanceDelay, 10))
{
CloseLink();
ResetTTDataBuffer();
- ResetDelayTimer(&data->t00);
+ ResetDelayTimer(&data->stateAdvanceDelay);
}
break;
case 7:
- if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE7C))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textOrReceiveState, gJPText_LinkIsIncorrect))
data->state = 4;
break;
case 8:
- AddTextPrinterToWindow1(gUnknown_841DE95);
- sub_81435DC(&gUnknown_3005ED0, gUnknownSerialData_End - gUnknownSerialData_Start, gUnknownSerialData_Start);
+ AddTextPrinterToWindow1(gJPText_Connecting);
+ SendUnknownSerialData_Init(&sMEventSendToEReaderManager, gUnknownSerialData_End - gUnknownSerialData_Start, gUnknownSerialData_Start);
data->state = 9;
break;
case 9:
- data->t0E = sub_8143674(&gUnknown_3005ED0);
- if (data->t0E != 0)
+ data->initialSendResult = SendUnknownSerialData_Run(&sMEventSendToEReaderManager);
+ if (data->initialSendResult != 0)
data->state = 10;
break;
case 10:
- sub_8143644(&gUnknown_3005ED0);
- if (data->t0E == 3)
+ SendUnknownSerialData_Teardown(&sMEventSendToEReaderManager);
+ if (data->initialSendResult == 3)
+ // Error
data->state = 20;
- else if (data->t0E == 1)
+ else if (data->initialSendResult == 1)
{
- ResetDelayTimer(&data->t00);
- AddTextPrinterToWindow1(gUnknown_841DE9B);
+ // OK
+ ResetDelayTimer(&data->stateAdvanceDelay);
+ AddTextPrinterToWindow1(gJPText_PleaseWaitAMoment);
data->state = 11;
}
else
+ // Try again
data->state = 0;
break;
case 11:
- if (AdvanceDelayTimerCheckTimeout(&data->t00, 840))
+ if (AdvanceDelayTimerCheckTimeout(&data->stateAdvanceDelay, 840))
data->state = 12;
break;
case 12:
ResetTTDataBuffer();
- AddTextPrinterToWindow1(gUnknown_841DE98);
+ AddTextPrinterToWindow1(gJPText_AllowEReaderToLoadCard);
data->state = 13;
break;
case 13:
- switch (sub_8143770(&data->t09, &data->t00))
+ switch (EReaderReceive(&data->textOrReceiveState, &data->stateAdvanceDelay))
{
case 0:
+ // Running
break;
case 2:
- AddTextPrinterToWindow1(gUnknown_841DE95);
+ // Done
+ AddTextPrinterToWindow1(gJPText_Connecting);
data->state = 14;
break;
case 1:
+ // Cancelled
PlaySE(SE_SELECT);
CloseLink();
data->state = 23;
break;
case 5:
+ // Error Try Again
CloseLink();
data->state = 21;
break;
case 3:
case 4:
+ // Error CheckLink
CloseLink();
data->state = 20;
break;
@@ -423,55 +419,55 @@ void sub_8143910(u8 taskId)
}
break;
case 15:
- data->t0E = ValidateTrainerTowerData((struct EReaderTrainerHillSet *)gDecompressionBuffer);
- sub_800AA80(data->t0E);
+ data->initialSendResult = ValidateTrainerTowerData((struct EReaderTrainerTowerSet *)gDecompressionBuffer);
+ Link_StartSend5FFFwithParam(data->initialSendResult);
data->state = 16;
break;
case 16:
if (!gReceivedRemoteLinkPlayers)
{
- if (data->t0E == 1)
+ if (data->initialSendResult == 1)
data->state = 17;
else
data->state = 20;
}
break;
case 17:
- if (CEReaderTool_SaveTrainerTower((struct EReaderTrainerHillSet *)gDecompressionBuffer))
+ if (CEReaderTool_SaveTrainerTower((struct EReaderTrainerTowerSet *)gDecompressionBuffer))
{
- AddTextPrinterToWindow1(gUnknown_841DE99);
- ResetDelayTimer(&data->t00);
+ AddTextPrinterToWindow1(gJPText_ConnectionComplete);
+ ResetDelayTimer(&data->stateAdvanceDelay);
data->state = 18;
}
else
data->state = 22;
break;
case 18:
- if (AdvanceDelayTimerCheckTimeout(&data->t00, 120))
+ if (AdvanceDelayTimerCheckTimeout(&data->stateAdvanceDelay, 120))
{
- AddTextPrinterToWindow1(gUnknown_841DE9A);
- PlayFanfare(258);
+ AddTextPrinterToWindow1(gJPText_NewTrainerHasComeToSevii);
+ PlayFanfare(MUS_FANFA4);
data->state = 19;
}
break;
case 19:
- if (IsFanfareTaskInactive() &&JOY_NEW(A_BUTTON | B_BUTTON))
+ if (IsFanfareTaskInactive() && JOY_NEW(A_BUTTON | B_BUTTON))
data->state = 26;
break;
case 23:
- if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE7D))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textOrReceiveState, gJPText_CardReadingHasBeenHalted))
data->state = 26;
break;
case 20:
- if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE96))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textOrReceiveState, gJPText_ConnectionErrorCheckLink))
data->state = 0;
break;
case 21:
- if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE97))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textOrReceiveState, gJPText_ConnectionErrorTryAgain))
data->state = 0;
break;
case 22:
- if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE9C))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textOrReceiveState, gJPText_WriteErrorUnableToSaveData))
data->state = 0;
break;
case 26:
@@ -483,10 +479,10 @@ void sub_8143910(u8 taskId)
}
}
-void sub_8143D24(void)
+void InitMEventData(void)
{
CpuFill32(0, &gSaveBlock1Ptr->mysteryEventBuffers, sizeof(gSaveBlock1Ptr->mysteryEventBuffers));
- sub_8143ED0();
+ BlankMENewsJisan();
EC_ResetMEventProfileMaybe();
}
@@ -517,14 +513,14 @@ u16 * GetMEventProfileECWordsMaybe(void)
void DestroyWonderNews(void)
{
- sub_8143E9C();
+ BlankWonderNews();
}
-bool32 sub_8143DC8(const struct MEWonderNewsData * src)
+bool32 OverwriteSavedWonderNewsWithReceivedNews(const struct MEWonderNewsData * src)
{
- if (!sub_8143E64(src))
+ if (!IsReceivedWonderNewsHeaderValid(src))
return FALSE;
- sub_8143E9C();
+ BlankWonderNews();
gSaveBlock1Ptr->mysteryEventBuffers.menews.data = *src;
gSaveBlock1Ptr->mysteryEventBuffers.menews.crc = CalcCRC16WithTable((void *)&gSaveBlock1Ptr->mysteryEventBuffers.menews.data, sizeof(struct MEWonderNewsData));
return TRUE;
@@ -534,14 +530,14 @@ bool32 ValidateReceivedWonderNews(void)
{
if (CalcCRC16WithTable((void *)&gSaveBlock1Ptr->mysteryEventBuffers.menews.data, sizeof(struct MEWonderNewsData)) != gSaveBlock1Ptr->mysteryEventBuffers.menews.crc)
return FALSE;
- if (!sub_8143E64(&gSaveBlock1Ptr->mysteryEventBuffers.menews.data))
+ if (!IsReceivedWonderNewsHeaderValid(&gSaveBlock1Ptr->mysteryEventBuffers.menews.data))
return FALSE;
return TRUE;
}
-bool32 sub_8143E64(const struct MEWonderNewsData * data)
+static bool32 IsReceivedWonderNewsHeaderValid(const struct MEWonderNewsData * data)
{
- if (data->unk_00 == 0)
+ if (data->newsId == 0)
return FALSE;
return TRUE;
}
@@ -549,24 +545,24 @@ bool32 sub_8143E64(const struct MEWonderNewsData * data)
bool32 WonderNews_Test_Unk_02(void)
{
const struct MEWonderNewsData * data = &gSaveBlock1Ptr->mysteryEventBuffers.menews.data;
- if (data->unk_02 == 0)
+ if (data->shareState == 0)
return FALSE;
return TRUE;
}
-void sub_8143E9C(void)
+static void BlankWonderNews(void)
{
CpuFill32(0, GetSavedWonderNews(), sizeof(gSaveBlock1Ptr->mysteryEventBuffers.menews.data));
gSaveBlock1Ptr->mysteryEventBuffers.menews.crc = 0;
}
-void sub_8143ED0(void)
+static void BlankMENewsJisan(void)
{
CpuFill32(0, GetMENewsJisanStructPtr(), sizeof(struct MENewsJisanStruct));
MENewsJisanReset();
}
-bool32 sub_8143EF4(const u8 * src)
+bool32 MEvent_HaveAlreadyReceivedWonderNews(const u8 * src)
{
const u8 * r5 = (const u8 *)&gSaveBlock1Ptr->mysteryEventBuffers.menews.data;
u32 i;
@@ -584,22 +580,23 @@ void DestroyWonderCard(void)
{
BlankSavedWonderCard();
BlankMEventBuffer2();
- sub_8144790();
+ BlankBuffer344();
ClearRamScript();
- sub_806E2D0();
- sub_806E370();
+ ResetMysteryEventFlags();
+ ResetMysteryEventVars();
ClearEReaderTrainer(&gSaveBlock2Ptr->battleTower.ereaderTrainer);
}
-bool32 sub_8143F68(const struct MEWonderCardData * data)
+bool32 OverwriteSavedWonderCardWithReceivedCard(const struct MEWonderCardData * data)
{
struct MEventBuffer_3430_Sub * r2;
struct MEWonderCardData * r1;
- if (!sub_8144018(data))
+ if (!IsReceivedWonderCardHeaderValid(data))
return FALSE;
DestroyWonderCard();
memcpy(&gSaveBlock1Ptr->mysteryEventBuffers.mecard.data, data, sizeof(struct MEWonderCardData));
gSaveBlock1Ptr->mysteryEventBuffers.mecard.crc = CalcCRC16WithTable((void *)&gSaveBlock1Ptr->mysteryEventBuffers.mecard.data, sizeof(struct MEWonderCardData));
+ // Annoying hack to match
r2 = &gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data;
r1 = &gSaveBlock1Ptr->mysteryEventBuffers.mecard.data;
r2->unk_06 = r1->unk_02;
@@ -610,24 +607,24 @@ bool32 ValidateReceivedWonderCard(void)
{
if (gSaveBlock1Ptr->mysteryEventBuffers.mecard.crc != CalcCRC16WithTable((void *)&gSaveBlock1Ptr->mysteryEventBuffers.mecard.data, sizeof(struct MEWonderCardData)))
return FALSE;
- if (!sub_8144018(&gSaveBlock1Ptr->mysteryEventBuffers.mecard.data))
+ if (!IsReceivedWonderCardHeaderValid(&gSaveBlock1Ptr->mysteryEventBuffers.mecard.data))
return FALSE;
- if (!sub_8069DFC())
+ if (!ValidateRamScript())
return FALSE;
return TRUE;
}
-bool32 sub_8144018(const struct MEWonderCardData * data)
+static bool32 IsReceivedWonderCardHeaderValid(const struct MEWonderCardData * data)
{
- if (data->unk_00 == 0)
+ if (data->cardId == 0)
return FALSE;
if (data->unk_08_0 > 2)
return FALSE;
- if (!(data->unk_08_6 == 0 || data->unk_08_6 == 1 || data->unk_08_6 == 2))
+ if (!(data->shareState == 0 || data->shareState == 1 || data->shareState == 2))
return FALSE;
if (data->unk_08_2 > 7)
return FALSE;
- if (data->unk_09 > 7)
+ if (data->recvMonCapacity > 7)
return FALSE;
return TRUE;
}
@@ -635,18 +632,18 @@ bool32 sub_8144018(const struct MEWonderCardData * data)
bool32 WonderCard_Test_Unk_08_6(void)
{
const struct MEWonderCardData * data = &gSaveBlock1Ptr->mysteryEventBuffers.mecard.data;
- if (data->unk_08_6 == 0)
+ if (data->shareState == 0)
return FALSE;
return TRUE;
}
-void BlankSavedWonderCard(void)
+static void BlankSavedWonderCard(void)
{
CpuFill32(0, &gSaveBlock1Ptr->mysteryEventBuffers.mecard.data, sizeof(struct MEWonderCardData));
gSaveBlock1Ptr->mysteryEventBuffers.mecard.crc = 0;
}
-void BlankMEventBuffer2(void)
+static void BlankMEventBuffer2(void)
{
CpuFill32(0, sav1_get_mevent_buffer_2(), 18 * sizeof(u16));
gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.crc = 0;
@@ -655,17 +652,17 @@ void BlankMEventBuffer2(void)
u16 GetWonderCardFlagId(void)
{
if (ValidateReceivedWonderCard())
- return gSaveBlock1Ptr->mysteryEventBuffers.mecard.data.unk_00;
+ return gSaveBlock1Ptr->mysteryEventBuffers.mecard.data.cardId;
return 0;
}
-void sub_814410C(struct MEWonderCardData * buffer)
+void MEvent_WonderCardResetUnk08_6(struct MEWonderCardData * buffer)
{
- if (buffer->unk_08_6 == 1)
- buffer->unk_08_6 = 0;
+ if (buffer->shareState == 1)
+ buffer->shareState = 0;
}
-bool32 sub_8144124(u16 a0)
+static bool32 IsCardIdInValidRange(u16 a0)
{
if (a0 >= 1000 && a0 < 1020)
return TRUE;
@@ -675,33 +672,33 @@ bool32 sub_8144124(u16 a0)
bool32 CheckReceivedGiftFromWonderCard(void)
{
u16 value = GetWonderCardFlagId();
- if (!sub_8144124(value))
+ if (!IsCardIdInValidRange(value))
return FALSE;
- if (FlagGet(gUnknown_8466F00[value - 1000]) == TRUE)
+ if (FlagGet(sGiftItemFlagIds[value - 1000]) == TRUE)
return FALSE;
return TRUE;
}
-s32 sub_8144184(const struct MEventBuffer_3430_Sub * data, s32 size)
+static s32 CountReceivedDistributionMons(const struct MEventBuffer_3430_Sub * data, s32 size)
{
s32 r3 = 0;
s32 i;
for (i = 0; i < size; i++)
{
- if (data->unk_08[1][i] && data->unk_08[0][i])
+ if (data->distributedMons[1][i] && data->distributedMons[0][i])
r3++;
}
return r3;
}
-bool32 sub_81441AC(const struct MEventBuffer_3430_Sub * data1, const u16 * data2, s32 size)
+static bool32 HasPlayerAlreadyReceivedDistributedMon(const struct MEventBuffer_3430_Sub * data1, const u16 * data2, s32 size)
{
s32 i;
for (i = 0; i < size; i++)
{
- if (data1->unk_08[1][i] == data2[1])
+ if (data1->distributedMons[1][i] == data2[1])
return TRUE;
- if (data1->unk_08[0][i] == data2[0])
+ if (data1->distributedMons[0][i] == data2[0])
return TRUE;
}
return FALSE;
@@ -718,7 +715,7 @@ static bool32 IsWonderCardSpeciesValid(const u16 * data)
return TRUE;
}
-s32 sub_8144218(void)
+static s32 ValidateCardAndCountMonsReceived(void)
{
struct MEWonderCardData * data;
if (!ValidateReceivedWonderCard())
@@ -726,24 +723,24 @@ s32 sub_8144218(void)
data = &gSaveBlock1Ptr->mysteryEventBuffers.mecard.data;
if (data->unk_08_0 != 1)
return 0;
- return sub_8144184(&gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data, data->unk_09);
+ return CountReceivedDistributionMons(&gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data, data->recvMonCapacity);
}
-bool32 sub_8144254(const u16 * data)
+bool32 MEvent_ReceiveDistributionMon(const u16 * data)
{
struct MEWonderCardData * buffer = &gSaveBlock1Ptr->mysteryEventBuffers.mecard.data;
- s32 size = buffer->unk_09;
+ s32 capacity = buffer->recvMonCapacity;
s32 i;
if (!IsWonderCardSpeciesValid(data))
return FALSE;
- if (sub_81441AC(&gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data, data, size))
+ if (HasPlayerAlreadyReceivedDistributedMon(&gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data, data, capacity))
return FALSE;
- for (i = 0; i < size; i++)
+ for (i = 0; i < capacity; i++)
{
- if (gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data.unk_08[1][i] == 0 && gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data.unk_08[0][i] == 0)
+ if (gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data.distributedMons[1][i] == 0 && gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data.distributedMons[0][i] == 0)
{
- gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data.unk_08[1][i] = data[1];
- gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data.unk_08[0][i] = data[0];
+ gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data.distributedMons[1][i] = data[1];
+ gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data.distributedMons[0][i] = data[0];
return TRUE;
}
}
@@ -771,9 +768,9 @@ void BuildMEventClientHeader(struct MEventClientHeaderStruct * data)
if (ValidateReceivedWonderCard())
{
// Populate fields
- data->id = GetSavedWonderCard()->unk_00;
+ data->id = GetSavedWonderCard()->cardId;
data->unk_20 = *sav1_get_mevent_buffer_2();
- data->unk_44 = GetSavedWonderCard()->unk_09;
+ data->maxDistributionMons = GetSavedWonderCard()->recvMonCapacity;
}
else
data->id = 0;
@@ -815,14 +812,14 @@ u32 sub_8144418(const u16 * a0, const struct MEventClientHeaderStruct * a1, void
return 2;
}
-u32 sub_8144434(const u16 * a0, const struct MEventClientHeaderStruct * a1, void * unused)
+u32 MEvent_CanPlayerReceiveDistributionMon(const u16 * a0, const struct MEventClientHeaderStruct * a1, void * unused)
{
- s32 r4 = a1->unk_44 - sub_8144184(&a1->unk_20, a1->unk_44);
- if (r4 == 0)
+ s32 numSpaces = a1->maxDistributionMons - CountReceivedDistributionMons(&a1->unk_20, a1->maxDistributionMons);
+ if (numSpaces == 0)
return 1;
- if (sub_81441AC(&a1->unk_20, a0, a1->unk_44))
+ if (HasPlayerAlreadyReceivedDistributedMon(&a1->unk_20, a0, a1->maxDistributionMons))
return 3;
- if (r4 == 1)
+ if (numSpaces == 1)
return 4;
return 2;
}
@@ -838,9 +835,9 @@ bool32 sub_8144474(const struct MEventClientHeaderStruct * a0, const u16 * a1)
return TRUE;
}
-s32 sub_814449C(const struct MEventClientHeaderStruct * a0)
+static s32 GetNumReceivedDistributionMons(const struct MEventClientHeaderStruct * a0)
{
- return sub_8144184(&a0->unk_20, a0->unk_44);
+ return CountReceivedDistributionMons(&a0->unk_20, a0->maxDistributionMons);
}
u16 sub_81444B0(const struct MEventClientHeaderStruct * a0, u32 command)
@@ -848,22 +845,23 @@ u16 sub_81444B0(const struct MEventClientHeaderStruct * a0, u32 command)
switch (command)
{
case 0:
- return a0->unk_20.unk_00;
+ return a0->unk_20.linkWins;
case 1:
- return a0->unk_20.unk_02;
+ return a0->unk_20.linkLosses;
case 2:
- return a0->unk_20.unk_04;
+ return a0->unk_20.linkTrades;
case 3:
- return sub_814449C(a0);
+ return GetNumReceivedDistributionMons(a0);
case 4:
- return a0->unk_44;
+ return a0->maxDistributionMons;
default:
AGB_ASSERT_EX(0, ABSPATH("mevent.c"), 825);
return 0;
}
}
-void sub_814451C(u32 command)
+// Increments an interaction count in the save block
+static void IncrementBattleCardCount(u32 command)
{
struct MEWonderCardData * data = &gSaveBlock1Ptr->mysteryEventBuffers.mecard.data;
if (data->unk_08_0 == 2)
@@ -872,13 +870,13 @@ void sub_814451C(u32 command)
switch (command)
{
case 0:
- dest = &gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data.unk_00;
+ dest = &gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data.linkWins;
break;
case 1:
- dest = &gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data.unk_02;
+ dest = &gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data.linkLosses;
break;
case 2:
- dest = &gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data.unk_04;
+ dest = &gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data.linkTrades;
break;
case 3:
break;
@@ -896,7 +894,7 @@ void sub_814451C(u32 command)
}
}
-u16 sub_81445C0(u32 command)
+u16 MEvent_GetBattleCardCount(u32 command)
{
switch (command)
{
@@ -906,7 +904,7 @@ u16 sub_81445C0(u32 command)
if (data->unk_08_0 == 2)
{
struct MEventBuffer_3430_Sub * buffer = &gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data;
- return buffer->unk_00;
+ return buffer->linkWins;
}
break;
}
@@ -916,7 +914,7 @@ u16 sub_81445C0(u32 command)
if (data->unk_08_0 == 2)
{
struct MEventBuffer_3430_Sub * buffer = &gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data;
- return buffer->unk_02;
+ return buffer->linkLosses;
}
break;
}
@@ -926,7 +924,7 @@ u16 sub_81445C0(u32 command)
if (data->unk_08_0 == 2)
{
struct MEventBuffer_3430_Sub * buffer = &gSaveBlock1Ptr->mysteryEventBuffers.buffer_310.data;
- return buffer->unk_04;
+ return buffer->linkTrades;
}
break;
}
@@ -934,14 +932,14 @@ u16 sub_81445C0(u32 command)
{
struct MEWonderCardData * data = &gSaveBlock1Ptr->mysteryEventBuffers.mecard.data;
if (data->unk_08_0 == 1)
- return sub_8144218();
+ return ValidateCardAndCountMonsReceived();
break;
}
case 4:
{
struct MEWonderCardData * data = &gSaveBlock1Ptr->mysteryEventBuffers.mecard.data;
if (data->unk_08_0 == 1)
- return data->unk_09;
+ return data->recvMonCapacity;
break;
}
}
@@ -949,38 +947,38 @@ u16 sub_81445C0(u32 command)
return 0;
}
-void sub_81446C4(void)
+void ResetReceivedWonderCardFlag(void)
{
- gUnknown_203F3BC = FALSE;
+ sReceivedWonderCardIsValid = FALSE;
}
-bool32 sub_81446D0(u16 a0)
+bool32 MEventHandleReceivedWonderCard(u16 cardId)
{
- gUnknown_203F3BC = FALSE;
- if (a0 == 0)
+ sReceivedWonderCardIsValid = FALSE;
+ if (cardId == 0)
return FALSE;
if (!ValidateReceivedWonderCard())
return FALSE;
- if (gSaveBlock1Ptr->mysteryEventBuffers.mecard.data.unk_00 != a0)
+ if (gSaveBlock1Ptr->mysteryEventBuffers.mecard.data.cardId != cardId)
return FALSE;
- gUnknown_203F3BC = TRUE;
+ sReceivedWonderCardIsValid = TRUE;
return TRUE;
}
-void sub_8144714(u32 a0, u32 a1)
+void MEvent_RecordIdOfWonderCardSenderByEventType(u32 eventId, u32 trainerId)
{
- if (gUnknown_203F3BC)
+ if (sReceivedWonderCardIsValid)
{
- switch (a0)
+ switch (eventId)
{
- case 2:
- sub_8144824(2, a1, gSaveBlock1Ptr->mysteryEventBuffers.unk_344[1], 5);
+ case 2: // trade
+ RecordIdOfWonderCardSender(2, trainerId, gSaveBlock1Ptr->mysteryEventBuffers.unk_344[1], 5);
break;
- case 0:
- sub_8144824(0, a1, gSaveBlock1Ptr->mysteryEventBuffers.unk_344[0], 5);
+ case 0: // link win
+ RecordIdOfWonderCardSender(0, trainerId, gSaveBlock1Ptr->mysteryEventBuffers.unk_344[0], 5);
break;
- case 1:
- sub_8144824(1, a1, gSaveBlock1Ptr->mysteryEventBuffers.unk_344[0], 5);
+ case 1: // link loss
+ RecordIdOfWonderCardSender(1, trainerId, gSaveBlock1Ptr->mysteryEventBuffers.unk_344[0], 5);
break;
default:
AGB_ASSERT_EX(0, ABSPATH("mevent.c"), 988);
@@ -988,43 +986,48 @@ void sub_8144714(u32 a0, u32 a1)
}
}
-void sub_8144790(void)
+static void BlankBuffer344(void)
{
CpuFill32(0, gSaveBlock1Ptr->mysteryEventBuffers.unk_344, sizeof(gSaveBlock1Ptr->mysteryEventBuffers.unk_344));
}
-bool32 sub_81447BC(u32 a0, u32 * a1, s32 size)
+// Looks up trainerId in an array idsList with count elements.
+// If trainerId is found, rearranges idsList to put it in the front.
+// Otherwise, drops the last element of the list and inserts
+// trainerId at the front.
+// Returns TRUE in the latter case.
+static bool32 PlaceTrainerIdAtFrontOfList(u32 trainerId, u32 * idsList, s32 count)
{
s32 i;
s32 j;
- for (i = 0; i < size; i++)
+ for (i = 0; i < count; i++)
{
- if (a1[i] == a0)
+ if (idsList[i] == trainerId)
break;
}
- if (i == size)
+ if (i == count)
{
- for (j = size - 1; j > 0; j--)
+ for (j = count - 1; j > 0; j--)
{
- a1[j] = a1[j - 1];
+ idsList[j] = idsList[j - 1];
}
- a1[0] = a0;
+ idsList[0] = trainerId;
return TRUE;
}
else
{
for (j = i; j > 0; j--)
{
- a1[j] = a1[j - 1];
+ idsList[j] = idsList[j - 1];
}
- a1[0] = a0;
+ idsList[0] = trainerId;
return FALSE;
}
}
-void sub_8144824(u32 a0, u32 a1, u32 * a2, s32 a3)
+static void RecordIdOfWonderCardSender(u32 eventId, u32 trainerId, u32 * idsList, s32 count)
{
- if (sub_81447BC(a1, a2, a3))
- sub_814451C(a0);
+ if (PlaceTrainerIdAtFrontOfList(trainerId, idsList, count))
+ IncrementBattleCardCount(eventId);
}
diff --git a/src/mevent_8145654.c b/src/mevent_8145654.c
deleted file mode 100644
index 3de09ab44..000000000
--- a/src/mevent_8145654.c
+++ /dev/null
@@ -1,793 +0,0 @@
-#include "global.h"
-#include "constants/species.h"
-#include "bg.h"
-#include "gpu_regs.h"
-#include "palette.h"
-#include "decompress.h"
-#include "malloc.h"
-#include "menu.h"
-#include "new_menu_helpers.h"
-#include "pokemon_icon.h"
-#include "mystery_gift_menu.h"
-#include "menu_indicators.h"
-#include "string_util.h"
-#include "link_rfu.h"
-#include "mevent.h"
-#include "battle_anim.h"
-
-struct UnkStruct_8467FB8
-{
- u8 textPal1:4;
- u8 textPal2:4;
- u8 textPal3:4;
- u8 textPal4:4;
- const u8 * tiles;
- const u8 * map;
- const u16 * pal;
-};
-
-struct UnkStruct_203F3C8_02DC
-{
- u8 unk_00;
- u8 unk_01[41];
- u8 unk_42[4];
-};
-
-struct UnkStruct_203F3C8
-{
- /*0000*/ struct MEWonderCardData unk_0000;
- /*014c*/ struct MEventBuffer_3430_Sub unk_014C;
- /*0170*/ const struct UnkStruct_8467FB8 * unk_0170;
- /*0174*/ u8 unk_0174;
- /*0175*/ u8 unk_0175;
- /*0176*/ u16 unk_0176[3];
- /*017C*/ u8 unk_017C;
- /*017D*/ u8 unk_017D[7][2];
- /*018B*/ u8 unk_018B[41];
- /*01B4*/ u8 unk_01B4[41];
- /*01DD*/ u8 unk_01DD[7];
- /*01E4*/ u8 unk_01E4[4][41];
- /*0288*/ u8 unk_0288[41];
- /*02B1*/ u8 unk_02B1[41];
- /*02DC*/ struct UnkStruct_203F3C8_02DC unk_02DC[8];
- /*045C*/ u8 buffer_045C[0x1000];
-};
-
-EWRAM_DATA struct UnkStruct_203F3C8 * gUnknown_203F3C8 = NULL;
-
-void sub_8145A98(void);
-void sub_8145D18(u8 whichWindow);
-void sub_8146060(void);
-void sub_81461D8(void);
-
-const u8 gUnknown_8467068[][3] = {
- {0, 2, 3},
- {0, 1, 2}
-};
-const u8 ALIGNED(4) gUnknown_8467070[3] = {7, 4, 7};
-const struct WindowTemplate gUnknown_8467074[] = {
- {0x01, 0x01, 0x01, 0x19, 0x04, 0x0f, 0x029c},
- {0x01, 0x01, 0x06, 0x1c, 0x08, 0x0f, 0x01bc},
- {0x01, 0x01, 0x0e, 0x1c, 0x05, 0x0f, 0x0130}
-};
-
-const u16 gUnknown_846708C[] = INCBIN_U16("data/graphics/mevent/pal_46708C.gbapal");
-const u16 gUnknown_84670AC[] = INCBIN_U16("data/graphics/mevent/pal_4670AC.gbapal");
-const u16 gUnknown_84670CC[] = INCBIN_U16("data/graphics/mevent/pal_4670CC.gbapal");
-const u16 gUnknown_84670EC[] = INCBIN_U16("data/graphics/mevent/pal_4670EC.gbapal");
-const u16 gUnknown_846710C[] = INCBIN_U16("data/graphics/mevent/pal_46710C.gbapal");
-const u16 gUnknown_846712C[] = INCBIN_U16("data/graphics/mevent/pal_46712C.gbapal");
-const u16 gUnknown_846714C[] = INCBIN_U16("data/graphics/mevent/pal_46714C.gbapal");
-const u16 gUnknown_846716C[] = INCBIN_U16("data/graphics/mevent/pal_46716C.gbapal");
-const u8 gUnknown_846718C[] = INCBIN_U8("data/graphics/mevent/gfx_46718C.4bpp.lz");
-const u8 gUnknown_8467288[] = INCBIN_U8("data/graphics/mevent/tilemap_467288.bin.lz");
-const u8 gUnknown_846737C[] = INCBIN_U8("data/graphics/mevent/gfx_46737C.4bpp.lz");
-const u8 gUnknown_8467470[] = INCBIN_U8("data/graphics/mevent/tilemap_467470.bin.lz");
-const u8 gUnknown_8467558[] = INCBIN_U8("data/graphics/mevent/gfx_467558.4bpp.lz");
-const u8 gUnknown_846762C[] = INCBIN_U8("data/graphics/mevent/tilemap_46762C.bin.lz");
-const u8 gUnknown_8467700[] = INCBIN_U8("data/graphics/mevent/gfx_467700.4bpp.lz");
-const u8 gUnknown_8467934[] = INCBIN_U8("data/graphics/mevent/tilemap_467934.bin.lz");
-const u8 gUnknown_8467A7C[] = INCBIN_U8("data/graphics/mevent/gfx_467A7C.4bpp.lz");
-const u8 gUnknown_8467CAC[] = INCBIN_U8("data/graphics/mevent/tilemap_467CAC.bin.lz");
-const u16 gUnknown_8467DF4[] = INCBIN_U16("data/graphics/mevent/pal_467DF4.gbapal");
-const u16 gUnknown_8467E14[] = INCBIN_U16("data/graphics/mevent/pal_467E14.gbapal");
-const u16 gUnknown_8467E34[] = INCBIN_U16("data/graphics/mevent/pal_467E34.gbapal");
-const u16 gUnknown_8467E54[] = INCBIN_U16("data/graphics/mevent/pal_467E54.gbapal");
-const u16 gUnknown_8467E74[] = INCBIN_U16("data/graphics/mevent/pal_467E74.gbapal");
-const u16 gUnknown_8467E94[] = INCBIN_U16("data/graphics/mevent/pal_467E94.gbapal");
-const u16 gUnknown_8467EB4[] = INCBIN_U16("data/graphics/mevent/pal_467EB4.gbapal");
-const u16 gUnknown_8467ED4[] = INCBIN_U16("data/graphics/mevent/pal_467ED4.gbapal");
-const u32 gUnknown_8467EF4[] = INCBIN_U32("data/graphics/mevent/gfx_467EF4.4bpp.lz");
-
-const struct CompressedSpriteSheet gUnknown_8467F58 = {
- gUnknown_8467EF4, 0x100, 0x8000
-};
-const struct SpritePalette gUnknown_8467F60[] = {
- {gUnknown_8467DF4, 0x8000},
- {gUnknown_8467E14, 0x8000},
- {gUnknown_8467E34, 0x8000},
- {gUnknown_8467E54, 0x8000},
- {gUnknown_8467E74, 0x8000},
- {gUnknown_8467E94, 0x8000},
- {gUnknown_8467EB4, 0x8000},
- {gUnknown_8467ED4, 0x8000}
-};
-const struct SpriteTemplate gUnknown_8467FA0 = {
- 0x8000, 0x8000, &gOamData_AffineOff_ObjNormal_32x16, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
-};
-const struct UnkStruct_8467FB8 gUnknown_8467FB8[8] = {
- {1, 0, 0, 0, gUnknown_846718C, gUnknown_8467288, gUnknown_846708C},
- {1, 0, 0, 1, gUnknown_846737C, gUnknown_8467470, gUnknown_84670AC},
- {1, 0, 0, 2, gUnknown_8467558, gUnknown_846762C, gUnknown_84670CC},
- {1, 0, 0, 3, gUnknown_8467558, gUnknown_846762C, gUnknown_84670EC},
- {1, 0, 0, 4, gUnknown_8467558, gUnknown_846762C, gUnknown_846710C},
- {1, 0, 0, 5, gUnknown_8467558, gUnknown_846762C, gUnknown_846712C},
- {1, 0, 0, 6, gUnknown_8467700, gUnknown_8467934, gUnknown_846714C},
- {1, 0, 0, 7, gUnknown_8467A7C, gUnknown_8467CAC, gUnknown_846716C}
-};
-
-bool32 InitWonderCardResources(struct MEWonderCardData * r5, struct MEventBuffer_3430_Sub * r6)
-{
- if (r5 == NULL || r6 == NULL)
- return FALSE;
- gUnknown_203F3C8 = AllocZeroed(sizeof(struct UnkStruct_203F3C8));
- if (gUnknown_203F3C8 == NULL)
- return FALSE;
- gUnknown_203F3C8->unk_0000 = *r5;
- gUnknown_203F3C8->unk_014C = *r6;
- if (gUnknown_203F3C8->unk_0000.unk_08_2 >= NELEMS(gUnknown_8467FB8))
- gUnknown_203F3C8->unk_0000.unk_08_2 = 0;
- if (gUnknown_203F3C8->unk_0000.unk_08_0 >= NELEMS(gUnknown_8467070))
- gUnknown_203F3C8->unk_0000.unk_08_0 = 0;
- if (gUnknown_203F3C8->unk_0000.unk_09 > NELEMS(gUnknown_203F3C8->unk_017D))
- gUnknown_203F3C8->unk_0000.unk_09 = 0;
- gUnknown_203F3C8->unk_0170 = &gUnknown_8467FB8[gUnknown_203F3C8->unk_0000.unk_08_2];
- return TRUE;
-}
-
-void DestroyWonderCardResources(void)
-{
- if (gUnknown_203F3C8 != NULL)
- {
- *gUnknown_203F3C8 = (struct UnkStruct_203F3C8){};
- Free(gUnknown_203F3C8);
- gUnknown_203F3C8 = NULL;
- }
-}
-
-s32 FadeToWonderCardMenu(void)
-{
- if (gUnknown_203F3C8 == NULL)
- return -1;
- switch(gUnknown_203F3C8->unk_0174)
- {
- case 0:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
- break;
- case 1:
- if (UpdatePaletteFade())
- return 0;
- break;
- case 2:
- FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
- FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
- FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
- CopyBgTilemapBufferToVram(0);
- CopyBgTilemapBufferToVram(1);
- CopyBgTilemapBufferToVram(2);
- DecompressAndCopyTileDataToVram(2, gUnknown_203F3C8->unk_0170->tiles, 0, 0x008, 0);
- gUnknown_203F3C8->unk_0176[0] = AddWindow(&gUnknown_8467074[0]);
- gUnknown_203F3C8->unk_0176[1] = AddWindow(&gUnknown_8467074[1]);
- gUnknown_203F3C8->unk_0176[2] = AddWindow(&gUnknown_8467074[2]);
- break;
- case 3:
- if (FreeTempTileDataBuffersIfPossible())
- return 0;
- gPaletteFade.bufferTransferDisabled = TRUE;
- LoadPalette(gUnknown_203F3C8->unk_0170->pal, 0x10, 0x20);
- LZ77UnCompWram(gUnknown_203F3C8->unk_0170->map, gUnknown_203F3C8->buffer_045C);
- CopyRectToBgTilemapBufferRect(2, gUnknown_203F3C8->buffer_045C, 0, 0, 30, 20, 0, 0, 30, 20, 1, 0x008, 0);
- CopyBgTilemapBufferToVram(2);
- break;
- case 4:
- sub_8145A98();
- break;
- case 5:
- sub_8145D18(0);
- sub_8145D18(1);
- sub_8145D18(2);
- CopyBgTilemapBufferToVram(1);
- break;
- case 6:
- LoadMonIconPalettes();
- break;
- case 7:
- ShowBg(1);
- ShowBg(2);
- gPaletteFade.bufferTransferDisabled = FALSE;
- sub_8146060();
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
- UpdatePaletteFade();
- break;
- default:
- if (UpdatePaletteFade())
- return 0;
- gUnknown_203F3C8->unk_0174 = 0;
- return 1;
- }
- ++gUnknown_203F3C8->unk_0174;
- return 0;
-}
-
-s32 FadeOutFromWonderCard(bool32 flag)
-{
- if (gUnknown_203F3C8 == NULL)
- return -1;
- switch (gUnknown_203F3C8->unk_0174)
- {
- case 0:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
- break;
- case 1:
- if (UpdatePaletteFade())
- return 0;
- break;
- case 2:
- FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
- FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
- FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
- CopyBgTilemapBufferToVram(0);
- CopyBgTilemapBufferToVram(1);
- CopyBgTilemapBufferToVram(2);
- break;
- case 3:
- HideBg(1);
- HideBg(2);
- RemoveWindow(gUnknown_203F3C8->unk_0176[2]);
- RemoveWindow(gUnknown_203F3C8->unk_0176[1]);
- RemoveWindow(gUnknown_203F3C8->unk_0176[0]);
- break;
- case 4:
- sub_81461D8();
- FreeMonIconPalettes();
- break;
- case 5:
- PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag);
- break;
- case 6:
- CopyBgTilemapBufferToVram(0);
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
- break;
- default:
- if (UpdatePaletteFade())
- return 0;
- gUnknown_203F3C8->unk_0174 = 0;
- return 1;
- }
- ++gUnknown_203F3C8->unk_0174;
- return 0;
-}
-
-void sub_8145A98(void)
-{
- u16 i = 0;
- u16 r6;
- u16 sp0[3] = {0, 0, 0};
-
- memcpy(gUnknown_203F3C8->unk_018B, gUnknown_203F3C8->unk_0000.unk_0A, 40);
- gUnknown_203F3C8->unk_018B[40] = EOS;
- memcpy(gUnknown_203F3C8->unk_01B4, gUnknown_203F3C8->unk_0000.unk_32, 40);
- gUnknown_203F3C8->unk_01B4[40] = EOS;
- if (gUnknown_203F3C8->unk_0000.unk_04 > 999999)
- gUnknown_203F3C8->unk_0000.unk_04 = 999999;
- ConvertIntToDecimalStringN(gUnknown_203F3C8->unk_01DD, gUnknown_203F3C8->unk_0000.unk_04, STR_CONV_MODE_LEFT_ALIGN, 6);
- for (i = 0; i < 4; i++)
- {
- memcpy(gUnknown_203F3C8->unk_01E4[i], gUnknown_203F3C8->unk_0000.unk_5A[i], 40);
- gUnknown_203F3C8->unk_01E4[i][40] = EOS;
- }
- memcpy(gUnknown_203F3C8->unk_0288, gUnknown_203F3C8->unk_0000.unk_FA, 40);
- gUnknown_203F3C8->unk_0288[40] = EOS;
- switch (gUnknown_203F3C8->unk_0000.unk_08_0)
- {
- case 0:
- memcpy(gUnknown_203F3C8->unk_02B1, gUnknown_203F3C8->unk_0000.unk_122, 40);
- gUnknown_203F3C8->unk_02B1[40] = EOS;
- break;
- case 1:
- gUnknown_203F3C8->unk_02B1[00] = EOS;
- break;
- case 2:
- gUnknown_203F3C8->unk_02B1[00] = EOS;
- sp0[0] = gUnknown_203F3C8->unk_014C.unk_00 < 999 ? gUnknown_203F3C8->unk_014C.unk_00 : 999;
- sp0[1] = gUnknown_203F3C8->unk_014C.unk_02 < 999 ? gUnknown_203F3C8->unk_014C.unk_02 : 999;
- sp0[2] = gUnknown_203F3C8->unk_014C.unk_04 < 999 ? gUnknown_203F3C8->unk_014C.unk_04 : 999;
- for (i = 0; i < 8; i++)
- {
- memset(gUnknown_203F3C8->unk_02DC[i].unk_42, EOS, 4);
- memset(gUnknown_203F3C8->unk_02DC[i].unk_01, EOS, 41);
- }
- for (i = 0, r6 = 0; i < 40; i++)
- {
- if (gUnknown_203F3C8->unk_0000.unk_122[i] != 0xF7)
- {
- gUnknown_203F3C8->unk_02DC[gUnknown_203F3C8->unk_0175].unk_01[r6] = gUnknown_203F3C8->unk_0000.unk_122[i];
- r6++;
- }
- else
- {
- u8 r3 = gUnknown_203F3C8->unk_0000.unk_122[i + 1];
- if (r3 > 2)
- {
- i += 2;
- }
- else
- {
- ConvertIntToDecimalStringN(gUnknown_203F3C8->unk_02DC[gUnknown_203F3C8->unk_0175].unk_42, sp0[r3], STR_CONV_MODE_LEADING_ZEROS, 3);
- gUnknown_203F3C8->unk_02DC[gUnknown_203F3C8->unk_0175].unk_00 = gUnknown_203F3C8->unk_0000.unk_122[i + 2];
- gUnknown_203F3C8->unk_0175++;
- if (gUnknown_203F3C8->unk_0175 > 7)
- break;
- r6 = 0;
- i += 2;
- }
- }
- }
- }
-}
-
-void sub_8145D18(u8 whichWindow)
-{
- s8 sp0C = 0;
- s32 windowId = gUnknown_203F3C8->unk_0176[whichWindow];
- PutWindowTilemap(windowId);
- FillWindowPixelBuffer(windowId, 0);
- switch (whichWindow)
- {
- case 0:
- {
- s32 x;
- AddTextPrinterParameterized3(windowId, 3, 0, 1, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_018B);
- x = 160 - GetStringWidth(3, gUnknown_203F3C8->unk_01B4, GetFontAttribute(3, 2));
- if (x < 0)
- x = 0;
- AddTextPrinterParameterized3(windowId, 3, x, 17, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_01B4);
- if (gUnknown_203F3C8->unk_0000.unk_04 != 0)
- {
- AddTextPrinterParameterized3(windowId, 2, 166, 17, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_01DD);
- }
- break;
- }
- case 1:
- for (; sp0C < 4; sp0C++)
- {
- AddTextPrinterParameterized3(windowId, 3, 0, 16 * sp0C + 2, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal2], 0, gUnknown_203F3C8->unk_01E4[sp0C]);
- }
- break;
- case 2:
- AddTextPrinterParameterized3(windowId, 3, 0, gUnknown_8467070[gUnknown_203F3C8->unk_0000.unk_08_0], gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_0288);
- if (gUnknown_203F3C8->unk_0000.unk_08_0 != 2)
- {
- AddTextPrinterParameterized3(windowId, 3, 0, 16 + gUnknown_8467070[gUnknown_203F3C8->unk_0000.unk_08_0], gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02B1);
- }
- else
- {
- s32 x = 0;
- s32 y = gUnknown_8467070[gUnknown_203F3C8->unk_0000.unk_08_0] + 16;
- s32 spacing = GetFontAttribute(3, 2);
- for (; sp0C < gUnknown_203F3C8->unk_0175; sp0C++)
- {
- AddTextPrinterParameterized3(windowId, 3, x, y, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02DC[sp0C].unk_01);
- if (gUnknown_203F3C8->unk_02DC[sp0C].unk_42[0] != EOS)
- {
- x += GetStringWidth(3, gUnknown_203F3C8->unk_02DC[sp0C].unk_01, spacing);
- AddTextPrinterParameterized3(windowId, 2, x, y, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02DC[sp0C].unk_42);
- x += GetStringWidth(3, gUnknown_203F3C8->unk_02DC[sp0C].unk_42, spacing) + gUnknown_203F3C8->unk_02DC[sp0C].unk_00;
- }
- }
- }
- break;
- }
- CopyWindowToVram(windowId, 3);
-}
-
-void sub_8146060(void)
-{
- u8 r7 = 0;
- gUnknown_203F3C8->unk_017C = 0xFF;
- if (gUnknown_203F3C8->unk_014C.unk_06 != SPECIES_NONE)
- {
- gUnknown_203F3C8->unk_017C = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(gUnknown_203F3C8->unk_014C.unk_06), SpriteCallbackDummy, 0xDC, 0x14, 0, FALSE);
- gSprites[gUnknown_203F3C8->unk_017C].oam.priority = 2;
- }
- if (gUnknown_203F3C8->unk_0000.unk_09 != 0 && gUnknown_203F3C8->unk_0000.unk_08_0 == 1)
- {
- LoadCompressedSpriteSheetUsingHeap(&gUnknown_8467F58);
- LoadSpritePalette(&gUnknown_8467F60[gUnknown_203F3C8->unk_0170->textPal4]);
- for (; r7 < gUnknown_203F3C8->unk_0000.unk_09; r7++)
- {
- gUnknown_203F3C8->unk_017D[r7][0] = 0xFF;
- gUnknown_203F3C8->unk_017D[r7][1] = 0xFF;
- gUnknown_203F3C8->unk_017D[r7][0] = CreateSprite(&gUnknown_8467FA0, 0xd8 - 32 * r7, 0x90, 8);
- if (gUnknown_203F3C8->unk_014C.unk_08[0][r7] != 0)
- {
- gUnknown_203F3C8->unk_017D[r7][1] = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(gUnknown_203F3C8->unk_014C.unk_08[0][r7]), SpriteCallbackDummy, 0xd8 - 32 * r7, 0x88, 0, 0);
- gSprites[gUnknown_203F3C8->unk_017D[r7][1]].oam.priority = 2;
- }
- }
- }
-}
-
-void sub_81461D8(void)
-{
- u8 r6 = 0;
- if (gUnknown_203F3C8->unk_017C != 0xFF)
- DestroyMonIcon(&gSprites[gUnknown_203F3C8->unk_017C]);
- if (gUnknown_203F3C8->unk_0000.unk_09 != 0 && gUnknown_203F3C8->unk_0000.unk_08_0 == 1)
- {
- for (; r6 < gUnknown_203F3C8->unk_0000.unk_09; r6++)
- {
- if (gUnknown_203F3C8->unk_017D[r6][0] != 0xFF)
- {
- DestroySprite(&gSprites[gUnknown_203F3C8->unk_017D[r6][0]]);
- // This might be a typo. Uncomment the next line, and comment the one that follows, to get the presumed intended behavior.
- // if (gUnknown_203F3C8->unk_017D[r6][1] != 0xFF)
- if (gUnknown_203F3C8->unk_017D[r6][0] != 0xFF)
- {
- DestroyMonIcon(&gSprites[gUnknown_203F3C8->unk_017D[r6][1]]);
- }
- }
- }
- FreeSpriteTilesByTag(0x8000);
- FreeSpritePaletteByTag(0x8000);
- }
-}
-
-struct UnkStruct_203F3CC
-{
- /*0000*/ struct MEWonderNewsData unk_0000;
- /*01bc*/ const struct UnkStruct_8467FB8 * unk_01BC;
- /*01c0*/ u8 unk_01C0_0:1;
- u8 unk_01C0_1:7;
- /*01c1*/ u8 unk_01C1;
- /*01c2*/ u8 unk_01C2_0:1;
- u8 unk_01C2_1:7;
- /*01c3*/ u8 unk_01C3_0:1;
- u8 unk_01C3_1:7;
- /*01c4*/ u16 unk_01C4;
- /*01c6*/ u16 unk_01C6;
- /*01c8*/ u16 unk_01C8[2];
- /*01cc*/ u8 filler_01CC[2];
- /*01ce*/ u8 unk_01CE[41];
- /*01f7*/ u8 unk_01F7[10][41];
- /*0394*/ struct ScrollArrowsTemplate unk_0394;
- /*03a4*/ u8 buffer_03A4[0x1000];
-};
-
-EWRAM_DATA struct UnkStruct_203F3CC * gUnknown_203F3CC = NULL;
-
-void sub_8146980(void);
-void sub_8146A30(void);
-void sub_8146B58(void);
-
-const u8 gUnknown_8468038[][3] = {
- {0, 2, 3},
- {0, 1, 2}
-};
-const struct WindowTemplate gUnknown_8468040[] = {
- {0, 1, 0, 28, 3, 15, 0x000},
- {2, 1, 3, 28, 20, 15, 0x000}
-};
-const struct ScrollArrowsTemplate gUnknown_8468050 = {
- 0x02, 0xe8, 0x18, 0x03, 0xe8, 0x98,
- 0x0000, 0x0002, 0x1000, 0x1000, 0x0,
-};
-
-const u16 gUnknown_8468060[] = INCBIN_U16("data/graphics/mevent/pal_468060.gbapal");
-const u16 gUnknown_8468080[] = INCBIN_U16("data/graphics/mevent/pal_468080.gbapal");
-const u16 gUnknown_84680A0[] = INCBIN_U16("data/graphics/mevent/pal_4680A0.gbapal");
-const u8 gUnknown_84680C0[] = INCBIN_U8("data/graphics/mevent/gfx_4680C0.4bpp.lz");
-const u8 gUnknown_8468140[] = INCBIN_U8("data/graphics/mevent/tilemap_468140.bin.lz");
-const u8 gUnknown_846821C[] = INCBIN_U8("data/graphics/mevent/gfx_46821C.4bpp.lz");
-const u8 gUnknown_846824C[] = INCBIN_U8("data/graphics/mevent/tilemap_46824C.bin.lz");
-const u8 gUnknown_846830C[] = INCBIN_U8("data/graphics/mevent/gfx_46830C.4bpp.lz");
-const u8 gUnknown_846837C[] = INCBIN_U8("data/graphics/mevent/tilemap_46837C.bin.lz");
-const u8 gUnknown_8468448[] = INCBIN_U8("data/graphics/mevent/gfx_468448.4bpp.lz");
-const u8 gUnknown_84684D8[] = INCBIN_U8("data/graphics/mevent/tilemap_4684D8.bin.lz");
-const u8 gUnknown_84685B4[] = INCBIN_U8("data/graphics/mevent/gfx_4685B4.4bpp.lz");
-const u8 gUnknown_8468644[] = INCBIN_U8("data/graphics/mevent/tilemap_468644.bin.lz");
-
-const struct UnkStruct_8467FB8 gUnknown_8468720[] = {
- {1, 0, 0, 0, gUnknown_84680C0, gUnknown_8468140, gUnknown_8468060},
- {1, 0, 0, 0, gUnknown_846821C, gUnknown_846824C, gUnknown_84670AC},
- {1, 0, 0, 0, gUnknown_846830C, gUnknown_846837C, gUnknown_84670CC},
- {1, 0, 0, 0, gUnknown_846830C, gUnknown_846837C, gUnknown_84670EC},
- {1, 0, 0, 0, gUnknown_846830C, gUnknown_846837C, gUnknown_846710C},
- {1, 0, 0, 0, gUnknown_846830C, gUnknown_846837C, gUnknown_846712C},
- {1, 0, 0, 0, gUnknown_8468448, gUnknown_84684D8, gUnknown_8468080},
- {1, 0, 0, 0, gUnknown_84685B4, gUnknown_8468644, gUnknown_84680A0}
-};
-
-bool32 InitWonderNewsResources(const struct MEWonderNewsData * a0)
-{
- if (a0 == NULL)
- return FALSE;
- gUnknown_203F3CC = AllocZeroed(sizeof(struct UnkStruct_203F3CC));
- if (gUnknown_203F3CC == NULL)
- return FALSE;
- gUnknown_203F3CC->unk_0000 = *a0;
- if (gUnknown_203F3CC->unk_0000.unk_03 >= NELEMS(gUnknown_8468720))
- gUnknown_203F3CC->unk_0000.unk_03 = 0;
- gUnknown_203F3CC->unk_01BC = &gUnknown_8468720[gUnknown_203F3CC->unk_0000.unk_03];
- gUnknown_203F3CC->unk_01C1 = 0xFF;
- return TRUE;
-}
-
-void DestroyWonderNewsResources(void)
-{
- if (gUnknown_203F3CC != NULL)
- {
- *gUnknown_203F3CC = (struct UnkStruct_203F3CC){};
- Free(gUnknown_203F3CC);
- gUnknown_203F3CC = NULL;
- }
-}
-
-s32 FadeToWonderNewsMenu(void)
-{
- if (gUnknown_203F3CC == NULL)
- return -1;
-
- switch (gUnknown_203F3CC->unk_01C0_1)
- {
- case 0:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
- break;
- case 1:
- if (UpdatePaletteFade())
- return 0;
- ChangeBgY(0, 0, 0);
- ChangeBgY(1, 0, 0);
- ChangeBgY(2, 0, 0);
- ChangeBgY(3, 0, 0);
- SetGpuReg(REG_OFFSET_WIN0H, 0xF0);
- SetGpuReg(REG_OFFSET_WIN0V, 0x1A98);
- SetGpuReg(REG_OFFSET_WININ, 0x1F);
- SetGpuReg(REG_OFFSET_WINOUT, 0x1B);
- SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- break;
- case 2:
- FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
- FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
- FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
- FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 20);
- CopyBgTilemapBufferToVram(0);
- CopyBgTilemapBufferToVram(1);
- CopyBgTilemapBufferToVram(2);
- CopyBgTilemapBufferToVram(3);
- DecompressAndCopyTileDataToVram(3, gUnknown_203F3CC->unk_01BC->tiles, 0, 8, 0);
- gUnknown_203F3CC->unk_01C8[0] = AddWindow(&gUnknown_8468040[0]);
- gUnknown_203F3CC->unk_01C8[1] = AddWindow(&gUnknown_8468040[1]);
- break;
- case 3:
- if (FreeTempTileDataBuffersIfPossible())
- return 0;
- gPaletteFade.bufferTransferDisabled = TRUE;
- LoadPalette(gUnknown_203F3CC->unk_01BC->pal, 0x10, 0x20);
- LZ77UnCompWram(gUnknown_203F3CC->unk_01BC->map, gUnknown_203F3CC->buffer_03A4);
- CopyRectToBgTilemapBufferRect(1, gUnknown_203F3CC->buffer_03A4, 0, 0, 30, 3, 0, 0, 30, 3, 1, 8, 0);
- CopyRectToBgTilemapBufferRect(3, gUnknown_203F3CC->buffer_03A4, 0, 3, 30, 23, 0, 3, 30, 23, 1, 8, 0);
- CopyBgTilemapBufferToVram(1);
- CopyBgTilemapBufferToVram(3);
- break;
- case 4:
- sub_8146980();
- break;
- case 5:
- sub_8146A30();
- CopyBgTilemapBufferToVram(0);
- CopyBgTilemapBufferToVram(2);
- break;
- case 6:
- ShowBg(1);
- ShowBg(2);
- ShowBg(3);
- gPaletteFade.bufferTransferDisabled = FALSE;
- gUnknown_203F3CC->unk_01C1 = AddScrollIndicatorArrowPair(&gUnknown_203F3CC->unk_0394, &gUnknown_203F3CC->unk_01C6);
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
- UpdatePaletteFade();
- break;
- default:
- if (UpdatePaletteFade())
- return 0;
- gUnknown_203F3CC->unk_01C0_1 = 0;
- return 1;
- }
-
- ++gUnknown_203F3CC->unk_01C0_1;
- return 0;
-}
-
-s32 FadeOutFromWonderNews(bool32 flag)
-{
- if (gUnknown_203F3CC == NULL)
- return -1;
- switch (gUnknown_203F3CC->unk_01C0_1)
- {
- case 0:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
- break;
- case 1:
- if (UpdatePaletteFade())
- return 0;
- ChangeBgY(2, 0, 0);
- SetGpuReg(REG_OFFSET_WIN0H, 0);
- SetGpuReg(REG_OFFSET_WIN0V, 0);
- SetGpuReg(REG_OFFSET_WININ, 0);
- SetGpuReg(REG_OFFSET_WINOUT, 0);
- ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- break;
- case 2:
- FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
- FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
- FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 24);
- FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 24);
- CopyBgTilemapBufferToVram(0);
- CopyBgTilemapBufferToVram(1);
- CopyBgTilemapBufferToVram(2);
- CopyBgTilemapBufferToVram(3);
- break;
- case 3:
- HideBg(1);
- HideBg(2);
- RemoveWindow(gUnknown_203F3CC->unk_01C8[1]);
- RemoveWindow(gUnknown_203F3CC->unk_01C8[0]);
- break;
- case 4:
- ChangeBgY(2, 0, 0);
- ChangeBgY(3, 0, 0);
- if (gUnknown_203F3CC->unk_01C1 != 0xFF)
- {
- RemoveScrollIndicatorArrowPair(gUnknown_203F3CC->unk_01C1);
- gUnknown_203F3CC->unk_01C1 = 0xFF;
- }
- break;
- case 5:
- PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag);
- break;
- case 6:
- MG_DrawCheckerboardPattern();
- CopyBgTilemapBufferToVram(0);
- CopyBgTilemapBufferToVram(3);
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
- break;
- default:
- if (UpdatePaletteFade())
- return 0;
- gUnknown_203F3CC->unk_01C0_1 = 0;
- return 1;
- }
- ++gUnknown_203F3CC->unk_01C0_1;
- return 0;
-}
-
-void MENews_RemoveScrollIndicatorArrowPair(void)
-{
- if (!gUnknown_203F3CC->unk_01C0_0 && gUnknown_203F3CC->unk_01C1 != 0xFF)
- {
- RemoveScrollIndicatorArrowPair(gUnknown_203F3CC->unk_01C1);
- gUnknown_203F3CC->unk_01C1 = 0xFF;
- gUnknown_203F3CC->unk_01C0_0 = TRUE;
- }
-}
-
-
-void MENews_AddScrollIndicatorArrowPair(void)
-{
- if (gUnknown_203F3CC->unk_01C0_0)
- {
- gUnknown_203F3CC->unk_01C1 = AddScrollIndicatorArrowPair(&gUnknown_203F3CC->unk_0394, &gUnknown_203F3CC->unk_01C6);
- gUnknown_203F3CC->unk_01C0_0 = FALSE;
- }
-}
-
-u32 MENews_GetInput(u16 input)
-{
- if (gUnknown_203F3CC->unk_01C2_0)
- {
- sub_8146B58();
- return 0xFF;
- }
- switch (input)
- {
- case A_BUTTON:
- return 0;
- case B_BUTTON:
- return 1;
- case DPAD_UP:
- if (gUnknown_203F3CC->unk_01C6 == 0)
- return 0xFF;
- if (gUnknown_203F3CC->unk_01C0_0)
- return 0xFF;
- gUnknown_203F3CC->unk_01C3_0 = FALSE;
- break;
- case DPAD_DOWN:
- if (gUnknown_203F3CC->unk_01C6 == gUnknown_203F3CC->unk_01C4)
- return 0xFF;
- if (gUnknown_203F3CC->unk_01C0_0)
- return 0xFF;
- gUnknown_203F3CC->unk_01C3_0 = TRUE;
- break;
- default:
- return 0xFF;
- }
- gUnknown_203F3CC->unk_01C2_0 = TRUE;
- gUnknown_203F3CC->unk_01C2_1 = 2;
- gUnknown_203F3CC->unk_01C3_1 = 0;
- if (gUnknown_203F3CC->unk_01C3_0 == FALSE)
- return 2;
- else
- return 3;
-}
-
-void sub_8146980(void)
-{
- u8 i = 0;
- memcpy(gUnknown_203F3CC->unk_01CE, gUnknown_203F3CC->unk_0000.unk_04, 40);
- gUnknown_203F3CC->unk_01CE[40] = EOS;
- for (; i < 10; ++i)
- {
- memcpy(gUnknown_203F3CC->unk_01F7[i], gUnknown_203F3CC->unk_0000.unk_2C[i], 40);
- gUnknown_203F3CC->unk_01F7[i][40] = EOS;
- if (i > 7 && gUnknown_203F3CC->unk_01F7[i][0] != EOS)
- ++gUnknown_203F3CC->unk_01C4;
- }
- gUnknown_203F3CC->unk_0394 = gUnknown_8468050;
- gUnknown_203F3CC->unk_0394.fullyDownThreshold = gUnknown_203F3CC->unk_01C4;
-}
-
-void sub_8146A30(void)
-{
- u8 i = 0;
- s32 x;
- PutWindowTilemap(gUnknown_203F3CC->unk_01C8[0]);
- PutWindowTilemap(gUnknown_203F3CC->unk_01C8[1]);
- FillWindowPixelBuffer(gUnknown_203F3CC->unk_01C8[0], 0);
- FillWindowPixelBuffer(gUnknown_203F3CC->unk_01C8[1], 0);
- x = (0xe0 - GetStringWidth(3, gUnknown_203F3CC->unk_01CE, GetFontAttribute(3, 2))) / 2;
- if (x < 0)
- x = 0;
- AddTextPrinterParameterized3(gUnknown_203F3CC->unk_01C8[0], 3, x, 6, gUnknown_8468038[gUnknown_203F3CC->unk_01BC->textPal1], 0, gUnknown_203F3CC->unk_01CE);
- for (; i < 10; ++i)
- {
- AddTextPrinterParameterized3(gUnknown_203F3CC->unk_01C8[1], 3, 0, 16 * i + 2, gUnknown_8468038[gUnknown_203F3CC->unk_01BC->textPal2], 0, gUnknown_203F3CC->unk_01F7[i]);
- }
- CopyWindowToVram(gUnknown_203F3CC->unk_01C8[0], 3);
- CopyWindowToVram(gUnknown_203F3CC->unk_01C8[1], 3);
-}
-
-void sub_8146B58(void)
-{
- u16 r4 = gUnknown_203F3CC->unk_01C2_1;
- r4 <<= 8;
- if (gUnknown_203F3CC->unk_01C3_0)
- {
- ChangeBgY(2, r4, 1);
- ChangeBgY(3, r4, 1);
- }
- else
- {
- ChangeBgY(2, r4, 2);
- ChangeBgY(3, r4, 2);
- }
- gUnknown_203F3CC->unk_01C3_1 += gUnknown_203F3CC->unk_01C2_1;
- if (gUnknown_203F3CC->unk_01C3_1 > 15)
- {
- if (gUnknown_203F3CC->unk_01C3_0)
- ++gUnknown_203F3CC->unk_01C6;
- else
- --gUnknown_203F3CC->unk_01C6;
- gUnknown_203F3CC->unk_01C2_0 = FALSE;
- gUnknown_203F3CC->unk_01C3_1 = 0;
- }
-}
diff --git a/src/mevent_client.c b/src/mevent_client.c
index 4da0b4bc1..d7eff1ec6 100644
--- a/src/mevent_client.c
+++ b/src/mevent_client.c
@@ -195,15 +195,16 @@ static u32 client_mainseq_4(struct mevent_client * svr)
mevent_client_send_word(svr, 0x13, svr->param);
break;
case 10:
- sub_8143F68(svr->recvBuffer);
+ OverwriteSavedWonderCardWithReceivedCard(svr->recvBuffer);
break;
case 9:
- if (!sub_8143EF4(svr->recvBuffer))
+ if (!MEvent_HaveAlreadyReceivedWonderNews(svr->recvBuffer))
{
- sub_8143DC8(svr->recvBuffer);
+ OverwriteSavedWonderNewsWithReceivedNews(svr->recvBuffer);
mevent_client_send_word(svr, 0x13, 0);
}
else
+ // Other trainer already has news
mevent_client_send_word(svr, 0x13, 1);
break;
case 15:
@@ -211,7 +212,7 @@ static u32 client_mainseq_4(struct mevent_client * svr)
svr->flag = 0;
break;
case 16:
- sub_8144254(svr->recvBuffer);
+ MEvent_ReceiveDistributionMon(svr->recvBuffer);
break;
case 17:
MEventSetRamScript(svr->recvBuffer, 1000);
diff --git a/src/mevent_server.c b/src/mevent_server.c
index bebd69fe3..f1505fcbc 100644
--- a/src/mevent_server.c
+++ b/src/mevent_server.c
@@ -1,10 +1,6 @@
#include "global.h"
#include "malloc.h"
-#include "decompress.h"
-#include "overworld.h"
#include "script.h"
-#include "battle_tower.h"
-#include "mystery_event_script.h"
#include "mevent.h"
#include "mevent_server.h"
@@ -176,7 +172,7 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr)
case 9:
AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 408);
ptr = mevent_first_if_not_null_else_second(cmd->parameter, &svr->sendWord);
- svr->param = sub_8144434(ptr, svr->mevent_unk1442cc, ptr);
+ svr->param = MEvent_CanPlayerReceiveDistributionMon(ptr, svr->mevent_unk1442cc, ptr);
break;
case 10:
AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 415);
@@ -247,7 +243,7 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr)
case 26:
AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, ABSPATH("mevent_server.c"), 506);
memcpy(svr->card, GetSavedWonderCard(), 332);
- sub_814410C(svr->card);
+ MEvent_WonderCardResetUnk08_6(svr->card);
break;
case 27:
AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, ABSPATH("mevent_server.c"), 512);
diff --git a/src/mevent_server_helpers.c b/src/mevent_server_helpers.c
index 94c01c081..234064afc 100644
--- a/src/mevent_server_helpers.c
+++ b/src/mevent_server_helpers.c
@@ -1,14 +1,7 @@
#include "global.h"
-#include "malloc.h"
-#include "decompress.h"
#include "util.h"
#include "link.h"
#include "link_rfu.h"
-#include "overworld.h"
-#include "script.h"
-#include "battle_tower.h"
-#include "mystery_event_script.h"
-#include "mevent.h"
#include "mevent_server.h"
static u32 mevent_receive_func(struct mevent_srv_sub *);
diff --git a/src/mevent_show_card.c b/src/mevent_show_card.c
new file mode 100644
index 000000000..d2df613ae
--- /dev/null
+++ b/src/mevent_show_card.c
@@ -0,0 +1,456 @@
+#include "global.h"
+#include "constants/species.h"
+#include "bg.h"
+#include "palette.h"
+#include "decompress.h"
+#include "malloc.h"
+#include "menu.h"
+#include "new_menu_helpers.h"
+#include "pokemon_icon.h"
+#include "mystery_gift_menu.h"
+#include "string_util.h"
+#include "mevent.h"
+#include "battle_anim.h"
+
+struct MEventScreenMgr_02DC
+{
+ u8 nDigits;
+ u8 nameTxt[41];
+ u8 numberTxt[4];
+};
+
+struct MEventScreenMgr
+{
+ /*0000*/ struct MEWonderCardData wonderCard;
+ /*014c*/ struct MEventBuffer_3430_Sub buff3430Sub;
+ /*0170*/ const struct UnkStruct_8467FB8 * bgSpec;
+ /*0174*/ u8 state;
+ /*0175*/ u8 recordIdx;
+ /*0176*/ u16 windowIds[3];
+ /*017C*/ u8 monIconId;
+ /*017D*/ u8 cardIconAndShadowSprites[7][2];
+ /*018B*/ u8 title[41];
+ /*01B4*/ u8 subtitle[41];
+ /*01DD*/ u8 unk_01DD[7];
+ /*01E4*/ u8 mainMessageLines[4][41];
+ /*0288*/ u8 instructionsLine1[41];
+ /*02B1*/ u8 instructionsLine2[41];
+ /*02DC*/ struct MEventScreenMgr_02DC recordStrings[8];
+ /*045C*/ u8 buffer_045C[0x1000];
+};
+
+static EWRAM_DATA struct MEventScreenMgr * sMEventScreenData = NULL;
+
+static void sub_8145A98(void);
+static void sub_8145D18(u8 whichWindow);
+static void sub_8146060(void);
+static void sub_81461D8(void);
+
+static const u8 gUnknown_8467068[][3] = {
+ {0, 2, 3},
+ {0, 1, 2}
+};
+
+static const u8 ALIGNED(4) sTextYCoords[3] = {7, 4, 7};
+
+static const struct WindowTemplate sWindowTemplates[] = {
+ {
+ .bg = 1,
+ .tilemapLeft = 1,
+ .tilemapTop = 1,
+ .width = 25,
+ .height = 4,
+ .paletteNum = 15,
+ .baseBlock = 0x29c},
+ {
+ .bg = 1,
+ .tilemapLeft = 1,
+ .tilemapTop = 6,
+ .width = 28,
+ .height = 8,
+ .paletteNum = 15,
+ .baseBlock = 0x1bc},
+ {
+ .bg = 1,
+ .tilemapLeft = 1,
+ .tilemapTop = 14,
+ .width = 28,
+ .height = 5,
+ .paletteNum = 15,
+ .baseBlock = 0x130}
+};
+
+static const u16 gCard0Pal[] = INCBIN_U16("data/graphics/mevent/pal_46708C.gbapal");
+const u16 gCard1Pal[] = INCBIN_U16("data/graphics/mevent/pal_4670AC.gbapal");
+const u16 gCard2Pal[] = INCBIN_U16("data/graphics/mevent/pal_4670CC.gbapal");
+const u16 gCard3Pal[] = INCBIN_U16("data/graphics/mevent/pal_4670EC.gbapal");
+const u16 gCard4Pal[] = INCBIN_U16("data/graphics/mevent/pal_46710C.gbapal");
+const u16 gCard5Pal[] = INCBIN_U16("data/graphics/mevent/pal_46712C.gbapal");
+static const u16 gCard6Pal[] = INCBIN_U16("data/graphics/mevent/pal_46714C.gbapal");
+static const u16 gCard7Pal[] = INCBIN_U16("data/graphics/mevent/pal_46716C.gbapal");
+static const u8 sCard0Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_46718C.4bpp.lz");
+static const u8 sCard0Map[] = INCBIN_U8("data/graphics/mevent/tilemap_467288.bin.lz");
+static const u8 sCard1Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_46737C.4bpp.lz");
+static const u8 sCard1Map[] = INCBIN_U8("data/graphics/mevent/tilemap_467470.bin.lz");
+static const u8 sCard2Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_467558.4bpp.lz");
+static const u8 sCard2Map[] = INCBIN_U8("data/graphics/mevent/tilemap_46762C.bin.lz");
+static const u8 sCard6Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_467700.4bpp.lz");
+static const u8 sCard6Map[] = INCBIN_U8("data/graphics/mevent/tilemap_467934.bin.lz");
+static const u8 sCard7Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_467A7C.4bpp.lz");
+static const u8 sCard7Map[] = INCBIN_U8("data/graphics/mevent/tilemap_467CAC.bin.lz");
+static const u16 gUnknown_8467DF4[] = INCBIN_U16("data/graphics/mevent/pal_467DF4.gbapal");
+static const u16 gUnknown_8467E14[] = INCBIN_U16("data/graphics/mevent/pal_467E14.gbapal");
+static const u16 gUnknown_8467E34[] = INCBIN_U16("data/graphics/mevent/pal_467E34.gbapal");
+static const u16 gUnknown_8467E54[] = INCBIN_U16("data/graphics/mevent/pal_467E54.gbapal");
+static const u16 gUnknown_8467E74[] = INCBIN_U16("data/graphics/mevent/pal_467E74.gbapal");
+static const u16 gUnknown_8467E94[] = INCBIN_U16("data/graphics/mevent/pal_467E94.gbapal");
+static const u16 gUnknown_8467EB4[] = INCBIN_U16("data/graphics/mevent/pal_467EB4.gbapal");
+static const u16 gUnknown_8467ED4[] = INCBIN_U16("data/graphics/mevent/pal_467ED4.gbapal");
+static const u32 gUnknown_8467EF4[] = INCBIN_U32("data/graphics/mevent/gfx_467EF4.4bpp.lz");
+
+static const struct CompressedSpriteSheet sShadowSpriteSheet = {
+ gUnknown_8467EF4, 0x100, 0x8000
+};
+
+static const struct SpritePalette sShadowSpritePalettes[] = {
+ {gUnknown_8467DF4, 0x8000},
+ {gUnknown_8467E14, 0x8000},
+ {gUnknown_8467E34, 0x8000},
+ {gUnknown_8467E54, 0x8000},
+ {gUnknown_8467E74, 0x8000},
+ {gUnknown_8467E94, 0x8000},
+ {gUnknown_8467EB4, 0x8000},
+ {gUnknown_8467ED4, 0x8000}
+};
+
+static const struct SpriteTemplate sShadowSpriteTemplate = {
+ 0x8000, 0x8000, &gOamData_AffineOff_ObjNormal_32x16, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct UnkStruct_8467FB8 sCardGfxPtrs[8] = {
+ {1, 0, 0, 0, sCard0Gfx, sCard0Map, gCard0Pal},
+ {1, 0, 0, 1, sCard1Gfx, sCard1Map, gCard1Pal},
+ {1, 0, 0, 2, sCard2Gfx, sCard2Map, gCard2Pal},
+ {1, 0, 0, 3, sCard2Gfx, sCard2Map, gCard3Pal},
+ {1, 0, 0, 4, sCard2Gfx, sCard2Map, gCard4Pal},
+ {1, 0, 0, 5, sCard2Gfx, sCard2Map, gCard5Pal},
+ {1, 0, 0, 6, sCard6Gfx, sCard6Map, gCard6Pal},
+ {1, 0, 0, 7, sCard7Gfx, sCard7Map, gCard7Pal}
+};
+
+bool32 InitWonderCardResources(struct MEWonderCardData * card, struct MEventBuffer_3430_Sub * b3430sub)
+{
+ if (card == NULL || b3430sub == NULL)
+ return FALSE;
+ sMEventScreenData = AllocZeroed(sizeof(struct MEventScreenMgr));
+ if (sMEventScreenData == NULL)
+ return FALSE;
+ sMEventScreenData->wonderCard = *card;
+ sMEventScreenData->buff3430Sub = *b3430sub;
+ if (sMEventScreenData->wonderCard.unk_08_2 >= NELEMS(sCardGfxPtrs))
+ sMEventScreenData->wonderCard.unk_08_2 = 0;
+ if (sMEventScreenData->wonderCard.unk_08_0 >= NELEMS(sTextYCoords))
+ sMEventScreenData->wonderCard.unk_08_0 = 0;
+ if (sMEventScreenData->wonderCard.recvMonCapacity > NELEMS(sMEventScreenData->cardIconAndShadowSprites))
+ sMEventScreenData->wonderCard.recvMonCapacity = 0;
+ sMEventScreenData->bgSpec = &sCardGfxPtrs[sMEventScreenData->wonderCard.unk_08_2];
+ return TRUE;
+}
+
+void DestroyWonderCardResources(void)
+{
+ if (sMEventScreenData != NULL)
+ {
+ *sMEventScreenData = (struct MEventScreenMgr){};
+ Free(sMEventScreenData);
+ sMEventScreenData = NULL;
+ }
+}
+
+s32 FadeToWonderCardMenu(void)
+{
+ if (sMEventScreenData == NULL)
+ return -1;
+ switch(sMEventScreenData->state)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ break;
+ case 1:
+ if (UpdatePaletteFade())
+ return 0;
+ break;
+ case 2:
+ FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ DecompressAndCopyTileDataToVram(2, sMEventScreenData->bgSpec->tiles, 0, 0x008, 0);
+ sMEventScreenData->windowIds[0] = AddWindow(&sWindowTemplates[0]);
+ sMEventScreenData->windowIds[1] = AddWindow(&sWindowTemplates[1]);
+ sMEventScreenData->windowIds[2] = AddWindow(&sWindowTemplates[2]);
+ break;
+ case 3:
+ if (FreeTempTileDataBuffersIfPossible())
+ return 0;
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ LoadPalette(sMEventScreenData->bgSpec->pal, 0x10, 0x20);
+ LZ77UnCompWram(sMEventScreenData->bgSpec->map, sMEventScreenData->buffer_045C);
+ CopyRectToBgTilemapBufferRect(2, sMEventScreenData->buffer_045C, 0, 0, 30, 20, 0, 0, 30, 20, 1, 0x008, 0);
+ CopyBgTilemapBufferToVram(2);
+ break;
+ case 4:
+ sub_8145A98();
+ break;
+ case 5:
+ sub_8145D18(0);
+ sub_8145D18(1);
+ sub_8145D18(2);
+ CopyBgTilemapBufferToVram(1);
+ break;
+ case 6:
+ LoadMonIconPalettes();
+ break;
+ case 7:
+ ShowBg(1);
+ ShowBg(2);
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ sub_8146060();
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ UpdatePaletteFade();
+ break;
+ default:
+ if (UpdatePaletteFade())
+ return 0;
+ sMEventScreenData->state = 0;
+ return 1;
+ }
+ ++sMEventScreenData->state;
+ return 0;
+}
+
+s32 FadeOutFromWonderCard(bool32 flag)
+{
+ if (sMEventScreenData == NULL)
+ return -1;
+ switch (sMEventScreenData->state)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ break;
+ case 1:
+ if (UpdatePaletteFade())
+ return 0;
+ break;
+ case 2:
+ FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ break;
+ case 3:
+ HideBg(1);
+ HideBg(2);
+ RemoveWindow(sMEventScreenData->windowIds[2]);
+ RemoveWindow(sMEventScreenData->windowIds[1]);
+ RemoveWindow(sMEventScreenData->windowIds[0]);
+ break;
+ case 4:
+ sub_81461D8();
+ FreeMonIconPalettes();
+ break;
+ case 5:
+ PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag);
+ break;
+ case 6:
+ CopyBgTilemapBufferToVram(0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ break;
+ default:
+ if (UpdatePaletteFade())
+ return 0;
+ sMEventScreenData->state = 0;
+ return 1;
+ }
+ ++sMEventScreenData->state;
+ return 0;
+}
+
+static void sub_8145A98(void)
+{
+ u16 i = 0;
+ u16 r6;
+ u16 sp0[3] = {0, 0, 0};
+
+ memcpy(sMEventScreenData->title, sMEventScreenData->wonderCard.unk_0A, 40);
+ sMEventScreenData->title[40] = EOS;
+ memcpy(sMEventScreenData->subtitle, sMEventScreenData->wonderCard.unk_32, 40);
+ sMEventScreenData->subtitle[40] = EOS;
+ if (sMEventScreenData->wonderCard.unk_04 > 999999)
+ sMEventScreenData->wonderCard.unk_04 = 999999;
+ ConvertIntToDecimalStringN(sMEventScreenData->unk_01DD, sMEventScreenData->wonderCard.unk_04, STR_CONV_MODE_LEFT_ALIGN, 6);
+ for (i = 0; i < 4; i++)
+ {
+ memcpy(sMEventScreenData->mainMessageLines[i], sMEventScreenData->wonderCard.unk_5A[i], 40);
+ sMEventScreenData->mainMessageLines[i][40] = EOS;
+ }
+ memcpy(sMEventScreenData->instructionsLine1, sMEventScreenData->wonderCard.unk_FA, 40);
+ sMEventScreenData->instructionsLine1[40] = EOS;
+ switch (sMEventScreenData->wonderCard.unk_08_0)
+ {
+ case 0:
+ memcpy(sMEventScreenData->instructionsLine2, sMEventScreenData->wonderCard.unk_122, 40);
+ sMEventScreenData->instructionsLine2[40] = EOS;
+ break;
+ case 1:
+ sMEventScreenData->instructionsLine2[00] = EOS;
+ break;
+ case 2:
+ sMEventScreenData->instructionsLine2[00] = EOS;
+ sp0[0] = sMEventScreenData->buff3430Sub.linkWins < 999 ? sMEventScreenData->buff3430Sub.linkWins : 999;
+ sp0[1] = sMEventScreenData->buff3430Sub.linkLosses < 999 ? sMEventScreenData->buff3430Sub.linkLosses : 999;
+ sp0[2] = sMEventScreenData->buff3430Sub.linkTrades < 999 ? sMEventScreenData->buff3430Sub.linkTrades : 999;
+ for (i = 0; i < 8; i++)
+ {
+ memset(sMEventScreenData->recordStrings[i].numberTxt, EOS, 4);
+ memset(sMEventScreenData->recordStrings[i].nameTxt, EOS, 41);
+ }
+ for (i = 0, r6 = 0; i < 40; i++)
+ {
+ if (sMEventScreenData->wonderCard.unk_122[i] != CHAR_SPECIAL_F7)
+ {
+ sMEventScreenData->recordStrings[sMEventScreenData->recordIdx].nameTxt[r6] = sMEventScreenData->wonderCard.unk_122[i];
+ r6++;
+ }
+ else
+ {
+ u8 r3 = sMEventScreenData->wonderCard.unk_122[i + 1];
+ if (r3 > 2)
+ {
+ i += 2;
+ }
+ else
+ {
+ ConvertIntToDecimalStringN(sMEventScreenData->recordStrings[sMEventScreenData->recordIdx].numberTxt, sp0[r3], STR_CONV_MODE_LEADING_ZEROS, 3);
+ sMEventScreenData->recordStrings[sMEventScreenData->recordIdx].nDigits = sMEventScreenData->wonderCard.unk_122[i + 2];
+ sMEventScreenData->recordIdx++;
+ if (sMEventScreenData->recordIdx > 7)
+ break;
+ r6 = 0;
+ i += 2;
+ }
+ }
+ }
+ }
+}
+
+static void sub_8145D18(u8 whichWindow)
+{
+ s8 sp0C = 0;
+ s32 windowId = sMEventScreenData->windowIds[whichWindow];
+ PutWindowTilemap(windowId);
+ FillWindowPixelBuffer(windowId, 0);
+ switch (whichWindow)
+ {
+ case 0:
+ {
+ s32 x;
+ AddTextPrinterParameterized3(windowId, 3, 0, 1, gUnknown_8467068[sMEventScreenData->bgSpec->textPal1], 0, sMEventScreenData->title);
+ x = 160 - GetStringWidth(3, sMEventScreenData->subtitle, GetFontAttribute(3, 2));
+ if (x < 0)
+ x = 0;
+ AddTextPrinterParameterized3(windowId, 3, x, 17, gUnknown_8467068[sMEventScreenData->bgSpec->textPal1], 0, sMEventScreenData->subtitle);
+ if (sMEventScreenData->wonderCard.unk_04 != 0)
+ {
+ AddTextPrinterParameterized3(windowId, 2, 166, 17, gUnknown_8467068[sMEventScreenData->bgSpec->textPal1], 0, sMEventScreenData->unk_01DD);
+ }
+ break;
+ }
+ case 1:
+ for (; sp0C < 4; sp0C++)
+ {
+ AddTextPrinterParameterized3(windowId, 3, 0, 16 * sp0C + 2, gUnknown_8467068[sMEventScreenData->bgSpec->textPal2], 0, sMEventScreenData->mainMessageLines[sp0C]);
+ }
+ break;
+ case 2:
+ AddTextPrinterParameterized3(windowId, 3, 0, sTextYCoords[sMEventScreenData->wonderCard.unk_08_0], gUnknown_8467068[sMEventScreenData->bgSpec->textPal3], 0, sMEventScreenData->instructionsLine1);
+ if (sMEventScreenData->wonderCard.unk_08_0 != 2)
+ {
+ AddTextPrinterParameterized3(windowId, 3, 0, 16 + sTextYCoords[sMEventScreenData->wonderCard.unk_08_0], gUnknown_8467068[sMEventScreenData->bgSpec->textPal3], 0, sMEventScreenData->instructionsLine2);
+ }
+ else
+ {
+ s32 x = 0;
+ s32 y = sTextYCoords[sMEventScreenData->wonderCard.unk_08_0] + 16;
+ s32 spacing = GetFontAttribute(3, 2);
+ for (; sp0C < sMEventScreenData->recordIdx; sp0C++)
+ {
+ AddTextPrinterParameterized3(windowId, 3, x, y, gUnknown_8467068[sMEventScreenData->bgSpec->textPal3], 0, sMEventScreenData->recordStrings[sp0C].nameTxt);
+ if (sMEventScreenData->recordStrings[sp0C].numberTxt[0] != EOS)
+ {
+ x += GetStringWidth(3, sMEventScreenData->recordStrings[sp0C].nameTxt, spacing);
+ AddTextPrinterParameterized3(windowId, 2, x, y, gUnknown_8467068[sMEventScreenData->bgSpec->textPal3], 0, sMEventScreenData->recordStrings[sp0C].numberTxt);
+ x += GetStringWidth(3, sMEventScreenData->recordStrings[sp0C].numberTxt, spacing) + sMEventScreenData->recordStrings[sp0C].nDigits;
+ }
+ }
+ }
+ break;
+ }
+ CopyWindowToVram(windowId, 3);
+}
+
+static void sub_8146060(void)
+{
+ u8 r7 = 0;
+ sMEventScreenData->monIconId = 0xFF;
+ if (sMEventScreenData->buff3430Sub.unk_06 != SPECIES_NONE)
+ {
+ sMEventScreenData->monIconId = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(sMEventScreenData->buff3430Sub.unk_06), SpriteCallbackDummy, 0xDC, 0x14, 0, FALSE);
+ gSprites[sMEventScreenData->monIconId].oam.priority = 2;
+ }
+ if (sMEventScreenData->wonderCard.recvMonCapacity != 0 && sMEventScreenData->wonderCard.unk_08_0 == 1)
+ {
+ LoadCompressedSpriteSheetUsingHeap(&sShadowSpriteSheet);
+ LoadSpritePalette(&sShadowSpritePalettes[sMEventScreenData->bgSpec->index]);
+ for (; r7 < sMEventScreenData->wonderCard.recvMonCapacity; r7++)
+ {
+ sMEventScreenData->cardIconAndShadowSprites[r7][0] = 0xFF;
+ sMEventScreenData->cardIconAndShadowSprites[r7][1] = 0xFF;
+ sMEventScreenData->cardIconAndShadowSprites[r7][0] = CreateSprite(&sShadowSpriteTemplate, 0xd8 - 32 * r7, 0x90, 8);
+ if (sMEventScreenData->buff3430Sub.distributedMons[0][r7] != 0)
+ {
+ sMEventScreenData->cardIconAndShadowSprites[r7][1] = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(sMEventScreenData->buff3430Sub.distributedMons[0][r7]), SpriteCallbackDummy, 0xd8 - 32 * r7, 0x88, 0, 0);
+ gSprites[sMEventScreenData->cardIconAndShadowSprites[r7][1]].oam.priority = 2;
+ }
+ }
+ }
+}
+
+static void sub_81461D8(void)
+{
+ u8 r6 = 0;
+ if (sMEventScreenData->monIconId != 0xFF)
+ DestroyMonIcon(&gSprites[sMEventScreenData->monIconId]);
+ if (sMEventScreenData->wonderCard.recvMonCapacity != 0 && sMEventScreenData->wonderCard.unk_08_0 == 1)
+ {
+ for (; r6 < sMEventScreenData->wonderCard.recvMonCapacity; r6++)
+ {
+ if (sMEventScreenData->cardIconAndShadowSprites[r6][0] != 0xFF)
+ {
+ DestroySprite(&gSprites[sMEventScreenData->cardIconAndShadowSprites[r6][0]]);
+ // This might be a typo. Uncomment the next line, and comment the one that follows, to get the presumed intended behavior.
+ // if (sMEventScreenData->cardIconAndShadowSprites[r6][1] != 0xFF)
+ if (sMEventScreenData->cardIconAndShadowSprites[r6][0] != 0xFF)
+ {
+ DestroyMonIcon(&gSprites[sMEventScreenData->cardIconAndShadowSprites[r6][1]]);
+ }
+ }
+ }
+ FreeSpriteTilesByTag(0x8000);
+ FreeSpritePaletteByTag(0x8000);
+ }
+}
diff --git a/src/mevent_show_news.c b/src/mevent_show_news.c
new file mode 100644
index 000000000..44b19b130
--- /dev/null
+++ b/src/mevent_show_news.c
@@ -0,0 +1,357 @@
+#include "global.h"
+#include "gflib.h"
+#include "menu_indicators.h"
+#include "new_menu_helpers.h"
+#include "mevent.h"
+#include "mystery_gift_menu.h"
+#include "menu.h"
+#include "link_rfu.h"
+
+struct UnkStruct_203F3CC
+{
+ /*0000*/ struct MEWonderNewsData wonderNews;
+ /*01bc*/ const struct UnkStruct_8467FB8 * bgSpec;
+ /*01c0*/ u8 verticalScrollDisabled:1;
+ u8 state:7;
+ /*01c1*/ u8 menuIndicatorsId;
+ /*01c2*/ u8 unk_01C2_0:1;
+ u8 unk_01C2_1:7;
+ /*01c3*/ u8 scrollDirection:1;
+ u8 unk_01C3_1:7;
+ /*01c4*/ u16 numMails;
+ /*01c6*/ u16 scrollOffset;
+ /*01c8*/ u16 windowIds[2];
+ /*01cc*/ u8 filler_01CC[2];
+ /*01ce*/ u8 title[41];
+ /*01f7*/ u8 messages[10][41];
+ /*0394*/ struct ScrollArrowsTemplate scrollArrowsTemplate;
+ /*03a4*/ u8 buffer_03A4[0x1000];
+};
+
+static EWRAM_DATA struct UnkStruct_203F3CC * sWork = NULL;
+
+static void sub_8146980(void);
+static void sub_8146A30(void);
+static void sub_8146B58(void);
+
+static const u8 sTextPals[][3] = {
+ {0, 2, 3},
+ {0, 1, 2}
+};
+static const struct WindowTemplate gUnknown_8468040[] = {
+ {0, 1, 0, 28, 3, 15, 0x000},
+ {2, 1, 3, 28, 20, 15, 0x000}
+};
+static const struct ScrollArrowsTemplate sScrollArrowsTemplate = {
+ 0x02, 0xe8, 0x18, 0x03, 0xe8, 0x98,
+ 0x0000, 0x0002, 0x1000, 0x1000, 0x0,
+};
+
+static const u16 sNews1Pal[] = INCBIN_U16("data/graphics/mevent/pal_468060.gbapal");
+static const u16 sNews6Pal[] = INCBIN_U16("data/graphics/mevent/pal_468080.gbapal");
+static const u16 sNews7Pal[] = INCBIN_U16("data/graphics/mevent/pal_4680A0.gbapal");
+static const u8 sNews0Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_4680C0.4bpp.lz");
+static const u8 sNews0Map[] = INCBIN_U8("data/graphics/mevent/tilemap_468140.bin.lz");
+static const u8 sNews1Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_46821C.4bpp.lz");
+static const u8 sNews1Map[] = INCBIN_U8("data/graphics/mevent/tilemap_46824C.bin.lz");
+static const u8 sNews2Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_46830C.4bpp.lz");
+static const u8 sNews2Map[] = INCBIN_U8("data/graphics/mevent/tilemap_46837C.bin.lz");
+static const u8 sNews6Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_468448.4bpp.lz");
+static const u8 sNews6Map[] = INCBIN_U8("data/graphics/mevent/tilemap_4684D8.bin.lz");
+static const u8 sNews7Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_4685B4.4bpp.lz");
+static const u8 sNews7Map[] = INCBIN_U8("data/graphics/mevent/tilemap_468644.bin.lz");
+
+static const struct UnkStruct_8467FB8 sBgSpecs[] = {
+ {1, 0, 0, 0, sNews0Gfx, sNews0Map, sNews1Pal},
+ {1, 0, 0, 0, sNews1Gfx, sNews1Map, gCard1Pal},
+ {1, 0, 0, 0, sNews2Gfx, sNews2Map, gCard2Pal},
+ {1, 0, 0, 0, sNews2Gfx, sNews2Map, gCard3Pal},
+ {1, 0, 0, 0, sNews2Gfx, sNews2Map, gCard4Pal},
+ {1, 0, 0, 0, sNews2Gfx, sNews2Map, gCard5Pal},
+ {1, 0, 0, 0, sNews6Gfx, sNews6Map, sNews6Pal},
+ {1, 0, 0, 0, sNews7Gfx, sNews7Map, sNews7Pal}
+};
+
+bool32 InitWonderNewsResources(const struct MEWonderNewsData * news)
+{
+ if (news == NULL)
+ return FALSE;
+ sWork = AllocZeroed(sizeof(struct UnkStruct_203F3CC));
+ if (sWork == NULL)
+ return FALSE;
+ sWork->wonderNews = *news;
+ if (sWork->wonderNews.unk_03 >= NELEMS(sBgSpecs))
+ sWork->wonderNews.unk_03 = 0;
+ sWork->bgSpec = &sBgSpecs[sWork->wonderNews.unk_03];
+ sWork->menuIndicatorsId = 0xFF;
+ return TRUE;
+}
+
+void DestroyWonderNewsResources(void)
+{
+ if (sWork != NULL)
+ {
+ *sWork = (struct UnkStruct_203F3CC){};
+ Free(sWork);
+ sWork = NULL;
+ }
+}
+
+s32 FadeToWonderNewsMenu(void)
+{
+ if (sWork == NULL)
+ return -1;
+
+ switch (sWork->state)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ break;
+ case 1:
+ if (UpdatePaletteFade())
+ return 0;
+ ChangeBgY(0, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgY(3, 0, 0);
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 240));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(26, 152));
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ);
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ break;
+ case 2:
+ FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ DecompressAndCopyTileDataToVram(3, sWork->bgSpec->tiles, 0, 8, 0);
+ sWork->windowIds[0] = AddWindow(&gUnknown_8468040[0]);
+ sWork->windowIds[1] = AddWindow(&gUnknown_8468040[1]);
+ break;
+ case 3:
+ if (FreeTempTileDataBuffersIfPossible())
+ return 0;
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ LoadPalette(sWork->bgSpec->pal, 0x10, 0x20);
+ LZ77UnCompWram(sWork->bgSpec->map, sWork->buffer_03A4);
+ CopyRectToBgTilemapBufferRect(1, sWork->buffer_03A4, 0, 0, 30, 3, 0, 0, 30, 3, 1, 8, 0);
+ CopyRectToBgTilemapBufferRect(3, sWork->buffer_03A4, 0, 3, 30, 23, 0, 3, 30, 23, 1, 8, 0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(3);
+ break;
+ case 4:
+ sub_8146980();
+ break;
+ case 5:
+ sub_8146A30();
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(2);
+ break;
+ case 6:
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ sWork->menuIndicatorsId = AddScrollIndicatorArrowPair(&sWork->scrollArrowsTemplate, &sWork->scrollOffset);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ UpdatePaletteFade();
+ break;
+ default:
+ if (UpdatePaletteFade())
+ return 0;
+ sWork->state = 0;
+ return 1;
+ }
+
+ ++sWork->state;
+ return 0;
+}
+
+s32 FadeOutFromWonderNews(bool32 flag)
+{
+ if (sWork == NULL)
+ return -1;
+ switch (sWork->state)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ break;
+ case 1:
+ if (UpdatePaletteFade())
+ return 0;
+ ChangeBgY(2, 0, 0);
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ break;
+ case 2:
+ FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 24);
+ FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 24);
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ break;
+ case 3:
+ HideBg(1);
+ HideBg(2);
+ RemoveWindow(sWork->windowIds[1]);
+ RemoveWindow(sWork->windowIds[0]);
+ break;
+ case 4:
+ ChangeBgY(2, 0, 0);
+ ChangeBgY(3, 0, 0);
+ if (sWork->menuIndicatorsId != 0xFF)
+ {
+ RemoveScrollIndicatorArrowPair(sWork->menuIndicatorsId);
+ sWork->menuIndicatorsId = 0xFF;
+ }
+ break;
+ case 5:
+ PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag);
+ break;
+ case 6:
+ MG_DrawCheckerboardPattern();
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(3);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ break;
+ default:
+ if (UpdatePaletteFade())
+ return 0;
+ sWork->state = 0;
+ return 1;
+ }
+ ++sWork->state;
+ return 0;
+}
+
+void MENews_RemoveScrollIndicatorArrowPair(void)
+{
+ if (!sWork->verticalScrollDisabled && sWork->menuIndicatorsId != 0xFF)
+ {
+ RemoveScrollIndicatorArrowPair(sWork->menuIndicatorsId);
+ sWork->menuIndicatorsId = 0xFF;
+ sWork->verticalScrollDisabled = TRUE;
+ }
+}
+
+
+void MENews_AddScrollIndicatorArrowPair(void)
+{
+ if (sWork->verticalScrollDisabled)
+ {
+ sWork->menuIndicatorsId = AddScrollIndicatorArrowPair(&sWork->scrollArrowsTemplate, &sWork->scrollOffset);
+ sWork->verticalScrollDisabled = FALSE;
+ }
+}
+
+u32 MENews_GetInput(u16 input)
+{
+ if (sWork->unk_01C2_0)
+ {
+ sub_8146B58();
+ return 0xFF;
+ }
+ switch (input)
+ {
+ case A_BUTTON:
+ return 0;
+ case B_BUTTON:
+ return 1;
+ case DPAD_UP:
+ if (sWork->scrollOffset == 0)
+ return 0xFF;
+ if (sWork->verticalScrollDisabled)
+ return 0xFF;
+ sWork->scrollDirection = FALSE;
+ break;
+ case DPAD_DOWN:
+ if (sWork->scrollOffset == sWork->numMails)
+ return 0xFF;
+ if (sWork->verticalScrollDisabled)
+ return 0xFF;
+ sWork->scrollDirection = TRUE;
+ break;
+ default:
+ return 0xFF;
+ }
+ sWork->unk_01C2_0 = TRUE;
+ sWork->unk_01C2_1 = 2;
+ sWork->unk_01C3_1 = 0;
+ if (sWork->scrollDirection == FALSE)
+ return 2;
+ else
+ return 3;
+}
+
+static void sub_8146980(void)
+{
+ u8 i = 0;
+ memcpy(sWork->title, sWork->wonderNews.unk_04, 40);
+ sWork->title[40] = EOS;
+ for (; i < 10; ++i)
+ {
+ memcpy(sWork->messages[i], sWork->wonderNews.unk_2C[i], 40);
+ sWork->messages[i][40] = EOS;
+ if (i > 7 && sWork->messages[i][0] != EOS)
+ ++sWork->numMails;
+ }
+ sWork->scrollArrowsTemplate = sScrollArrowsTemplate;
+ sWork->scrollArrowsTemplate.fullyDownThreshold = sWork->numMails;
+}
+
+static void sub_8146A30(void)
+{
+ u8 i = 0;
+ s32 x;
+ PutWindowTilemap(sWork->windowIds[0]);
+ PutWindowTilemap(sWork->windowIds[1]);
+ FillWindowPixelBuffer(sWork->windowIds[0], 0);
+ FillWindowPixelBuffer(sWork->windowIds[1], 0);
+ x = (0xe0 - GetStringWidth(3, sWork->title, GetFontAttribute(3, 2))) / 2;
+ if (x < 0)
+ x = 0;
+ AddTextPrinterParameterized3(sWork->windowIds[0], 3, x, 6, sTextPals[sWork->bgSpec->textPal1], 0, sWork->title);
+ for (; i < 10; ++i)
+ {
+ AddTextPrinterParameterized3(sWork->windowIds[1], 3, 0, 16 * i + 2, sTextPals[sWork->bgSpec->textPal2], 0, sWork->messages[i]);
+ }
+ CopyWindowToVram(sWork->windowIds[0], 3);
+ CopyWindowToVram(sWork->windowIds[1], 3);
+}
+
+static void sub_8146B58(void)
+{
+ u16 r4 = sWork->unk_01C2_1;
+ r4 <<= 8;
+ if (sWork->scrollDirection)
+ {
+ ChangeBgY(2, r4, 1);
+ ChangeBgY(3, r4, 1);
+ }
+ else
+ {
+ ChangeBgY(2, r4, 2);
+ ChangeBgY(3, r4, 2);
+ }
+ sWork->unk_01C3_1 += sWork->unk_01C2_1;
+ if (sWork->unk_01C3_1 > 15)
+ {
+ if (sWork->scrollDirection)
+ ++sWork->scrollOffset;
+ else
+ --sWork->scrollOffset;
+ sWork->unk_01C2_0 = FALSE;
+ sWork->unk_01C3_1 = 0;
+ }
+}
diff --git a/src/unk_815F138.c b/src/minigame_countdown.c
index 8aa776bc9..5911676bb 100644
--- a/src/unk_815F138.c
+++ b/src/minigame_countdown.c
@@ -5,72 +5,83 @@
#include "trig.h"
#include "constants/songs.h"
-void sub_815F1AC(u8 taskId);
-bool32 sub_815F2AC(u8 spriteId);
-void sub_815F3E0(u8 spriteId1, u8 spriteId2, u8 spriteId3);
-bool32 sub_815F444(u8 spriteId);
-void sub_815F470(struct Sprite * sprite);
-void sub_815F564(u16 tilesTag, u16 palTag);
-u8 sub_815F5BC(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority);
-void sub_815F610(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p);
+static void Task_MinigameCountdown(u8 taskId);
+static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId);
+static void StartStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3);
+static bool32 IsStartGraphicAnimRunning(u8 spriteId);
+static void SpriteCB_Start(struct Sprite * sprite);
+static void Load321StartGfx(u16 tilesTag, u16 palTag);
+static u8 CreateNumberSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority);
+static void CreateStartSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p);
-void sub_815F138(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
+#define tState data[0]
+#define tTilesTag data[2]
+#define tPalTag data[3]
+#define tX data[4]
+#define tY data[5]
+#define tSubpriority data[6]
+#define tSpriteId1 data[7]
+#define tSpriteId2 data[8]
+#define tSpriteId3 data[9]
+
+void StartMinigameCountdown(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
{
- u8 taskId = CreateTask(sub_815F1AC, 80);
- gTasks[taskId].data[2] = tilesTag;
- gTasks[taskId].data[3] = palTag;
- gTasks[taskId].data[4] = x;
- gTasks[taskId].data[5] = y;
- gTasks[taskId].data[6] = subpriority;
+ u8 taskId = CreateTask(Task_MinigameCountdown, 80);
+ gTasks[taskId].tTilesTag = tilesTag;
+ gTasks[taskId].tPalTag = palTag;
+ gTasks[taskId].tX = x;
+ gTasks[taskId].tY = y;
+ gTasks[taskId].tSubpriority = subpriority;
}
-bool8 sub_815F198(void)
+bool32 IsMinigameCountdownRunning(void)
{
- return FuncIsActiveTask(sub_815F1AC);
+ return FuncIsActiveTask(Task_MinigameCountdown);
}
-void sub_815F1AC(u8 taskId)
+static void Task_MinigameCountdown(u8 taskId)
{
s16 * data = gTasks[taskId].data;
- switch (data[0])
+ switch (tState)
{
case 0:
- sub_815F564(data[2], data[3]);
- data[7] = sub_815F5BC(data[2], data[3], data[4], data[5], data[6]);
- sub_815F610(data[2], data[3], data[4], data[5], data[6], &data[8], &data[9]);
- data[0]++;
+ Load321StartGfx(tTilesTag, tPalTag);
+ tSpriteId1 = CreateNumberSprite(tTilesTag, tPalTag, tX, tY, tSubpriority);
+ CreateStartSprite(tTilesTag, tPalTag, tX, tY, tSubpriority, &tSpriteId2, &tSpriteId3);
+ tState++;
break;
case 1:
- if (!sub_815F2AC(data[7]))
+ if (!RunMinigameCountdownDigitsAnim(tSpriteId1))
{
- sub_815F3E0(data[7], data[8], data[9]);
- FreeSpriteOamMatrix(&gSprites[data[7]]);
- DestroySprite(&gSprites[data[7]]);
- data[0]++;
+ StartStartGraphic(tSpriteId1, tSpriteId2, tSpriteId3);
+ FreeSpriteOamMatrix(&gSprites[tSpriteId1]);
+ DestroySprite(&gSprites[tSpriteId1]);
+ tState++;
}
break;
case 2:
- if (!sub_815F444(data[8]))
+ if (!IsStartGraphicAnimRunning(tSpriteId2))
{
- DestroySprite(&gSprites[data[8]]);
- DestroySprite(&gSprites[data[9]]);
- FreeSpriteTilesByTag(data[2]);
- FreeSpritePaletteByTag(data[3]);
+ DestroySprite(&gSprites[tSpriteId2]);
+ DestroySprite(&gSprites[tSpriteId3]);
+ FreeSpriteTilesByTag(tTilesTag);
+ FreeSpritePaletteByTag(tPalTag);
DestroyTask(taskId);
}
break;
}
}
-bool32 sub_815F2AC(u8 spriteId)
+static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId)
{
struct Sprite * sprite = &gSprites[spriteId];
switch (sprite->data[0])
{
case 0:
- sub_8007FFC(sprite, 0x800, 0x1A);
+ // some sort of affine transform; x transform disabled
+ obj_pos2_update_enable(sprite, 0x800, 0x1A);
sprite->data[0]++;
// fallthrough
case 1:
@@ -134,22 +145,22 @@ bool32 sub_815F2AC(u8 spriteId)
return TRUE;
}
-void sub_815F3E0(u8 spriteId1, u8 spriteId2, u8 spriteId3)
+static void StartStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3)
{
gSprites[spriteId2].pos2.y = -40;
gSprites[spriteId3].pos2.y = -40;
gSprites[spriteId2].invisible = FALSE;
gSprites[spriteId3].invisible = FALSE;
- gSprites[spriteId2].callback = sub_815F470;
- gSprites[spriteId3].callback = sub_815F470;
+ gSprites[spriteId2].callback = SpriteCB_Start;
+ gSprites[spriteId3].callback = SpriteCB_Start;
}
-bool32 sub_815F444(u8 spriteId)
+static bool32 IsStartGraphicAnimRunning(u8 spriteId)
{
- return gSprites[spriteId].callback == sub_815F470;
+ return gSprites[spriteId].callback == SpriteCB_Start;
}
-void sub_815F470(struct Sprite * sprite)
+static void SpriteCB_Start(struct Sprite * sprite)
{
s16 * data = sprite->data;
s32 y;
@@ -200,103 +211,103 @@ void sub_815F470(struct Sprite * sprite)
}
}
-const u16 gUnknown_847A328[] = INCBIN_U16("data/graphics/unk_847a348.gbapal");
-const u16 gUnknown_847A348[] = INCBIN_U16("data/graphics/unk_847a348.4bpp.lz");
+static const u16 sSpritePal_321Start[] = INCBIN_U16("data/graphics/unk_847a348.gbapal");
+static const u16 sSpriteSheet_321Start[] = INCBIN_U16("data/graphics/unk_847a348.4bpp.lz");
-void sub_815F564(u16 tilesTag, u16 palTag)
+static void Load321StartGfx(u16 tilesTag, u16 palTag)
{
- struct CompressedSpriteSheet spriteSheet = {(const void *)gUnknown_847A348, 0xE00};
- struct SpritePalette spritePalette = {gUnknown_847A328};
+ struct CompressedSpriteSheet spriteSheet = {(const void *)sSpriteSheet_321Start, 0xE00};
+ struct SpritePalette spritePalette = {sSpritePal_321Start};
spriteSheet.tag = tilesTag;
spritePalette.tag = palTag;
LoadCompressedSpriteSheet(&spriteSheet);
LoadSpritePalette(&spritePalette);
}
-const struct OamData gOamData_847A7AC = {
+static const struct OamData sOamData_Numbers = {
.affineMode = ST_OAM_AFFINE_DOUBLE,
- .shape = ST_OAM_SQUARE,
- .size = 2
+ .shape = SPRITE_SHAPE(32x32),
+ .size = SPRITE_SIZE(32x32)
};
-const struct OamData gOamData_847A7B4 = {
+static const struct OamData sOamData_Start = {
.affineMode = ST_OAM_AFFINE_OFF,
- .shape = ST_OAM_H_RECTANGLE,
- .size = 3
+ .shape = SPRITE_SHAPE(64x32),
+ .size = SPRITE_SIZE(64x32)
};
-const union AnimCmd gUnknown_847A7BC[] = {
+static const union AnimCmd sAnim_Numbers_Three[] = {
ANIMCMD_FRAME( 0, 1),
ANIMCMD_END
};
-const union AnimCmd gUnknown_847A7C4[] = {
+static const union AnimCmd sAnim_Numbers_Two[] = {
ANIMCMD_FRAME(16, 1),
ANIMCMD_END
};
-const union AnimCmd gUnknown_847A7CC[] = {
+static const union AnimCmd sAnim_Numbers_One[] = {
ANIMCMD_FRAME(32, 1),
ANIMCMD_END
};
-const union AnimCmd *const gUnknown_847A7D4[] = {
- gUnknown_847A7BC,
- gUnknown_847A7C4,
- gUnknown_847A7CC
+static const union AnimCmd *const sAnimTable_Numbers[] = {
+ sAnim_Numbers_Three,
+ sAnim_Numbers_Two,
+ sAnim_Numbers_One
};
-const union AnimCmd gUnknown_847A7E0[] = {
+static const union AnimCmd sAnim_StartLeft[] = {
ANIMCMD_FRAME(48, 1),
ANIMCMD_END
};
-const union AnimCmd gUnknown_847A7E8[] = {
+static const union AnimCmd sAnim_StartRight[] = {
ANIMCMD_FRAME(80, 1),
ANIMCMD_END
};
-const union AnimCmd *const gUnknown_847A7F0[] = {
- gUnknown_847A7E0,
- gUnknown_847A7E8
+static const union AnimCmd *const sAnimTable_Start[] = {
+ sAnim_StartLeft,
+ sAnim_StartRight
};
-const union AffineAnimCmd gUnknown_847A7F8[] = {
+static const union AffineAnimCmd sAffineAnim_Numbers_0[] = {
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
AFFINEANIMCMD_END
};
-const union AffineAnimCmd gUnknown_847A808[] = {
+static const union AffineAnimCmd sAffineAnim_Numbers_1[] = {
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
AFFINEANIMCMD_FRAME( 0x10, -0x10, 0, 8),
AFFINEANIMCMD_END
};
-const union AffineAnimCmd gUnknown_847A820[] = {
+static const union AffineAnimCmd sAffineAnim_Numbers_2[] = {
AFFINEANIMCMD_FRAME(-0x12, 0x12, 0, 8),
AFFINEANIMCMD_END
};
-const union AffineAnimCmd gUnknown_847A830[] = {
+static const union AffineAnimCmd sAffineAnim_Numbers_3[] = {
AFFINEANIMCMD_FRAME( 0x6, -0x6, 0, 8),
AFFINEANIMCMD_FRAME( -0x4, 0x4, 0, 8),
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
AFFINEANIMCMD_END
};
-const union AffineAnimCmd *const gUnknown_847A850[] = {
- gUnknown_847A7F8,
- gUnknown_847A808,
- gUnknown_847A820,
- gUnknown_847A830
+static const union AffineAnimCmd *const sAffineAnimTable_Numbers[] = {
+ sAffineAnim_Numbers_0,
+ sAffineAnim_Numbers_1,
+ sAffineAnim_Numbers_2,
+ sAffineAnim_Numbers_3
};
-u8 sub_815F5BC(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
+static u8 CreateNumberSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
{
struct SpriteTemplate spriteTemplate = {
- .oam = &gOamData_847A7AC,
- .anims = gUnknown_847A7D4,
- .affineAnims = gUnknown_847A850,
+ .oam = &sOamData_Numbers,
+ .anims = sAnimTable_Numbers,
+ .affineAnims = sAffineAnimTable_Numbers,
.callback = SpriteCallbackDummy
};
spriteTemplate.tileTag = tilesTag;
@@ -304,11 +315,11 @@ u8 sub_815F5BC(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
return CreateSprite(&spriteTemplate, x, y, subpriority);
}
-void sub_815F610(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p)
+static void CreateStartSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p)
{
struct SpriteTemplate spriteTemplate = {
- .oam = &gOamData_847A7B4,
- .anims = gUnknown_847A7F0,
+ .oam = &sOamData_Start,
+ .anims = sAnimTable_Start,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
diff --git a/src/mystery_event_script.c b/src/mystery_event_script.c
index 7b25cc5ff..5a105bae9 100644
--- a/src/mystery_event_script.c
+++ b/src/mystery_event_script.c
@@ -3,7 +3,6 @@
#include "battle_tower.h"
#include "easy_chat.h"
#include "event_data.h"
-#include "mail.h"
#include "mail_data.h"
#include "mystery_event_script.h"
#include "pokedex.h"
diff --git a/src/mystery_gift_menu.c b/src/mystery_gift_menu.c
index 8384d211d..cdfd62624 100644
--- a/src/mystery_gift_menu.c
+++ b/src/mystery_gift_menu.c
@@ -25,6 +25,7 @@
#include "help_system.h"
#include "strings.h"
#include "constants/songs.h"
+#include "constants/union_room.h"
EWRAM_DATA u8 sDownArrowCounterAndYCoordIdx[8] = {};
EWRAM_DATA bool8 gGiftIsFromEReader = FALSE;
@@ -1237,21 +1238,21 @@ void task00_mystery_gift(u8 taskId)
case 0:
if (data->source == 1)
{
- MEvent_CreateTask_CardOrNewsWithFriend(0x15);
+ MEvent_CreateTask_CardOrNewsWithFriend(ACTIVITY_WCARD2);
}
else if (data->source == 0)
{
- MEvent_CreateTask_CardOrNewsOverWireless(0x15);
+ MEvent_CreateTask_CardOrNewsOverWireless(ACTIVITY_WCARD2);
}
break;
case 1:
if (data->source == 1)
{
- MEvent_CreateTask_CardOrNewsWithFriend(0x16);
+ MEvent_CreateTask_CardOrNewsWithFriend(ACTIVITY_WNEWS2);
}
else if (data->source == 0)
{
- MEvent_CreateTask_CardOrNewsOverWireless(0x16);
+ MEvent_CreateTask_CardOrNewsOverWireless(ACTIVITY_WNEWS2);
}
break;
}
@@ -1278,7 +1279,7 @@ void task00_mystery_gift(u8 taskId)
switch (mevent_client_do_exec(&data->curPromptWindowId))
{
case 6: // done
- task_add_05_task_del_08FA224_when_no_RfuFunc();
+ Rfu_BeginBuildAndSendCommand5F();
data->prevPromptWindowId = data->curPromptWindowId;
data->state = 13;
break;
@@ -1595,10 +1596,10 @@ void task00_mystery_gift(u8 taskId)
switch (data->IsCardOrNews)
{
case 0:
- MEvent_CreateTask_Leader(21);
+ MEvent_CreateTask_Leader(ACTIVITY_WCARD2);
break;
case 1:
- MEvent_CreateTask_Leader(22);
+ MEvent_CreateTask_Leader(ACTIVITY_WNEWS2);
break;
}
data->source = 1;
@@ -1644,7 +1645,7 @@ void task00_mystery_gift(u8 taskId)
}
break;
case 33:
- task_add_05_task_del_08FA224_when_no_RfuFunc();
+ Rfu_BeginBuildAndSendCommand5F();
StringCopy(gStringVar1, gLinkPlayers[1].name);
data->state = 34;
break;
diff --git a/src/naming_screen.c b/src/naming_screen.c
new file mode 100644
index 000000000..364fc3fe6
--- /dev/null
+++ b/src/naming_screen.c
@@ -0,0 +1,2401 @@
+#include "global.h"
+#include "gflib.h"
+#include "data.h"
+#include "keyboard_text.h"
+#include "event_data.h"
+#include "event_object_movement.h"
+#include "event_scripts.h"
+#include "field_effect.h"
+#include "field_player_avatar.h"
+#include "field_specials.h"
+#include "graphics.h"
+#include "help_system.h"
+#include "menu.h"
+#include "overworld.h"
+#include "naming_screen.h"
+#include "new_menu_helpers.h"
+#include "pokemon_icon.h"
+#include "pokemon_storage_system.h"
+#include "strings.h"
+#include "task.h"
+#include "text_window.h"
+#include "trig.h"
+#include "constants/help_system.h"
+#include "constants/flags.h"
+#include "constants/songs.h"
+#include "constants/event_objects.h"
+
+#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))}
+
+#define KBEVENT_NONE 0
+#define KBEVENT_PRESSED_A 5
+#define KBEVENT_PRESSED_B 6
+#define KBEVENT_PRESSED_SELECT 8
+#define KBEVENT_PRESSED_START 9
+
+#define KBROW_COUNT 4
+
+enum
+{
+ KBPAGE_LETTERS_LOWER,
+ KBPAGE_LETTERS_UPPER,
+ KBPAGE_SYMBOLS,
+ KBPAGE_COUNT,
+};
+
+enum
+{
+ MAIN_STATE_BEGIN_FADE_IN,
+ MAIN_STATE_WAIT_FADE_IN,
+ MAIN_STATE_HANDLE_INPUT,
+ MAIN_STATE_MOVE_TO_OK_BUTTON,
+ MAIN_STATE_START_PAGE_SWAP,
+ MAIN_STATE_WAIT_PAGE_SWAP,
+ MAIN_STATE_6,
+ MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE,
+ MAIN_STATE_BEGIN_FADE_OUT,
+ MAIN_STATE_WAIT_FADE_OUT_AND_EXIT,
+};
+
+enum
+{
+ INPUT_STATE_DISABLED,
+ INPUT_STATE_ENABLED,
+};
+
+enum
+{
+ KEY_ROLE_CHAR,
+ KEY_ROLE_PAGE,
+ KEY_ROLE_BACKSPACE,
+ KEY_ROLE_OK,
+};
+
+struct NamingScreenTemplate
+{
+ u8 copyExistingString;
+ u8 maxChars;
+ u8 iconFunction;
+ u8 addGenderIcon;
+ u8 initialPage;
+ const u8 *title;
+};
+
+struct NamingScreenData
+{
+ /*0x0*/ u8 tilemapBuffer1[0x800];
+ /*0x800*/ u8 tilemapBuffer2[0x800];
+ /*0x800*/ u8 tilemapBuffer3[0x800];
+ /*0x1800*/ u8 textBuffer[0x10];
+ /*0x1810*/ u8 tileBuffer[0x600];
+ /*0x1E10*/ u8 state;
+ /*0x1E11*/ u8 windows[5];
+ /*0x1E16*/ u16 inputCharBaseXPos;
+ /*0x1E18*/ u16 bg1vOffset;
+ /*0x1E1A*/ u16 bg2vOffset;
+ /*0x1E1C*/ u16 bg1Priority;
+ /*0x1E1E*/ u16 bg2Priority;
+ /*0x1E20*/ u8 bgToReveal;
+ /*0x1E21*/ u8 bgToHide;
+ /*0x1E22*/ u8 currentPage;
+ /*0x1E23*/ u8 cursorSpriteId;
+ /*0x1E24*/ u8 selectBtnFrameSpriteId;
+ /*0x1E25*/ u8 keyRepeatStartDelayCopy;
+ /*0x1E28*/ const struct NamingScreenTemplate *template;
+ /*0x1E2C*/ u8 templateNum;
+ /*0x1E30*/ u8 *destBuffer;
+ /*0x1E34*/ u16 monSpecies;
+ /*0x1E36*/ u16 monGender;
+ /*0x1E38*/ u32 monPersonality;
+ /*0x1E3C*/ MainCallback returnCallback;
+};
+
+static EWRAM_DATA struct NamingScreenData * sNamingScreenData = NULL;
+
+static void CB2_NamingScreen(void);
+static void NamingScreen_Init(void);
+static void NamingScreen_InitBGs(void);
+static void sub_809DD60(void);
+static void sub_809DD88(u8 taskId);
+static bool8 MainState_BeginFadeIn(void);
+static bool8 MainState_WaitFadeIn(void);
+static bool8 MainState_HandleInput(void);
+static bool8 MainState_MoveToOKButton(void);
+static bool8 pokemon_store(void);
+static bool8 MainState_BeginFadeInOut(void);
+static bool8 MainState_WaitFadeOutAndExit(void);
+static void pokemon_transfer_to_pc_with_message(void);
+static bool8 sub_809E1D4(void);
+static bool8 MainState_StartPageSwap(void);
+static bool8 MainState_WaitPageSwap(void);
+static void StartPageSwapAnim(void);
+static void Task_HandlePageSwapAnim(u8 taskId);
+static bool8 IsPageSwapAnimNotInProgress(void);
+static bool8 PageSwapAnimState_Init(struct Task * task);
+static bool8 PageSwapAnimState_1(struct Task * task);
+static bool8 PageSwapAnimState_2(struct Task * task);
+static bool8 PageSwapAnimState_Done(struct Task * task);
+static void sub_809E518(u8 a0, u8 a1, u8 a2);
+static void Task_809E58C(u8 taskId);
+static u16 sub_809E644(u8 tag);
+static void sub_809E6B8(u8 a0);
+static void sub_809E6E0(struct Task * task, u8 a1, u8 a2);
+static void sub_809E700(struct Sprite * sprite);
+static void sub_809E7F0(struct Sprite * sprite);
+static void sub_809E83C(struct Sprite * sprite);
+static void sub_809E898(void);
+static void CursorInit(void);
+static void SetCursorPos(s16 x, s16 y);
+static void GetCursorPos(s16 *xP, s16 *yP);
+static void MoveCursorToOKButton(void);
+static void sub_809EA0C(u8 a0);
+static void sub_809EA64(u8 a0);
+static bool8 IsCursorAnimFinished(void);
+static u8 GetCurrentPageColumnCount(void);
+static void CreatePageSwitcherSprites(void);
+static void sub_809EC20(void);
+static bool8 PageSwapSpritesCB_Init(struct Sprite * sprite);
+static bool8 PageSwapSpritesCB_Idle(struct Sprite * sprite);
+static bool8 PageSwapSpritesCB_SwapHide(struct Sprite * sprite);
+static bool8 PageSwapSpritesCB_SwapShow(struct Sprite * sprite);
+static void sub_809ED88(u8 a0, struct Sprite * spr1, struct Sprite * spr2);
+static void CreateBackOkSprites(void);
+static void CreateUnderscoreSprites(void);
+static void CreateInputTargetIcon(void);
+static void NamingScreen_NoCreateIcon(void);
+static void NamingScreen_CreatePlayerIcon(void);
+static void NamingScreen_CreatePCIcon(void);
+static void NamingScreen_CreateMonIcon(void);
+static void NamingScreen_CreateRivalIcon(void);
+static bool8 HandleKeyboardEvent(void);
+static bool8 KeyboardKeyHandler_Character(u8);
+static bool8 KeyboardKeyHandler_Page(u8);
+static bool8 KeyboardKeyHandler_Backspace(u8);
+static bool8 KeyboardKeyHandler_OK(u8);
+static bool8 TriggerKeyboardChange(void);
+static u8 GetInputEvent(void);
+static void SetInputState(u8 state);
+static void Task_HandleInput(u8 taskId);
+static void InputState_Disabled(struct Task * task);
+static void InputState_Enabled(struct Task * task);
+static void HandleDpadMovement(struct Task * task);
+static void PrintTitle(void);
+static void AddGenderIconFunc_No(void);
+static void AddGenderIconFunc_Yes(void);
+static void DeleteTextCharacter(void);
+static u8 GetTextCaretPosition(void);
+static bool8 AppendCharToBuffer_CheckBufferFull(void);
+static void AddTextCharacter(u8 character);
+static void CopyStringToDestBuffer(void);
+static void choose_name_or_words_screen_load_bg_tile_patterns(void);
+static void sub_809F8C0(void);
+static void choose_name_or_words_screen_apply_bg_pals(void);
+static void DecompressToBgTilemapBuffer(u8 bgId, const u32 * tmap);
+static void PrintBufferCharactersOnScreen(void);
+static void sub_809F9E8(u8 windowId, u8 kbPage);
+static void sub_809FA60(void);
+static void sub_809FAE4(void);
+static void sub_809FB70(void);
+static void NamingScreen_TurnOffScreen(void);
+static void NamingScreen_InitDisplayMode(void);
+static void VBlankCB_NamingScreen(void);
+static void ShowAllBgs(void);
+static bool8 IsLetter(u8 character);
+
+// Forward declarations
+
+static const struct SubspriteTable gUnknown_83E2504[];
+static const struct SubspriteTable gUnknown_83E250C[];
+static const struct SubspriteTable gUnknown_83E2524[];
+static const struct SubspriteTable gUnknown_83E252C[];
+
+static const struct SpriteTemplate gUnknown_83E2574;
+static const struct SpriteTemplate gUnknown_83E258C;
+static const struct SpriteTemplate gUnknown_83E25A4;
+static const struct SpriteTemplate gUnknown_83E25BC;
+static const struct SpriteTemplate gUnknown_83E25D4;
+static const struct SpriteTemplate gUnknown_83E25EC;
+static const struct SpriteTemplate sSpriteTemplate_InputArrow;
+static const struct SpriteTemplate sSpriteTemplate_Underscore;
+static const struct SpriteTemplate gUnknown_83E2634;
+
+static const u8 *const sNamingScreenKeyboardText[][KBROW_COUNT];
+
+static const struct SpriteSheet gUnknown_83E267C[];
+static const struct SpritePalette gUnknown_83E26E4[];
+
+static const u16 gUnknown_83E1800[] = INCBIN_U16("graphics/interface/naming_screen_83E1800.4bpp");
+static const u16 gUnknown_83E18C0[] = INCBIN_U16("graphics/interface/naming_screen_83E18C0.4bpp");
+static const u16 gUnknown_83E1980[] = INCBIN_U16("graphics/interface/naming_screen_83E1980.4bpp");
+
+static const u8 *const sTransferredToPCMessages[] = {
+ Text_MonSentToBoxInSomeonesPC,
+ Text_MonSentToBoxInBillsPC,
+ Text_MonSentToBoxSomeonesBoxFull,
+ Text_MonSentToBoxBillsBoxFull
+};
+
+static const struct BgTemplate gUnknown_83E2290[4] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0x000
+ }, {
+ .bg = 1,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 29,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0x000
+ }, {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 28,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0x000
+ }, {
+ .bg = 3,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0x000
+ }
+};
+
+static const struct WindowTemplate gUnknown_83E22A0[6] = {
+ {
+ .bg = 1,
+ .tilemapLeft = 3,
+ .tilemapTop = 10,
+ .width = 19,
+ .height = 8,
+ .paletteNum = 10,
+ .baseBlock = 0x0030
+ }, {
+ .bg = 2,
+ .tilemapLeft = 3,
+ .tilemapTop = 10,
+ .width = 19,
+ .height = 8,
+ .paletteNum = 10,
+ .baseBlock = 0x00c8
+ }, {
+ .bg = 3,
+ .tilemapLeft = 8,
+ .tilemapTop = 6,
+ .width = 14,
+ .height = 2,
+ .paletteNum = 10,
+ .baseBlock = 0x0030
+ }, {
+ .bg = 3,
+ .tilemapLeft = 9,
+ .tilemapTop = 4,
+ .width = 16,
+ .height = 2,
+ .paletteNum = 10,
+ .baseBlock = 0x004c
+ }, {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 0,
+ .width = 30,
+ .height = 2,
+ .paletteNum = 11,
+ .baseBlock = 0x006c
+ }, DUMMY_WIN_TEMPLATE
+};
+
+static const u8 gUnknown_83E22D0[][4][8] = {
+ [KBPAGE_LETTERS_LOWER] = {
+ __("abcdef ."),
+ __("ghijkl ,"),
+ __("mnopqrs"),
+ __("tuvwxyz"),
+ },
+ [KBPAGE_LETTERS_UPPER] = {
+ __("ABCDEF ."),
+ __("GHIJKL ,"),
+ __("MNOPQRS"),
+ __("TUVWXYZ"),
+ },
+ [KBPAGE_SYMBOLS] = {
+ __("01234"),
+ __("56789"),
+ __("!?♂♀/-"),
+ __("…“”‘'"),
+ }
+};
+
+static const u8 gUnknown_83E2330[] = {
+ [KBPAGE_LETTERS_LOWER] = 8, // lower
+ [KBPAGE_LETTERS_UPPER] = 8, // upper
+ [KBPAGE_SYMBOLS] = 6
+};
+
+static const u8 gUnknown_83E2333[][8] = {
+ [KBPAGE_LETTERS_LOWER] = {
+ 0,
+ 12,
+ 24,
+ 56,
+ 68,
+ 80,
+ 92,
+ 123
+ },
+ [KBPAGE_LETTERS_UPPER] = {
+ 0,
+ 12,
+ 24,
+ 56,
+ 68,
+ 80,
+ 92,
+ 123
+ },
+ [KBPAGE_SYMBOLS] = {
+ 0,
+ 22,
+ 44,
+ 66,
+ 88,
+ 110
+ }
+};
+
+static const struct NamingScreenTemplate *const sNamingScreenTemplates[];
+
+void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 monSpecies, u16 monGender, u32 monPersonality, MainCallback returnCallback)
+{
+ sNamingScreenData = Alloc(sizeof(struct NamingScreenData));
+ if (!sNamingScreenData)
+ {
+ SetMainCallback2(returnCallback);
+ }
+ else
+ {
+ sNamingScreenData->templateNum = templateNum;
+ sNamingScreenData->monSpecies = monSpecies;
+ sNamingScreenData->monGender = monGender;
+ sNamingScreenData->monPersonality = monPersonality;
+ sNamingScreenData->destBuffer = destBuffer;
+ sNamingScreenData->returnCallback = returnCallback;
+
+ if (templateNum == 0)
+ StartTimer1();
+
+ SetMainCallback2(CB2_NamingScreen);
+ }
+}
+
+static void CB2_NamingScreen(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ NamingScreen_TurnOffScreen();
+ NamingScreen_Init();
+ gMain.state++;
+ break;
+ case 1:
+ NamingScreen_InitBGs();
+ gMain.state++;
+ break;
+ case 2:
+ ResetPaletteFade();
+ gMain.state++;
+ break;
+ case 3:
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gMain.state++;
+ break;
+ case 4:
+ ResetTasks();
+ gMain.state++;
+ break;
+ case 5:
+ choose_name_or_words_screen_apply_bg_pals();
+ gMain.state++;
+ break;
+ case 6:
+ choose_name_or_words_screen_load_bg_tile_patterns();
+ gMain.state++;
+ break;
+ case 7:
+ sub_809E898();
+ UpdatePaletteFade();
+ ShowAllBgs();
+ gMain.state++;
+ break;
+ default:
+ sub_809F8C0();
+ sub_809DD60();
+ break;
+ }
+}
+
+static void NamingScreen_Init(void)
+{
+ sNamingScreenData->state = 0;
+ sNamingScreenData->bg1vOffset = 0;
+ sNamingScreenData->bg2vOffset = 0;
+ sNamingScreenData->bg1Priority = BGCNT_PRIORITY(1);
+ sNamingScreenData->bg2Priority = BGCNT_PRIORITY(2);
+ sNamingScreenData->bgToReveal = 0;
+ sNamingScreenData->bgToHide = 1;
+ sNamingScreenData->template = sNamingScreenTemplates[sNamingScreenData->templateNum];
+ sNamingScreenData->currentPage = sNamingScreenData->template->initialPage;
+ sNamingScreenData->inputCharBaseXPos = (240 - sNamingScreenData->template->maxChars * 8) / 2 + 6;
+ sNamingScreenData->keyRepeatStartDelayCopy = gKeyRepeatStartDelay;
+ memset(sNamingScreenData->textBuffer, 0xFF, sizeof(sNamingScreenData->textBuffer));
+ if (sNamingScreenData->template->copyExistingString != 0)
+ StringCopy(sNamingScreenData->textBuffer, sNamingScreenData->destBuffer);
+ gKeyRepeatStartDelay = 16;
+}
+
+static void sub_809DB70(void)
+{
+ u8 i;
+ for (i = 0; i < MAX_SPRITES; i++)
+ {
+ if (gSprites[i].inUse)
+ gSprites[i].invisible = FALSE;
+ }
+ sub_809EA0C(0);
+}
+
+static void NamingScreen_InitBGs(void)
+{
+ u8 i;
+
+ DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000);
+ DmaClear32(3, (void *)OAM, OAM_SIZE);
+ DmaClear16(3, (void *)PLTT, PLTT_SIZE);
+
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0);
+ ResetBgsAndClearDma3BusyFlags(FALSE);
+ InitBgsFromTemplates(0, gUnknown_83E2290, NELEMS(gUnknown_83E2290));
+
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+
+ InitStandardTextBoxWindows();
+ ResetBg0();
+
+ for (i = 0; i < NELEMS(gUnknown_83E22A0) - 1; i++)
+ sNamingScreenData->windows[i] = AddWindow(&gUnknown_83E22A0[i]);
+
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0xC, 0x8));
+
+ SetBgTilemapBuffer(1, sNamingScreenData->tilemapBuffer1);
+ SetBgTilemapBuffer(2, sNamingScreenData->tilemapBuffer2);
+ SetBgTilemapBuffer(3, sNamingScreenData->tilemapBuffer3);
+
+ FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 0x20, 0x20);
+ FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 0x20, 0x20);
+ FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 0x20, 0x20);
+}
+
+static void sub_809DD60(void)
+{
+ CreateTask(sub_809DD88, 2);
+ SetMainCallback2(sub_809FB70);
+ BackupHelpContext();
+ SetHelpContext(HELPCONTEXT_NAMING_SCREEN);
+}
+
+static void sub_809DD88(u8 taskId)
+{
+ switch (sNamingScreenData->state)
+ {
+ case MAIN_STATE_BEGIN_FADE_IN:
+ MainState_BeginFadeIn();
+ sub_809DB70();
+ NamingScreen_InitDisplayMode();
+ break;
+ case MAIN_STATE_WAIT_FADE_IN:
+ MainState_WaitFadeIn();
+ break;
+ case MAIN_STATE_HANDLE_INPUT:
+ MainState_HandleInput();
+ break;
+ case MAIN_STATE_MOVE_TO_OK_BUTTON:
+ MainState_MoveToOKButton();
+ break;
+ case MAIN_STATE_START_PAGE_SWAP:
+ MainState_StartPageSwap();
+ break;
+ case MAIN_STATE_WAIT_PAGE_SWAP:
+ MainState_WaitPageSwap();
+ break;
+ case MAIN_STATE_6:
+ pokemon_store();
+ break;
+ case MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE:
+ sub_809E1D4();
+ break;
+ case MAIN_STATE_BEGIN_FADE_OUT:
+ MainState_BeginFadeInOut();
+ break;
+ case MAIN_STATE_WAIT_FADE_OUT_AND_EXIT:
+ MainState_WaitFadeOutAndExit();
+ break;
+ }
+}
+
+static const u8 sPageOrderLowerFirst[] = {
+ KBPAGE_LETTERS_LOWER,
+ KBPAGE_SYMBOLS,
+ KBPAGE_LETTERS_UPPER
+};
+
+static const u8 sPageOrderUpperFirst[] = {
+ KBPAGE_LETTERS_UPPER,
+ KBPAGE_LETTERS_LOWER,
+ KBPAGE_SYMBOLS
+};
+
+static const u8 sPageOrderSymbolsFirst[] = {
+ KBPAGE_SYMBOLS,
+ KBPAGE_LETTERS_UPPER,
+ KBPAGE_LETTERS_LOWER
+};
+
+static u8 sub_809DE20(u8 a1)
+{
+ return sPageOrderLowerFirst[a1];
+}
+
+static u8 sub_809DE30(void)
+{
+ return sPageOrderUpperFirst[sNamingScreenData->currentPage];
+}
+
+static u8 sub_809DE50(void)
+{
+ return sPageOrderSymbolsFirst[sNamingScreenData->currentPage];
+}
+
+static bool8 MainState_BeginFadeIn(void)
+{
+ DecompressToBgTilemapBuffer(3, gUnknown_8E982BC);
+ sNamingScreenData->currentPage = KBPAGE_LETTERS_UPPER;
+ DecompressToBgTilemapBuffer(2, gUnknown_8E98458);
+ DecompressToBgTilemapBuffer(1, gUnknown_8E98398);
+ sub_809F9E8(sNamingScreenData->windows[1], KBPAGE_LETTERS_LOWER);
+ sub_809F9E8(sNamingScreenData->windows[0], KBPAGE_LETTERS_UPPER);
+ PrintBufferCharactersOnScreen();
+ PrintTitle();
+ sub_809FAE4();
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ BlendPalettes(-1, 16, RGB_BLACK);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ sNamingScreenData->state++;
+ return FALSE;
+}
+
+static bool8 MainState_WaitFadeIn(void)
+{
+ if (!gPaletteFade.active)
+ {
+ SetInputState(INPUT_STATE_ENABLED);
+ sub_809EA64(1);
+ sNamingScreenData->state++;
+ }
+ return FALSE;
+}
+
+static bool8 MainState_HandleInput(void)
+{
+ return HandleKeyboardEvent();
+}
+
+static bool8 MainState_MoveToOKButton(void)
+{
+ if (IsCursorAnimFinished())
+ {
+ SetInputState(INPUT_STATE_ENABLED);
+ MoveCursorToOKButton();
+ sNamingScreenData->state = MAIN_STATE_HANDLE_INPUT;
+ }
+ return FALSE;
+}
+
+static bool8 pokemon_store(void)
+{
+ CopyStringToDestBuffer();
+ SetInputState(INPUT_STATE_DISABLED);
+ sub_809EA64(0);
+ sub_809E518(3, 0, 1);
+ if (sNamingScreenData->templateNum == NAMING_SCREEN_CAUGHT_MON &&
+ CalculatePlayerPartyCount() >= 6)
+ {
+ pokemon_transfer_to_pc_with_message();
+ sNamingScreenData->state = MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE;
+ return FALSE;
+ }
+ else
+ {
+ sNamingScreenData->state = MAIN_STATE_BEGIN_FADE_OUT;
+ return TRUE; //Exit the naming screen
+ }
+}
+
+static bool8 MainState_BeginFadeInOut(void)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ sNamingScreenData->state++;
+ return FALSE;
+}
+
+static bool8 MainState_WaitFadeOutAndExit(void)
+{
+ if (!gPaletteFade.active)
+ {
+ if (sNamingScreenData->templateNum == NAMING_SCREEN_PLAYER)
+ SeedRngAndSetTrainerId();
+ SetMainCallback2(sNamingScreenData->returnCallback);
+ DestroyTask(FindTaskIdByFunc(sub_809DD88));
+ FreeAllWindowBuffers();
+ FREE_AND_SET_NULL(sNamingScreenData);
+ RestoreHelpContext();
+ }
+ return FALSE;
+}
+
+static void pokemon_transfer_to_pc_with_message(void)
+{
+ u8 stringToDisplay = 0;
+
+ if (!IsDestinationBoxFull())
+ {
+ StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON)));
+ StringCopy(gStringVar2, sNamingScreenData->destBuffer);
+ }
+ else
+ {
+ StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON)));
+ StringCopy(gStringVar2, sNamingScreenData->destBuffer);
+ StringCopy(gStringVar3, GetBoxNamePtr(GetPCBoxToSendMon()));
+ stringToDisplay = 2;
+ }
+
+ if (FlagGet(FLAG_SYS_NOT_SOMEONES_PC))
+ stringToDisplay++;
+
+ StringExpandPlaceholders(gStringVar4, sTransferredToPCMessages[stringToDisplay]);
+ DrawDialogueFrame(0, FALSE);
+ gTextFlags.canABSpeedUpPrint = TRUE;
+ AddTextPrinterParameterized2(0, 2, gStringVar4, GetTextSpeedSetting(), NULL, TEXT_COLOR_DARK_GREY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GREY);
+ CopyWindowToVram(0, 3);
+}
+
+static bool8 sub_809E1D4(void)
+{
+ RunTextPrinters();
+
+ if (!IsTextPrinterActive(0) && (JOY_NEW(A_BUTTON)))
+ sNamingScreenData->state = MAIN_STATE_BEGIN_FADE_OUT;
+
+ return FALSE;
+}
+
+static bool8 MainState_StartPageSwap(void)
+{
+ SetInputState(INPUT_STATE_DISABLED);
+ sub_809EC20();
+ StartPageSwapAnim();
+ sub_809EA0C(1);
+ sub_809E518(0, 0, 1);
+ PlaySE(SE_WIN_OPEN);
+ sNamingScreenData->state = MAIN_STATE_WAIT_PAGE_SWAP;
+ return FALSE;
+}
+
+static bool8 MainState_WaitPageSwap(void)
+{
+ s16 cursorX;
+ s16 cursorY;
+ bool32 var3;
+
+ if (IsPageSwapAnimNotInProgress())
+ {
+
+ GetCursorPos(&cursorX, &cursorY);
+ var3 = (cursorX == GetCurrentPageColumnCount());
+
+ sNamingScreenData->state = MAIN_STATE_HANDLE_INPUT;
+ sNamingScreenData->currentPage++;
+ sNamingScreenData->currentPage %= 3;
+
+ if (var3)
+ {
+ cursorX = GetCurrentPageColumnCount();
+ }
+ else
+ {
+ if (cursorX >= GetCurrentPageColumnCount())
+ cursorX = GetCurrentPageColumnCount() - 1;
+ }
+
+ SetCursorPos(cursorX, cursorY);
+ sub_809FA60();
+ SetInputState(INPUT_STATE_ENABLED);
+ sub_809EA0C(0);
+ }
+ return FALSE;
+}
+
+//--------------------------------------------------
+// Page Swap
+//--------------------------------------------------
+
+#define tState data[0]
+#define tFrameCount data[1]
+
+static bool8 (*const sPageSwapAnimStateFuncs[])(struct Task * task) = {
+ PageSwapAnimState_Init,
+ PageSwapAnimState_1,
+ PageSwapAnimState_2,
+ PageSwapAnimState_Done
+};
+
+static void StartPageSwapAnim(void)
+{
+ u8 taskId;
+
+ taskId = CreateTask(Task_HandlePageSwapAnim, 0);
+ Task_HandlePageSwapAnim(taskId);
+}
+
+static void Task_HandlePageSwapAnim(u8 taskId)
+{
+ while (sPageSwapAnimStateFuncs[gTasks[taskId].tState](&gTasks[taskId]))
+ ;
+}
+
+static bool8 IsPageSwapAnimNotInProgress(void)
+{
+ if (FindTaskIdByFunc(Task_HandlePageSwapAnim) == 0xFF)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static bool8 PageSwapAnimState_Init(struct Task *task)
+{
+ sNamingScreenData->bg1vOffset = 0;
+ sNamingScreenData->bg2vOffset = 0;
+ task->tState++;
+ return 0;
+}
+
+static bool8 PageSwapAnimState_1(struct Task *task)
+{
+ u16 *const arr[] =
+ {
+ &sNamingScreenData->bg2vOffset,
+ &sNamingScreenData->bg1vOffset
+ };
+
+ task->tFrameCount += 4;
+ *arr[sNamingScreenData->bgToReveal] = Sin(task->tFrameCount, 40);
+ *arr[sNamingScreenData->bgToHide] = Sin((task->tFrameCount + 128) & 0xFF, 40);
+ if (task->tFrameCount >= 64)
+ {
+ u8 temp = sNamingScreenData->bg1Priority; //Why u8 and not u16?
+
+ sNamingScreenData->bg1Priority = sNamingScreenData->bg2Priority;
+ sNamingScreenData->bg2Priority = temp;
+ task->tState++;
+ }
+ return 0;
+}
+
+static bool8 PageSwapAnimState_2(struct Task *task)
+{
+ u16 *const arr[] =
+ {
+ &sNamingScreenData->bg2vOffset,
+ &sNamingScreenData->bg1vOffset
+ };
+
+ task->tFrameCount += 4;
+ *arr[sNamingScreenData->bgToReveal] = Sin(task->tFrameCount, 40);
+ *arr[sNamingScreenData->bgToHide] = Sin((task->tFrameCount + 128) & 0xFF, 40);
+ if (task->tFrameCount >= 128)
+ {
+ u8 temp = sNamingScreenData->bgToReveal;
+
+ sNamingScreenData->bgToReveal = sNamingScreenData->bgToHide;
+ sNamingScreenData->bgToHide = temp;
+ task->tState++;
+ }
+ return 0;
+}
+
+static bool8 PageSwapAnimState_Done(struct Task *task)
+{
+ DestroyTask(FindTaskIdByFunc(Task_HandlePageSwapAnim));
+ return 0;
+}
+
+#undef tState
+#undef tFrameCount
+
+//--------------------------------------------------
+// Cursor blink
+//--------------------------------------------------
+
+#define tIdent data[0]
+
+static void sub_809E4F0(void)
+{
+ u8 taskId;
+
+ taskId = CreateTask(Task_809E58C, 3);
+ gTasks[taskId].data[0] = 3;
+}
+
+static void sub_809E518(u8 a, u8 b, u8 c)
+{
+ struct Task *task = &gTasks[FindTaskIdByFunc(Task_809E58C)];
+
+ if (a == task->data[0] && c == 0)
+ {
+ task->data[1] = b;
+ task->data[2] = 1;
+ return;
+ }
+ if (a == 3 && task->data[1] == 0 && c == 0)
+ return;
+ if (task->data[0] != 3)
+ sub_809E6B8(task->data[0]);
+ sub_809E6E0(task, a, b);
+}
+
+static void Task_809E58C(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (task->data[0] == 3 || task->data[2] == 0)
+ return;
+ MultiplyInvertedPaletteRGBComponents(sub_809E644(task->data[0]), task->data[3], task->data[3], task->data[3]);
+ if (task->data[5] != 0)
+ {
+ task->data[5]--;
+ if (task->data[5] != 0)
+ return;
+ }
+ task->data[5] = 2;
+ if (task->data[4] >= 0)
+ {
+ if (task->data[3] < 14)
+ {
+ task->data[3] += task->data[4];
+ task->data[6] += task->data[4];
+ }
+ else
+ {
+ task->data[3] = 16;
+ task->data[6]++;
+ }
+ }
+ else
+ {
+ task->data[3] += task->data[4];
+ task->data[6] += task->data[4];
+ }
+
+ if (task->data[3] == 16 && task->data[6] == 22)
+ {
+ task->data[4] = -4;
+ }
+ else if (task->data[3] == 0)
+ {
+ task->data[2] = task->data[1];
+ task->data[4] = 2;
+ task->data[6] = 0;
+ }
+}
+
+static u16 sub_809E644(u8 a)
+{
+ const u16 arr[] =
+ {
+ IndexOfSpritePaletteTag(4) * 16 + 0x10E, // Swap
+ IndexOfSpritePaletteTag(6) * 16 + 0x10E, // BACK
+ IndexOfSpritePaletteTag(7) * 16 + 0x10E, // OK
+ IndexOfSpritePaletteTag(7) * 16 + 0x101, // kbd
+ };
+
+ return arr[a];
+}
+
+static void sub_809E6B8(u8 a)
+{
+ u16 index = sub_809E644(a);
+
+ gPlttBufferFaded[index] = gPlttBufferUnfaded[index];
+}
+
+static void sub_809E6E0(struct Task *task, u8 b, u8 c)
+{
+ task->data[0] = b;
+ task->data[1] = c;
+ task->data[2] = 1;
+ task->data[3] = 4;
+ task->data[4] = 2;
+ task->data[5] = 0;
+ task->data[6] = 4;
+}
+
+//--------------------------------------------------
+// Cursor
+//--------------------------------------------------
+
+static void sub_809E700(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ StartSpriteAnim(sprite, 0);
+ sprite->invisible = (sprite->data[4] & 0xFF);
+ if (sprite->data[0] == GetCurrentPageColumnCount())
+ sprite->invisible = TRUE;
+ if (sprite->invisible || (sprite->data[4] & 0xFF00) == 0
+ || sprite->data[0] != sprite->data[2] || sprite->data[1] != sprite->data[3])
+ {
+ sprite->data[5] = 0;
+ sprite->data[6] = 2;
+ sprite->data[7] = 2;
+ }
+ sprite->data[7]--;
+ if (sprite->data[7] == 0)
+ {
+ sprite->data[5] += sprite->data[6];
+ if (sprite->data[5] == 16 || sprite->data[5] == 0)
+ sprite->data[6] = -sprite->data[6];
+ sprite->data[7] = 2;
+ }
+ if ((sprite->data[4] & 0xFF00) != 0)
+ {
+ s8 gb = sprite->data[5];
+ s8 r = sprite->data[5] >> 1;
+ u16 index = IndexOfSpritePaletteTag(5) * 16 + 0x0101;
+
+ MultiplyInvertedPaletteRGBComponents(index, r, gb, gb);
+ }
+}
+
+static void sub_809E7F0(struct Sprite *sprite)
+{
+ const s16 arr[] = {0, -4, -2, -1};
+
+ if (sprite->data[0] == 0 || --sprite->data[0] == 0)
+ {
+ sprite->data[0] = 8;
+ sprite->data[1] = (sprite->data[1] + 1) & 3;
+ }
+ sprite->pos2.x = arr[sprite->data[1]];
+}
+
+static void sub_809E83C(struct Sprite *sprite)
+{
+ const s16 arr[] = {2, 3, 2, 1};
+ u8 var;
+
+ var = GetTextCaretPosition();
+ if (var != (u8)sprite->data[0])
+ {
+ sprite->pos2.y = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ }
+ else
+ {
+ sprite->pos2.y = arr[sprite->data[1]];
+ sprite->data[2]++;
+ if (sprite->data[2] > 8)
+ {
+ sprite->data[1] = (sprite->data[1] + 1) & 3;
+ sprite->data[2] = 0;
+ }
+ }
+}
+
+static void sub_809E898(void)
+{
+ CursorInit();
+ CreatePageSwitcherSprites();
+ CreateBackOkSprites();
+ CreateUnderscoreSprites();
+ CreateInputTargetIcon();
+}
+
+static void CursorInit(void)
+{
+ sNamingScreenData->cursorSpriteId = CreateSprite(&gUnknown_83E25EC, 38, 88, 1);
+ sub_809EA0C(1);
+ gSprites[sNamingScreenData->cursorSpriteId].oam.priority = 1;
+ gSprites[sNamingScreenData->cursorSpriteId].oam.objMode = ST_OAM_OBJ_BLEND;
+ gSprites[sNamingScreenData->cursorSpriteId].data[6] = 1;
+ gSprites[sNamingScreenData->cursorSpriteId].data[6] = 2;
+ SetCursorPos(0, 0);
+}
+
+static void SetCursorPos(s16 x, s16 y)
+{
+ struct Sprite *cursorSprite = &gSprites[sNamingScreenData->cursorSpriteId];
+
+ if (x < gUnknown_83E2330[sub_809DE50()])
+ cursorSprite->pos1.x = gUnknown_83E2333[sub_809DE50()][x] + 38;
+ else
+ cursorSprite->pos1.x = 0;
+
+ cursorSprite->pos1.y = y * 16 + 88;
+ cursorSprite->data[2] = cursorSprite->data[0];
+ cursorSprite->data[3] = cursorSprite->data[1];
+ cursorSprite->data[0] = x;
+ cursorSprite->data[1] = y;
+}
+
+static void GetCursorPos(s16 *x, s16 *y)
+{
+ struct Sprite *cursorSprite = &gSprites[sNamingScreenData->cursorSpriteId];
+
+ *x = cursorSprite->data[0];
+ *y = cursorSprite->data[1];
+}
+
+static void MoveCursorToOKButton(void)
+{
+ SetCursorPos(GetCurrentPageColumnCount(), 2);
+}
+
+static void sub_809EA0C(u8 a)
+{
+ gSprites[sNamingScreenData->cursorSpriteId].data[4] &= ~0xFF;
+ gSprites[sNamingScreenData->cursorSpriteId].data[4] |= a;
+ StartSpriteAnim(&gSprites[sNamingScreenData->cursorSpriteId], 0);
+}
+
+static void sub_809EA64(u8 a)
+{
+ gSprites[sNamingScreenData->cursorSpriteId].data[4] &= 0xFF;
+ gSprites[sNamingScreenData->cursorSpriteId].data[4] |= a << 8;
+}
+
+static void sub_809EAA8(void)
+{
+ StartSpriteAnim(&gSprites[sNamingScreenData->cursorSpriteId], 1);
+}
+
+static bool8 IsCursorAnimFinished(void)
+{
+ return gSprites[sNamingScreenData->cursorSpriteId].animEnded;
+}
+
+static const u8 sKeyRoles[] = {KEY_ROLE_PAGE, KEY_ROLE_BACKSPACE, KEY_ROLE_OK};
+
+static u8 GetKeyRoleAtCursorPos(void)
+{
+ s16 cursorX;
+ s16 cursorY;
+
+ GetCursorPos(&cursorX, &cursorY);
+ if (cursorX < GetCurrentPageColumnCount())
+ return KEY_ROLE_CHAR;
+ else
+ return sKeyRoles[cursorY];
+}
+
+static u8 GetCurrentPageColumnCount(void)
+{
+ return gUnknown_83E2330[sub_809DE50()];
+}
+
+static void CreatePageSwitcherSprites(void)
+{
+ u8 spriteId1;
+ u8 spriteId2;
+ u8 spriteId3;
+
+ spriteId1 = CreateSprite(&gUnknown_83E2574, 0xCC, 0x58, 0);
+ sNamingScreenData->selectBtnFrameSpriteId = spriteId1;
+ SetSubspriteTables(&gSprites[spriteId1], gUnknown_83E2504);
+ gSprites[spriteId1].invisible = TRUE;
+
+ spriteId2 = CreateSprite(&gUnknown_83E25A4, 0xCC, 0x54, 1);
+ gSprites[spriteId1].data[6] = spriteId2;
+ SetSubspriteTables(&gSprites[spriteId2], gUnknown_83E250C);
+ gSprites[spriteId2].invisible = TRUE;
+
+ spriteId3 = CreateSprite(&gUnknown_83E258C, 0xCC, 0x53, 2);
+ gSprites[spriteId3].oam.priority = 1;
+ gSprites[spriteId1].data[7] = spriteId3;
+ gSprites[spriteId3].invisible = TRUE;
+}
+
+static void sub_809EC20(void)
+{
+ struct Sprite *sprite = &gSprites[sNamingScreenData->selectBtnFrameSpriteId];
+
+ sprite->data[0] = 2;
+ sprite->data[1] = sNamingScreenData->currentPage;
+}
+
+static bool8 (*const sPageSwapSpritesCBs[])(struct Sprite * sprite) = {
+ PageSwapSpritesCB_Init,
+ PageSwapSpritesCB_Idle,
+ PageSwapSpritesCB_SwapHide,
+ PageSwapSpritesCB_SwapShow
+};
+
+static void SpriteCB_PageSwap(struct Sprite *sprite)
+{
+ while (sPageSwapSpritesCBs[sprite->data[0]](sprite))
+ ;
+}
+
+static bool8 PageSwapSpritesCB_Init(struct Sprite *sprite)
+{
+ struct Sprite *sprite1 = &gSprites[sprite->data[6]];
+ struct Sprite *sprite2 = &gSprites[sprite->data[7]];
+
+ sub_809ED88(sub_809DE20(sNamingScreenData->currentPage), sprite1, sprite2);
+ sprite->data[0]++;
+ return FALSE;
+}
+
+static bool8 PageSwapSpritesCB_Idle(struct Sprite *sprite)
+{
+ struct Sprite *sprite1 = &gSprites[sprite->data[6]];
+ struct Sprite *sprite2 = &gSprites[sprite->data[7]];
+
+ return FALSE;
+}
+
+static bool8 PageSwapSpritesCB_SwapHide(struct Sprite *sprite)
+{
+ struct Sprite *sprite1 = &gSprites[sprite->data[6]];
+ struct Sprite *sprite2 = &gSprites[sprite->data[7]];
+ u8 page;
+
+ sprite1->pos2.y++;
+ if (sprite1->pos2.y > 7)
+ {
+ sprite->data[0]++;
+ sprite1->pos2.y = -4;
+ sprite1->invisible = TRUE;
+ page = sprite->data[1];
+ sub_809ED88(sub_809DE20((page + 1) % 3), sprite1, sprite2);
+ }
+ return FALSE;
+}
+
+static bool8 PageSwapSpritesCB_SwapShow(struct Sprite *sprite)
+{
+ struct Sprite *sprite1 = &gSprites[sprite->data[6]];
+ struct Sprite *sprite2 = &gSprites[sprite->data[7]];
+
+ sprite1->invisible = FALSE;
+ sprite1->pos2.y++;
+ if (sprite1->pos2.y >= 0)
+ {
+ sprite1->pos2.y = 0;
+ sprite->data[0] = 1;
+ }
+ return FALSE;
+}
+
+static const u16 gUnknown_83E2388[] = {1, 3, 2};
+static const u16 gUnknown_83E238E[] = {4, 6, 5};
+
+static void sub_809ED88(u8 page, struct Sprite * sprite1, struct Sprite * sprite2)
+{
+ sprite2->oam.paletteNum = IndexOfSpritePaletteTag(gUnknown_83E2388[page]);
+ sprite1->sheetTileStart = GetSpriteTileStartByTag(gUnknown_83E238E[page]);
+ sprite1->subspriteTableNum = page;
+}
+
+//
+
+static void CreateBackOkSprites(void)
+{
+ u8 spriteId;
+
+ spriteId = CreateSprite(&gUnknown_83E25BC, 0xCC, 0x74, 0);
+ SetSubspriteTables(&gSprites[spriteId], gUnknown_83E2524);
+ gSprites[spriteId].invisible = TRUE;
+
+ spriteId = CreateSprite(&gUnknown_83E25D4, 0xCC, 0x8C, 0);
+ SetSubspriteTables(&gSprites[spriteId], gUnknown_83E2524);
+ gSprites[spriteId].invisible = TRUE;
+}
+
+static void CreateUnderscoreSprites(void)
+{
+ u8 spriteId;
+ s16 xPos;
+ u8 i;
+
+ xPos = sNamingScreenData->inputCharBaseXPos - 5;
+ spriteId = CreateSprite(&sSpriteTemplate_InputArrow, xPos, 0x38, 0);
+ gSprites[spriteId].oam.priority = 3;
+ gSprites[spriteId].invisible = TRUE;
+ xPos = sNamingScreenData->inputCharBaseXPos;
+ for (i = 0; i < sNamingScreenData->template->maxChars; i++, xPos += 8)
+ {
+ spriteId = CreateSprite(&sSpriteTemplate_Underscore, xPos + 3, 0x3C, 0);
+ gSprites[spriteId].oam.priority = 3;
+ gSprites[spriteId].data[0] = i;
+ gSprites[spriteId].invisible = TRUE;
+ }
+}
+
+//--------------------------------------------------
+// Icon creation (the thing you're naming or giving input to)
+//--------------------------------------------------
+
+static void (*const sIconFunctions[])(void) = {
+ NamingScreen_NoCreateIcon,
+ NamingScreen_CreatePlayerIcon,
+ NamingScreen_CreatePCIcon,
+ NamingScreen_CreateMonIcon,
+ NamingScreen_CreateRivalIcon
+};
+
+static void CreateInputTargetIcon(void)
+{
+ sIconFunctions[sNamingScreenData->template->iconFunction]();
+}
+
+static void NamingScreen_NoCreateIcon(void)
+{
+
+}
+
+static void NamingScreen_CreatePlayerIcon(void)
+{
+ u8 rivalGfxId;
+ u8 spriteId;
+
+ rivalGfxId = sub_805C7C8(0, sNamingScreenData->monSpecies);
+ spriteId = AddPseudoObjectEvent(rivalGfxId, SpriteCallbackDummy, 0x38, 0x25, 0);
+ gSprites[spriteId].oam.priority = 3;
+ StartSpriteAnim(&gSprites[spriteId], 4);
+}
+
+static void NamingScreen_CreatePCIcon(void)
+{
+ u8 spriteId;
+
+ spriteId = CreateSprite(&gUnknown_83E2634, 0x38, 0x29, 0);
+ SetSubspriteTables(&gSprites[spriteId], gUnknown_83E252C);
+ gSprites[spriteId].oam.priority = 3;
+}
+
+static void NamingScreen_CreateMonIcon(void)
+{
+ u8 spriteId;
+
+ LoadMonIconPalettes();
+ spriteId = CreateMonIcon(sNamingScreenData->monSpecies, SpriteCallbackDummy, 0x38, 0x28, 0, sNamingScreenData->monPersonality, 1);
+ gSprites[spriteId].oam.priority = 3;
+}
+
+static const union AnimCmd gUnknown_83E23A8[] = {
+ ANIMCMD_FRAME( 0, 10),
+ ANIMCMD_FRAME(24, 10),
+ ANIMCMD_FRAME( 0, 10),
+ ANIMCMD_FRAME(32, 10),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const gUnknown_83E23BC[] = {
+ gUnknown_83E23A8
+};
+
+static void NamingScreen_CreateRivalIcon(void)
+{
+ const struct SpriteSheet sheet = {
+ gUnknown_83E1980, 0x900, 255
+ };
+ const struct SpritePalette palette = {
+ gUnknown_8E98004, 255
+ };
+ struct SpriteTemplate template;
+ const struct SubspriteTable * tables_p;
+ u8 spriteId;
+
+ MakeObjectTemplateFromObjectEventGraphicsInfo(OBJ_EVENT_GFX_RED_NORMAL, SpriteCallbackDummy, &template, &tables_p);
+
+ template.tileTag = sheet.tag;
+ template.paletteTag = palette.tag;
+ template.anims = gUnknown_83E23BC;
+ LoadSpriteSheet(&sheet);
+ LoadSpritePalette(&palette);
+ spriteId = CreateSprite(&template, 0x38, 0x25, 0);
+ gSprites[spriteId].oam.priority = 3;
+}
+
+static bool8 (*const sKeyboardKeyHandlers[])(u8) = {
+ KeyboardKeyHandler_Character,
+ KeyboardKeyHandler_Page,
+ KeyboardKeyHandler_Backspace,
+ KeyboardKeyHandler_OK,
+};
+
+static bool8 HandleKeyboardEvent(void)
+{
+ u8 event = GetInputEvent();
+ u8 keyRole = GetKeyRoleAtCursorPos();
+
+ if (event == KBEVENT_PRESSED_SELECT)
+ {
+ return TriggerKeyboardChange();
+ }
+ else if (event == KBEVENT_PRESSED_B)
+ {
+ DeleteTextCharacter();
+ return FALSE;
+ }
+ else if (event == KBEVENT_PRESSED_START)
+ {
+ MoveCursorToOKButton();
+ return FALSE;
+ }
+ else
+ {
+ return sKeyboardKeyHandlers[keyRole](event);
+ }
+}
+
+static bool8 KeyboardKeyHandler_Character(u8 event)
+{
+ sub_809E518(3, 0, 0);
+ if (event == KBEVENT_PRESSED_A)
+ {
+ bool8 var = AppendCharToBuffer_CheckBufferFull();
+
+ sub_809EAA8();
+ if (var)
+ {
+ SetInputState(INPUT_STATE_DISABLED);
+ sNamingScreenData->state = MAIN_STATE_MOVE_TO_OK_BUTTON;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 KeyboardKeyHandler_Page(u8 event)
+{
+ sub_809E518(0, 1, 0);
+ if (event == KBEVENT_PRESSED_A)
+ return TriggerKeyboardChange();
+ else
+ return FALSE;
+}
+
+static bool8 KeyboardKeyHandler_Backspace(u8 event)
+{
+ sub_809E518(1, 1, 0);
+ if (event == KBEVENT_PRESSED_A)
+ DeleteTextCharacter();
+ return FALSE;
+}
+
+static bool8 KeyboardKeyHandler_OK(u8 event)
+{
+ sub_809E518(2, 1, 0);
+ if (event == KBEVENT_PRESSED_A)
+ {
+ PlaySE(SE_SELECT);
+ sNamingScreenData->state = MAIN_STATE_6;
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+static bool8 TriggerKeyboardChange(void)
+{
+ sNamingScreenData->state = MAIN_STATE_START_PAGE_SWAP;
+ return TRUE;
+}
+
+//--------------------------------------------------
+// Input handling
+//--------------------------------------------------
+
+enum
+{
+ FNKEY_CASE,
+ FNKEY_BACK,
+ FNKEY_OK,
+};
+
+#define tState data[0]
+#define tKeyboardEvent data[1]
+#define tKbFunctionKey data[2]
+
+static void (*const sInputStateFuncs[])(struct Task *) = {
+ InputState_Disabled,
+ InputState_Enabled
+};
+
+static void InputInit(void)
+{
+ CreateTask(Task_HandleInput, 1);
+}
+
+static u8 GetInputEvent(void)
+{
+ u8 taskId = FindTaskIdByFunc(Task_HandleInput);
+
+ return gTasks[taskId].tKeyboardEvent;
+}
+
+static void SetInputState(u8 state)
+{
+ u8 taskId = FindTaskIdByFunc(Task_HandleInput);
+
+ gTasks[taskId].tState = state;
+}
+
+static void Task_HandleInput(u8 taskId)
+{
+ sInputStateFuncs[gTasks[taskId].tState](&gTasks[taskId]);
+}
+
+static void InputState_Disabled(struct Task *task)
+{
+ task->tKeyboardEvent = 0;
+}
+
+static void InputState_Enabled(struct Task *task)
+{
+ task->tKeyboardEvent = 0;
+
+ if (JOY_NEW(A_BUTTON))
+ task->tKeyboardEvent = KBEVENT_PRESSED_A;
+ else if (JOY_NEW(B_BUTTON))
+ task->tKeyboardEvent = KBEVENT_PRESSED_B;
+ else if (JOY_NEW(SELECT_BUTTON))
+ task->tKeyboardEvent = KBEVENT_PRESSED_SELECT;
+ else if (JOY_NEW(START_BUTTON))
+ task->tKeyboardEvent = KBEVENT_PRESSED_START;
+ else
+ HandleDpadMovement(task);
+}
+
+static void HandleDpadMovement(struct Task *task)
+{
+ const s16 sDpadDeltaX[] = {
+ 0, //none
+ 0, //up
+ 0, //down
+ -1, //left
+ 1 //right
+ };
+
+ const s16 sDpadDeltaY[] = {
+ 0, //none
+ -1, //up
+ 1, //down
+ 0, //left
+ 0 //right
+ };
+
+ const s16 s4RowTo3RowTableY[] = {0, 1, 1, 2};
+ const s16 s3RowTo4RowTableY[] = {0, 0, 3};
+
+ s16 cursorX;
+ s16 cursorY;
+ u16 dpadDir;
+ s16 prevCursorX;
+
+ GetCursorPos(&cursorX, &cursorY);
+ dpadDir = 0;
+ if (JOY_REPT(DPAD_UP))
+ dpadDir = 1;
+ if (JOY_REPT(DPAD_DOWN))
+ dpadDir = 2;
+ if (JOY_REPT(DPAD_LEFT))
+ dpadDir = 3;
+ if (JOY_REPT(DPAD_RIGHT))
+ dpadDir = 4;
+
+ //Get new cursor position
+ prevCursorX = cursorX;
+ cursorX += sDpadDeltaX[dpadDir];
+ cursorY += sDpadDeltaY[dpadDir];
+
+ //Wrap cursor position in the X direction
+ if (cursorX < 0)
+ cursorX = GetCurrentPageColumnCount();
+ if (cursorX > GetCurrentPageColumnCount())
+ cursorX = 0;
+
+ //Handle cursor movement in X direction
+ if (sDpadDeltaX[dpadDir] != 0)
+ {
+ if (cursorX == GetCurrentPageColumnCount())
+ {
+ //We are now on the last column
+ task->tKbFunctionKey = cursorY;
+ cursorY = s4RowTo3RowTableY[cursorY];
+ }
+ else if (prevCursorX == GetCurrentPageColumnCount())
+ {
+ if (cursorY == 1)
+ cursorY = task->tKbFunctionKey;
+ else
+ cursorY = s3RowTo4RowTableY[cursorY];
+ }
+ }
+
+ if (cursorX == GetCurrentPageColumnCount())
+ {
+ //There are only 3 keys on the last column, unlike the others,
+ //so wrap Y accordingly
+ if (cursorY < 0)
+ cursorY = 2;
+ if (cursorY > 2)
+ cursorY = 0;
+ if (cursorY == 0)
+ task->tKbFunctionKey = FNKEY_BACK;
+ else if (cursorY == 2)
+ task->tKbFunctionKey = FNKEY_OK;
+ }
+ else
+ {
+ if (cursorY < 0)
+ cursorY = 3;
+ if (cursorY > 3)
+ cursorY = 0;
+ }
+ SetCursorPos(cursorX, cursorY);
+}
+
+#undef tState
+#undef tKeyboardEvent
+#undef tKbFunctionKey
+
+static void PrintTitleFunction_NoMon(void)
+{
+ FillWindowPixelBuffer(sNamingScreenData->windows[3], PIXEL_FILL(1));
+ AddTextPrinterParameterized(sNamingScreenData->windows[3], 1, sNamingScreenData->template->title, 1, 1, 0, NULL);
+ PutWindowTilemap(sNamingScreenData->windows[3]);
+}
+
+static void PrintTitleFunction_WithMon(void)
+{
+ u8 buffer[0x20];
+
+ StringCopy(buffer, gSpeciesNames[sNamingScreenData->monSpecies]);
+ StringAppendN(buffer, sNamingScreenData->template->title, 15);
+ FillWindowPixelBuffer(sNamingScreenData->windows[3], PIXEL_FILL(1));
+ AddTextPrinterParameterized(sNamingScreenData->windows[3], 1, buffer, 1, 1, 0, NULL);
+ PutWindowTilemap(sNamingScreenData->windows[3]);
+}
+
+static void (*const sPrintTitleFuncs[])(void) = {
+ [NAMING_SCREEN_PLAYER] = PrintTitleFunction_NoMon,
+ [NAMING_SCREEN_BOX] = PrintTitleFunction_NoMon,
+ [NAMING_SCREEN_CAUGHT_MON] = PrintTitleFunction_WithMon,
+ [NAMING_SCREEN_NAME_RATER] = PrintTitleFunction_WithMon,
+ [NAMING_SCREEN_RIVAL] = PrintTitleFunction_NoMon
+};
+
+static void PrintTitle(void)
+{
+ sPrintTitleFuncs[sNamingScreenData->templateNum]();
+}
+
+static void (*const sAddGenderIconFuncs[])(void) = {
+ AddGenderIconFunc_No,
+ AddGenderIconFunc_Yes
+};
+
+static void CallAddGenderIconFunc(void)
+{
+ sAddGenderIconFuncs[sNamingScreenData->template->addGenderIcon]();
+}
+
+static void AddGenderIconFunc_No(void)
+{
+
+}
+
+static const u8 sGenderColors[2][3] = {
+ [MALE] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_BLUE, TEXT_COLOR_BLUE},
+ [FEMALE] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_RED, TEXT_COLOR_RED}
+};
+
+static void AddGenderIconFunc_Yes(void)
+{
+ u8 genderSymbol[2];
+ bool8 gender = MALE;
+
+ StringCopy(genderSymbol, gText_MaleSymbol);
+
+ if (sNamingScreenData->monGender != MON_GENDERLESS)
+ {
+ if (sNamingScreenData->monGender == MON_FEMALE)
+ {
+ StringCopy(genderSymbol, gText_FemaleSymbol);
+ gender = FEMALE;
+ }
+ AddTextPrinterParameterized3(sNamingScreenData->windows[2], 2, 0x68, 1, sGenderColors[gender], TEXT_SPEED_FF, genderSymbol);
+ }
+}
+
+static u8 GetCharAtKeyboardPos(s16 x, s16 y)
+{
+ return gUnknown_83E22D0[sub_809DE50()][y][x];
+}
+
+static u8 GetTextCaretPosition(void)
+{
+ u8 i;
+
+ for (i = 0; i < sNamingScreenData->template->maxChars; i++)
+ {
+ if (sNamingScreenData->textBuffer[i] == EOS)
+ return i;
+ }
+ return sNamingScreenData->template->maxChars - 1;
+}
+
+static u8 GetPreviousTextCaretPosition(void)
+{
+ s8 i;
+
+ for (i = sNamingScreenData->template->maxChars - 1; i > 0; i--)
+ {
+ if (sNamingScreenData->textBuffer[i] != EOS)
+ return i;
+ }
+ return 0;
+}
+
+static void DeleteTextCharacter(void)
+{
+ u8 index;
+ u8 var2;
+
+ index = GetPreviousTextCaretPosition();
+ // Temporarily make this a space for redrawing purposes
+ sNamingScreenData->textBuffer[index] = CHAR_SPACE;
+ PrintBufferCharactersOnScreen();
+ CopyBgTilemapBufferToVram(3);
+ sNamingScreenData->textBuffer[index] = EOS;
+ var2 = GetKeyRoleAtCursorPos();
+ if (var2 == KEY_ROLE_CHAR || var2 == KEY_ROLE_BACKSPACE)
+ sub_809E518(1, 0, 1);
+ PlaySE(SE_BOWA);
+}
+
+static bool8 AppendCharToBuffer_CheckBufferFull(void)
+{
+ s16 x;
+ s16 y;
+
+ GetCursorPos(&x, &y);
+ AddTextCharacter(GetCharAtKeyboardPos(x, y));
+ PrintBufferCharactersOnScreen();
+ CopyBgTilemapBufferToVram(3);
+ PlaySE(SE_SELECT);
+
+ if (GetPreviousTextCaretPosition() != sNamingScreenData->template->maxChars - 1)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+static void AddTextCharacter(u8 ch)
+{
+ u8 index = GetTextCaretPosition();
+
+ sNamingScreenData->textBuffer[index] = ch;
+}
+
+static void CopyStringToDestBuffer(void)
+{
+ // Copy from the first non-whitespace character
+ u8 i;
+
+ for (i = 0; i < sNamingScreenData->template->maxChars; i++)
+ {
+ if (sNamingScreenData->textBuffer[i] != CHAR_SPACE && sNamingScreenData->textBuffer[i] != EOS)
+ {
+ StringCopyN(sNamingScreenData->destBuffer, sNamingScreenData->textBuffer, sNamingScreenData->template->maxChars + 1);
+ break;
+ }
+ }
+}
+
+static void choose_name_or_words_screen_load_bg_tile_patterns(void)
+{
+ LZ77UnCompWram(gNamingScreenMenu_Gfx, sNamingScreenData->tileBuffer);
+ LoadBgTiles(1, sNamingScreenData->tileBuffer, 0x600, 0);
+ LoadBgTiles(2, sNamingScreenData->tileBuffer, 0x600, 0);
+ LoadBgTiles(3, sNamingScreenData->tileBuffer, 0x600, 0);
+ LoadSpriteSheets(gUnknown_83E267C);
+ LoadSpritePalettes(gUnknown_83E26E4);
+}
+
+static void sub_809F8C0(void)
+{
+ InputInit();
+ sub_809E4F0();
+}
+
+static void choose_name_or_words_screen_apply_bg_pals(void)
+{
+ LoadPalette(gNamingScreenMenu_Pal, 0, 0xC0);
+ LoadPalette(gUnknown_8E97FE4, 0xA0, 0x20);
+ LoadPalette(stdpal_get(2), 0xB0, 0x20);
+}
+
+static void DecompressToBgTilemapBuffer(u8 bg, const u32 *src)
+{
+ CopyToBgTilemapBuffer(bg, src, 0, 0);
+}
+
+static void PrintBufferCharactersOnScreen(void)
+{
+ u8 i;
+ u8 temp[2];
+ u16 xoff;
+ u8 maxChars = sNamingScreenData->template->maxChars;
+ u16 xpos = sNamingScreenData->inputCharBaseXPos - 0x40;
+
+ FillWindowPixelBuffer(sNamingScreenData->windows[2], PIXEL_FILL(1));
+
+ for (i = 0; i < maxChars; i++)
+ {
+ temp[0] = sNamingScreenData->textBuffer[i];
+ temp[1] = gExpandedPlaceholder_Empty[0];
+ xoff = (IsLetter(temp[0]) == TRUE) ? 2 : 0;
+
+ AddTextPrinterParameterized(sNamingScreenData->windows[2], 2, temp, i * 8 + xpos + xoff, 1, TEXT_SPEED_FF, NULL);
+ }
+
+ CallAddGenderIconFunc();
+ CopyWindowToVram(sNamingScreenData->windows[2], 2);
+ PutWindowTilemap(sNamingScreenData->windows[2]);
+}
+
+struct TextColor // Needed because of alignment
+{
+ u8 colors[3][4];
+};
+
+static const struct TextColor sTextColorStruct = {
+ {
+ {TEXT_DYNAMIC_COLOR_4, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY},
+ {TEXT_DYNAMIC_COLOR_5, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY},
+ {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY}
+ }
+};
+
+static const u8 sFillValues[KBPAGE_COUNT] = {
+ [KBPAGE_LETTERS_LOWER] = PIXEL_FILL(14),
+ [KBPAGE_LETTERS_UPPER] = PIXEL_FILL(13),
+ [KBPAGE_SYMBOLS] = PIXEL_FILL(15)
+};
+
+static const u8 *const sKeyboardTextColors[KBPAGE_COUNT] = {
+ [KBPAGE_LETTERS_LOWER] = sTextColorStruct.colors[1],
+ [KBPAGE_LETTERS_UPPER] = sTextColorStruct.colors[0],
+ [KBPAGE_SYMBOLS] = sTextColorStruct.colors[2]
+};
+
+static void sub_809F9E8(u8 window, u8 page)
+{
+ u8 i;
+
+ FillWindowPixelBuffer(window, sFillValues[page]);
+
+ for (i = 0; i < KBROW_COUNT; i++)
+ {
+ AddTextPrinterParameterized3(window, 1, 0, i * 16 + 1, sKeyboardTextColors[page], 0, sNamingScreenKeyboardText[page][i]);
+ }
+
+ PutWindowTilemap(window);
+}
+
+static const u32 *const gUnknown_83E244C[] = {
+ gUnknown_8E98398,
+ gUnknown_8E98458,
+ gUnknown_8E98518
+};
+
+static void sub_809FA60(void)
+{
+ u8 bgId;
+ u8 bgId_copy;
+ u8 windowId;
+ u8 bg1Priority = GetGpuReg(REG_OFFSET_BG1CNT) & 3;
+ u8 bg2Priority = GetGpuReg(REG_OFFSET_BG2CNT) & 3;
+
+ if (bg1Priority > bg2Priority)
+ {
+ bgId = 1;
+ bgId_copy = 1;
+ windowId = sNamingScreenData->windows[0];
+ }
+ else
+ {
+ bgId = 2;
+ bgId_copy = 2;
+ windowId = sNamingScreenData->windows[1];
+ }
+
+ DecompressToBgTilemapBuffer(bgId, gUnknown_83E244C[sNamingScreenData->currentPage]);
+ sub_809F9E8(windowId, sub_809DE30());
+ CopyBgTilemapBufferToVram(bgId_copy);
+}
+
+static void sub_809FAE4(void)
+{
+ const u8 color[3] = { TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY };
+ int strwidth = GetStringWidth(0, gText_MoveOkBack, 0);
+
+ FillWindowPixelBuffer(sNamingScreenData->windows[4], PIXEL_FILL(15));
+ AddTextPrinterParameterized3(sNamingScreenData->windows[4], 0, 236 - strwidth, 0, color, 0, gText_MoveOkBack);
+ PutWindowTilemap(sNamingScreenData->windows[4]);
+ CopyWindowToVram(sNamingScreenData->windows[4], 3);
+}
+
+static void sub_809FB70(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void NamingScreen_TurnOffScreen(void)
+{
+ SetVBlankCallback(NULL);
+ SetHBlankCallback(NULL);
+}
+
+static void NamingScreen_InitDisplayMode(void)
+{
+ SetVBlankCallback(VBlankCB_NamingScreen);
+}
+
+static void VBlankCB_NamingScreen(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ SetGpuReg(REG_OFFSET_BG1VOFS, sNamingScreenData->bg1vOffset);
+ SetGpuReg(REG_OFFSET_BG2VOFS, sNamingScreenData->bg2vOffset);
+ SetGpuReg(REG_OFFSET_BG1CNT, GetGpuReg(REG_OFFSET_BG1CNT) & 0xFFFC); // clear priority bits
+ SetGpuRegBits(REG_OFFSET_BG1CNT, sNamingScreenData->bg1Priority);
+ SetGpuReg(REG_OFFSET_BG2CNT, GetGpuReg(REG_OFFSET_BG2CNT) & 0xFFFC); // clear priority bits
+ SetGpuRegBits(REG_OFFSET_BG2CNT, sNamingScreenData->bg2Priority);
+}
+
+static void ShowAllBgs(void)
+{
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+}
+
+static bool8 IsLetter(u8 character)
+{
+ u8 i;
+
+ for (i = 0; gText_AlphabetUpperLower[i] != EOS; i++)
+ {
+ if (character == gText_AlphabetUpperLower[i])
+ return TRUE;
+ }
+ return FALSE;
+}
+
+//--------------------------------------------------
+// Unused debug functions
+//--------------------------------------------------
+
+static void Debug_DoNamingScreen_Player(void)
+{
+ DoNamingScreen(NAMING_SCREEN_PLAYER, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, MON_MALE, 0, CB2_ReturnToFieldWithOpenMenu);
+}
+
+static void Debug_DoNamingScreen_Box(void)
+{
+ DoNamingScreen(NAMING_SCREEN_BOX, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, MON_MALE, 0, CB2_ReturnToFieldWithOpenMenu);
+}
+
+static void Debug_DoNamingScreen_CaughtMon(void)
+{
+ DoNamingScreen(NAMING_SCREEN_CAUGHT_MON, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, MON_MALE, 0, CB2_ReturnToFieldWithOpenMenu);
+}
+
+static void Debug_DoNamingScreen_NameRater(void)
+{
+ DoNamingScreen(NAMING_SCREEN_NAME_RATER, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, MON_MALE, 0, CB2_ReturnToFieldWithOpenMenu);
+}
+
+static void Debug_DoNamingScreen_Rival(void)
+{
+ DoNamingScreen(NAMING_SCREEN_RIVAL, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, MON_MALE, 0, CB2_ReturnToFieldWithOpenMenu);
+}
+
+//--------------------------------------------------
+// Forward-declared variables
+//--------------------------------------------------
+
+static const struct NamingScreenTemplate sPlayerNamingScreenTemplate = {
+ .copyExistingString = FALSE,
+ .maxChars = PLAYER_NAME_LENGTH,
+ .iconFunction = 1,
+ .addGenderIcon = 0,
+ .initialPage = KBPAGE_LETTERS_UPPER,
+ .title = gText_YourName,
+};
+
+static const struct NamingScreenTemplate sPcBoxNamingScreenTemplate = {
+ .copyExistingString = FALSE,
+ .maxChars = 8/*BOX_NAME_LENGTH*/,
+ .iconFunction = 2,
+ .addGenderIcon = 0,
+ .initialPage = KBPAGE_LETTERS_UPPER,
+ .title = gText_BoxName,
+};
+
+static const struct NamingScreenTemplate sMonNamingScreenTemplate = {
+ .copyExistingString = FALSE,
+ .maxChars = POKEMON_NAME_LENGTH,
+ .iconFunction = 3,
+ .addGenderIcon = 1,
+ .initialPage = KBPAGE_LETTERS_UPPER,
+ .title = gText_PkmnsNickname,
+};
+
+static const struct NamingScreenTemplate sRivalNamingScreenTemplate = {
+ .copyExistingString = FALSE,
+ .maxChars = OT_NAME_LENGTH,
+ .iconFunction = 4,
+ .addGenderIcon = 0,
+ .initialPage = KBPAGE_LETTERS_UPPER,
+ .title = gText_RivalsName,
+};
+
+static const struct NamingScreenTemplate *const sNamingScreenTemplates[] = {
+ &sPlayerNamingScreenTemplate,
+ &sPcBoxNamingScreenTemplate,
+ &sMonNamingScreenTemplate,
+ &sMonNamingScreenTemplate,
+ &sRivalNamingScreenTemplate,
+};
+
+static const struct OamData gOamData_858BFEC = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x8),
+ .x = 0,
+ .size = SPRITE_SIZE(8x8),
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+};
+
+static const struct OamData gOamData_858BFF4 = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x16),
+ .x = 0,
+ .size = SPRITE_SIZE(16x16),
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+};
+
+static const struct OamData gOamData_858BFFC = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x16),
+ .x = 0,
+ .size = SPRITE_SIZE(32x16),
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+};
+
+static const struct Subsprite gUnknown_83E24B8[] = {
+ {
+ .x = -20,
+ .y = -16,
+ .shape = SPRITE_SHAPE(32x8),
+ .size = SPRITE_SIZE(32x8),
+ .tileOffset = 0,
+ .priority = 1
+ }, {
+ .x = 12,
+ .y = -16,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 4,
+ .priority = 1
+ }, {
+ .x = -20,
+ .y = -8,
+ .shape = SPRITE_SHAPE(32x8),
+ .size = SPRITE_SIZE(32x8),
+ .tileOffset = 5,
+ .priority = 1
+ }, {
+ .x = 12,
+ .y = -8,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 9,
+ .priority = 1
+ }, {
+ .x = -20,
+ .y = 0,
+ .shape = SPRITE_SHAPE(32x8),
+ .size = SPRITE_SIZE(32x8),
+ .tileOffset = 10,
+ .priority = 1
+ }, {
+ .x = 12,
+ .y = 0,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 14,
+ .priority = 1
+ }, {
+ .x = -20,
+ .y = 8,
+ .shape = SPRITE_SHAPE(32x8),
+ .size = SPRITE_SIZE(32x8),
+ .tileOffset = 15,
+ .priority = 1
+ }, {
+ .x = 12,
+ .y = 8,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 19,
+ .priority = 1
+ }
+};
+
+static const struct Subsprite gUnknown_83E24D8[] = {
+ {
+ .x = -12,
+ .y = -4,
+ .shape = SPRITE_SHAPE(16x8),
+ .size = SPRITE_SIZE(16x8),
+ .tileOffset = 0,
+ .priority = 1
+ }, {
+ .x = 4,
+ .y = -4,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 2,
+ .priority = 1
+ }
+};
+
+static const struct Subsprite gUnknown_83E24E0[] = {
+ {
+ .x = -20,
+ .y = -12,
+ .shape = SPRITE_SHAPE(32x8),
+ .size = SPRITE_SIZE(32x8),
+ .tileOffset = 0,
+ .priority = 1
+ }, {
+ .x = 12,
+ .y = -12,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 4,
+ .priority = 1
+ }, {
+ .x = -20,
+ .y = -4,
+ .shape = SPRITE_SHAPE(32x8),
+ .size = SPRITE_SIZE(32x8),
+ .tileOffset = 5,
+ .priority = 1
+ }, {
+ .x = 12,
+ .y = -4,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 9,
+ .priority = 1
+ }, {
+ .x = -20,
+ .y = 4,
+ .shape = SPRITE_SHAPE(32x8),
+ .size = SPRITE_SIZE(32x8),
+ .tileOffset = 10,
+ .priority = 1
+ }, {
+ .x = 12,
+ .y = 4,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 14,
+ .priority = 1
+ }
+};
+
+static const struct Subsprite gUnknown_83E24F8[] = {
+ {
+ .x = -8,
+ .y = -12,
+ .shape = SPRITE_SHAPE(16x8),
+ .size = SPRITE_SIZE(16x8),
+ .tileOffset = 0,
+ .priority = 3
+ }, {
+ .x = -8,
+ .y = -4,
+ .shape = SPRITE_SHAPE(16x8),
+ .size = SPRITE_SIZE(16x8),
+ .tileOffset = 2,
+ .priority = 3
+ }, {
+ .x = -8,
+ .y = 4,
+ .shape = SPRITE_SHAPE(16x8),
+ .size = SPRITE_SIZE(16x8),
+ .tileOffset = 4,
+ .priority = 3
+ }
+};
+
+static const struct SubspriteTable gUnknown_83E2504[] = {
+ subsprite_table(gUnknown_83E24B8)
+};
+
+static const struct SubspriteTable gUnknown_83E250C[] = {
+ subsprite_table(gUnknown_83E24D8),
+ subsprite_table(gUnknown_83E24D8),
+ subsprite_table(gUnknown_83E24D8)
+};
+
+static const struct SubspriteTable gUnknown_83E2524[] = {
+ subsprite_table(gUnknown_83E24E0)
+};
+
+static const struct SubspriteTable gUnknown_83E252C[] = {
+ subsprite_table(gUnknown_83E24F8)
+};
+
+static const struct SpriteFrameImage gUnknown_0858C080[] = {
+ {gUnknown_83E1800, sizeof(gUnknown_83E1800)},
+ {gUnknown_83E18C0, sizeof(gUnknown_83E18C0)},
+};
+
+static const union AnimCmd gSpriteAnim_858C090[] = {
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_858C098[] = {
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_FRAME(8, 8),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_858C0A4[] = {
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_FRAME(1, 2),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const gSpriteAnimTable_858C0B0[] = {
+ gSpriteAnim_858C090
+};
+
+static const union AnimCmd *const gSpriteAnimTable_858C0B4[] = {
+ gSpriteAnim_858C090,
+ gSpriteAnim_858C098
+};
+
+static const union AnimCmd *const gSpriteAnimTable_858C0BC[] = {
+ gSpriteAnim_858C0A4
+};
+
+static const struct SpriteTemplate gUnknown_83E2574 = {
+ .tileTag = 0x0002,
+ .paletteTag = 0x0004,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_PageSwap
+};
+
+static const struct SpriteTemplate gUnknown_83E258C = {
+ .tileTag = 0x0003,
+ .paletteTag = 0x0001,
+ .oam = &gOamData_858BFFC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_83E25A4 = {
+ .tileTag = 0x0004,
+ .paletteTag = 0x0004,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_83E25BC = {
+ .tileTag = 0x0000,
+ .paletteTag = 0x0006,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_83E25D4 = {
+ .tileTag = 0x0001,
+ .paletteTag = 0x0007,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_83E25EC = {
+ .tileTag = 0x0007,
+ .paletteTag = 0x0005,
+ .oam = &gOamData_858BFF4,
+ .anims = gSpriteAnimTable_858C0B4,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_809E700
+};
+
+static const struct SpriteTemplate sSpriteTemplate_InputArrow = {
+ .tileTag = 0x000A,
+ .paletteTag = 0x0003,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_809E7F0
+};
+
+static const struct SpriteTemplate sSpriteTemplate_Underscore = {
+ .tileTag = 0x000B,
+ .paletteTag = 0x0003,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_809E83C
+};
+
+static const struct SpriteTemplate gUnknown_83E2634 = {
+ .tileTag = 0xFFFF,
+ .paletteTag = 0x0000,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0BC,
+ .images = gUnknown_0858C080,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const u8 *const sNamingScreenKeyboardText[KBPAGE_COUNT][KBROW_COUNT] = {
+ [KBPAGE_LETTERS_LOWER] = {
+ gText_NamingScreenKeyboard_abcdef,
+ gText_NamingScreenKeyboard_ghijkl,
+ gText_NamingScreenKeyboard_mnopqrs,
+ gText_NamingScreenKeyboard_tuvwxyz
+ },
+ [KBPAGE_LETTERS_UPPER] = {
+ gText_NamingScreenKeyboard_ABCDEF,
+ gText_NamingScreenKeyboard_GHIJKL,
+ gText_NamingScreenKeyboard_MNOPQRS,
+ gText_NamingScreenKeyboard_TUVWXYZ
+ },
+ [KBPAGE_SYMBOLS] = {
+ gText_NamingScreenKeyboard_01234,
+ gText_NamingScreenKeyboard_56789,
+ gText_NamingScreenKeyboard_Symbols1,
+ gText_NamingScreenKeyboard_Symbols2
+ },
+};
+
+// FIXME: Sync with Emerald
+static const struct SpriteSheet gUnknown_83E267C[] = {
+ {gUnknown_8E98858, 0x1E0, 0x0000},
+ {gUnknown_8E98A38, 0x1E0, 0x0001},
+ {gUnknown_8E985D8, 0x280, 0x0002},
+ {gUnknown_8E98FD8, 0x100, 0x0003},
+ {gUnknown_8E98C18, 0x060, 0x0004},
+ {gUnknown_8E98CB8, 0x060, 0x0005},
+ {gUnknown_8E98D58, 0x060, 0x0006},
+ {gUnknown_8E98DF8, 0x080, 0x0007},
+ {gUnknown_8E98E98, 0x080, 0x0008},
+ {gUnknown_8E98F38, 0x080, 0x0009},
+ {gUnknown_8E990D8, 0x020, 0x000A},
+ {gUnknown_8E990F8, 0x020, 0x000B},
+ {} // terminator
+};
+
+static const struct SpritePalette gUnknown_83E26E4[] = {
+ {gNamingScreenMenu_Pal, 0x0000},
+ {gNamingScreenMenu_Pal + 0x10, 0x0001},
+ {gNamingScreenMenu_Pal + 0x20, 0x0002},
+ {gNamingScreenMenu_Pal + 0x30, 0x0003},
+ {gNamingScreenMenu_Pal + 0x40, 0x0004},
+ {gNamingScreenMenu_Pal + 0x50, 0x0005},
+ {gNamingScreenMenu_Pal + 0x40, 0x0006},
+ {gNamingScreenMenu_Pal + 0x40, 0x0007},
+ {} // terminator
+};
diff --git a/src/new_game.c b/src/new_game.c
index 05fb9c83e..d03e83b34 100644
--- a/src/new_game.c
+++ b/src/new_game.c
@@ -1,5 +1,4 @@
#include "global.h"
-#include "new_game.h"
#include "random.h"
#include "main.h"
#include "overworld.h"
@@ -145,7 +144,7 @@ void NewGameInitData(void)
ResetTrainerFanClub();
UnionRoomChat_InitializeRegisteredTexts();
ResetMiniGamesResults();
- sub_8143D24();
+ InitMEventData();
SetAllRenewableItemFlags();
WarpToPlayersRoom();
ScriptContext2_RunNewScript(EventScript_ResetAllMapFlags);
diff --git a/src/new_menu_helpers.c b/src/new_menu_helpers.c
index 39340ca55..959370398 100644
--- a/src/new_menu_helpers.c
+++ b/src/new_menu_helpers.c
@@ -3,7 +3,6 @@
#include "dma3.h"
#include "task.h"
#include "bg.h"
-#include "gpu_regs.h"
#include "window.h"
#include "menu.h"
#include "menu_helpers.h"
@@ -13,7 +12,6 @@
#include "field_specials.h"
#include "text_window.h"
#include "script.h"
-#include "graphics.h"
#include "palette.h"
#define DLG_WINDOW_PALETTE_NUM 15
@@ -718,7 +716,7 @@ void DestroyHelpMessageWindow_(void)
DestroyHelpMessageWindow(2);
}
-void sub_80F79A4(void)
+void LoadSignPostWindowFrameGfx(void)
{
Menu_LoadStdPal();
sub_814FEEC(0, DLG_WINDOW_BASE_TILE_NUM, 0x10 * DLG_WINDOW_PALETTE_NUM);
diff --git a/src/oak_speech.c b/src/oak_speech.c
index 6887ff85a..11281da30 100644
--- a/src/oak_speech.c
+++ b/src/oak_speech.c
@@ -4,7 +4,6 @@
#include "task.h"
#include "malloc.h"
#include "gpu_regs.h"
-#include "wild_encounter.h"
#include "palette.h"
#include "blend_palette.h"
#include "text.h"
@@ -25,7 +24,6 @@
#include "overworld.h"
#include "random.h"
#include "data.h"
-#include "oak_speech.h"
#include "constants/species.h"
#include "constants/songs.h"
@@ -514,7 +512,7 @@ static void Task_OaksSpeech1(u8 taskId)
ResetSpriteData();
FreeAllSpritePalettes();
ResetTempTileDataBuffers();
- HelpSystem_SetSomeVariable2(2);
+ SetHelpContext(HELPCONTEXT_NEW_GAME);
break;
case 1:
sOakSpeechResources = AllocZeroed(sizeof(*sOakSpeechResources));
@@ -1225,13 +1223,13 @@ static void Task_OakSpeech25(u8 taskId)
GetDefaultName(sOakSpeechResources->unk_0010, 0);
if (sOakSpeechResources->unk_0010 == 0)
{
- DoNamingScreen(0, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, CB2_ReturnFromNamingScreen);
+ DoNamingScreen(NAMING_SCREEN_PLAYER, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, CB2_ReturnFromNamingScreen);
}
else
{
ClearStdWindowAndFrameToTransparent(gTasks[taskId].data[13], 1);
RemoveWindow(gTasks[taskId].data[13]);
- DoNamingScreen(4, gSaveBlock1Ptr->rivalName, 0, 0, 0, CB2_ReturnFromNamingScreen);
+ DoNamingScreen(NAMING_SCREEN_RIVAL, gSaveBlock1Ptr->rivalName, 0, 0, 0, CB2_ReturnFromNamingScreen);
}
DestroyLinkedPikaOrGrassPlatformSprites(taskId, 1);
FreeAllWindowBuffers();
diff --git a/src/option_menu.c b/src/option_menu.c
index 5453dfa9e..56a4ec877 100644
--- a/src/option_menu.c
+++ b/src/option_menu.c
@@ -224,7 +224,7 @@ void CB2_OptionsMenuFromStartMenu(void)
if (sOptionMenuPtr->option[i] > (sOptionMenuItemCounts[i]) - 1)
sOptionMenuPtr->option[i] = 0;
}
- HelpSystem_SetSomeVariable2(0xD);
+ SetHelpContext(HELPCONTEXT_OPTIONS);
SetMainCallback2(CB2_OptionMenu);
}
diff --git a/src/palette.c b/src/palette.c
index 6609c9baa..04638f6d1 100644
--- a/src/palette.c
+++ b/src/palette.c
@@ -948,7 +948,7 @@ void sub_8071898(void)
while (TRUE)
{
taskId = FindTaskIdByFunc(sub_80718B8);
- if (taskId == TASK_NONE)
+ if (taskId == TAIL_SENTINEL)
break;
DestroyTask(taskId);
}
diff --git a/src/party_menu.c b/src/party_menu.c
index df0e70b37..edf7e96f6 100644
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -1,5 +1,5 @@
#include "global.h"
-#include "malloc.h"
+#include "gflib.h"
#include "battle.h"
#include "battle_anim.h"
#include "battle_controllers.h"
@@ -7,21 +7,17 @@
#include "battle_interface.h"
#include "battle_tower.h"
#include "berry_pouch.h"
-#include "bg.h"
#include "data.h"
#include "decompress.h"
#include "easy_chat.h"
#include "event_data.h"
#include "evolution_scene.h"
-#include "field_control_avatar.h"
#include "field_effect.h"
#include "field_player_avatar.h"
-#include "field_screen_effect.h"
-#include "field_specials.h"
+#include "field_fadetransition.h"
#include "field_weather.h"
#include "fieldmap.h"
#include "fldeff.h"
-#include "gpu_regs.h"
#include "graphics.h"
#include "help_system.h"
#include "item.h"
@@ -38,7 +34,6 @@
#include "new_menu_helpers.h"
#include "metatile_behavior.h"
#include "overworld.h"
-#include "palette.h"
#include "party_menu.h"
#include "player_pc.h"
#include "pokedex.h"
@@ -46,26 +41,21 @@
#include "pokemon_icon.h"
#include "pokemon_jump.h"
#include "pokemon_special_anim.h"
-#include "pokemon_storage_system.h"
#include "pokemon_summary_screen.h"
#include "quest_log.h"
#include "region_map.h"
#include "reshow_battle_screen.h"
#include "scanline_effect.h"
#include "script.h"
-#include "sound.h"
-#include "sprite.h"
#include "start_menu.h"
#include "string_util.h"
#include "strings.h"
#include "task.h"
#include "teachy_tv.h"
-#include "text.h"
#include "text_window.h"
#include "tm_case.h"
#include "trade.h"
#include "union_room.h"
-#include "window.h"
#include "constants/battle.h"
#include "constants/easy_chat.h"
#include "constants/field_effects.h"
@@ -78,7 +68,6 @@
#include "constants/quest_log.h"
#include "constants/songs.h"
#include "constants/species.h"
-#include "constants/vars.h"
#define PARTY_PAL_SELECTED (1 << 0)
#define PARTY_PAL_FAINTED (1 << 1)
@@ -577,7 +566,7 @@ static bool8 ShowPartyMenu(void)
++gMain.state;
break;
case 19:
- HelpSystem_SetSomeVariable2(5);
+ SetHelpContext(HELPCONTEXT_PARTY_MENU);
++gMain.state;
break;
case 20:
@@ -3881,7 +3870,7 @@ static void CursorCB_Register(u8 taskId)
u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES);
u8 obedience = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_OBEDIENCE);
- switch (CanRegisterMonForTradingBoard(*(struct GFtgtGnameSub *)sub_80F9800(), species2, species, obedience))
+ switch (CanRegisterMonForTradingBoard(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), species2, species, obedience))
{
case CANT_REGISTER_MON:
StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow);
@@ -3907,7 +3896,7 @@ static void CursorCB_Trade1(u8 taskId)
u16 species2 = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES2);
u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES);
u8 obedience = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_OBEDIENCE);
- u32 stringId = GetUnionRoomTradeMessageId(*(struct GFtgtGnameSub *)sub_80F9800(), gUnknown_203B064, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, obedience);
+ u32 stringId = GetUnionRoomTradeMessageId(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), gPartnerTgtGnameSub, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, obedience);
if (stringId != UR_TRADE_MSG_NONE)
{
@@ -4048,7 +4037,7 @@ static void Task_HandleFieldMoveExitAreaYesNoInput(u8 taskId)
bool8 FieldCallback_PrepareFadeInFromMenu(void)
{
- sub_807DC00();
+ FadeInFromBlack();
CreateTask(Task_FieldMoveWaitForFade, 8);
return TRUE;
}
@@ -6365,7 +6354,7 @@ void ChoosePartyMonByMenuType(u8 menuType)
static bool8 CB2_FadeFromPartyMenu(void)
{
- sub_807DC00();
+ FadeInFromBlack();
CreateTask(Task_PartyMenuWaitForFade, 10);
return TRUE;
}
diff --git a/src/party_menu_specials.c b/src/party_menu_specials.c
index 751684bd5..aba11a534 100644
--- a/src/party_menu_specials.c
+++ b/src/party_menu_specials.c
@@ -2,7 +2,6 @@
#include "data.h"
#include "script.h"
#include "overworld.h"
-#include "battle.h"
#include "palette.h"
#include "pokemon.h"
#include "party_menu.h"
@@ -14,7 +13,7 @@
static void sub_80BF97C(u8 taskId);
-void Special_ChooseMonFromParty(void)
+void ChoosePartyMon(void)
{
u8 taskId;
@@ -24,7 +23,7 @@ void Special_ChooseMonFromParty(void)
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
}
-void Special_SelectMoveTutorMon(void)
+void SelectMoveTutorMon(void)
{
u8 taskId;
@@ -44,14 +43,14 @@ static void sub_80BF97C(u8 taskId)
}
}
-void Special_SelectMove(void)
+void SelectMoveDeleterMove(void)
{
ShowSelectMovePokemonSummaryScreen(gPlayerParty, gSpecialVar_0x8004, gPlayerPartyCount - 1, CB2_ReturnToField, 0);
sub_8138B38(3);
gFieldCallback = FieldCallback_ReturnToEventScript2;
}
-void Special_GetNumMovesSelectedMonHas(void)
+void GetNumMovesSelectedMonHas(void)
{
u8 i;
@@ -61,7 +60,7 @@ void Special_GetNumMovesSelectedMonHas(void)
++gSpecialVar_Result;
}
-void Special_BufferMoveDeleterNicknameAndMove(void)
+void BufferMoveDeleterNicknameAndMove(void)
{
struct Pokemon *mon = &gPlayerParty[gSpecialVar_0x8004];
u16 move = GetMonData(mon, MON_DATA_MOVE1 + gSpecialVar_0x8005);
@@ -92,7 +91,7 @@ static void ShiftMoveSlot(struct Pokemon *mon, u8 slotTo, u8 slotFrom)
SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses);
}
-void Special_MoveDeleterForgetMove(void)
+void MoveDeleterForgetMove(void)
{
u16 i;
@@ -102,7 +101,7 @@ void Special_MoveDeleterForgetMove(void)
ShiftMoveSlot(&gPlayerParty[gSpecialVar_0x8004], i, i + 1);
}
-void Special_IsSelectedMonEgg(void)
+void IsSelectedMonEgg(void)
{
if (GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_IS_EGG))
gSpecialVar_Result = TRUE;
diff --git a/src/player_pc.c b/src/player_pc.c
index 928676844..736c67a51 100644
--- a/src/player_pc.c
+++ b/src/player_pc.c
@@ -23,6 +23,7 @@
#include "party_menu.h"
#include "constants/items.h"
#include "constants/songs.h"
+#include "constants/field_weather.h"
#define PC_ITEM_ID 0
#define PC_QUANTITY 1
@@ -153,8 +154,8 @@ void BedroomPC(void)
{
u8 taskId;
- gPlayerPcMenuManager.unk_9 = 0;
- HelpSystem_BackupSomeVariable();
+ gPlayerPcMenuManager.notInRoom = FALSE;
+ BackupHelpContext();
sItemOrder = gUnknown_8402200;
sTopMenuItemCount = 3;
taskId = CreateTask(TaskDummy, 0);
@@ -165,8 +166,8 @@ void PlayerPC(void)
{
u8 taskId;
- gPlayerPcMenuManager.unk_9 = 1;
- HelpSystem_BackupSomeVariable();
+ gPlayerPcMenuManager.notInRoom = TRUE;
+ BackupHelpContext();
sItemOrder = gUnknown_8402203;
sTopMenuItemCount = 3;
taskId = CreateTask(TaskDummy, 0);
@@ -215,7 +216,7 @@ static void Task_TopMenuHandleInput(u8 taskId)
static void Task_ReturnToTopMenu(u8 taskId)
{
- HelpSystem_RestoreSomeVariable();
+ RestoreHelpContext();
DisplayItemMessageOnField(taskId, 2, gText_WhatWouldYouLikeToDo, Task_DrawPlayerPcTopMenu);
}
@@ -238,10 +239,10 @@ static void Task_PlayerPcMailbox(u8 taskId)
gPlayerPcMenuManager.itemsAbove = 0;
PCMailCompaction();
Task_SetPageItemVars(taskId);
- if (gPlayerPcMenuManager.unk_9 == 0)
- HelpSystem_SetSomeVariable2(34);
+ if (gPlayerPcMenuManager.notInRoom == FALSE)
+ SetHelpContext(HELPCONTEXT_BEDROOM_PC_MAILBOX);
else
- HelpSystem_SetSomeVariable2(30);
+ SetHelpContext(HELPCONTEXT_PLAYERS_PC_MAILBOX);
if (MailboxPC_InitBuffers(gPlayerPcMenuManager.count) == TRUE)
{
ClearDialogWindowAndFrame(0, FALSE);
@@ -257,7 +258,7 @@ static void Task_PlayerPcMailbox(u8 taskId)
static void Task_PlayerPcTurnOff(u8 taskId)
{
- if (gPlayerPcMenuManager.unk_9 == 0)
+ if (gPlayerPcMenuManager.notInRoom == FALSE)
ScriptContext1_SetupScript(EventScript_PalletTown_PlayersHouse_2F_ShutDownPC);
else
EnableBothScriptContexts();
@@ -267,10 +268,10 @@ static void Task_PlayerPcTurnOff(u8 taskId)
static void Task_CreateItemStorageSubmenu(u8 taskId, u8 cursorPos)
{
s16 *data = gTasks[taskId].data;
- if (gPlayerPcMenuManager.unk_9 == 0)
- HelpSystem_SetSomeVariable2(33);
+ if (gPlayerPcMenuManager.notInRoom == FALSE)
+ SetHelpContext(HELPCONTEXT_BEDROOM_PC_ITEMS);
else
- HelpSystem_SetSomeVariable2(29);
+ SetHelpContext(HELPCONTEXT_PLAYERS_PC_ITEMS);
tWindowId = AddWindow(&sWindowTemplate_ItemStorageSubmenu);
SetStdWindowBorderStyle(tWindowId, FALSE);
PrintTextArray(tWindowId, 2, GetMenuCursorDimensionByFont(2, 0), 2, 16, 3, sMenuActions_ItemPc);
@@ -331,7 +332,7 @@ static void Task_DepositItem_WaitFadeAndGoToBag(u8 taskId)
static void Task_PlayerPcDepositItem(u8 taskId)
{
gTasks[taskId].func = Task_DepositItem_WaitFadeAndGoToBag;
- FadeScreen(1, 0);
+ FadeScreen(FADE_TO_BLACK, 0);
}
static void Task_ReturnToItemStorageSubmenu(u8 taskId)
@@ -347,7 +348,7 @@ static void CB2_ReturnFromDepositMenu(void)
DrawDialogueFrame(0, TRUE);
taskId = CreateTask(Task_ReturnToItemStorageSubmenu, 0);
Task_CreateItemStorageSubmenu(taskId, 1);
- sub_807DC00();
+ FadeInFromBlack();
}
static void Task_PlayerPcWithdrawItem(u8 taskId)
@@ -376,7 +377,7 @@ static void CB2_ReturnFromWithdrawMenu(void)
DrawDialogueFrame(0, TRUE);
taskId = CreateTask(Task_ReturnToItemStorageSubmenu, 0);
Task_CreateItemStorageSubmenu(taskId, 0);
- sub_807DC00();
+ FadeInFromBlack();
}
static void Task_WithdrawItem_WaitFadeAndGoToItemStorage(u8 taskId)
@@ -394,7 +395,7 @@ static void Task_WithdrawItemBeginFade(u8 taskId)
{
gTasks[taskId].func = Task_WithdrawItem_WaitFadeAndGoToItemStorage;
ItemPc_SetInitializedFlag(0);
- FadeScreen(1, 0);
+ FadeScreen(FADE_TO_BLACK, 0);
}
static void Task_PlayerPcCancel(u8 taskId)
@@ -556,7 +557,7 @@ static void Task_MailSubmenuHandleInput(u8 taskId)
static void Task_PlayerPcReadMail(u8 taskId)
{
- FadeScreen(1, 0);
+ FadeScreen(FADE_TO_BLACK, 0);
gTasks[taskId].func = Task_WaitFadeAndReadSelectedMail;
}
@@ -580,17 +581,17 @@ static void Task_WaitFadeAndReturnToMailboxPcInputHandler(u8 taskId)
static void CB2_ReturnToMailbox(void)
{
u8 taskId;
- if (gPlayerPcMenuManager.unk_9 == 0)
- HelpSystem_SetSomeVariable2(34);
+ if (gPlayerPcMenuManager.notInRoom == FALSE)
+ SetHelpContext(HELPCONTEXT_BEDROOM_PC_MAILBOX);
else
- HelpSystem_SetSomeVariable2(30);
+ SetHelpContext(HELPCONTEXT_PLAYERS_PC_MAILBOX);
LoadStdWindowFrameGfx();
taskId = CreateTask(Task_WaitFadeAndReturnToMailboxPcInputHandler, 0);
if (MailboxPC_InitBuffers(gPlayerPcMenuManager.count) == TRUE)
Task_DrawMailboxPcMenu(taskId);
else
DestroyTask(taskId);
- sub_807DC00();
+ FadeInFromBlack();
}
static void CB2_SetCbToReturnToMailbox(void)
@@ -663,7 +664,7 @@ static void Task_PlayerPcGiveMailToMon(u8 taskId)
}
else
{
- FadeScreen(1, 0);
+ FadeScreen(FADE_TO_BLACK, 0);
gTasks[taskId].func = Task_WaitFadeAndGoToPartyMenu;
}
}
@@ -683,10 +684,10 @@ static void CB2_ReturnToMailboxPc_UpdateScrollVariables(void)
{
u8 taskId;
u8 count;
- if (gPlayerPcMenuManager.unk_9 == 0)
- HelpSystem_SetSomeVariable2(34);
+ if (gPlayerPcMenuManager.notInRoom == FALSE)
+ SetHelpContext(HELPCONTEXT_BEDROOM_PC_MAILBOX);
else
- HelpSystem_SetSomeVariable2(30);
+ SetHelpContext(HELPCONTEXT_PLAYERS_PC_MAILBOX);
taskId = CreateTask(Task_WaitFadeAndReturnToMailboxPcInputHandler, 0);
count = gPlayerPcMenuManager.count;
gPlayerPcMenuManager.count = CountPCMail();
@@ -705,7 +706,7 @@ static void CB2_ReturnToMailboxPc_UpdateScrollVariables(void)
Task_DrawMailboxPcMenu(taskId);
else
DestroyTask(taskId);
- sub_807DC00();
+ FadeInFromBlack();
}
void Mailbox_ReturnToMailListAfterDeposit(void)
diff --git a/src/pokeball.c b/src/pokeball.c
index aeaba08ab..92b22abe6 100644
--- a/src/pokeball.c
+++ b/src/pokeball.c
@@ -15,7 +15,6 @@
#include "link.h"
#include "battle_gfx_sfx_util.h"
#include "constants/songs.h"
-#include "constants/species.h"
#define tFrames data[0]
#define tPan data[1]
diff --git a/src/pokedex_screen.c b/src/pokedex_screen.c
index 2ccec7a3f..0219ca466 100644
--- a/src/pokedex_screen.c
+++ b/src/pokedex_screen.c
@@ -302,7 +302,7 @@ void CB2_OpenPokedexFromStartMenu(void)
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
SetGpuReg(REG_OFFSET_BLDY, 0);
SetMainCallback2(sub_81024D4);
- HelpSystem_SetSomeVariable2(4);
+ SetHelpContext(HELPCONTEXT_POKEDEX);
}
#define FREE_IF_NOT_NULL(ptr0) ({ void * ptr = (ptr0); if (ptr) Free(ptr); })
@@ -562,8 +562,8 @@ void sub_8102F80(u8 taskId)
switch (gUnknown_203ACF0->field_01)
{
case 0:
- sub_8107D38(0x10, 0);
- sub_8107D38(0x20, 1);
+ ListMenuLoadStdPalAt(0x10, 0);
+ ListMenuLoadStdPalAt(0x20, 1);
gUnknown_203ACF0->field_48 = sub_8103518(gUnknown_203ACF0->field_42);
gUnknown_203ACF0->field_01 = 2;
break;
@@ -648,8 +648,8 @@ void sub_8103238(u8 taskId)
switch (gUnknown_203ACF0->field_01)
{
case 0:
- sub_8107D38(0x10, 0);
- sub_8107D38(0x20, 1);
+ ListMenuLoadStdPalAt(0x10, 0);
+ ListMenuLoadStdPalAt(0x20, 1);
gUnknown_203ACF0->field_48 = sub_8103518(gUnknown_203ACF0->field_42);
gUnknown_203ACF0->field_01 = 2;
break;
diff --git a/src/pokemon.c b/src/pokemon.c
index 09e2ed998..f1f7834b1 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -90,7 +90,20 @@ static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon);
#include "data/battle_moves.h"
-static const u8 sUnreferencedData[] = { 0x34, 0x00, 0x10, 0x00, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00 };
+// Used in an unreferenced function in RS.
+// Unreferenced here and in Emerald.
+struct CombinedMove
+{
+ u16 move1;
+ u16 move2;
+ u16 newMove;
+};
+
+static const struct CombinedMove sCombinedMoves[2] =
+{
+ {MOVE_EMBER, MOVE_GUST, MOVE_HEAT_WAVE},
+ {0xFFFF, 0xFFFF, 0xFFFF}
+};
static const u16 sSpeciesToHoennPokedexNum[] = // Assigns all species to the Hoenn Dex Index (Summary No. for Hoenn Dex)
{
diff --git a/src/pokemon_jump.c b/src/pokemon_jump.c
new file mode 100644
index 000000000..063176151
--- /dev/null
+++ b/src/pokemon_jump.c
@@ -0,0 +1,254 @@
+#include "global.h"
+#include "gflib.h"
+#include "battle_anim.h"
+#include "decompress.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "task.h"
+#include "constants/songs.h"
+
+static void sub_8147654(u8 taskId);
+static void sub_81477C0(u8 taskId);
+static void sub_814784C(u8 taskId);
+static void sub_81479D4(u8 taskId);
+static void sub_8147A34(u8 taskId);
+
+static const u16 gUnknown_846AFE8[] = INCBIN_U16("graphics/misc/unk_846B008.gbapal");
+static const u32 gUnknown_846B008[] = INCBIN_U32("graphics/misc/unk_846B008.4bpp.lz");
+
+static const struct CompressedSpriteSheet gUnknown_846B42C[] = {
+ {gUnknown_846B008, 0x0C00, 0x2000},
+ {}
+};
+
+static const struct SpritePalette gUnknown_846B43C[] = {
+ {gUnknown_846AFE8, 0x2000},
+ {}
+};
+
+static const union AnimCmd gUnknown_846B44C[] = {
+ ANIMCMD_FRAME(0x00, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846B454[] = {
+ ANIMCMD_FRAME(0x10, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846B45C[] = {
+ ANIMCMD_FRAME(0x20, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846B464[] = {
+ ANIMCMD_FRAME(0x40, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846B46C[] = {
+ ANIMCMD_FRAME(0x30, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_846B474[] = {
+ ANIMCMD_FRAME(0x50, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gUnknown_846B47C[] = {
+ gUnknown_846B44C,
+ gUnknown_846B454,
+ gUnknown_846B45C,
+ gUnknown_846B464,
+ gUnknown_846B46C,
+ gUnknown_846B474
+};
+
+static const struct SpriteTemplate gUnknown_846B494[] = {
+ {
+ .tileTag = 0x2000,
+ .paletteTag = 0x2000,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gUnknown_846B47C,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+ },
+};
+
+static const TaskFunc gUnknown_846B4AC[][4] = {
+ { sub_81477C0, sub_814784C, sub_81479D4, sub_8147A34 }
+};
+
+// Unused, but looks like it was intended to be a hook
+UNUSED u8 sub_81475C0(u8 data1, u8 priority)
+{
+ u8 taskId;
+ struct Task * task;
+
+ taskId = CreateTask(sub_8147654, priority);
+ task = &gTasks[taskId];
+ task->data[0] = 1;
+ task->data[1] = data1;
+ gUnknown_846B4AC[data1][0](taskId);
+ return taskId;
+}
+
+// Unused, but looks like it was intended to be a hook
+UNUSED bool32 sub_814760C(void)
+{
+ u8 taskId;
+
+ taskId = FindTaskIdByFunc(sub_8147654);
+ if (taskId == 0xFF)
+ return FALSE;
+ gTasks[taskId].data[0] = 2;
+ return TRUE;
+}
+
+// Unused, but looks like it was intended to be a hook
+UNUSED bool32 sub_8147640(void)
+{
+ return FuncIsActiveTask(sub_8147654);
+}
+
+static void sub_8147654(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 2:
+ gUnknown_846B4AC[data[1]][2](taskId);
+ data[0] = 3;
+ break;
+ case 3:
+ gUnknown_846B4AC[data[1]][3](taskId);
+ break;
+ case 4:
+ gUnknown_846B4AC[data[1]][1](taskId);
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static void sub_81476E0(u8 taskId, s16 *data)
+{
+ u8 i;
+ struct Sprite *sprite;
+
+ LoadCompressedSpriteSheet(&gUnknown_846B42C[data[3]]);
+ LoadSpritePalette(&gUnknown_846B43C[data[4]]);
+ for (i = 0; i < data[8]; i++)
+ data[13 + i] = CreateSprite(&gUnknown_846B494[data[2]], data[9], data[10], data[7]);
+ for (i = 0; i < data[8]; i++)
+ {
+ sprite = &gSprites[data[13 + i]];
+ sprite->oam.priority = data[6];
+ sprite->invisible = TRUE;
+ sprite->data[1] = data[5];
+ sprite->data[3] = taskId;
+ sprite->data[4] = i;
+ sprite->data[5] = data[13];
+ }
+}
+
+static void sub_81477C0(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ data[2] = 0;
+ data[3] = 0;
+ data[4] = 0;
+ data[5] = 60;
+ data[6] = 0;
+ data[7] = 0;
+ data[8] = 3;
+ data[9] = 120;
+ data[10] = 88;
+ sub_81476E0(taskId, data);
+
+ StartSpriteAnim(&gSprites[data[14]], 4);
+ gSprites[data[14]].pos2.x = -32;
+
+ StartSpriteAnim(&gSprites[data[15]], 5);
+ gSprites[data[15]].pos2.x = 32;
+}
+
+static void sub_814784C(u8 taskId)
+{
+ u8 i = 0;
+ s16 *data = gTasks[taskId].data;
+
+ for (i = 0; i < data[8]; i++)
+ DestroySprite(&gSprites[data[13 + i]]);
+ FreeSpriteTilesByTag(gUnknown_846B42C[data[3]].tag);
+ FreeSpritePaletteByTag(gUnknown_846B43C[data[4]].tag);
+}
+
+static void sub_81478BC(struct Sprite *sprite)
+{
+ s16 *data = gTasks[sprite->data[3]].data;
+
+ if (data[11] % data[5] != 0)
+ return;
+ if (data[11] == data[10])
+ return;
+
+ data[10] = data[11];
+ switch (sprite->data[2])
+ {
+ case 0:
+ sprite->invisible = FALSE;
+ case 1:
+ case 2:
+ PlaySE(SE_KON);
+ StartSpriteAnim(sprite, sprite->data[2]);
+ break;
+ case 3:
+ PlaySE(SE_PIN);
+ StartSpriteAnim(sprite, sprite->data[2]);
+ gSprites[data[14]].invisible = FALSE;
+ gSprites[data[15]].invisible = FALSE;
+ break;
+ case 4:
+ sprite->invisible = TRUE;
+ gSprites[data[14]].invisible = TRUE;
+ gSprites[data[15]].invisible = TRUE;
+ data[0] = 4;
+ return;
+ }
+ sprite->data[2]++;
+}
+
+static void sub_81479D4(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ PlaySE(SE_KON);
+ gSprites[data[13]].callback = sub_81478BC;
+ gSprites[data[13]].invisible = FALSE;
+ gTasks[taskId].data[0] = 3;
+}
+
+static void sub_8147A34(u8 taskId)
+{
+ u16 packet[6];
+ s16 *data = gTasks[taskId].data;
+
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ if (gRecvCmds[0][1] == 0x7FFF)
+ data[11] = gRecvCmds[0][2];
+ if (GetMultiplayerId() == 0)
+ {
+ data[12]++;
+ memset(packet, 0, sizeof(packet));
+ packet[0] = 0x7FFF;
+ packet[1] = data[12];
+ RfuPrepareSend0x2f00(packet);
+ }
+ }
+ else
+ {
+ data[11]++;
+ }
+}
diff --git a/src/pokemon_jump_2.c b/src/pokemon_jump_2.c
new file mode 100644
index 000000000..aa1238e3f
--- /dev/null
+++ b/src/pokemon_jump_2.c
@@ -0,0 +1,2035 @@
+#include "global.h"
+#include "gflib.h"
+#include "event_data.h"
+#include "item.h"
+#include "link_rfu.h"
+#include "menu.h"
+#include "random.h"
+#include "save.h"
+#include "task.h"
+#include "pokemon_jump.h"
+#include "constants/songs.h"
+#include "constants/species.h"
+
+struct PokemonJump1
+{
+ MainCallback returnCallback;
+ u8 unk4;
+ u8 unk5;
+ u8 unk6;
+ u8 unk7;
+ u16 unk8;
+ u16 unkA;
+ u16 unkC;
+ u16 unkE;
+ int unk10;
+ u32 unk14;
+ u32 unk18;
+ int unk1C;
+ u32 unk20;
+ u32 unk24;
+ u32 unk28;
+ int unk2C;
+ u32 unk30;
+ u16 unk34;
+ u16 unk36;
+ u8 filler38[0x2];
+ u16 unk3A;
+ u16 unk3C;
+ u16 unk3E;
+ u16 unk40;
+ u16 unk42;
+ u8 unk44;
+ u8 unk45;
+ u8 unk46;
+ u8 isLeader;
+ u8 unk48;
+ u8 unk49;
+ u16 unk4A;
+ u8 unk4C;
+ u8 unk4D;
+ u16 unk4E;
+ u8 unk50;
+ u8 unk51;
+ u8 filler52[0x2];
+ int unk54;
+ int unk58;
+ int unk5C;
+ int unk60;
+ int unk64;
+ int unk68;
+ int unk6C;
+ struct PokemonJump1Sub unk70;
+ u8 unk7C[MAX_RFU_PLAYERS];
+ u8 unk81[MAX_RFU_PLAYERS];
+ u8 unk86[MAX_RFU_PLAYERS];
+ u8 unk8B[MAX_RFU_PLAYERS];
+ u16 unk90[MAX_RFU_PLAYERS];
+ u16 unk9A[MAX_RFU_PLAYERS];
+ struct PokemonJump2 unkA4;
+ struct PokemonJump1_MonInfo unk82A8[MAX_RFU_PLAYERS];
+ struct PokemonJump1_82E4 unk82E4[MAX_RFU_PLAYERS];
+ struct PokemonJump1_82E4 *unk83AC;
+};
+
+static void sub_8147B60(struct PokemonJump1 *);
+static void sub_8147B94(struct PokemonJump1 *);
+static void sub_8147C20(void);
+static void sub_8147C98(void);
+static s16 GetPokemonJumpSpeciesIdx(u16 species);
+static void sub_8147D2C(struct PokemonJump1_MonInfo *monInfo, struct Pokemon *mon);
+static void sub_8147D6C(void);
+static void sub_8147DA0(u8 taskId);
+static void sub_814807C(u8 taskId);
+static void sub_8148104(void);
+static void sub_8148290(u8 taskId);
+static void sub_81482F8(void);
+static bool32 sub_8148344(void);
+static bool32 sub_81483D0(void);
+static bool32 sub_8148464(void);
+static bool32 sub_81484D0(void);
+static bool32 sub_814856C(void);
+static bool32 sub_81485C8(void);
+static bool32 sub_8148664(void);
+static bool32 sub_81486C4(void);
+static bool32 sub_8148724(void);
+static bool32 sub_8148760(void);
+static bool32 sub_81487B4(void);
+static bool32 sub_8148800(void);
+static bool32 sub_814881C(void);
+static bool32 sub_81488DC(void);
+static bool32 sub_81489C8(void);
+static bool32 sub_8148A60(void);
+static bool32 sub_8148398(void);
+static bool32 sub_8148418(void);
+static bool32 sub_81484B0(void);
+static bool32 sub_8148B54(void);
+static bool32 sub_8148C80(void);
+static bool32 sub_8148D5C(void);
+static bool32 sub_8148E2C(void);
+static void sub_8148E80(u8 taskId);
+static void sub_8148F5C(TaskFunc func, u8 taskPriority);
+static void sub_8148F7C(void);
+static void sub_8148F9C(void);
+static void sub_8148FE0(void);
+static int sub_8149044(void);
+static void sub_8149078(void);
+static int sub_8149194(void);
+static void sub_81491B4(void);
+static void sub_81491E4(void);
+static void sub_8149210(void);
+static bool32 sub_814922C(u16);
+static void sub_8149260(void);
+static void sub_81492D8(void);
+static void sub_814933C(void);
+static void sub_814935C(void);
+static void sub_814936C(void);
+static void sub_814937C(void);
+static void sub_8149490(int);
+static void sub_8149534(void);
+static bool32 sub_8149630(void);
+static bool32 sub_81496D4(void);
+static bool32 sub_8149710(void);
+static bool32 sub_8149748(void);
+static void sub_8149780(int);
+static int sub_81497A8(void);
+static bool32 sub_8149804(void);
+static int sub_8149834(u8 *);
+static void sub_8149878(void);
+static int sub_8149888(int);
+static void sub_8149898(u16);
+static bool32 sub_81498B4(void);
+static u16 sub_81498D8(void);
+static void sub_8149900(u16, u16 *, u16 *);
+static u16 sub_8149910(void);
+static u16 sub_8149930(void);
+static u16 sub_8149978(u16 item, u16 quantity);
+
+EWRAM_DATA static struct PokemonJump1 *gUnknown_203F3D4 = NULL;
+
+static const struct PokemonJumpMons
+{
+ u16 species;
+ u16 unk2;
+} sPkmnJumpSpecies[] =
+{
+ { .species = SPECIES_BULBASAUR, .unk2 = 2, },
+ { .species = SPECIES_CHARMANDER, .unk2 = 1, },
+ { .species = SPECIES_SQUIRTLE, .unk2 = 0, },
+ { .species = SPECIES_CATERPIE, .unk2 = 1, },
+ { .species = SPECIES_METAPOD, .unk2 = 1, },
+ { .species = SPECIES_WEEDLE, .unk2 = 1, },
+ { .species = SPECIES_KAKUNA, .unk2 = 1, },
+ { .species = SPECIES_RATTATA, .unk2 = 1, },
+ { .species = SPECIES_RATICATE, .unk2 = 1, },
+ { .species = SPECIES_PIKACHU, .unk2 = 0, },
+ { .species = SPECIES_SANDSHREW, .unk2 = 0, },
+ { .species = SPECIES_NIDORAN_F, .unk2 = 0, },
+ { .species = SPECIES_NIDORAN_M, .unk2 = 0, },
+ { .species = SPECIES_CLEFAIRY, .unk2 = 0, },
+ { .species = SPECIES_VULPIX, .unk2 = 0, },
+ { .species = SPECIES_JIGGLYPUFF, .unk2 = 2, },
+ { .species = SPECIES_ODDISH, .unk2 = 2, },
+ { .species = SPECIES_PARAS, .unk2 = 1, },
+ { .species = SPECIES_MEOWTH, .unk2 = 0, },
+ { .species = SPECIES_PSYDUCK, .unk2 = 2, },
+ { .species = SPECIES_MANKEY, .unk2 = 1, },
+ { .species = SPECIES_GROWLITHE, .unk2 = 1, },
+ { .species = SPECIES_POLIWAG, .unk2 = 2, },
+ { .species = SPECIES_BELLSPROUT, .unk2 = 2, },
+ { .species = SPECIES_SHELLDER, .unk2 = 1, },
+ { .species = SPECIES_KRABBY, .unk2 = 1, },
+ { .species = SPECIES_EXEGGCUTE, .unk2 = 2, },
+ { .species = SPECIES_CUBONE, .unk2 = 0, },
+ { .species = SPECIES_DITTO, .unk2 = 2, },
+ { .species = SPECIES_EEVEE, .unk2 = 0, },
+ { .species = SPECIES_OMANYTE, .unk2 = 1, },
+ { .species = SPECIES_KABUTO, .unk2 = 1, },
+ { .species = SPECIES_CHIKORITA, .unk2 = 2, },
+ { .species = SPECIES_CYNDAQUIL, .unk2 = 1, },
+ { .species = SPECIES_TOTODILE, .unk2 = 0, },
+ { .species = SPECIES_SPINARAK, .unk2 = 1, },
+ { .species = SPECIES_PICHU, .unk2 = 0, },
+ { .species = SPECIES_CLEFFA, .unk2 = 0, },
+ { .species = SPECIES_IGGLYBUFF, .unk2 = 2, },
+ { .species = SPECIES_TOGEPI, .unk2 = 2, },
+ { .species = SPECIES_MAREEP, .unk2 = 0, },
+ { .species = SPECIES_BELLOSSOM, .unk2 = 2, },
+ { .species = SPECIES_MARILL, .unk2 = 2, },
+ { .species = SPECIES_SUNKERN, .unk2 = 2, },
+ { .species = SPECIES_WOOPER, .unk2 = 2, },
+ { .species = SPECIES_PINECO, .unk2 = 2, },
+ { .species = SPECIES_SNUBBULL, .unk2 = 0, },
+ { .species = SPECIES_SHUCKLE, .unk2 = 2, },
+ { .species = SPECIES_TEDDIURSA, .unk2 = 0, },
+ { .species = SPECIES_SLUGMA, .unk2 = 2, },
+ { .species = SPECIES_SWINUB, .unk2 = 0, },
+ { .species = SPECIES_HOUNDOUR, .unk2 = 1, },
+ { .species = SPECIES_PHANPY, .unk2 = 0, },
+ { .species = SPECIES_PORYGON2, .unk2 = 0, },
+ { .species = SPECIES_TYROGUE, .unk2 = 1, },
+ { .species = SPECIES_SMOOCHUM, .unk2 = 2, },
+ { .species = SPECIES_ELEKID, .unk2 = 1, },
+ { .species = SPECIES_MAGBY, .unk2 = 1, },
+ { .species = SPECIES_LARVITAR, .unk2 = 1, },
+ { .species = SPECIES_TREECKO, .unk2 = 1, },
+ { .species = SPECIES_TORCHIC, .unk2 = 2, },
+ { .species = SPECIES_MUDKIP, .unk2 = 0, },
+ { .species = SPECIES_MARSHTOMP, .unk2 = 0, },
+ { .species = SPECIES_POOCHYENA, .unk2 = 1, },
+ { .species = SPECIES_ZIGZAGOON, .unk2 = 0, },
+ { .species = SPECIES_LINOONE, .unk2 = 0, },
+ { .species = SPECIES_WURMPLE, .unk2 = 1, },
+ { .species = SPECIES_SILCOON, .unk2 = 2, },
+ { .species = SPECIES_CASCOON, .unk2 = 2, },
+ { .species = SPECIES_LOTAD, .unk2 = 2, },
+ { .species = SPECIES_SEEDOT, .unk2 = 1, },
+ { .species = SPECIES_RALTS, .unk2 = 0, },
+ { .species = SPECIES_KIRLIA, .unk2 = 0, },
+ { .species = SPECIES_SURSKIT, .unk2 = 2, },
+ { .species = SPECIES_SHROOMISH, .unk2 = 2, },
+ { .species = SPECIES_NINCADA, .unk2 = 1, },
+ { .species = SPECIES_WHISMUR, .unk2 = 0, },
+ { .species = SPECIES_AZURILL, .unk2 = 2, },
+ { .species = SPECIES_SKITTY, .unk2 = 0, },
+ { .species = SPECIES_SABLEYE, .unk2 = 0, },
+ { .species = SPECIES_MAWILE, .unk2 = 0, },
+ { .species = SPECIES_ARON, .unk2 = 1, },
+ { .species = SPECIES_MEDITITE, .unk2 = 2, },
+ { .species = SPECIES_ELECTRIKE, .unk2 = 1, },
+ { .species = SPECIES_PLUSLE, .unk2 = 1, },
+ { .species = SPECIES_MINUN, .unk2 = 1, },
+ { .species = SPECIES_VOLBEAT, .unk2 = 0, },
+ { .species = SPECIES_ILLUMISE, .unk2 = 0, },
+ { .species = SPECIES_ROSELIA, .unk2 = 2, },
+ { .species = SPECIES_GULPIN, .unk2 = 2, },
+ { .species = SPECIES_NUMEL, .unk2 = 2, },
+ { .species = SPECIES_TORKOAL, .unk2 = 2, },
+ { .species = SPECIES_SPOINK, .unk2 = 0, },
+ { .species = SPECIES_TRAPINCH, .unk2 = 2, },
+ { .species = SPECIES_CACNEA, .unk2 = 2, },
+ { .species = SPECIES_ANORITH, .unk2 = 1, },
+ { .species = SPECIES_WYNAUT, .unk2 = 0, },
+ { .species = SPECIES_SNORUNT, .unk2 = 0, },
+ { .species = SPECIES_CLAMPERL, .unk2 = 1, },
+ { .species = SPECIES_BAGON, .unk2 = 1, },
+};
+
+void StartPokemonJump(u16 partyIndex, MainCallback callback)
+{
+ u8 taskId;
+
+ if (gReceivedRemoteLinkPlayers)
+ {
+ gUnknown_203F3D4 = Alloc(sizeof(*gUnknown_203F3D4));
+ if (gUnknown_203F3D4 != NULL)
+ {
+ ResetTasks();
+ taskId = CreateTask(sub_8147DA0, 1);
+ gUnknown_203F3D4->unk8 = 0;
+ gUnknown_203F3D4->returnCallback = callback;
+ gUnknown_203F3D4->unk4 = taskId;
+ gUnknown_203F3D4->unk6 = GetMultiplayerId();
+ sub_8147D2C(&gUnknown_203F3D4->unk82A8[gUnknown_203F3D4->unk6], &gPlayerParty[partyIndex]);
+ sub_8147B60(gUnknown_203F3D4);
+ SetWordTaskArg(taskId, 2, (uintptr_t)gUnknown_203F3D4);
+ SetMainCallback2(sub_8147D6C);
+ return;
+ }
+ }
+
+ SetMainCallback2(callback);
+}
+
+static void sub_8147B48(void)
+{
+ sub_8149D24();
+ Free(gUnknown_203F3D4);
+}
+
+static void sub_8147B60(struct PokemonJump1 *arg0)
+{
+ arg0->unk5 = GetLinkPlayerCount();
+ arg0->unk70.unk0 = 5;
+ arg0->unk70.unk2 = 0;
+ sub_8147C20();
+ sub_8147B94(arg0);
+ if (arg0->unk5 == MAX_RFU_PLAYERS)
+ sub_814B4E8();
+}
+
+static void sub_8147B94(struct PokemonJump1 *arg0)
+{
+ int i;
+
+ arg0->unk14 = 6;
+ arg0->unk18 = 6;
+ arg0->unk4A = 0;
+ arg0->unk1C = 0;
+ arg0->unk5C = 0;
+ arg0->isLeader = GetMultiplayerId() == 0;
+ arg0->unk8 = 0;
+ arg0->unkA = 0;
+ arg0->unkC = 0;
+ arg0->unkE = 0;
+ arg0->unk58 = 0;
+ arg0->unk3A = 0;
+ arg0->unk44 = 0;
+ arg0->unk54 = 0;
+ arg0->unk46 = 0;
+ arg0->unk49 = 0;
+ arg0->unk48 = 1;
+ arg0->unk70.unk8 = 0;
+ arg0->unk70.unk1 = 0;
+ arg0->unk70.unk4 = 0;
+ arg0->unk60 = 1;
+ arg0->unk4D = 0;
+ arg0->unk68 = 0;
+ arg0->unk64 = 0;
+ arg0->unk2C = 0;
+ arg0->unk30 = 0;
+ sub_8147C98();
+ sub_81491E4();
+
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
+ {
+ arg0->unk7C[i] = 0;
+ arg0->unk9A[i] = 0;
+ }
+}
+
+static void sub_8147C20(void)
+{
+ int i, index;
+
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
+ {
+ index = GetPokemonJumpSpeciesIdx(gUnknown_203F3D4->unk82A8[i].species);
+ gUnknown_203F3D4->unk82E4[i].unkC = sPkmnJumpSpecies[index].unk2;
+ }
+
+ gUnknown_203F3D4->unk83AC = &gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6];
+}
+
+static void sub_8147C98(void)
+{
+ int i;
+
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
+ {
+ gUnknown_203F3D4->unk82E4[i].unkE = 0;
+ gUnknown_203F3D4->unk82E4[i].unk10 = 0;
+ gUnknown_203F3D4->unk82E4[i].unk12 = 0;
+ gUnknown_203F3D4->unk82E4[i].unk0 = 0;
+ gUnknown_203F3D4->unk82E4[i].unk4 = 0x7FFFFFFF;
+ gUnknown_203F3D4->unk82E4[i].unk14 = 0;
+ gUnknown_203F3D4->unk8B[i] = 9;
+ }
+}
+
+static s16 GetPokemonJumpSpeciesIdx(u16 species)
+{
+ u32 i;
+ for (i = 0; i < NELEMS(sPkmnJumpSpecies); i++)
+ {
+ if (sPkmnJumpSpecies[i].species == species)
+ return i;
+ }
+
+ return -1; // species isnt allowed
+}
+
+static void sub_8147D2C(struct PokemonJump1_MonInfo *monInfo, struct Pokemon *mon)
+{
+ monInfo->species = GetMonData(mon, MON_DATA_SPECIES);
+ monInfo->otId = GetMonData(mon, MON_DATA_OT_ID);
+ monInfo->personality = GetMonData(mon, MON_DATA_PERSONALITY);
+}
+
+static void sub_8147D58(void)
+{
+ TransferPlttBuffer();
+ LoadOam();
+ ProcessSpriteCopyRequests();
+}
+
+static void sub_8147D6C(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void sub_8147D84(TaskFunc func)
+{
+ gUnknown_203F3D4->unk4 = CreateTask(func, 1);
+ gUnknown_203F3D4->unk8 = 0;
+}
+
+static void sub_8147DA0(u8 taskId)
+{
+ switch (gUnknown_203F3D4->unk8)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ sub_8148F5C(sub_8148E80, 5);
+ FadeOutMapMusic(4);
+ gUnknown_203F3D4->unk8++;
+ break;
+ case 1:
+ if (!FuncIsActiveTask(sub_8148E80))
+ {
+ sub_8149CEC(&gUnknown_203F3D4->unkA4);
+ LoadWirelessStatusIndicatorSpriteGfx();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ gUnknown_203F3D4->unk8++;
+ }
+ break;
+ case 2:
+ if (!sub_8149D68() && IsNotWaitingForBGMStop() == TRUE)
+ {
+ FadeOutAndPlayNewMapMusic(MUS_JUMP, 8);
+ gUnknown_203F3D4->unk8++;
+ }
+ break;
+ case 3:
+ if (IsLinkTaskFinished())
+ {
+ BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK);
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ SetVBlankCallback(sub_8147D58);
+ gUnknown_203F3D4->unk8++;
+ }
+ break;
+ case 4:
+ UpdatePaletteFade();
+ if (!gPaletteFade.active)
+ {
+ gUnknown_203F3D4->unk7 = 0;
+ gUnknown_203F3D4->unk8++;
+ }
+ break;
+ case 5:
+ gUnknown_203F3D4->unk7++;
+ if (gUnknown_203F3D4->unk7 >= 20)
+ {
+ if (gUnknown_203F3D4->isLeader)
+ sub_8147D84(sub_814807C);
+ else
+ sub_8147D84(sub_8148290);
+
+ sub_8148F7C();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void sub_8147F10(int arg0)
+{
+ if (arg0 == 0)
+ {
+ gUnknown_203F3D4->unk30 = 0x1111;
+ gUnknown_203F3D4->unk2C = 1;
+ }
+ else
+ {
+ gUnknown_203F3D4->unk30 = (1 << (arg0 - 1)) - 1;
+ gUnknown_203F3D4->unk2C = 0;
+ }
+}
+
+static void sub_8147F4C(u8 arg0)
+{
+ int i;
+
+ gUnknown_203F3D4->unk70.unk0 = arg0;
+ gUnknown_203F3D4->unk8 = 0;
+ gUnknown_203F3D4->unkA = 0;
+ gUnknown_203F3D4->unk48 = 1;
+ gUnknown_203F3D4->unk49 = 0;
+ for (i = 1; i < gUnknown_203F3D4->unk5; i++)
+ gUnknown_203F3D4->unk82E4[i].unk18 = 0;
+}
+
+static void sub_8147FA0(void)
+{
+ int i;
+ int count;
+ u16 var0;
+ u8 var1;
+ u16 var2;
+
+ for (i = 1, count = 0; i < gUnknown_203F3D4->unk5; i++)
+ {
+ var0 = gUnknown_203F3D4->unk82E4[i].unk10;
+ if (sub_8149C24(&gUnknown_203F3D4->unk82E4[i], i, &var1, &var2))
+ {
+ gUnknown_203F3D4->unk90[i] = var2;
+ gUnknown_203F3D4->unk8B[i] = var1;
+ gUnknown_203F3D4->unk82E4[i].unk12 = var0;
+ }
+
+ if (gUnknown_203F3D4->unk82E4[i].unk18 && gUnknown_203F3D4->unk8B[i] == gUnknown_203F3D4->unk70.unk0)
+ count++;
+ }
+
+ if (count == gUnknown_203F3D4->unk5 - 1)
+ gUnknown_203F3D4->unk49 = 1;
+}
+
+static bool32 (* const gUnknown_846B64C[])(void) =
+{
+ sub_8148344,
+ sub_81483D0,
+ sub_8148464,
+ sub_81484D0,
+ sub_81485C8,
+ sub_81486C4,
+ sub_8148760,
+ sub_81487B4,
+ sub_814881C,
+};
+
+static void sub_814807C(u8 taskId)
+{
+ sub_8147FA0();
+ sub_8149534();
+ if (!gUnknown_203F3D4->unk48 && gUnknown_203F3D4->unk49)
+ {
+ sub_8147F4C(gUnknown_203F3D4->unk4C);
+ sub_8147F10(3);
+ }
+
+ if (gUnknown_203F3D4->unk48 == 1)
+ {
+ if (!gUnknown_846B64C[gUnknown_203F3D4->unk70.unk0]())
+ {
+ gUnknown_203F3D4->unk48 = 0;
+ gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6].unk18 = 1;
+ }
+ }
+
+ sub_81492D8();
+ sub_8148104();
+}
+
+static void sub_8148104(void)
+{
+ if (!gUnknown_203F3D4->unk2C)
+ sub_8149AF8(gUnknown_203F3D4->unk82E4, &gUnknown_203F3D4->unk70);
+
+ if (gUnknown_203F3D4->unk30 != 0x1111)
+ {
+ gUnknown_203F3D4->unk2C++;
+ gUnknown_203F3D4->unk2C &= gUnknown_203F3D4->unk30;
+ }
+}
+
+static void sub_8148140(u8 arg0)
+{
+ gUnknown_203F3D4->unk70.unk0 = arg0;
+ gUnknown_203F3D4->unk8 = 0;
+ gUnknown_203F3D4->unkA = 0;
+ gUnknown_203F3D4->unk48 = 1;
+ gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6].unk18 = 0;
+}
+
+static void sub_8148174(void)
+{
+ int i;
+ u16 var0;
+ struct PokemonJump1Sub sp0;
+
+ var0 = gUnknown_203F3D4->unk82E4[0].unk10;
+ if (sub_8149B7C(gUnknown_203F3D4->unk82E4, &sp0))
+ {
+ if (gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6].unk18 == 1
+ && sp0.unk0 != gUnknown_203F3D4->unk70.unk0)
+ {
+ sub_8148140(sp0.unk0);
+ }
+
+ if (gUnknown_203F3D4->unk70.unk8 != sp0.unk8)
+ {
+ gUnknown_203F3D4->unk70.unk8 = sp0.unk8;
+ gUnknown_203F3D4->unk5C = 1;
+ gUnknown_203F3D4->unk70.unk1 = sp0.unk1;
+ if (gUnknown_203F3D4->unk70.unk1)
+ gUnknown_203F3D4->unk4D = 1;
+ else
+ gUnknown_203F3D4->unk4D = 0;
+ }
+
+ gUnknown_203F3D4->unk70.unk2 = sp0.unk2;
+ gUnknown_203F3D4->unk70.unk4 = sp0.unk4;
+ gUnknown_203F3D4->unk82E4[0].unk12 = var0;
+ }
+
+ for (i = 1; i < gUnknown_203F3D4->unk5; i++)
+ {
+ if (i != gUnknown_203F3D4->unk6)
+ {
+ var0 = gUnknown_203F3D4->unk82E4[i].unk10;
+ if (sub_8149C90(&gUnknown_203F3D4->unk82E4[i], i))
+ gUnknown_203F3D4->unk82E4[i].unk12 = var0;
+ }
+ }
+}
+
+static bool32 (* const gUnknown_846B670[])(void) =
+{
+ sub_8148398,
+ sub_8148418,
+ sub_81484B0,
+ sub_814856C,
+ sub_8148664,
+ sub_8148724,
+ sub_8148760,
+ sub_8148800,
+ sub_814881C,
+};
+
+static void sub_8148290(u8 taskId)
+{
+ sub_8148174();
+ if (gUnknown_203F3D4->unk48)
+ {
+ if (!gUnknown_846B670[gUnknown_203F3D4->unk70.unk0]())
+ {
+ gUnknown_203F3D4->unk48 = 0;
+ gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6].unk18 = 1;
+ sub_8147F10(3);
+ }
+ }
+
+ sub_81492D8();
+ sub_81482F8();
+}
+
+static void sub_81482F8(void)
+{
+ if (!gUnknown_203F3D4->unk2C)
+ sub_8149BF4(&gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6], gUnknown_203F3D4->unk70.unk0, gUnknown_203F3D4->unk42);
+
+ if (gUnknown_203F3D4->unk30 != 0x1111)
+ {
+ gUnknown_203F3D4->unk2C++;
+ gUnknown_203F3D4->unk2C &= gUnknown_203F3D4->unk30;
+ }
+}
+
+static bool32 sub_8148344(void)
+{
+ switch (gUnknown_203F3D4->unk8)
+ {
+ case 0:
+ sub_8147F10(3);
+ gUnknown_203F3D4->unk8++;
+ // fall through
+ case 1:
+ if (!sub_81488DC())
+ {
+ gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unk4A;
+ gUnknown_203F3D4->unk4C = 1;
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_8148398(void)
+{
+ switch (gUnknown_203F3D4->unk8)
+ {
+ case 0:
+ sub_8147F10(0);
+ gUnknown_203F3D4->unk24 = gUnknown_203F3D4->unk70.unk2;
+ gUnknown_203F3D4->unk8++;
+ // fall through
+ case 1:
+ return sub_81488DC();
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_81483D0(void)
+{
+ switch (gUnknown_203F3D4->unk8)
+ {
+ case 0:
+ sub_81491E4();
+ sub_8147F10(5);
+ gUnknown_203F3D4->unk8++;
+ break;
+ case 1:
+ if (gUnknown_203F3D4->unk49)
+ {
+ gUnknown_203F3D4->unk4C = 2;
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_8148418(void)
+{
+ switch (gUnknown_203F3D4->unk8)
+ {
+ case 0:
+ sub_81491E4();
+ sub_8147F10(0);
+ gUnknown_203F3D4->unk4A = gUnknown_203F3D4->unk70.unk2;
+ gUnknown_203F3D4->unk8++;
+ // fall through
+ case 1:
+ if (sub_8149804())
+ return FALSE;
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_8148464(void)
+{
+ if (!sub_81489C8())
+ {
+ gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unk4A;
+ gUnknown_203F3D4->unk4C = 1;
+ }
+ else if (sub_8149630())
+ {
+ return TRUE;
+ }
+ else
+ {
+ sub_81491B4();
+ gUnknown_203F3D4->unk4C = 3;
+ }
+
+ return FALSE;
+}
+
+static bool32 sub_81484B0(void)
+{
+ if (!sub_81489C8())
+ ;
+ else if (sub_8149630())
+ return TRUE;
+ else
+ sub_81491B4();
+
+ return FALSE;
+}
+
+static bool32 sub_81484D0(void)
+{
+ switch (gUnknown_203F3D4->unk8)
+ {
+ case 0:
+ sub_8149630();
+ if (sub_81496D4())
+ gUnknown_203F3D4->unk8++;
+ break;
+ case 1:
+ if (!sub_8148A60())
+ {
+ if (sub_81498B4())
+ {
+ gUnknown_203F3D4->unk70.unk2 = sub_81498D8();
+ gUnknown_203F3D4->unk4C = 7;
+ }
+ else if (gUnknown_203F3D4->unk70.unk4 >= 200)
+ {
+ gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unkE;
+ gUnknown_203F3D4->unk4C = 8;
+ }
+ else
+ {
+ gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unkE;
+ gUnknown_203F3D4->unk4C = 4;
+ }
+
+ gUnknown_203F3D4->unk8++;
+ return FALSE;
+ }
+ break;
+ case 2:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_814856C(void)
+{
+ switch (gUnknown_203F3D4->unk8)
+ {
+ case 0:
+ if (!sub_8149630())
+ sub_81491B4();
+ if (sub_81496D4())
+ gUnknown_203F3D4->unk8++;
+ break;
+ case 1:
+ if (!sub_8148A60())
+ {
+ gUnknown_203F3D4->unk8++;
+ return FALSE;
+ }
+ break;
+ case 2:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_81485C8(void)
+{
+ switch (gUnknown_203F3D4->unk8)
+ {
+ case 0:
+ sub_8147F10(4);
+ gUnknown_203F3D4->unk8++;
+ // fall through
+ case 1:
+ if (!sub_8148C80())
+ {
+ sub_814B494(gUnknown_203F3D4->unk70.unk8, gUnknown_203F3D4->unk70.unk4, gUnknown_203F3D4->unk70.unk2);
+ gUnknown_203F3D4->unk8++;
+ }
+ break;
+ case 2:
+ if (gUnknown_203F3D4->unk49)
+ {
+ if (sub_8149748())
+ gUnknown_203F3D4->unk4C = 5;
+ else
+ gUnknown_203F3D4->unk4C = 6;
+
+ gUnknown_203F3D4->unk8++;
+ return FALSE;
+ }
+ break;
+ case 3:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_8148664(void)
+{
+ switch (gUnknown_203F3D4->unk8)
+ {
+ case 0:
+ sub_8147F10(0);
+ gUnknown_203F3D4->unk8++;
+ // fall through
+ case 1:
+ if (!sub_8148C80())
+ {
+ sub_814B494(gUnknown_203F3D4->unk70.unk8, gUnknown_203F3D4->unk70.unk4, gUnknown_203F3D4->unk70.unk2);
+ gUnknown_203F3D4->unk42 = gUnknown_203F3D4->unk45;
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_81486C4(void)
+{
+ switch (gUnknown_203F3D4->unk8)
+ {
+ case 0:
+ if (!sub_8148E2C())
+ gUnknown_203F3D4->unk8++;
+ break;
+ case 1:
+ if (gUnknown_203F3D4->unk49)
+ {
+ sub_8147B94(gUnknown_203F3D4);
+ gUnknown_203F3D4->unk24 = Random();
+ gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unk24;
+ gUnknown_203F3D4->unk4C = 0;
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_8148724(void)
+{
+ switch (gUnknown_203F3D4->unk8)
+ {
+ case 0:
+ if (!sub_8148E2C())
+ {
+ sub_8147B94(gUnknown_203F3D4);
+ gUnknown_203F3D4->unk8++;
+ return FALSE;
+ }
+ break;
+ case 1:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_8148760(void)
+{
+ switch (gUnknown_203F3D4->unk8)
+ {
+ case 0:
+ gUnknown_203F3D4->unk8 = 1;
+ break;
+ case 1:
+ sub_8147F10(0);
+ gUnknown_203F3D4->unk8++;
+ break;
+ case 2:
+ if (!sub_8148D5C())
+ {
+ SetMainCallback2(gUnknown_203F3D4->returnCallback);
+ sub_8147B48();
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_81487B4(void)
+{
+ switch (gUnknown_203F3D4->unk8)
+ {
+ case 0:
+ sub_8147F10(4);
+ gUnknown_203F3D4->unk8++;
+ break;
+ case 1:
+ if (!sub_8148B54())
+ {
+ gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unkE;
+ gUnknown_203F3D4->unk4C = 8;
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_8148800(void)
+{
+ sub_8147F10(0);
+ if (!sub_8148B54())
+ return FALSE;
+ else
+ return TRUE;
+}
+
+static bool32 sub_814881C(void)
+{
+ switch (gUnknown_203F3D4->unk8)
+ {
+ case 0:
+ sub_814B494(gUnknown_203F3D4->unk70.unk8, gUnknown_203F3D4->unk70.unk4, gUnknown_203F3D4->unk70.unk2);
+ sub_8149D40(5);
+ gUnknown_203F3D4->unk8++;
+ break;
+ case 1:
+ if (!sub_8149D68())
+ {
+ sub_8147F10(0);
+ gUnknown_203F3D4->unk8++;
+ }
+ break;
+ case 2:
+ if (sub_8149804())
+ {
+ CreateTask(sub_80DA634, 6);
+ gUnknown_203F3D4->unk8++;
+ }
+ break;
+ case 3:
+ if (!FuncIsActiveTask(sub_80DA634))
+ {
+ sub_814A6CC();
+ gUnknown_203F3D4->unk8++;
+ }
+ break;
+ case 4:
+ if (!sub_814A6FC())
+ {
+ gUnknown_203F3D4->unk4C = 4;
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_81488DC(void)
+{
+ switch (gUnknown_203F3D4->unkA)
+ {
+ case 0:
+ sub_8149D40(2);
+ sub_814AAA0();
+ gUnknown_203F3D4->unkA++;
+ break;
+ case 1:
+ if (!sub_8149D68())
+ {
+ sub_814AAB4(gUnknown_203F3D4->unk6);
+ gUnknown_203F3D4->unk3C = 0;
+ gUnknown_203F3D4->unkA++;
+ }
+ break;
+ case 2:
+ if (++gUnknown_203F3D4->unk3C > 120)
+ {
+ sub_8149D40(3);
+ gUnknown_203F3D4->unkA++;
+ }
+ break;
+ case 3:
+ if (sub_8149D68() != 1 && sub_814AAC8() != 1)
+ gUnknown_203F3D4->unkA++;
+ break;
+ case 4:
+ sub_8149D40(9);
+ gUnknown_203F3D4->unkA++;
+ break;
+ case 5:
+ if (!sub_8149D68())
+ {
+ sub_814935C();
+ sub_814A3E4();
+ gUnknown_203F3D4->unkA++;
+ }
+ break;
+ case 6:
+ if (!sub_814A408())
+ {
+ sub_814936C();
+ sub_8148F9C();
+ gUnknown_203F3D4->unkA++;
+ return FALSE;
+ }
+ break;
+ case 7:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_81489C8(void)
+{
+ sub_8148FE0();
+ if (gUnknown_203F3D4->unk36)
+ {
+ gUnknown_203F3D4->unk36 = 0;
+ return FALSE;
+ }
+
+ switch (gUnknown_203F3D4->unkA)
+ {
+ case 0:
+ if (sub_814922C(0))
+ gUnknown_203F3D4->unkA++;
+ else
+ break;
+ // fall through
+ case 1:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ sub_8149260();
+ sub_8147F10(3);
+ gUnknown_203F3D4->unkA++;
+ }
+ break;
+ case 2:
+ if (sub_814922C(1) == TRUE)
+ gUnknown_203F3D4->unkA++;
+ break;
+ case 3:
+ if (sub_814922C(0) == TRUE)
+ gUnknown_203F3D4->unkA = 0;
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_8148A60(void)
+{
+ int i;
+
+ switch (gUnknown_203F3D4->unkA)
+ {
+ case 0:
+ for (i = 0; i < gUnknown_203F3D4->unk5; i++)
+ {
+ if (sub_814AA78(i) == 1)
+ return TRUE;
+ }
+
+ gUnknown_203F3D4->unkA++;
+ break;
+ case 1:
+ for (i = 0; i < gUnknown_203F3D4->unk5; i++)
+ {
+ if (gUnknown_203F3D4->unk82E4[i].unk10 == 2)
+ sub_814AA60(i);
+ }
+
+ sub_8149D40(1);
+ gUnknown_203F3D4->unk3C = 0;
+ gUnknown_203F3D4->unkA++;
+ break;
+ case 2:
+ if (++gUnknown_203F3D4->unk3C > 100)
+ {
+ sub_8149D40(3);
+ gUnknown_203F3D4->unk3C = 0;
+ gUnknown_203F3D4->unkA++;
+ }
+ break;
+ case 3:
+ if (!sub_8149D68())
+ {
+ sub_814AA8C();
+ gUnknown_203F3D4->unk70.unk1 = 0;
+ sub_8149210();
+ gUnknown_203F3D4->unkA++;
+ return FALSE;
+ }
+ break;
+ case 4:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_8148B54(void)
+{
+ switch (gUnknown_203F3D4->unkA)
+ {
+ case 0:
+ sub_8149900(gUnknown_203F3D4->unk70.unk2, &gUnknown_203F3D4->unk3E, &gUnknown_203F3D4->unk40);
+ sub_814A468(gUnknown_203F3D4->unk3E, gUnknown_203F3D4->unk40);
+ gUnknown_203F3D4->unkA++;
+ break;
+ case 1:
+ case 4:
+ if (!sub_814A62C())
+ {
+ gUnknown_203F3D4->unk3C = 0;
+ gUnknown_203F3D4->unkA++;
+ }
+ break;
+ case 2:
+ case 5:
+ gUnknown_203F3D4->unk3C++;
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON) || gUnknown_203F3D4->unk3C > 180)
+ {
+ sub_814A6CC();
+ gUnknown_203F3D4->unkA++;
+ }
+ break;
+ case 3:
+ if (!sub_814A6FC())
+ {
+ gUnknown_203F3D4->unk40 = sub_8149978(gUnknown_203F3D4->unk3E, gUnknown_203F3D4->unk40);
+ if (gUnknown_203F3D4->unk40 && AddBagItem(gUnknown_203F3D4->unk3E, gUnknown_203F3D4->unk40))
+ {
+ if (!CheckBagHasSpace(gUnknown_203F3D4->unk3E, 1))
+ {
+ sub_814A53C(gUnknown_203F3D4->unk3E);
+ gUnknown_203F3D4->unkA = 4;
+ }
+ else
+ {
+ gUnknown_203F3D4->unkA = 6;
+ break;
+ }
+ }
+ else
+ {
+ sub_814A5B4(gUnknown_203F3D4->unk3E);
+ gUnknown_203F3D4->unkA = 4;
+ }
+ }
+ break;
+ case 6:
+ if (!sub_814A6FC())
+ return FALSE;
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_8148C80(void)
+{
+ s8 input;
+
+ switch (gUnknown_203F3D4->unkA)
+ {
+ case 0:
+ sub_8149D40(4);
+ gUnknown_203F3D4->unkA++;
+ break;
+ case 1:
+ if (!sub_8149D68())
+ gUnknown_203F3D4->unkA++;
+ break;
+ case 2:
+ input = sub_814A744();
+ switch (input)
+ {
+ case MENU_B_PRESSED:
+ case 1:
+ gUnknown_203F3D4->unk45 = 1;
+ sub_8149D40(6);
+ gUnknown_203F3D4->unkA++;
+ break;
+ case 0:
+ gUnknown_203F3D4->unk45 = 2;
+ sub_8149D40(6);
+ gUnknown_203F3D4->unkA++;
+ break;
+ }
+ break;
+ case 3:
+ if (!sub_8149D68())
+ gUnknown_203F3D4->unkA++;
+ break;
+ case 4:
+ sub_8149D40(8);
+ gUnknown_203F3D4->unkA++;
+ break;
+ case 5:
+ if (!sub_8149D68())
+ {
+ gUnknown_203F3D4->unkA++;
+ return FALSE;
+ }
+ break;
+ case 6:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_8148D5C(void)
+{
+ int var0;
+
+ switch (gUnknown_203F3D4->unkA)
+ {
+ case 0:
+ sub_814A6CC();
+ gUnknown_203F3D4->unkA++;
+ break;
+ case 1:
+ if (!sub_814A6FC())
+ {
+ sub_8149D40(7);
+ gUnknown_203F3D4->unkA++;
+ }
+ break;
+ case 2:
+ var0 = sub_8149D68();
+ if (!var0)
+ {
+ gUnknown_203F3D4->unk3C = var0;
+ gUnknown_203F3D4->unkA++;
+ }
+ break;
+ case 3:
+ if (++gUnknown_203F3D4->unk3C > 120)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK);
+ gUnknown_203F3D4->unkA++;
+ }
+ break;
+ case 4:
+ if (!gPaletteFade.active)
+ {
+ Link_TryStartSend5FFF();
+ gUnknown_203F3D4->unkA++;
+ }
+ break;
+ case 5:
+ if (!gReceivedRemoteLinkPlayers)
+ return FALSE;
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_8148E2C(void)
+{
+ switch (gUnknown_203F3D4->unkA)
+ {
+ case 0:
+ sub_814A6CC();
+ sub_814AA24(0);
+ gUnknown_203F3D4->unkA++;
+ break;
+ case 1:
+ if (!sub_814A6FC())
+ {
+ gUnknown_203F3D4->unkA++;
+ return FALSE;
+ }
+ break;
+ case 2:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void sub_8148E80(u8 taskId)
+{
+ int i;
+ s16 *taskData = gTasks[taskId].data;
+ struct PokemonJump1 *ptr = (struct PokemonJump1 *)GetWordTaskArg(taskId, 14);
+
+ switch (taskData[0])
+ {
+ case 0:
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
+ taskData[i + 2] = 0;
+
+ taskData[0]++;
+ // fall through
+ case 1:
+ sub_8149A6C(&ptr->unk82A8[ptr->unk6]);
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
+ {
+ if (!taskData[i + 2] && sub_8149A90(i, &ptr->unk82A8[i]))
+ {
+ StringCopy(ptr->unk82E4[i].unk1C, gLinkPlayers[i].name);
+ taskData[i + 2] = 1;
+ taskData[1]++;
+ if (taskData[1] == ptr->unk5)
+ {
+ sub_8147C20();
+ DestroyTask(taskId);
+ break;
+ }
+ }
+ }
+ break;
+ }
+}
+
+static void sub_8148F5C(TaskFunc func, u8 taskPriority)
+{
+ u8 taskId = CreateTask(func, taskPriority);
+ SetWordTaskArg(taskId, 14, (uintptr_t)gUnknown_203F3D4);
+}
+
+static void sub_8148F7C(void)
+{
+ gUnknown_203F3D4->unk4A = 0;
+ gUnknown_203F3D4->unk14 = 6;
+ gUnknown_203F3D4->unk34 = 0;
+ gUnknown_203F3D4->unk1C = 0;
+ gUnknown_203F3D4->unk36 = 0;
+ gUnknown_203F3D4->unk10 = 0;
+}
+
+static void sub_8148F9C(void)
+{
+ gUnknown_203F3D4->unk4A = 0;
+ gUnknown_203F3D4->unk34 = 0x6FF;
+ gUnknown_203F3D4->unk14 = 7;
+ gUnknown_203F3D4->unk36 = 0;
+ gUnknown_203F3D4->unk10 = 0;
+ gUnknown_203F3D4->unk51 = 0;
+ gUnknown_203F3D4->unk50 = 0;
+ gUnknown_203F3D4->unk20 = 0;
+ gUnknown_203F3D4->unk4E = 0;
+ gUnknown_203F3D4->unk6C = 0;
+ sub_8149078();
+}
+
+static void sub_8148FE0(void)
+{
+ if (gUnknown_203F3D4->unk46)
+ {
+ gUnknown_203F3D4->unk4A++;
+ gUnknown_203F3D4->unk34 += sub_8149044();
+ if (gUnknown_203F3D4->unk34 >= 0x9FF)
+ gUnknown_203F3D4->unk34 -= 0x9FF;
+
+ gUnknown_203F3D4->unk18 = gUnknown_203F3D4->unk14;
+ gUnknown_203F3D4->unk14 = gUnknown_203F3D4->unk34 >> 8;
+ if (gUnknown_203F3D4->unk14 > 6 && gUnknown_203F3D4->unk18 < 7)
+ {
+ gUnknown_203F3D4->unk36++;
+ sub_8149078();
+ }
+ }
+}
+
+static int sub_8149044(void)
+{
+ int result;
+
+ if (gUnknown_203F3D4->unk10)
+ return 0;
+
+ result = gUnknown_203F3D4->unk1C;
+ if (gUnknown_203F3D4->unk34 <= 0x5FF)
+ {
+ gUnknown_203F3D4->unk20 += 80;
+ result += gUnknown_203F3D4->unk20 >> 8;
+ }
+
+ return result;
+}
+
+static const u16 gUnknown_846B694[] = {0x1a, 0x1f, 0x24, 0x29, 0x2e, 0x33, 0x38, 0x3d};
+static const u16 gUnknown_846B6A4[] = {0, 1, 1, 2};
+
+static void sub_8149078(void)
+{
+ int var0;
+
+ gUnknown_203F3D4->unk20 = 0;
+ if (gUnknown_203F3D4->unk4E)
+ {
+ gUnknown_203F3D4->unk4E--;
+ if (gUnknown_203F3D4->unk6C)
+ {
+ if (sub_8149194() % 4 != 0)
+ {
+ gUnknown_203F3D4->unk1C = gUnknown_203F3D4->unk28;
+ }
+ else
+ {
+ if (gUnknown_203F3D4->unk28 > 54)
+ gUnknown_203F3D4->unk1C = 30;
+ else
+ gUnknown_203F3D4->unk1C = 82;
+ }
+ }
+ }
+ else
+ {
+ if (!(gUnknown_203F3D4->unk50 & 8))
+ {
+ gUnknown_203F3D4->unk28 = gUnknown_846B694[gUnknown_203F3D4->unk50] + (gUnknown_203F3D4->unk51 * 7);
+ gUnknown_203F3D4->unk4E = gUnknown_846B6A4[sub_8149194() % NELEMS(gUnknown_846B6A4)] + 2;
+ gUnknown_203F3D4->unk50++;
+ }
+ else
+ {
+ if (gUnknown_203F3D4->unk50 == 8)
+ {
+ if (gUnknown_203F3D4->unk51 < 3)
+ gUnknown_203F3D4->unk51++;
+ else
+ gUnknown_203F3D4->unk6C = 1;
+ }
+
+ var0 = gUnknown_846B694[15 - gUnknown_203F3D4->unk50];
+ gUnknown_203F3D4->unk28 = var0 + (gUnknown_203F3D4->unk51 * 7);
+ if (++gUnknown_203F3D4->unk50 > 15)
+ {
+ if (sub_8149194() % 4 == 0)
+ gUnknown_203F3D4->unk28 -= 5;
+
+ gUnknown_203F3D4->unk50 = 0;
+ }
+ }
+
+ gUnknown_203F3D4->unk1C = gUnknown_203F3D4->unk28;
+ }
+}
+
+static int sub_8149194(void)
+{
+ // The number 1103515245 comes from the example implementation of rand and srand
+ gUnknown_203F3D4->unk24 = gUnknown_203F3D4->unk24 * 1103515245 + 24691;
+ return gUnknown_203F3D4->unk24 >> 16;
+}
+
+static void sub_81491B4(void)
+{
+ gUnknown_203F3D4->unk10 = 1;
+ gUnknown_203F3D4->unk14 = 6;
+ gUnknown_203F3D4->unk34 = 0x5FF;
+ sub_814936C();
+}
+
+static int sub_81491D8(void)
+{
+ return gUnknown_203F3D4->unk10;
+}
+
+static void sub_81491E4(void)
+{
+ int i;
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
+ gUnknown_203F3D4->unk82E4[i].unk14 = 0;
+}
+
+static void sub_8149210(void)
+{
+ gUnknown_203F3D4->unk83AC->unk10 = 0;
+ gUnknown_203F3D4->unk83AC->unk12 = 0;
+}
+
+static bool32 sub_814922C(u16 arg0)
+{
+ if (gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6].unk10 == arg0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void sub_8149260(void)
+{
+ gUnknown_203F3D4->unk83AC->unkE = gUnknown_203F3D4->unk4A;
+ gUnknown_203F3D4->unk83AC->unk12 = gUnknown_203F3D4->unk83AC->unk10;
+ gUnknown_203F3D4->unk83AC->unk10 = 1;
+}
+
+static void sub_8149288(void)
+{
+ gUnknown_203F3D4->unk83AC->unk12 = gUnknown_203F3D4->unk83AC->unk10;
+ gUnknown_203F3D4->unk83AC->unk10 = 2;
+ gUnknown_203F3D4->unk83AC->unkE = gUnknown_203F3D4->unk4A;
+ gUnknown_203F3D4->unk83AC->unk14 = 2;
+}
+
+static void sub_81492B8(void)
+{
+ gUnknown_203F3D4->unk83AC->unk12 = gUnknown_203F3D4->unk83AC->unk10;
+ gUnknown_203F3D4->unk83AC->unk10 = 0;
+}
+
+static const u16 gUnknown_846B6AC[] = {SE_REGI, SE_REAPOKE, SE_W234, SE_EXCELLENT};
+
+static void sub_81492D8(void)
+{
+ if (gUnknown_203F3D4->unk5C)
+ {
+ sub_814AA24(gUnknown_203F3D4->unk70.unk8);
+ gUnknown_203F3D4->unk5C = 0;
+ if (gUnknown_203F3D4->unk4D)
+ {
+ int index = sub_814A98C(gUnknown_203F3D4->unk70.unk1);
+ PlaySE(gUnknown_846B6AC[index - 2]);
+ gUnknown_203F3D4->unk4D = 0;
+ }
+ }
+
+ sub_814AA34(gUnknown_203F3D4->unk70.unk4);
+ sub_814937C();
+ sub_814933C();
+}
+
+static void sub_814933C(void)
+{
+ if (gUnknown_203F3D4->unk46)
+ sub_814A95C(gUnknown_203F3D4->unk14);
+}
+
+static void sub_814935C(void)
+{
+ gUnknown_203F3D4->unk46 = 0;
+}
+
+static void sub_814936C(void)
+{
+ gUnknown_203F3D4->unk46 = 1;
+}
+
+static void sub_814937C(void)
+{
+ int i;
+ int whichSound = 0;
+ int numLinkPlayers = gUnknown_203F3D4->unk5;
+
+ for (i = 0; i < numLinkPlayers; i++)
+ {
+ switch (gUnknown_203F3D4->unk82E4[i].unk10)
+ {
+ case 0:
+ sub_814A940(i, 0);
+ break;
+ case 1:
+ if (gUnknown_203F3D4->unk82E4[i].unk12 != 1 || gUnknown_203F3D4->unk82E4[i].unkE != gUnknown_203F3D4->unk9A[i])
+ {
+ if (i == gUnknown_203F3D4->unk6)
+ gUnknown_203F3D4->unk82E4[i].unk12 = 1;
+
+ whichSound |= 0x1;
+ gUnknown_203F3D4->unk82E4[i].unk4 = 0x7FFFFFFF;
+ gUnknown_203F3D4->unk9A[i] = gUnknown_203F3D4->unk82E4[i].unkE;
+ }
+
+ sub_8149490(i);
+ break;
+ case 2:
+ if (gUnknown_203F3D4->unk82E4[i].unk12 != 2)
+ {
+ if (i == gUnknown_203F3D4->unk6)
+ gUnknown_203F3D4->unk82E4[i].unk12 = 2;
+
+ whichSound |= 0x2;
+ sub_814AA48(i);
+ }
+ break;
+ }
+ }
+
+ if (whichSound & 0x2)
+ PlaySE(SE_NAWAMISS);
+ else if (whichSound & 0x1)
+ PlaySE(SE_DANSA);
+}
+
+static const s8 gUnknown_846B6B4[][48] =
+{
+ {-3, -6, -8, -10, -13, -15, -17, -19, -21, -23, -25, -27, -28, -29, -30, -30, -30, -28, -27,
+ -26, -25, -23, -22, -20, -18, -17, -15, -13, -11, -8, -6, -4, -1},
+
+ {-3, -6, -9, -11, -14, -16, -18, -20, -22, -24, -26, -28, -29, -30, -30, -28, -26, -24, -22,
+ -20, -18, -16, -14, -11, -9, -6, -4, -1},
+
+ {-3, -6, -9, -11, -13, -15, -17, -19, -21, -23, -25, -27, -28, -29, -30, -30, -30, -30, -29,
+ -29, -28, -28, -27, -27, -26, -25, -24, -22, -20, -18, -16, -14,
+ -12, -11, -9, -6, -4, -1},
+};
+
+static void sub_8149490(int multiplayerId)
+{
+ int var0;
+ int var1;
+ struct PokemonJump1_82E4 *player;
+
+ if (gUnknown_203F3D4->unk68)
+ return;
+
+ player = &gUnknown_203F3D4->unk82E4[multiplayerId];
+ if (player->unk4 != 0x7FFFFFFF)
+ {
+ player->unk4++;
+ var0 = player->unk4;
+ }
+ else
+ {
+ var0 = gUnknown_203F3D4->unk4A - player->unkE;
+ if (var0 >= 65000)
+ {
+ var0 -= 65000;
+ var0 += gUnknown_203F3D4->unk4A;
+ }
+
+ player->unk4 = var0;
+ }
+
+ if (var0 < 4)
+ return;
+
+ var0 -= 4;
+ if (var0 < 48)
+ var1 = gUnknown_846B6B4[player->unkC][var0];
+ else
+ var1 = 0;
+
+ sub_814A940(multiplayerId, var1);
+ if (!var1 && multiplayerId == gUnknown_203F3D4->unk6)
+ sub_81492B8();
+
+ player->unk0 = var1;
+}
+
+static void sub_8149534(void)
+{
+ if (gUnknown_203F3D4->unk14 == 8 && gUnknown_203F3D4->unk18 == 7)
+ {
+ if (gUnknown_203F3D4->unk58 == 0)
+ {
+ sub_8149878();
+ gUnknown_203F3D4->unk54 = 0;
+ gUnknown_203F3D4->unk58 = 1;
+ gUnknown_203F3D4->unk70.unk1 = 0;
+ }
+ else
+ {
+ if (gUnknown_203F3D4->unk54 == 5)
+ {
+ gUnknown_203F3D4->unkC++;
+ sub_8149898(gUnknown_203F3D4->unkC);
+ }
+ else
+ {
+ gUnknown_203F3D4->unkC = 0;
+ }
+
+ if (gUnknown_203F3D4->unk54 > 1)
+ {
+ gUnknown_203F3D4->unk64 = 1;
+ memcpy(gUnknown_203F3D4->unk86, gUnknown_203F3D4->unk81, sizeof(u8) * MAX_RFU_PLAYERS);
+ }
+
+ sub_8149878();
+ gUnknown_203F3D4->unk54 = 0;
+ gUnknown_203F3D4->unk58 = 1;
+ gUnknown_203F3D4->unk70.unk1 = 0;
+ if (gUnknown_203F3D4->unk70.unk4 < 9999)
+ gUnknown_203F3D4->unk70.unk4++;
+
+ sub_8149780(10);
+ sub_8147F10(3);
+ }
+ }
+
+ if (gUnknown_203F3D4->unk64 && (sub_8149710() == TRUE || !gUnknown_203F3D4->unk14))
+ {
+ int var0 = sub_8149834(gUnknown_203F3D4->unk86);
+ sub_8149780(sub_8149888(var0));
+ sub_8147F10(3);
+ gUnknown_203F3D4->unk64 = 0;
+ }
+
+ if (gUnknown_203F3D4->unk58)
+ {
+ int var1 = sub_81497A8();
+ if (var1 > gUnknown_203F3D4->unk54)
+ {
+ gUnknown_203F3D4->unk54 = var1;
+ memcpy(gUnknown_203F3D4->unk81, gUnknown_203F3D4->unk7C, sizeof(u8) * MAX_RFU_PLAYERS);
+ }
+ }
+}
+
+static bool32 sub_8149630(void)
+{
+ int i;
+
+ if (gUnknown_203F3D4->unk14 == 6 && !gUnknown_203F3D4->unk83AC->unk0)
+ {
+ if (gUnknown_203F3D4->unk83AC->unk12 == 1 && sub_81491D8() == 1)
+ {
+ gUnknown_203F3D4->unk83AC->unk14 = 1;
+ }
+ else
+ {
+ sub_8149288();
+ sub_8147F10(3);
+ }
+ }
+
+ if (gUnknown_203F3D4->unk14 == 7
+ && gUnknown_203F3D4->unk18 == 6
+ && gUnknown_203F3D4->unk83AC->unk10 != 2)
+ {
+ gUnknown_203F3D4->unk83AC->unk14 = 1;
+ sub_8147F10(3);
+ }
+
+ for (i = 0; i < gUnknown_203F3D4->unk5; i++)
+ {
+ if (gUnknown_203F3D4->unk82E4[i].unk10 == 2)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_81496D4(void)
+{
+ int i;
+ int numPlayers = gUnknown_203F3D4->unk5;
+ int count = 0;
+ for (i = 0; i < numPlayers; i++)
+ {
+ if (gUnknown_203F3D4->unk82E4[i].unk14)
+ count++;
+ }
+
+ return count == numPlayers;
+}
+
+static bool32 sub_8149710(void)
+{
+ int i;
+ for (i = 0; i < gUnknown_203F3D4->unk5; i++)
+ {
+ if (gUnknown_203F3D4->unk82E4[i].unk14 != 1)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool32 sub_8149748(void)
+{
+ int i;
+
+ if (gUnknown_203F3D4->unk45 == 1)
+ return FALSE;
+
+ for (i = 1; i < gUnknown_203F3D4->unk5; i++)
+ {
+ if (gUnknown_203F3D4->unk90[i] == 1)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void sub_8149780(int arg0)
+{
+ gUnknown_203F3D4->unk70.unk8 += arg0;
+ gUnknown_203F3D4->unk5C = 1;
+ if (gUnknown_203F3D4->unk70.unk8 >= 99990)
+ gUnknown_203F3D4->unk70.unk8 = 99990;
+}
+
+static int sub_81497A8(void)
+{
+ int i;
+ int count = 0;
+ int numPlayers = gUnknown_203F3D4->unk5;
+
+ for (i = 0; i < numPlayers; i++)
+ {
+ if (gUnknown_203F3D4->unk82E4[i].unk0 == -30)
+ {
+ gUnknown_203F3D4->unk7C[i] = 1;
+ count++;
+ }
+ else
+ {
+ gUnknown_203F3D4->unk7C[i] = 0;
+ }
+ }
+
+ return count;
+}
+
+static bool32 sub_8149804(void)
+{
+ return !Rfu.unk_124.count && !Rfu.unk_9e8.count;
+}
+
+static int sub_8149834(u8 *arg0)
+{
+ int i;
+ int flags;
+ int count;
+
+ for (i = 0, flags = 0, count = 0; i < MAX_RFU_PLAYERS; i++)
+ {
+ if (arg0[i])
+ {
+ flags |= 1 << i;
+ count++;
+ }
+ }
+
+ gUnknown_203F3D4->unk70.unk1 = flags;
+ if (flags)
+ gUnknown_203F3D4->unk4D = 1;
+
+ return count;
+}
+
+static void sub_8149878(void)
+{
+ gUnknown_203F3D4->unk44 = 0;
+}
+
+static const int gUnknown_846B74C[] = {0, 0, 50, 100, 200, 500};
+
+static int sub_8149888(int arg0)
+{
+ return gUnknown_846B74C[arg0];
+}
+
+static void sub_8149898(u16 arg0)
+{
+ if (arg0 > gUnknown_203F3D4->unkE)
+ gUnknown_203F3D4->unkE = arg0;
+}
+
+static const u16 gUnknown_846B764[] = {0x8a, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93};
+static const u32 gUnknown_846B76C[][2] =
+{
+ {0x1388, 1},
+ {0x1f40, 2},
+ {0x2ee0, 3},
+ {0x3e80, 4},
+ {0x4e20, 5},
+};
+
+static bool32 sub_81498B4(void)
+{
+ if (gUnknown_203F3D4->unk70.unk8 >= gUnknown_846B76C[0][0])
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static u16 sub_81498D8(void)
+{
+ u16 lo = sub_8149910();
+ u16 hi = sub_8149930();
+ return (hi << 12) | (lo & 0xFFF);
+}
+
+static void sub_8149900(u16 arg0, u16 *arg1, u16 *arg2)
+{
+ *arg2 = arg0 >> 12;
+ *arg1 = arg0 & 0xFFF;
+}
+
+static u16 sub_8149910(void)
+{
+ u16 index = Random() % NELEMS(gUnknown_846B764);
+ return gUnknown_846B764[index];
+}
+
+static u16 sub_8149930(void)
+{
+ u32 val, i;
+
+ val = 0;
+ for (i = 0; i < 5; i++)
+ {
+ if (gUnknown_203F3D4->unk70.unk8 < gUnknown_846B76C[i][0])
+ break;
+ else if (1) // required to match, see pret/pokeemerald#982
+ val = gUnknown_846B76C[i][1];
+ else
+ break;
+ }
+
+ return val;
+}
+
+static u16 sub_8149978(u16 item, u16 quantity)
+{
+ while (quantity && !CheckBagHasSpace(item, quantity))
+ quantity--;
+
+ return quantity;
+}
+
+u16 sub_81499A4(void)
+{
+ return GetLinkPlayerCount();
+}
+
+u16 sub_81499B4(void)
+{
+ return gUnknown_203F3D4->unk6;
+}
+
+struct PokemonJump1_MonInfo *sub_81499C0(u8 multiplayerId)
+{
+ return &gUnknown_203F3D4->unk82A8[multiplayerId];
+}
+
+u8 *sub_81499E0(u8 multiplayerId)
+{
+ return gUnknown_203F3D4->unk82E4[multiplayerId].unk1C;
+}
+
+bool32 IsSpeciesAllowedInPokemonJump(u16 species)
+{
+ return GetPokemonJumpSpeciesIdx(species) > -1;
+}
+
+void IsPokemonJumpSpeciesInParty(void)
+{
+ int i;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES))
+ {
+ u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
+ if (IsSpeciesAllowedInPokemonJump(species))
+ {
+ gSpecialVar_Result = TRUE;
+ return;
+ }
+ }
+ }
+
+ gSpecialVar_Result = FALSE;
+}
diff --git a/src/pokemon_jump_3.c b/src/pokemon_jump_3.c
new file mode 100644
index 000000000..04d9ad439
--- /dev/null
+++ b/src/pokemon_jump_3.c
@@ -0,0 +1,167 @@
+#include "global.h"
+#include "link_rfu.h"
+#include "pokemon_jump.h"
+
+struct MonInfoPacket
+{
+ u8 id; // packet id
+ u16 species;
+ u32 personality;
+ u32 otId;
+};
+
+void sub_8149A6C(struct PokemonJump1_MonInfo *arg0)
+{
+ struct MonInfoPacket packet;
+ packet.id = 1;
+ packet.species = arg0->species;
+ packet.otId = arg0->otId;
+ packet.personality = arg0->personality;
+ RfuPrepareSend0x2f00(&packet);
+}
+
+bool32 sub_8149A90(int multiplayerId, struct PokemonJump1_MonInfo *arg0)
+{
+ struct MonInfoPacket packet;
+
+ if ((gRecvCmds[multiplayerId][0] & 0xFF00) != 0x2F00)
+ return FALSE;
+
+ memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet));
+ if (packet.id == 1)
+ {
+ arg0->species = packet.species;
+ arg0->otId = packet.otId;
+ arg0->personality = packet.personality;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+struct UnkPacket2
+{
+ u8 id; // packet id
+ u32 unk4;
+ u32 unk8;
+};
+
+void sub_8149AE0(u32 arg0)
+{
+ struct UnkPacket2 packet;
+ packet.id = 2;
+ packet.unk4 = arg0;
+ RfuPrepareSend0x2f00(&packet);
+}
+
+struct UnkPacket3
+{
+ u8 id; // packet id
+ u8 unk1;
+ u8 unk2;
+ u8 unk3_0:5;
+ u8 unk3_1:3;
+ u16 unk4;
+ u16 unk6;
+ u32 unk8_0:15;
+ u32 unk8_1:17;
+};
+
+void sub_8149AF8(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1)
+{
+ struct UnkPacket3 packet;
+ packet.id = 3;
+ packet.unk8_1 = arg1->unk8;
+ packet.unk3_0 = arg1->unk1;
+ packet.unk1 = arg1->unk0;
+ packet.unk6 = arg1->unk2;
+ packet.unk8_0 = arg1->unk4;
+ packet.unk2 = arg0->unk10;
+ packet.unk3_1 = arg0->unk14;
+ packet.unk4 = arg0->unkE;
+ RfuPrepareSend0x2f00(&packet);
+}
+
+bool32 sub_8149B7C(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1)
+{
+ struct UnkPacket3 packet;
+
+ if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00)
+ return FALSE;
+
+ memcpy(&packet, &gRecvCmds[0][1], sizeof(packet));
+ if (packet.id != 3)
+ return FALSE;
+
+ arg1->unk8 = packet.unk8_1;
+ arg1->unk1 = packet.unk3_0;
+ arg1->unk0 = packet.unk1;
+ arg1->unk2 = packet.unk6;
+ arg1->unk4 = packet.unk8_0;
+ arg0->unk10 = packet.unk2;
+ arg0->unk14 = packet.unk3_1;
+ arg0->unkE = packet.unk4;
+ return TRUE;
+}
+
+struct UnkPacket4
+{
+ u8 id; // packet id
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+ u16 unk4;
+ u8 unk6;
+ u16 unk8;
+};
+
+void sub_8149BF4(struct PokemonJump1_82E4 *arg0, u8 arg1, u16 arg2)
+{
+ struct UnkPacket4 packet;
+ packet.id = 4;
+ packet.unk1 = arg0->unk10;
+ packet.unk2 = arg0->unk14;
+ packet.unk3 = arg0->unk18;
+ packet.unk4 = arg0->unkE;
+ packet.unk6 = arg1;
+ packet.unk8 = arg2;
+ RfuPrepareSend0x2f00(&packet);
+}
+
+bool32 sub_8149C24(struct PokemonJump1_82E4 *arg0, int multiplayerId, u8 *arg2, u16 *arg3)
+{
+ struct UnkPacket4 packet;
+
+ if ((gRecvCmds[multiplayerId][0] & 0xFF00) != 0x2F00)
+ return FALSE;
+
+ memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet));
+ if (packet.id != 4)
+ return FALSE;
+
+ arg0->unk10 = packet.unk1;
+ arg0->unk14 = packet.unk2;
+ arg0->unk18 = packet.unk3;
+ arg0->unkE = packet.unk4;
+ *arg2 = packet.unk6;
+ *arg3 = packet.unk8;
+ return TRUE;
+}
+
+bool32 sub_8149C90(struct PokemonJump1_82E4 *arg0, int multiplayerId)
+{
+ struct UnkPacket4 packet;
+
+ if ((gRecvCmds[multiplayerId][0] & 0xFF00) != 0x2F00)
+ return FALSE;
+
+ memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet));
+ if (packet.id != 4)
+ return FALSE;
+
+ arg0->unk10 = packet.unk1;
+ arg0->unk14 = packet.unk2;
+ arg0->unk18 = packet.unk3;
+ arg0->unkE = packet.unk4;
+ return TRUE;
+}
diff --git a/src/pokemon_jump_4.c b/src/pokemon_jump_4.c
new file mode 100644
index 000000000..c125734a3
--- /dev/null
+++ b/src/pokemon_jump_4.c
@@ -0,0 +1,922 @@
+#include "global.h"
+#include "gflib.h"
+#include "data.h"
+#include "digit_obj_util.h"
+#include "dynamic_placeholder_text_util.h"
+#include "item.h"
+#include "menu.h"
+#include "new_menu_helpers.h"
+#include "pokemon_jump.h"
+#include "strings.h"
+#include "task.h"
+#include "text_window.h"
+#include "constants/songs.h"
+#include "constants/items.h"
+
+EWRAM_DATA static struct PokemonJump2 *gUnknown_203F3D8 = NULL;
+
+static void sub_8149D80(void (*func)(void));
+static void sub_8149DA4(u8 taskId);
+static void sub_8149DC8(void);
+static void sub_8149F64(void);
+static void sub_8149FD0(void);
+static void sub_814A03C(void);
+static void sub_814A0C8(void);
+static void sub_814A174(void);
+static void sub_814A218(void);
+static void sub_814A264(void);
+static void sub_814A308(void);
+static void sub_814A3AC(void);
+static u32 sub_814A754(u32 left, u32 top, u32 width, u32 height);
+static void sub_814A7D0(u16 left, u16 top, u8 cursorPos);
+static void sub_814A84C(void);
+static void sub_814A8B8(void);
+static void sub_814A9C8(void);
+static void sub_814AADC(void);
+static void sub_814AC30(bool32 arg0);
+static void sub_814AC94(void);
+static void sub_814ACCC(u8 arg0);
+static void sub_814AD50(u8 taskId);
+
+static void sub_8149D34(struct PokemonJump2 *);
+
+void sub_8149CEC(struct PokemonJump2 *arg0)
+{
+ u8 taskId;
+
+ gUnknown_203F3D8 = arg0;
+ sub_8149D34(gUnknown_203F3D8);
+ taskId = CreateTask(sub_8149DA4, 3);
+ gUnknown_203F3D8->unk6 = taskId;
+ SetWordTaskArg(gUnknown_203F3D8->unk6, 2, (uintptr_t)gUnknown_203F3D8);
+ sub_8149D80(sub_8149DC8);
+}
+
+void sub_8149D24(void)
+{
+ FreeAllWindowBuffers();
+ DigitObjUtil_Teardown();
+}
+
+static void sub_8149D34(struct PokemonJump2 *arg0)
+{
+ arg0->unk4 = 0;
+ arg0->unk0 = 0;
+ arg0->unk12 = 0xFF;
+}
+
+// Gfx
+static const u16 sPkmnJumpPal3[] = INCBIN_U16("graphics/link_games/pkmnjump_pal3.gbapal");
+
+static const u16 sPkmnJumpBgPal[] = INCBIN_U16("graphics/link_games/pkmnjump_bg.gbapal");
+static const u32 sPkmnJumpBgGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_bg.4bpp.lz");
+static const u32 sPkmnJumpBgTilemap[] = INCBIN_U32("graphics/link_games/pkmnjump_bg.bin.lz");
+
+static const u16 sPkmnJumpVenusaurPal[] = INCBIN_U16("graphics/link_games/pkmnjump_venusaur.gbapal");
+static const u32 sPkmnJumpVenusaurGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_venusaur.4bpp.lz");
+static const u32 sPkmnJumpVenusaurTilemap[] = INCBIN_U32("graphics/link_games/pkmnjump_venusaur.bin.lz");
+
+static const u16 sPkmnJumpResultsPal[] = INCBIN_U16("graphics/link_games/pkmnjump_results.gbapal");
+static const u32 sPkmnJumpResultsGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_results.4bpp.lz");
+static const u32 sPkmnJumpResultsTilemap[] = INCBIN_U32("graphics/link_games/pkmnjump_results.bin.lz");
+
+static const struct BgTemplate gUnknown_846D8D4[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 27,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 30,
+ .screenSize = 2,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 12,
+ .screenSize = 3,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 29,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ },
+};
+
+static const struct WindowTemplate gUnknown_846D8E4[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 19,
+ .tilemapTop = 0,
+ .width = 6,
+ .height = 2,
+ .paletteNum = 2,
+ .baseBlock = 0x13,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 8,
+ .tilemapTop = 0,
+ .width = 6,
+ .height = 2,
+ .paletteNum = 2,
+ .baseBlock = 0x1F,
+ },
+ DUMMY_WIN_TEMPLATE,
+};
+
+struct
+{
+ int id;
+ void (*func)(void);
+} static const gUnknown_846D8FC[] =
+{
+ {0x00, sub_8149DC8},
+ {0x01, sub_8149F64},
+ {0x02, sub_8149FD0},
+ {0x03, sub_814A03C},
+ {0x04, sub_814A0C8},
+ {0x05, sub_814A174},
+ {0x06, sub_814A218},
+ {0x07, sub_814A264},
+ {0x09, sub_814A3AC},
+ {0x08, sub_814A308},
+};
+
+void sub_8149D40(int arg0)
+{
+ int i;
+
+ for (i = 0; i < NELEMS(gUnknown_846D8FC); i++)
+ {
+ if (gUnknown_846D8FC[i].id == arg0)
+ sub_8149D80(gUnknown_846D8FC[i].func);
+ }
+}
+
+bool32 sub_8149D68(void)
+{
+ return (gUnknown_203F3D8->unk0 != 1);
+}
+
+static void sub_8149D80(void (*func)(void))
+{
+ SetWordTaskArg(gUnknown_203F3D8->unk6, 0, (uintptr_t)func);
+ gUnknown_203F3D8->unk4 = 0;
+ gUnknown_203F3D8->unk0 = 0;
+}
+
+static void sub_8149DA4(u8 taskId)
+{
+ if (!gUnknown_203F3D8->unk0)
+ {
+ void (*func)(void) = (void *)(GetWordTaskArg(taskId, 0));
+
+ func();
+ }
+}
+
+static void sub_8149DC8(void)
+{
+ switch (gUnknown_203F3D8->unk4)
+ {
+ case 0:
+ ResetBgsAndClearDma3BusyFlags(FALSE);
+ InitBgsFromTemplates(0, gUnknown_846D8D4, NELEMS(gUnknown_846D8D4));
+ InitWindows(gUnknown_846D8E4);
+ ResetBgPositions();
+ ResetTempTileDataBuffers();
+ sub_814AD6C(gUnknown_203F3D8);
+ sub_814A9C8();
+ LoadPalette(sPkmnJumpBgPal, 0, 0x20);
+ DecompressAndCopyTileDataToVram(3, sPkmnJumpBgGfx, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(3, sPkmnJumpBgTilemap, 0, 0, 1);
+ LoadPalette(sPkmnJumpVenusaurPal, 0x30, 0x20);
+ DecompressAndCopyTileDataToVram(2, sPkmnJumpVenusaurGfx, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(2, sPkmnJumpVenusaurTilemap, 0, 0, 1);
+ LoadPalette(sPkmnJumpResultsPal, 0x10, 0x20);
+ DecompressAndCopyTileDataToVram(1, sPkmnJumpResultsGfx, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(1, sPkmnJumpResultsTilemap, 0, 0, 1);
+ LoadPalette(sPkmnJumpPal3, 0x20, 0x20);
+ SetBgTilemapBuffer(0, gUnknown_203F3D8->tilemapBuffer);
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
+ sub_814A84C();
+ sub_814AA24(0);
+ sub_814FDA0(0, 1, 0xE0);
+ LoadUserWindowBorderGfx(0, 0x00A, 0xD0);
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(1);
+ gUnknown_203F3D8->unk4++;
+ break;
+ case 1:
+ if (!FreeTempTileDataBuffersIfPossible())
+ {
+ sub_814A8B8();
+ sub_814B294(gUnknown_203F3D8);
+ sub_814B348(gUnknown_203F3D8, 6);
+ ShowBg(3);
+ ShowBg(0);
+ ShowBg(2);
+ HideBg(1);
+ gUnknown_203F3D8->unk4++;
+ }
+ break;
+ case 2:
+ gUnknown_203F3D8->unk0 = 1;
+ break;
+ }
+}
+
+static void sub_8149F64(void)
+{
+ switch (gUnknown_203F3D8->unk4)
+ {
+ case 0:
+ sub_814AADC();
+ gUnknown_203F3D8->unk4++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ sub_814AC30(FALSE);
+ gUnknown_203F3D8->unk4++;
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ sub_814AC94();
+ gUnknown_203F3D8->unk4++;
+ }
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ gUnknown_203F3D8->unk0 = 1;
+ break;
+ }
+}
+
+static void sub_8149FD0(void)
+{
+ switch (gUnknown_203F3D8->unk4)
+ {
+ case 0:
+ sub_814AADC();
+ gUnknown_203F3D8->unk4++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ sub_814AC30(TRUE);
+ gUnknown_203F3D8->unk4++;
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ sub_814AC94();
+ gUnknown_203F3D8->unk4++;
+ }
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ gUnknown_203F3D8->unk0 = 1;
+ break;
+ }
+}
+
+static void sub_814A03C(void)
+{
+ int i, numPlayers;
+
+ numPlayers = sub_81499A4();
+ switch (gUnknown_203F3D8->unk4)
+ {
+ case 0:
+ for (i = 0; i < numPlayers; i++)
+ ClearWindowTilemap(gUnknown_203F3D8->unk1C[i]);
+
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F3D8->unk4++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ for (i = 0; i < numPlayers; i++)
+ RemoveWindow(gUnknown_203F3D8->unk1C[i]);
+
+ gUnknown_203F3D8->unk0 = 1;
+ }
+ break;
+ }
+}
+
+static void sub_814A0C8(void)
+{
+ switch (gUnknown_203F3D8->unk4)
+ {
+ case 0:
+ gUnknown_203F3D8->unk12 = sub_814A754(1, 8, 20, 2);
+ AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gText_WantToPlayAgain2, 0, 2, TEXT_SPEED_FF, NULL);
+ CopyWindowToVram(gUnknown_203F3D8->unk12, 2);
+ gUnknown_203F3D8->unk4++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_203F3D8->unk12);
+ DrawTextBorderOuter(gUnknown_203F3D8->unk12, 1, 14);
+ sub_814A7D0(23, 7, 0);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F3D8->unk4++;
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ gUnknown_203F3D8->unk0 = 1;
+ break;
+ }
+}
+
+static void sub_814A174(void)
+{
+ switch (gUnknown_203F3D8->unk4)
+ {
+ case 0:
+ gUnknown_203F3D8->unk12 = sub_814A754(2, 7, 26, 4);
+ AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gText_SavingDontTurnOffPower, 0, 2, TEXT_SPEED_FF, NULL);
+ CopyWindowToVram(gUnknown_203F3D8->unk12, 2);
+ gUnknown_203F3D8->unk4++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_203F3D8->unk12);
+ DrawTextBorderOuter(gUnknown_203F3D8->unk12, 1, 14);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F3D8->unk4++;
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ gUnknown_203F3D8->unk0 = 1;
+ break;
+ }
+}
+
+static void sub_814A218(void)
+{
+ switch (gUnknown_203F3D8->unk4)
+ {
+ case 0:
+ sub_814A6CC();
+ DestroyYesNoMenu();
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F3D8->unk4++;
+ break;
+ case 1:
+ if (!sub_814A6FC() && !IsDma3ManagerBusyWithBgCopy())
+ gUnknown_203F3D8->unk0 = 1;
+ break;
+ }
+}
+
+static void sub_814A264(void)
+{
+ switch (gUnknown_203F3D8->unk4)
+ {
+ case 0:
+ gUnknown_203F3D8->unk12 = sub_814A754(2, 8, 22, 4);
+ AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gText_SomeoneDroppedOut2, 0, 2, TEXT_SPEED_FF, NULL);
+ CopyWindowToVram(gUnknown_203F3D8->unk12, 2);
+ gUnknown_203F3D8->unk4++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_203F3D8->unk12);
+ DrawTextBorderOuter(gUnknown_203F3D8->unk12, 1, 14);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F3D8->unk4++;
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ gUnknown_203F3D8->unk0 = 1;
+ break;
+ }
+}
+
+static void sub_814A308(void)
+{
+ switch (gUnknown_203F3D8->unk4)
+ {
+ case 0:
+ gUnknown_203F3D8->unk12 = sub_814A754(7, 10, 16, 2);
+ AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gText_CommunicationStandby4, 0, 2, TEXT_SPEED_FF, NULL);
+ CopyWindowToVram(gUnknown_203F3D8->unk12, 2);
+ gUnknown_203F3D8->unk4++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_203F3D8->unk12);
+ DrawTextBorderOuter(gUnknown_203F3D8->unk12, 1, 14);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F3D8->unk4++;
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ gUnknown_203F3D8->unk0 = 1;
+ break;
+ }
+}
+
+static void sub_814A3AC(void)
+{
+ switch (gUnknown_203F3D8->unk4)
+ {
+ case 0:
+ sub_814B43C(gUnknown_203F3D8);
+ gUnknown_203F3D8->unk4++;
+ break;
+ case 1:
+ if (!sub_814B460())
+ gUnknown_203F3D8->unk0 = 1;
+ break;
+ }
+}
+
+void sub_814A3E4(void)
+{
+ gUnknown_203F3D8->unkA = 0;
+ gUnknown_203F3D8->unkB = 0;
+ gUnknown_203F3D8->unkC = 6;
+ sub_814A95C(gUnknown_203F3D8->unkC);
+}
+
+bool32 sub_814A408(void)
+{
+ switch (gUnknown_203F3D8->unkA)
+ {
+ case 0:
+ gUnknown_203F3D8->unkB++;
+ if (gUnknown_203F3D8->unkB > 10)
+ {
+ gUnknown_203F3D8->unkB = 0;
+ gUnknown_203F3D8->unkC++;
+ if (gUnknown_203F3D8->unkC >= 10)
+ {
+ gUnknown_203F3D8->unkC = 0;
+ gUnknown_203F3D8->unkA++;
+ }
+ }
+ sub_814A95C(gUnknown_203F3D8->unkC);
+ if (gUnknown_203F3D8->unkC != 7)
+ break;
+ case 1:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static const u8 sPluralTxt[] = _("IES");
+
+void sub_814A468(u16 itemId, u16 quantity)
+{
+ CopyItemName(itemId, gUnknown_203F3D8->txtBuff[0]);
+ ConvertIntToDecimalStringN(gUnknown_203F3D8->txtBuff[1], quantity, STR_CONV_MODE_LEFT_ALIGN, 1);
+ if (itemId >= FIRST_BERRY_INDEX && itemId < LAST_BERRY_INDEX)
+ {
+ if (quantity > 1)
+ {
+ int endi = StringLength(gUnknown_203F3D8->txtBuff[0]);
+ if (endi != 0)
+ {
+ endi--;
+ endi[gUnknown_203F3D8->txtBuff[0]] = EOS;
+ StringAppend(gUnknown_203F3D8->txtBuff[0], sPluralTxt);
+ }
+ }
+ }
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_203F3D8->txtBuff[0]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_203F3D8->txtBuff[1]);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gUnknown_203F3D8->strBuff, gText_AwesomeWonF701F700);
+ gUnknown_203F3D8->unk12 = sub_814A754(4, 8, 22, 4);
+ AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gUnknown_203F3D8->strBuff, 0, 2, TEXT_SPEED_FF, NULL);
+ CopyWindowToVram(gUnknown_203F3D8->unk12, 2);
+ gUnknown_203F3D8->unk14 = MUS_FANFA1;
+ gUnknown_203F3D8->unkD = 0;
+}
+
+void sub_814A53C(u16 itemId)
+{
+ CopyItemName(itemId, gUnknown_203F3D8->txtBuff[0]);
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_203F3D8->txtBuff[0]);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gUnknown_203F3D8->strBuff, gText_FilledStorageSpace2);
+ gUnknown_203F3D8->unk12 = sub_814A754(4, 8, 22, 4);
+ AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gUnknown_203F3D8->strBuff, 0, 2, TEXT_SPEED_FF, NULL);
+ CopyWindowToVram(gUnknown_203F3D8->unk12, 2);
+ gUnknown_203F3D8->unk14 = 0;
+ gUnknown_203F3D8->unkD = 0;
+}
+
+void sub_814A5B4(u16 itemId)
+{
+ CopyItemName(itemId, gUnknown_203F3D8->txtBuff[0]);
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_203F3D8->txtBuff[0]);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gUnknown_203F3D8->strBuff, gText_CantHoldMore);
+ gUnknown_203F3D8->unk12 = sub_814A754(4, 9, 22, 2);
+ AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gUnknown_203F3D8->strBuff, 0, 2, TEXT_SPEED_FF, NULL);
+ CopyWindowToVram(gUnknown_203F3D8->unk12, 2);
+ gUnknown_203F3D8->unk14 = 0;
+ gUnknown_203F3D8->unkD = 0;
+}
+
+bool32 sub_814A62C(void)
+{
+ switch (gUnknown_203F3D8->unkD)
+ {
+ case 0:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_203F3D8->unk12);
+ DrawTextBorderOuter(gUnknown_203F3D8->unk12, 1, 14);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203F3D8->unkD++;
+ }
+ break;
+ case 1:
+ if (IsDma3ManagerBusyWithBgCopy())
+ break;
+ if (gUnknown_203F3D8->unk14 == 0)
+ {
+ gUnknown_203F3D8->unkD += 2;
+ return FALSE;
+ }
+ PlayFanfare(gUnknown_203F3D8->unk14);
+ gUnknown_203F3D8->unkD++;
+ case 2:
+ if (!IsFanfareTaskInactive())
+ break;
+ gUnknown_203F3D8->unkD++;
+ case 3:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+void sub_814A6CC(void)
+{
+ if (gUnknown_203F3D8->unk12 != 0xFF)
+ {
+ rbox_fill_rectangle(gUnknown_203F3D8->unk12);
+ CopyWindowToVram(gUnknown_203F3D8->unk12, 1);
+ gUnknown_203F3D8->unkD = 0;
+ }
+}
+
+// Can't match this without the ugly GOTO, oh well.
+bool32 sub_814A6FC(void)
+{
+ if (gUnknown_203F3D8->unk12 == 0xFF)
+ {
+ RET_FALSE:
+ return FALSE;
+ }
+
+ if (gUnknown_203F3D8->unkD == 0)
+ {
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ RemoveWindow(gUnknown_203F3D8->unk12);
+ gUnknown_203F3D8->unk12 = 0xFF;
+ gUnknown_203F3D8->unkD++;
+ goto RET_FALSE;
+ }
+ }
+ else if (gUnknown_203F3D8->unkD == 1)
+ goto RET_FALSE;
+
+ return TRUE;
+}
+
+s8 sub_814A744(void)
+{
+ return Menu_ProcessInputNoWrapClearOnChoose();
+}
+
+static u32 sub_814A754(u32 left, u32 top, u32 width, u32 height)
+{
+ u32 windowId;
+ struct WindowTemplate window;
+
+ window.bg = 0;
+ window.tilemapLeft = left;
+ window.tilemapTop = top;
+ window.width = width;
+ window.height = height;
+ window.paletteNum = 0xF;
+ window.baseBlock = 0x43;
+
+ windowId = AddWindow(&window);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
+ return windowId;
+}
+
+static void sub_814A7D0(u16 left, u16 top, u8 cursorPos)
+{
+ struct WindowTemplate window;
+ u8 a = cursorPos;
+
+ window.bg = 0;
+ window.tilemapLeft = left;
+ window.tilemapTop = top;
+ window.width = 6;
+ window.height = 4;
+ window.paletteNum = 2;
+ window.baseBlock = 0x2B;
+
+ CreateYesNoMenu(&window, 2, 0, 2, 0x00a, 0xD, a);
+}
+
+static void sub_814A84C(void)
+{
+ u8 color[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY};
+
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ FillWindowPixelBuffer(0, PIXEL_FILL(0));
+ FillWindowPixelBuffer(1, PIXEL_FILL(0));
+ AddTextPrinterParameterized3(0, 0, 0, 2, color, 0, gText_SpacePoints2);
+ AddTextPrinterParameterized3(1, 0, 0, 2, color, 0, gText_SpaceTimes3);
+}
+
+static const u8 gUnknown_846D953[] = {2, 2, 0, 0, 1, 1, 1, 0, 0, 2, 0, 0, 0};
+
+static const struct CompressedSpriteSheet gUnknown_846D960 = {gUnknown_8479688, 0, 0x320};
+static const struct SpritePalette gUnknown_846D968 = {gUnknown_8479668, 0x320};
+
+static const u16 gUnknown_846D970[] = {0x06, 0x08, 0x10, 0x08};
+static const u16 gUnknown_846D978[] = {0x06, 0x08, 0x0b, 0x06, 0x10, 0x08};
+static const u16 gUnknown_846D984[] = {0x02, 0x06, 0x06, 0x08, 0x10, 0x08, 0x14, 0x06};
+static const u16 gUnknown_846D994[] = {0x02, 0x06, 0x06, 0x08, 0x0b, 0x06, 0x10, 0x08, 0x14, 0x06};
+
+static const u16 *const gUnknown_846D9A8[] =
+{
+ gUnknown_846D970,
+ gUnknown_846D978,
+ gUnknown_846D984,
+ gUnknown_846D994,
+};
+
+static const s16 gUnknown_846D9B8[] = {0x0058, 0x0098};
+static const s16 gUnknown_846D9BC[] = {0x0058, 0x0078, 0x0098};
+static const s16 gUnknown_846D9C2[] = {0x0038, 0x0058, 0x0098, 0x00b8};
+static const s16 gUnknown_846D9CA[] = {0x0038, 0x0058, 0x0078, 0x0098, 0x00b8};
+
+static const s16 *const gUnknown_846D9D4[] =
+{
+ gUnknown_846D9B8,
+ gUnknown_846D9BC,
+ gUnknown_846D9C2,
+ gUnknown_846D9CA,
+};
+
+static void sub_814A8B8(void)
+{
+ int i, y, playersCount = sub_81499A4();
+ const s16 *xCoords = gUnknown_846D9D4[playersCount - 2];
+
+ for (i = 0; i < playersCount; i++)
+ {
+ struct PokemonJump1_MonInfo *info = sub_81499C0(i);
+
+ y = gMonFrontPicCoords[info->species].y_offset;
+ sub_814ADCC(gUnknown_203F3D8, info, *xCoords, y + 112, i);
+ sub_814B240(gUnknown_203F3D8, *xCoords, 112, i);
+ xCoords++;
+ }
+}
+
+void sub_814A940(u32 id, s16 y)
+{
+ gUnknown_203F3D8->unk81A8[id]->pos2.y = y;
+}
+
+void sub_814A95C(int id)
+{
+ sub_814B348(gUnknown_203F3D8, id);
+ ChangeBgY(2, (gUnknown_846D953[id] * 5) << 0xD, 0);
+}
+
+int sub_814A98C(u8 flags)
+{
+ int i, count;
+
+ for (i = 0, count = 0; i < 5; i++)
+ {
+ if (flags & 1)
+ {
+ sub_814AF0C(gUnknown_203F3D8, i);
+ count++;
+ }
+ flags >>= 1;
+ }
+
+ sub_814ACCC(count - 2);
+ return count;
+}
+
+static void sub_814A9C8(void)
+{
+ struct DigitObjUtilTemplate unkStruct;
+ struct DigitObjUtilTemplate *ptr = &unkStruct; // This temp variable is needed to match, don't ask me why.
+
+ ptr->shape = SPRITE_SHAPE(8x8);
+ ptr->size = SPRITE_SIZE(8x8);
+ ptr->strConvMode = 0;
+ ptr->priority = 1;
+ ptr->oamCount = 5;
+ ptr->xDelta = 8;
+ ptr->x = 108;
+ ptr->y = 6;
+ ptr->spriteSheet.compressed = &gUnknown_846D960;
+ ptr->spritePal = &gUnknown_846D968;
+
+ DigitObjUtil_Init(2);
+ DigitObjUtil_CreatePrinter(0, 0, ptr);
+
+ unkStruct.oamCount = 4;
+ unkStruct.x = 30;
+ unkStruct.y = 6;
+ DigitObjUtil_CreatePrinter(1, 0, &unkStruct);
+}
+
+void sub_814AA24(int arg0)
+{
+ DigitObjUtil_PrintNumOn(0, arg0);
+}
+
+void sub_814AA34(u16 arg0)
+{
+ DigitObjUtil_PrintNumOn(1, arg0);
+}
+
+void sub_814AA48(u8 multiplayerId)
+{
+ sub_814AFE8(gUnknown_203F3D8, multiplayerId);
+}
+
+void sub_814AA60(u8 multiplayerId)
+{
+ sub_814B080(gUnknown_203F3D8, multiplayerId);
+}
+
+int sub_814AA78(int multiplayerId)
+{
+ return sub_814B010(gUnknown_203F3D8, multiplayerId);
+}
+
+void sub_814AA8C(void)
+{
+ sub_814B0A8(gUnknown_203F3D8);
+}
+
+void sub_814AAA0(void)
+{
+ sub_814B134(gUnknown_203F3D8);
+}
+
+void sub_814AAB4(int multiplayerId)
+{
+ sub_814B168(gUnknown_203F3D8, multiplayerId);
+}
+
+int sub_814AAC8(void)
+{
+ return sub_814B190(gUnknown_203F3D8);
+}
+
+static void sub_814AADC(void)
+{
+ struct WindowTemplate window;
+ int i, playersCount = sub_81499A4();
+ const u16 *winCoords = gUnknown_846D9A8[playersCount - 2];
+
+ window.bg = 0;
+ window.width = 8;
+ window.height = 2;
+ window.paletteNum = 2;
+ window.baseBlock = 0x2B;
+
+ for (i = 0; i < playersCount; i++)
+ {
+ window.tilemapLeft = winCoords[0];
+ window.tilemapTop = winCoords[1];
+ gUnknown_203F3D8->unk1C[i] = AddWindow(&window);
+ ClearWindowTilemap(gUnknown_203F3D8->unk1C[i]);
+ window.baseBlock += 0x10;
+ winCoords += 2;
+ }
+
+ CopyBgTilemapBufferToVram(0);
+}
+
+static void sub_814AB98(int multiplayerId, u8 clr1, u8 clr2, u8 clr3)
+{
+ u32 x;
+ u8 colors[3] = {clr1, clr2, clr3};
+
+ FillWindowPixelBuffer(gUnknown_203F3D8->unk1C[multiplayerId], PIXEL_FILL(0));
+ x = 64 - GetStringWidth(0, sub_81499E0(multiplayerId), -1);
+ x /= 2;
+ AddTextPrinterParameterized3(gUnknown_203F3D8->unk1C[multiplayerId], 0, x, 2, colors, -1, sub_81499E0(multiplayerId));
+ CopyWindowToVram(gUnknown_203F3D8->unk1C[multiplayerId], 2);
+}
+
+static void sub_814AC30(bool32 arg0)
+{
+ int i, var, playersCount = sub_81499A4();
+
+ if (!arg0)
+ {
+ for (i = 0; i < playersCount; i++)
+ sub_814AB98(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY);
+ }
+ else
+ {
+ var = sub_81499B4();
+ for (i = 0; i < playersCount; i++)
+ {
+ if (var != i)
+ sub_814AB98(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY);
+ else
+ sub_814AB98(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED);
+ }
+ }
+}
+
+static void sub_814AC94(void)
+{
+ int i, playersCount = sub_81499A4();
+
+ for (i = 0; i < playersCount; i++)
+ PutWindowTilemap(gUnknown_203F3D8->unk1C[i]);
+ CopyBgTilemapBufferToVram(0);
+}
+
+static void sub_814ACCC(u8 arg0)
+{
+ gUnknown_203F3D8->unk18 = 0;
+ ChangeBgX(1, (arg0 / 2) << 16, 0);
+ ChangeBgY(1, (((arg0 % 2) << 8) - 40) << 8, 0);
+ ShowBg(1);
+ CreateTask(sub_814AD50, 4);
+}
+
+static bool32 sub_814AD18(void)
+{
+ if (gUnknown_203F3D8->unk18 >= 32)
+ {
+ return FALSE;
+ }
+ else
+ {
+ ChangeBgY(1, 128, 1);
+ if (++gUnknown_203F3D8->unk18 >= 32)
+ HideBg(1);
+ return TRUE;
+ }
+}
+
+static void sub_814AD50(u8 taskId)
+{
+ if (!sub_814AD18())
+ DestroyTask(taskId);
+}
diff --git a/src/pokemon_jump_5.c b/src/pokemon_jump_5.c
new file mode 100644
index 000000000..f8abb2a1f
--- /dev/null
+++ b/src/pokemon_jump_5.c
@@ -0,0 +1,637 @@
+#include "global.h"
+#include "gflib.h"
+#include "decompress.h"
+#include "minigame_countdown.h"
+#include "pokemon_jump.h"
+#include "data.h"
+#include "trig.h"
+#include "constants/songs.h"
+
+static void sub_814AF74(struct Sprite *sprite);
+static void sub_814B038(struct Sprite *sprite);
+static void sub_814B100(struct Sprite *sprite);
+static void sub_814B1CC(struct Sprite *sprite);
+
+static const u16 sPkmnJumpPal1[] = INCBIN_U16("graphics/link_games/pkmnjump_pal1.gbapal");
+static const u16 sPkmnJumpPal2[] = INCBIN_U16("graphics/link_games/pkmnjump_pal2.gbapal");
+
+static const u32 sPkmnJumpRopeGfx1[] = INCBIN_U32("graphics/link_games/pkmnjump_rope1.4bpp.lz");
+static const u32 sPkmnJumpRopeGfx2[] = INCBIN_U32("graphics/link_games/pkmnjump_rope2.4bpp.lz");
+static const u32 sPkmnJumpRopeGfx3[] = INCBIN_U32("graphics/link_games/pkmnjump_rope3.4bpp.lz");
+static const u32 sPkmnJumpRopeGfx4[] = INCBIN_U32("graphics/link_games/pkmnjump_rope4.4bpp.lz");
+
+static const u32 sPkmnJumpStarGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_star.4bpp.lz");
+
+static const struct CompressedSpriteSheet gUnknown_846E0B0[] =
+{
+ {sPkmnJumpRopeGfx1, 0x600, 5},
+ {sPkmnJumpRopeGfx2, 0x0c00, 6},
+ {sPkmnJumpRopeGfx3, 0x0600, 7},
+ {sPkmnJumpRopeGfx4, 0x0600, 8},
+ {sPkmnJumpStarGfx, 0x0200, 10},
+};
+
+static const struct SpritePalette gUnknown_846E0D8[] =
+{
+ {sPkmnJumpPal1, 5},
+ {sPkmnJumpPal2, 6},
+};
+
+// Forward declarations.
+static const struct OamData sOamData_846E170;
+static const struct SpriteTemplate gUnknown_846E220;
+static const struct SpriteTemplate gUnknown_846E238;
+static const struct SpriteTemplate gUnknown_846E250;
+static const struct SpriteTemplate gUnknown_846E268;
+
+static const struct SpriteTemplate gUnknown_846E0E8 =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &sOamData_846E170,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const s16 gUnknown_846E100[][10] =
+{
+ {0x60, 0x60, 0x60, 0x72, 0x78, 0x78, 0x78, 0x72, 0x60, 0x60},
+ {0x46, 0x50, 0x60, 0x72, 0x78, 0x80, 0x78, 0x72, 0x60, 0x50},
+ {0x32, 0x48, 0x60, 0x72, 0x80, 0x88, 0x80, 0x72, 0x60, 0x48},
+ {0x2a, 0x48, 0x60, 0x72, 0x80, 0x88, 0x80, 0x72, 0x60, 0x48},
+};
+
+static const s16 gUnknown_846E150[] = {0x10, 0x28, 0x48, 0x68, 0x88, 0xa8, 0xc8, 0xe0};
+
+static const struct SpriteTemplate *const gUnknown_846E160[] =
+{
+ &gUnknown_846E220,
+ &gUnknown_846E238,
+ &gUnknown_846E250,
+ &gUnknown_846E268,
+};
+
+static const struct OamData sOamData_846E170 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = 0,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x64),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(64x64),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_846E178 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = 0,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x32),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(16x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_846E180 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = 0,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x32),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(32x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_846E188 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = 0,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x16),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(32x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_846E190[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_846E198[] =
+{
+ ANIMCMD_FRAME(8, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_846E1A0[] =
+{
+ ANIMCMD_FRAME(16, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_846E1A8[] =
+{
+ ANIMCMD_FRAME(24, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_846E1B0[] =
+{
+ ANIMCMD_FRAME(32, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_846E1B8[] =
+{
+ ANIMCMD_FRAME(40, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_846E1C0[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_846E1C8[] =
+{
+ ANIMCMD_FRAME(16, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_846E1D0[] =
+{
+ ANIMCMD_FRAME(32, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_846E1D8[] =
+{
+ ANIMCMD_FRAME(48, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_846E1E0[] =
+{
+ ANIMCMD_FRAME(64, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_846E1E8[] =
+{
+ ANIMCMD_FRAME(80, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_846E1F0[] =
+{
+ sSpriteAnim_846E190,
+ sSpriteAnim_846E198,
+ sSpriteAnim_846E1A0,
+ sSpriteAnim_846E1A8,
+ sSpriteAnim_846E1B0,
+ sSpriteAnim_846E1B8
+};
+
+static const union AnimCmd *const sSpriteAnimTable_846E208[] =
+{
+ sSpriteAnim_846E1C0,
+ sSpriteAnim_846E1C8,
+ sSpriteAnim_846E1D0,
+ sSpriteAnim_846E1D8,
+ sSpriteAnim_846E1E0,
+ sSpriteAnim_846E1E8
+};
+
+static const struct SpriteTemplate gUnknown_846E220 =
+{
+ .tileTag = 5,
+ .paletteTag = 5,
+ .oam = &sOamData_846E178,
+ .anims = sSpriteAnimTable_846E1F0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct SpriteTemplate gUnknown_846E238 =
+{
+ .tileTag = 6,
+ .paletteTag = 5,
+ .oam = &sOamData_846E180,
+ .anims = sSpriteAnimTable_846E208,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct SpriteTemplate gUnknown_846E250 =
+{
+ .tileTag = 7,
+ .paletteTag = 5,
+ .oam = &sOamData_846E188,
+ .anims = sSpriteAnimTable_846E1F0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct SpriteTemplate gUnknown_846E268 =
+{
+ .tileTag = 8,
+ .paletteTag = 5,
+ .oam = &sOamData_846E188,
+ .anims = sSpriteAnimTable_846E1F0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct OamData sOamData_846E280 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = 0,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x16),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(16x16),
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_846E288[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_846E290[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(4, 4),
+ ANIMCMD_FRAME(8, 4),
+ ANIMCMD_FRAME(12, 4),
+ ANIMCMD_LOOP(1),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_846E2AC[] =
+{
+ sSpriteAnim_846E288,
+ sSpriteAnim_846E290
+};
+
+static const struct SpriteTemplate gUnknown_846E2B4 =
+{
+ .tileTag = 10,
+ .paletteTag = 5,
+ .oam = &sOamData_846E280,
+ .anims = sSpriteAnimTable_846E2AC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+void sub_814AD6C(struct PokemonJump2 *arg0)
+{
+ int i;
+
+ for (i = 0; i < NELEMS(gUnknown_846E0B0); i++)
+ LoadCompressedSpriteSheet(&gUnknown_846E0B0[i]);
+
+ for (i = 0; i < NELEMS(gUnknown_846E0D8); i++)
+ LoadSpritePalette(&gUnknown_846E0D8[i]);
+
+ arg0->unkE = IndexOfSpritePaletteTag(5);
+ arg0->unkF = IndexOfSpritePaletteTag(6);
+}
+
+static void sub_814ADB4(struct Sprite *sprite)
+{
+ int i;
+ for (i = 0; i < 8; i++)
+ sprite->data[i] = 0;
+}
+
+void sub_814ADCC(struct PokemonJump2 *arg0, struct PokemonJump1_MonInfo *jumpMon, s16 x, s16 y, u8 multiplayerId)
+{
+ struct SpriteTemplate spriteTemplate;
+ struct SpriteSheet spriteSheet;
+ struct CompressedSpritePalette spritePalette;
+ u8 *buffer;
+ u8 *unusedBuffer;
+ u8 subpriority;
+ u8 spriteId;
+
+ spriteTemplate = gUnknown_846E0E8;
+ buffer = Alloc(0x2000);
+ unusedBuffer = Alloc(0x800);
+ if (multiplayerId == sub_81499B4())
+ subpriority = 3;
+ else
+ subpriority = multiplayerId + 4;
+
+ if (buffer && unusedBuffer)
+ {
+ HandleLoadSpecialPokePic(
+ &gMonFrontPicTable[jumpMon->species],
+ buffer,
+ jumpMon->species,
+ jumpMon->personality);
+
+ spriteSheet.data = buffer;
+ spriteSheet.tag = multiplayerId;
+ spriteSheet.size = 0x800;
+ LoadSpriteSheet(&spriteSheet);
+
+ spritePalette.data = GetMonSpritePalFromSpeciesAndPersonality(jumpMon->species, jumpMon->otId, jumpMon->personality);
+ spritePalette.tag = multiplayerId;
+ LoadCompressedSpritePalette(&spritePalette);
+
+ Free(buffer);
+ Free(unusedBuffer);
+
+ spriteTemplate.tileTag += multiplayerId;
+ spriteTemplate.paletteTag += multiplayerId;
+ spriteId = CreateSprite(&spriteTemplate, x, y, subpriority);
+ if (spriteId != MAX_SPRITES)
+ {
+ arg0->unk81A8[multiplayerId] = &gSprites[spriteId];
+ arg0->unk81FC[multiplayerId] = subpriority;
+ return;
+ }
+ }
+
+ arg0->unk81A8[multiplayerId] = NULL;
+}
+
+void sub_814AF0C(struct PokemonJump2 *arg0, int multiplayerId)
+{
+ sub_814ADB4(arg0->unk81BC[multiplayerId]);
+ arg0->unk81BC[multiplayerId]->data[7] = arg0->unk81A8[multiplayerId] - gSprites;
+ arg0->unk81BC[multiplayerId]->invisible = FALSE;
+ arg0->unk81BC[multiplayerId]->pos1.y = 96;
+ arg0->unk81BC[multiplayerId]->callback = sub_814AF74;
+ StartSpriteAnim(arg0->unk81BC[multiplayerId], 1);
+}
+
+static void sub_814AF74(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (sprite->animEnded)
+ {
+ sprite->invisible = TRUE;
+ sprite->callback = SpriteCallbackDummy;
+ }
+ break;
+ case 1:
+ sprite->pos1.y--;
+ sprite->data[1]++;
+ if (sprite->pos1.y <= 72)
+ {
+ sprite->pos1.y = 72;
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ if (++sprite->data[1] >= 48)
+ {
+ sprite->invisible = TRUE;
+ sprite->callback = SpriteCallbackDummy;
+ }
+ break;
+ }
+}
+
+void sub_814AFE8(struct PokemonJump2 *arg0, int multiplayerId)
+{
+ arg0->unk81A8[multiplayerId]->callback = sub_814B038;
+ arg0->unk81A8[multiplayerId]->pos2.y = 0;
+ sub_814ADB4(arg0->unk81A8[multiplayerId]);
+}
+
+bool32 sub_814B010(struct PokemonJump2 *arg0, int multiplayerId)
+{
+ return arg0->unk81A8[multiplayerId]->callback == sub_814B038;
+}
+
+static void sub_814B038(struct Sprite *sprite)
+{
+ if (++sprite->data[1] > 1)
+ {
+ if (++sprite->data[2] & 1)
+ sprite->pos2.y = 2;
+ else
+ sprite->pos2.y = -2;
+
+ sprite->data[1] = 0;
+ }
+
+ if (sprite->data[2] > 12)
+ {
+ sprite->pos2.y = 0;
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+void sub_814B080(struct PokemonJump2 *arg0, int multiplayerId)
+{
+ sub_814ADB4(arg0->unk81A8[multiplayerId]);
+ arg0->unk81A8[multiplayerId]->callback = sub_814B100;
+}
+
+void sub_814B0A8(struct PokemonJump2 *arg0)
+{
+ int i;
+ u16 numPlayers = sub_81499A4();
+ for (i = 0; i < numPlayers; i++)
+ {
+ if (arg0->unk81A8[i]->callback == sub_814B100)
+ {
+ arg0->unk81A8[i]->invisible = FALSE;
+ arg0->unk81A8[i]->callback = SpriteCallbackDummy;
+ arg0->unk81A8[i]->subpriority = 10;
+ }
+ }
+}
+
+static void sub_814B100(struct Sprite *sprite)
+{
+ if (++sprite->data[0] > 3)
+ {
+ sprite->data[0] = 0;
+ sprite->invisible ^= 1;
+ }
+}
+
+void sub_814B134(struct PokemonJump2 *arg0)
+{
+ int i;
+ u16 numPlayers = sub_81499A4();
+ for (i = 0; i < numPlayers; i++)
+ arg0->unk81A8[i]->subpriority = arg0->unk81FC[i];
+}
+
+void sub_814B168(struct PokemonJump2 *arg0, int multiplayerId)
+{
+ sub_814ADB4(arg0->unk81A8[multiplayerId]);
+ arg0->unk81A8[multiplayerId]->callback = sub_814B1CC;
+}
+
+bool32 sub_814B190(struct PokemonJump2 *arg0)
+{
+ int i;
+ u16 numPlayers = sub_81499A4();
+ for (i = 0; i < numPlayers; i++)
+ {
+ if (arg0->unk81A8[i]->callback == sub_814B1CC)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void sub_814B1CC(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ PlaySE(SE_JITE_PYOKO);
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ // fall through
+ case 1:
+ sprite->data[1] += 4;
+ if (sprite->data[1] > 0x7F)
+ sprite->data[1] = 0;
+
+ sprite->pos2.y = -(gSineTable[sprite->data[1]] >> 3);
+ if (sprite->data[1] == 0)
+ {
+ if (++sprite->data[2] < 2)
+ sprite->data[0] = 0;
+ else
+ sprite->callback = SpriteCallbackDummy;
+ }
+ break;
+ }
+}
+
+void sub_814B240(struct PokemonJump2 *arg0, s16 x, s16 y, u8 multiplayerId)
+{
+ u8 spriteId = CreateSprite(&gUnknown_846E2B4, x, y, 1);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].invisible = TRUE;
+ arg0->unk81BC[multiplayerId] = &gSprites[spriteId];
+ }
+}
+
+void sub_814B294(struct PokemonJump2 *arg0)
+{
+ int i;
+ int count;
+ u8 spriteId;
+
+ count = 0;
+ for (i = 0; i < 4; i++)
+ {
+ spriteId = CreateSprite(gUnknown_846E160[i], gUnknown_846E150[count], gUnknown_846E100[i][0], 2);
+ arg0->unk81D0[count] = &gSprites[spriteId];
+ count++;
+ }
+
+ for (i = 3; i >= 0; i--)
+ {
+ spriteId = CreateSprite(gUnknown_846E160[i], gUnknown_846E150[count], gUnknown_846E100[i][0], 2);
+ arg0->unk81D0[count] = &gSprites[spriteId];
+ arg0->unk81D0[count]->hFlip = 1;
+ count++;
+ }
+}
+
+void sub_814B348(struct PokemonJump2 *arg0, int arg1)
+{
+ int i, count, palNum;
+ int priority;
+
+ if (arg1 > 5)
+ {
+ arg1 = 10 - arg1;
+ priority = 3;
+ palNum = arg0->unkF;
+ }
+ else
+ {
+ priority = 2;
+ palNum = arg0->unkE;
+ }
+
+ count = 0;
+ for (i = 0; i < 4; i++)
+ {
+ arg0->unk81D0[count]->pos1.y = gUnknown_846E100[i][arg1];
+ arg0->unk81D0[count]->oam.priority = priority;
+ arg0->unk81D0[count]->oam.paletteNum = palNum;
+ StartSpriteAnim(arg0->unk81D0[count], arg1);
+ count++;
+ }
+
+ for (i = 3; i >= 0; i--)
+ {
+ arg0->unk81D0[count]->pos1.y = gUnknown_846E100[i][arg1];
+ arg0->unk81D0[count]->oam.priority = priority;
+ arg0->unk81D0[count]->oam.paletteNum = palNum;
+ StartSpriteAnim(arg0->unk81D0[count], arg1);
+ count++;
+ }
+}
+
+void sub_814B43C(struct PokemonJump2 *arg0)
+{
+ StartMinigameCountdown(9, 7, 120, 80, 0);
+ sub_814B134(arg0);
+}
+
+bool32 sub_814B460(void)
+{
+ return IsMinigameCountdownRunning();
+}
diff --git a/src/pokemon_jump_6.c b/src/pokemon_jump_6.c
new file mode 100644
index 000000000..1e213ad75
--- /dev/null
+++ b/src/pokemon_jump_6.c
@@ -0,0 +1,140 @@
+#include "global.h"
+#include "gflib.h"
+#include "menu.h"
+#include "script.h"
+#include "strings.h"
+#include "task.h"
+#include "text_window.h"
+
+static void Task_ShowPokemonJumpRecords(u8 taskId);
+static void TruncateToFirstWordOnly(u8 *str);
+static void sub_814B5C4(u16 windowId);
+
+static struct PokemonJumpResults *sub_814B46C(void)
+{
+ return &gSaveBlock2Ptr->pokeJump;
+}
+
+void ResetPokeJumpResults(void)
+{
+ struct PokemonJumpResults *pokeJump = sub_814B46C();
+ pokeJump->jumpsInRow = 0;
+ pokeJump->bestJumpScore = 0;
+ pokeJump->excellentsInRow = 0;
+ pokeJump->field6 = 0;
+ pokeJump->field8 = 0;
+ pokeJump->field2 = 0;
+}
+
+bool32 sub_814B494(u32 jumpScore, u16 jumpsInRow, u16 excellentsInRow)
+{
+ struct PokemonJumpResults *pokeJump = sub_814B46C();
+ bool32 ret = FALSE;
+
+ if (pokeJump->bestJumpScore < jumpScore && jumpScore <= 99990)
+ pokeJump->bestJumpScore = jumpScore, ret = TRUE;
+ if (pokeJump->jumpsInRow < jumpsInRow && jumpsInRow <= 9999)
+ pokeJump->jumpsInRow = jumpsInRow, ret = TRUE;
+ if (pokeJump->excellentsInRow < excellentsInRow && excellentsInRow <= 9999)
+ pokeJump->excellentsInRow = excellentsInRow, ret = TRUE;
+
+ return ret;
+}
+
+void sub_814B4E8(void)
+{
+ struct PokemonJumpResults *pokeJump = sub_814B46C();
+ if (pokeJump->field6 < 9999)
+ pokeJump->field6++;
+}
+
+void ShowPokemonJumpRecords(void)
+{
+ u8 taskId = CreateTask(Task_ShowPokemonJumpRecords, 0);
+ Task_ShowPokemonJumpRecords(taskId);
+}
+
+static const struct WindowTemplate gUnknown_846E2CC =
+{
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 1,
+ .width = 28,
+ .height = 9,
+ .paletteNum = 15,
+ .baseBlock = 0x1,
+};
+
+static const u8 *const gUnknown_846E2D4[] = {gText_JumpsInARow, gText_BestScore2, gText_ExcellentsInARow};
+
+static void Task_ShowPokemonJumpRecords(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ data[1] = AddWindow(&gUnknown_846E2CC);
+ sub_814B5C4(data[1]);
+ CopyWindowToVram(data[1], 3);
+ data[0]++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ data[0]++;
+ break;
+ case 2:
+ if (JOY_NEW(A_BUTTON | B_BUTTON))
+ {
+ rbox_fill_rectangle(data[1]);
+ CopyWindowToVram(data[1], 1);
+ data[0]++;
+ }
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ RemoveWindow(data[1]);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ }
+ break;
+ }
+}
+
+static void sub_814B5C4(u16 windowId)
+{
+ int i, x;
+ int results[3];
+ struct PokemonJumpResults *pokeJump = sub_814B46C();
+ u8 strbuf[8];
+ results[0] = pokeJump->jumpsInRow;
+ results[1] = pokeJump->bestJumpScore;
+ results[2] = pokeJump->excellentsInRow;
+
+ TextWindow_SetStdFrame0_WithPal(windowId, 0x21D, 0xD0);
+ DrawTextBorderOuter(windowId, 0x21D, 0xD);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
+ AddTextPrinterParameterized5(windowId, 2, gText_PkmnJumpRecords, 0, 0, TEXT_SPEED_FF, NULL, 1, 0);
+ for (i = 0; i < NELEMS(gUnknown_846E2D4); i++)
+ {
+ AddTextPrinterParameterized5(windowId, 2, gUnknown_846E2D4[i], 0, 20 + (i * 14), TEXT_SPEED_FF, NULL, 1, 0);
+ ConvertIntToDecimalStringN(strbuf, results[i], STR_CONV_MODE_LEFT_ALIGN, 5);
+ TruncateToFirstWordOnly(strbuf);
+ x = 0xDE - GetStringWidth(2, strbuf, 0);
+ AddTextPrinterParameterized5(windowId, 2, strbuf, x, 20 + (i * 14), TEXT_SPEED_FF, NULL, 0, 0);
+ }
+ PutWindowTilemap(windowId);
+}
+
+static void TruncateToFirstWordOnly(u8 *str)
+{
+ for (;*str != EOS; str++)
+ {
+ if (*str == CHAR_SPACE)
+ {
+ *str = EOS;
+ break;
+ }
+ }
+}
diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c
index 6eff367c5..66bdb9194 100644
--- a/src/pokemon_size_record.c
+++ b/src/pokemon_size_record.c
@@ -3,7 +3,6 @@
#include "event_data.h"
#include "pokedex.h"
#include "pokemon.h"
-#include "pokemon_size_record.h"
#include "string_util.h"
#include "text.h"
#include "strings.h"
diff --git a/src/post_battle_event_funcs.c b/src/post_battle_event_funcs.c
index 112889710..b564e74ce 100644
--- a/src/post_battle_event_funcs.c
+++ b/src/post_battle_event_funcs.c
@@ -8,7 +8,7 @@
#include "constants/flags.h"
#include "constants/spawn_points.h"
-bool8 Special_HallOfFame(void)
+bool8 EnterHallOfFame(void)
{
bool8 ribbonState;
bool8 *r7;
@@ -52,7 +52,7 @@ bool8 Special_HallOfFame(void)
return FALSE;
}
-bool8 sp0C8_whiteout_maybe(void)
+bool8 SetCB2WhiteOut(void)
{
SetMainCallback2(CB2_WhiteOut);
return FALSE;
diff --git a/src/prof_pc.c b/src/prof_pc.c
index d1f06a2ba..c7eed8878 100644
--- a/src/prof_pc.c
+++ b/src/prof_pc.c
@@ -4,24 +4,24 @@
#include "field_message_box.h"
#include "constants/species.h"
-extern const u8 gUnknown_81A6D17[];
-extern const u8 gUnknown_81A6D6D[];
-extern const u8 gUnknown_81A6DDF[];
-extern const u8 gUnknown_81A6E36[];
-extern const u8 gUnknown_81A6EA4[];
-extern const u8 gUnknown_81A6F0B[];
-extern const u8 gUnknown_81A6F71[];
-extern const u8 gUnknown_81A6FAB[];
-extern const u8 gUnknown_81A6FF1[];
-extern const u8 gUnknown_81A7031[];
-extern const u8 gUnknown_81A7063[];
-extern const u8 gUnknown_81A70A5[];
-extern const u8 gUnknown_81A70D8[];
-extern const u8 gUnknown_81A7108[];
-extern const u8 gUnknown_81A7137[];
-extern const u8 gUnknown_81A7175[];
-
-u16 Special_GetPokedexCount(void)
+extern const u8 PokedexRating_Text_LessThan10[];
+extern const u8 PokedexRating_Text_LessThan20[];
+extern const u8 PokedexRating_Text_LessThan30[];
+extern const u8 PokedexRating_Text_LessThan40[];
+extern const u8 PokedexRating_Text_LessThan50[];
+extern const u8 PokedexRating_Text_LessThan60[];
+extern const u8 PokedexRating_Text_LessThan70[];
+extern const u8 PokedexRating_Text_LessThan80[];
+extern const u8 PokedexRating_Text_LessThan90[];
+extern const u8 PokedexRating_Text_LessThan100[];
+extern const u8 PokedexRating_Text_LessThan110[];
+extern const u8 PokedexRating_Text_LessThan120[];
+extern const u8 PokedexRating_Text_LessThan130[];
+extern const u8 PokedexRating_Text_LessThan140[];
+extern const u8 PokedexRating_Text_LessThan150[];
+extern const u8 PokedexRating_Text_Complete[];
+
+u16 GetPokedexCount(void)
{
if (gSpecialVar_0x8004 == 0)
{
@@ -41,68 +41,70 @@ static const u8 *GetProfOaksRatingMessageByCount(u16 count)
gSpecialVar_Result = FALSE;
if (count < 10)
- return gUnknown_81A6D17;
+ return PokedexRating_Text_LessThan10;
if (count < 20)
- return gUnknown_81A6D6D;
+ return PokedexRating_Text_LessThan20;
if (count < 30)
- return gUnknown_81A6DDF;
+ return PokedexRating_Text_LessThan30;
if (count < 40)
- return gUnknown_81A6E36;
+ return PokedexRating_Text_LessThan40;
if (count < 50)
- return gUnknown_81A6EA4;
+ return PokedexRating_Text_LessThan50;
if (count < 60)
- return gUnknown_81A6F0B;
+ return PokedexRating_Text_LessThan60;
if (count < 70)
- return gUnknown_81A6F71;
+ return PokedexRating_Text_LessThan70;
if (count < 80)
- return gUnknown_81A6FAB;
+ return PokedexRating_Text_LessThan80;
if (count < 90)
- return gUnknown_81A6FF1;
+ return PokedexRating_Text_LessThan90;
if (count < 100)
- return gUnknown_81A7031;
+ return PokedexRating_Text_LessThan100;
if (count < 110)
- return gUnknown_81A7063;
+ return PokedexRating_Text_LessThan110;
if (count < 120)
- return gUnknown_81A70A5;
+ return PokedexRating_Text_LessThan120;
if (count < 130)
- return gUnknown_81A70D8;
+ return PokedexRating_Text_LessThan130;
if (count < 140)
- return gUnknown_81A7108;
+ return PokedexRating_Text_LessThan140;
if (count < 150)
- return gUnknown_81A7137;
+ return PokedexRating_Text_LessThan150;
if (count == 150)
{
+ // Mew doesn't count for completing the pokedex
if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_MEW), 1))
- return gUnknown_81A7137;
+ return PokedexRating_Text_LessThan150;
+
gSpecialVar_Result = TRUE;
- return gUnknown_81A7175;
+ return PokedexRating_Text_Complete;
}
if (count == 151)
{
gSpecialVar_Result = TRUE;
- return gUnknown_81A7175;
+ return PokedexRating_Text_Complete;
}
- return gUnknown_81A6D17;
+ return PokedexRating_Text_LessThan10;
}
-void Special_GetProfOaksRatingMessage(void)
+void GetProfOaksRatingMessage(void)
{
ShowFieldMessage(GetProfOaksRatingMessageByCount(gSpecialVar_0x8004));
}
diff --git a/src/quest_log.c b/src/quest_log.c
index a02aea302..91c07223e 100644
--- a/src/quest_log.c
+++ b/src/quest_log.c
@@ -18,10 +18,8 @@
#include "field_fadetransition.h"
#include "field_weather.h"
#include "event_object_movement.h"
-#include "event_object_80688E4.h"
#include "event_object_lock.h"
#include "field_player_avatar.h"
-#include "field_control_avatar.h"
#include "battle.h"
#include "item.h"
#include "region_map.h"
@@ -44,6 +42,7 @@
#include "constants/trainer_classes.h"
#include "constants/species.h"
#include "constants/items.h"
+#include "constants/field_weather.h"
u8 gUnknown_3005E88;
@@ -115,7 +114,7 @@ static EWRAM_DATA u16 *gUnknown_203AE90 = NULL;
static EWRAM_DATA struct UnkStruct_203AE94 gUnknown_203AE94 = {0};
static EWRAM_DATA struct UnkStruct_203AE98 gUnknown_203AE98[32] = {0};
static EWRAM_DATA u16 sQuestLogIdx = 0;
-static EWRAM_DATA u8 gUnknown_203AF9A[64][2] = {{0}};
+static EWRAM_DATA u8 sMovementScripts[64][2] = {{0}};
static EWRAM_DATA u16 gUnknown_203B01A = 0;
static EWRAM_DATA u16 gUnknown_203B01C = 0;
static EWRAM_DATA u16 sFlagOrVarPlayhead = 0;
@@ -154,7 +153,7 @@ static u8 sub_8111BD4(void);
static void DrawQuestLogSceneDescription(void);
static void sub_8111D90(u8);
static void QuestLog_CloseTextWindow(void);
-static void QuestLog_SkipToEndOfPlayback(s8);
+static void QuestLog_SkipToEndOfPlayback(s8 delay);
static void QuestLog_WaitFadeAndCancelPlayback(void);
static bool8 sub_8111F60(void);
static void sub_8111F8C(u8);
@@ -283,133 +282,6 @@ static bool8 sub_81153A8(u16, const u16 *);
static bool8 sub_81153E4(u16, const u16 *);
static void BufferLinkPartnersName(u8 *);
-extern const u8 QuestLog_Text_PreviouslyOnYourQuest[];
-extern const u8 QuestLog_Text_SwitchMon1WithMon2[];
-extern const u8 QuestLog_Text_SwappedHeldItemsOnMon[];
-extern const u8 QuestLog_Text_TookHeldItemFromMon[];
-extern const u8 QuestLog_Text_UsedItemOnMonAtThisLocation[];
-extern const u8 QuestLog_Text_UsedTheItem[];
-extern const u8 QuestLog_Text_UsedTheKeyItem[];
-extern const u8 QuestLog_Text_MonLearnedMoveFromTM[];
-extern const u8 QuestLog_Text_MonReplacedMoveWithTM[];
-extern const u8 QuestLog_Text_MonsWereFullyRestoredAtCenter[];
-extern const u8 QuestLog_Text_PlayerBattledChampionRival[];
-extern const u8 QuestLog_Text_PlayerSentOutMon1RivalSentOutMon2[];
-extern const u8 QuestLog_Text_WonTheMatchAsAResult[];
-extern const u8 QuestLog_Text_StoredItemInPC[];
-extern const u8 QuestLog_Text_WithdrewItemFromPC[];
-extern const u8 QuestLog_Text_TradedMon1ForPersonsMon2[];
-extern const u8 QuestLog_Text_SingleBattleWithPersonResultedInOutcome[];
-extern const u8 QuestLog_Text_DoubleBattleWithPersonResultedInOutcome[];
-extern const u8 QuestLog_Text_MultiBattleWithPeopleResultedInOutcome[];
-extern const u8 QuestLog_Text_Win[];
-extern const u8 QuestLog_Text_Loss[];
-extern const u8 QuestLog_Text_MingledInUnionRoom[];
-extern const u8 QuestLog_Text_DepartedPlaceInTownForNextDestination[];
-extern const u8 QuestLog_Text_SwitchedMonsBetweenBoxes[];
-extern const u8 QuestLog_Text_MovedMonToNewBox[];
-extern const u8 QuestLog_Text_SwitchedMonsWithinBox[];
-extern const u8 QuestLog_Text_MovedMonWithinBox[];
-extern const u8 QuestLog_Text_SwitchedPartyMonForPCMon[];
-extern const u8 QuestLog_Text_WithdrewMonFromPC[];
-extern const u8 QuestLog_Text_DepositedMonInPC[];
-extern const u8 QuestLog_Text_SwitchedMultipleMons[];
-extern const u8 QuestLog_Text_ADifferentSpot[];
-extern const u8 QuestLog_Text_GaveMonHeldItemFromPC[];
-extern const u8 QuestLog_Text_SwappedHeldItemFromPC[];
-extern const u8 QuestLog_Text_ChattedWithManyTrainers[];
-extern const u8 QuestLog_Text_Handily[];
-extern const u8 QuestLog_Text_Tenaciously[];
-extern const u8 QuestLog_Text_Somehow[];
-extern const u8 QuestLog_Text_TradedMon1ForTrainersMon2[];
-extern const u8 QuestLog_Text_BattledTrainerEndedInOutcome[];
-extern const u8 QuestLog_Text_BoughtItem[];
-extern const u8 QuestLog_Text_BoughtItemsIncludingItem[];
-extern const u8 QuestLog_Text_SoldNumOfItem[];
-extern const u8 QuestLog_Text_SoldItemsIncludingItem[];
-extern const u8 QuestLog_Text_JustOne[];
-extern const u8 QuestLog_Text_Num[];
-extern const u8 QuestLog_Text_UsedSoftboiled[];
-extern const u8 QuestLog_Text_UsedMilkDrink[];
-extern const u8 QuestLog_Text_MonLearnedMoveFromHM[];
-extern const u8 QuestLog_Text_MonReplacedMoveWithHM[];
-extern const u8 QuestLog_Text_DefeatedWildMon[];
-extern const u8 QuestLog_Text_DefeatedWildMons[];
-extern const u8 QuestLog_Text_CaughtWildMon[];
-extern const u8 QuestLog_Text_CaughtWildMons[];
-extern const u8 QuestLog_Text_DefeatedWildMonAndCaughtWildMon[];
-extern const u8 QuestLog_Text_DefeatedWildMonAndCaughtWildMons[];
-extern const u8 QuestLog_Text_DefeatedWildMonsAndCaughtWildMon[];
-extern const u8 QuestLog_Text_DefeatedWildMonsAndCaughtWildMons[];
-extern const u8 QuestLog_Text_GaveMonHeldItem[];
-extern const u8 QuestLog_Text_GaveMonHeldItem2[];
-extern const u8 QuestLog_Text_UsedCut[];
-extern const u8 QuestLog_Text_UsedFly[];
-extern const u8 QuestLog_Text_UsedSurf[];
-extern const u8 QuestLog_Text_UsedStrength[];
-extern const u8 QuestLog_Text_UsedFlash[];
-extern const u8 QuestLog_Text_UsedRockSmash[];
-extern const u8 QuestLog_Text_UsedWaterfall[];
-extern const u8 QuestLog_Text_UsedDive[];
-extern const u8 QuestLog_Text_UsedDigInLocation[];
-extern const u8 QuestLog_Text_UsedSweetScent[];
-extern const u8 QuestLog_Text_UsedTeleportToLocation[];
-extern const u8 QuestLog_Text_LeftTownsLocationForNextDestination[];
-extern const u8 QuestLog_Text_PlayedGamesAtGameCorner[];
-extern const u8 QuestLog_Text_RestedAtHome[];
-extern const u8 QuestLog_Text_LeftOaksLab[];
-extern const u8 QuestLog_Text_GymWasFullOfToughTrainers[];
-extern const u8 QuestLog_Text_DepartedGym[];
-extern const u8 QuestLog_Text_HadGreatTimeInSafariZone[];
-extern const u8 QuestLog_Text_ManagedToGetOutOfLocation[];
-extern const u8 QuestLog_Text_TookOnGymLeadersMonWithMonAndWon[];
-extern const u8 QuestLog_Text_TookOnEliteFoursMonWithMonAndWon[];
-extern const u8 QuestLog_Text_TookOnTrainersMonWithMonAndWon[];
-extern const u8 QuestLog_Text_Coolly[];
-extern const u8 QuestLog_Text_Barely[];
-extern const u8 QuestLog_Text_UsedEscapeRope[];
-extern const u8 QuestLog_Text_Draw[];
-extern const u8 QuestLog_Text_DepartedTheLocationForNextDestination[];
-extern const u8 QuestLog_Text_DepartedFromLocationToNextDestination[];
-extern const u8 QuestLog_Text_ObtainedItemInLocation[];
-extern const u8 QuestLog_Text_ArrivedInLocation[];
-extern const u8 QuestLog_Text_SavedGameAtLocation[];
-extern const u8 QuestLog_Text_Home[];
-extern const u8 QuestLog_Text_OakResearchLab[];
-extern const u8 QuestLog_Text_Gym[];
-extern const u8 QuestLog_Text_PokemonLeagueGate[];
-extern const u8 QuestLog_Text_ViridianForest[];
-extern const u8 QuestLog_Text_PewterMuseumOfScience[];
-extern const u8 QuestLog_Text_MtMoon[];
-extern const u8 QuestLog_Text_BikeShop[];
-extern const u8 QuestLog_Text_BillsHouse[];
-extern const u8 QuestLog_Text_DayCare[];
-extern const u8 QuestLog_Text_UndergroundPath[];
-extern const u8 QuestLog_Text_PokemonFanClub[];
-extern const u8 QuestLog_Text_SSAnne[];
-extern const u8 QuestLog_Text_DiglettsCave[];
-extern const u8 QuestLog_Text_RockTunnel[];
-extern const u8 QuestLog_Text_PowerPlant[];
-extern const u8 QuestLog_Text_PokemonTower[];
-extern const u8 QuestLog_Text_VolunteerHouse[];
-extern const u8 QuestLog_Text_NameRatersHouse[];
-extern const u8 QuestLog_Text_CeladonDeptStore[];
-extern const u8 QuestLog_Text_CeladonMansion[];
-extern const u8 QuestLog_Text_RocketGameCorner[];
-extern const u8 QuestLog_Text_Restaurant[];
-extern const u8 QuestLog_Text_RocketHideout[];
-extern const u8 QuestLog_Text_SafariZone[];
-extern const u8 QuestLog_Text_WardensHome[];
-extern const u8 QuestLog_Text_FightingDojo[];
-extern const u8 QuestLog_Text_SilphCo[];
-extern const u8 QuestLog_Text_SeafoamIslands[];
-extern const u8 QuestLog_Text_PokemonMansion[];
-extern const u8 QuestLog_Text_PokemonResearchLab[];
-extern const u8 QuestLog_Text_VictoryRoad[];
-extern const u8 QuestLog_Text_PokemonLeague[];
-extern const u8 QuestLog_Text_CeruleanCave[];
-
-
static const struct WindowTemplate gUnknown_845661C[3] = {
{ 0, 0, 0, 30, 2, 15, 0x0e9 },
{ 0, 0, 18, 30, 2, 15, 0x0ad },
@@ -528,7 +400,7 @@ static void sub_8110A3C(void)
}
}
-void Special_GetQuestLogState(void)
+void GetQuestLogState(void)
{
gSpecialVar_Result = gQuestLogState;
}
@@ -753,7 +625,7 @@ void DrawPreviouslyOnQuestHeader(u8 sceneNum)
FillWindowPixelRect(gUnknown_203ADFE[i], 15, 0, 0, gUnknown_845661C[i].width * 8, gUnknown_845661C[i].height * 8);
}
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_PreviouslyOnYourQuest);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_PreviouslyOnYourQuest);
// Scene numbers count from 4 to 0, 0 being where the player saved
if (sceneNum != 0)
@@ -1049,7 +921,7 @@ static void sub_811175C(u8 sceneNum, struct UnkStruct_203AE98 * a1)
static void sub_81118F4(s8 a0)
{
- FadeScreen(1, a0);
+ FadeScreen(FADE_TO_BLACK, a0);
sQuestLogCB = QuestLog_AdvancePlayhead;
}
@@ -1307,9 +1179,9 @@ static void QuestLog_CloseTextWindow(void)
CopyWindowToVram(gUnknown_203ADFE[1], 1);
}
-static void QuestLog_SkipToEndOfPlayback(s8 a0)
+static void QuestLog_SkipToEndOfPlayback(s8 delay)
{
- FadeScreen(1, a0);
+ FadeScreen(FADE_TO_BLACK, delay);
sQuestLogCB = QuestLog_WaitFadeAndCancelPlayback;
}
@@ -1372,7 +1244,7 @@ static void Task_QuestLogScene_SavedGame(u8 taskId)
if (gUnknown_203AE94.unk_0_6 != 1)
{
GetMapNameGeneric(gStringVar1, gMapHeader.regionMapSectionId);
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_SavedGameAtLocation);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_SavedGameAtLocation);
DrawQuestLogSceneDescription();
}
task->data[0] = 0;
@@ -1553,24 +1425,24 @@ void sub_811246C(struct Sprite *sprite)
struct ObjectEvent *objectEvent = &gObjectEvents[sprite->data[0]];
if (objectEvent->localId == OBJ_EVENT_ID_PLAYER)
{
- if (gUnknown_203AF9A[0][0] != OBJ_EVENT_ID_PLAYER)
+ if (sMovementScripts[0][0] != 0xFF)
{
- ObjectEventSetHeldMovement(objectEvent, gUnknown_203AF9A[0][0]);
- gUnknown_203AF9A[0][0] = OBJ_EVENT_ID_PLAYER;
+ ObjectEventSetHeldMovement(objectEvent, sMovementScripts[0][0]);
+ sMovementScripts[0][0] = 0xFF;
}
- if (gUnknown_203AF9A[0][1] != OBJ_EVENT_ID_PLAYER)
+ if (sMovementScripts[0][1] != OBJ_EVENT_ID_PLAYER)
{
sub_8150454();
- gUnknown_203AF9A[0][1] = OBJ_EVENT_ID_PLAYER;
+ sMovementScripts[0][1] = OBJ_EVENT_ID_PLAYER;
}
sub_8063E28(objectEvent, sprite);
}
else
{
- if (gUnknown_203AF9A[objectEvent->localId][0] != OBJ_EVENT_ID_PLAYER)
+ if (sMovementScripts[objectEvent->localId][0] != 0xFF)
{
- ObjectEventSetHeldMovement(objectEvent, gUnknown_203AF9A[objectEvent->localId][0]);
- gUnknown_203AF9A[objectEvent->localId][0] = OBJ_EVENT_ID_PLAYER;
+ ObjectEventSetHeldMovement(objectEvent, sMovementScripts[objectEvent->localId][0]);
+ sMovementScripts[objectEvent->localId][0] = 0xFF;
}
sub_8063E28(objectEvent, sprite);
}
@@ -1738,15 +1610,15 @@ static void sub_8112940(u8 a0, struct UnkStruct_203AE98 *a1, u16 a2)
sNumQuestLogs = a2 / 8;
for (i = 0; i < 0x40; i++)
{
- gUnknown_203AF9A[i][0] |= 0xFF;
- gUnknown_203AF9A[i][1] |= 0xFF;
+ sMovementScripts[i][0] |= 0xFF;
+ sMovementScripts[i][1] |= 0xFF;
}
sQuestLogIdx = 0;
gUnknown_203B01C = 0;
gUnknown_3005E90 = (struct UnkStruct_3005E90){};
gUnknown_203B01A = gUnknown_3005E94[sQuestLogIdx].unk_4;
- gUnknown_203AF9A[0][0] = gUnknown_3005E94[sQuestLogIdx].unk_3;
- gUnknown_203AF9A[0][1] = 0xFF;
+ sMovementScripts[0][0] = gUnknown_3005E94[sQuestLogIdx].unk_3;
+ sMovementScripts[0][1] = 0xFF;
gUnknown_3005E88 = 1;
break;
case 2:
@@ -1809,10 +1681,10 @@ void sub_8112B3C(void)
switch (gUnknown_3005E94[sQuestLogIdx].unk_6)
{
case 0:
- gUnknown_203AF9A[gUnknown_3005E94[sQuestLogIdx].unk_0][0] = gUnknown_3005E94[sQuestLogIdx].unk_3;
+ sMovementScripts[gUnknown_3005E94[sQuestLogIdx].unk_0][0] = gUnknown_3005E94[sQuestLogIdx].unk_3;
break;
case 1:
- gUnknown_203AF9A[gUnknown_3005E94[sQuestLogIdx].unk_0][1] = gUnknown_3005E94[sQuestLogIdx].unk_3;
+ sMovementScripts[gUnknown_3005E94[sQuestLogIdx].unk_0][1] = gUnknown_3005E94[sQuestLogIdx].unk_3;
break;
case 2:
*(u32 *)&gUnknown_3005E90 = ((gUnknown_3005E94[sQuestLogIdx].unk_3 << 24) | (gUnknown_3005E94[sQuestLogIdx].unk_2 << 16) | (gUnknown_3005E94[sQuestLogIdx].unk_1 << 8) | (gUnknown_3005E94[sQuestLogIdx].unk_0 << 0));
@@ -2153,7 +2025,7 @@ void ResetTrainerFanClub(void)
VarSet(VAR_FANCLUB_LOSE_FAN_TIMER, 0);
}
-void Special_TryLoseFansFromPlayTimeAfterLinkBattle(void)
+void Script_TryLoseFansFromPlayTimeAfterLinkBattle(void)
{
TryLoseFansFromPlayTimeAfterLinkBattle(TRAINER_FAN_CLUB);
}
@@ -2167,7 +2039,7 @@ static void TryLoseFansFromPlayTimeAfterLinkBattle(struct TrainerFanClub *fanClu
}
}
-void Special_UpdateTrainerFanClubGameClear(void)
+void Script_UpdateTrainerFanClubGameClear(void)
{
UpdateTrainerFanClubGameClear(TRAINER_FAN_CLUB);
}
@@ -2284,7 +2156,7 @@ static u8 PlayerLoseRandomTrainerFan(struct TrainerFanClub *fanClub)
return sFanClubMemberIds[idx];
}
-u16 Special_GetNumFansOfPlayerInTrainerFanClub(void)
+u16 Script_GetNumFansOfPlayerInTrainerFanClub(void)
{
return GetNumFansOfPlayerInTrainerFanClub(TRAINER_FAN_CLUB);
}
@@ -2303,7 +2175,7 @@ static u16 GetNumFansOfPlayerInTrainerFanClub(struct TrainerFanClub *fanClub)
return count;
}
-void Special_TryLoseFansFromPlayTime(void)
+void Script_TryLoseFansFromPlayTime(void)
{
TryLoseFansFromPlayTime(TRAINER_FAN_CLUB);
}
@@ -2337,7 +2209,7 @@ static void TryLoseFansFromPlayTime(struct TrainerFanClub *fanClub)
}
}
-bool16 Special_IsFanClubMemberFanOfPlayer(void)
+bool16 Script_IsFanClubMemberFanOfPlayer(void)
{
return IsFanClubMemberFanOfPlayer(TRAINER_FAN_CLUB);
}
@@ -2354,7 +2226,7 @@ static void SetInitialFansOfPlayer(struct TrainerFanClub *fanClub)
SET_TRAINER_FAN_CLUB_FLAG(FANCLUB_MEMBER3);
}
-void Special_BufferFanClubTrainerName(void)
+void Script_BufferFanClubTrainerName(void)
{
u8 whichLinkTrainer = 0;
u8 whichNPCTrainer = 0;
@@ -2448,7 +2320,7 @@ static bool8 DidPlayerGetFirstFans(struct TrainerFanClub *fanClub)
return fanClub->gotInitialFans;
}
-void Special_SetPlayerGotFirstFans(void)
+void Script_SetPlayerGotFirstFans(void)
{
SetPlayerGotFirstFans(TRAINER_FAN_CLUB);
}
@@ -2458,7 +2330,7 @@ static void SetPlayerGotFirstFans(struct TrainerFanClub *fanClub)
fanClub->gotInitialFans = TRUE;
}
-u8 Special_TryGainNewFanFromCounter(void)
+u8 Script_TryGainNewFanFromCounter(void)
{
return TryGainNewFanFromCounter(TRAINER_FAN_CLUB, gSpecialVar_0x8004);
}
@@ -2602,18 +2474,18 @@ void SetQuestLogEvent(u16 eventId, const u16 *eventData)
static bool8 InQuestLogDisabledLocation(void)
{
// In Trainer Tower
- if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER_1F)
- && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_1F)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_2F)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_3F)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_4F)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_5F)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_6F)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_7F)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_8F)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_ROOF)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_LOBBY)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_ELEVATOR)))
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_TOWER_1F)
+ && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_1F)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_2F)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_3F)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_4F)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_5F)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_6F)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_7F)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_8F)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ROOF)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_LOBBY)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ELEVATOR)))
return TRUE;
// In pokemon trainer fan club
@@ -2629,7 +2501,7 @@ static bool8 InQuestLogDisabledLocation(void)
// In elevator
if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROCKET_HIDEOUT_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROCKET_HIDEOUT_ELEVATOR))
|| (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SILPH_CO_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SILPH_CO_ELEVATOR))
- || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_ELEVATOR))
+ || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_TOWER_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ELEVATOR))
|| (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(CELADON_CITY_DEPARTMENT_STORE_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_ELEVATOR)))
return TRUE;
@@ -2763,7 +2635,7 @@ static bool8 TrySetTrainerBattleQuestLogEvent(u16 eventId, const u16 *eventData)
return FALSE;
sub_81138F8();
- if (gUnknown_3005E88 || FlagGet(FLAG_SYS_GAME_CLEAR) || sub_81137E4(eventId, eventData) != TRUE)
+ if (gUnknown_3005E88 != 0 || FlagGet(FLAG_SYS_GAME_CLEAR) || sub_81137E4(eventId, eventData) != TRUE)
{
gUnknown_203B024.unk_00 = eventId;
memcpy(gUnknown_203B024.unk_04, eventData, 8);
@@ -3172,7 +3044,7 @@ static const u16 *BufferQuestLogText_SwitchedPartyOrder(const u16 *eventData)
const u16 *r4 = sub_8113E88(QL_EVENT_SWITCHED_PARTY_ORDER, eventData);
QuestLog_GetSpeciesName(r4[0], gStringVar1, 0);
QuestLog_GetSpeciesName(r4[1], gStringVar2, 0);
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_SwitchMon1WithMon2);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchMon1WithMon2);
r4 += 2;
return r4;
}
@@ -3206,21 +3078,21 @@ static const u16 *BufferQuestLogText_UsedItem(const u16 *eventData)
if (r5[0] == ITEM_ESCAPE_ROPE)
{
GetMapNameGeneric(gStringVar2, (u8)r5[2]);
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_UsedEscapeRope);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedEscapeRope);
}
else if (r5[1] != 0xFFFF)
{
QuestLog_GetSpeciesName(r5[1], gStringVar2, 0);
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_UsedItemOnMonAtThisLocation);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedItemOnMonAtThisLocation);
}
else
{
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_UsedTheItem);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedTheItem);
}
break;
case POCKET_KEY_ITEMS:
StringCopy(gStringVar1, ItemId_GetName(r5[0]));
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_UsedTheKeyItem);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_UsedTheKeyItem);
break;
case POCKET_TM_CASE:
QuestLog_GetSpeciesName(r5[1], gStringVar1, 0);
@@ -3229,16 +3101,16 @@ static const u16 *BufferQuestLogText_UsedItem(const u16 *eventData)
{
StringCopy(gStringVar3, gMoveNames[r5[2]]);
if (r5[0] > ITEM_TM50)
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_MonReplacedMoveWithHM);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonReplacedMoveWithHM);
else
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_MonReplacedMoveWithTM);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonReplacedMoveWithTM);
}
else
{
if (r5[0] > ITEM_TM50)
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_MonLearnedMoveFromHM);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonLearnedMoveFromHM);
else
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_MonLearnedMoveFromTM);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonLearnedMoveFromTM);
}
break;
}
@@ -3266,7 +3138,7 @@ static const u16 *BufferQuestLogText_GaveHeldItemFromPartyMenu(const u16 *eventD
const u16 *r4 = sub_8113E88(QL_EVENT_GAVE_HELD_ITEM, eventData);
QuestLog_GetSpeciesName(r4[1], gStringVar1, 0);
StringCopy(gStringVar2, ItemId_GetName(r4[0]));
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_GaveMonHeldItem);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_GaveMonHeldItem);
r4 += 2;
return r4;
}
@@ -3281,7 +3153,7 @@ static const u16 *BufferQuestLogText_GaveHeldItemFromBagMenu(const u16 *eventDat
const u16 *r4 = sub_8113E88(QL_EVENT_GAVE_HELD_ITEM_BAG, eventData);
QuestLog_GetSpeciesName(r4[1], gStringVar1, 0);
StringCopy(gStringVar2, ItemId_GetName(r4[0]));
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_GaveMonHeldItem2);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_GaveMonHeldItem2);
r4 += 2;
return r4;
}
@@ -3297,7 +3169,7 @@ static const u16 *BufferQuestLogText_GaveHeldItemFromPC(const u16 *eventData)
QuestLog_GetSpeciesName(r4[1], gStringVar2, 0);
StringCopy(gStringVar1, ItemId_GetName(r4[0]));
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_GaveMonHeldItemFromPC);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_GaveMonHeldItemFromPC);
r4 += 2;
return r4;
}
@@ -3313,7 +3185,7 @@ static const u16 *BufferQuestLogText_TookHeldItem(const u16 *eventData)
QuestLog_GetSpeciesName(r4[1], gStringVar1, 0);
StringCopy(gStringVar2, ItemId_GetName(r4[0]));
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_TookHeldItemFromMon);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_TookHeldItemFromMon);
r4 += 2;
return r4;
}
@@ -3341,7 +3213,7 @@ static const u16 *BufferQuestLogText_SwappedHeldItem(const u16 *eventData)
QuestLog_GetSpeciesName(r4[2], gStringVar1, 0);
StringCopy(gStringVar2, ItemId_GetName(r4[0])); // Item taken
StringCopy(gStringVar3, ItemId_GetName(r4[1])); // Item given
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_SwappedHeldItemsOnMon);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_SwappedHeldItemsOnMon);
r4 += 3;
return r4;
}
@@ -3357,7 +3229,7 @@ static const u16 *BufferQuestLogText_SwappedHeldItemFromPC(const u16 *eventData)
QuestLog_GetSpeciesName(r4[2], gStringVar2, 0);
StringCopy(gStringVar3, ItemId_GetName(r4[0]));
StringCopy(gStringVar1, ItemId_GetName(r4[1]));
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_SwappedHeldItemFromPC);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_SwappedHeldItemFromPC);
r4 += 3;
return r4;
}
@@ -3378,7 +3250,7 @@ static u16 *BufferQuestLogData_UsedPkmnCenter(u16 *a0, const u16 *eventData)
static const u16 *BufferQuestLogText_UsedPkmnCenter(const u16 *a0)
{
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_MonsWereFullyRestoredAtCenter);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_MonsWereFullyRestoredAtCenter);
a0 += 2;
return a0;
}
@@ -3407,27 +3279,27 @@ static const u16 *BufferQuestLogText_LinkTraded(const u16 *a0)
BufferLinkPartnersName(gStringVar1);
QuestLog_GetSpeciesName(a0[3], gStringVar2, 0); // Mon received
QuestLog_GetSpeciesName(a0[2], gStringVar3, 0); // Mon sent
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_TradedMon1ForPersonsMon2);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_TradedMon1ForPersonsMon2);
r6 += 4;
return r6;
}
static const u8 *const sDefeatedOpponentFlavorTexts[] = {
- QuestLog_Text_Handily,
- QuestLog_Text_Tenaciously,
- QuestLog_Text_Somehow
+ gText_QuestLog_Handily,
+ gText_QuestLog_Tenaciously,
+ gText_QuestLog_Somehow
};
static const u8 *const sDefeatedChampionFlavorTexts[] = {
- QuestLog_Text_Coolly,
- QuestLog_Text_Somehow,
- QuestLog_Text_Barely
+ gText_QuestLog_Coolly,
+ gText_QuestLog_Somehow,
+ gText_QuestLog_Barely
};
static const u8 *const sBattleOutcomeTexts[] = {
- QuestLog_Text_Win,
- QuestLog_Text_Loss,
- QuestLog_Text_Draw
+ gText_QuestLog_Win,
+ gText_QuestLog_Loss,
+ gText_QuestLog_Draw
};
static u16 *BufferQuestLogData_LinkBattledSingle(u16 *a0, const u16 *eventData)
@@ -3449,7 +3321,7 @@ static const u16 *BufferQuestLogText_LinkBattledSingle(const u16 *a0)
BufferLinkPartnersName(gStringVar1);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sBattleOutcomeTexts[((const u8 *)a0)[4]]);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_SingleBattleWithPersonResultedInOutcome);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SingleBattleWithPersonResultedInOutcome);
a0 += 6;
return a0;
}
@@ -3473,7 +3345,7 @@ static const u16 *BufferQuestLogText_LinkBattledDouble(const u16 *a0)
BufferLinkPartnersName(gStringVar1);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sBattleOutcomeTexts[((const u8 *)a0)[4]]);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_DoubleBattleWithPersonResultedInOutcome);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DoubleBattleWithPersonResultedInOutcome);
a0 += 6;
return a0;
}
@@ -3508,7 +3380,7 @@ static const u16 *BufferQuestLogText_LinkBattledMulti(const u16 *a0)
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2); // opponent 1
DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gStringVar3); // opponent 2
DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, sBattleOutcomeTexts[((const u8 *)a0)[4]]);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_MultiBattleWithPeopleResultedInOutcome);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_MultiBattleWithPeopleResultedInOutcome);
a0 += 13;
return a0;
}
@@ -3522,7 +3394,7 @@ static u16 *BufferQuestLogData_UsedUnionRoom(u16 *a0, const u16 *eventData)
static const u16 *BufferQuestLogText_UsedUnionRoom(const u16 *a0)
{
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_MingledInUnionRoom);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_MingledInUnionRoom);
a0 += 2;
return a0;
}
@@ -3536,7 +3408,7 @@ static u16 *BufferQuestLogData_UsedUnionRoomChat(u16 *a0, const u16 *eventData)
static const u16 *BufferQuestLogText_UsedUnionRoomChat(const u16 *a0)
{
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_ChattedWithManyTrainers);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_ChattedWithManyTrainers);
a0 += 2;
return a0;
}
@@ -3561,7 +3433,7 @@ static const u16 *BufferQuestLogText_LinkTradedUnionRoom(const u16 *a0)
BufferLinkPartnersName(gStringVar1);
QuestLog_GetSpeciesName(a0[3], gStringVar2, 0);
QuestLog_GetSpeciesName(a0[2], gStringVar3, 0);
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_TradedMon1ForTrainersMon2);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_TradedMon1ForTrainersMon2);
r6 += 8;
return (const u16 *)r6;
}
@@ -3582,7 +3454,7 @@ static const u16 *BufferQuestLogText_LinkBattledUnionRoom(const u16 *a0)
memcpy(gStringVar1, (const u8 *)a0 + 5, PLAYER_NAME_LENGTH);
BufferLinkPartnersName(gStringVar1);
StringCopy(gStringVar2, sBattleOutcomeTexts[*(const u8 *)&a0[2]]);
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_BattledTrainerEndedInOutcome);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_BattledTrainerEndedInOutcome);
a0 += 6;
return a0;
}
@@ -3609,7 +3481,7 @@ static const u16 *BufferQuestLogText_SwitchedMonsBetweenBoxes(const u16 *eventDa
QuestLog_GetSpeciesName(eventData[0], NULL, 1);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, GetBoxNamePtr(boxIdxs[1]));
QuestLog_GetSpeciesName(eventData[1], NULL, 3);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_SwitchedMonsBetweenBoxes);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedMonsBetweenBoxes);
return eventData + 3;
}
@@ -3633,7 +3505,7 @@ static const u16 *BufferQuestLogText_SwitchedMonsWithinBox(const u16 *eventData)
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));
QuestLog_GetSpeciesName(eventData[0], NULL, 1);
QuestLog_GetSpeciesName(eventData[1], NULL, 2);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_SwitchedMonsWithinBox);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedMonsWithinBox);
return eventData + 3;
}
@@ -3669,7 +3541,7 @@ static const u16 *BufferQuestLogText_SwitchedPartyMonForPCMon(const u16 *eventDa
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));
QuestLog_GetSpeciesName(eventData[0], NULL, 1);
QuestLog_GetSpeciesName(eventData[1], NULL, 2);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_SwitchedPartyMonForPCMon);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedPartyMonForPCMon);
return eventData + 3;
}
@@ -3696,7 +3568,7 @@ static const u16 *BufferQuestLogText_MovedMonBetweenBoxes(const u16 *eventData)
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));
QuestLog_GetSpeciesName(eventData[0], NULL, 1);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, GetBoxNamePtr(boxIdxs[1]));
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_MovedMonToNewBox);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_MovedMonToNewBox);
return (const u16 *)boxIdxs + 1;
}
@@ -3719,7 +3591,7 @@ static const u16 *BufferQuestLogText_MovedMonWithinBox(const u16 *eventData)
DynamicPlaceholderTextUtil_Reset();
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));
QuestLog_GetSpeciesName(eventData[0], NULL, 1);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_MovedMonWithinBox);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_MovedMonWithinBox);
return (const u16 *)boxIdxs + 1;
}
@@ -3742,7 +3614,7 @@ static const u16 *BufferQuestLogText_WithdrewMonFromPC(const u16 *eventData)
DynamicPlaceholderTextUtil_Reset();
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));
QuestLog_GetSpeciesName(eventData[0], NULL, 1);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_WithdrewMonFromPC);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_WithdrewMonFromPC);
return (const u16 *)boxIdxs + 1;
}
@@ -3765,7 +3637,7 @@ static const u16 *BufferQuestLogText_DepositedMonInPC(const u16 *eventData)
DynamicPlaceholderTextUtil_Reset();
QuestLog_GetSpeciesName(eventData[0], NULL, 0);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetBoxNamePtr(boxIdxs[0]));
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_DepositedMonInPC);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DepositedMonInPC);
return (const u16 *)boxIdxs + 1;
}
@@ -3786,10 +3658,10 @@ static const u16 *BufferQuestLogText_SwitchedMultipleMons(const u16 *eventData)
DynamicPlaceholderTextUtil_Reset();
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(*((const u8 *)r4 + 0)));
if (*((const u8 *)r4 + 0) == *((const u8 *)r4 + 1))
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, QuestLog_Text_ADifferentSpot);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gText_QuestLog_ADifferentSpot);
else
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetBoxNamePtr(*((const u8 *)r4 + 1)));
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_SwitchedMultipleMons);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SwitchedMultipleMons);
return r4 + 1;
}
@@ -3806,7 +3678,7 @@ static const u16 *BufferQuestLogText_DepositedItemInPC(const u16 *eventData)
{
const u16 *r4 = sub_8113E88(QL_EVENT_DEPOSITED_ITEM_PC, eventData);
CopyItemName(r4[0], gStringVar1);
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_StoredItemInPC);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_StoredItemInPC);
return r4 + 1;
}
@@ -3823,7 +3695,7 @@ static const u16 *BufferQuestLogText_WithdrewItemFromPC(const u16 *eventData)
{
const u16 *r4 = sub_8113E88(QL_EVENT_WITHDREW_ITEM_PC, eventData);
CopyItemName(r4[0], gStringVar1);
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_WithdrewItemFromPC);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_WithdrewItemFromPC);
return r4 + 1;
}
@@ -3858,7 +3730,7 @@ static const u16 *BufferQuestLogText_DefeatedGymLeader(const u16 *eventData)
QuestLog_GetSpeciesName(eventData[0], 0, 2);
QuestLog_GetSpeciesName(eventData[1], 0, 3);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, sDefeatedOpponentFlavorTexts[r6[1]]);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_TookOnGymLeadersMonWithMonAndWon);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_TookOnGymLeadersMonWithMonAndWon);
return eventData + 4;
}
@@ -3905,30 +3777,30 @@ static const u16 *BufferQuestLogText_DefeatedWildMon(const u16 *a0)
if (data[0] == 0)
{
if (data[1] == 1)
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_CaughtWildMon);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_CaughtWildMon);
else
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_CaughtWildMons);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_CaughtWildMons);
}
else if (data[1] == 0)
{
if (data[0] == 1)
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_DefeatedWildMon);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMon);
else
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_DefeatedWildMons);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMons);
}
else if (data[0] == 1)
{
if (data[1] == 1)
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_DefeatedWildMonAndCaughtWildMon);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonAndCaughtWildMon);
else
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_DefeatedWildMonAndCaughtWildMons);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonAndCaughtWildMons);
}
else
{
if (data[1] == 1)
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_DefeatedWildMonsAndCaughtWildMon);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonsAndCaughtWildMon);
else
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_DefeatedWildMonsAndCaughtWildMons);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_DefeatedWildMonsAndCaughtWildMons);
}
return (const u16 *)(data + 4);
}
@@ -3966,7 +3838,7 @@ static const u16 *BufferQuestLogText_DefeatedEliteFourMember(const u16 *eventDat
QuestLog_GetSpeciesName(eventData[0], NULL, 1);
QuestLog_GetSpeciesName(eventData[1], NULL, 2);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, sDefeatedOpponentFlavorTexts[r5[1]]);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_TookOnEliteFoursMonWithMonAndWon);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_TookOnEliteFoursMonWithMonAndWon);
return eventData + 4;
}
@@ -3997,18 +3869,18 @@ static const u16 *BufferQuestLogText_DefeatedChampion(const u16 *a0)
case 0:
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gSaveBlock1Ptr->rivalName);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_PlayerBattledChampionRival);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_PlayerBattledChampionRival);
break;
case 1:
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock1Ptr->rivalName);
QuestLog_GetSpeciesName(a0[2], NULL, 1);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gSaveBlock2Ptr->playerName);
QuestLog_GetSpeciesName(a0[3], NULL, 3);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_PlayerSentOutMon1RivalSentOutMon2);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_PlayerSentOutMon1RivalSentOutMon2);
break;
case 2:
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sDefeatedChampionFlavorTexts[r5[0]]);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_WonTheMatchAsAResult);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_WonTheMatchAsAResult);
break;
}
return (const u16 *)(r5 + 2);
@@ -4038,77 +3910,77 @@ static const u16 *BufferQuestLogText_DefeatedTrainer(const u16 *eventData)
QuestLog_GetSpeciesName(r5[0], NULL, 2);
QuestLog_GetSpeciesName(r5[1], NULL, 3);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, sDefeatedOpponentFlavorTexts[r6[1]]);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_TookOnTrainersMonWithMonAndWon);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_TookOnTrainersMonWithMonAndWon);
return (const u16 *)(r6 + 2);
}
static const u8 *const sLocationNameTexts[] =
{
- [QL_LOCATION_HOME] = QuestLog_Text_Home,
- [QL_LOCATION_OAKS_LAB] = QuestLog_Text_OakResearchLab,
- [QL_LOCATION_VIRIDIAN_GYM] = QuestLog_Text_Gym,
- [QL_LOCATION_LEAGUE_GATE_1] = QuestLog_Text_PokemonLeagueGate,
- [QL_LOCATION_LEAGUE_GATE_2] = QuestLog_Text_PokemonLeagueGate,
- [QL_LOCATION_VIRIDIAN_FOREST_1] = QuestLog_Text_ViridianForest,
- [QL_LOCATION_VIRIDIAN_FOREST_2] = QuestLog_Text_ViridianForest,
- [QL_LOCATION_PEWTER_MUSEUM] = QuestLog_Text_PewterMuseumOfScience,
- [QL_LOCATION_PEWTER_GYM] = QuestLog_Text_Gym,
- [QL_LOCATION_MT_MOON_1] = QuestLog_Text_MtMoon,
- [QL_LOCATION_MT_MOON_2] = QuestLog_Text_MtMoon,
- [QL_LOCATION_CERULEAN_GYM] = QuestLog_Text_Gym,
- [QL_LOCATION_BIKE_SHOP] = QuestLog_Text_BikeShop,
- [QL_LOCATION_BILLS_HOUSE] = QuestLog_Text_BillsHouse,
- [QL_LOCATION_DAY_CARE] = QuestLog_Text_DayCare,
- [QL_LOCATION_UNDERGROUND_PATH_1] = QuestLog_Text_UndergroundPath,
- [QL_LOCATION_UNDERGROUND_PATH_2] = QuestLog_Text_UndergroundPath,
- [QL_LOCATION_PKMN_FAN_CLUB] = QuestLog_Text_PokemonFanClub,
- [QL_LOCATION_VERMILION_GYM] = QuestLog_Text_Gym,
- [QL_LOCATION_SS_ANNE] = QuestLog_Text_SSAnne,
- [QL_LOCATION_DIGLETTS_CAVE_1] = QuestLog_Text_DiglettsCave,
- [QL_LOCATION_DIGLETTS_CAVE_2] = QuestLog_Text_DiglettsCave,
- [QL_LOCATION_ROCK_TUNNEL_1] = QuestLog_Text_RockTunnel,
- [QL_LOCATION_ROCK_TUNNEL_2] = QuestLog_Text_RockTunnel,
- [QL_LOCATION_POWER_PLANT] = QuestLog_Text_PowerPlant,
- [QL_LOCATION_PKMN_TOWER] = QuestLog_Text_PokemonTower,
- [QL_LOCATION_VOLUNTEER_HOUSE] = QuestLog_Text_VolunteerHouse,
- [QL_LOCATION_NAME_RATERS_HOUSE] = QuestLog_Text_NameRatersHouse,
- [QL_LOCATION_UNDERGROUND_PATH_3] = QuestLog_Text_UndergroundPath,
- [QL_LOCATION_UNDERGROUND_PATH_4] = QuestLog_Text_UndergroundPath,
- [QL_LOCATION_CELADON_DEPT_STORE] = QuestLog_Text_CeladonDeptStore,
- [QL_LOCATION_CELADON_MANSION] = QuestLog_Text_CeladonMansion,
- [QL_LOCATION_GAME_CORNER] = QuestLog_Text_RocketGameCorner,
- [QL_LOCATION_CELADON_GYM] = QuestLog_Text_Gym,
- [QL_LOCATION_CELADON_RESTAURANT] = QuestLog_Text_Restaurant,
- [QL_LOCATION_ROCKET_HIDEOUT] = QuestLog_Text_RocketHideout,
- [QL_LOCATION_SAFARI_ZONE] = QuestLog_Text_SafariZone,
- [QL_LOCATION_FUCHSIA_GYM] = QuestLog_Text_Gym,
- [QL_LOCATION_WARDENS_HOME] = QuestLog_Text_WardensHome,
- [QL_LOCATION_FIGHTING_DOJO] = QuestLog_Text_FightingDojo,
- [QL_LOCATION_SAFFRON_GYM] = QuestLog_Text_Gym,
- [QL_LOCATION_SILPH_CO] = QuestLog_Text_SilphCo,
- [QL_LOCATION_SEAFOAM_ISLANDS_1] = QuestLog_Text_SeafoamIslands,
- [QL_LOCATION_SEAFOAM_ISLANDS_2] = QuestLog_Text_SeafoamIslands,
- [QL_LOCATION_PKMN_MANSION] = QuestLog_Text_PokemonMansion,
- [QL_LOCATION_CINNABAR_GYM] = QuestLog_Text_Gym,
- [QL_LOCATION_CINNABAR_LAB] = QuestLog_Text_PokemonResearchLab,
- [QL_LOCATION_VICTORY_ROAD_1] = QuestLog_Text_VictoryRoad,
- [QL_LOCATION_VICTORY_ROAD_2] = QuestLog_Text_VictoryRoad,
- [QL_LOCATION_PKMN_LEAGUE] = QuestLog_Text_PokemonLeague,
- [QL_LOCATION_CERULEAN_CAVE] = QuestLog_Text_CeruleanCave
+ [QL_LOCATION_HOME] = gText_QuestLog_Home,
+ [QL_LOCATION_OAKS_LAB] = gText_QuestLog_OakResearchLab,
+ [QL_LOCATION_VIRIDIAN_GYM] = gText_QuestLog_Gym,
+ [QL_LOCATION_LEAGUE_GATE_1] = gText_QuestLog_PokemonLeagueGate,
+ [QL_LOCATION_LEAGUE_GATE_2] = gText_QuestLog_PokemonLeagueGate,
+ [QL_LOCATION_VIRIDIAN_FOREST_1] = gText_QuestLog_ViridianForest,
+ [QL_LOCATION_VIRIDIAN_FOREST_2] = gText_QuestLog_ViridianForest,
+ [QL_LOCATION_PEWTER_MUSEUM] = gText_QuestLog_PewterMuseumOfScience,
+ [QL_LOCATION_PEWTER_GYM] = gText_QuestLog_Gym,
+ [QL_LOCATION_MT_MOON_1] = gText_QuestLog_MtMoon,
+ [QL_LOCATION_MT_MOON_2] = gText_QuestLog_MtMoon,
+ [QL_LOCATION_CERULEAN_GYM] = gText_QuestLog_Gym,
+ [QL_LOCATION_BIKE_SHOP] = gText_QuestLog_BikeShop,
+ [QL_LOCATION_BILLS_HOUSE] = gText_QuestLog_BillsHouse,
+ [QL_LOCATION_DAY_CARE] = gText_QuestLog_DayCare,
+ [QL_LOCATION_UNDERGROUND_PATH_1] = gText_QuestLog_UndergroundPath,
+ [QL_LOCATION_UNDERGROUND_PATH_2] = gText_QuestLog_UndergroundPath,
+ [QL_LOCATION_PKMN_FAN_CLUB] = gText_QuestLog_PokemonFanClub,
+ [QL_LOCATION_VERMILION_GYM] = gText_QuestLog_Gym,
+ [QL_LOCATION_SS_ANNE] = gText_QuestLog_SSAnne,
+ [QL_LOCATION_DIGLETTS_CAVE_1] = gText_QuestLog_DiglettsCave,
+ [QL_LOCATION_DIGLETTS_CAVE_2] = gText_QuestLog_DiglettsCave,
+ [QL_LOCATION_ROCK_TUNNEL_1] = gText_QuestLog_RockTunnel,
+ [QL_LOCATION_ROCK_TUNNEL_2] = gText_QuestLog_RockTunnel,
+ [QL_LOCATION_POWER_PLANT] = gText_QuestLog_PowerPlant,
+ [QL_LOCATION_PKMN_TOWER] = gText_QuestLog_PokemonTower,
+ [QL_LOCATION_VOLUNTEER_HOUSE] = gText_QuestLog_VolunteerHouse,
+ [QL_LOCATION_NAME_RATERS_HOUSE] = gText_QuestLog_NameRatersHouse,
+ [QL_LOCATION_UNDERGROUND_PATH_3] = gText_QuestLog_UndergroundPath,
+ [QL_LOCATION_UNDERGROUND_PATH_4] = gText_QuestLog_UndergroundPath,
+ [QL_LOCATION_CELADON_DEPT_STORE] = gText_QuestLog_CeladonDeptStore,
+ [QL_LOCATION_CELADON_MANSION] = gText_QuestLog_CeladonMansion,
+ [QL_LOCATION_GAME_CORNER] = gText_QuestLog_RocketGameCorner,
+ [QL_LOCATION_CELADON_GYM] = gText_QuestLog_Gym,
+ [QL_LOCATION_CELADON_RESTAURANT] = gText_QuestLog_Restaurant,
+ [QL_LOCATION_ROCKET_HIDEOUT] = gText_QuestLog_RocketHideout,
+ [QL_LOCATION_SAFARI_ZONE] = gText_QuestLog_SafariZone,
+ [QL_LOCATION_FUCHSIA_GYM] = gText_QuestLog_Gym,
+ [QL_LOCATION_WARDENS_HOME] = gText_QuestLog_WardensHome,
+ [QL_LOCATION_FIGHTING_DOJO] = gText_QuestLog_FightingDojo,
+ [QL_LOCATION_SAFFRON_GYM] = gText_QuestLog_Gym,
+ [QL_LOCATION_SILPH_CO] = gText_QuestLog_SilphCo,
+ [QL_LOCATION_SEAFOAM_ISLANDS_1] = gText_QuestLog_SeafoamIslands,
+ [QL_LOCATION_SEAFOAM_ISLANDS_2] = gText_QuestLog_SeafoamIslands,
+ [QL_LOCATION_PKMN_MANSION] = gText_QuestLog_PokemonMansion,
+ [QL_LOCATION_CINNABAR_GYM] = gText_QuestLog_Gym,
+ [QL_LOCATION_CINNABAR_LAB] = gText_QuestLog_PokemonResearchLab,
+ [QL_LOCATION_VICTORY_ROAD_1] = gText_QuestLog_VictoryRoad,
+ [QL_LOCATION_VICTORY_ROAD_2] = gText_QuestLog_VictoryRoad,
+ [QL_LOCATION_PKMN_LEAGUE] = gText_QuestLog_PokemonLeague,
+ [QL_LOCATION_CERULEAN_CAVE] = gText_QuestLog_CeruleanCave
};
static const u8 *const sDepartedLocationTexts[] =
{
- [QL_DEPARTED_TOWN_BUILDING] = QuestLog_Text_DepartedPlaceInTownForNextDestination,
- [QL_DEPARTED_MUSEUM] = QuestLog_Text_LeftTownsLocationForNextDestination,
- [QL_DEPARTED_GAME_CORNER] = QuestLog_Text_PlayedGamesAtGameCorner,
- [QL_DEPARTED_HOME] = QuestLog_Text_RestedAtHome,
- [QL_DEPARTED_OAKS_LAB] = QuestLog_Text_LeftOaksLab,
- [QL_DEPARTED_GYM] = QuestLog_Text_GymWasFullOfToughTrainers,
- [QL_DEPARTED_SAFARI_ZONE] = QuestLog_Text_HadGreatTimeInSafariZone,
- [QL_DEPARTED_CAVE] = QuestLog_Text_ManagedToGetOutOfLocation,
- [QL_DEPARTED_MISC_BUILDING_1] = QuestLog_Text_DepartedTheLocationForNextDestination,
- [QL_DEPARTED_MISC_BUILDING_2] = QuestLog_Text_DepartedFromLocationToNextDestination
+ [QL_DEPARTED_TOWN_BUILDING] = gText_QuestLog_DepartedPlaceInTownForNextDestination,
+ [QL_DEPARTED_MUSEUM] = gText_QuestLog_LeftTownsLocationForNextDestination,
+ [QL_DEPARTED_GAME_CORNER] = gText_QuestLog_PlayedGamesAtGameCorner,
+ [QL_DEPARTED_HOME] = gText_QuestLog_RestedAtHome,
+ [QL_DEPARTED_OAKS_LAB] = gText_QuestLog_LeftOaksLab,
+ [QL_DEPARTED_GYM] = gText_QuestLog_GymWasFullOfToughTrainers,
+ [QL_DEPARTED_SAFARI_ZONE] = gText_QuestLog_HadGreatTimeInSafariZone,
+ [QL_DEPARTED_CAVE] = gText_QuestLog_ManagedToGetOutOfLocation,
+ [QL_DEPARTED_MISC_BUILDING_1] = gText_QuestLog_DepartedTheLocationForNextDestination,
+ [QL_DEPARTED_MISC_BUILDING_2] = gText_QuestLog_DepartedFromLocationToNextDestination
};
static const u8 sLocationToDepartedTextId[] =
@@ -4179,18 +4051,18 @@ static const u8 gUnknown_8456C17[] = {
static const u8 *const sUsedFieldMoveTexts[] =
{
- [FIELD_MOVE_FLASH] = QuestLog_Text_UsedFlash,
- [FIELD_MOVE_CUT] = QuestLog_Text_UsedCut,
- [FIELD_MOVE_FLY] = QuestLog_Text_UsedFly,
- [FIELD_MOVE_STRENGTH] = QuestLog_Text_UsedStrength,
- [FIELD_MOVE_SURF] = QuestLog_Text_UsedSurf,
- [FIELD_MOVE_ROCK_SMASH] = QuestLog_Text_UsedRockSmash,
- [FIELD_MOVE_WATERFALL] = QuestLog_Text_UsedWaterfall,
- [FIELD_MOVE_TELEPORT] = QuestLog_Text_UsedTeleportToLocation,
- [FIELD_MOVE_DIG] = QuestLog_Text_UsedDigInLocation,
- [FIELD_MOVE_MILK_DRINK] = QuestLog_Text_UsedMilkDrink,
- [FIELD_MOVE_SOFT_BOILED] = QuestLog_Text_UsedSoftboiled,
- [FIELD_MOVE_SWEET_SCENT] = QuestLog_Text_UsedSweetScent
+ [FIELD_MOVE_FLASH] = gText_QuestLog_UsedFlash,
+ [FIELD_MOVE_CUT] = gText_QuestLog_UsedCut,
+ [FIELD_MOVE_FLY] = gText_QuestLog_UsedFly,
+ [FIELD_MOVE_STRENGTH] = gText_QuestLog_UsedStrength,
+ [FIELD_MOVE_SURF] = gText_QuestLog_UsedSurf,
+ [FIELD_MOVE_ROCK_SMASH] = gText_QuestLog_UsedRockSmash,
+ [FIELD_MOVE_WATERFALL] = gText_QuestLog_UsedWaterfall,
+ [FIELD_MOVE_TELEPORT] = gText_QuestLog_UsedTeleportToLocation,
+ [FIELD_MOVE_DIG] = gText_QuestLog_UsedDigInLocation,
+ [FIELD_MOVE_MILK_DRINK] = gText_QuestLog_UsedMilkDrink,
+ [FIELD_MOVE_SOFT_BOILED] = gText_QuestLog_UsedSoftboiled,
+ [FIELD_MOVE_SWEET_SCENT] = gText_QuestLog_UsedSweetScent
};
static u16 *BufferQuestLogData_DepartedLocation(u16 *a0, const u16 *eventData)
@@ -4219,9 +4091,9 @@ static const u16 *BufferQuestLogText_DepartedLocation(const u16 *eventData)
if (r5_2[0] != gUnknown_8456C17[r4])
continue;
if (FlagGet(FLAG_BADGE01_GET + r4) == TRUE)
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_DepartedGym);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_DepartedGym);
else
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_GymWasFullOfToughTrainers);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_GymWasFullOfToughTrainers);
break;
}
if (r4 == 8)
@@ -4292,7 +4164,7 @@ static const u16 *BufferQuestLogText_UsedFieldMove(const u16 *eventData)
if (r5[0] == FIELD_MOVE_TELEPORT)
{
if (r5[1] == 0x58)
- StringCopy(gStringVar3, QuestLog_Text_Home);
+ StringCopy(gStringVar3, gText_QuestLog_Home);
else
StringCopy(gStringVar3, gText_PokemonCenter);
}
@@ -4325,12 +4197,12 @@ static const u16 *BufferQuestLogText_BoughtItem(const u16 *eventData)
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, ItemId_GetName(r4[0]));
if (r4[1] < 2)
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_BoughtItem);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_BoughtItem);
else
{
ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_BoughtItemsIncludingItem);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_BoughtItemsIncludingItem);
}
return (const u16 *)(r7 + 2);
}
@@ -4361,15 +4233,15 @@ static const u16 *BufferQuestLogText_SoldItem(const u16 *eventData)
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, ItemId_GetName(r5[0]));
if (r5[1] == 1)
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, QuestLog_Text_JustOne);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gText_QuestLog_JustOne);
else
{
ConvertIntToDecimalStringN(gStringVar2, r5[1], STR_CONV_MODE_LEFT_ALIGN, 3);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gStringVar2);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar3, QuestLog_Text_Num);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar3, gText_QuestLog_Num);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gStringVar3);
}
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_SoldNumOfItem);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SoldNumOfItem);
}
else
{
@@ -4377,7 +4249,7 @@ static const u16 *BufferQuestLogText_SoldItem(const u16 *eventData)
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, ItemId_GetName(r5[0]));
ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, QuestLog_Text_SoldItemsIncludingItem);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_QuestLog_SoldItemsIncludingItem);
}
return (const u16 *)(r7 + 2);
}
@@ -4398,7 +4270,7 @@ static const u16 *BufferQuestLogText_ObtainedItem(const u16 *eventData)
const u8 *r5 = (const u8 *)r4 + 2;
GetMapNameGeneric(gStringVar1, r5[0]);
StringCopy(gStringVar2, ItemId_GetName(r4[0]));
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_ObtainedItemInLocation);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_ObtainedItemInLocation);
return (const u16 *)(r5 + 2);
}
@@ -4423,7 +4295,7 @@ static const u16 sQuestLogWorldMapFlags[] =
FLAG_WORLD_MAP_SIX_ISLAND
};
-void sub_8115748(u16 worldMapFlag)
+void QuestLog_RecordEnteredMap(u16 worldMapFlag)
{
s32 i;
@@ -4476,7 +4348,7 @@ static const u16 *BufferQuestLogText_ArrivedInLocation(const u16 *eventData)
{
const u16 *r4 = sub_8113E88(QL_EVENT_ARRIVED, eventData);
GetMapNameGeneric(gStringVar1, (u8)r4[0]);
- StringExpandPlaceholders(gStringVar4, QuestLog_Text_ArrivedInLocation);
+ StringExpandPlaceholders(gStringVar4, gText_QuestLog_ArrivedInLocation);
return r4 + 1;
}
diff --git a/src/quest_log_objects.c b/src/quest_log_objects.c
index c021bbb61..2c17987e8 100644
--- a/src/quest_log_objects.c
+++ b/src/quest_log_objects.c
@@ -1,11 +1,8 @@
#include "global.h"
-#include "event_data.h"
#include "quest_log.h"
#include "fieldmap.h"
#include "field_player_avatar.h"
#include "metatile_behavior.h"
-#include "link.h"
-#include "link_rfu.h"
void SetQuestLogObjectEventsData(struct QuestLog * questLog)
{
@@ -14,22 +11,22 @@ void SetQuestLogObjectEventsData(struct QuestLog * questLog)
for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
{
questLog->unk_008[i].active = gObjectEvents[i].active;
- questLog->unk_008[i].mapobj_bit_3 = gObjectEvents[i].triggerGroundEffectsOnStop;
- questLog->unk_008[i].mapobj_bit_4 = gObjectEvents[i].disableCoveringGroundEffects;
- questLog->unk_008[i].mapobj_bit_5 = gObjectEvents[i].landingJump;
- questLog->unk_008[i].mapobj_bit_8 = gObjectEvents[i].frozen;
- questLog->unk_008[i].mapobj_bit_9 = gObjectEvents[i].facingDirectionLocked;
- questLog->unk_008[i].mapobj_bit_10 = gObjectEvents[i].disableAnim;
- questLog->unk_008[i].mapobj_bit_11 = gObjectEvents[i].enableAnim;
- questLog->unk_008[i].mapobj_bit_12 = gObjectEvents[i].inanimate;
- questLog->unk_008[i].mapobj_bit_13 = gObjectEvents[i].invisible;
- questLog->unk_008[i].mapobj_bit_14 = gObjectEvents[i].offScreen;
- questLog->unk_008[i].mapobj_bit_15 = gObjectEvents[i].trackedByCamera;
- questLog->unk_008[i].mapobj_bit_16 = gObjectEvents[i].isPlayer;
- questLog->unk_008[i].mapobj_bit_23 = gObjectEvents[i].spriteAnimPausedBackup;
- questLog->unk_008[i].mapobj_bit_24 = gObjectEvents[i].spriteAffineAnimPausedBackup;
- questLog->unk_008[i].mapobj_bit_25 = gObjectEvents[i].disableJumpLandingGroundEffect;
- questLog->unk_008[i].mapobj_bit_26 = gObjectEvents[i].fixedPriority;
+ questLog->unk_008[i].triggerGroundEffectsOnStop = gObjectEvents[i].triggerGroundEffectsOnStop;
+ questLog->unk_008[i].disableCoveringGroundEffects = gObjectEvents[i].disableCoveringGroundEffects;
+ questLog->unk_008[i].landingJump = gObjectEvents[i].landingJump;
+ questLog->unk_008[i].frozen = gObjectEvents[i].frozen;
+ questLog->unk_008[i].facingDirectionLocked = gObjectEvents[i].facingDirectionLocked;
+ questLog->unk_008[i].disableAnim = gObjectEvents[i].disableAnim;
+ questLog->unk_008[i].enableAnim = gObjectEvents[i].enableAnim;
+ questLog->unk_008[i].inanimate = gObjectEvents[i].inanimate;
+ questLog->unk_008[i].invisible = gObjectEvents[i].invisible;
+ questLog->unk_008[i].offScreen = gObjectEvents[i].offScreen;
+ questLog->unk_008[i].trackedByCamera = gObjectEvents[i].trackedByCamera;
+ questLog->unk_008[i].isPlayer = gObjectEvents[i].isPlayer;
+ questLog->unk_008[i].spriteAnimPausedBackup = gObjectEvents[i].spriteAnimPausedBackup;
+ questLog->unk_008[i].spriteAffineAnimPausedBackup = gObjectEvents[i].spriteAffineAnimPausedBackup;
+ questLog->unk_008[i].disableJumpLandingGroundEffect = gObjectEvents[i].disableJumpLandingGroundEffect;
+ questLog->unk_008[i].fixedPriority = gObjectEvents[i].fixedPriority;
questLog->unk_008[i].mapobj_unk_18 = gObjectEvents[i].facingDirection;
questLog->unk_008[i].mapobj_unk_0B_0 = gObjectEvents[i].currentElevation;
questLog->unk_008[i].elevation = gObjectEvents[i].previousElevation;
@@ -42,8 +39,8 @@ void SetQuestLogObjectEventsData(struct QuestLog * questLog)
questLog->unk_008[i].x = gObjectEvents[i].currentCoords.x;
questLog->unk_008[i].y = gObjectEvents[i].currentCoords.y;
questLog->unk_008[i].trainerRange_berryTreeId = gObjectEvents[i].trainerRange_berryTreeId;
- questLog->unk_008[i].mapobj_unk_1F = gObjectEvents[i].previousMetatileBehavior;
- questLog->unk_008[i].mapobj_unk_21 = gObjectEvents[i].directionSequenceIndex;
+ questLog->unk_008[i].previousMetatileBehavior = gObjectEvents[i].previousMetatileBehavior;
+ questLog->unk_008[i].directionSequenceIndex = gObjectEvents[i].directionSequenceIndex;
questLog->unk_008[i].animId = gObjectEvents[i].playerCopyableMovement;
}
}
@@ -58,22 +55,22 @@ void sub_815A1F8(const struct QuestLog * questLog, const struct ObjectEventTempl
for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
{
gObjectEvents[i].active = questLogObjectEvents[i].active;
- gObjectEvents[i].triggerGroundEffectsOnStop = questLogObjectEvents[i].mapobj_bit_3;
- gObjectEvents[i].disableCoveringGroundEffects = questLogObjectEvents[i].mapobj_bit_4;
- gObjectEvents[i].landingJump = questLogObjectEvents[i].mapobj_bit_5;
- gObjectEvents[i].frozen = questLogObjectEvents[i].mapobj_bit_8;
- gObjectEvents[i].facingDirectionLocked = questLogObjectEvents[i].mapobj_bit_9;
- gObjectEvents[i].disableAnim = questLogObjectEvents[i].mapobj_bit_10;
- gObjectEvents[i].enableAnim = questLogObjectEvents[i].mapobj_bit_11;
- gObjectEvents[i].inanimate = questLogObjectEvents[i].mapobj_bit_12;
- gObjectEvents[i].invisible = questLogObjectEvents[i].mapobj_bit_13;
- gObjectEvents[i].offScreen = questLogObjectEvents[i].mapobj_bit_14;
- gObjectEvents[i].trackedByCamera = questLogObjectEvents[i].mapobj_bit_15;
- gObjectEvents[i].isPlayer = questLogObjectEvents[i].mapobj_bit_16;
- gObjectEvents[i].spriteAnimPausedBackup = questLogObjectEvents[i].mapobj_bit_23;
- gObjectEvents[i].spriteAffineAnimPausedBackup = questLogObjectEvents[i].mapobj_bit_24;
- gObjectEvents[i].disableJumpLandingGroundEffect = questLogObjectEvents[i].mapobj_bit_25;
- gObjectEvents[i].fixedPriority = questLogObjectEvents[i].mapobj_bit_26;
+ gObjectEvents[i].triggerGroundEffectsOnStop = questLogObjectEvents[i].triggerGroundEffectsOnStop;
+ gObjectEvents[i].disableCoveringGroundEffects = questLogObjectEvents[i].disableCoveringGroundEffects;
+ gObjectEvents[i].landingJump = questLogObjectEvents[i].landingJump;
+ gObjectEvents[i].frozen = questLogObjectEvents[i].frozen;
+ gObjectEvents[i].facingDirectionLocked = questLogObjectEvents[i].facingDirectionLocked;
+ gObjectEvents[i].disableAnim = questLogObjectEvents[i].disableAnim;
+ gObjectEvents[i].enableAnim = questLogObjectEvents[i].enableAnim;
+ gObjectEvents[i].inanimate = questLogObjectEvents[i].inanimate;
+ gObjectEvents[i].invisible = questLogObjectEvents[i].invisible;
+ gObjectEvents[i].offScreen = questLogObjectEvents[i].offScreen;
+ gObjectEvents[i].trackedByCamera = questLogObjectEvents[i].trackedByCamera;
+ gObjectEvents[i].isPlayer = questLogObjectEvents[i].isPlayer;
+ gObjectEvents[i].spriteAnimPausedBackup = questLogObjectEvents[i].spriteAnimPausedBackup;
+ gObjectEvents[i].spriteAffineAnimPausedBackup = questLogObjectEvents[i].spriteAffineAnimPausedBackup;
+ gObjectEvents[i].disableJumpLandingGroundEffect = questLogObjectEvents[i].disableJumpLandingGroundEffect;
+ gObjectEvents[i].fixedPriority = questLogObjectEvents[i].fixedPriority;
gObjectEvents[i].facingDirection = questLogObjectEvents[i].mapobj_unk_18;
gObjectEvents[i].currentElevation = questLogObjectEvents[i].mapobj_unk_0B_0;
gObjectEvents[i].previousElevation = questLogObjectEvents[i].elevation;
@@ -86,8 +83,8 @@ void sub_815A1F8(const struct QuestLog * questLog, const struct ObjectEventTempl
gObjectEvents[i].currentCoords.x = questLogObjectEvents[i].x;
gObjectEvents[i].currentCoords.y = questLogObjectEvents[i].y;
gObjectEvents[i].trainerRange_berryTreeId = questLogObjectEvents[i].trainerRange_berryTreeId;
- gObjectEvents[i].previousMetatileBehavior = questLogObjectEvents[i].mapobj_unk_1F;
- gObjectEvents[i].directionSequenceIndex = questLogObjectEvents[i].mapobj_unk_21;
+ gObjectEvents[i].previousMetatileBehavior = questLogObjectEvents[i].previousMetatileBehavior;
+ gObjectEvents[i].directionSequenceIndex = questLogObjectEvents[i].directionSequenceIndex;
gObjectEvents[i].playerCopyableMovement = questLogObjectEvents[i].animId;
for (j = 0; j < 0x40; j++)
diff --git a/src/quest_log_player.c b/src/quest_log_player.c
index 5a2152d8e..be40042b3 100644
--- a/src/quest_log_player.c
+++ b/src/quest_log_player.c
@@ -57,7 +57,7 @@ void sub_8150498(u8 a0)
static void sub_81504A8(void)
{
struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
- sub_81507BC(objectEvent, sub_805C808(0));
+ sub_81507BC(objectEvent, GetPlayerAvatarGraphicsIdByStateId(0));
ObjectEventTurn(objectEvent, objectEvent->movementDirection);
SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_ON_FOOT);
}
@@ -65,7 +65,7 @@ static void sub_81504A8(void)
static void sub_81504E8(void)
{
struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
- sub_81507BC(objectEvent, sub_805C808(1));
+ sub_81507BC(objectEvent, GetPlayerAvatarGraphicsIdByStateId(1));
ObjectEventTurn(objectEvent, objectEvent->movementDirection);
SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_MACH_BIKE);
sub_80BD620(0, 0);
@@ -80,13 +80,13 @@ static void sub_8150530(void)
{
u8 taskId;
ScriptContext2_Enable();
- gPlayerAvatar.unk6 = 1;
+ gPlayerAvatar.preventStep = TRUE;
taskId = CreateTask(sub_81505C4, 0xFF);
gTasks[taskId].data[0] = 0;
}
else
{
- sub_81507BC(objectEvent, sub_805C808(4));
+ sub_81507BC(objectEvent, GetPlayerAvatarGraphicsIdByStateId(4));
StartSpriteAnim(sprite, GetFishingNoCatchDirectionAnimNum(objectEvent->facingDirection));
}
}
@@ -101,7 +101,7 @@ static void sub_81505C4(u8 taskId)
case 0:
ObjectEventClearHeldMovementIfActive(objectEvent);
objectEvent->enableAnim = TRUE;
- sub_81507BC(objectEvent, sub_805C808(4));
+ sub_81507BC(objectEvent, GetPlayerAvatarGraphicsIdByStateId(4));
StartSpriteAnim(sprite, GetFishingNoCatchDirectionAnimNum(objectEvent->facingDirection));
gTasks[taskId].data[0]++;
gTasks[taskId].data[1] = 0;
@@ -122,9 +122,9 @@ static void sub_81505C4(u8 taskId)
if (sprite->animEnded)
{
if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING))
- sub_81507BC(objectEvent, sub_805C808(0));
+ sub_81507BC(objectEvent, GetPlayerAvatarGraphicsIdByStateId(0));
else
- sub_81507BC(objectEvent, sub_805C808(2));
+ sub_81507BC(objectEvent, GetPlayerAvatarGraphicsIdByStateId(2));
ObjectEventTurn(objectEvent, objectEvent->movementDirection);
sprite->pos2.x = 0;
sprite->pos2.y = 0;
@@ -142,7 +142,7 @@ static void sub_8150708(void)
if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING))
{
- sub_81507BC(objectEvent, sub_805C808(2));
+ sub_81507BC(objectEvent, GetPlayerAvatarGraphicsIdByStateId(2));
ObjectEventTurn(objectEvent, objectEvent->movementDirection);
SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_SURFING);
gFieldEffectArguments[0] = objectEvent->currentCoords.x;
@@ -156,13 +156,13 @@ static void sub_8150708(void)
static void sub_815077C(void)
{
- FieldEffectStart(FLDEFF_UNK_41);
+ FieldEffectStart(FLDEFF_USE_VS_SEEKER);
CreateTask(sub_8150794, 0x00);
}
static void sub_8150794(u8 taskId)
{
- if (!FieldEffectActiveListContains(0x41))
+ if (!FieldEffectActiveListContains(FLDEFF_USE_VS_SEEKER))
{
UnfreezeObjectEvents();
ScriptContext2_Disable();
diff --git a/src/random.c b/src/random.c
index f6c49971d..cb12ec805 100644
--- a/src/random.c
+++ b/src/random.c
@@ -1,5 +1,4 @@
#include "global.h"
-#include "random.h"
// The number 1103515245 comes from the example implementation
// of rand and srand in the ISO C standard.
diff --git a/src/region_map.c b/src/region_map.c
index d526f9aaa..731abc59f 100644
--- a/src/region_map.c
+++ b/src/region_map.c
@@ -19,7 +19,7 @@
#include "map_preview_screen.h"
#include "constants/flags.h"
#include "constants/songs.h"
-#include "constants/region_map.h"
+#include "constants/region_map_sections.h"
#include "constants/spawn_points.h"
#include "constants/maps.h"
@@ -1269,10 +1269,10 @@ static const u8 sMapsecToSpawn[][3] = {
[MAPSEC_CAPE_BRINK - MAPSECS_KANTO] = {MAP_GROUP(TWO_ISLAND_CAPE_BRINK), MAP_NUM(TWO_ISLAND_CAPE_BRINK), 0},
[MAPSEC_BOND_BRIDGE - MAPSECS_KANTO] = {MAP_GROUP(THREE_ISLAND_BOND_BRIDGE), MAP_NUM(THREE_ISLAND_BOND_BRIDGE), 0},
[MAPSEC_THREE_ISLE_PORT - MAPSECS_KANTO] = {MAP_GROUP(THREE_ISLAND_PORT), MAP_NUM(THREE_ISLAND_PORT), 0},
- [MAPSEC_SEVII_ISLE_6 - MAPSECS_KANTO] = {MAP_GROUP(UNKNOWN_MAP_03_50), MAP_NUM(UNKNOWN_MAP_03_50), 0},
- [MAPSEC_SEVII_ISLE_7 - MAPSECS_KANTO] = {MAP_GROUP(UNKNOWN_MAP_03_51), MAP_NUM(UNKNOWN_MAP_03_51), 0},
- [MAPSEC_SEVII_ISLE_8 - MAPSECS_KANTO] = {MAP_GROUP(UNKNOWN_MAP_03_52), MAP_NUM(UNKNOWN_MAP_03_52), 0},
- [MAPSEC_SEVII_ISLE_9 - MAPSECS_KANTO] = {MAP_GROUP(UNKNOWN_MAP_03_53), MAP_NUM(UNKNOWN_MAP_03_53), 0},
+ [MAPSEC_SEVII_ISLE_6 - MAPSECS_KANTO] = {MAP_GROUP(PROTOTYPE_SEVII_ISLE_6), MAP_NUM(PROTOTYPE_SEVII_ISLE_6), 0},
+ [MAPSEC_SEVII_ISLE_7 - MAPSECS_KANTO] = {MAP_GROUP(PROTOTYPE_SEVII_ISLE_7), MAP_NUM(PROTOTYPE_SEVII_ISLE_7), 0},
+ [MAPSEC_SEVII_ISLE_8 - MAPSECS_KANTO] = {MAP_GROUP(PROTOTYPE_SEVII_ISLE_8), MAP_NUM(PROTOTYPE_SEVII_ISLE_8), 0},
+ [MAPSEC_SEVII_ISLE_9 - MAPSECS_KANTO] = {MAP_GROUP(PROTOTYPE_SEVII_ISLE_9), MAP_NUM(PROTOTYPE_SEVII_ISLE_9), 0},
[MAPSEC_RESORT_GORGEOUS - MAPSECS_KANTO] = {MAP_GROUP(FIVE_ISLAND_RESORT_GORGEOUS), MAP_NUM(FIVE_ISLAND_RESORT_GORGEOUS), 0},
[MAPSEC_WATER_LABYRINTH - MAPSECS_KANTO] = {MAP_GROUP(FIVE_ISLAND_WATER_LABYRINTH), MAP_NUM(FIVE_ISLAND_WATER_LABYRINTH), 0},
[MAPSEC_FIVE_ISLE_MEADOW - MAPSECS_KANTO] = {MAP_GROUP(FIVE_ISLAND_MEADOW), MAP_NUM(FIVE_ISLAND_MEADOW), 0},
@@ -3420,7 +3420,7 @@ static u8 sub_80C3878(u8 mapsec)
case MAPSEC_ROCKET_WAREHOUSE:
return FlagGet(FLAG_WORLD_MAP_FIVE_ISLAND_ROCKET_WAREHOUSE) ? 2 : 3;
case MAPSEC_TRAINER_TOWER_2:
- return FlagGet(FLAG_WORLD_MAP_SEVEN_ISLAND_TRAINER_TOWER_LOBBY) ? 2 : 3;
+ return FlagGet(FLAG_WORLD_MAP_TRAINER_TOWER_LOBBY) ? 2 : 3;
case MAPSEC_DOTTED_HOLE:
return FlagGet(FLAG_WORLD_MAP_SIX_ISLAND_DOTTED_HOLE_1F) ? 2 : 3;
case MAPSEC_LOST_CAVE:
@@ -4395,5 +4395,5 @@ static void sub_80C527C(u16 mapsec)
{
warp1_set_2(sMapsecToSpawn[idx][0], sMapsecToSpawn[idx][1], -1);
}
- sub_80842C8();
+ ReturnToFieldFromFlyMapSelect();
}
diff --git a/src/renewable_hidden_items.c b/src/renewable_hidden_items.c
index cbaa780e6..c0406fe94 100644
--- a/src/renewable_hidden_items.c
+++ b/src/renewable_hidden_items.c
@@ -529,12 +529,6 @@ static const struct RenewableHiddenItemData sRenewableHiddenItems[] = {
},
};
-bool32 sub_815D834(void)
-{
- // Stubbed out?
- return FALSE;
-}
-
void SetAllRenewableItemFlags(void)
{
u8 i, j;
diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c
index ebfd18493..25470fc43 100644
--- a/src/reshow_battle_screen.c
+++ b/src/reshow_battle_screen.c
@@ -6,7 +6,6 @@
#include "link.h"
#include "data.h"
#include "sprite.h"
-#include "text.h"
#include "gpu_regs.h"
#include "scanline_effect.h"
#include "help_system.h"
@@ -14,8 +13,6 @@
#include "battle_interface.h"
#include "battle_anim.h"
#include "battle_controllers.h"
-#include "reshow_battle_screen.h"
-#include "constants/species.h"
static void CB2_ReshowBattleScreenAfterMenu(void);
static void sub_8077AAC(void);
@@ -39,17 +36,17 @@ void ReshowBattleScreenAfterMenu(void)
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- HelpSystem_SetSomeVariable2(0x19);
+ SetHelpContext(HELPCONTEXT_TRAINER_BATTLE_DOUBLE);
else
- HelpSystem_SetSomeVariable2(0x18);
+ SetHelpContext(HELPCONTEXT_TRAINER_BATTLE_SINGLE);
}
else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
{
- HelpSystem_SetSomeVariable2(0x1A);
+ SetHelpContext(HELPCONTEXT_SAFARI_BATTLE);
}
else
{
- HelpSystem_SetSomeVariable2(0x17);
+ SetHelpContext(HELPCONTEXT_WILD_BATTLE);
}
}
SetMainCallback2(CB2_ReshowBattleScreenAfterMenu);
diff --git a/src/rfu_union_tool.c b/src/rfu_union_tool.c
index 20b29de9b..132ac7b85 100644
--- a/src/rfu_union_tool.c
+++ b/src/rfu_union_tool.c
@@ -1,8 +1,6 @@
#include "global.h"
#include "event_data.h"
#include "event_object_movement.h"
-#include "event_object_80688E4.h"
-#include "event_object_8097404.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
#include "rfu_union_tool.h"
@@ -10,35 +8,36 @@
#include "task.h"
#include "constants/flags.h"
#include "constants/event_object_movement.h"
-#include "constants/object_events.h"
+#include "constants/union_room.h"
+#include "constants/event_objects.h"
static EWRAM_DATA struct UnionObj * UnionObjWork = NULL;
static EWRAM_DATA u32 sUnionObjRefreshTimer = 0;
static u8 StartUnionObjAnimTask(void);
-static u32 sub_811BBC8(u32 playerIdx, u32 arg1);
-static void sub_811C008(s32 arg0, s32 arg1, u8 arg2);
+static u32 RfuUnionGroupMemberIsInvisible(u32 group, u32 member);
+static void UnionPartnerObjectSetFacing(s32 member, s32 group, u8 direction);
static const u8 sUnionObjectEventGfxIds[][10] = {
[MALE] = {
- OBJECT_EVENT_GFX_COOLTRAINER_M,
- OBJECT_EVENT_GFX_BLACKBELT,
- OBJECT_EVENT_GFX_CAMPER,
- OBJECT_EVENT_GFX_YOUNGSTER,
- OBJECT_EVENT_GFX_BOY,
- OBJECT_EVENT_GFX_BUG_CATCHER,
- OBJECT_EVENT_GFX_MAN,
- OBJECT_EVENT_GFX_ROCKER
+ OBJ_EVENT_GFX_COOLTRAINER_M,
+ OBJ_EVENT_GFX_BLACKBELT,
+ OBJ_EVENT_GFX_CAMPER,
+ OBJ_EVENT_GFX_YOUNGSTER,
+ OBJ_EVENT_GFX_BOY,
+ OBJ_EVENT_GFX_BUG_CATCHER,
+ OBJ_EVENT_GFX_MAN,
+ OBJ_EVENT_GFX_ROCKER
},
[FEMALE] = {
- OBJECT_EVENT_GFX_COOLTRAINER_F,
- OBJECT_EVENT_GFX_CHANNELER,
- OBJECT_EVENT_GFX_PICNICKER,
- OBJECT_EVENT_GFX_LASS,
- OBJECT_EVENT_GFX_WOMAN_1,
- OBJECT_EVENT_GFX_BATTLE_GIRL,
- OBJECT_EVENT_GFX_WOMAN_2,
- OBJECT_EVENT_GFX_BEAUTY
+ OBJ_EVENT_GFX_COOLTRAINER_F,
+ OBJ_EVENT_GFX_CHANNELER,
+ OBJ_EVENT_GFX_PICNICKER,
+ OBJ_EVENT_GFX_LASS,
+ OBJ_EVENT_GFX_WOMAN_1,
+ OBJ_EVENT_GFX_BATTLE_GIRL,
+ OBJ_EVENT_GFX_WOMAN_2,
+ OBJ_EVENT_GFX_BEAUTY
}
};
@@ -69,12 +68,12 @@ static const u8 sOppositeFacingDirection[] = {
[DIR_EAST] = DIR_WEST
};
-static const u8 gUnknown_845711B[] = {
- 1,
- 3,
- 1,
- 4,
- 2
+static const u8 sUnionGroupMemberFacings[] = {
+ DIR_SOUTH,
+ DIR_WEST,
+ DIR_SOUTH,
+ DIR_EAST,
+ DIR_NORTH
};
static const u8 sUnionRoomLocalIds[] = {
@@ -116,19 +115,19 @@ static u8 GetUnionRoomPlayerGraphicsId(u32 gender, u32 id)
return sUnionObjectEventGfxIds[gender][id % 8];
}
-static void GetUnionRoomPlayerFacingCoords(u32 id, u32 dirn, s32 * xp, s32 * yp)
+static void GetUnionRoomPlayerFacingCoords(u32 group, u32 member, s32 * xp, s32 * yp)
{
- *xp = sUnionPartnerCoords[id][0] + sFacingDirectionOffsets[dirn][0] + 7;
- *yp = sUnionPartnerCoords[id][1] + sFacingDirectionOffsets[dirn][1] + 7;
+ *xp = sUnionPartnerCoords[group][0] + sFacingDirectionOffsets[member][0] + 7;
+ *yp = sUnionPartnerCoords[group][1] + sFacingDirectionOffsets[member][1] + 7;
}
-static bool32 sub_811B58C(u32 id, u32 dirn, s32 x, s32 y)
+static bool32 IsUnionRoomPlayerFacingTileAt(u32 group, u32 member, s32 x, s32 y)
{
- if (sUnionPartnerCoords[id][0] + sFacingDirectionOffsets[dirn][0] + 7 != x)
+ if (sUnionPartnerCoords[group][0] + sFacingDirectionOffsets[member][0] + 7 != x)
{
return FALSE;
}
- else if (sUnionPartnerCoords[id][1] + sFacingDirectionOffsets[dirn][1] + 7 != y)
+ else if (sUnionPartnerCoords[group][1] + sFacingDirectionOffsets[member][1] + 7 != y)
{
return FALSE;
}
@@ -188,6 +187,7 @@ static bool32 SetUnionRoomPlayerEnterExitMovement(u32 playerIdx, const u8 * move
}
return TRUE;
}
+
static bool32 TryReleaseUnionRoomPlayerObjectEvent(u32 playerIdx)
{
u8 objectId;
@@ -263,11 +263,11 @@ static const u8 sMovement_UnionPlayerEnter[2] = {
MOVEMENT_ACTION_STEP_END
};
-static bool32 AnimateUnionRoomPlayerSpawn(s8 * a0, u32 playerIdx, struct UnionObj * ptr)
+static bool32 AnimateUnionRoomPlayerSpawn(s8 * state_p, u32 playerIdx, struct UnionObj * ptr)
{
s16 x, y;
- switch (*a0)
+ switch (*state_p)
{
case 0:
if (!is_walking_or_running())
@@ -275,30 +275,30 @@ static bool32 AnimateUnionRoomPlayerSpawn(s8 * a0, u32 playerIdx, struct UnionOb
break;
}
PlayerGetDestCoords(&x, &y);
- if (sub_811B58C(playerIdx, 0, x, y) == TRUE)
+ if (IsUnionRoomPlayerFacingTileAt(playerIdx, 0, x, y) == TRUE)
{
break;
}
player_get_pos_including_state_based_drift(&x, &y);
- if (sub_811B58C(playerIdx, 0, x, y) == TRUE)
+ if (IsUnionRoomPlayerFacingTileAt(playerIdx, 0, x, y) == TRUE)
{
break;
}
SetUnionRoomPlayerGfx(playerIdx, ptr->gfxId);
CreateUnionRoomPlayerObjectEvent(playerIdx);
ShowUnionRoomPlayer(playerIdx);
- (*a0)++;
+ (*state_p)++;
// fallthrough
case 3: // incorrect?
if (SetUnionRoomPlayerEnterExitMovement(playerIdx, sMovement_UnionPlayerEnter) == 1)
{
- (*a0)++;
+ (*state_p)++;
}
break;
case 2:
if (TryReleaseUnionRoomPlayerObjectEvent(playerIdx))
{
- *a0 = 0;
+ *state_p = 0;
return TRUE;
}
break;
@@ -306,12 +306,12 @@ static bool32 AnimateUnionRoomPlayerSpawn(s8 * a0, u32 playerIdx, struct UnionOb
return FALSE;
}
-static bool32 sub_811B8BC(u32 playerIdx, u32 a1, u32 a2)
+static bool32 SpawnGroupLeader(u32 playerIdx, u32 gender, u32 idMod256)
{
struct UnionObj * ptr = &UnionObjWork[playerIdx];
AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH("rfu_union_tool.c"), 561)
- ptr->schedAnim = 1;
- ptr->gfxId = GetUnionRoomPlayerGraphicsId(a1, a2);
+ ptr->schedAnim = UNION_ROOM_SPAWN_IN;
+ ptr->gfxId = GetUnionRoomPlayerGraphicsId(gender, idMod256);
if (ptr->state == 0)
{
return TRUE;
@@ -322,11 +322,11 @@ static bool32 sub_811B8BC(u32 playerIdx, u32 a1, u32 a2)
}
}
-static bool32 sub_811B90C(u32 playerIdx)
+static bool32 DespawnGroupLeader(u32 playerIdx)
{
struct UnionObj * ptr = &UnionObjWork[playerIdx];
AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH("rfu_union_tool.c"), 577)
- ptr->schedAnim = 2;
+ ptr->schedAnim = UNION_ROOM_SPAWN_OUT;
if (ptr->state == 1)
{
return TRUE;
@@ -342,7 +342,7 @@ static void AnimateUnionObj(u32 playerIdx, struct UnionObj * ptr)
switch (ptr->state)
{
case 0:
- if (ptr->schedAnim == 1)
+ if (ptr->schedAnim == UNION_ROOM_SPAWN_IN)
{
ptr->state = 2;
ptr->animState = 0;
@@ -353,7 +353,7 @@ static void AnimateUnionObj(u32 playerIdx, struct UnionObj * ptr)
}
// fallthrough
case 2:
- if (!sub_811BBC8(playerIdx, 0) && ptr->schedAnim == 2)
+ if (!RfuUnionGroupMemberIsInvisible(playerIdx, 0) && ptr->schedAnim == 2)
{
ptr->state = 0;
ptr->animState = 0;
@@ -366,7 +366,7 @@ static void AnimateUnionObj(u32 playerIdx, struct UnionObj * ptr)
}
break;
case 1:
- if (ptr->schedAnim == 2)
+ if (ptr->schedAnim == UNION_ROOM_SPAWN_OUT)
{
ptr->state = 3;
ptr->animState = 0;
@@ -383,7 +383,7 @@ static void AnimateUnionObj(u32 playerIdx, struct UnionObj * ptr)
}
break;
}
- ptr->schedAnim = 0;
+ ptr->schedAnim = UNION_ROOM_SPAWN_NONE;
}
static void Task_AnimateUnionObjs(u8 taskId)
@@ -409,7 +409,7 @@ static u8 StartUnionObjAnimTask(void)
}
}
-static void sub_811BA5C(void)
+static void DestroyAnimateUnionObjsTask(void)
{
u8 taskId = FindTaskIdByFunc(Task_AnimateUnionObjs);
if (taskId < NUM_TASKS)
@@ -418,7 +418,7 @@ static void sub_811BA5C(void)
}
}
-void sub_811BA78(void)
+void DeleteUnionObjWorkAndStopTask(void)
{
s32 i;
for (i = 0; i < 8; i++)
@@ -430,31 +430,31 @@ void sub_811BA78(void)
}
}
UnionObjWork = NULL;
- sub_811BA5C();
+ DestroyAnimateUnionObjsTask();
}
-void sub_811BAAC(u8 * sp8, s32 r9)
+void CreateGroupMemberObjectsInvisible(u8 * sprite_ids, s32 group)
{
- s32 r7;
+ s32 i;
- for (r7 = 0; r7 < 5; r7++)
+ for (i = 0; i < 5; i++)
{
- s32 r5 = 5 * r9 + r7;
- sp8[r5] = sprite_new(OBJECT_EVENT_GFX_MAN, r5 - 0x38, sUnionPartnerCoords[r9][0] + sFacingDirectionOffsets[r7][0], sUnionPartnerCoords[r9][1] + sFacingDirectionOffsets[r7][1], 3, 1);
- sub_8069124(r5 - 0x38, TRUE);
+ s32 obj_id = 5 * group + i;
+ sprite_ids[obj_id] = sprite_new(OBJ_EVENT_GFX_MAN, obj_id - 0x38, sUnionPartnerCoords[group][0] + sFacingDirectionOffsets[i][0], sUnionPartnerCoords[group][1] + sFacingDirectionOffsets[i][1], 3, 1);
+ RfuUnionObjectToggleInvisibility(obj_id - 0x38, TRUE);
}
}
-void sub_811BB40(u8 * r5)
+void DestroyGroupMemberObjects(u8 *spriteIds)
{
s32 i;
for (i = 0; i < 40; i++)
{
- DestroySprite(&gSprites[r5[i]]);
+ DestroySprite(&gSprites[spriteIds[i]]);
}
}
-void sub_811BB68(void)
+void MakeGroupAssemblyAreasPassable(void)
{
s32 i, j, x, y;
for (i = 0; i < 8; i++)
@@ -462,94 +462,94 @@ void sub_811BB68(void)
for (j = 0; j < 5; j++)
{
GetUnionRoomPlayerFacingCoords(i, j, &x, &y);
- sub_8059024(x, y, 0);
+ MapGridSetMetatileImpassabilityAt(x, y, FALSE);
}
}
}
-static u8 sub_811BBA0(u32 r1, u32 unused, struct GFtgtGname * r2)
+static u8 UnionPartnerObjectGetFacing(u32 member, u32 group, struct GFtgtGname * gname)
{
- if (r1 != 0)
+ if (member != 0)
{
- return gUnknown_845711B[r1];
+ return sUnionGroupMemberFacings[member];
}
- else if (r2->unk_0a_0 == 0x45)
+ else if (gname->activity == 0x45)
{
- return 1;
+ return DIR_SOUTH;
}
else
{
- return 4;
+ return DIR_EAST;
}
}
-static u32 sub_811BBC8(u32 a0, u32 a1)
+static u32 RfuUnionGroupMemberIsInvisible(u32 group, u32 member)
{
- return sub_806916C(5 * a0 + a1 - 0x38);
+ return RfuUnionObjectIsInvisible(5 * group + member - 0x38);
}
-static void sub_811BBE0(u32 r5, u32 r6, u8 r8, struct GFtgtGname * r9)
+static void SpawnGroupMember(u32 groupNo, u32 memberNo, u8 direction, struct GFtgtGname * gname)
{
s32 x, y;
- s32 r7 = 5 * r5 + r6;
- if (sub_811BBC8(r5, r6) == 1)
+ s32 objId = 5 * groupNo + memberNo;
+ if (RfuUnionGroupMemberIsInvisible(groupNo, memberNo) == TRUE)
{
- sub_8069124(r7 - 0x38, FALSE);
- sub_80691A4(r7 - 0x38, 1);
+ RfuUnionObjectToggleInvisibility(objId - 0x38, FALSE);
+ RfuUnionObjectStartWarp(objId - 0x38, UNION_ROOM_SPAWN_IN);
}
- sub_8069094(r7 - 0x38, r8);
- sub_811C008(r6, r5, sub_811BBA0(r6, r5, r9));
- GetUnionRoomPlayerFacingCoords(r5, r6, &x, &y);
- sub_8059024(x, y, 1);
+ RfuUnionObjectSetFacingDirection(objId - 0x38, direction);
+ UnionPartnerObjectSetFacing(memberNo, groupNo, UnionPartnerObjectGetFacing(memberNo, groupNo, gname));
+ GetUnionRoomPlayerFacingCoords(groupNo, memberNo, &x, &y);
+ MapGridSetMetatileImpassabilityAt(x, y, TRUE);
}
-static void sub_811BC68(u32 a0, u32 a1)
+static void DespawnGroupMember(u32 group, u32 member)
{
s32 x, y;
- sub_80691A4(5 * a0 + a1 - 0x38, 2);
- GetUnionRoomPlayerFacingCoords(a0, a1, &x, &y);
- sub_8059024(x, y, 0);
+ RfuUnionObjectStartWarp(5 * group + member - 0x38, UNION_ROOM_SPAWN_OUT);
+ GetUnionRoomPlayerFacingCoords(group, member, &x, &y);
+ MapGridSetMetatileImpassabilityAt(x, y, FALSE);
}
-static void sub_811BCA0(u32 r7, struct GFtgtGname * r8)
+static void AssembleGroup(u32 group, struct GFtgtGname * gname)
{
s16 x, y, x2, y2;
s32 i;
PlayerGetDestCoords(&x, &y);
player_get_pos_including_state_based_drift(&x2, &y2);
- if (sub_806916C(5 * r7 - 0x38) == 1)
+ if (RfuUnionObjectIsInvisible(5 * group - 0x38) == TRUE)
{
- if (sub_811B58C(r7, 0, x, y) == TRUE || sub_811B58C(r7, 0, x2, y2) == TRUE)
+ if (IsUnionRoomPlayerFacingTileAt(group, 0, x, y) == TRUE || IsUnionRoomPlayerFacingTileAt(group, 0, x2, y2) == TRUE)
{
return;
}
- sub_811BBE0(r7, 0, GetUnionRoomPlayerGraphicsId(r8->playerGender, r8->unk_00.playerTrainerId[0]), r8);
+ SpawnGroupMember(group, 0, GetUnionRoomPlayerGraphicsId(gname->playerGender, gname->unk_00.playerTrainerId[0]), gname);
}
for (i = 1; i < 5; i++)
{
- if (r8->unk_04[i - 1] == 0)
+ if (gname->child_sprite_gender[i - 1] == 0)
{
- sub_811BC68(r7, i);
+ DespawnGroupMember(group, i);
}
- else if (sub_811B58C(r7, i, x, y) == FALSE && sub_811B58C(r7, i, x2, y2) == FALSE)
+ else if (IsUnionRoomPlayerFacingTileAt(group, i, x, y) == FALSE && IsUnionRoomPlayerFacingTileAt(group, i, x2, y2) == FALSE)
{
- sub_811BBE0(r7, i, GetUnionRoomPlayerGraphicsId((r8->unk_04[i - 1] >> 3) & 1, r8->unk_04[i - 1] & 7), r8);
+ SpawnGroupMember(group, i, GetUnionRoomPlayerGraphicsId((gname->child_sprite_gender[i - 1] >> 3) & 1, gname->child_sprite_gender[i - 1] & 7), gname);
}
}
}
-static void sub_811BDA8(u32 r5, struct GFtgtGname * r4)
+static void SpawnGroupLeaderAndMembers(u32 group, struct GFtgtGname * gname)
{
u32 i;
- switch (r4->unk_0a_0)
+ switch (gname->activity)
{
case 0x40:
case 0x54:
- sub_811B8BC(r5, r4->playerGender, r4->unk_00.playerTrainerId[0]);
+ SpawnGroupLeader(group, gname->playerGender, gname->unk_00.playerTrainerId[0]);
for (i = 0; i < 5; i++)
{
- sub_811BC68(r5, i);
+ DespawnGroupMember(group, i);
}
break;
case 0x41:
@@ -559,70 +559,70 @@ static void sub_811BDA8(u32 r5, struct GFtgtGname * r4)
case 0x51:
case 0x52:
case 0x53:
- sub_811B90C(r5);
- sub_811BCA0(r5, r4);
+ DespawnGroupLeader(group);
+ AssembleGroup(group, gname);
break;
default:
AGB_ASSERT_EX(0, ABSPATH("rfu_union_tool.c"), 979)
}
}
-static void sub_811BE6C(u32 r5, struct GFtgtGname * unused)
+static void DespawnGroupLeaderAndMembers(u32 group, struct GFtgtGname * gname)
{
s32 i;
- sub_811B90C(r5);
+ DespawnGroupLeader(group);
for (i = 0; i < 5; i++)
{
- sub_811BC68(r5, i);
+ DespawnGroupMember(group, i);
}
}
-static void UpdateUnionRoomPlayerSprites(struct UnkStruct_URoom *r0)
+static void UpdateUnionRoomPlayerSprites(struct UnkStruct_URoom * groups)
{
s32 i;
- struct UnkStruct_x20 * r4;
+ struct UnkStruct_x20 * x20_p;
sUnionObjRefreshTimer = 0;
- for (i = 0, r4 = r0->field_0->arr; i < 8; i++)
+ for (i = 0, x20_p = groups->field_0->arr; i < 8; i++)
{
- if (r4[i].field_1A_0 == 1)
+ if (x20_p[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN)
{
- sub_811BDA8(i, &r4[i].unk.gname);
+ SpawnGroupLeaderAndMembers(i, &x20_p[i].gname_uname.gname);
}
- else if (r4[i].field_1A_0 == 2)
+ else if (x20_p[i].groupScheduledAnim == UNION_ROOM_SPAWN_OUT)
{
- sub_811BE6C(i, &r4[i].unk.gname);
+ DespawnGroupLeaderAndMembers(i, &x20_p[i].gname_uname.gname);
}
}
}
-void sub_811BECC(struct UnkStruct_URoom *unused)
+void ScheduleUnionRoomPlayerRefresh(struct UnkStruct_URoom *uroom_p)
{
sUnionObjRefreshTimer = 300;
}
-void sub_811BEDC(struct UnkStruct_URoom *r2)
+void HandleUnionRoomPlayerRefresh(struct UnkStruct_URoom *uroom_p)
{
if (++sUnionObjRefreshTimer > 300)
{
- UpdateUnionRoomPlayerSprites(r2);
+ UpdateUnionRoomPlayerSprites(uroom_p);
}
}
-bool32 sub_811BF00(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3)
+bool32 RfuUnionTool_GetGroupAndMemberInFrontOfPlayer(struct UnkStruct_Main0 *main0_p, s16 *member_p, s16 *group_p, u8 *spriteIds)
{
s16 x, y;
s32 i, j;
- struct UnkStruct_x20 * r4;
+ struct UnkStruct_x20 * x20_p;
if (!is_walking_or_running())
{
return FALSE;
}
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
- for (i = 0, r4 = arg0->arr; i < 8; i++)
+ for (i = 0, x20_p = main0_p->arr; i < 8; i++)
{
for (j = 0; j < 5; j++)
{
- s32 r3 = 5 * i + j;
+ s32 objId = 5 * i + j;
if (x != sUnionPartnerCoords[i][0] + sFacingDirectionOffsets[j][0] + 7)
{
continue;
@@ -631,33 +631,33 @@ bool32 sub_811BF00(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3)
{
continue;
}
- if (sub_806916C(r3 - 0x38) != 0)
+ if (RfuUnionObjectIsInvisible(objId - 0x38) != 0)
{
continue;
}
- if (sub_8069294(r3 - 0x38) != 0)
+ if (RfuUnionObjectIsWarping(objId - 0x38) != 0)
{
continue;
}
- if (r4[i].field_1A_0 != 1)
+ if (x20_p[i].groupScheduledAnim != UNION_ROOM_SPAWN_IN)
{
continue;
}
- sub_811C008(j, i, sOppositeFacingDirection[GetPlayerFacingDirection()]);
- *arg1 = j;
- *arg2 = i;
+ UnionPartnerObjectSetFacing(j, i, sOppositeFacingDirection[GetPlayerFacingDirection()]);
+ *member_p = j;
+ *group_p = i;
return TRUE;
}
}
return FALSE;
}
-static void sub_811C008(s32 arg0, s32 arg1, u8 arg2)
+static void UnionPartnerObjectSetFacing(s32 member, s32 group, u8 direction)
{
- sub_8069058(5 * arg1 - 0x38 + arg0, arg2);
+ TurnObjectEvent(5 * group - 0x38 + member, direction);
}
-void sub_811C028(u32 arg0, u32 arg1, struct UnkStruct_Main0 *arg2)
+void UpdateUnionGroupMemberFacing(u32 member, u32 group, struct UnkStruct_Main0 *main0_p)
{
- return sub_811C008(arg0, arg1, sub_811BBA0(arg0, arg1, &arg2->arr[arg1].unk.gname));
+ return UnionPartnerObjectSetFacing(member, group, UnionPartnerObjectGetFacing(member, group, &main0_p->arr[group].gname_uname.gname));
}
diff --git a/src/roamer.c b/src/roamer.c
index b3cc67f85..f3e8bbccd 100644
--- a/src/roamer.c
+++ b/src/roamer.c
@@ -1,11 +1,10 @@
#include "global.h"
-#include "roamer.h"
#include "random.h"
#include "overworld.h"
#include "field_specials.h"
#include "constants/species.h"
#include "constants/maps.h"
-#include "constants/region_map.h"
+#include "constants/region_map_sections.h"
EWRAM_DATA u8 sLocationHistory[3][2] = {};
EWRAM_DATA u8 sRoamerLocation[2] = {};
@@ -62,7 +61,7 @@ void ClearRoamerData(void)
#define GetRoamerSpecies() ({\
u16 a;\
- switch (ScrSpecial_GetStarter())\
+ switch (GetStarterSpecies())\
{\
default:\
a = SPECIES_RAIKOU;\
diff --git a/src/rock.c b/src/rock.c
index 082f3b655..3ec9cec04 100644
--- a/src/rock.c
+++ b/src/rock.c
@@ -704,7 +704,7 @@ static void sub_80B4F78(struct Sprite *sprite)
{
u8 taskId = FindTaskIdByFunc(sub_80B4D00);
- if (taskId != TASK_NONE)
+ if (taskId != TAIL_SENTINEL)
--gTasks[taskId].data[11];
DestroySprite(sprite);
}
diff --git a/src/safari_zone.c b/src/safari_zone.c
index 65fb89bca..29e436d35 100644
--- a/src/safari_zone.c
+++ b/src/safari_zone.c
@@ -2,7 +2,6 @@
#include "battle.h"
#include "event_scripts.h"
#include "overworld.h"
-#include "battle.h"
#include "script.h"
#include "event_data.h"
#include "field_screen_effect.h"
diff --git a/src/save.c b/src/save.c
index a2d365886..3db8dcdbf 100644
--- a/src/save.c
+++ b/src/save.c
@@ -856,7 +856,7 @@ void sub_80DA634(u8 taskId)
gTasks[taskId].data[0] = 1;
break;
case 1:
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
gTasks[taskId].data[0] = 2;
break;
case 2:
@@ -890,7 +890,7 @@ void sub_80DA634(u8 taskId)
break;
case 7:
ClearContinueGameWarpStatus2();
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
gTasks[taskId].data[0] = 8;
break;
case 8:
@@ -901,7 +901,7 @@ void sub_80DA634(u8 taskId)
}
break;
case 9:
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
gTasks[taskId].data[0] = 10;
break;
case 10:
diff --git a/src/save_failed_screen.c b/src/save_failed_screen.c
index b6cce890a..09e49a1bb 100644
--- a/src/save_failed_screen.c
+++ b/src/save_failed_screen.c
@@ -6,7 +6,6 @@
#include "help_system.h"
#include "m4a.h"
#include "save.h"
-#include "save_failed_screen.h"
#include "strings.h"
#include "text.h"
diff --git a/src/scanline_effect.c b/src/scanline_effect.c
index 22699b96d..e664945cd 100644
--- a/src/scanline_effect.c
+++ b/src/scanline_effect.c
@@ -1,5 +1,4 @@
#include "global.h"
-#include "battle.h"
#include "task.h"
#include "trig.h"
#include "scanline_effect.h"
diff --git a/src/scrcmd.c b/src/scrcmd.c
index c79a8bd1f..32ac5c4e2 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -21,7 +21,6 @@
#include "field_message_box.h"
#include "new_menu_helpers.h"
#include "window.h"
-#include "start_menu.h"
#include "script_menu.h"
#include "string_util.h"
#include "data.h"
@@ -38,7 +37,6 @@
#include "field_effect.h"
#include "fieldmap.h"
#include "field_door.h"
-#include "scrcmd.h"
extern u16 (*const gSpecials[])(void);
extern u16 (*const gSpecialsEnd[])(void);
@@ -62,7 +60,7 @@ extern u8 gSelectedObjectEvent;
// This is defined in here so the optimizer can't see its value when compiling
// script.c.
-void * const gNullScriptPtr = NULL;
+void *const gNullScriptPtr = NULL;
static const u8 sScriptConditionTable[6][3] =
{
@@ -75,30 +73,30 @@ static const u8 sScriptConditionTable[6][3] =
1, 0, 1, // !=
};
-bool8 ScrCmd_nop(struct ScriptContext *ctx)
+bool8 ScrCmd_nop(struct ScriptContext * ctx)
{
return FALSE;
}
-bool8 ScrCmd_nop1(struct ScriptContext *ctx)
+bool8 ScrCmd_nop1(struct ScriptContext * ctx)
{
return FALSE;
}
-bool8 ScrCmd_end(struct ScriptContext *ctx)
+bool8 ScrCmd_end(struct ScriptContext * ctx)
{
StopScript(ctx);
return FALSE;
}
-bool8 ScrCmd_gotonative(struct ScriptContext *ctx)
+bool8 ScrCmd_gotonative(struct ScriptContext * ctx)
{
bool8 (*func)(void) = (bool8 (*)(void))ScriptReadWord(ctx);
SetupNativeScript(ctx, func);
return TRUE;
}
-bool8 ScrCmd_special(struct ScriptContext *ctx)
+bool8 ScrCmd_special(struct ScriptContext * ctx)
{
u16 (*const *specialPtr)(void) = gSpecials + ScriptReadHalfword(ctx);
if (specialPtr < gSpecialsEnd)
@@ -108,7 +106,7 @@ bool8 ScrCmd_special(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_specialvar(struct ScriptContext *ctx)
+bool8 ScrCmd_specialvar(struct ScriptContext * ctx)
{
u16 * varPtr = GetVarPointer(ScriptReadHalfword(ctx));
u16 (*const *specialPtr)(void) = gSpecials + ScriptReadHalfword(ctx);
@@ -119,40 +117,40 @@ bool8 ScrCmd_specialvar(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_callnative(struct ScriptContext *ctx)
+bool8 ScrCmd_callnative(struct ScriptContext * ctx)
{
void (*func )(void) = ((void (*)(void))ScriptReadWord(ctx));
func();
return FALSE;
}
-bool8 ScrCmd_waitstate(struct ScriptContext *ctx)
+bool8 ScrCmd_waitstate(struct ScriptContext * ctx)
{
ScriptContext1_Stop();
return TRUE;
}
-bool8 ScrCmd_goto(struct ScriptContext *ctx)
+bool8 ScrCmd_goto(struct ScriptContext * ctx)
{
const u8 * scrptr = (const u8 *)ScriptReadWord(ctx);
ScriptJump(ctx, scrptr);
return FALSE;
}
-bool8 ScrCmd_return(struct ScriptContext *ctx)
+bool8 ScrCmd_return(struct ScriptContext * ctx)
{
ScriptReturn(ctx);
return FALSE;
}
-bool8 ScrCmd_call(struct ScriptContext *ctx)
+bool8 ScrCmd_call(struct ScriptContext * ctx)
{
const u8 * scrptr = (const u8 *)ScriptReadWord(ctx);
ScriptCall(ctx, scrptr);
return FALSE;
}
-bool8 ScrCmd_goto_if(struct ScriptContext *ctx)
+bool8 ScrCmd_goto_if(struct ScriptContext * ctx)
{
u8 condition = ScriptReadByte(ctx);
const u8 * scrptr = (const u8 *)ScriptReadWord(ctx);
@@ -161,7 +159,7 @@ bool8 ScrCmd_goto_if(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_call_if(struct ScriptContext *ctx)
+bool8 ScrCmd_call_if(struct ScriptContext * ctx)
{
u8 condition = ScriptReadByte(ctx);
const u8 * scrptr = (const u8 *)ScriptReadWord(ctx);
@@ -170,7 +168,7 @@ bool8 ScrCmd_call_if(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setvaddress(struct ScriptContext *ctx)
+bool8 ScrCmd_setvaddress(struct ScriptContext * ctx)
{
u32 addr1 = (u32)ctx->scriptPtr - 1;
u32 addr2 = ScriptReadWord(ctx);
@@ -179,21 +177,21 @@ bool8 ScrCmd_setvaddress(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_vgoto(struct ScriptContext *ctx)
+bool8 ScrCmd_vgoto(struct ScriptContext * ctx)
{
const u8 * scrptr = (const u8 *)ScriptReadWord(ctx);
ScriptJump(ctx, scrptr - gVScriptOffset);
return FALSE;
}
-bool8 ScrCmd_vcall(struct ScriptContext *ctx)
+bool8 ScrCmd_vcall(struct ScriptContext * ctx)
{
const u8 * scrptr = (const u8 *)ScriptReadWord(ctx);
ScriptCall(ctx, scrptr - gVScriptOffset);
return FALSE;
}
-bool8 ScrCmd_vgoto_if(struct ScriptContext *ctx)
+bool8 ScrCmd_vgoto_if(struct ScriptContext * ctx)
{
u8 condition = ScriptReadByte(ctx);
const u8 * scrptr = (const u8 *)ScriptReadWord(ctx) - gVScriptOffset;
@@ -202,7 +200,7 @@ bool8 ScrCmd_vgoto_if(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_vcall_if(struct ScriptContext *ctx)
+bool8 ScrCmd_vcall_if(struct ScriptContext * ctx)
{
u8 condition = ScriptReadByte(ctx);
const u8 * scrptr = (const u8 *)ScriptReadWord(ctx) - gVScriptOffset;
@@ -211,7 +209,7 @@ bool8 ScrCmd_vcall_if(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_gotostd(struct ScriptContext *ctx)
+bool8 ScrCmd_gotostd(struct ScriptContext * ctx)
{
u8 stdIdx = ScriptReadByte(ctx);
const u8 *const * script = gStdScripts + stdIdx;
@@ -220,7 +218,7 @@ bool8 ScrCmd_gotostd(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_callstd(struct ScriptContext *ctx)
+bool8 ScrCmd_callstd(struct ScriptContext * ctx)
{
u8 stdIdx = ScriptReadByte(ctx);
const u8 *const * script = gStdScripts + stdIdx;
@@ -229,7 +227,7 @@ bool8 ScrCmd_callstd(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_gotostd_if(struct ScriptContext *ctx)
+bool8 ScrCmd_gotostd_if(struct ScriptContext * ctx)
{
u8 condition = ScriptReadByte(ctx);
u8 stdIdx = ScriptReadByte(ctx);
@@ -242,7 +240,7 @@ bool8 ScrCmd_gotostd_if(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_callstd_if(struct ScriptContext *ctx)
+bool8 ScrCmd_callstd_if(struct ScriptContext * ctx)
{
u8 condition = ScriptReadByte(ctx);
u8 stdIdx = ScriptReadByte(ctx);
@@ -255,26 +253,26 @@ bool8 ScrCmd_callstd_if(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_gotoram(struct ScriptContext *ctx)
+bool8 ScrCmd_gotoram(struct ScriptContext * ctx)
{
ScriptJump(ctx, gRAMScriptPtr);
return FALSE;
}
-bool8 ScrCmd_killscript(struct ScriptContext *ctx)
+bool8 ScrCmd_killscript(struct ScriptContext * ctx)
{
ClearRamScript();
StopScript(ctx);
return TRUE;
}
-bool8 ScrCmd_setmysteryeventstatus(struct ScriptContext *ctx)
+bool8 ScrCmd_setmysteryeventstatus(struct ScriptContext * ctx)
{
SetMysteryEventScriptStatus(ScriptReadByte(ctx));
return FALSE;
}
-bool8 ScrCmd_execram(struct ScriptContext *ctx)
+bool8 ScrCmd_execram(struct ScriptContext * ctx)
{
const u8 * script = sub_8069E48();
if (script != NULL)
@@ -285,42 +283,42 @@ bool8 ScrCmd_execram(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_loadword(struct ScriptContext *ctx)
+bool8 ScrCmd_loadword(struct ScriptContext * ctx)
{
u8 which = ScriptReadByte(ctx);
ctx->data[which] = ScriptReadWord(ctx);
return FALSE;
}
-bool8 ScrCmd_loadbytefromaddr(struct ScriptContext *ctx)
+bool8 ScrCmd_loadbytefromaddr(struct ScriptContext * ctx)
{
u8 which = ScriptReadByte(ctx);
ctx->data[which] = *(const u8 *)ScriptReadWord(ctx);
return FALSE;
}
-bool8 ScrCmd_writebytetoaddr(struct ScriptContext *ctx)
+bool8 ScrCmd_writebytetoaddr(struct ScriptContext * ctx)
{
u8 value = ScriptReadByte(ctx);
*(u8 *)ScriptReadWord(ctx) = value;
return FALSE;
}
-bool8 ScrCmd_loadbyte(struct ScriptContext *ctx)
+bool8 ScrCmd_loadbyte(struct ScriptContext * ctx)
{
u8 which = ScriptReadByte(ctx);
ctx->data[which] = ScriptReadByte(ctx);
return FALSE;
}
-bool8 ScrCmd_setptrbyte(struct ScriptContext *ctx)
+bool8 ScrCmd_setptrbyte(struct ScriptContext * ctx)
{
u8 which = ScriptReadByte(ctx);
*(u8 *)ScriptReadWord(ctx) = ctx->data[which];
return FALSE;
}
-bool8 ScrCmd_copylocal(struct ScriptContext *ctx)
+bool8 ScrCmd_copylocal(struct ScriptContext * ctx)
{
u8 whichDst = ScriptReadByte(ctx);
u8 whichSrc = ScriptReadByte(ctx);
@@ -328,21 +326,21 @@ bool8 ScrCmd_copylocal(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_copybyte(struct ScriptContext *ctx)
+bool8 ScrCmd_copybyte(struct ScriptContext * ctx)
{
u8 * dest = (u8 *)ScriptReadWord(ctx);
*dest = *(const u8 *)ScriptReadWord(ctx);
return FALSE;
}
-bool8 ScrCmd_setvar(struct ScriptContext *ctx)
+bool8 ScrCmd_setvar(struct ScriptContext * ctx)
{
u16 * varPtr = GetVarPointer(ScriptReadHalfword(ctx));
*varPtr = ScriptReadHalfword(ctx);
return FALSE;
}
-bool8 ScrCmd_copyvar(struct ScriptContext *ctx)
+bool8 ScrCmd_copyvar(struct ScriptContext * ctx)
{
u16 * destPtr = GetVarPointer(ScriptReadHalfword(ctx));
u16 * srcPtr = GetVarPointer(ScriptReadHalfword(ctx));
@@ -350,7 +348,7 @@ bool8 ScrCmd_copyvar(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setorcopyvar(struct ScriptContext *ctx)
+bool8 ScrCmd_setorcopyvar(struct ScriptContext * ctx)
{
u16 * destPtr = GetVarPointer(ScriptReadHalfword(ctx));
*destPtr = VarGet(ScriptReadHalfword(ctx));
@@ -368,7 +366,7 @@ u8 compare_012(u16 left, u16 right)
}
// comparelocaltolocal
-bool8 ScrCmd_compare_local_to_local(struct ScriptContext *ctx)
+bool8 ScrCmd_compare_local_to_local(struct ScriptContext * ctx)
{
const u8 value1 = ctx->data[ScriptReadByte(ctx)];
const u8 value2 = ctx->data[ScriptReadByte(ctx)];
@@ -378,7 +376,7 @@ bool8 ScrCmd_compare_local_to_local(struct ScriptContext *ctx)
}
// comparelocaltoimm
-bool8 ScrCmd_compare_local_to_value(struct ScriptContext *ctx)
+bool8 ScrCmd_compare_local_to_value(struct ScriptContext * ctx)
{
const u8 value1 = ctx->data[ScriptReadByte(ctx)];
const u8 value2 = ScriptReadByte(ctx);
@@ -387,7 +385,7 @@ bool8 ScrCmd_compare_local_to_value(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_compare_local_to_addr(struct ScriptContext *ctx)
+bool8 ScrCmd_compare_local_to_addr(struct ScriptContext * ctx)
{
const u8 value1 = ctx->data[ScriptReadByte(ctx)];
const u8 value2 = *(const u8 *)ScriptReadWord(ctx);
@@ -396,7 +394,7 @@ bool8 ScrCmd_compare_local_to_addr(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_compare_addr_to_local(struct ScriptContext *ctx)
+bool8 ScrCmd_compare_addr_to_local(struct ScriptContext * ctx)
{
const u8 value1 = *(const u8 *)ScriptReadWord(ctx);
const u8 value2 = ctx->data[ScriptReadByte(ctx)];
@@ -405,7 +403,7 @@ bool8 ScrCmd_compare_addr_to_local(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_compare_addr_to_value(struct ScriptContext *ctx)
+bool8 ScrCmd_compare_addr_to_value(struct ScriptContext * ctx)
{
const u8 value1 = *(const u8 *)ScriptReadWord(ctx);
const u8 value2 = ScriptReadByte(ctx);
@@ -414,7 +412,7 @@ bool8 ScrCmd_compare_addr_to_value(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_compare_addr_to_addr(struct ScriptContext *ctx)
+bool8 ScrCmd_compare_addr_to_addr(struct ScriptContext * ctx)
{
const u8 value1 = *(const u8 *)ScriptReadWord(ctx);
const u8 value2 = *(const u8 *)ScriptReadWord(ctx);
@@ -423,7 +421,7 @@ bool8 ScrCmd_compare_addr_to_addr(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_compare_var_to_value(struct ScriptContext *ctx)
+bool8 ScrCmd_compare_var_to_value(struct ScriptContext * ctx)
{
const u16 value1 = *GetVarPointer(ScriptReadHalfword(ctx));
const u16 value2 = ScriptReadHalfword(ctx);
@@ -432,7 +430,7 @@ bool8 ScrCmd_compare_var_to_value(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_compare_var_to_var(struct ScriptContext *ctx)
+bool8 ScrCmd_compare_var_to_var(struct ScriptContext * ctx)
{
const u16 *ptr1 = GetVarPointer(ScriptReadHalfword(ctx));
const u16 *ptr2 = GetVarPointer(ScriptReadHalfword(ctx));
@@ -441,21 +439,21 @@ bool8 ScrCmd_compare_var_to_var(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_addvar(struct ScriptContext *ctx)
+bool8 ScrCmd_addvar(struct ScriptContext * ctx)
{
u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx));
*ptr += ScriptReadHalfword(ctx);
return FALSE;
}
-bool8 ScrCmd_subvar(struct ScriptContext *ctx)
+bool8 ScrCmd_subvar(struct ScriptContext * ctx)
{
u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx));
*ptr -= VarGet(ScriptReadHalfword(ctx));
return FALSE;
}
-bool8 ScrCmd_random(struct ScriptContext *ctx)
+bool8 ScrCmd_random(struct ScriptContext * ctx)
{
u16 max = VarGet(ScriptReadHalfword(ctx));
@@ -463,7 +461,7 @@ bool8 ScrCmd_random(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_additem(struct ScriptContext *ctx)
+bool8 ScrCmd_additem(struct ScriptContext * ctx)
{
u16 itemId = VarGet(ScriptReadHalfword(ctx));
u32 quantity = VarGet(ScriptReadHalfword(ctx));
@@ -473,7 +471,7 @@ bool8 ScrCmd_additem(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_removeitem(struct ScriptContext *ctx)
+bool8 ScrCmd_removeitem(struct ScriptContext * ctx)
{
u16 itemId = VarGet(ScriptReadHalfword(ctx));
u32 quantity = VarGet(ScriptReadHalfword(ctx));
@@ -482,7 +480,7 @@ bool8 ScrCmd_removeitem(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_checkitemspace(struct ScriptContext *ctx)
+bool8 ScrCmd_checkitemspace(struct ScriptContext * ctx)
{
u16 itemId = VarGet(ScriptReadHalfword(ctx));
u32 quantity = VarGet(ScriptReadHalfword(ctx));
@@ -491,7 +489,7 @@ bool8 ScrCmd_checkitemspace(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_checkitem(struct ScriptContext *ctx)
+bool8 ScrCmd_checkitem(struct ScriptContext * ctx)
{
u16 itemId = VarGet(ScriptReadHalfword(ctx));
u32 quantity = VarGet(ScriptReadHalfword(ctx));
@@ -500,7 +498,7 @@ bool8 ScrCmd_checkitem(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_checkitemtype(struct ScriptContext *ctx)
+bool8 ScrCmd_checkitemtype(struct ScriptContext * ctx)
{
u16 itemId = VarGet(ScriptReadHalfword(ctx));
@@ -508,7 +506,7 @@ bool8 ScrCmd_checkitemtype(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_addpcitem(struct ScriptContext *ctx)
+bool8 ScrCmd_addpcitem(struct ScriptContext * ctx)
{
u16 itemId = VarGet(ScriptReadHalfword(ctx));
u16 quantity = VarGet(ScriptReadHalfword(ctx));
@@ -517,7 +515,7 @@ bool8 ScrCmd_addpcitem(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_checkpcitem(struct ScriptContext *ctx)
+bool8 ScrCmd_checkpcitem(struct ScriptContext * ctx)
{
u16 itemId = VarGet(ScriptReadHalfword(ctx));
u16 quantity = VarGet(ScriptReadHalfword(ctx));
@@ -526,7 +524,7 @@ bool8 ScrCmd_checkpcitem(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_givedecoration(struct ScriptContext *ctx)
+bool8 ScrCmd_givedecoration(struct ScriptContext * ctx)
{
u32 decorId = VarGet(ScriptReadHalfword(ctx));
@@ -534,7 +532,7 @@ bool8 ScrCmd_givedecoration(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_takedecoration(struct ScriptContext *ctx)
+bool8 ScrCmd_takedecoration(struct ScriptContext * ctx)
{
u32 decorId = VarGet(ScriptReadHalfword(ctx));
@@ -542,7 +540,7 @@ bool8 ScrCmd_takedecoration(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_checkdecorspace(struct ScriptContext *ctx)
+bool8 ScrCmd_checkdecorspace(struct ScriptContext * ctx)
{
u32 decorId = VarGet(ScriptReadHalfword(ctx));
@@ -550,7 +548,7 @@ bool8 ScrCmd_checkdecorspace(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_checkdecor(struct ScriptContext *ctx)
+bool8 ScrCmd_checkdecor(struct ScriptContext * ctx)
{
u32 decorId = VarGet(ScriptReadHalfword(ctx));
@@ -558,31 +556,31 @@ bool8 ScrCmd_checkdecor(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setflag(struct ScriptContext *ctx)
+bool8 ScrCmd_setflag(struct ScriptContext * ctx)
{
FlagSet(ScriptReadHalfword(ctx));
return FALSE;
}
-bool8 ScrCmd_clearflag(struct ScriptContext *ctx)
+bool8 ScrCmd_clearflag(struct ScriptContext * ctx)
{
FlagClear(ScriptReadHalfword(ctx));
return FALSE;
}
-bool8 ScrCmd_checkflag(struct ScriptContext *ctx)
+bool8 ScrCmd_checkflag(struct ScriptContext * ctx)
{
ctx->comparisonResult = FlagGet(ScriptReadHalfword(ctx));
return FALSE;
}
-bool8 ScrCmd_incrementgamestat(struct ScriptContext *ctx)
+bool8 ScrCmd_incrementgamestat(struct ScriptContext * ctx)
{
IncrementGameStat(ScriptReadByte(ctx));
return FALSE;
}
-bool8 ScrCmd_comparestattoword(struct ScriptContext *ctx)
+bool8 ScrCmd_comparestattoword(struct ScriptContext * ctx)
{
u8 statIdx = ScriptReadByte(ctx);
u32 value = ScriptReadWord(ctx);
@@ -597,22 +595,22 @@ bool8 ScrCmd_comparestattoword(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setworldmapflag(struct ScriptContext *ctx)
+bool8 ScrCmd_setworldmapflag(struct ScriptContext * ctx)
{
u16 value = ScriptReadHalfword(ctx);
- sub_8115748(value);
- sub_80F85BC(value);
+ QuestLog_RecordEnteredMap(value);
+ MapPreview_SetFlag(value);
return FALSE;
}
-bool8 ScrCmd_animateflash(struct ScriptContext *ctx)
+bool8 ScrCmd_animateflash(struct ScriptContext * ctx)
{
AnimateFlash(ScriptReadByte(ctx));
ScriptContext1_Stop();
return TRUE;
}
-bool8 ScrCmd_setflashradius(struct ScriptContext *ctx)
+bool8 ScrCmd_setflashradius(struct ScriptContext * ctx)
{
u16 flashLevel = VarGet(ScriptReadHalfword(ctx));
@@ -628,14 +626,14 @@ static bool8 IsPaletteNotActive(void)
return FALSE;
}
-bool8 ScrCmd_fadescreen(struct ScriptContext *ctx)
+bool8 ScrCmd_fadescreen(struct ScriptContext * ctx)
{
FadeScreen(ScriptReadByte(ctx), 0);
SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
-bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx)
+bool8 ScrCmd_fadescreenspeed(struct ScriptContext * ctx)
{
u8 mode = ScriptReadByte(ctx);
u8 speed = ScriptReadByte(ctx);
@@ -655,14 +653,14 @@ static bool8 RunPauseTimer(void)
return FALSE;
}
-bool8 ScrCmd_delay(struct ScriptContext *ctx)
+bool8 ScrCmd_delay(struct ScriptContext * ctx)
{
sPauseCounter = ScriptReadHalfword(ctx);
SetupNativeScript(ctx, RunPauseTimer);
return TRUE;
}
-bool8 ScrCmd_initclock(struct ScriptContext *ctx)
+bool8 ScrCmd_initclock(struct ScriptContext * ctx)
{
// u8 hour = VarGet(ScriptReadHalfword(ctx));
// u8 minute = VarGet(ScriptReadHalfword(ctx));
@@ -671,13 +669,13 @@ bool8 ScrCmd_initclock(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_dodailyevents(struct ScriptContext *ctx)
+bool8 ScrCmd_dodailyevents(struct ScriptContext * ctx)
{
// DoTimeBasedEvents();
return FALSE;
}
-bool8 ScrCmd_gettime(struct ScriptContext *ctx)
+bool8 ScrCmd_gettime(struct ScriptContext * ctx)
{
// RtcCalcLocalTime();
// gSpecialVar_0x8000 = gLocalTime.hours;
@@ -689,7 +687,7 @@ bool8 ScrCmd_gettime(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setweather(struct ScriptContext *ctx)
+bool8 ScrCmd_setweather(struct ScriptContext * ctx)
{
u16 weather = VarGet(ScriptReadHalfword(ctx));
@@ -697,25 +695,25 @@ bool8 ScrCmd_setweather(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_resetweather(struct ScriptContext *ctx)
+bool8 ScrCmd_resetweather(struct ScriptContext * ctx)
{
SetSav1WeatherFromCurrMapHeader();
return FALSE;
}
-bool8 ScrCmd_doweather(struct ScriptContext *ctx)
+bool8 ScrCmd_doweather(struct ScriptContext * ctx)
{
DoCurrentWeather();
return FALSE;
}
-bool8 ScrCmd_setstepcallback(struct ScriptContext *ctx)
+bool8 ScrCmd_setstepcallback(struct ScriptContext * ctx)
{
ActivatePerStepCallback(ScriptReadByte(ctx));
return FALSE;
}
-bool8 ScrCmd_setmaplayoutindex(struct ScriptContext *ctx)
+bool8 ScrCmd_setmaplayoutindex(struct ScriptContext * ctx)
{
u16 value = VarGet(ScriptReadHalfword(ctx));
@@ -723,7 +721,7 @@ bool8 ScrCmd_setmaplayoutindex(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_warp(struct ScriptContext *ctx)
+bool8 ScrCmd_warp(struct ScriptContext * ctx)
{
u8 mapGroup = ScriptReadByte(ctx);
u8 mapNum = ScriptReadByte(ctx);
@@ -737,7 +735,7 @@ bool8 ScrCmd_warp(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_warpsilent(struct ScriptContext *ctx)
+bool8 ScrCmd_warpsilent(struct ScriptContext * ctx)
{
u8 mapGroup = ScriptReadByte(ctx);
u8 mapNum = ScriptReadByte(ctx);
@@ -751,7 +749,7 @@ bool8 ScrCmd_warpsilent(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_warpdoor(struct ScriptContext *ctx)
+bool8 ScrCmd_warpdoor(struct ScriptContext * ctx)
{
u8 mapGroup = ScriptReadByte(ctx);
u8 mapNum = ScriptReadByte(ctx);
@@ -765,7 +763,7 @@ bool8 ScrCmd_warpdoor(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_warphole(struct ScriptContext *ctx)
+bool8 ScrCmd_warphole(struct ScriptContext * ctx)
{
u8 mapGroup = ScriptReadByte(ctx);
u8 mapNum = ScriptReadByte(ctx);
@@ -782,7 +780,7 @@ bool8 ScrCmd_warphole(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_warpteleport(struct ScriptContext *ctx)
+bool8 ScrCmd_warpteleport(struct ScriptContext * ctx)
{
u8 mapGroup = ScriptReadByte(ctx);
u8 mapNum = ScriptReadByte(ctx);
@@ -796,7 +794,7 @@ bool8 ScrCmd_warpteleport(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_warpteleport2(struct ScriptContext *ctx)
+bool8 ScrCmd_warpteleport2(struct ScriptContext * ctx)
{
u8 mapGroup = ScriptReadByte(ctx);
u8 mapNum = ScriptReadByte(ctx);
@@ -811,7 +809,7 @@ bool8 ScrCmd_warpteleport2(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_setwarp(struct ScriptContext *ctx)
+bool8 ScrCmd_setwarp(struct ScriptContext * ctx)
{
u8 mapGroup = ScriptReadByte(ctx);
u8 mapNum = ScriptReadByte(ctx);
@@ -823,7 +821,7 @@ bool8 ScrCmd_setwarp(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setdynamicwarp(struct ScriptContext *ctx)
+bool8 ScrCmd_setdynamicwarp(struct ScriptContext * ctx)
{
u8 mapGroup = ScriptReadByte(ctx);
u8 mapNum = ScriptReadByte(ctx);
@@ -835,7 +833,7 @@ bool8 ScrCmd_setdynamicwarp(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setdivewarp(struct ScriptContext *ctx)
+bool8 ScrCmd_setdivewarp(struct ScriptContext * ctx)
{
u8 mapGroup = ScriptReadByte(ctx);
u8 mapNum = ScriptReadByte(ctx);
@@ -847,7 +845,7 @@ bool8 ScrCmd_setdivewarp(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setholewarp(struct ScriptContext *ctx)
+bool8 ScrCmd_setholewarp(struct ScriptContext * ctx)
{
u8 mapGroup = ScriptReadByte(ctx);
u8 mapNum = ScriptReadByte(ctx);
@@ -859,7 +857,7 @@ bool8 ScrCmd_setholewarp(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setescapewarp(struct ScriptContext *ctx)
+bool8 ScrCmd_setescapewarp(struct ScriptContext * ctx)
{
u8 mapGroup = ScriptReadByte(ctx);
u8 mapNum = ScriptReadByte(ctx);
@@ -871,7 +869,7 @@ bool8 ScrCmd_setescapewarp(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_getplayerxy(struct ScriptContext *ctx)
+bool8 ScrCmd_getplayerxy(struct ScriptContext * ctx)
{
u16 *pX = GetVarPointer(ScriptReadHalfword(ctx));
u16 *pY = GetVarPointer(ScriptReadHalfword(ctx));
@@ -881,13 +879,13 @@ bool8 ScrCmd_getplayerxy(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_getpartysize(struct ScriptContext *ctx)
+bool8 ScrCmd_getpartysize(struct ScriptContext * ctx)
{
gSpecialVar_Result = CalculatePlayerPartyCount();
return FALSE;
}
-bool8 ScrCmd_playse(struct ScriptContext *ctx)
+bool8 ScrCmd_playse(struct ScriptContext * ctx)
{
PlaySE(ScriptReadHalfword(ctx));
return FALSE;
@@ -901,13 +899,13 @@ static bool8 WaitForSoundEffectFinish(void)
return FALSE;
}
-bool8 ScrCmd_waitse(struct ScriptContext *ctx)
+bool8 ScrCmd_waitse(struct ScriptContext * ctx)
{
SetupNativeScript(ctx, WaitForSoundEffectFinish);
return TRUE;
}
-bool8 ScrCmd_playfanfare(struct ScriptContext *ctx)
+bool8 ScrCmd_playfanfare(struct ScriptContext * ctx)
{
PlayFanfare(ScriptReadHalfword(ctx));
return FALSE;
@@ -918,13 +916,13 @@ static bool8 WaitForFanfareFinish(void)
return IsFanfareTaskInactive();
}
-bool8 ScrCmd_waitfanfare(struct ScriptContext *ctx)
+bool8 ScrCmd_waitfanfare(struct ScriptContext * ctx)
{
SetupNativeScript(ctx, WaitForFanfareFinish);
return TRUE;
}
-bool8 ScrCmd_playbgm(struct ScriptContext *ctx)
+bool8 ScrCmd_playbgm(struct ScriptContext * ctx)
{
u16 songId = ScriptReadHalfword(ctx);
bool8 val = ScriptReadByte(ctx);
@@ -937,13 +935,13 @@ bool8 ScrCmd_playbgm(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_savebgm(struct ScriptContext *ctx)
+bool8 ScrCmd_savebgm(struct ScriptContext * ctx)
{
Overworld_SetSavedMusic(ScriptReadHalfword(ctx));
return FALSE;
}
-bool8 ScrCmd_fadedefaultbgm(struct ScriptContext *ctx)
+bool8 ScrCmd_fadedefaultbgm(struct ScriptContext * ctx)
{
if (gQuestLogState == 2 || gQuestLogState == 3)
return FALSE;
@@ -951,7 +949,7 @@ bool8 ScrCmd_fadedefaultbgm(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_fadenewbgm(struct ScriptContext *ctx)
+bool8 ScrCmd_fadenewbgm(struct ScriptContext * ctx)
{
u16 music = ScriptReadHalfword(ctx);
if (gQuestLogState == 2 || gQuestLogState == 3)
@@ -960,7 +958,7 @@ bool8 ScrCmd_fadenewbgm(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_fadeoutbgm(struct ScriptContext *ctx)
+bool8 ScrCmd_fadeoutbgm(struct ScriptContext * ctx)
{
u8 speed = ScriptReadByte(ctx);
@@ -974,7 +972,7 @@ bool8 ScrCmd_fadeoutbgm(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_fadeinbgm(struct ScriptContext *ctx)
+bool8 ScrCmd_fadeinbgm(struct ScriptContext * ctx)
{
u8 speed = ScriptReadByte(ctx);
@@ -987,7 +985,7 @@ bool8 ScrCmd_fadeinbgm(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_applymovement(struct ScriptContext *ctx)
+bool8 ScrCmd_applymovement(struct ScriptContext * ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
const void *movementScript = (const void *)ScriptReadWord(ctx);
@@ -997,7 +995,7 @@ bool8 ScrCmd_applymovement(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_applymovement_at(struct ScriptContext *ctx)
+bool8 ScrCmd_applymovement_at(struct ScriptContext * ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
const void *movementScript = (const void *)ScriptReadWord(ctx);
@@ -1014,7 +1012,7 @@ static bool8 WaitForMovementFinish(void)
return ScriptMovement_IsObjectMovementFinished(sMovingNpcId, sMovingNpcMapId, sMovingNpcMapBank);
}
-bool8 ScrCmd_waitmovement(struct ScriptContext *ctx)
+bool8 ScrCmd_waitmovement(struct ScriptContext * ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
@@ -1026,7 +1024,7 @@ bool8 ScrCmd_waitmovement(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_waitmovement_at(struct ScriptContext *ctx)
+bool8 ScrCmd_waitmovement_at(struct ScriptContext * ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
u8 mapBank;
@@ -1042,7 +1040,7 @@ bool8 ScrCmd_waitmovement_at(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_removeobject(struct ScriptContext *ctx)
+bool8 ScrCmd_removeobject(struct ScriptContext * ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
@@ -1050,7 +1048,7 @@ bool8 ScrCmd_removeobject(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_removeobject_at(struct ScriptContext *ctx)
+bool8 ScrCmd_removeobject_at(struct ScriptContext * ctx)
{
u16 objectId = VarGet(ScriptReadHalfword(ctx));
u8 mapGroup = ScriptReadByte(ctx);
@@ -1060,7 +1058,7 @@ bool8 ScrCmd_removeobject_at(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_addobject(struct ScriptContext *ctx)
+bool8 ScrCmd_addobject(struct ScriptContext * ctx)
{
u16 objectId = VarGet(ScriptReadHalfword(ctx));
@@ -1068,7 +1066,7 @@ bool8 ScrCmd_addobject(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_addobject_at(struct ScriptContext *ctx)
+bool8 ScrCmd_addobject_at(struct ScriptContext * ctx)
{
u16 objectId = VarGet(ScriptReadHalfword(ctx));
u8 mapGroup = ScriptReadByte(ctx);
@@ -1078,7 +1076,7 @@ bool8 ScrCmd_addobject_at(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setobjectxy(struct ScriptContext *ctx)
+bool8 ScrCmd_setobjectxy(struct ScriptContext * ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
u16 x = VarGet(ScriptReadHalfword(ctx));
@@ -1088,7 +1086,7 @@ bool8 ScrCmd_setobjectxy(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setobjectxyperm(struct ScriptContext *ctx)
+bool8 ScrCmd_setobjectxyperm(struct ScriptContext * ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
u16 x = VarGet(ScriptReadHalfword(ctx));
@@ -1098,7 +1096,7 @@ bool8 ScrCmd_setobjectxyperm(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_moveobjectoffscreen(struct ScriptContext *ctx)
+bool8 ScrCmd_moveobjectoffscreen(struct ScriptContext * ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
@@ -1106,7 +1104,7 @@ bool8 ScrCmd_moveobjectoffscreen(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_showobject_at(struct ScriptContext *ctx)
+bool8 ScrCmd_showobject_at(struct ScriptContext * ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
u8 mapGroup = ScriptReadByte(ctx);
@@ -1116,7 +1114,7 @@ bool8 ScrCmd_showobject_at(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_hideobject_at(struct ScriptContext *ctx)
+bool8 ScrCmd_hideobject_at(struct ScriptContext * ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
u8 mapGroup = ScriptReadByte(ctx);
@@ -1126,7 +1124,7 @@ bool8 ScrCmd_hideobject_at(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setobjectpriority(struct ScriptContext *ctx)
+bool8 ScrCmd_setobjectpriority(struct ScriptContext * ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
u8 mapGroup = ScriptReadByte(ctx);
@@ -1137,7 +1135,7 @@ bool8 ScrCmd_setobjectpriority(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_resetobjectpriority(struct ScriptContext *ctx)
+bool8 ScrCmd_resetobjectpriority(struct ScriptContext * ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
u8 mapGroup = ScriptReadByte(ctx);
@@ -1147,7 +1145,7 @@ bool8 ScrCmd_resetobjectpriority(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_faceplayer(struct ScriptContext *ctx)
+bool8 ScrCmd_faceplayer(struct ScriptContext * ctx)
{
if (gObjectEvents[gSelectedObjectEvent].active)
{
@@ -1157,7 +1155,7 @@ bool8 ScrCmd_faceplayer(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_turnobject(struct ScriptContext *ctx)
+bool8 ScrCmd_turnobject(struct ScriptContext * ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
u8 direction = ScriptReadByte(ctx);
@@ -1166,7 +1164,7 @@ bool8 ScrCmd_turnobject(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setobjectmovementtype(struct ScriptContext *ctx)
+bool8 ScrCmd_setobjectmovementtype(struct ScriptContext * ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
u8 movementType = ScriptReadByte(ctx);
@@ -1175,7 +1173,7 @@ bool8 ScrCmd_setobjectmovementtype(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_createvobject(struct ScriptContext *ctx)
+bool8 ScrCmd_createvobject(struct ScriptContext * ctx)
{
u8 graphicsId = ScriptReadByte(ctx);
u8 v2 = ScriptReadByte(ctx);
@@ -1188,16 +1186,16 @@ bool8 ScrCmd_createvobject(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_turnvobject(struct ScriptContext *ctx)
+bool8 ScrCmd_turnvobject(struct ScriptContext * ctx)
{
u8 v1 = ScriptReadByte(ctx);
u8 direction = ScriptReadByte(ctx);
- sub_8069058(v1, direction);
+ TurnObjectEvent(v1, direction);
return FALSE;
}
-bool8 ScrCmd_lockall(struct ScriptContext *ctx)
+bool8 ScrCmd_lockall(struct ScriptContext * ctx)
{
if (IsUpdateLinkStateCBActive())
{
@@ -1211,7 +1209,7 @@ bool8 ScrCmd_lockall(struct ScriptContext *ctx)
}
}
-bool8 ScrCmd_lock(struct ScriptContext *ctx)
+bool8 ScrCmd_lock(struct ScriptContext * ctx)
{
if (IsUpdateLinkStateCBActive())
{
@@ -1233,19 +1231,19 @@ bool8 ScrCmd_lock(struct ScriptContext *ctx)
}
}
-bool8 ScrCmd_releaseall(struct ScriptContext *ctx)
+bool8 ScrCmd_releaseall(struct ScriptContext * ctx)
{
u8 playerObjectId;
HideFieldMessageBox();
playerObjectId = GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0);
ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]);
- sub_80974D8();
+ ScriptMovement_UnfreezeObjectEvents();
UnfreezeObjectEvents();
return FALSE;
}
-bool8 ScrCmd_release(struct ScriptContext *ctx)
+bool8 ScrCmd_release(struct ScriptContext * ctx)
{
u8 playerObjectId;
@@ -1254,19 +1252,19 @@ bool8 ScrCmd_release(struct ScriptContext *ctx)
ObjectEventClearHeldMovementIfFinished(&gObjectEvents[gSelectedObjectEvent]);
playerObjectId = GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0);
ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]);
- sub_80974D8();
+ ScriptMovement_UnfreezeObjectEvents();
UnfreezeObjectEvents();
return FALSE;
}
-bool8 ScrCmd_textcolor(struct ScriptContext *ctx)
+bool8 ScrCmd_textcolor(struct ScriptContext * ctx)
{
gSpecialVar_PrevTextColor = gSpecialVar_TextColor;
gSpecialVar_TextColor = ScriptReadByte(ctx);
return FALSE;
}
-bool8 ScrCmd_message(struct ScriptContext *ctx)
+bool8 ScrCmd_message(struct ScriptContext * ctx)
{
const u8 *msg = (const u8 *)ScriptReadWord(ctx);
@@ -1276,7 +1274,7 @@ bool8 ScrCmd_message(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_loadhelp(struct ScriptContext *ctx)
+bool8 ScrCmd_loadhelp(struct ScriptContext * ctx)
{
const u8 *msg = (const u8 *)ScriptReadWord(ctx);
@@ -1287,13 +1285,13 @@ bool8 ScrCmd_loadhelp(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_unloadhelp(struct ScriptContext *ctx)
+bool8 ScrCmd_unloadhelp(struct ScriptContext * ctx)
{
DestroyHelpMessageWindow_();
return FALSE;
}
-bool8 ScrCmd_messageautoscroll(struct ScriptContext *ctx)
+bool8 ScrCmd_messageautoscroll(struct ScriptContext * ctx)
{
const u8 *msg = (const u8 *)ScriptReadWord(ctx);
@@ -1303,13 +1301,13 @@ bool8 ScrCmd_messageautoscroll(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_waitmessage(struct ScriptContext *ctx)
+bool8 ScrCmd_waitmessage(struct ScriptContext * ctx)
{
SetupNativeScript(ctx, IsFieldMessageBoxHidden);
return TRUE;
}
-bool8 ScrCmd_closemessage(struct ScriptContext *ctx)
+bool8 ScrCmd_closemessage(struct ScriptContext * ctx)
{
HideFieldMessageBox();
return FALSE;
@@ -1403,7 +1401,7 @@ static u8 sub_806B96C(struct ScriptContext * ctx)
return 0;
}
-bool8 ScrCmd_waitbuttonpress(struct ScriptContext *ctx)
+bool8 ScrCmd_waitbuttonpress(struct ScriptContext * ctx)
{
gUnknown_3005070 = ctx;
@@ -1413,7 +1411,7 @@ bool8 ScrCmd_waitbuttonpress(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_yesnobox(struct ScriptContext *ctx)
+bool8 ScrCmd_yesnobox(struct ScriptContext * ctx)
{
u8 left = ScriptReadByte(ctx);
u8 top = ScriptReadByte(ctx);
@@ -1429,7 +1427,7 @@ bool8 ScrCmd_yesnobox(struct ScriptContext *ctx)
}
}
-bool8 ScrCmd_multichoice(struct ScriptContext *ctx)
+bool8 ScrCmd_multichoice(struct ScriptContext * ctx)
{
u8 left = ScriptReadByte(ctx);
u8 top = ScriptReadByte(ctx);
@@ -1447,7 +1445,7 @@ bool8 ScrCmd_multichoice(struct ScriptContext *ctx)
}
}
-bool8 ScrCmd_multichoicedefault(struct ScriptContext *ctx)
+bool8 ScrCmd_multichoicedefault(struct ScriptContext * ctx)
{
u8 left = ScriptReadByte(ctx);
u8 top = ScriptReadByte(ctx);
@@ -1466,7 +1464,7 @@ bool8 ScrCmd_multichoicedefault(struct ScriptContext *ctx)
}
}
-bool8 ScrCmd_drawbox(struct ScriptContext *ctx)
+bool8 ScrCmd_drawbox(struct ScriptContext * ctx)
{
/*u8 left = ScriptReadByte(ctx);
u8 top = ScriptReadByte(ctx);
@@ -1477,7 +1475,7 @@ bool8 ScrCmd_drawbox(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_multichoicegrid(struct ScriptContext *ctx)
+bool8 ScrCmd_multichoicegrid(struct ScriptContext * ctx)
{
u8 left = ScriptReadByte(ctx);
u8 top = ScriptReadByte(ctx);
@@ -1496,7 +1494,7 @@ bool8 ScrCmd_multichoicegrid(struct ScriptContext *ctx)
}
}
-bool8 ScrCmd_erasebox(struct ScriptContext *ctx)
+bool8 ScrCmd_erasebox(struct ScriptContext * ctx)
{
u8 left = ScriptReadByte(ctx);
u8 top = ScriptReadByte(ctx);
@@ -1507,7 +1505,7 @@ bool8 ScrCmd_erasebox(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_drawboxtext(struct ScriptContext *ctx)
+bool8 ScrCmd_drawboxtext(struct ScriptContext * ctx)
{
// u8 left = ScriptReadByte(ctx);
// u8 top = ScriptReadByte(ctx);
@@ -1522,7 +1520,7 @@ bool8 ScrCmd_drawboxtext(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_showmonpic(struct ScriptContext *ctx)
+bool8 ScrCmd_showmonpic(struct ScriptContext * ctx)
{
u16 species = VarGet(ScriptReadHalfword(ctx));
u8 x = ScriptReadByte(ctx);
@@ -1533,7 +1531,7 @@ bool8 ScrCmd_showmonpic(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_hidemonpic(struct ScriptContext *ctx)
+bool8 ScrCmd_hidemonpic(struct ScriptContext * ctx)
{
bool8 (*func)(void) = ScriptMenu_GetPicboxWaitFunc();
@@ -1543,7 +1541,7 @@ bool8 ScrCmd_hidemonpic(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_showcontestwinner(struct ScriptContext *ctx)
+bool8 ScrCmd_showcontestwinner(struct ScriptContext * ctx)
{
u8 v1 = ScriptReadByte(ctx);
@@ -1558,7 +1556,7 @@ bool8 ScrCmd_showcontestwinner(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_braillemessage(struct ScriptContext *ctx)
+bool8 ScrCmd_braillemessage(struct ScriptContext * ctx)
{
u8 *ptr = (u8 *)ScriptReadWord(ctx);
if (ptr == NULL)
@@ -1570,7 +1568,7 @@ bool8 ScrCmd_braillemessage(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_getbraillestringwidth(struct ScriptContext *ctx)
+bool8 ScrCmd_getbraillestringwidth(struct ScriptContext * ctx)
{
u8 *ptr = (u8 *)ScriptReadWord(ctx);
if (ptr == NULL)
@@ -1580,7 +1578,7 @@ bool8 ScrCmd_getbraillestringwidth(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_vmessage(struct ScriptContext *ctx)
+bool8 ScrCmd_vmessage(struct ScriptContext * ctx)
{
u32 v1 = ScriptReadWord(ctx);
@@ -1588,14 +1586,14 @@ bool8 ScrCmd_vmessage(struct ScriptContext *ctx)
return FALSE;
}
-u8 * const sScriptStringVars[] =
+u8 *const sScriptStringVars[] =
{
gStringVar1,
gStringVar2,
gStringVar3,
};
-bool8 ScrCmd_bufferspeciesname(struct ScriptContext *ctx)
+bool8 ScrCmd_bufferspeciesname(struct ScriptContext * ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
u16 species = VarGet(ScriptReadHalfword(ctx));
@@ -1604,7 +1602,7 @@ bool8 ScrCmd_bufferspeciesname(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_bufferleadmonspeciesname(struct ScriptContext *ctx)
+bool8 ScrCmd_bufferleadmonspeciesname(struct ScriptContext * ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
@@ -1615,7 +1613,7 @@ bool8 ScrCmd_bufferleadmonspeciesname(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_bufferpartymonnick(struct ScriptContext *ctx)
+bool8 ScrCmd_bufferpartymonnick(struct ScriptContext * ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
u16 partyIndex = VarGet(ScriptReadHalfword(ctx));
@@ -1625,7 +1623,7 @@ bool8 ScrCmd_bufferpartymonnick(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_bufferitemname(struct ScriptContext *ctx)
+bool8 ScrCmd_bufferitemname(struct ScriptContext * ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
u16 itemId = VarGet(ScriptReadHalfword(ctx));
@@ -1637,7 +1635,7 @@ bool8 ScrCmd_bufferitemname(struct ScriptContext *ctx)
const u8 gUnknown_83A72A0[] = _("S");
const u8 gUnknown_83A72A2[] = _("IES");
-bool8 ScrCmd_bufferitemnameplural(struct ScriptContext *ctx)
+bool8 ScrCmd_bufferitemnameplural(struct ScriptContext * ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
u16 itemId = VarGet(ScriptReadHalfword(ctx));
@@ -1660,7 +1658,7 @@ bool8 ScrCmd_bufferitemnameplural(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_bufferdecorationname(struct ScriptContext *ctx)
+bool8 ScrCmd_bufferdecorationname(struct ScriptContext * ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
u16 decorId = VarGet(ScriptReadHalfword(ctx));
@@ -1669,7 +1667,7 @@ bool8 ScrCmd_bufferdecorationname(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_buffermovename(struct ScriptContext *ctx)
+bool8 ScrCmd_buffermovename(struct ScriptContext * ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
u16 moveId = VarGet(ScriptReadHalfword(ctx));
@@ -1678,7 +1676,7 @@ bool8 ScrCmd_buffermovename(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_buffernumberstring(struct ScriptContext *ctx)
+bool8 ScrCmd_buffernumberstring(struct ScriptContext * ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
u16 v1 = VarGet(ScriptReadHalfword(ctx));
@@ -1688,7 +1686,7 @@ bool8 ScrCmd_buffernumberstring(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_bufferstdstring(struct ScriptContext *ctx)
+bool8 ScrCmd_bufferstdstring(struct ScriptContext * ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
u16 index = VarGet(ScriptReadHalfword(ctx));
@@ -1698,7 +1696,7 @@ bool8 ScrCmd_bufferstdstring(struct ScriptContext *ctx)
}
/*
-bool8 ScrCmd_buffercontesttype(struct ScriptContext *ctx)
+bool8 ScrCmd_buffercontesttype(struct ScriptContext * ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
u16 index = VarGet(ScriptReadHalfword(ctx));
@@ -1708,7 +1706,7 @@ bool8 ScrCmd_buffercontesttype(struct ScriptContext *ctx)
}
*/
-bool8 ScrCmd_bufferstring(struct ScriptContext *ctx)
+bool8 ScrCmd_bufferstring(struct ScriptContext * ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
const u8 *text = (u8 *)ScriptReadWord(ctx);
@@ -1717,7 +1715,7 @@ bool8 ScrCmd_bufferstring(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_vloadword(struct ScriptContext *ctx)
+bool8 ScrCmd_vloadword(struct ScriptContext * ctx)
{
const u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gVScriptOffset);
@@ -1725,7 +1723,7 @@ bool8 ScrCmd_vloadword(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_vbufferstring(struct ScriptContext *ctx)
+bool8 ScrCmd_vbufferstring(struct ScriptContext * ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
u32 addr = ScriptReadWord(ctx);
@@ -1736,7 +1734,7 @@ bool8 ScrCmd_vbufferstring(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_bufferboxname(struct ScriptContext *ctx)
+bool8 ScrCmd_bufferboxname(struct ScriptContext * ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
u16 boxId = VarGet(ScriptReadHalfword(ctx));
@@ -1745,7 +1743,7 @@ bool8 ScrCmd_bufferboxname(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_givemon(struct ScriptContext *ctx)
+bool8 ScrCmd_givemon(struct ScriptContext * ctx)
{
u16 species = VarGet(ScriptReadHalfword(ctx));
u8 level = ScriptReadByte(ctx);
@@ -1758,7 +1756,7 @@ bool8 ScrCmd_givemon(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_giveegg(struct ScriptContext *ctx)
+bool8 ScrCmd_giveegg(struct ScriptContext * ctx)
{
u16 species = VarGet(ScriptReadHalfword(ctx));
@@ -1766,7 +1764,7 @@ bool8 ScrCmd_giveegg(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setmonmove(struct ScriptContext *ctx)
+bool8 ScrCmd_setmonmove(struct ScriptContext * ctx)
{
u8 partyIndex = ScriptReadByte(ctx);
u8 slot = ScriptReadByte(ctx);
@@ -1776,7 +1774,7 @@ bool8 ScrCmd_setmonmove(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_checkpartymove(struct ScriptContext *ctx)
+bool8 ScrCmd_checkpartymove(struct ScriptContext * ctx)
{
u8 i;
u16 moveId = ScriptReadHalfword(ctx);
@@ -1797,7 +1795,7 @@ bool8 ScrCmd_checkpartymove(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_addmoney(struct ScriptContext *ctx)
+bool8 ScrCmd_addmoney(struct ScriptContext * ctx)
{
u32 amount = ScriptReadWord(ctx);
u8 ignore = ScriptReadByte(ctx);
@@ -1807,7 +1805,7 @@ bool8 ScrCmd_addmoney(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_removemoney(struct ScriptContext *ctx)
+bool8 ScrCmd_removemoney(struct ScriptContext * ctx)
{
u32 amount = ScriptReadWord(ctx);
u8 ignore = ScriptReadByte(ctx);
@@ -1817,7 +1815,7 @@ bool8 ScrCmd_removemoney(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_checkmoney(struct ScriptContext *ctx)
+bool8 ScrCmd_checkmoney(struct ScriptContext * ctx)
{
u32 amount = ScriptReadWord(ctx);
u8 ignore = ScriptReadByte(ctx);
@@ -1827,7 +1825,7 @@ bool8 ScrCmd_checkmoney(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_showmoneybox(struct ScriptContext *ctx)
+bool8 ScrCmd_showmoneybox(struct ScriptContext * ctx)
{
u8 x = ScriptReadByte(ctx);
u8 y = ScriptReadByte(ctx);
@@ -1838,7 +1836,7 @@ bool8 ScrCmd_showmoneybox(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_hidemoneybox(struct ScriptContext *ctx)
+bool8 ScrCmd_hidemoneybox(struct ScriptContext * ctx)
{
/*u8 x = ScriptReadByte(ctx);
u8 y = ScriptReadByte(ctx);*/
@@ -1847,7 +1845,7 @@ bool8 ScrCmd_hidemoneybox(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_updatemoneybox(struct ScriptContext *ctx)
+bool8 ScrCmd_updatemoneybox(struct ScriptContext * ctx)
{
u8 x = ScriptReadByte(ctx);
u8 y = ScriptReadByte(ctx);
@@ -1858,7 +1856,7 @@ bool8 ScrCmd_updatemoneybox(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_showcoinsbox(struct ScriptContext *ctx)
+bool8 ScrCmd_showcoinsbox(struct ScriptContext * ctx)
{
u8 x = ScriptReadByte(ctx);
u8 y = ScriptReadByte(ctx);
@@ -1868,7 +1866,7 @@ bool8 ScrCmd_showcoinsbox(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_hidecoinsbox(struct ScriptContext *ctx)
+bool8 ScrCmd_hidecoinsbox(struct ScriptContext * ctx)
{
u8 x = ScriptReadByte(ctx);
u8 y = ScriptReadByte(ctx);
@@ -1877,7 +1875,7 @@ bool8 ScrCmd_hidecoinsbox(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_updatecoinsbox(struct ScriptContext *ctx)
+bool8 ScrCmd_updatecoinsbox(struct ScriptContext * ctx)
{
u8 x = ScriptReadByte(ctx);
u8 y = ScriptReadByte(ctx);
@@ -1886,31 +1884,31 @@ bool8 ScrCmd_updatecoinsbox(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_trainerbattle(struct ScriptContext *ctx)
+bool8 ScrCmd_trainerbattle(struct ScriptContext * ctx)
{
ctx->scriptPtr = BattleSetup_ConfigureTrainerBattle(ctx->scriptPtr);
return FALSE;
}
-bool8 ScrCmd_dotrainerbattle(struct ScriptContext *ctx)
+bool8 ScrCmd_dotrainerbattle(struct ScriptContext * ctx)
{
- BattleSetup_StartTrainerBattle();
+ StartTrainerBattle();
return TRUE;
}
-bool8 ScrCmd_gotopostbattlescript(struct ScriptContext *ctx)
+bool8 ScrCmd_gotopostbattlescript(struct ScriptContext * ctx)
{
ctx->scriptPtr = BattleSetup_GetScriptAddrAfterBattle();
return FALSE;
}
-bool8 ScrCmd_gotobeatenscript(struct ScriptContext *ctx)
+bool8 ScrCmd_gotobeatenscript(struct ScriptContext * ctx)
{
ctx->scriptPtr = BattleSetup_GetTrainerPostBattleScript();
return FALSE;
}
-bool8 ScrCmd_checktrainerflag(struct ScriptContext *ctx)
+bool8 ScrCmd_checktrainerflag(struct ScriptContext * ctx)
{
u16 index = VarGet(ScriptReadHalfword(ctx));
@@ -1918,7 +1916,7 @@ bool8 ScrCmd_checktrainerflag(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_settrainerflag(struct ScriptContext *ctx)
+bool8 ScrCmd_settrainerflag(struct ScriptContext * ctx)
{
u16 index = VarGet(ScriptReadHalfword(ctx));
@@ -1926,7 +1924,7 @@ bool8 ScrCmd_settrainerflag(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx)
+bool8 ScrCmd_cleartrainerflag(struct ScriptContext * ctx)
{
u16 index = VarGet(ScriptReadHalfword(ctx));
@@ -1934,7 +1932,7 @@ bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setwildbattle(struct ScriptContext *ctx)
+bool8 ScrCmd_setwildbattle(struct ScriptContext * ctx)
{
u16 species = ScriptReadHalfword(ctx);
u8 level = ScriptReadByte(ctx);
@@ -1944,14 +1942,14 @@ bool8 ScrCmd_setwildbattle(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_dowildbattle(struct ScriptContext *ctx)
+bool8 ScrCmd_dowildbattle(struct ScriptContext * ctx)
{
- BattleSetup_StartScriptedWildBattle();
+ StartScriptedWildBattle();
ScriptContext1_Stop();
return TRUE;
}
-bool8 ScrCmd_pokemart(struct ScriptContext *ctx)
+bool8 ScrCmd_pokemart(struct ScriptContext * ctx)
{
const void *ptr = (void *)ScriptReadWord(ctx);
@@ -1960,7 +1958,7 @@ bool8 ScrCmd_pokemart(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_pokemartdecoration(struct ScriptContext *ctx)
+bool8 ScrCmd_pokemartdecoration(struct ScriptContext * ctx)
{
const void *ptr = (void *)ScriptReadWord(ctx);
@@ -1969,7 +1967,7 @@ bool8 ScrCmd_pokemartdecoration(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_pokemartdecoration2(struct ScriptContext *ctx)
+bool8 ScrCmd_pokemartdecoration2(struct ScriptContext * ctx)
{
const void *ptr = (void *)ScriptReadWord(ctx);
@@ -1978,7 +1976,7 @@ bool8 ScrCmd_pokemartdecoration2(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_playslotmachine(struct ScriptContext *ctx)
+bool8 ScrCmd_playslotmachine(struct ScriptContext * ctx)
{
u8 slotMachineIndex = VarGet(ScriptReadHalfword(ctx));
@@ -1987,7 +1985,7 @@ bool8 ScrCmd_playslotmachine(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_setberrytree(struct ScriptContext *ctx)
+bool8 ScrCmd_setberrytree(struct ScriptContext * ctx)
{
// u8 treeId = ScriptReadByte(ctx);
// u8 berry = ScriptReadByte(ctx);
@@ -2000,7 +1998,7 @@ bool8 ScrCmd_setberrytree(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_getpricereduction(struct ScriptContext *ctx)
+bool8 ScrCmd_getpricereduction(struct ScriptContext * ctx)
{
// u16 value = VarGet(ScriptReadHalfword(ctx));
//
@@ -2008,7 +2006,7 @@ bool8 ScrCmd_getpricereduction(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_choosecontestmon(struct ScriptContext *ctx)
+bool8 ScrCmd_choosecontestmon(struct ScriptContext * ctx)
{
// sub_81B9404();
ScriptContext1_Stop();
@@ -2016,7 +2014,7 @@ bool8 ScrCmd_choosecontestmon(struct ScriptContext *ctx)
}
-bool8 ScrCmd_startcontest(struct ScriptContext *ctx)
+bool8 ScrCmd_startcontest(struct ScriptContext * ctx)
{
// sub_80F840C();
// ScriptContext1_Stop();
@@ -2024,7 +2022,7 @@ bool8 ScrCmd_startcontest(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_showcontestresults(struct ScriptContext *ctx)
+bool8 ScrCmd_showcontestresults(struct ScriptContext * ctx)
{
// sub_80F8484();
// ScriptContext1_Stop();
@@ -2032,7 +2030,7 @@ bool8 ScrCmd_showcontestresults(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_contestlinktransfer(struct ScriptContext *ctx)
+bool8 ScrCmd_contestlinktransfer(struct ScriptContext * ctx)
{
// sub_80F84C4(gSpecialVar_ContestCategory);
// ScriptContext1_Stop();
@@ -2040,7 +2038,7 @@ bool8 ScrCmd_contestlinktransfer(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_dofieldeffect(struct ScriptContext *ctx)
+bool8 ScrCmd_dofieldeffect(struct ScriptContext * ctx)
{
u16 effectId = VarGet(ScriptReadHalfword(ctx));
@@ -2049,7 +2047,7 @@ bool8 ScrCmd_dofieldeffect(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setfieldeffectarg(struct ScriptContext *ctx)
+bool8 ScrCmd_setfieldeffectarg(struct ScriptContext * ctx)
{
u8 argNum = ScriptReadByte(ctx);
@@ -2065,14 +2063,14 @@ static bool8 WaitForFieldEffectFinish(void)
return FALSE;
}
-bool8 ScrCmd_waitfieldeffect(struct ScriptContext *ctx)
+bool8 ScrCmd_waitfieldeffect(struct ScriptContext * ctx)
{
sFieldEffectScriptId = VarGet(ScriptReadHalfword(ctx));
SetupNativeScript(ctx, WaitForFieldEffectFinish);
return TRUE;
}
-bool8 ScrCmd_setrespawn(struct ScriptContext *ctx)
+bool8 ScrCmd_setrespawn(struct ScriptContext * ctx)
{
u16 healLocationId = VarGet(ScriptReadHalfword(ctx));
@@ -2080,13 +2078,13 @@ bool8 ScrCmd_setrespawn(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_checkplayergender(struct ScriptContext *ctx)
+bool8 ScrCmd_checkplayergender(struct ScriptContext * ctx)
{
gSpecialVar_Result = gSaveBlock2Ptr->playerGender;
return FALSE;
}
-bool8 ScrCmd_playmoncry(struct ScriptContext *ctx)
+bool8 ScrCmd_playmoncry(struct ScriptContext * ctx)
{
u16 species = VarGet(ScriptReadHalfword(ctx));
u16 mode = VarGet(ScriptReadHalfword(ctx));
@@ -2095,13 +2093,13 @@ bool8 ScrCmd_playmoncry(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_waitmoncry(struct ScriptContext *ctx)
+bool8 ScrCmd_waitmoncry(struct ScriptContext * ctx)
{
SetupNativeScript(ctx, IsCryFinished);
return TRUE;
}
-bool8 ScrCmd_setmetatile(struct ScriptContext *ctx)
+bool8 ScrCmd_setmetatile(struct ScriptContext * ctx)
{
u16 x = VarGet(ScriptReadHalfword(ctx));
u16 y = VarGet(ScriptReadHalfword(ctx));
@@ -2113,11 +2111,11 @@ bool8 ScrCmd_setmetatile(struct ScriptContext *ctx)
if (!v8)
MapGridSetMetatileIdAt(x, y, tileId);
else
- MapGridSetMetatileIdAt(x, y, tileId | 0xC00);
+ MapGridSetMetatileIdAt(x, y, tileId | METATILE_COLLISION_MASK);
return FALSE;
}
-bool8 ScrCmd_opendoor(struct ScriptContext *ctx)
+bool8 ScrCmd_opendoor(struct ScriptContext * ctx)
{
u16 x = VarGet(ScriptReadHalfword(ctx));
u16 y = VarGet(ScriptReadHalfword(ctx));
@@ -2129,7 +2127,7 @@ bool8 ScrCmd_opendoor(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_closedoor(struct ScriptContext *ctx)
+bool8 ScrCmd_closedoor(struct ScriptContext * ctx)
{
u16 x = VarGet(ScriptReadHalfword(ctx));
u16 y = VarGet(ScriptReadHalfword(ctx));
@@ -2148,13 +2146,13 @@ static bool8 IsDoorAnimationStopped(void)
return FALSE;
}
-bool8 ScrCmd_waitdooranim(struct ScriptContext *ctx)
+bool8 ScrCmd_waitdooranim(struct ScriptContext * ctx)
{
SetupNativeScript(ctx, IsDoorAnimationStopped);
return TRUE;
}
-bool8 ScrCmd_setdooropen(struct ScriptContext *ctx)
+bool8 ScrCmd_setdooropen(struct ScriptContext * ctx)
{
u16 x = VarGet(ScriptReadHalfword(ctx));
u16 y = VarGet(ScriptReadHalfword(ctx));
@@ -2165,7 +2163,7 @@ bool8 ScrCmd_setdooropen(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setdoorclosed(struct ScriptContext *ctx)
+bool8 ScrCmd_setdoorclosed(struct ScriptContext * ctx)
{
u16 x = VarGet(ScriptReadHalfword(ctx));
u16 y = VarGet(ScriptReadHalfword(ctx));
@@ -2176,7 +2174,7 @@ bool8 ScrCmd_setdoorclosed(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_addelevmenuitem(struct ScriptContext *ctx)
+bool8 ScrCmd_addelevmenuitem(struct ScriptContext * ctx)
{
// u8 v3 = ScriptReadByte(ctx);
// u16 v5 = VarGet(ScriptReadHalfword(ctx));
@@ -2187,7 +2185,7 @@ bool8 ScrCmd_addelevmenuitem(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_showelevmenu(struct ScriptContext *ctx)
+bool8 ScrCmd_showelevmenu(struct ScriptContext * ctx)
{
/*ScriptShowElevatorMenu();
ScriptContext1_Stop();
@@ -2195,14 +2193,14 @@ bool8 ScrCmd_showelevmenu(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_checkcoins(struct ScriptContext *ctx)
+bool8 ScrCmd_checkcoins(struct ScriptContext * ctx)
{
u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx));
*ptr = GetCoins();
return FALSE;
}
-bool8 ScrCmd_addcoins(struct ScriptContext *ctx)
+bool8 ScrCmd_addcoins(struct ScriptContext * ctx)
{
u16 coins = VarGet(ScriptReadHalfword(ctx));
@@ -2213,7 +2211,7 @@ bool8 ScrCmd_addcoins(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_removecoins(struct ScriptContext *ctx)
+bool8 ScrCmd_removecoins(struct ScriptContext * ctx)
{
u16 coins = VarGet(ScriptReadHalfword(ctx));
@@ -2224,20 +2222,20 @@ bool8 ScrCmd_removecoins(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_signmsg(struct ScriptContext *ctx)
+bool8 ScrCmd_signmsg(struct ScriptContext * ctx)
{
sub_8069A20();
return FALSE;
}
-bool8 ScrCmd_normalmsg(struct ScriptContext *ctx)
+bool8 ScrCmd_normalmsg(struct ScriptContext * ctx)
{
sub_8069A2C();
return FALSE;
}
// This command will force the Pokémon to be obedient, you don't get to make it disobedient.
-bool8 ScrCmd_setmonobedient(struct ScriptContext *ctx)
+bool8 ScrCmd_setmonobedient(struct ScriptContext * ctx)
{
bool8 obedient = TRUE;
u16 partyIndex = VarGet(ScriptReadHalfword(ctx));
@@ -2246,7 +2244,7 @@ bool8 ScrCmd_setmonobedient(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_checkmonobedience(struct ScriptContext *ctx)
+bool8 ScrCmd_checkmonobedience(struct ScriptContext * ctx)
{
u16 partyIndex = VarGet(ScriptReadHalfword(ctx));
@@ -2254,7 +2252,7 @@ bool8 ScrCmd_checkmonobedience(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_setmonmetlocation(struct ScriptContext *ctx)
+bool8 ScrCmd_setmonmetlocation(struct ScriptContext * ctx)
{
u16 partyIndex = VarGet(ScriptReadHalfword(ctx));
u8 location = ScriptReadByte(ctx);
diff --git a/src/script.c b/src/script.c
index 0a4b69bac..4b8565589 100644
--- a/src/script.c
+++ b/src/script.c
@@ -406,7 +406,7 @@ u8 *mapheader_get_first_match_from_tagged_ptr_list(u8 tag)
}
}
-void mapheader_run_script_with_tag_x1(void)
+void RunOnLoadMapScript(void)
{
mapheader_run_script_by_tag(1);
}
@@ -506,7 +506,7 @@ u8 *GetRamScript(u8 objectId, u8 *script)
}
}
-bool32 sub_8069DFC(void)
+bool32 ValidateRamScript(void)
{
struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data;
if (scriptData->magic != RAM_SCRIPT_MAGIC)
diff --git a/src/script_menu.c b/src/script_menu.c
index 72ff1dc9e..a4745ee10 100644
--- a/src/script_menu.c
+++ b/src/script_menu.c
@@ -944,7 +944,7 @@ static void Hask_MultichoiceGridMenu_HandleInput(u8 taskId)
EnableBothScriptContexts();
}
-bool8 ScrSpecial_CreatePCMenu(void)
+bool8 CreatePCMenu(void)
{
if (FuncIsActiveTask(Task_MultichoiceMenu_HandleInput) == TRUE)
return FALSE;
@@ -1022,7 +1022,7 @@ static void Task_ScriptShowMonPic(u8 taskId)
case 1:
break;
case 2:
- sub_8083A5C(&gSprites[task->data[2]], task->data[2]);
+ FreeResourcesAndDestroySprite(&gSprites[task->data[2]], task->data[2]);
task->data[0]++;
break;
case 3:
@@ -1040,7 +1040,7 @@ bool8 ScriptMenu_ShowPokemonPic(u16 species, u8 x, u8 y)
return TRUE;
if (FindTaskIdByFunc(Task_ScriptShowMonPic) != 0xFF)
return FALSE;
- spriteId = sub_8083970(species, 8 * x + 40, 8 * y + 40, FALSE);
+ spriteId = CreateMonSprite_PicBox(species, 8 * x + 40, 8 * y + 40, FALSE);
taskId = CreateTask(Task_ScriptShowMonPic, 80);
gTasks[taskId].data[5] = CreateWindowFromRect(x, y, 8, 8);
gTasks[taskId].data[0] = 0;
@@ -1082,7 +1082,7 @@ void sub_809D424(void)
case 0:
case 1:
case 2:
- sub_8083A5C(&gSprites[task->data[2]], task->data[2]);
+ FreeResourcesAndDestroySprite(&gSprites[task->data[2]], task->data[2]);
DestroyScriptMenuWindow(task->data[5]);
DestroyTask(taskId);
break;
@@ -1116,7 +1116,7 @@ void Task_WaitMuseumFossilPic(u8 taskId)
}
}
-bool8 Special_OpenMuseumFossilPic(void)
+bool8 OpenMuseumFossilPic(void)
{
u8 spriteId;
u8 taskId;
@@ -1149,7 +1149,7 @@ bool8 Special_OpenMuseumFossilPic(void)
return TRUE;
}
-bool8 Special_CloseMuseumFossilPic(void)
+bool8 CloseMuseumFossilPic(void)
{
u8 taskId = FindTaskIdByFunc(Task_WaitMuseumFossilPic);
if (taskId == 0xFF)
@@ -1183,7 +1183,7 @@ void QLPlaybackCB_DestroyScriptMenuMonPicSprites(void)
{
data = gTasks[taskId].data;
if (data[0] < 2)
- sub_8083A5C(&gSprites[data[2]], data[2]);
+ FreeResourcesAndDestroySprite(&gSprites[data[2]], data[2]);
}
taskId = FindTaskIdByFunc(Task_WaitMuseumFossilPic);
if (taskId != 0xFF)
@@ -1197,7 +1197,7 @@ void QLPlaybackCB_DestroyScriptMenuMonPicSprites(void)
}
}
-void Special_DrawSeagallopDestinationMenu(void)
+void DrawSeagallopDestinationMenu(void)
{
// 8004 = Starting location
// 8005 = Page (0: Verm, One, Two, Three, Four, Other, Exit; 1: Four, Five, Six, Seven, Other, Exit)
@@ -1249,7 +1249,7 @@ void Special_DrawSeagallopDestinationMenu(void)
}
}
-u16 Special_GetSelectedSeagallopDestination(void)
+u16 GetSelectedSeagallopDestination(void)
{
// 8004 = Starting location
// 8005 = Page (0: Verm, One, Two, Three, Four, Other, Exit; 1: Four, Five, Six, Seven, Other, Exit)
diff --git a/src/script_movement.c b/src/script_movement.c
new file mode 100644
index 000000000..55c26ded8
--- /dev/null
+++ b/src/script_movement.c
@@ -0,0 +1,226 @@
+#include "global.h"
+#include "task.h"
+#include "util.h"
+#include "event_object_movement.h"
+#include "constants/event_objects.h"
+#include "constants/event_object_movement.h"
+
+static EWRAM_DATA const u8 (*sMovementScripts[OBJECT_EVENTS_COUNT]) = {};
+
+static void ScriptMovement_StartMoveObjects(u8 priority);
+static u8 GetMoveObjectsTaskId(void);
+static u8 ScriptMovement_TryAddNewMovement(u8 taskId, u8 objEventId, const u8 *movementScript);
+static u8 GetMovementScriptIdFromObjectEventId(u8 taskId, u8 objEventId);
+static bool8 IsMovementScriptFinished(u8 taskId, u8 moveScrId);
+static void ScriptMovement_MoveObjects(u8 taskId);
+static void ScriptMovement_AddNewMovement(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript);
+static void ScriptMovement_UnfreezeActiveObjects(u8 taskId);
+static void ScriptMovement_TakeStep(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript);
+
+bool8 ScriptMovement_StartObjectMovementScript(u8 localId, u8 mapNum, u8 mapGroup, const u8 *movementScript)
+{
+ u8 objEventId;
+ if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objEventId))
+ return TRUE;
+
+ if (!FuncIsActiveTask(ScriptMovement_MoveObjects))
+ ScriptMovement_StartMoveObjects(50);
+ return ScriptMovement_TryAddNewMovement(GetMoveObjectsTaskId(), objEventId, movementScript);
+}
+
+bool8 ScriptMovement_IsObjectMovementFinished(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 objEventId;
+ u8 taskId;
+ u8 moveScrId;
+ if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objEventId))
+ return TRUE;
+ taskId = GetMoveObjectsTaskId();
+ moveScrId = GetMovementScriptIdFromObjectEventId(taskId, objEventId);
+ if (moveScrId == OBJECT_EVENTS_COUNT)
+ return TRUE;
+ return IsMovementScriptFinished(taskId, moveScrId);
+}
+
+void ScriptMovement_UnfreezeObjectEvents(void)
+{
+ u8 taskId = GetMoveObjectsTaskId();
+ if (taskId != TAIL_SENTINEL)
+ {
+ ScriptMovement_UnfreezeActiveObjects(taskId);
+ DestroyTask(taskId);
+ }
+}
+
+void ScriptMovement_StartMoveObjects(u8 priority)
+{
+ u8 i;
+ u8 taskId = CreateTask(ScriptMovement_MoveObjects, priority);
+ for (i = 1; i < NUM_TASK_DATA; i++)
+ {
+ gTasks[taskId].data[i] = -1;
+ }
+}
+
+u8 GetMoveObjectsTaskId(void)
+{
+ return FindTaskIdByFunc(ScriptMovement_MoveObjects);
+}
+
+bool8 ScriptMovement_TryAddNewMovement(u8 taskId, u8 objEventId, const u8 *movementScript)
+{
+ u8 moveScrId;
+
+ moveScrId = GetMovementScriptIdFromObjectEventId(taskId, objEventId);
+ if (moveScrId != OBJECT_EVENTS_COUNT)
+ {
+ if (IsMovementScriptFinished(taskId, moveScrId) == FALSE)
+ {
+ return TRUE;
+ }
+ else
+ {
+ ScriptMovement_AddNewMovement(taskId, moveScrId, objEventId, movementScript);
+ return FALSE;
+ }
+ }
+ moveScrId = GetMovementScriptIdFromObjectEventId(taskId, OBJ_EVENT_ID_PLAYER);
+ if (moveScrId == OBJECT_EVENTS_COUNT)
+ {
+ return TRUE;
+ }
+ else
+ {
+ ScriptMovement_AddNewMovement(taskId, moveScrId, objEventId, movementScript);
+ return FALSE;
+ }
+}
+
+u8 GetMovementScriptIdFromObjectEventId(u8 taskId, u8 objEventId)
+{
+ u8 i;
+ u8 *moveScriptId = (u8 *)&gTasks[taskId].data[1];
+ for (i = 0; i < OBJECT_EVENTS_COUNT; i++, moveScriptId++)
+ {
+ if (*moveScriptId == objEventId)
+ return i;
+ }
+ return OBJECT_EVENTS_COUNT;
+}
+
+void LoadObjectEventIdPtrFromMovementScript(u8 taskId, u8 moveScrId, u8 **pObjEventId)
+{
+ u8 i;
+
+ *pObjEventId = (u8 *)&gTasks[taskId].data[1];
+ for (i = 0; i < moveScrId; i++, (*pObjEventId)++)
+ ;
+}
+
+void SetObjectEventIdAtMovementScript(u8 taskId, u8 moveScrId, u8 objEventId)
+{
+ u8 *ptr;
+
+ LoadObjectEventIdPtrFromMovementScript(taskId, moveScrId, &ptr);
+ *ptr = objEventId;
+}
+
+void LoadObjectEventIdFromMovementScript(u8 taskId, u8 moveScrId, u8 *objEventId)
+{
+ u8 *ptr;
+
+ LoadObjectEventIdPtrFromMovementScript(taskId, moveScrId, &ptr);
+ *objEventId = *ptr;
+}
+
+
+static void ClearMovementScriptFinished(u8 taskId, u8 moveScrId)
+{
+ u16 mask = ~gBitTable[moveScrId];
+
+ gTasks[taskId].data[0] &= mask;
+}
+
+static void SetMovementScriptFinished(u8 taskId, u8 moveScrId)
+{
+ gTasks[taskId].data[0] |= gBitTable[moveScrId];
+}
+
+static bool8 IsMovementScriptFinished(u8 taskId, u8 moveScrId)
+{
+ u16 moveScriptFinished = (u16)gTasks[taskId].data[0] & gBitTable[moveScrId];
+
+ if (moveScriptFinished != 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void SetMovementScript(u8 moveScrId, const u8 *movementScript)
+{
+ sMovementScripts[moveScrId] = movementScript;
+}
+
+static const u8 *GetMovementScript(u8 moveScrId)
+{
+ return sMovementScripts[moveScrId];
+}
+
+static void ScriptMovement_AddNewMovement(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript)
+{
+ ClearMovementScriptFinished(taskId, moveScrId);
+ SetMovementScript(moveScrId, movementScript);
+ SetObjectEventIdAtMovementScript(taskId, moveScrId, objEventId);
+}
+
+static void ScriptMovement_UnfreezeActiveObjects(u8 taskId)
+{
+ u8 *pObjEventId;
+ u8 i;
+
+ pObjEventId = (u8 *)&gTasks[taskId].data[1];
+ for (i = 0; i < OBJECT_EVENTS_COUNT; i++, pObjEventId++)
+ {
+ if (*pObjEventId != 0xFF)
+ UnfreezeObjectEvent(&gObjectEvents[*pObjEventId]);
+ }
+}
+
+static void ScriptMovement_MoveObjects(u8 taskId)
+{
+ u8 i;
+ u8 objEventId;
+
+ for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
+ {
+ LoadObjectEventIdFromMovementScript(taskId, i, &objEventId);
+ if (objEventId != 0xFF)
+ ScriptMovement_TakeStep(taskId, i, objEventId, GetMovementScript(i));
+ }
+}
+
+static void ScriptMovement_TakeStep(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript)
+{
+ u8 nextMoveActionId;
+
+ if (IsMovementScriptFinished(taskId, moveScrId) == TRUE)
+ return;
+ if (ObjectEventIsHeldMovementActive(&gObjectEvents[objEventId])
+ && !ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objEventId]))
+ return;
+
+ nextMoveActionId = *movementScript;
+ if (nextMoveActionId == MOVEMENT_ACTION_STEP_END)
+ {
+ SetMovementScriptFinished(taskId, moveScrId);
+ FreezeObjectEvent(&gObjectEvents[objEventId]);
+ }
+ else
+ {
+ if (!ObjectEventSetHeldMovement(&gObjectEvents[objEventId], nextMoveActionId))
+ {
+ movementScript++;
+ SetMovementScript(moveScrId, movementScript);
+ }
+ }
+}
diff --git a/src/script_pokemon_util.c b/src/script_pokemon_util.c
index e12b809c6..677759497 100644
--- a/src/script_pokemon_util.c
+++ b/src/script_pokemon_util.c
@@ -1,9 +1,7 @@
#include "global.h"
-#include "battle.h"
#include "berry.h"
#include "daycare.h"
#include "event_data.h"
-#include "event_object_movement.h"
#include "load_save.h"
#include "malloc.h"
#include "overworld.h"
@@ -119,7 +117,7 @@ static bool8 CheckPartyMonHasHeldItem(u16 item)
return FALSE;
}
-bool8 GetNameOfEnigmaBerryInPlayerParty(void)
+bool8 DoesPartyHaveEnigmaBerry(void)
{
bool8 hasItem = CheckPartyMonHasHeldItem(ITEM_ENIGMA_BERRY);
if (hasItem == TRUE)
diff --git a/src/sea_cottage_special_anim.c b/src/sea_cottage_special_anim.c
deleted file mode 100644
index 56d01ca29..000000000
--- a/src/sea_cottage_special_anim.c
+++ /dev/null
@@ -1,264 +0,0 @@
-#include "global.h"
-#include "event_data.h"
-#include "task.h"
-#include "menu.h"
-#include "field_player_avatar.h"
-#include "fieldmap.h"
-#include "event_object_movement.h"
-#include "field_camera.h"
-
-static EWRAM_DATA u8 gUnknown_2039984 = 0;
-
-static void sub_809C1D8(u8 taskId, const s16 *a1, u16 a2);
-static void sub_809C334(u8 taskId);
-static void sub_809C500(u8 taskId);
-static void sub_809C640(u8 taskId);
-
-static const u16 gUnknown_83DF0D4[] = {0x0308, 0x030a, 0x02d0};
-static const u16 gUnknown_83DF0DA[] = {0x0309, 0x030b, 0x02d1};
-static const u16 gUnknown_83DF0E0[] = {0x0310, 0x0312, 0x02d8};
-static const u16 gUnknown_83DF0E6[] = {0x0311, 0x0313, 0x02d9};
-static const u16 gUnknown_83DF0EC[] = {0x02e3, 0x0316, 0x0314};
-static const u16 gUnknown_83DF0F2[] = {0x02e4, 0x0317, 0x0315};
-static const u16 gUnknown_83DF0F8[] = {0x02eb, 0x031e, 0x031c};
-
-// Functions
-static void sub_809C1D8(u8 taskId, const s16 *a1, u16 a2)
-{
- s16 r5, r3, r4;
- s16 i, j;
-
- r5 = gTasks[taskId].data[4] - 1;
- r3 = gTasks[taskId].data[5] - 1;
- r4 = gTasks[taskId].data[1];
-
- if (gTasks[taskId].data[2] == 0)
- {
- for (i = 0; i < 3; i++)
- {
- for (j = 0; j < 3; j++)
- {
- s32 id = MapGridGetMetatileIdAt(r5 + j, r3 + i);
-
- if (a1[r4] == (s16)id)
- {
- if (r4 != 2)
- MapGridSetMetatileIdAt(r5 + j, r3 + i, a2 | a1[r4 + 1]);
- else
- MapGridSetMetatileIdAt(r5 + j, r3 + i, a2 | a1[0]);
- }
- }
- }
- }
- else
- {
- for (i = 0; i < 3; i++)
- {
- for (j = 0; j < 3; j++)
- {
- s32 id = MapGridGetMetatileIdAt(r5 + j, r3 + i);
-
- if (a1[2 - r4] == (s16)id)
- {
- if (r4 != 2)
- MapGridSetMetatileIdAt(r5 + j, r3 + i, a2 | a1[1 - r4]);
- else
- MapGridSetMetatileIdAt(r5 + j, r3 + i, a2 | a1[2]);
- }
- }
- }
- }
-}
-
-static void sub_809C334(u8 taskId)
-{
- s16 *data = gTasks[taskId].data;
- u16 v1;
-
- data[3] = 1;
- switch (data[0])
- {
- case 0:
- sub_809C1D8(taskId, gUnknown_83DF0D4, 0);
- break;
- case 1:
- sub_809C1D8(taskId, gUnknown_83DF0DA, 0);
- break;
- case 2:
- sub_809C1D8(taskId, gUnknown_83DF0E0, 0xC00);
- break;
- case 3:
- sub_809C1D8(taskId, gUnknown_83DF0E6, 0);
- break;
- case 4:
- sub_809C1D8(taskId, gUnknown_83DF0EC, 0xC00);
- break;
- case 5:
- sub_809C1D8(taskId, gUnknown_83DF0F2, 0);
- break;
- case 6:
- sub_809C1D8(taskId, gUnknown_83DF0F8, 0);
- default:
- break;
- }
-
- data[0] = (data[0] + 1) & 7;
- v1 = data[0] & 7;
- if (v1 == 0)
- {
- DrawWholeMapView();
- data[1] = (data[1] + 1) % 3;
- data[3] = v1;
- }
-}
-
-static u8 sub_809C3FC(u16 a0)
-{
- u8 taskId;
- s16 *data;
-
- taskId = CreateTask(sub_809C334, 0);
- data = gTasks[taskId].data;
- PlayerGetDestCoords(&data[4], &data[5]);
- data[0] = 0;
- data[1] = 0;
- data[2] = a0;
- sub_809C334(taskId);
- return taskId;
-}
-
-void sub_809C448(u8 a0)
-{
- u8 taskId;
-
- taskId = sub_809C3FC(a0);
- gUnknown_2039984 = taskId;
-}
-
-void sub_809C460(void)
-{
- DestroyTask(gUnknown_2039984);
-}
-
-bool8 sub_809C474(void)
-{
- if (gTasks[gUnknown_2039984].data[3] == 0)
- {
- if (gTasks[gUnknown_2039984].data[1] != 2)
- return TRUE;
- return FALSE;
- }
- else
- {
- return TRUE;
- }
-}
-
-// special 0x1b5 - creates a tile animaiton one block left two-four up the player
-void sub_809C4A8(void)
-{
- u8 taskId;
- s16 *data;
-
- taskId = CreateTask(sub_809C500, 0);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[1] = 0;
- data = gTasks[taskId].data;
- PlayerGetDestCoords(&data[2], &data[3]);
- if (gSpecialVar_0x8004 == 0)
- {
- gTasks[taskId].data[2] += 6;
- gTasks[taskId].data[3] -= 5;
- }
- else
- {
- gTasks[taskId].data[2]--;
- gTasks[taskId].data[3] -= 5;
- }
-}
-
-static void sub_809C500(u8 taskId)
-{
- s16 *data = gTasks[taskId].data;
-
- if (data[0] == 0)
- {
- if ((data[1] & 1) == 0)
- {
- MapGridSetMetatileIdAt(data[2], data[3], 0xEB5);
- MapGridSetMetatileIdAt(data[2], data[3] + 2, 0xEB7);
- }
- else
- {
- MapGridSetMetatileIdAt(data[2], data[3], 0xEB6);
- MapGridSetMetatileIdAt(data[2], data[3] + 2, 0xEB8);
- }
- CurrentMapDrawMetatileAt(data[2], data[3]);
- CurrentMapDrawMetatileAt(data[2], data[3] + 2);
- }
-
- data[0]++;
- if (data[0] != 0x10)
- return;
-
- data[0] = 0;
- data[1]++;
- if (data[1] != 0xD)
- return;
-
- MapGridSetMetatileIdAt(data[2], data[3], 0xE8A);
- MapGridSetMetatileIdAt(data[2], data[3] + 2, 0xE96);
- CurrentMapDrawMetatileAt(data[2], data[3]);
- CurrentMapDrawMetatileAt(data[2], data[3] + 2);
- DestroyTask(taskId);
-}
-
-// special 0x1B7 - creates a tile animation two-six blocks right from the top-left corner of the screen
-void sub_809C5FC(void)
-{
- u8 taskId;
- s16 *data;
-
- taskId = CreateTask(sub_809C640, 0);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[1] = 0;
- data = gTasks[taskId].data;
- PlayerGetDestCoords(&data[2], &data[3]);
- gTasks[taskId].data[2] += 4;
- gTasks[taskId].data[3] -= 5;
-}
-
-static void sub_809C640(u8 taskId)
-{
- s16 *data = gTasks[taskId].data;
-
- if (data[0] == 0)
- {
- if (data[1] != 0)
- {
- MapGridSetMetatileIdAt(data[2], data[3], 0xE85);
- MapGridSetMetatileIdAt(data[2], data[3] + 1, 0xEB4);
- CurrentMapDrawMetatileAt(data[2], data[3]);
- CurrentMapDrawMetatileAt(data[2], data[3] + 1);
- if (data[1] == 4)
- {
- DestroyTask(taskId);
- return;
- }
-
- data[2]--;
- }
- MapGridSetMetatileIdAt(data[2], data[3], 0xEB9);
- MapGridSetMetatileIdAt(data[2], data[3] + 1, 0xEBA);
- CurrentMapDrawMetatileAt(data[2], data[3]);
- CurrentMapDrawMetatileAt(data[2], data[3] + 1);
- }
-
- data[0]++;
- if (data[0] == 4)
- {
- data[0] = 0;
- data[1]++;
- }
-}
-
diff --git a/src/seagallop.c b/src/seagallop.c
index aa0c48da1..1e2234b9c 100644
--- a/src/seagallop.c
+++ b/src/seagallop.c
@@ -16,7 +16,7 @@
#include "field_weather.h"
#include "constants/songs.h"
#include "constants/maps.h"
-#include "seagallop.h"
+#include "constants/seagallop.h"
#define TILESTAG_FERRY 3000
#define TILESTAG_WAKE 4000
@@ -295,7 +295,7 @@ static void Task_Seagallop_1(u8 taskId)
if (++task->data[1] == 140)
{
Overworld_FadeOutMapMusic();
- sub_807DC18();
+ WarpFadeOutScreen();
task->func = Task_Seagallop_2;
}
}
diff --git a/src/shop.c b/src/shop.c
index 97061f8c0..ddeaf6a68 100644
--- a/src/shop.c
+++ b/src/shop.c
@@ -10,7 +10,6 @@
#include "window.h"
#include "field_specials.h"
#include "field_weather.h"
-#include "field_camera.h"
#include "task.h"
#include "text.h"
#include "item.h"
@@ -19,7 +18,6 @@
#include "sound.h"
#include "string_util.h"
#include "overworld.h"
-#include "window.h"
#include "palette.h"
#include "field_fadetransition.h"
#include "scanline_effect.h"
@@ -38,6 +36,7 @@
#include "constants/songs.h"
#include "constants/items.h"
#include "constants/game_stat.h"
+#include "constants/field_weather.h"
#define tItemCount data[1]
#define tItemId data[5]
@@ -294,14 +293,14 @@ static void Task_ShopMenu(u8 taskId)
static void Task_HandleShopMenuBuy(u8 taskId)
{
SetWordTaskArg(taskId, 0xE, (u32)CB2_InitBuyMenu);
- FadeScreen(1, 0);
+ FadeScreen(FADE_TO_BLACK, 0);
gTasks[taskId].func = Task_GoToBuyOrSellMenu;
}
static void Task_HandleShopMenuSell(u8 taskId)
{
SetWordTaskArg(taskId, 0xE, (u32)CB2_GoToSellMenu);
- FadeScreen(1, 0);
+ FadeScreen(FADE_TO_BLACK, 0);
gTasks[taskId].func = Task_GoToBuyOrSellMenu;
}
@@ -338,7 +337,7 @@ static void Task_GoToBuyOrSellMenu(u8 taskId)
static void MapPostLoadHook_ReturnToShopMenu(void)
{
- sub_807DC00();
+ FadeInFromBlack();
CreateTask(Task_ReturnToShopMenu, 8);
}
@@ -670,7 +669,7 @@ static void BuyMenuPrintCursorAtYPosition(u8 y, u8 a1)
}
else
{
- BuyMenuPrint(4, 2, gFameCheckerText_ListMenuCursor, 1, y, 0, 0, 0, a1);
+ BuyMenuPrint(4, 2, gText_SelectorArrow2, 1, y, 0, 0, 0, a1);
}
}
diff --git a/src/slot_machine.c b/src/slot_machine.c
index 651465ddb..d0422ab99 100644
--- a/src/slot_machine.c
+++ b/src/slot_machine.c
@@ -11,7 +11,6 @@
#include "coins.h"
#include "quest_log.h"
#include "overworld.h"
-#include "slot_machine.h"
#include "menu.h"
#include "new_menu_helpers.h"
#include "text_window.h"
diff --git a/src/sound.c b/src/sound.c
index ebd755838..99e9a162e 100644
--- a/src/sound.c
+++ b/src/sound.c
@@ -5,8 +5,8 @@
#include "quest_log.h"
#include "m4a.h"
#include "main.h"
-#include "pokemon.h"
#include "constants/songs.h"
+#include "constants/fanfares.h"
#include "task.h"
struct Fanfare
@@ -42,20 +42,20 @@ extern struct ToneData gCryTable[];
extern struct ToneData gCryTable2[];
static const struct Fanfare sFanfares[] = {
- { MUS_FANFA1, 80 },
- { MUS_FANFA4, 160 },
- { MUS_FANFA5, 220 },
- { MUS_ME_WAZA, 220 },
- { MUS_ME_ASA, 160 },
- { MUS_ME_BACHI, 340 },
- { MUS_ME_WASURE, 180 },
- { MUS_ME_KINOMI, 120 },
- { MUS_ME_B_BIG, 250 },
- { MUS_ME_B_SMALL, 150 },
- { MUS_ME_ZANNEN, 160 },
- { MUS_POKEFUE, 450 },
- { MUS_FAN5, 170 },
- { MUS_FAN2, 196 }
+ [FANFARE_00] = { MUS_FANFA1, 80 },
+ [FANFARE_01] = { MUS_FANFA4, 160 },
+ [FANFARE_02] = { MUS_FANFA5, 220 },
+ [FANFARE_03] = { MUS_ME_WAZA, 220 },
+ [FANFARE_04] = { MUS_ME_ASA, 160 },
+ [FANFARE_05] = { MUS_ME_BACHI, 340 },
+ [FANFARE_06] = { MUS_ME_WASURE, 180 },
+ [FANFARE_07] = { MUS_ME_KINOMI, 120 },
+ [FANFARE_08] = { MUS_ME_B_BIG, 250 },
+ [FANFARE_09] = { MUS_ME_B_SMALL, 150 },
+ [FANFARE_10] = { MUS_ME_ZANNEN, 160 },
+ [FANFARE_POKEFLUTE] = { MUS_POKEFUE, 450 },
+ [FANFARE_KEY_ITEM] = { MUS_FAN5, 170 },
+ [FANFARE_DEX_EVAL] = { MUS_FAN2, 196 }
};
extern u16 SpeciesToCryId(u16);
diff --git a/src/special_field_anim.c b/src/special_field_anim.c
new file mode 100644
index 000000000..4193f0b5a
--- /dev/null
+++ b/src/special_field_anim.c
@@ -0,0 +1,341 @@
+#include "global.h"
+#include "event_data.h"
+#include "task.h"
+#include "field_player_avatar.h"
+#include "fieldmap.h"
+#include "field_camera.h"
+#include "constants/metatile_labels.h"
+
+static EWRAM_DATA u8 sEscalatorTaskId = 0;
+
+static void SetEscalatorMetatile(u8 taskId, const s16 *metatileIds, u16 metatileMasks);
+static void Task_DrawEscalator(u8 taskId);
+static void Task_DrawTeleporterHousing(u8 taskId);
+static void Task_DrawTeleporterCable(u8 taskId);
+
+#define ESCALATOR_STAGES 3
+#define LAST_ESCALATOR_STAGE (ESCALATOR_STAGES - 1)
+
+static const u16 sEscalatorMetatiles_BottomNextRail[ESCALATOR_STAGES] =
+{
+ METATILE_PokemonCenter_Escalator_BottomNextRail_Transition2,
+ METATILE_PokemonCenter_Escalator_BottomNextRail_Transition1,
+ METATILE_PokemonCenter_Escalator_BottomNextRail_Normal
+};
+
+static const u16 sEscalatorMetatiles_BottomRail[ESCALATOR_STAGES] =
+{
+ METATILE_PokemonCenter_Escalator_BottomRail_Transition2,
+ METATILE_PokemonCenter_Escalator_BottomRail_Transition1,
+ METATILE_PokemonCenter_Escalator_BottomRail_Normal
+};
+
+static const u16 sEscalatorMetatiles_BottomNext[ESCALATOR_STAGES] =
+{
+ METATILE_PokemonCenter_Escalator_BottomNext_Transition2,
+ METATILE_PokemonCenter_Escalator_BottomNext_Transition1,
+ METATILE_PokemonCenter_Escalator_BottomNext_Normal
+};
+
+static const u16 sEscalatorMetatiles_Bottom[ESCALATOR_STAGES] =
+{
+ METATILE_PokemonCenter_Escalator_Bottom_Transition2,
+ METATILE_PokemonCenter_Escalator_Bottom_Transition1,
+ METATILE_PokemonCenter_Escalator_Bottom_Normal
+};
+
+static const u16 sEscalatorMetatiles_TopNext[ESCALATOR_STAGES] =
+{
+ METATILE_PokemonCenter_Escalator_TopNext_Normal,
+ METATILE_PokemonCenter_Escalator_TopNext_Transition1,
+ METATILE_PokemonCenter_Escalator_TopNext_Transition2
+};
+
+static const u16 sEscalatorMetatiles_Top[ESCALATOR_STAGES] =
+{
+ METATILE_PokemonCenter_Escalator_Top_Normal,
+ METATILE_PokemonCenter_Escalator_Top_Transition1,
+ METATILE_PokemonCenter_Escalator_Top_Transition2
+};
+
+static const u16 sEscalatorMetatiles_TopNextRail[ESCALATOR_STAGES] =
+{
+ METATILE_PokemonCenter_Escalator_TopNextRail_Normal,
+ METATILE_PokemonCenter_Escalator_TopNextRail_Transition1,
+ METATILE_PokemonCenter_Escalator_TopNextRail_Transition2
+};
+
+#define tState data[0]
+#define tTransitionStage data[1]
+#define tGoingUp data[2]
+#define tDrawingEscalator data[3]
+#define tPlayerX data[4]
+#define tPlayerY data[5]
+
+static void SetEscalatorMetatile(u8 taskId, const s16 *metatileIds, u16 metatileMasks)
+{
+ s16 x, y, transitionStage;
+ s16 i, j;
+
+ x = gTasks[taskId].tPlayerX - 1;
+ y = gTasks[taskId].tPlayerY - 1;
+ transitionStage = gTasks[taskId].tTransitionStage;
+
+ // Check all the escalator sections and only progress the selected one to the next stage
+ if (!gTasks[taskId].tGoingUp)
+ {
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < 3; j++)
+ {
+ s32 id = MapGridGetMetatileIdAt(x + j, y + i);
+
+ if (metatileIds[transitionStage] == (s16)id)
+ {
+ if (transitionStage != LAST_ESCALATOR_STAGE)
+ MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[transitionStage + 1]);
+ else
+ MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[0]);
+ }
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < 3; j++)
+ {
+ s32 id = MapGridGetMetatileIdAt(x + j, y + i);
+
+ if (metatileIds[LAST_ESCALATOR_STAGE - transitionStage] == (s16)id)
+ {
+ if (transitionStage != LAST_ESCALATOR_STAGE)
+ MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[1 - transitionStage]);
+ else
+ MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[LAST_ESCALATOR_STAGE]);
+ }
+ }
+ }
+ }
+}
+
+static void Task_DrawEscalator(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ u16 state;
+
+ tDrawingEscalator = TRUE;
+
+ // Set tile for each section of the escalator in sequence for current transition stage
+ switch (tState)
+ {
+ case 0:
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_BottomNextRail, 0);
+ break;
+ case 1:
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_BottomRail, 0);
+ break;
+ case 2:
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_BottomNext, METATILE_COLLISION_MASK);
+ break;
+ case 3:
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_Bottom, 0);
+ break;
+ case 4:
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_TopNext, METATILE_COLLISION_MASK);
+ break;
+ case 5:
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_Top, 0);
+ break;
+ case 6:
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_TopNextRail, 0);
+ default:
+ break;
+ }
+
+ tState = (tState + 1) & 7;
+ state = tState & 7;
+
+ // If all sections of the escalator have been set, draw map and progress to next stage
+ if (state == 0)
+ {
+ DrawWholeMapView();
+ tTransitionStage = (tTransitionStage + 1) % ESCALATOR_STAGES;
+ tDrawingEscalator = FALSE;
+ }
+}
+
+static u8 CreateEscalatorTask(bool16 goingUp)
+{
+ u8 taskId;
+ s16 *data;
+
+ taskId = CreateTask(Task_DrawEscalator, 0);
+ data = gTasks[taskId].data;
+ PlayerGetDestCoords(&tPlayerX, &tPlayerY);
+ tState = 0;
+ tTransitionStage = 0;
+ tGoingUp = goingUp;
+ Task_DrawEscalator(taskId);
+ return taskId;
+}
+
+void StartEscalator(bool8 goingUp)
+{
+ u8 taskId;
+
+ taskId = CreateEscalatorTask(goingUp);
+ sEscalatorTaskId = taskId;
+}
+
+void StopEscalator(void)
+{
+ DestroyTask(sEscalatorTaskId);
+}
+
+bool8 IsEscalatorMoving(void)
+{
+ if (gTasks[sEscalatorTaskId].tDrawingEscalator == FALSE)
+ {
+ if (gTasks[sEscalatorTaskId].tTransitionStage != LAST_ESCALATOR_STAGE)
+ return TRUE;
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+}
+
+#undef tState
+#undef tTransitionStage
+#undef tGoingUp
+#undef tDrawingEscalator
+#undef tPlayerX
+#undef tPlayerY
+
+#define tTimer data[0]
+#define tState data[1]
+#define tX data[2]
+#define tY data[3]
+
+void AnimateTeleporterHousing(void)
+{
+ u8 taskId;
+ s16 *data;
+
+ taskId = CreateTask(Task_DrawTeleporterHousing, 0);
+ gTasks[taskId].tTimer = 0;
+ gTasks[taskId].tState = 0;
+ data = gTasks[taskId].data;
+ PlayerGetDestCoords(&tX, &tY);
+
+ // Set the coords of whichever teleporter is being animated
+ // 0 for the right teleporter, 1 for the left teleporter
+ if (gSpecialVar_0x8004 == 0)
+ {
+ gTasks[taskId].tX += 6;
+ gTasks[taskId].tY -= 5;
+ }
+ else
+ {
+ gTasks[taskId].tX -= 1;
+ gTasks[taskId].tY -= 5;
+ }
+}
+
+static void Task_DrawTeleporterHousing(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (tTimer == 0)
+ {
+ // Alternate the teleporter light / brightness of the teleporter door
+ if ((tState & 1) == 0)
+ {
+ MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Light_Yellow | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(tX, tY + 2, METATILE_SeaCottage_Teleporter_Door_HalfGlowing | METATILE_COLLISION_MASK);
+ }
+ else
+ {
+ MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Light_Red | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(tX, tY + 2, METATILE_SeaCottage_Teleporter_Door_FullGlowing | METATILE_COLLISION_MASK);
+ }
+ CurrentMapDrawMetatileAt(tX, tY);
+ CurrentMapDrawMetatileAt(tX, tY + 2);
+ }
+
+ tTimer++;
+ if (tTimer != 16)
+ return;
+
+ tTimer = 0;
+ tState++;
+ if (tState != 13)
+ return;
+
+ MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Light_Green | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(tX, tY + 2, METATILE_SeaCottage_Teleporter_Door | METATILE_COLLISION_MASK);
+ CurrentMapDrawMetatileAt(tX, tY);
+ CurrentMapDrawMetatileAt(tX, tY + 2);
+ DestroyTask(taskId);
+}
+
+void AnimateTeleporterCable(void)
+{
+ u8 taskId;
+ s16 *data;
+
+ taskId = CreateTask(Task_DrawTeleporterCable, 0);
+ gTasks[taskId].tTimer = 0;
+ gTasks[taskId].tState = 0;
+ data = gTasks[taskId].data;
+ PlayerGetDestCoords(&tX, &tY);
+ gTasks[taskId].tX += 4;
+ gTasks[taskId].tY -= 5;
+}
+
+static void Task_DrawTeleporterCable(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (tTimer == 0)
+ {
+ if (tState != 0)
+ {
+ // Set default cable tiles to clear the ball
+ MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Cable_Top | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(tX, tY + 1, METATILE_SeaCottage_Teleporter_Cable_Bottom | METATILE_COLLISION_MASK);
+ CurrentMapDrawMetatileAt(tX, tY);
+ CurrentMapDrawMetatileAt(tX, tY + 1);
+
+ // End after drawing 4 times (length of the cable)
+ if (tState == 4)
+ {
+ DestroyTask(taskId);
+ return;
+ }
+
+ tX--;
+ }
+
+ // Draw the cable ball
+ MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_CableBall_Top | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(tX, tY + 1, METATILE_SeaCottage_Teleporter_CableBall_Bottom | METATILE_COLLISION_MASK);
+ CurrentMapDrawMetatileAt(tX, tY);
+ CurrentMapDrawMetatileAt(tX, tY + 1);
+ }
+
+ tTimer++;
+ if (tTimer == 4)
+ {
+ tTimer = 0;
+ tState++;
+ }
+}
+
+#undef tTimer
+#undef tState
+#undef tX
+#undef tY
diff --git a/src/sprite.c b/src/sprite.c
index c1fc89777..fd824494b 100644
--- a/src/sprite.c
+++ b/src/sprite.c
@@ -94,17 +94,17 @@ typedef void (*AffineAnimCmdFunc)(u8 matrixNum, struct Sprite *);
#define DUMMY_OAM_DATA \
{ \
160, /* Y (off-screen) */ \
- 0, \
- 0, \
- 0, \
- 0, \
- 0, \
+ ST_OAM_AFFINE_OFF, \
+ ST_OAM_OBJ_NORMAL, \
+ FALSE, \
+ ST_OAM_4BPP, \
+ ST_OAM_SQUARE, \
304, /* X */ \
0, \
- 0, \
- 0, \
+ ST_OAM_SIZE_0, \
+ 0x000, \
3, /* lowest priority */ \
- 0, \
+ 0x0, \
0 \
}
@@ -250,47 +250,47 @@ static const AffineAnimCmdFunc sAffineAnimCmdFuncs[] =
AffineAnimCmd_frame,
};
-static const s32 sUnknown_082EC6F4[3][4][2] =
+static const s32 sOamDimensionsCopy[3][4][2] =
{
- {
- {8, 8},
- {0x10, 0x10},
- {0x20, 0x20},
- {0x40, 0x40},
+ [ST_OAM_SQUARE] = {
+ [ST_OAM_SIZE_0] = { 8, 8}, // SPRITE_SIZE_8x8
+ [ST_OAM_SIZE_1] = {16, 16}, // SPRITE_SIZE_16x16
+ [ST_OAM_SIZE_2] = {32, 32}, // SPRITE_SIZE_32x32
+ [ST_OAM_SIZE_3] = {64, 64}, // SPRITE_SIZE_64x64
},
- {
- {0x10, 8},
- {0x20, 8},
- {0x20, 0x10},
- {0x40, 0x20},
+ [ST_OAM_H_RECTANGLE] = {
+ [ST_OAM_SIZE_0] = {16, 8}, // SPRITE_SIZE_16x8
+ [ST_OAM_SIZE_1] = {32, 8}, // SPRITE_SIZE_32x8
+ [ST_OAM_SIZE_2] = {32, 16}, // SPRITE_SIZE_32x16
+ [ST_OAM_SIZE_3] = {64, 32}, // SPRITE_SIZE_64x32
},
- {
- {8, 0x10},
- {8, 0x20},
- {0x10, 0x20},
- {0x20, 0x40},
+ [ST_OAM_V_RECTANGLE] = {
+ [ST_OAM_SIZE_0] = { 8, 16}, // SPRITE_SIZE_8x16
+ [ST_OAM_SIZE_1] = { 8, 32}, // SPRITE_SIZE_8x32
+ [ST_OAM_SIZE_2] = {16, 32}, // SPRITE_SIZE_16x32
+ [ST_OAM_SIZE_3] = {32, 64}, // SPRITE_SIZE_32x64
},
};
static const struct OamDimensions sOamDimensions[3][4] =
{
- { // square
- { 8, 8 },
- { 16, 16 },
- { 32, 32 },
- { 64, 64 },
+ [ST_OAM_SQUARE] = {
+ [ST_OAM_SIZE_0] = { 8, 8}, // SPRITE_SIZE_8x8
+ [ST_OAM_SIZE_1] = {16, 16}, // SPRITE_SIZE_16x16
+ [ST_OAM_SIZE_2] = {32, 32}, // SPRITE_SIZE_32x32
+ [ST_OAM_SIZE_3] = {64, 64}, // SPRITE_SIZE_64x64
},
- { // horizontal rectangle
- { 16, 8 },
- { 32, 8 },
- { 32, 16 },
- { 64, 32 },
+ [ST_OAM_H_RECTANGLE] = {
+ [ST_OAM_SIZE_0] = {16, 8}, // SPRITE_SIZE_16x8
+ [ST_OAM_SIZE_1] = {32, 8}, // SPRITE_SIZE_32x8
+ [ST_OAM_SIZE_2] = {32, 16}, // SPRITE_SIZE_32x16
+ [ST_OAM_SIZE_3] = {64, 32}, // SPRITE_SIZE_64x32
},
- { // vertical rectangle
- { 8, 16 },
- { 8, 32 },
- { 16, 32 },
- { 32, 64 },
+ [ST_OAM_V_RECTANGLE] = {
+ [ST_OAM_SIZE_0] = { 8, 16}, // SPRITE_SIZE_8x16
+ [ST_OAM_SIZE_1] = { 8, 32}, // SPRITE_SIZE_8x32
+ [ST_OAM_SIZE_2] = {16, 32}, // SPRITE_SIZE_16x32
+ [ST_OAM_SIZE_3] = {32, 64}, // SPRITE_SIZE_32x64
},
};
@@ -1222,43 +1222,43 @@ u8 GetSpriteMatrixNum(struct Sprite *sprite)
return matrixNum;
}
-void sub_8007FFC(struct Sprite* sprite, s16 a2, s16 a3)
+void obj_pos2_update_enable(struct Sprite* sprite, s16 xmod, s16 ymod)
{
- sprite->data[6] = a2;
- sprite->data[7] = a3;
+ sprite->data[6] = xmod;
+ sprite->data[7] = ymod;
sprite->flags_f = 1;
}
-s32 sub_800800C(s32 a0, s32 a1, s32 a2)
+static s32 affine_get_new_pos2(s32 baseDim, s32 xformed, s32 modifier)
{
- s32 subResult, var1;
+ s32 subResult, shiftResult;
- subResult = a1 - a0;
+ subResult = xformed - baseDim;
if (subResult < 0)
- var1 = -(subResult) >> 9;
+ shiftResult = -(subResult) >> 9;
else
- var1 = -(subResult >> 9);
- return a2 - ((u32)(a2 * a1) / (u32)(a0) + var1);
+ shiftResult = -(subResult >> 9);
+ return modifier - ((u32)(modifier * xformed) / (u32)(baseDim) + shiftResult);
}
-void obj_update_pos2(struct Sprite *sprite, s32 a1, s32 a2)
+static void obj_update_pos2(struct Sprite *sprite, s32 xmod, s32 ymod)
{
- s32 var0, var1, var2;
+ s32 dim, baseDim, xFormed;
u32 matrixNum = sprite->oam.matrixNum;
- if (a1 != 0x800)
+ if (xmod != 0x800)
{
- var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][0];
- var1 = var0 << 8;
- var2 = (var0 << 16) / gOamMatrices[matrixNum].a;
- sprite->pos2.x = sub_800800C(var1, var2, a1);
+ dim = sOamDimensionsCopy[sprite->oam.shape][sprite->oam.size][0];
+ baseDim = dim << 8;
+ xFormed = (dim << 16) / gOamMatrices[matrixNum].a;
+ sprite->pos2.x = affine_get_new_pos2(baseDim, xFormed, xmod);
}
- if (a2 != 0x800)
+ if (ymod != 0x800)
{
- var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][1];
- var1 = var0 << 8;
- var2 = (var0 << 16) / gOamMatrices[matrixNum].d;
- sprite->pos2.y = sub_800800C(var1, var2, a2);
+ dim = sOamDimensionsCopy[sprite->oam.shape][sprite->oam.size][1];
+ baseDim = dim << 8;
+ xFormed = (dim << 16) / gOamMatrices[matrixNum].d;
+ sprite->pos2.y = affine_get_new_pos2(baseDim, xFormed, ymod);
}
}
diff --git a/src/ss_anne.c b/src/ss_anne.c
index 401f4e235..df04d8c66 100644
--- a/src/ss_anne.c
+++ b/src/ss_anne.c
@@ -79,7 +79,7 @@ static const struct SpriteTemplate sSmokeSpriteTemplate = {
SmokeSpriteCallback
};
-void Special_SSAnneDepartureCutscene(void)
+void DoSSAnneDepartureCutscene(void)
{
u8 taskId;
diff --git a/src/start_menu.c b/src/start_menu.c
index b159f0375..867e469e0 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -23,7 +23,7 @@
#include "field_fadetransition.h"
#include "field_player_avatar.h"
#include "new_menu_helpers.h"
-#include "event_object_80688E4.h"
+#include "event_object_movement.h"
#include "event_object_lock.h"
#include "script.h"
#include "sound.h"
@@ -39,6 +39,7 @@
#include "help_system.h"
#include "constants/songs.h"
#include "constants/flags.h"
+#include "constants/field_weather.h"
enum StartMenuOption
{
@@ -446,7 +447,7 @@ static void StartMenu_FadeScreenIfLeavingOverworld(void)
&& sStartMenuCallback != StartMenuSafariZoneRetireCallback)
{
StopPokemonLeagueLightingEffectTask();
- FadeScreen(1, 0);
+ FadeScreen(FADE_TO_BLACK, 0);
}
}
@@ -562,8 +563,8 @@ static bool8 StartMenuLinkPlayerCallback(void)
static bool8 StartCB_Save1(void)
{
- HelpSystem_BackupSomeVariable();
- HelpSystem_SetSomeVariable2(12);
+ BackupHelpContext();
+ SetHelpContext(HELPCONTEXT_SAVE);
StartMenu_PrepareForSave();
sStartMenuCallback = StartCB_Save2;
return FALSE;
@@ -579,19 +580,19 @@ static bool8 StartCB_Save2(void)
ClearDialogWindowAndFrameToTransparent(0, TRUE);
sub_80696C0();
ScriptContext2_Disable();
- HelpSystem_RestoreSomeVariable();
+ RestoreHelpContext();
return TRUE;
case SAVECB_RETURN_CANCEL:
ClearDialogWindowAndFrameToTransparent(0, FALSE);
DrawStartMenuInOneGo();
- HelpSystem_RestoreSomeVariable();
+ RestoreHelpContext();
sStartMenuCallback = StartCB_HandleInput;
break;
case SAVECB_RETURN_ERROR:
ClearDialogWindowAndFrameToTransparent(0, TRUE);
sub_80696C0();
ScriptContext2_Disable();
- HelpSystem_RestoreSomeVariable();
+ RestoreHelpContext();
return TRUE;
}
return FALSE;
@@ -614,8 +615,8 @@ static u8 RunSaveDialogCB(void)
void Field_AskSaveTheGame(void)
{
- HelpSystem_BackupSomeVariable();
- HelpSystem_SetSomeVariable2(12);
+ BackupHelpContext();
+ SetHelpContext(HELPCONTEXT_SAVE);
StartMenu_PrepareForSave();
CreateTask(task50_save_game, 80);
}
@@ -645,7 +646,7 @@ static void task50_save_game(u8 taskId)
}
DestroyTask(taskId);
EnableBothScriptContexts();
- HelpSystem_RestoreSomeVariable();
+ RestoreHelpContext();
}
static void CloseSaveMessageWindow(void)
diff --git a/src/strings.c b/src/strings.c
new file mode 100644
index 000000000..f5040838a
--- /dev/null
+++ b/src/strings.c
@@ -0,0 +1,1335 @@
+#include "global.h"
+#include "strings.h"
+
+const u8 gExpandedPlaceholder_Empty[] = _("");
+const u8 gExpandedPlaceholder_Kun[] = _("");
+const u8 gExpandedPlaceholder_Chan[] = _("");
+const u8 gExpandedPlaceholder_Sapphire[] = _("SAPPHIRE");
+const u8 gExpandedPlaceholder_Ruby[] = _("RUBY");
+const u8 gExpandedPlaceholder_Aqua[] = _("AQUA");
+const u8 gExpandedPlaceholder_Magma[] = _("MAGMA");
+const u8 gExpandedPlaceholder_Archie[] = _("ARCHIE");
+const u8 gExpandedPlaceholder_Maxie[] = _("MAXIE");
+const u8 gExpandedPlaceholder_Kyogre[] = _("KYOGRE");
+const u8 gExpandedPlaceholder_Groudon[] = _("GROUDON");
+const u8 gExpandedPlaceholder_Red[] = _("RED");
+const u8 gExpandedPlaceholder_Green[] = _("GREEN");
+const u8 gText_EggNickname[] = _("EGG");
+const u8 gStartMenuText_Pokemon[] = _("POKéMON");
+const u8 gText_NewGame[] = _("NEW GAME");
+const u8 gText_Continue[] = _("CONTINUE");
+const u8 gTextJP_Options[] = _("せっていを かえる");
+const u8 gUnusedText_MysteryGift[] = _("MYSTERY GIFT");
+const u8 gText_MysteryGift[] = _("MYSTERY GIFT");
+const u8 gText_WirelessAdapterIsNotConnected[] = _("The Wireless Adapter is not\nconnected.");
+const u8 gText_MysteryGiftCantBeUsedWhileWirelessAdapterIsAttached[] = _("MYSTERY GIFT can't be used while\nthe Wireless Adapter is attached.");
+const u8 gUnknown_8415B0E[] = _("がいぶデ-タにより レポ-トを こうしんします\nしばらく おまちください");
+const u8 gUnknown_8415B33[] = _("レポ-トが こうしんされました!");
+const u8 gUnknown_8415B44[] = _("レポ-トが こうしんされました!\pこれいじょう\nレポ-トが かききれないので\lバックアップカ-トリッジを\lこうかんしてください!\pくわしくは\nにんてんどう サ-ビスセンタ- まで\lおといあわせ ください");
+const u8 gUnknown_8415BAA[] = _("レポ-トの こうしんは\nしっぱいしました!\pバックアップカ-トリッジを\nこうかんしてください!\pくわしくは\nにんてんどう サ-ビスセンタ- まで\lおといあわせ ください");
+const u8 gText_SaveFileCorruptedPrevWillBeLoaded[] = _("The save file is corrupted.\pThe previous save file will be\nloaded.");
+const u8 gText_SaveFileHasBeenDeleted[] = _("The save file has been\ndeleted...");
+const u8 gText_1MSubCircuitBoardNotInstalled[] = _("The 1M sub-circuit board is\nnot installed.");
+const u8 gTextJP_InternalBatteryHasRunDry[] = _("でんちぎれの ために\nとけいが うごかなくなりました\pとけいに かんけいする できごとは おきませんが\nゲ-ムを つづけて あそぶことは できます");
+const u8 gUnknown_8415CD9[] = _("しゅじんこう");
+const u8 gUnknown_8415CE0[] = _("ポケモンずかん");
+const u8 gText_MainMenuTime[] = _("TIME");
+const u8 gUnknown_8415CED[] = _("もっているバッジ");
+const u8 gUnknown_8415CF6[] = _("Aボタン");
+const u8 gUnknown_8415CFB[] = _("Bボタン");
+const u8 gUnknown_8415D00[] = _("Rボタン");
+const u8 gUnknown_8415D05[] = _("Lボタン");
+const u8 gUnknown_8415D0A[] = _("スタ-トボタン");
+const u8 gUnknown_8415D12[] = _("セレクトボタン");
+const u8 gUnknown_8415D1A[] = _("じゅうじボタン");
+const u8 gUnknown_8415D22[] = _("Lボタン Rボタン");
+const u8 gText_Controls[] = _("CONTROLS");
+ALIGNED(4) const u8 gUnknown_8415D38[] = _("{DPAD_UPDOWN}えらぶ {A_BUTTON}けってい");
+ALIGNED(4) const u8 gText_ABUTTONNext[] = _("{A_BUTTON}NEXT");
+ALIGNED(4) const u8 gText_ABUTTONNext_BBUTTONBack[] = _("{A_BUTTON}NEXT {B_BUTTON}BACK");
+ALIGNED(4) const u8 gText_UPDOWNPick_ABUTTONNext_BBUTTONBack[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}NEXT {B_BUTTON}CANCEL");
+ALIGNED(4) const u8 gText_UPDOWNPick_ABUTTONBBUTTONCancel[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}{B_BUTTON}CANCEL");
+ALIGNED(4) const u8 gText_ABUTTONExit[] = _("{A_BUTTON}EXIT");
+const u8 gText_Boy[] = _("BOY");
+const u8 gText_Girl[] = _("GIRL");
+const u8 gUnknown_8415D9C[] = _("POKéDEX TABLE OF CONTENTS");
+const u8 gUnknown_8415DB8[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK");
+const u8 gUnknown_8415DC4[] = _("Seen:");
+const u8 gUnknown_8415DCA[] = _("Owned:");
+const u8 gUnknown_8415DD1[] = _("KANTO");
+const u8 gUnknown_8415DD7[] = _("NATIONAL");
+const u8 gUnknown_8415DE0[] = _("{COLOR WHITE2}{SHADOW LIGHT_BLUE}POKéMON HABITATS");
+const u8 gText_DexCategory_GrasslandPkmn[] = _("Grassland POKéMON");
+const u8 gText_DexCategory_ForestPkmn[] = _("Forest POKéMON");
+const u8 gText_DexCategory_WatersEdgePkmn[] = _("Water's-edge POKéMON");
+const u8 gText_DexCategory_SeaPkmn[] = _("Sea POKéMON");
+const u8 gText_DexCategory_CavePkmn[] = _("Cave POKéMON");
+const u8 gText_DexCategory_MountainPkmn[] = _("Mountain POKéMON");
+const u8 gText_DexCategory_RoughTerrainPkmn[] = _("Rough-terrain POKéMON");
+const u8 gText_DexCategory_UrbanPkmn[] = _("Urban POKéMON");
+const u8 gText_DexCategory_RarePkmn[] = _("Rare POKéMON");
+const u8 gUnknown_8415E88[] = _("{COLOR WHITE2}{SHADOW LIGHT_BLUE}SEARCH");
+const u8 gUnknown_8415E95[] = _("NUMERICAL MODE");
+const u8 gUnknown_8415EA4[] = _("A TO Z MODE");
+const u8 gUnknown_8415EB0[] = _("{COLOR WHITE2}{SHADOW LIGHT_BLUE}OTHER");
+const u8 gUnknown_8415EBC[] = _("ずかんの つかいかた");
+const u8 gUnknown_8415EC7[] = _("CLOSE POKéDEX");
+const u8 gUnknown_8415ED5[] = _("TYPE MODE");
+const u8 gUnknown_8415EDF[] = _("LIGHTEST MODE");
+const u8 gUnknown_8415EED[] = _("SMALLEST MODE");
+const u8 gUnknown_8415EFB[] = _("{COLOR WHITE2}{SHADOW LIGHT_BLUE}POKéMON LIST");
+const u8 gUnknown_8415F0E[] = _("NUMERICAL MODE: KANTO");
+const u8 gUnknown_8415F24[] = _("NUMERICAL MODE: NATIONAL");
+const u8 gUnknown_8415F3D[] = _("POKéMON LIST");
+const u8 gUnknown_8415F4A[] = _("SEARCH");
+const u8 gText_PickOKExit[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}CANCEL");
+const u8 gUnknown_8415F66[] = _("-----");
+const u8 gUnknown_8415F6C[] = _("{DPAD_LEFTRIGHT}PICK{PLUS}FLIP PAGE {A_BUTTON}CHECK {B_BUTTON}CANCEL");
+const u8 gUnknown_8415F8F[] = _(" POKéMON");
+const u8 gUnknown_8415F98[] = _("HT");
+const u8 gUnknown_8415F9B[] = _("WT");
+const u8 gUnknown_8415F9E[] = _("”");
+const u8 gUnknown_8415FA0[] = _("lbs.");
+const u8 gUnknown_8415FA5[] = _("ポケモンデ-タ");
+const u8 gUnknown_8415FAD[] = _("{START_BUTTON}CRY");
+const u8 gUnknown_8415FB3[] = _("{A_BUTTON}NEXT DATA {B_BUTTON}CANCEL");
+const u8 gUnknown_8415FC8[] = _("{A_BUTTON}NEXT");
+const u8 gUnknown_8415FCF[] = _("{A_BUTTON}CANCEL {B_BUTTON}PREVIOUS DATA");
+const u8 gUnknown_8415FE8[] = _("AREA");
+const u8 gUnknown_8415FED[] = _("SIZE");
+const u8 gUnknown_8415FF2[] = _("AREA UNKNOWN");
+const u8 gUnknown_8415FFF[] = _("{NO}");
+const u8 gUnknown_8416002[] = _("PAGE");
+ALIGNED(4) const u8 gText_WelcomeToHOF[] = _("Welcome to the HALL OF FAME!");
+ALIGNED(4) const u8 gUnknown_8416028[] = _("みつけた ポケモン {STR_VAR_1}!\nつかまえた ポケモン {STR_VAR_2}!\pオダマキはかせの\nポケモンずかん ひょうか!\pオダマキ“どれどれ\p");
+ALIGNED(4) const u8 gUnknown_8416068[] = _("ここまでの レポ-トを かきしるしています!\nでんげんを きらないでください");
+ALIGNED(4) const u8 gText_HOFCorrupted[] = _("The HALL OF FAME data is\ncorrupted.");
+const u8 gText_HOFNumber[] = _("HALL OF FAME No. {STR_VAR_1}");
+const u8 gText_LeagueChamp[] = _("LEAGUE CHAMPION!\nCONGRATULATIONS!");
+ALIGNED(4) const u8 gText_Number[] = _("No. ");
+ALIGNED(4) const u8 gText_Level[] = _("Lv. ");
+ALIGNED(4) const u8 gText_Name[] = _("NAME");
+ALIGNED(4) const u8 gText_IDNumber[] = _("IDNo.");
+const u8 gUnknown_841610A[] = _("{HIGHLIGHT WHITE2}{COLOR DARK_GREY}オダマキはかせが ピンチだ!\nポケモンを だして たすけてあげよう!");
+const u8 gUnknown_8416133[] = _("{HIGHLIGHT WHITE2}{COLOR DARK_GREY}このポケモンにしますか?");
+const u8 gUnknown_8416146[] = _("ポケモン");
+const u8 gText_SaveError_PleaseExchangeBackupMemory[] = _("Save error.\pPlease exchange the\nbackup memory.");
+const u8 gSaveStatName_Player[] = _("PLAYER");
+const u8 gSaveStatName_Badges[] = _("BADGES");
+const u8 gSaveStatName_Pokedex[] = _("POKéDEX");
+const u8 gSaveStatName_Time[] = _("TIME");
+const u8 gUnknown_8416195[] = _("どこへ とびますか?");
+const u8 gOtherText_Use[] = _("USE");
+const u8 gOtherText_Toss[] = _("TOSS");
+const u8 gOtherText_Register[] = _("REGISTER");
+const u8 gOtherText_Give[] = _("GIVE");
+const u8 gUnknown_84161B7[] = _("けってい");
+const u8 gOtherText_Walk[] = _("WALK");
+const u8 gFameCheckerText_Cancel[] = _("CANCEL");
+const u8 gOtherText_Exit[] = _("EXIT");
+const u8 gString_Dummy[] = _("");
+const u8 gUnknown_84161CE[] = _("キャンセル");
+const u8 gText_Item[] = _("ITEM");
+const u8 gText_Mail[] = _("MAIL");
+const u8 gText_Take[] = _("TAKE");
+const u8 gText_Store[] = _("STORE");
+const u8 gOtherText_Check[] = _("CHECK");
+const u8 gUnknown_84161EF[] = _("NONE");
+const u8 gOtherText_Open[] = _("OPEN");
+const u8 gOtherText_Deselect[] = _("DESELECT");
+const u8 gUnknown_8416202[] = _("???");
+const u8 gUnknown_8416206[] = _("?????");
+const u8 gText_Slash[] = _("/");
+const u8 gUnknown_841620E[] = _("-");
+const u8 gUnknown_8416210[] = _("--");
+const u8 gText_ThreeHyphens[] = _("---");
+const u8 gText_SevenHyphens[] = _("-------");
+const u8 gText_MaleSymbol[] = _("♂");
+const u8 gText_FemaleSymbol[] = _("♀");
+const u8 gText_Lv[] = _("{LV_2}");
+const u8 gOtherText_UnkF9_08_Clear_01[] = _("{NO}{CLEAR 0x01}");
+const u8 gUnknown_841622C[] = _("{PLUS}");
+const u8 gUnknown_841622F[] = _("{ESCAPE 0x03}");
+const u8 gUnknown_8416233[] = _("{ID}{NO}");
+const u8 gUnknown_8416238[] = _("{PP}");
+const u8 gText_SelectorArrow2[] = _("▶");
+const u8 gUnknown_841623D[] = _("YES\nNO");
+const u8 gText_GoBackToThePreviousMenu[] = _("Go back to the\nprevious menu.");
+const u8 gText_WhatWouldYouLikeToDo[] = _("What would you like to do?");
+const u8 gStartMenuText_Pokedex[] = _("POKéDEX");
+const u8 gStartMenuText_Bag[] = _("BAG");
+const u8 gUnknown_8416289[] = _("ポケナビ");
+const u8 gStartMenuText_Player[] = _("{PLAYER}");
+const u8 gStartMenuText_Save[] = _("SAVE");
+const u8 gStartMenuText_Option[] = _("OPTION");
+const u8 gStartMenuText_Exit[] = _("EXIT");
+const u8 gStartMenuText_Retire[] = _("RETIRE");
+const u8 gUnknown_84162A9[] = _("{STR_VAR_1}/{STR_VAR_2}\nBALLS {STR_VAR_3}");
+const u8 gText_TimesStrVar1[] = _("×{STR_VAR_1}");
+const u8 gUnknown_84162BD[] = _(" BERRY");
+const u8 gText_Coins[] = _("{STR_VAR_1} COINS");
+const u8 gText_Items2[] = _("ITEMS");
+const u8 gText_PokeBalls2[] = _("POKé BALLS");
+const u8 gText_KeyItems2[] = _("KEY ITEMS");
+const u8 gText_DepositItem[] = _("DEPOSIT ITEM");
+const u8 gText_CloseBag[] = _("CLOSE BAG");
+const u8 gText_Var1IsSelected[] = _("{STR_VAR_1} is\nselected.");
+const u8 gText_CantWriteMailHere[] = _("You can't write\nMAIL here.");
+const u8 gText_ThereIsNoPokemon[] = _("There is no\nPOKéMON.");
+const u8 gOtherText_WhereShouldTheStrVar1BePlaced[] = _("Where should the {STR_VAR_1}\nbe placed?");
+const u8 gText_ItemCantBeHeld[] = _("The {STR_VAR_1} can't be held.");
+const u8 gText_TheStrVar1CantBeHeldHere[] = _("The {STR_VAR_1} can't be held\nhere.");
+const u8 gText_DepositHowManyStrVars1[] = _("Deposit how many\n{STR_VAR_1}(s)?");
+const u8 gText_DepositedStrVar2StrVar1s[] = _("Deposited {STR_VAR_2}\n{STR_VAR_1}(s).");
+const u8 gText_NoRoomToStoreItems[] = _("There's no room to\nstore items.");
+const u8 gText_TossOutHowManyStrVar1s[] = _("Toss out how many\n{STR_VAR_1}(s)?");
+const u8 gText_ThrewAwayStrVar2StrVar1s[] = _("Threw away {STR_VAR_2}\n{STR_VAR_1}(s).");
+const u8 gText_ThrowAwayStrVar2OfThisItemQM[] = _("Throw away {STR_VAR_2} of\nthis item?");
+const u8 gUnknown_8416425[] = _("OAK: {PLAYER}!\nThis isn't the time to use that!{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_8416451[] = _("You can't dismount your BIKE here.{PAUSE_UNTIL_PRESS}");
+const u8 gText_ItemfinderResponding[] = _("Huh?\nThe ITEMFINDER's responding!\pThere's an item buried around here!{PAUSE_UNTIL_PRESS}");
+const u8 gText_ItemfinderShakingWildly[] = _("Oh!\nThe ITEMFINDER's shaking wildly!\pThere's an item buried underfoot!\p‥ ‥ ‥ ‥ ‥ ‥{PAUSE_UNTIL_PRESS}");
+const u8 gText_NopeTheresNoResponse[] = _("‥ ‥ ‥ ‥Nope!\nThere's no response.{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_8416537[] = _("Your COINS:\n{STR_VAR_1}{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_8416548[] = _("わざマシンを きどうした!");
+const u8 gUnknown_8416556[] = _("ひでんマシンを きどうした!");
+const u8 gUnknown_8416565[] = _("なかには {STR_VAR_1}が\nきろくされていた!\p{STR_VAR_1}を\nポケモンに おぼえさせますか?");
+const u8 gUnknown_841658C[] = _("{PLAYER} used the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_841659E[] = _("But the effects of a REPEL\nlingered from earlier.{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_84165D2[] = _("{PLAYER} used the\n{STR_VAR_2}.\pWild POKéMON will be lured.{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_8416600[] = _("{PLAYER} used the\n{STR_VAR_2}.\pWild POKéMON will be repelled.{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_8416631[] = _("The BOX is full.{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_8416644[] = _("POWDER QTY: {STR_VAR_1}{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_Powder[] = _("POWDER");
+const u8 gUnknown_841665C[] = _("Played the POKé FLUTE.\pNow, that's a catchy tune!{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_8416690[] = _("Played the POKé FLUTE.");
+const u8 gUnknown_84166A7[] = _("The POKé FLUTE awakened sleeping\nPOKéMON.{PAUSE_UNTIL_PRESS}");
+const u8 gText_TMCase[] = _("TM CASE");
+const u8 gText_Close[] = _("CLOSE");
+const u8 gText_TMCaseWillBePutAway[] = _("The TM CASE will be\nput away.");
+const u8 gText_FontSize0[] = _("{SIZE 0}");
+const u8 gText_FontSize2[] = _("{SIZE 2}");
+const u8 gUnknown_8416707[] = _(" ");
+const u8 gText_BerryPouch[] = _("BERRY POUCH");
+const u8 gText_TheBerryPouchWillBePutAway[] = _("The BERRY POUCH will be\nput away.");
+const u8 gText_ShopBuy[] = _("BUY");
+const u8 gText_ShopSell[] = _("SELL");
+const u8 gText_ShopQuit[] = _("SEE YA!");
+const u8 gText_InBagVar1[] = _("IN BAG:{SMALL} {STR_VAR_1}");
+const u8 gText_QuitShopping[] = _("Quit shopping.");
+const u8 gText_Var1CertainlyHowMany[] = _("{STR_VAR_1}? Certainly.\nHow many would you like?");
+const u8 gText_Var1AndYouWantedVar2[] = _("{STR_VAR_1}, and you want {STR_VAR_2}.\nThat will be ¥{STR_VAR_3}. Okay?");
+const u8 gUnknown_84167BB[] = _("{STR_VAR_1} だね!\n{STR_VAR_2}¥ だけど かうかい?");
+const u8 gUnknown_84167D0[] = _("{STR_VAR_1} ですね!\n{STR_VAR_2}¥ だけど かいますか?");
+const u8 gText_HereYouGoThankYou[] = _("Here you are!\nThank you!");
+const u8 gUnknown_8416800[] = _("どうも ありがとう!\nじたくの パソコンに おくって おきますね!");
+const u8 gUnknown_8416822[] = _("どうも ありがとう!\nじたくの パソコンに おくって おくね!");
+const u8 gText_YouDontHaveMoney[] = _("You don't have enough money.{PAUSE_UNTIL_PRESS}");
+const u8 gText_NoMoreRoomForThis[] = _("You have no more room for this\nitem.{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_8416888[] = _("{STR_VAR_1}を\nいれる ばしょが いっぱいです{PAUSE_UNTIL_PRESS}");
+const u8 gText_CanIHelpWithAnythingElse[] = _("Is there anything else I can do?");
+const u8 gUnknown_84168BF[] = _("その ほかに\nなにか ちからに なれることは?");
+const u8 gUnknown_84168D7[] = _("プレミアボ-ル 1コ\nおまけ しておきますね!{PAUSE_UNTIL_PRESS}");
+const u8 gText_OhNoICantBuyThat[] = _("{STR_VAR_1}? Oh, no.\nI can't buy that.{PAUSE_UNTIL_PRESS}");
+const u8 gText_HowManyWouldYouLikeToSell[] = _("{STR_VAR_1}?\nHow many would you like to sell?");
+const u8 gText_ICanPayThisMuch_WouldThatBeOkay[] = _("I can pay ¥{STR_VAR_3}.\nWould that be okay?");
+const u8 gText_TurnedOverItemsWorthYen[] = _("Turned over the {STR_VAR_1}シSス\nworth ¥{STR_VAR_3}.");
+const u8 gText_PokedollarVar1[] = _("¥{STR_VAR_1}");
+const u8 gText_Shift[] = _("SHIFT");
+const u8 gText_SendOut[] = _("SEND OUT");
+const u8 gText_Switch2[] = _("SWITCH");
+const u8 gText_Summary5[] = _("SUMMARY");
+const u8 gUnknown_841699C[] = _("つかえるわざ");
+const u8 gText_Enter[] = _("ENTER");
+const u8 gText_NoEntry[] = _("NO ENTRY");
+const u8 gText_Take2[] = _("TAKE");
+const u8 gText_Read2[] = _("READ");
+const u8 gText_Trade4[] = _("TRADE");
+const u8 gText_HP3[] = _("HP");
+const u8 gText_SpAtk3[] = _("SP. ATK");
+const u8 gText_SpDef3[] = _("SP. DEF");
+const u8 gMenuText_Confirm[] = _("OK");
+const u8 gUnknown_84169D8[] = _("");
+const u8 gText_PauseUntilPress[] = _("{PAUSE_UNTIL_PRESS}");
+const u8 gText_WontHaveEffect[] = _("It won't have any effect.{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_84169F8[] = _("This can't be used on\nthat POKéMON.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnCantSwitchOut[] = _("{STR_VAR_1} can't be switched\nout!{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnAlreadyInBattle[] = _("{STR_VAR_1} is already\nin battle!{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnAlreadySelected[] = _("{STR_VAR_1} has already been\nselected.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnHasNoEnergy[] = _("{STR_VAR_1} has no energy\nleft to battle!{PAUSE_UNTIL_PRESS}");
+const u8 gText_CantSwitchWithAlly[] = _("You can't switch {STR_VAR_1}'s\nPOKéMON with one of yours!{PAUSE_UNTIL_PRESS}");
+const u8 gText_EggCantBattle[] = _("An EGG can't battle!{PAUSE_UNTIL_PRESS}");
+const u8 gText_CantUseUntilNewBadge[] = _("This can't be used until a new\nBADGE is obtained.{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_8416B16[] = _("No more than three POKéMON\nmay enter.{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_8416B3E[] = _("No more than two POKéMON\nmay enter.{PAUSE_UNTIL_PRESS}");
+const u8 gText_SendMailToPC[] = _("Send the removed MAIL to\nyour PC?");
+const u8 gText_MailSentToPC[] = _("The MAIL was sent to your PC.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PCMailboxFull[] = _("Your PC's MAILBOX is full.{PAUSE_UNTIL_PRESS}");
+const u8 gText_MailMessageWillBeLost[] = _("If the MAIL is removed, the\nmessage will be lost. Okay?");
+const u8 gText_RemoveMailBeforeItem[] = _("MAIL must be removed before\nholding an item.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnWasGivenItem[] = _("{STR_VAR_1} was given the\n{STR_VAR_2} to hold.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnAlreadyHoldingItemSwitch[] = _("{STR_VAR_1} is already holding\none {STR_VAR_2}.\pWould you like to switch the\ntwo items?");
+const u8 gText_PkmnNotHolding[] = _("{STR_VAR_1} isn't holding\nanything.{PAUSE_UNTIL_PRESS}");
+const u8 gText_ReceivedItemFromPkmn[] = _("Received the {STR_VAR_2}\nfrom {STR_VAR_1}.{PAUSE_UNTIL_PRESS}");
+const u8 gText_MailTakenFromPkmn[] = _("MAIL was taken from the\nPOKéMON.{PAUSE_UNTIL_PRESS}");
+const u8 gText_SwitchedPkmnItem[] = _("The {STR_VAR_2} was taken and\nreplaced with the {STR_VAR_1}.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnHoldingItemCantHoldMail[] = _("This POKéMON is holding an\nitem. It cannot hold MAIL.{PAUSE_UNTIL_PRESS}");
+const u8 gText_MailTransferredFromMailbox[] = _("MAIL was transferred from\nthe MAILBOX.{PAUSE_UNTIL_PRESS}");
+const u8 gText_BagFullCouldNotRemoveItem[] = _("The {STR_VAR_1} is full. The POKéMON's\nitem could not be removed.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnLearnedMove3[] = _("{STR_VAR_1} learned\n{STR_VAR_2}!");
+const u8 gText_PkmnCantLearnMove[] = _("{STR_VAR_1} and {STR_VAR_2}\nare not compatible.\p{STR_VAR_2} can't be\nlearned.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnNeedsToReplaceMove[] = _("{STR_VAR_1} wants to learn the\nmove {STR_VAR_2}.\pHowever, {STR_VAR_1} already\nknows four moves.\pShould a move be deleted and\nreplaced with {STR_VAR_2}?");
+const u8 gText_StopLearningMove2[] = _("Stop trying to teach\n{STR_VAR_2}?");
+const u8 gText_MoveNotLearned[] = _("{STR_VAR_1} did not learn the\nmove {STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
+const u8 gText_WhichMoveToForget[] = _("Which move should be forgotten?{PAUSE_UNTIL_PRESS}");
+const u8 gText_12PoofForgotMove[] = _("1, {PAUSE 0x0F}2, and{PAUSE 0x0F}‥ {PAUSE 0x0F}‥ {PAUSE 0x0F}‥ {PAUSE 0x0F}{PLAY_SE SE_KON}Poof!\p{STR_VAR_1} forgot how to\nuse {STR_VAR_2}.\pAnd...{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnAlreadyKnows[] = _("{STR_VAR_1} already knows\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnHPRestoredByVar2[] = _("{STR_VAR_1}'s HP was restored\nby {STR_VAR_2} point(s).{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnCuredOfPoison[] = _("{STR_VAR_1} was cured of its\npoisoning.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnCuredOfParalysis[] = _("{STR_VAR_1} was cured of\nparalysis.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnWokeUp2[] = _("{STR_VAR_1} woke up.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnBurnHealed[] = _("{STR_VAR_1}'s burn was healed.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnThawedOut[] = _("{STR_VAR_1} was thawed out.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PPWasRestored[] = _("PP was restored.{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_8416FDA[] = _("{STR_VAR_1}は\nげんきを とりもどした!{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnBecameHealthy[] = _("{STR_VAR_1} became healthy.{PAUSE_UNTIL_PRESS}");
+const u8 gText_MovesPPIncreased[] = _("{STR_VAR_1}'s PP increased.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnElevatedToLvVar2[] = _("{STR_VAR_1} was elevated to\nLv. {STR_VAR_2}.");
+const u8 gText_PkmnBaseVar2StatIncreased[] = _("{STR_VAR_1}'s base {STR_VAR_2}\nstat was raised.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnSnappedOutOfConfusion[] = _("{STR_VAR_1} snapped out of its\nconfusion.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnGotOverInfatuation[] = _("{STR_VAR_1} got over its\ninfatuation.{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_8417094[] = _("That's your only\nPOKéMON for battle.");
+ALIGNED(4) const u8 gText_PkmnCantBeTradedNow[] = _("That POKéMON can't be traded\nnow.");
+ALIGNED(4) const u8 gText_EggCantBeTradedNow[] = _("An EGG can't be traded now.");
+ALIGNED(4) const u8 gText_OtherTrainersPkmnCantBeTraded[] = _("The other TRAINER's POKéMON\ncan't be traded now.");
+ALIGNED(4) const u8 gText_OtherTrainerCantAcceptPkmn[] = _("The other TRAINER can't accept\nthat POKéMON now.");
+ALIGNED(4) const u8 gText_CantTradeWithTrainer[] = _("You can't trade with that\nTRAINER now.");
+ALIGNED(4) const u8 gText_NotPkmnOtherTrainerWants[] = _("That isn't the type of POKéMON\nthat the other TRAINER wants.");
+ALIGNED(4) const u8 gText_ThatIsntAnEgg[] = _("That isn't an EGG.");
+const u8 gText_ChoosePokemon[] = _("Choose a POKéMON.");
+const u8 gText_MoveToWhere[] = _("Move to where?");
+const u8 gText_TeachWhichPokemon[] = _("Teach which POKéMON?");
+const u8 gText_UseOnWhichPokemon[] = _("Use on which POKéMON?");
+const u8 gText_GiveToWhichPokemon[] = _("Give to which POKéMON?");
+const u8 gText_DoWhatWithPokemon[] = _("Do what with this {PKMN}?");
+const u8 gText_NothingToCut[] = _("There's nothing to CUT.");
+const u8 gText_CantSurfHere[] = _("No SURFING here!");
+const u8 gText_AlreadySurfing[] = _("You're already SURFING.");
+const u8 gText_CantUseHere[] = _("Can't use that here.");
+const u8 gText_RestoreWhichMove[] = _("Restore which move?");
+const u8 gText_BoostPp[] = _("Boost PP of which?");
+const u8 gText_DoWhatWithItem[] = _("Do what with an item?");
+const u8 gText_NoPokemonForBattle[] = _("No battling this way!");
+const u8 gText_ChoosePokemon2[] = _("Choose a POKéMON.");
+const u8 gText_NotEnoughHp[] = _("Not enough HP‥");
+const u8 gText_ThreePkmnAreNeeded[] = _("Three {PKMN} are needed.");
+const u8 gText_PokemonCantBeSame[] = _("{PKMN} can't be the same.");
+const u8 gText_NoIdenticalHoldItems[] = _("No same hold items!");
+const u8 gText_CurrentIsTooFast[] = _("The current is much too fast!");
+const u8 gText_DoWhatWithMail[] = _("Do what with the MAIL?");
+const u8 gText_ChoosePokemonCancel[] = _("Choose POKéMON or CANCEL.");
+const u8 gText_ChoosePokemonConfirm[] = _("Choose POKéMON and confirm.");
+const u8 gText_TwoPokemonAreNeeded[] = _("Two POKéMON are needed.");
+const u8 gText_EnjoyCycling[] = _("Let's enjoy cycling!");
+const u8 gText_InUseAlready_PM[] = _("This is in use already.");
+const u8 gText_NoUse[] = _("No use.");
+const u8 gText_Able[] = _("ABLE");
+const u8 gText_First_PM[] = _("FIRST");
+const u8 gText_Second_PM[] = _("SECOND");
+const u8 gText_Third_PM[] = _("THIRD");
+const u8 gText_Able2[] = _("ABLE");
+const u8 gText_NotAble[] = _("NOT ABLE");
+const u8 gText_Able3[] = _("ABLE!");
+const u8 gText_NotAble2[] = _("NOT ABLE!");
+const u8 gText_Learned[] = _("LEARNED");
+const u8 gUnknown_8417457[] = _("OAK: It's important to get to know\nyour POKéMON thoroughly.\p");
+const u8 gUnknown_8417494[] = _("This is a list of your POKéMON,\n{PLAYER}.\pOpen this to check the skills\nand moves of your POKéMON.\pYou also choose POKéMON here if\nyou want to use an item on one.{PAUSE_UNTIL_PRESS}");
+const u8 gText_CutATreeOrGrass[] = _("Cut a tree or grass.");
+const u8 gText_FlyToAKnownTown[] = _("Fly to a known town.");
+const u8 gText_TravelOnWater[] = _("Travel on water.");
+const u8 gText_MoveHeavyBoulders[] = _("Move heavy boulders.");
+const u8 gText_LightUpDarkness[] = _("Light up darkness.");
+const u8 gText_ShatterACrackedRock[] = _("Shatter a cracked rock.");
+const u8 gText_ClimbAWaterfall[] = _("Climb a waterfall.");
+const u8 gUnknown_84175C1[] = _("すいちゅうに もぐる");
+const u8 gText_EscapeFromHere[] = _("Escape from here.");
+const u8 gText_LureWildPokemon[] = _("Lure wild POKéMON.");
+const u8 gText_ShareHp[] = _("Share HP.");
+const u8 gText_ReturnToAHealingSpot[] = _("Return to a healing spot.");
+const u8 gText_EscapeFromHereAndReturnTo[] = _("Want to escape from here and return\nto {STR_VAR_1}?");
+const u8 gText_ReturnToHealingSpot[] = _("Want to return to the healing spot\nused last in {STR_VAR_1}?");
+const u8 gText_Attack3[] = _("ATTACK");
+const u8 gText_Defense3[] = _("DEFENSE");
+const u8 gUnknown_8417683[] = _("とくこう");
+const u8 gUnknown_8417688[] = _("とくぼう");
+const u8 gText_Speed2[] = _("SPEED");
+const u8 gUnknown_8417693[] = _("HP");
+const u8 gText_PkmnCantParticipate[] = _("That POKéMON can't participate.{PAUSE_UNTIL_PRESS}");
+const u8 gText_CancelParticipation[] = _("Cancel participation?");
+const u8 gUnknown_84176CE[] = _("");
+const u8 gUnknown_84176CF[] = _("Cancel the battle?");
+const u8 gText_TurnOff[] = _("TURN OFF");
+const u8 gUnknown_84176EB[] = _("もようがえ");
+const u8 gText_ItemStorage[] = _("ITEM STORAGE");
+const u8 gText_Mailbox[] = _("MAILBOX");
+const u8 gText_DepositItem2[] = _("DEPOSIT ITEM");
+const u8 gText_WithdrawItem2[] = _("WITHDRAW ITEM");
+const u8 gUnknown_8417721[] = _("どうぐを すてる");
+const u8 gText_StoreItemsInThePC[] = _("Store items in the PC.");
+const u8 gText_TakeOutItemsFromThePC[] = _("Take out items from the PC.");
+const u8 gUnknown_841775D[] = _("パソコンに あずけている\nどうぐを すてます");
+const u8 gText_ThereAreNoItems[] = _("There are no items.{PAUSE_UNTIL_PRESS}");
+const u8 gText_NoMoreRoomInBag[] = _("There is no more\nroom in the BAG.");
+const u8 gText_WithdrawHowMany[] = _("Withdraw how many\n{STR_VAR_1}(s)?");
+const u8 gText_WithdrewQuantItem[] = _("Withdrew {STR_VAR_2}\n{STR_VAR_1}(s).");
+const u8 gOtherText_Read[] = _("READ");
+const u8 gOtherText_MoveToBag[] = _("MOVE TO BAG");
+const u8 gOtherText_Give2[] = _("GIVE");
+const u8 gText_TheresNoMailHere[] = _("There's no MAIL here.{PAUSE_UNTIL_PRESS}");
+const u8 gText_WhatWouldYouLikeToDoWithPlayersMail[] = _("What would you like to do with\n{STR_VAR_1}'s MAIL?");
+const u8 gText_MessageWillBeLost[] = _("The message will be lost.\nIs that okay?");
+const u8 gText_BagIsFull[] = _("The BAG is full.{PAUSE_UNTIL_PRESS}");
+const u8 gText_MailReturnedToBagMessageErased[] = _("The MAIL was returned to the BAG\nwith its message erased.{PAUSE_UNTIL_PRESS}");
+const u8 gText_WithdrawItem[] = _("WITHDRAW\nITEM");
+const u8 gText_Withdraw[] = _("WITHDRAW");
+const u8 gText_ReturnToPC[] = _("Return to the PC.");
+const u8 gText_LtSurge[] = _("LT. SURGE");
+const u8 gText_Koga[] = _("KOGA");
+const u8 gUnknown_84178DF[] = _("さんか する");
+const u8 gText_Info[] = _("INFO");
+const u8 gText_Eggs[] = _("EGGS");
+const u8 gText_HallOfFame[] = _("HALL OF FAME");
+const u8 gText_Victories[] = _("VICTORIES");
+const u8 gText_Quit[] = _("QUIT");
+const u8 gText_Psn[] = _("PSN");
+const u8 gText_Par[] = _("PAR");
+const u8 gText_Slp[] = _("SLP");
+const u8 gText_Brn[] = _("BRN");
+const u8 gText_Frz[] = _("FRZ");
+const u8 gUnknown_8417920[] = _("TOXIC");
+const u8 gUnknown_8417926[] = _("OK");
+const u8 gOtherText_Quit[] = _("QUIT");
+const u8 gUnknown_841792E[] = _("みました");
+const u8 gUnknown_8417933[] = _("これから");
+const u8 gText_Yes[] = _("YES");
+const u8 gText_No[] = _("NO");
+const u8 gUnknown_841793F[] = _("せつめい");
+const u8 gText_SingleBattle[] = _("SINGLE BATTLE");
+const u8 gText_DoubleBattle[] = _("DOUBLE BATTLE");
+const u8 gText_MultiBattle[] = _("MULTI BATTLE");
+const u8 gText_MakeAChallenge[] = _("Make a challenge.");
+const u8 gText_Info_2[] = _("INFO");
+const u8 gText_FreshWater_200[] = _("FRESH WATER{CLEAR_TO 0x57}{SMALL}¥200");
+const u8 gText_SodaPop_300[] = _("SODA POP{CLEAR_TO 0x57}{SMALL}¥300");
+const u8 gText_Lemonade_350[] = _("LEMONADE{CLEAR_TO 0x57}{SMALL}¥350");
+const u8 gText_50Coins_1000[] = _("{SMALL} 50 COINS{CLEAR_TO 0x45}¥1,000");
+const u8 gText_500Coins_10000[] = _("{SMALL}500 COINS{CLEAR_TO 0x40}¥10,000");
+const u8 gText_Excellent[] = _("Excellent");
+const u8 gText_NotSoBad[] = _("Not so bad");
+const u8 gText_RedShard[] = _("RED SHARD");
+const u8 gText_YellowShard[] = _("YELLOW SHARD");
+const u8 gText_BlueShard[] = _("BLUE SHARD");
+const u8 gText_GreenShard[] = _("GREEN SHARD");
+const u8 gUnknown_8417A30[] = _("バトルタワ-");
+const u8 gText_Right[] = _("Right");
+const u8 gText_Left[] = _("Left");
+const u8 gText_Tm13_4000Coins[] = _("TM13{CLEAR_TO 0x48}{SMALL}4,000 COINS");
+const u8 gText_Tm23_3500Coins[] = _("TM23{CLEAR_TO 0x48}{SMALL}3,500 COINS");
+const u8 gText_Tm24_4000Coins[] = _("TM24{CLEAR_TO 0x48}{SMALL}4,000 COINS");
+const u8 gText_Tm30_4500Coins[] = _("TM30{CLEAR_TO 0x48}{SMALL}4,500 COINS");
+const u8 gText_Tm35_4000Coins[] = _("TM35{CLEAR_TO 0x48}{SMALL}4,000 COINS");
+const u8 gText_1F_2[] = _("1F");
+const u8 gText_2F_2[] = _("2F");
+const u8 gText_3F_2[] = _("3F");
+const u8 gText_4F_2[] = _("4F");
+const u8 gText_5F_2[] = _("5F");
+const u8 gText_Cool[] = _("COOL");
+const u8 gText_Beauty[] = _("BEAUTY");
+const u8 gText_Cute[] = _("CUTE");
+const u8 gText_Smart[] = _("SMART");
+const u8 gText_Tough[] = _("TOUGH");
+const u8 gText_Normal[] = _("NORMAL");
+const u8 gText_Black[] = _("BLACK");
+const u8 gText_Pink[] = _("PINK");
+const u8 gText_Sepia[] = _("SEPIA");
+const u8 gText_Cool_2[] = _("COOL");
+const u8 gText_Beauty_2[] = _("BEAUTY");
+const u8 gText_Cute_2[] = _("CUTE");
+const u8 gText_Smart_2[] = _("SMART");
+const u8 gText_Tough_2[] = _("TOUGH");
+const u8 gText_Items[] = _("ITEMS");
+const u8 gText_KeyItems[] = _("KEY ITEMS");
+const u8 gText_PokeBalls[] = _("POKé BALLS");
+const u8 gText_TMsAndHMs[] = _("TMs & HMs");
+const u8 gText_Berries[] = _("BERRIES");
+const u8 gText_Boulderbadge[] = _("BOULDERBADGE");
+const u8 gText_Cascadebadge[] = _("CASCADEBADGE");
+const u8 gText_Thunderbadge[] = _("THUNDERBADGE");
+const u8 gText_Rainbowbadge[] = _("RAINBOWBADGE");
+const u8 gText_Soulbadge[] = _("SOULBADGE");
+const u8 gText_Marshbadge[] = _("MARSHBADGE");
+const u8 gText_Volcanobadge[] = _("VOLCANOBADGE");
+const u8 gText_Earthbadge[] = _("EARTHBADGE");
+const u8 gText_SomeoneSPc[] = _("SOMEONE'S PC");
+const u8 gText_BillSPc[] = _("BILL'S PC");
+const u8 gText_SPc[] = _("{PLAYER}'s PC");
+const u8 gText_HallOfFame_2[] = _("HALL OF FAME");
+const u8 gText_LogOff[] = _("LOG OFF");
+const u8 gText_ProfOakSPc[] = _("PROF. OAK's PC");
+const u8 gText_Eevee[] = _("EEVEE");
+const u8 gText_Flareon[] = _("FLAREON");
+const u8 gText_Jolteon[] = _("JOLTEON");
+const u8 gText_Vaporeon[] = _("VAPOREON");
+const u8 gText_QuitLooking[] = _("Quit looking.");
+const u8 gText_FreshWater[] = _("FRESH WATER");
+const u8 gText_SodaPop[] = _("SODA POP");
+const u8 gText_Lemonade[] = _("LEMONADE");
+const u8 gText_Coins_2[] = _("COINS");
+const u8 gText_Bicycle_1000000[] = _("BICYCLE{CLEAR_TO 0x49}{SMALL}¥1,000,000");
+const u8 gText_NoThanks[] = _("NO THANKS");
+const u8 gText_Abra_180Coins[] = _("ABRA{CLEAR_TO 0x55}{SMALL} 180 COINS");
+const u8 gText_Clefairy_500Coins[] = _("CLEFAIRY{CLEAR_TO 0x55}{SMALL} 500 COINS");
+const u8 gText_Dratini_2800Coins[] = _("DRATINI{CLEAR_TO 0x4B}{SMALL} 2,800 COINS");
+const u8 gText_Scyther_5500Coins[] = _("SCYTHER{CLEAR_TO 0x4B}{SMALL} 5,500 COINS");
+const u8 gText_Porygon_9999Coins[] = _("PORYGON{CLEAR_TO 0x4B}{SMALL} 9,999 COINS");
+const u8 gText_Abra_120Coins[] = _("ABRA{CLEAR_TO 0x55}{SMALL} 120 COINS");
+const u8 gText_Clefairy_750Coins[] = _("CLEFAIRY{CLEAR_TO 0x55}{SMALL} 750 COINS");
+const u8 gText_Pinsir_2500Coins[] = _("PINSIR{CLEAR_TO 0x4B}{SMALL} 2,500 COINS");
+const u8 gText_Dratini_4600Coins[] = _("DRATINI{CLEAR_TO 0x4B}{SMALL} 4,600 COINS");
+const u8 gText_Porygon_6500Coins[] = _("PORYGON{CLEAR_TO 0x4B}{SMALL} 6,500 COINS");
+const u8 gText_NoThanks_2[] = _("NO THANKS");
+const u8 gText_HelixFossil[] = _("HELIX FOSSIL");
+const u8 gText_DomeFossil[] = _("DOME FOSSIL");
+const u8 gText_OldAmber[] = _("OLD AMBER");
+const u8 gText_TradeCenter[] = _("TRADE CENTER");
+const u8 gText_Colosseum[] = _("COLOSSEUM");
+const u8 gText_GameLinkCable[] = _("Game Link cable");
+const u8 gText_Wireless[] = _("Wireless");
+const u8 gText_ItemsPocket[] = _("ITEMS POCKET");
+const u8 gText_KeyItemsPocket[] = _("KEY ITEMS POCKET");
+const u8 gText_PokeBallsPocket[] = _("POKé BALLS POCKET");
+const u8 gText_TmCase[] = _("TM CASE");
+const u8 gText_BerryPouch_2[] = _("BERRY POUCH");
+const u8 gText_Other[] = _("OTHER");
+const u8 gText_OneIsland[] = _("ONE ISLAND");
+const u8 gText_TwoIsland[] = _("TWO ISLAND");
+const u8 gText_ThreeIsland[] = _("THREE ISLAND");
+const u8 gText_FourIsland[] = _("FOUR ISLAND");
+const u8 gText_FiveIsland[] = _("FIVE ISLAND");
+const u8 gText_SixIsland[] = _("SIX ISLAND");
+const u8 gText_SevenIsland[] = _("SEVEN ISLAND");
+const u8 gText_Vermilion[] = _("VERMILION");
+const u8 gText_Colosseum_2[] = _("COLOSSEUM");
+const u8 gText_BerryCrush[] = _("BERRY CRUSH");
+const u8 gText_Dummy_8417E66[] = _("");
+const u8 gText_Dummy_8417E67[] = _("");
+const u8 gUnknown_8417E68[] = _("せつめいを きく");
+const u8 gText_Dummy_8417E71[] = _("");
+const u8 gText_PokemonJump[] = _("POKéMON JUMP");
+const u8 gText_DodrioBerryPicking[] = _("DODRIO BERRY-PICKING");
+const u8 gText_2Tinymushrooms[] = _("2 TINYMUSHROOMS");
+const u8 gText_1BigMushroom[] = _("1 BIG MUSHROOM");
+const u8 gText_SeviiIslands[] = _("SEVII ISLANDS");
+const u8 gText_NavelRock[] = _("NAVEL ROCK");
+const u8 gText_BirthIsland[] = _("BIRTH ISLAND");
+const u8 gText_MiracleSeed_1000Coins[] = _("MIRACLE SEED{CLEAR_TO 0x50}{SMALL}1,000 COINS");
+const u8 gText_Charcoal_1000Coins[] = _("CHARCOAL{CLEAR_TO 0x50}{SMALL}1,000 COINS");
+const u8 gText_MysticWater_1000Coins[] = _("MYSTIC WATER{CLEAR_TO 0x50}{SMALL}1,000 COINS");
+const u8 gText_YellowFlute_1600Coins[] = _("YELLOW FLUTE{CLEAR_TO 0x50}{SMALL}1,600 COINS");
+const u8 gText_SmokeBall_800Coins[] = _("SMOKE BALL{CLEAR_TO 0x5A}{SMALL}800 COINS");
+const u8 gText_Dummy_8417F67[] = _("");
+const u8 gText_Dummy_8417F68[] = _("");
+const u8 gText_BecomeLeader[] = _("BECOME LEADER");
+const u8 gText_JoinGroup[] = _("JOIN GROUP");
+const u8 gOtherText_Single[] = _("SINGLE");
+const u8 gOtherText_Double[] = _("DOUBLE");
+const u8 gOtherText_Knockout[] = _("KNOCKOUT");
+const u8 gOtherText_Mixed[] = _("MIXED");
+const u8 gUnknown_8417F9F[] = _("99かい いじょう");
+const u8 gUnknown_8417FA9[] = _("1ぷん いじょう");
+const u8 gUnknown_8417FB2[] = _("びょう");
+const u8 gUnknown_8417FB6[] = _("かい");
+const u8 gText_DecimalPoint[] = _(".");
+const u8 gText_BigGuy[] = _("Big guy");
+const u8 gText_BigGirl[] = _("Big girl");
+const u8 gText_Daughter[] = _("son");
+const u8 gText_Son[] = _("daughter");
+const u8 gText_BoulderBadge[] = _("BOULDERBADGE");
+const u8 gText_CascadeBadge[] = _("CASCADEBADGE");
+const u8 gText_ThunderBadge[] = _("THUNDERBADGE");
+const u8 gText_RainbowBadge[] = _("RAINBOWBADGE");
+const u8 gText_SoulBadge[] = _("SOULBADGE");
+const u8 gText_MarshBadge[] = _("MARSHBADGE");
+const u8 gText_VolcanoBadge[] = _("VOLCANOBADGE");
+const u8 gText_EarthBadge[] = _("EARTHBADGE");
+const u8 gText_1F[] = _("1F");
+const u8 gText_2F[] = _("2F");
+const u8 gText_3F[] = _("3F");
+const u8 gText_4F[] = _("4F");
+const u8 gText_5F[] = _("5F");
+const u8 gText_6F[] = _("6F");
+const u8 gText_7F[] = _("7F");
+const u8 gText_8F[] = _("8F");
+const u8 gText_9F[] = _("9F");
+const u8 gText_10F[] = _("10F");
+const u8 gText_11F[] = _("11F");
+const u8 gText_B1F[] = _("B1F");
+const u8 gText_B2F[] = _("B2F");
+const u8 gText_B3F[] = _("B3F");
+const u8 gText_B4F[] = _("B4F");
+const u8 gText_Rooftop[] = _("ROOFTOP");
+const u8 gText_NowOn[] = _("Now on:");
+const u8 gText_LinkedGamePlay[] = _("LINKED GAME PLAY");
+const u8 gText_DirectCorner[] = _("DIRECT CORNER");
+const u8 gText_UnionRoom[] = _("UNION ROOM");
+const u8 gText_Energypowder_50[] = _("ENERGYPOWDER{CLEAR_TO 0x74}{SMALL}50");
+const u8 gText_EnergyRoot_80[] = _("ENERGY ROOT{CLEAR_TO 0x74}{SMALL}80");
+const u8 gText_HealPowder_50[] = _("HEAL POWDER{CLEAR_TO 0x74}{SMALL}50");
+const u8 gText_RevivalHerb_300[] = _("REVIVAL HERB{CLEAR_TO 0x6F}{SMALL}300");
+const u8 gText_Protein_1000[] = _("PROTEIN{CLEAR_TO 0x65}{SMALL}1,000");
+const u8 gText_Iron_1000[] = _("IRON{CLEAR_TO 0x65}{SMALL}1,000");
+const u8 gText_Carbos_1000[] = _("CARBOS{CLEAR_TO 0x65}{SMALL}1,000");
+const u8 gText_Calcium_1000[] = _("CALCIUM{CLEAR_TO 0x65}{SMALL}1,000");
+const u8 gText_Zinc_1000[] = _("ZINC{CLEAR_TO 0x65}{SMALL}1,000");
+const u8 gText_HpUp_1000[] = _("HP UP{CLEAR_TO 0x65}{SMALL}1,000");
+const u8 gText_PpUp_3000[] = _("PP UP{CLEAR_TO 0x65}{SMALL}3,000");
+const u8 gString_BattleRecords_PlayersBattleResults[] = _("{PLAYER}'s BATTLE RESULTS");
+const u8 gString_BattleRecords_TotalRecord[] = _("TOTAL RECORD W:{STR_VAR_1} L:{STR_VAR_2} D:{STR_VAR_3}");
+const u8 gString_BattleRecords_ColumnHeaders[] = _("WIN{CLEAR_TO 0x30}LOSE{CLEAR_TO 0x60}DRAW");
+const u8 gString_BattleRecords_7Dashes[] = _("-------");
+const u8 gString_BattleRecords_4Dashes[] = _("----");
+const u8 gFameCheckerText_FameCheckerWillBeClosed[] = _("The FAME CHECKER will be closed.");
+const u8 gFameCheckerText_ClearTextbox[] = _("\n ");
+const u8 gUnknown_8418204[] = _("やめる");
+const u8 gUnknown_8418208[] = _("Exit from the BOX.");
+const u8 gUnknown_841821B[] = _("What do you want to do?");
+const u8 gUnknown_8418233[] = _("Please pick a theme.");
+const u8 gUnknown_8418248[] = _("Pick the wallpaper.");
+const u8 gUnknown_841825C[] = _("{DYNAMIC 0x00} is selected.");
+const u8 gUnknown_841826C[] = _("Jump to which BOX?");
+const u8 gUnknown_841827F[] = _("Deposit in which BOX?");
+const u8 gUnknown_8418295[] = _("{DYNAMIC 0x00} was deposited.");
+const u8 gUnknown_84182A7[] = _("The BOX is full.");
+const u8 gUnknown_84182B8[] = _("Release this POKéMON?");
+const u8 gUnknown_84182CE[] = _("{DYNAMIC 0x00} was released.");
+const u8 gUnknown_84182DF[] = _("Bye-bye, {DYNAMIC 0x00}!");
+const u8 gUnknown_84182EC[] = _("Mark your POKéMON.");
+const u8 gUnknown_84182FF[] = _("That's your last POKéMON!");
+const u8 gUnknown_8418319[] = _("Your party's full!");
+const u8 gUnknown_841832C[] = _("You're holding a POKéMON!");
+const u8 gUnknown_8418346[] = _("Which one will you take?");
+const u8 gUnknown_841835F[] = _("You can't release an EGG.");
+const u8 gUnknown_8418379[] = _("Continue BOX operations?");
+const u8 gUnknown_8418392[] = _("{DYNAMIC 0x00} came back!");
+const u8 gUnknown_84183A0[] = _("Was it worried about you?");
+const u8 gUnknown_84183BA[] = _("‥ ‥ ‥ ‥ ‥!");
+const u8 gUnknown_84183C5[] = _("Please remove the MAIL.");
+const u8 gUnknown_84183DD[] = _("GIVE to a POKéMON?");
+const u8 gUnknown_84183F0[] = _("Placed item in the BAG.");
+const u8 gUnknown_8418408[] = _("The BAG is full.");
+const u8 gUnknown_8418419[] = _("Put this item in the BAG?");
+const u8 gUnknown_8418433[] = _("{DYNAMIC 0x00} is now held.");
+const u8 gUnknown_8418443[] = _("Changed to {DYNAMIC 0x00}.");
+const u8 gUnknown_8418452[] = _("MAIL can't be stored!");
+const u8 gUnknown_8418468[] = _("CANCEL");
+const u8 gUnknown_841846F[] = _("STORE");
+const u8 gUnknown_8418475[] = _("WITHDRAW");
+const u8 gUnknown_841847E[] = _("SHIFT");
+const u8 gUnknown_8418484[] = _("MOVE");
+const u8 gUnknown_8418489[] = _("PLACE");
+const u8 gUnknown_841848F[] = _("SUMMARY");
+const u8 gUnknown_8418497[] = _("RELEASE");
+const u8 gUnknown_841849F[] = _("MARK");
+const u8 gUnknown_84184A4[] = _("NAME");
+const u8 gUnknown_84184A9[] = _("JUMP");
+const u8 gUnknown_84184AE[] = _("WALLPAPER");
+const u8 gUnknown_84184B8[] = _("TAKE");
+const u8 gUnknown_84184BD[] = _("GIVE");
+const u8 gUnknown_84184C2[] = _("SWITCH");
+const u8 gUnknown_84184C9[] = _("BAG");
+const u8 gUnknown_84184CD[] = _("INFO");
+const u8 gUnknown_84184D2[] = _("SCENERY 1");
+const u8 gUnknown_84184DC[] = _("SCENERY 2");
+const u8 gUnknown_84184E6[] = _("SCENERY 3");
+const u8 gUnknown_84184F0[] = _("ETCETERA");
+const u8 gUnknown_84184F9[] = _("FOREST");
+const u8 gUnknown_8418500[] = _("CITY");
+const u8 gUnknown_8418505[] = _("DESERT");
+const u8 gUnknown_841850C[] = _("SAVANNA");
+const u8 gUnknown_8418514[] = _("CRAG");
+const u8 gUnknown_8418519[] = _("VOLCANO");
+const u8 gUnknown_8418521[] = _("SNOW");
+const u8 gUnknown_8418526[] = _("CAVE");
+const u8 gUnknown_841852B[] = _("BEACH");
+const u8 gUnknown_8418531[] = _("SEAFLOOR");
+const u8 gUnknown_841853A[] = _("RIVER");
+const u8 gUnknown_8418540[] = _("SKY");
+const u8 gUnknown_8418544[] = _("STARS");
+const u8 gUnknown_841854A[] = _("POKéCENTER");
+const u8 gUnknown_8418555[] = _("TILES");
+const u8 gUnknown_841855B[] = _("SIMPLE");
+const u8 gUnknown_8418562[] = _("なにを しますか?");
+const u8 gUnknown_841856C[] = _("WITHDRAW POKéMON");
+const u8 gUnknown_841857D[] = _("DEPOSIT POKéMON");
+const u8 gUnknown_841858D[] = _("MOVE POKéMON");
+const u8 gUnknown_841859A[] = _("MOVE ITEMS");
+const u8 gUnknown_84185A5[] = _("SEE YA!");
+const u8 gUnknown_84185AD[] = _("You can withdraw a POKéMON if you\nhave any in a BOX.");
+const u8 gUnknown_84185E2[] = _("You can deposit your party\nPOKéMON in any BOX.");
+const u8 gUnknown_8418611[] = _("You can move POKéMON that are\nstored in any BOX.");
+const u8 gUnknown_8418642[] = _("You can move items held by any\nPOKéMON in a BOX or your party.");
+const u8 gUnknown_8418681[] = _("See you later!");
+const u8 gUnknown_8418690[] = _("Can't deposit the last POKéMON!");
+const u8 gUnknown_84186B0[] = _("Can't take any more POKéMON.");
+const u8 gUnknown_84186CD[] = _("BOX");
+const u8 gUnknown_84186D1[] = _("Combine four words or phrases");
+const u8 gUnknown_84186EF[] = _("and make your profile.");
+const u8 gUnknown_8418706[] = _("Make a message of six phrases.");
+const u8 gUnknown_8418725[] = _("Max two 12-letter phrases/line.");
+const u8 gUnknown_8418745[] = _("Find words that describe your");
+const u8 gUnknown_8418763[] = _("feelings right now.");
+const u8 gUnknown_8418777[] = _("4つの ことばで");
+const u8 gUnknown_8418780[] = _("Combine nine words or phrases");
+const u8 gUnknown_841879E[] = _("and make a message.");
+const u8 gUnknown_84187B2[] = _("Change just one word or phrase");
+const u8 gUnknown_84187D1[] = _("and improve the BARD's song.");
+const u8 gUnknown_84187EE[] = _("and fill out the questionnaire.");
+const u8 gUnknown_841880E[] = _("Your profile");
+const u8 gUnknown_841881B[] = _("Your feeling at the battle's start");
+const u8 gUnknown_841883E[] = _("What you say if you win a battle");
+const u8 gUnknown_841885F[] = _("What you say if you lose a battle");
+const u8 gUnknown_8418881[] = _("The answer");
+const u8 gUnknown_841888C[] = _("The MAIL message");
+const u8 gUnknown_841889D[] = _("はがきに のせる あいさつは");
+const u8 gUnknown_84188AC[] = _("The new song");
+const u8 gUnknown_84188B9[] = _("Combine two words or phrases");
+const u8 gUnknown_84188D6[] = _("and make a trendy saying.");
+const u8 gUnknown_84188F0[] = _("The trendy saying");
+const u8 gUnknown_8418902[] = _("is as shown. Okay?");
+const u8 gUnknown_8418915[] = _("2つの ことばを くみあわせて");
+const u8 gUnknown_8418925[] = _("いい ことばを おしえてあげよう!");
+const u8 gUnknown_8418937[] = _("All the text being edited will");
+const u8 gUnknown_8418956[] = _("be deleted. Is that okay?");
+const u8 gUnknown_8418970[] = _("なにか ことばを いれてください!");
+const u8 gUnknown_8418982[] = _("ことばを ぜんぶ けすことは できません!");
+const u8 gUnknown_8418998[] = _("かえられる ことばは 1つ までです!");
+const u8 gUnknown_84189AC[] = _("うたを もとに もどします!");
+const u8 gUnknown_84189BB[] = _("それは もう はやっています!");
+const u8 gUnknown_84189CB[] = _("2つの ことばを くみあわせてください!");
+const u8 gUnknown_84189E0[] = _("Quit editing?");
+const u8 gUnknown_84189EE[] = _("Stop giving the POKéMON MAIL?");
+const u8 gUnknown_8418A0C[] = _("へんしゅうした ことばは ほぞん");
+const u8 gUnknown_8418A1D[] = _("されませんが いいですか?");
+const u8 gUnknown_8418A2B[] = _("PROFILE");
+const u8 gUnknown_8418A33[] = _("At the battle's start:");
+const u8 gUnknown_8418A4A[] = _("Upon winning a battle:");
+const u8 gUnknown_8418A61[] = _("Upon losing a battle:");
+const u8 gUnknown_8418A77[] = _("The BARD's Song");
+const u8 gUnknown_8418A87[] = _("What's hip and happening?");
+const u8 gUnknown_8418AA1[] = _("Interview");
+const u8 gUnknown_8418AAB[] = _("いい ことば");
+const u8 gUnknown_8418AB2[] = _("QUESTIONNAIRE");
+const u8 gUnknown_8418AC0[] = _(" きれい だよね-");
+const u8 gUnknown_8418ACA[] = _(" かわいい よね-");
+const u8 gUnknown_8418AD4[] = _(" のんびり だよね-");
+const u8 gUnknown_8418ADF[] = _(" ぽっかぽか だよね-");
+const u8 gUnknown_8418AEB[] = _(" あこがれる よね-");
+const u8 gUnknown_8418AF6[] = _(" ドキドキ するよね-");
+const u8 gUnknown_8418B02[] = _(" おもしろい よね-");
+const u8 gUnknown_8418B0D[] = _(" ふしぎ だよね-");
+const u8 gUnknown_8418B17[] = _("って");
+const u8 gUnknown_8418B1A[] = _("\nそう おもわない?");
+const u8 gUnknown_8418B25[] = _("たびに でたいな-\nどこか いい ところ しらない?");
+const u8 gUnknown_8418B40[] = _("120しょくの クレヨン かったんだ-\nいいでしょう?");
+const u8 gUnknown_8418B5C[] = _("しゃぼんだまに のって とべるように\nならないかな-");
+const u8 gUnknown_8418B77[] = _("すなはまに かいた もじは\nすぐに きえちゃうのが かなしいよね-");
+const u8 gUnknown_8418B99[] = _("うみの そこって どうなってるのかな-\nいちどで いいから みて みたいな-");
+const u8 gUnknown_8418BC0[] = _("ゆうやけを みると\nウチに かえりたく ならない?");
+const u8 gUnknown_8418BDA[] = _("みどりの しばで ねころがると\nきもちいいよね-");
+const u8 gUnknown_8418BF3[] = _("ひみつきち って いいよね!\nなんか わくわく してこない?");
+const u8 gUnknown_8418C12[] = _("ポケモン リ-グ");
+const u8 gText_PokemonCenter[] = _("POKéMON CENTER");
+const u8 gUnknown_8418C2A[] = _("に ポロックを あげますか?");
+const u8 gUnknown_8418C39[] = _("かっこよさ");
+const u8 gUnknown_8418C3F[] = _("うつくしさ");
+const u8 gUnknown_8418C45[] = _("かわいさ");
+const u8 gUnknown_8418C4A[] = _("かしこさ");
+const u8 gUnknown_8418C4F[] = _("たくましさ");
+const u8 gUnknown_8418C55[] = _("に みがきが かかった!");
+const u8 gUnknown_8418C62[] = _("なにも かわらなかった!");
+const u8 gUnknown_8418C6F[] = _("もう これいじょう たべない みたい‥");
+const u8 gText_SaveFailedScreen_CheckingBackupMemory[] = _("Save failed.\nChecking the backup memory‥\nPlease wait.\n“Time required:\nabout 1 minute”");
+const u8 gText_SaveFailedScreen_BackupMemoryDamaged[] = _("The backup memory is damaged or\nthe game's battery has run dry.\nThe game can be played, but its\nprogress cannot be saved.\n“Please press the A Button.”");
+const u8 gUnknown_8418D70[] = _("{COLOR RED}“このまま ぼうけんをつづけることは できません\nタイトルに もどります”");
+const u8 gUnknown_8418D99[] = _("けんさが しゅうりょうしました!\nもういちど レポ-トを かきこみます\nしばらくおまちください");
+const u8 gUnknown_8418DC9[] = _("レポ-トの かきこみは しゅうりょうしました\n{COLOR RED}“このまま ぼうけんをつづけることは できません\nタイトルに もどります”");
+const u8 gText_SaveFailedScreen_SaveCompleted[] = _("Save completed.\n“Please press the A Button.”");
+const u8 gUnknown_8418E36[] = _("れんらくせん");
+const u8 gUnknown_8418E3D[] = _("ひみつきち");
+const u8 gUnknown_8418E43[] = _("アジト");
+const u8 gText_YourName[] = _("YOUR NAME?");
+const u8 gText_BoxName[] = _("BOX NAME?");
+const u8 gText_PkmnsNickname[] = _("'s nickname?");
+const u8 gText_RivalsName[] = _("RIVAL's NAME?");
+const u8 gText_MoveOkBack[] = _("{DPAD_ANY}MOVE {A_BUTTON}OK {B_BUTTON}BACK");
+const u8 gText_AlphabetUpperLower[] = _("");
+const u8 gText_RegionMap_Space[] = _(" ");
+const u8 gText_RegionMap_AButtonGuide[] = _("{A_BUTTON}GUIDE");
+const u8 gText_RegionMap_AButtonCancel[] = _("{A_BUTTON}CANCEL");
+const u8 gText_RegionMap_AButtonCancel2[] = _("{A_BUTTON}CANCEL");
+const u8 gText_RegionMap_AButtonSwitch[] = _("{A_BUTTON}SWITCH");
+const u8 gText_RegionMap_AButtonOK[] = _("{A_BUTTON}OK");
+const u8 gText_RegionMap_DPadMove[] = _("{DPAD_ANY}MOVE");
+const u8 gText_RegionMap_UpDownPick[] = _("{DPAD_UPDOWN}PICK");
+const u8 gText_RegionMap_NoData[] = _("No data");
+const u8 gText_RegionMap_AreaDesc_ViridianForest[] = _("A deep and sprawling forest that\nextends around VIRIDIAN CITY.\nA natural maze, many people\nbecome lost inside.");
+const u8 gText_RegionMap_AreaDesc_MtMoon[] = _("A mystical mountain that is known\nfor its frequent meteor falls.\nThe shards of stars that fall\nhere are known as MOON STONES.");
+const u8 gText_RegionMap_AreaDesc_DiglettsCave[] = _("A seemingly plain tunnel that was\ndug by wild DIGLETT.\nIt is famous for connecting\nROUTES 2 and 11.");
+const u8 gText_RegionMap_AreaDesc_VictoryRoad[] = _("A tunnel situated on ROUTE 23.\nIt earned its name because it\nmust be traveled by all TRAINERS\naiming for the top.");
+const u8 gText_RegionMap_AreaDesc_PokemonMansion[] = _("A decrepit, burned-down mansion\non CINNABAR ISLAND.\nIt got its name because a famous\nPOKéMON researcher lived there.");
+const u8 gText_RegionMap_AreaDesc_SafariZone[] = _("An amusement park outside FUCHSIA\nCITY where many rare POKéMON can\nbe observed in the wild.\nCatch them in a popular game!");
+const u8 gText_RegionMap_AreaDesc_RockTunnel[] = _("A naturally formed underground\ntunnel. Because it has not been\ndeveloped, it is inky dark inside.\nA light is needed to get through.");
+const u8 gText_RegionMap_AreaDesc_SeafoamIslands[] = _("A pair of islands that is situated\non ROUTE 20.\nThe two islands are shaped the\nsame, as if they were twins.");
+const u8 gText_RegionMap_AreaDesc_PokemonTower[] = _("A tower that houses the graves of\ncountless POKéMON.\nMany people visit it daily to pay\ntheir respects to the fallen.");
+const u8 gText_RegionMap_AreaDesc_CeruleanCave[] = _("A mysterious cave that is filled\nwith terribly tough POKéMON.\nIt is so dangerous, the POKéMON\nLEAGUE is in charge of it.");
+const u8 gText_RegionMap_AreaDesc_PowerPlant[] = _("A power plant that was abandoned\nyears ago, though some of the\nmachines still work. It is infested\nwith electric POKéMON.");
+const u8 gText_RegionMap_AreaDesc_MtEmber[] = _("Supposedly an inactive volcano.\nHowever, there are persistent\nreports that the peak blazes\nwith fire at night.");
+const u8 gText_RegionMap_AreaDesc_BerryForest[] = _("A forest on a small islet off the\ncoast of THREE ISLAND. BERRIES\ngrow wildly in profusion, quickly\nreplenishing those that fall off.");
+const u8 gText_RegionMap_AreaDesc_IcefallCave[] = _("A cave which is covered by water\nand ice on FOUR ISLAND.\nIt seems like the end of the cave\nis connected to the ocean.");
+const u8 gText_RegionMap_AreaDesc_LostCave[] = _("A bewildering cave off the coast\nof RESORT GORGEOUS.\nSome curious thrill seekers have\nnever emerged from it.");
+const u8 gText_RegionMap_AreaDesc_TanobyRuins[] = _("An ancient ruin that is rumored to\nbe home to a peculiar POKéMON.\nHowever, so far, the POKéMON\nremains an unconfirmed rumor.");
+const u8 gText_RegionMap_AreaDesc_AlteringCave[] = _("This island has been known by this\nname since the distant past.\nNo one today knows where it got\nthis name, however.");
+const u8 gText_RegionMap_AreaDesc_PatternBush[] = _("A lush and bush-like area. \nIn it are patterns where no grass\ngrows. Some study it in the belief\nthat a secret is concealed.");
+const u8 gText_RegionMap_AreaDesc_DottedHole[] = _("A mysterious, just-discovered\nruin from an ancient time.\nIt got its name from the six dots\non its door.");
+const u8 gUnknown_8419782[] = _("{DYNAMIC 0x00} nature.\nMet in a trade.");
+const u8 gUnknown_841979D[] = _("{DYNAMIC 0x00} nature.\nMet in a trade.");
+const u8 gUnknown_84197B8[] = _("{DYNAMIC 0x00} nature.\nMet in a fateful encounter when\nat {LV_2} {DYNAMIC 0x01}.");
+const u8 gUnknown_84197ED[] = _("{DYNAMIC 0x00} nature.\nMet in a fateful encounter when\nat {LV_2} {DYNAMIC 0x01}.");
+const u8 gUnknown_8419822[] = _("{DYNAMIC 0x00} nature.\nMet in {DYNAMIC 0x02} at {LV_2} {DYNAMIC 0x01}.");
+const u8 gUnknown_8419841[] = _("{DYNAMIC 0x00} nature.\nMet in {DYNAMIC 0x02} at {LV_2} {DYNAMIC 0x01}.");
+const u8 gUnknown_8419860[] = _("{DYNAMIC 0x00} nature.\nApparently met in {DYNAMIC 0x02}\nat {LV_2} {DYNAMIC 0x01}.");
+const u8 gUnknown_841988A[] = _("{DYNAMIC 0x00} nature.\nApparently met in {DYNAMIC 0x02}\nat {LV_2} {DYNAMIC 0x01}.");
+const u8 gUnknown_84198B4[] = _("{DYNAMIC 0x00} nature.\nHatched: {DYNAMIC 0x02}\nat {LV_2} {DYNAMIC 0x01}.");
+const u8 gUnknown_84198D5[] = _("{DYNAMIC 0x00} nature.\nHatched: {DYNAMIC 0x02}\nat {LV_2} {DYNAMIC 0x01}.");
+const u8 gUnknown_84198F6[] = _("{DYNAMIC 0x00}なせいかく {LV_2}{DYNAMIC 0x01}のとき\n{DYNAMIC 0x02}で かえった ようだ");
+const u8 gUnknown_8419913[] = _("{DYNAMIC 0x00}せいかく {LV_2}{DYNAMIC 0x01}のとき\n{DYNAMIC 0x02}で かえった ようだ");
+const u8 gUnknown_841992F[] = _("{DYNAMIC 0x00} nature. Met in a fateful\nencounter (hatched: {DYNAMIC 0x02}\nat {LV_2} {DYNAMIC 0x01}).");
+const u8 gUnknown_841996D[] = _("{DYNAMIC 0x00} nature. Met in a fateful\nencounter (hatched: {DYNAMIC 0x02}\nat {LV_2} {DYNAMIC 0x01}).");
+const u8 gUnknown_84199AB[] = _("{DYNAMIC 0x00} nature. Apparently met in\na fateful encounter (hatched:\n{DYNAMIC 0x02} at {LV_2} {DYNAMIC 0x01}).");
+const u8 gUnknown_84199F4[] = _("{DYNAMIC 0x00} nature. Apparently met in\na fateful encounter シhatched:\n{DYNAMIC 0x02} at {LV_2} {DYNAMIC 0x01}ス.");
+const u8 gUnknown_8419A3D[] = _("An odd POKéMON EGG found by the\nDAY-CARE couple.");
+const u8 gUnknown_8419A6E[] = _("An odd POKéMON EGG obtained from\nthe traveling man.");
+const u8 gUnknown_8419AA2[] = _("A wondrously peculiar POKéMON EGG\nobtained at a nice place.");
+const u8 gUnknown_8419ADE[] = _("An odd POKéMON EGG obtained from\nan old woman at the SPA.");
+const u8 gUnknown_8419B18[] = _("A peculiar POKéMON EGG obtained\nin a trade.");
+const u8 gUnknown_8419B44[] = _("It looks like this\nEGG will take a\nlong time to hatch.");
+const u8 gUnknown_8419B7B[] = _("What will hatch\nfrom this? It will\ntake some time.");
+const u8 gUnknown_8419BAE[] = _("It occasionally\nmoves. It should\nhatch soon.");
+const u8 gUnknown_8419BDB[] = _("It's making sounds.\nIt's almost ready\nto hatch!");
+const u8 gUnknown_8419C0B[] = _("a trade");
+const u8 gUnknown_8419C13[] = _("Somewhere");
+const u8 gUnknown_8419C1D[] = _("POKéMON INFO");
+const u8 gUnknown_8419C2A[] = _("POKéMON SKILLS");
+const u8 gUnknown_8419C39[] = _("KNOWN MOVES");
+const u8 gUnknown_8419C45[] = _("No data");
+const u8 gUnknown_8419C4D[] = _("EXP. POINTS");
+const u8 gUnknown_8419C59[] = _("NEXT LV.");
+const u8 gUnknown_8419C62[] = _("{DPAD_RIGHT}PAGE {A_BUTTON}CANCEL");
+const u8 gUnknown_8419C72[] = _("{A_BUTTON}CANCEL");
+const u8 gUnknown_8419C7B[] = _("{DPAD_LEFTRIGHT}PAGE");
+const u8 gUnknown_8419C82[] = _("{DPAD_LEFT}PAGE {A_BUTTON}DETAIL");
+const u8 gUnknown_8419C92[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}SWITCH");
+const u8 gUnknown_8419CA2[] = _("{DPAD_UPDOWN}PICK");
+const u8 gUnknown_8419CA9[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}DELETE");
+const u8 gUnknown_8419CB9[] = _("HM moves can't be\nforgotten now.");
+const u8 gText_TrainerCardName[] = _("NAME: ");
+const u8 gText_TrainerCardIDNo[] = _("IDNo.");
+const u8 gText_TrainerCardMoney[] = _("MONEY");
+const u8 gText_TrainerCardYen[] = _("¥");
+const u8 gText_TrainerCardPokedex[] = _("POKéDEX");
+const u8 gText_TrainerCardNull[] = _("");
+const u8 gText_Colon2[] = _(":");
+const u8 gUnknown_8419CFA[] = _("てん");
+const u8 gText_TrainerCardTime[] = _("TIME");
+const u8 gUnknown_8419D02[] = _("ゲ-ムポイント");
+const u8 gText_Var1sTrainerCard[] = _("'s TRAINER CARD");
+const u8 gText_HallOfFameDebut[] = _("HALL OF FAME DEBUT ");
+const u8 gText_LinkBattles[] = _("LINK BATTLES");
+const u8 gText_LinkCableBattles[] = _("LINK CABLE BATTLES");
+const u8 gText_WinLossRatio[] = _("W:{CLEAR_TO 0x30}L:");
+const u8 gText_PokemonTrades[] = _("POKéMON TRADES");
+const u8 gText_UnionRoomTradesBattles[] = _("UNION TRADES & BATTLES");
+const u8 gText_BerryCrushes[] = _("BERRY CRUSH");
+const u8 gText_WaitingTrainerFinishReading[] = _("Waiting for the other TRAINER to\nfinish reading your TRAINER CARD.");
+const u8 gText_MenuOption[] = _("OPTION");
+const u8 gText_TextSpeed[] = _("TEXT SPEED");
+const u8 gText_BattleScene[] = _("BATTLE SCENE");
+const u8 gText_BattleStyle[] = _("BATTLE STYLE");
+const u8 gText_Sound[] = _("SOUND");
+const u8 gText_ButtonMode[] = _("BUTTON MODE");
+const u8 gText_Frame[] = _("FRAME");
+const u8 gText_OptionMenuCancel[] = _("CANCEL");
+const u8 gText_TextSpeedSlow[] = _("SLOW");
+const u8 gText_TextSpeedMid[] = _("MID");
+const u8 gText_TextSpeedFast[] = _("FAST");
+const u8 gText_BattleSceneOn[] = _("ON");
+const u8 gText_BattleSceneOff[] = _("OFF");
+const u8 gText_BattleStyleShift[] = _("SHIFT");
+const u8 gText_BattleStyleSet[] = _("SET");
+const u8 gText_SoundMono[] = _("MONO");
+const u8 gText_SoundStereo[] = _("STEREO");
+const u8 gTextJP_Type[] = _("タイプ");
+const u8 gText_ButtonTypeHelp[] = _("HELP");
+const u8 gText_ButtonTypeLEqualsA[] = _("L=A");
+const u8 gText_ButtonTypeLR[] = _("LR");
+const u8 gText_FrameType[] = _("TYPE");
+const u8 gText_PickSwitchCancel[] = _("{DPAD_UPDOWN}PICK {DPAD_LEFTRIGHT}SWITCH {A_BUTTON}{B_BUTTON}CANCEL");
+const u8 gUnknown_8419E72[] = _("RTCを リセットします\nAで けってい Bで キャンセル");
+const u8 gUnknown_8419E90[] = _("げんざいの ゲ-ムない じかん");
+const u8 gUnknown_8419EA0[] = _("ぜんかいの ゲ-ムない じかん");
+const u8 gUnknown_8419EB0[] = _("じかんを さいせってい してください");
+const u8 gUnknown_8419EC3[] = _("じかんを さいせってい しました!\nレポ-トを かいています おまちください");
+const u8 gUnknown_8419EEA[] = _("レポ-トを かきこみました!");
+const u8 gUnknown_8419EF9[] = _("レポ-トの かきこみに\nしっぱい しました‥");
+const u8 gUnknown_8419F10[] = _("レポ-トが ないので\nじかんの せっていは できません!");
+const u8 gUnknown_8419F2D[] = _("ゲ-ムない じかんの しゅうせい システムが\nつかえる ように なりました!");
+const u8 gText_SavingDontTurnOffThePower2[] = _("SAVING…\nDON'T TURN OFF THE POWER.");
+
+// Start menu option descriptions
+const u8 gStartMenuDesc_Pokedex[] = _("A device that records POKéMON secrets\nupon meeting or catching them.");
+const u8 gStartMenuDesc_Pokemon[] = _("Check and organize POKéMON that are\ntraveling with you in your party.");
+const u8 gStartMenuDesc_Bag[] = _("Equipped with pockets for storing items\nyou bought, received, or found.");
+const u8 gStartMenuDesc_Player[] = _("Check your money and other game data.");
+const u8 gStartMenuDesc_Save[] = _("Save your game with a complete record\nof your progress to take a break.");
+const u8 gStartMenuDesc_Option[] = _("Adjust various game settings such as text\nspeed, game rules, etc.");
+const u8 gStartMenuDesc_Exit[] = _("Close this MENU window.");
+const u8 gStartMenuDesc_Retire[] = _("Retire from the SAFARI GAME and return to\nthe registration counter.");
+
+#include "data/text/quest_log.h"
+
+const u8 gUnknown_841B285[] = _(" was used on\n");
+const u8 gUnknown_841B293[] = _(".");
+const u8 gUnknown_841B295[] = _("'s level rose to\n");
+const u8 gUnknown_841B2A7[] = _(".");
+const u8 gUnknown_841B2A9[] = _("{SMALL}MAX.{SIZE 0x02} HP");
+const u8 gUnknown_841B2B7[] = _("ATTACK");
+const u8 gUnknown_841B2BE[] = _("DEFENSE");
+const u8 gUnknown_841B2C6[] = _("SPEED");
+const u8 gUnknown_841B2CC[] = _("SP. ATK");
+const u8 gUnknown_841B2D4[] = _("SP. DEF");
+const u8 gUnknown_841B2DC[] = _("{SMALL}{PLUS}{SIZE 0x02}");
+const u8 gUnknown_841B2E5[] = _("{SMALL}-{SIZE 0x02}");
+const u8 gUnknown_841B2ED[] = _("1, ");
+const u8 gUnknown_841B2F1[] = _("2, and ‥ ‥ ‥ ");
+const u8 gUnknown_841B2FF[] = _("Poof!\p");
+const u8 gUnknown_841B306[] = _("{DYNAMIC 0x00} forgot\n{DYNAMIC 0x01}.\p");
+const u8 gUnknown_841B315[] = _("And‥\p");
+const u8 gUnknown_841B31B[] = _("Machine set!\p");
+const u8 gUnknown_841B329[] = _("Huh?");
+const u8 gUnknown_841B32E[] = _("{DYNAMIC 0x00} learned\n{DYNAMIC 0x01}!");
+const u8 gText_Upper[] = _("UPPER");
+const u8 gText_Lower[] = _("lower");
+const u8 gText_Others[] = _("OTHERS");
+const u8 gText_Symbols[] = _("SYMBOLS");
+const u8 gText_Register2[] = _("REGISTER");
+const u8 gText_Exit[] = _("EXIT");
+const u8 gText_QuitChatting[] = _("Quit chatting?");
+const u8 gText_RegisterTextWhere[] = _("Register text where?");
+const u8 gText_RegisterTextHere[] = _("Register text here?");
+const u8 gText_InputText[] = _("Input text.");
+const u8 gText_F700JoinedChat[] = _("{DYNAMIC 0x00} joined the chat!");
+const u8 gText_F700LeftChat[] = _("{DYNAMIC 0x00} left the chat.");
+const u8 gUnknown_841B3D0[] = _("{DYNAMIC 0x00}の{DYNAMIC 0x01}ひきめ:");
+const u8 gUnknown_841B3DA[] = _("{DYNAMIC 0x00}の{DYNAMIC 0x01}ひきめは いません");
+const u8 gText_ExitingTheChat[] = _("Exiting the chat‥");
+const u8 gText_LeaderHasLeftEndingChat[] = _("The LEADER, {DYNAMIC 0x00}, has\nleft, ending the chat.");
+const u8 gText_RegisteredTextChanged_OKtoSave[] = _("The registered text has been changed.\nIs it okay to save the game?");
+const u8 gText_RegisteredTextChanged_AlreadySavedFile[] = _("There is already a saved file.\nIs it okay to overwrite it?");
+const u8 gText_RegisteredTextChanged_SavingDontTurnOff[] = _("SAVING‥\nDON'T TURN OFF THE POWER.");
+const u8 gText_RegisteredTextChanged_SavedTheGame[] = _("{DYNAMIC 0x00} saved the game.");
+const u8 gText_IfLeaderLeavesChatWillEnd[] = _("If the LEADER leaves, the chat\nwill end. Is that okay?");
+const u8 gText_Hello[] = _("HELLO");
+const u8 gText_Pokemon2[] = _("POKéMON");
+const u8 gText_Trade[] = _("TRADE");
+const u8 gText_Battle[] = _("BATTLE");
+const u8 gText_Lets[] = _("LET'S");
+const u8 gText_Ok[] = _("OK!");
+const u8 gText_Sorry[] = _("SORRY");
+const u8 gText_YaySmileEmoji[] = _("YAY{EXTRA 0xF9}");
+const u8 gText_ThankYou[] = _("THANK YOU");
+const u8 gText_ByeBye[] = _("BYE-BYE!");
+const u8 gUnknown_841B554[] = _("{PLAYER} scurried to a POKéMON CENTER,\nprotecting the exhausted and fainted\nPOKéMON from further harm‥\p");
+const u8 gUnknown_841B5B6[] = _("{PLAYER} scurried back home, protecting\nthe exhausted and fainted POKéMON from\nfurther harm‥\p");
+const u8 gUnknown_841B60E[] = _("PLAYER: {DYNAMIC 0x00}");
+const u8 gUnknown_841B619[] = _("This document is issued in\nrecognition of your magnificent\nachievement - the completion of\nthe {DYNAMIC 0x01} POKéDEX.");
+const u8 gUnknown_841B684[] = _("GAME FREAK");
+const u8 gUnknown_841B68F[] = _("NATIONAL");
+const u8 gUnknown_841B698[] = _("KANTO");
+const u8 gUnknown_841B69E[] = _("Clear all save data areas?");
+const u8 gUnknown_841B6B9[] = _("Clearing data‥\nPlease wait.");
+const u8 gText_Player[] = _("PLAYER");
+const u8 gText_Time[] = _("TIME");
+const u8 gText_Colon[] = _(":");
+const u8 gText_Pokedex[] = _("POKéDEX");
+const u8 gTextJPDummy_Hiki[] = _("");
+const u8 gText_Badges[] = _("BADGES");
+const u8 gTextJPDummy_Ko[] = _("");
+const u8 gText_Register[] = _("REGISTER");
+const u8 gText_HatchedFromEgg[] = _("{STR_VAR_1} hatched from the EGG!");
+const u8 gText_NickHatchPrompt[] = _("Would you like to nickname the newly\nhatched {STR_VAR_1}?");
+const u8 gString_OutOfCoins[] = _("You've run out of COINS.\nGame over!");
+const u8 gString_QuitPlaying[] = _("Quit playing?");
+const u8 gString_SlotMachineControls[] = _("{DPAD_LEFTRIGHT}COMBOS {DPAD_DOWN}WAGER {A_BUTTON}STOP {B_BUTTON}EXIT");
+const u8 gUnknown_841B798[] = _("おしえテレビ");
+const u8 gUnknown_841B79F[] = _("おしまい");
+
+#include "data/text/teachy_tv.h"
+
+const u8 gString_Bill[] = _("BILL");
+const u8 gString_Someone[] = _("SOMEONE");
+const u8 gString_Help[] = _("HELP");
+const u8 gString_HelpSystem_ClearTo8[] = _("{CLEAR_TO 8}");
+const u8 gText_SpacePoints2[] = _(" points");
+const u8 gText_SpaceTimes3[] = _(" time(s)");
+const u8 gText_PkmnJumpRecords[] = _("POKéMON JUMP RECORDS");
+const u8 gText_JumpsInARow[] = _("Jumps in a row:");
+const u8 gText_BestScore2[] = _("Best score:");
+const u8 gText_ExcellentsInARow[] = _("EXCELLENTS in a row:");
+const u8 gText_AwesomeWonF701F700[] = _("Awesome score! You've\nwon {DYNAMIC 01} {DYNAMIC 00}!");
+const u8 gText_FilledStorageSpace2[] = _("There's no room left now.");
+const u8 gText_CantHoldMore[] = _("You can't hold any more!");
+const u8 gText_WantToPlayAgain2[] = _("Want to play again?");
+const u8 gText_SomeoneDroppedOut2[] = _("Somebody dropped out.\nThe link will be canceled.");
+const u8 gText_SavingDontTurnOffPower[] = _("SAVING…\nDON'T TURN OFF THE POWER.");
+const u8 gText_CommunicationStandby4[] = _("Communication standby…");
+const u8 gText_SavingDontTurnOffPower2[] = _("SAVING...\nDON'T TURN OFF THE POWER."); // Unused
+const u8 gText_BerryPickingRecords[] = _("DODRIO BERRY-PICKING RECORDS");
+const u8 gText_BerriesPicked[] = _("BERRIES picked:");
+const u8 gText_BestScore[] = _("Best score:");
+const u8 gText_BerriesInRowFivePlayers[] = _("BERRIES picked in a row with\nfive players:");
+const u8 gText_BerryPickingResults[] = _("Announcing BERRY-PICKING results!");
+const u8 gText_10P30P50P50P[] = _("10P 30P 50P {EXTRA 0xDD}50P");
+const u8 gText_AnnouncingRankings[] = _("Announcing rankings!");
+const u8 gText_AnnouncingPrizes[] = _("Announcing prizes!");
+const u8 gText_1Colon[] = _("1:");
+const u8 gText_2Colon[] = _("2:");
+const u8 gText_3Colon[] = _("3:");
+const u8 gText_4Colon[] = _("4:");
+const u8 gText_5Colon[] = _("5:");
+const u8 gText_FirstPlacePrize[] = _("The first-place winner gets\nthis {DYNAMIC 00}!");
+const u8 gText_CantHoldAnyMore[] = _("You can't hold any more...");
+const u8 gText_FilledStorageSpace[] = _("It filled its storage space.");
+const u8 gText_WantToPlayAgain[] = _("Want to play again?");
+const u8 gText_SomeoneDroppedOut[] = _("Somebody dropped out.\nThe link will be canceled.");
+const u8 gText_SpacePoints[] = _(" points");
+const u8 gText_CommunicationStandby3[] = _("Communication standby…");
+ALIGNED(4) const u8 gUnknown_841CE3C[] = _("Are you ready to BERRY-CRUSH?\nPlease pick a BERRY for use.\p");
+ALIGNED(4) const u8 gUnknown_841CE78[] = _("Please wait while each member\nchooses a BERRY.");
+ALIGNED(4) const u8 gUnknown_841CEA8[] = _("{PAUSE_MUSIC}{PLAY_BGM MUS_FANFA1}You ended up with {STR_VAR_1} units of\nsilky-smooth BERRY POWDER.{RESUME_MUSIC}\pYour total amount of BERRY POWDER\nis {STR_VAR_2}.\p");
+ALIGNED(4) const u8 gUnknown_841CF14[] = _("Recording your game results in the\nsave file.\nPlease wait.");
+ALIGNED(4) const u8 gUnknown_841CF50[] = _("Want to play BERRY CRUSH again?");
+ALIGNED(4) const u8 gUnknown_841CF70[] = _("You have no BERRIES.\nThe game will be canceled.");
+ALIGNED(4) const u8 gUnknown_841CFA0[] = _("A member dropped out.\nThe game will be canceled.");
+ALIGNED(4) const u8 gUnknown_841CFD4[] = _("Time's up.\pGood BERRY POWDER could not be\nmade…\p");
+ALIGNED(4) const u8 gUnknown_841D008[] = _("Communication standby…");
+ALIGNED(4) const u8 gText_1_ClrLtGryShdwBlk_Dynamic0[] = _("1. {COLOR LIGHT_GRAY}{SHADOW BLACK}{DYNAMIC 0x00}");
+const u8 gText_1_Dynamic0[] = _("1. {DYNAMIC 0x00}");
+ALIGNED(4) const u8 gText_SpaceTimes[] = _(" times");
+ALIGNED(4) const u8 gText_XDotY[] = _("{STR_VAR_1}.{STR_VAR_2}");
+ALIGNED(4) const u8 gText_StrVar1Berry[] = _("{STR_VAR_1} BERRY");
+ALIGNED(4) const u8 gText_TimeColon[] = _("Time:");
+ALIGNED(4) const u8 gText_PressingSpeed[] = _("Pressing Speed:");
+const u8 gText_Silkiness[] = _("Silkiness:");
+ALIGNED(4) const u8 gText_StrVar1[] = _("{STR_VAR_1}");
+ALIGNED(4) const u8 gText_SpaceMin[] = _("min.");
+ALIGNED(4) const u8 gText_XDotY2[] = _("{STR_VAR_1}.{STR_VAR_2}");
+ALIGNED(4) const u8 gText_SpaceSec[] = _("sec.");
+ALIGNED(4) const u8 gText_XDotY3[] = _("{STR_VAR_1}.{STR_VAR_2}");
+ALIGNED(4) const u8 gText_TimesPerSec[] = _("Times/sec.");
+ALIGNED(4) const u8 gText_Var1Percent[] = _("{STR_VAR_1}%");
+ALIGNED(4) const u8 gText_PressesRankings[] = _("No. of Presses Rankings");
+ALIGNED(4) const u8 gText_CrushingResults[] = _("Crushing Results");
+ALIGNED(4) const u8 gText_NeatnessRankings[] = _("Neatness Rankings");
+ALIGNED(4) const u8 gText_CooperativeRankings[] = _("Cooperative Rankings");
+ALIGNED(4) const u8 gText_PressingPowerRankings[] = _("Pressing-Power Rankings");
+const u8 gText_BerryCrush2[] = _("BERRY CRUSH");
+const u8 gText_PressingSpeedRankings[] = _("Pressing-Speed Rankings");
+const u8 gText_Var1Players[] = _("{STR_VAR_1} PLAYERS");
+ALIGNED(4) const u8 gText_Ghost[] = _("GHOST");
+const u8 gUnknown_841D14E[] = _("A POKéMON's on the hook!{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_841D169[] = _("Not even a nibble‥{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_841D17E[] = _("It got away‥{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_841D18D[] = _("ROOFTOP");
+ALIGNED(4) const u8 gString_PokemonFireRed_Staff[] = _("Pokémon FireRed Version\nStaff");
+ALIGNED(4) const u8 gString_PokemonLeafGreen_Staff[] = _("Pokémon LeafGreen Version\nStaff");
+ALIGNED(4) const u8 gCreditsString_Director[] = _("\n\nDirector\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Junichi_Masuda[] = _("\n\n\nJunichi Masuda\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Art_Director_Battle_Director[] = _("\nArt Director\n\nBattle Director\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Ken_Sugimori_Shigeki_Morimoto[] = _("\n\nKen Sugimori\n\nShigeki Morimoto\n\n");
+ALIGNED(4) const u8 gCreditsString_Program_Leader_Planning_Leader_Graphic_Design_Leader[] = _("Program Leader\n\nPlanning Leader\n\nGraphic Design Leader\n\n");
+ALIGNED(4) const u8 gCreditsString_Tetsuya_Watanabe_Koji_Nishino_Takao_Unno[] = _("\nTetsuya Watanabe\n\nKoji Nishino\n\nTakao Unno\n");
+ALIGNED(4) const u8 gCreditsString_Programmers[] = _("Programmers\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Hiroyuki_Nakamura_Masao_Taya_Satoshi_Nohara_Miyuki_Iwasawa_Daisuke_Goto[] = _("\nHiroyuki Nakamura\nMasao Taya\nSatoshi Nohara\nMiyuki Iwasawa\nDaisuke Goto\n");
+ALIGNED(4) const u8 gCreditsString_System_Programmers[] = _("System Programmers\n\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Tetsuya_Watanabe_Akito_Mori_Hisashi_Sogabe_Sousuke_Tamada[] = _("\nTetsuya Watanabe\nAkito Mori\nHisashi Sogabe\nSousuke Tamada\n\n");
+ALIGNED(4) const u8 gCreditsString_Graphic_Designers[] = _("Graphic Designers\n\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Takao_Unno_Asuka_Iwashita_Kanako_Eo_Hiroki_Fuchino[] = _("\nTakao Unno\nAsuka Iwashita\nKanako Eo\nHiroki Fuchino\n\n");
+ALIGNED(4) const u8 gCreditsString_Graphic_Designers_2[] = _("\nGraphic Designers\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Ken_Sugimori_Hironobu_Yoshida[] = _("\n\nKen Sugimori\nHironobu Yoshida\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Music_Composition[] = _("\nMusic Composition\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Go_Ichinose_Junichi_Masuda[] = _("\n\nGo Ichinose\nJunichi Masuda\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Sound_Effects[] = _("\n\nSound Effects\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Go_Ichinose[] = _("\n\n\nGo Ichinose\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Game_Designers[] = _("\nGame Designers\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Junichi_Masuda_Koji_Nishino_Tetsuji_Ohta[] = _("\n\nJunichi Masuda\nKoji Nishino\nTetsuji Ohta\n\n");
+ALIGNED(4) const u8 gCreditsString_Game_Designers_2[] = _("\nGame Designers\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Hitomi_Sato_Shigeru_Ohmori_Tadashi_Takahashi[] = _("\n\nHitomi Sato\nShigeru Ohmori\nTadashi Takahashi\n\n");
+ALIGNED(4) const u8 gCreditsString_Game_Scenario[] = _("\nGame Scenario\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Hitomi_Sato_Satoshi_Tajiri[] = _("\n\nHitomi Sato\nSatoshi Tajiri\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Script_Designer_Map_Designer[] = _("\nScript Designer\n\nMap Designer\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Satoshi_Nohara_Shigeru_Ohmori[] = _("\n\nSatoshi Nohara\n\nShigeru Ohmori\n\n");
+ALIGNED(4) const u8 gCreditsString_Parametric_Designers[] = _("\nParametric Designers\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Koji_Nishino_Tetsuji_Ohta_Shigeki_Morimoto[] = _("\n\nKoji Nishino\nTetsuji Ohta\nShigeki Morimoto\n\n");
+ALIGNED(4) const u8 gCreditsString_POKeDEX_Text[] = _("\n\nPOKéDEX Text\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Kenji_Matsushima[] = _("\n\n\nKenji Matsushima\n\n\n");
+ALIGNED(4) const u8 gCreditsString_POKeMON_Designers[] = _("POKéMON Designers\n\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Ken_Sugimori_Motofumi_Fujiwara_Shigeki_Morimoto_Hironobu_Yoshida[] = _("\nKen Sugimori\nMotofumi Fujiwara\nShigeki Morimoto\nHironobu Yoshida\n\n");
+ALIGNED(4) const u8 gCreditsString_POKeMON_Designers_2[] = _("POKéMON Designers\n\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Satoshi_Ohta_Asuka_Iwashita_Takao_Unno_Kanako_Eo_Aimi_Tomita[] = _("\nSatoshi Ohta\nAsuka Iwashita\nTakao Unno\nKanako Eo\nAimi Tomita\n");
+ALIGNED(4) const u8 gCreditsString_POKeMON_Designers_3[] = _("POKéMON Designers\n\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Atsuko_Nishida_Muneo_Saito_Rena_Yoshikawa_Jun_Okutani[] = _("\nAtsuko Nishida\nMuneo Saito\nRena Yoshikawa\nJun Okutani\n\n");
+ALIGNED(4) const u8 gCreditsString_Supporting_Programmers[] = _("Supporting Programmers\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Teruyuki_Yoshioka_Takao_Nakano_Satoshi_Mitsuhara_Daisuke_Hoshino[] = _("\nTeruyuki Yoshioka\nTakao Nakano\n\nSatoshi Mitsuhara\nDaisuke Hoshino\n");
+ALIGNED(4) const u8 gCreditsString_NCL_Product_Testing[] = _("\n\nNCL Product Testing\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_NCL_Super_Mario_Club[] = _("\n\n\nNCL Super Mario Club\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Special_Thanks[] = _("Special Thanks\n\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Hiro_Nakamura_Hiroyuki_Uesugi_Teruki_Murakawa_Kazuya_Suyama[] = _("\nHiro Nakamura\nHiroyuki Uesugi\nTeruki Murakawa\n\nKazuya Suyama\n");
+ALIGNED(4) const u8 gCreditsString_Special_Thanks_2[] = _("Special Thanks\n\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Kenji_Tominaga_Kenjiro_Ito_Tomotaka_Komura_Michiko_Takizawa[] = _("\nKenji Tominaga\n\nKenjiro Ito\nTomotaka Komura\nMichiko Takizawa\n");
+ALIGNED(4) const u8 gCreditsString_Special_Thanks_3[] = _("Special Thanks\n\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Makiko_Takada_Mikiko_Ohashi_Shusaku_Egami_Takanao_Kondo_Rui_Kawaguchi[] = _("\nMakiko Takada\nMikiko Ohashi\nShusaku Egami\nTakanao Kondo\nRui Kawaguchi\n");
+ALIGNED(4) const u8 gCreditsString_Braille_Code_Check[] = _("\n\nBraille Code Check\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Japan_Braille_Library[] = _("\n\n\nJapan Braille Library\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Information_Supervisors[] = _("Information Supervisors\n\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Hiroki_Enomoto_Kazuyuki_Terada_Yuri_Sakurai_Yumi_Funasaka_Naoko_Yanase[] = _("\nHiroki Enomoto\nKazuyuki Terada\nYuri Sakurai\nYumi Funasaka\nNaoko Yanase\n");
+ALIGNED(4) const u8 gCreditsString_Coordinators[] = _("Coordinators\n\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Azusa_Tajima_Akira_Kinashi_Kazuki_Yoshihara_Retsuji_Nomoto[] = _("\nAzusa Tajima\nAkira Kinashi\nKazuki Yoshihara\n\nRetsuji Nomoto\n");
+ALIGNED(4) const u8 gCreditsString_Task_Managers[] = _("\nTask Managers\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Hitoshi_Yamagami_Gakuji_Nomoto[] = _("\n\nHitoshi Yamagami\nGakuji Nomoto\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Producers[] = _("\nProducers\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Hiroyuki_Jinnai_Takehiro_Izushi_Hiroaki_Tsuru[] = _("\n\nHiroyuki Jinnai\nTakehiro Izushi\nHiroaki Tsuru\n\n");
+ALIGNED(4) const u8 gCreditsString_Executive_Director[] = _("\n\nExecutive Director\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Satoshi_Tajiri[] = _("\n\n\nSatoshi Tajiri\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Executive_Producer[] = _("\n\nExecutive Producer\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Satoru_Iwata[] = _("\n\n\nSatoru Iwata\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Executive_Producer_2[] = _("\n\nExecutive Producer\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Tsunekaz_Ishihara[] = _("\n\n\nTsunekaz Ishihara\n\n\n");
+ALIGNED(4) const u8 gCreditsString_English_Version_Coordinators[] = _("\nEnglish Version Coordinators\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Hiro_Nakamura_Seth_McMahill[] = _("\n\nHiro Nakamura\nSeth McMahill\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Translator_Text_Editor[] = _("\nTranslator\n\nText Editor\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Nob_Ogasawara_Teresa_Lillygren[] = _("\n\nNob Ogasawara\n\nTeresa Lillygren\n\n");
+ALIGNED(4) const u8 gCreditsString_Programmers_2[] = _("Programmers\n\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Teruki_Murakawa_Souichi_Yamamoto_Yuichiro_Ito_Akira_Kinashi[] = _("\nTeruki Murakawa\nSouichi Yamamoto\nYuichiro Ito\nAkira Kinashi\n\n");
+ALIGNED(4) const u8 gCreditsString_Environment_Tool_Programmers[] = _("\nEnvironment & Tool Programmers\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Teruki_Murakawa_Souichi_Yamamoto_Kimiko_Nakamichi[] = _("\n\nTeruki Murakawa\nSouichi Yamamoto\nKimiko Nakamichi\n\n");
+ALIGNED(4) const u8 gCreditsString_NOA_Product_Testing[] = _("NOA Product Testing\n\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Thomas_Hertzog_Kathy_Huguenard_Mika_Kurosawa[] = _("\nThomas Hertzog\nKathy Huguenard\nMika Kurosawa\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Braille_Code_Check_2[] = _("Braille Code Check\n\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_National_Federation_of_the_Blind_Patricia_A_Maurer_Japan_Braille_Library_European_Blind_Union[] = _("\nNational Federation\n{CLEAR_TO 0x13}of the Blind\nPatricia A. Maurer\nJapan Braille Library\nEuropean Blind Union\n");
+ALIGNED(4) const u8 gCreditsString_Braille_Code_Check_3[] = _("\nBraille Code Check\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_National_Information_Library_Service_Margaret_Campion[] = _("\n\nNational Information Library\n{CLEAR_TO 0x2D}Service\nMargaret Campion\n\n");
+ALIGNED(4) const u8 gCreditsString_Special_Thanks_4[] = _("Special Thanks\n\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Takehiro_Izushi_Motoyasu_Tojima_Hitoshi_Yamagami_Hiroyuki_Uesugi[] = _("\nTakehiro Izushi\nMotoyasu Tojima\nHitoshi Yamagami\nHiroyuki Uesugi\n\n");
+ALIGNED(4) const u8 gCreditsString_Special_Thanks_5[] = _("Special Thanks\n\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Nicola_Pratt_Barlow_Shellie_Dow_Anthony_Howitt_Naoko_Saeki_Kyoko_Onishi[] = _("\nNicola Pratt-Barlow\nShellie Dow\nAnthony Howitt\nNaoko Saeki\nKyoko Onishi\n");
+ALIGNED(4) const u8 gCreditsString_Braille_Code_Check_4[] = _("\nBraille Code Check\n\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_The_Royal_New_Zealand_Foundation_of_the_Blind_Greg_Moran[] = _("\n\nThe Royal New Zealand\nFoundation of the Blind\nGreg Moran\n\n");
+ALIGNED(4) const u8 gCreditsString_Graphic_Designer[] = _("\n\nGraphic Designer\n\n\n\n");
+ALIGNED(4) const u8 gCreditsString_Akira_Kinashi[] = _("\n\n\nAkira Kinashi\n\n\n");
+const u8 gJPText_MysteryGift[] = _("");
+const u8 gJPText_DecideStop[] = _("");
+const u8 gJPText_ReceiveMysteryGiftWithEReader[] = _("");
+const u8 gJPText_SelectConnectFromEReaderMenu[] = _("");
+const u8 gJPText_SelectConnectWithGBA[] = _("");
+const u8 gJPText_SelectConnectAndPressA[] = _("カ-ドeリ-ダ-{PLUS}の ‘つうしん'を\nえらんで Aボタンを おしてください");
+const u8 gJPText_LinkIsIncorrect[] = _("");
+const u8 gJPText_CardReadingHasBeenHalted[] = _("");
+const u8 gJPText_UnableConnectWithEReader[] = _("カ-ドeリ-ダ-{PLUS}と\nつうしん できません");
+const u8 gJPText_Connecting[] = _("");
+const u8 gJPText_ConnectionErrorCheckLink[] = _("");
+const u8 gJPText_ConnectionErrorTryAgain[] = _("");
+const u8 gJPText_AllowEReaderToLoadCard[] = _("");
+const u8 gJPText_ConnectionComplete[] = _("");
+const u8 gJPText_NewTrainerHasComeToSevii[] = _("");
+const u8 gJPText_PleaseWaitAMoment[] = _("");
+const u8 gJPText_WriteErrorUnableToSaveData[] = _("");
+const u8 gText_CommErrorCheckConnections[] = _("Communication error…\nPlease check all connections,\nthen turn the power OFF and ON.");
+const u8 gText_CommErrorEllipsis[] = _("Communication error…");
+const u8 gText_MoveCloserToLinkPartner[] = _("Move closer to your link partner(s).\nAvoid obstacles between partners.");
+const u8 gText_ABtnRegistrationCounter[] = _("A Button: Registration Counter");
+const u8 gText_ABtnTitleScreen[] = _("A Button: Title Screen");
+const u8 gUnknown_841DF82[] = _("{STR_VAR_1}P LINK");
+const u8 gUnknown_841DF8B[] = _("BRONZE");
+const u8 gUnknown_841DF92[] = _("COPPER");
+const u8 gUnknown_841DF99[] = _("SILVER");
+const u8 gUnknown_841DFA0[] = _("GOLD");
+const u8 gUnknown_841DFA5[] = _("{A_BUTTON}NEXT");
+const u8 gUnknown_841DFAC[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}END");
+const u8 gUnknown_841DFBE[] = _("{A_BUTTON}{B_BUTTON}CANCEL");
+const u8 gUnknown_841DFC9[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}CANCEL");
+const u8 gEasyChatGroupName_Pokemon[] = _("POKéMON");
+const u8 gEasyChatGroupName_Trainer[] = _("TRAINER");
+const u8 gEasyChatGroupName_Status[] = _("STATUS");
+const u8 gEasyChatGroupName_Battle[] = _("BATTLE");
+const u8 gEasyChatGroupName_Greetings[] = _("GREETINGS");
+const u8 gEasyChatGroupName_People[] = _("PEOPLE");
+const u8 gEasyChatGroupName_Voices[] = _("VOICES");
+const u8 gEasyChatGroupName_Speech[] = _("SPEECH");
+const u8 gEasyChatGroupName_Endings[] = _("ENDINGS");
+const u8 gEasyChatGroupName_Feelings[] = _("FEELINGS");
+const u8 gEasyChatGroupName_Conditions[] = _("CONDITIONS");
+const u8 gEasyChatGroupName_Actions[] = _("ACTIONS");
+const u8 gEasyChatGroupName_Lifestyle[] = _("LIFESTYLE");
+const u8 gEasyChatGroupName_Hobbies[] = _("HOBBIES");
+const u8 gEasyChatGroupName_Time[] = _("TIME");
+const u8 gEasyChatGroupName_Misc[] = _("MISC.");
+const u8 gEasyChatGroupName_Adjectives[] = _("ADJECTIVES");
+const u8 gEasyChatGroupName_Events[] = _("EVENTS");
+const u8 gEasyChatGroupName_Move1[] = _("MOVE 1");
+const u8 gEasyChatGroupName_Move2[] = _("MOVE 2");
+const u8 gEasyChatGroupName_TrendySaying[] = _("TRENDY SAYING");
+const u8 gEasyChatGroupName_Pokemon2[] = _("POKéMON2");
+const u8 gText_ThreeQuestionMarks[] = _("???");
+const u8 gText_UnusedEmpty[] = _("");
+const u8 gText_UnusedLv[] = _("Lv");
+const u8 gText_UnusedDashes[] = _("---");
+const u8 gUnknown_841E09F[] = _("????");
+const u8 gText_UnusedEmpty2[] = _("");
+const u8 gUnknown_841E0A5[] = _("Is this trade okay?");
+const u8 gTradeText_Cancel[] = _("CANCEL");
+const u8 gTradeText_ChooseAPokemon[] = _("Choose a POKéMON.");
+const u8 gTradeText_Summary[] = _("SUMMARY");
+const u8 gTradeText_Trade[] = _("TRADE");
+const u8 gTradeText_CancelTrade[] = _("Cancel trade?");
+const u8 gTradeText_PressBButtonToExit[] = _("Press the B Button to exit.");
+const u8 gUnknown_841E10A[] = _("SUMMARY");
+const u8 gUnknown_841E112[] = _("TRADE");
+const u8 gUnknown_841E118[] = _("{COLOR RED}{HIGHLIGHT DARK_GREY}{SHADOW GREEN}Communication standby…\nPlease wait.");
+const u8 gUnknown_841E145[] = _("{COLOR RED}{HIGHLIGHT DARK_GREY}{SHADOW GREEN}The trade has been canceled.");
+const u8 gUnknown_841E16B[] = _("{COLOR RED}{HIGHLIGHT DARK_GREY}{SHADOW GREEN}That's your only POKéMON\nfor battle.");
+const u8 gUnknown_841E199[] = _("{COLOR RED}{HIGHLIGHT DARK_GREY}{SHADOW GREEN}Waiting for your friend\nto finish…");
+const u8 gUnknown_841E1C5[] = _("Your friend wants\nto trade POKéMON.");
+const u8 gText_XWillBeSentToY[] = _("{STR_VAR_2} will be\nsent to {STR_VAR_1}.");
+const u8 gText_ByeByeVar1[] = _("Bye-bye, {STR_VAR_2}!");
+const u8 gText_XSentOverY[] = _("{STR_VAR_1} sent over {STR_VAR_3}.");
+const u8 gText_TakeGoodCareOfX[] = _("Take good care of {STR_VAR_3}!");
+const u8 gText_From[] = _("From ");
+const u8 gUnknown_841E23A[] = _("");
+const u8 gUnknown_841E23B[] = _("");
+const u8 gUnknown_841E23C[] = _("");
+const u8 gUnknown_841E23D[] = _("");
+const u8 gUnknown_841E23E[] = _("");
+const u8 gUnknown_841E23F[] = _("");
+const u8 gUnknown_841E240[] = _("");
+const u8 gUnknown_841E241[] = _("");
+const u8 gUnknown_841E242[] = _("");
+const u8 gUnknown_841E243[] = _("");
+const u8 gUnknown_841E244[] = _("");
+const u8 gText_WirelessCommunicationStatus[] = _("Wireless Communication Status");
+const u8 gText_PeopleTrading[] = _("People trading:");
+const u8 gText_PeopleBattling[] = _("People battling:");
+const u8 gText_PeopleInUnionRoom[] = _("People in the UNION ROOM:");
+const u8 gText_PeopleCommunicating[] = _("People communicating:");
+const u8 gUnknown_841E2B4[] = _("{DYNAMIC 0x00} players");
+const u8 gUnknown_841E2BF[] = _("{DYNAMIC 0x01} player");
+const u8 gUnknown_841E2C9[] = _("{DYNAMIC 0x02} players");
+const u8 gUnknown_841E2D4[] = _("{DYNAMIC 0x03} players");
+const u8 gUnknown_841E2DF[] = _("{DPAD_ANY}えらぶ:{A_BUTTON}けってい");
+const u8 gUnknown_841E2EC[] = _("{B_BUTTON}CANCEL");
+const u8 gUnknown_841E2F5[] = _("{COLOR BLUE}{SHADOW YELLOW} たいせんの くみあわせ\n{COLOR RED}{SHADOW GREEN}じぶんの ばしょをきめて ください");
+const u8 gUnknown_841E322[] = _("{ID}");
+const u8 gText_CommunicationStandby5[] = _("Communication standby…");
+const u8 gDaycareText_GetAlongVeryWell[] = _("The two seem to get along\nvery well.");
+const u8 gDaycareText_GetAlong[] = _("The two seem to get along.");
+const u8 gDaycareText_DontLikeOther[] = _("The two don't seem to like\neach other much.");
+const u8 gDaycareText_PlayOther[] = _("The two prefer to play with other\nPOKéMON than each other.");
+const u8 gText_TeachWhichMoveToMon[] = _("Teach which move to {STR_VAR_1}?");
+const u8 gText_TeachMoveQues[] = _("Teach {STR_VAR_2}?");
+const u8 gText_MonLearnedMove[] = _("{STR_VAR_1} learned\n{STR_VAR_2}.");
+const u8 gText_MonIsTryingToLearnMove[] = _("{STR_VAR_1} is trying to learn\n{STR_VAR_2}.\pBut {STR_VAR_1} can't learn more\nthan four moves.\pDelete an older move to make\nroom for {STR_VAR_2}?");
+const u8 gText_StopLearningMove[] = _("Stop learning {STR_VAR_2}?");
+const u8 gText_1_2_and_Poof[] = _("{PAUSE 0x20}1, {PAUSE 0x0F}2, and {PAUSE 0x0F}‥ {PAUSE 0x0F}‥ {PAUSE 0x0F}‥ {PAUSE 0x0F}{PLAY_SE SE_KON}Poof!\p");
+const u8 gText_MonForgotOldMoveAndMonLearnedNewMove[] = _("{STR_VAR_1} forgot {STR_VAR_3}.\pAnd‥\p{STR_VAR_1}\nlearned {STR_VAR_2}.");
+const u8 gText_GiveUpTryingToTeachNewMove[] = _("Give up trying to teach a new\nmove to {STR_VAR_1}?");
+const u8 gText_WhichMoveShouldBeForgotten[] = _("Which move should be forgotten?\p");
+const u8 gUnknown_841E52D[] = _("----------");
+const u8 gText_CommStandbyAwaitingOtherPlayer[] = _("Communication standby‥\nAwaiting another player to choose.");
+const u8 gText_BattleWasRefused[] = _("The battle was refused.{PAUSE 0x3C}");
+const u8 gText_RefusedBattle[] = _("Refused the battle.{PAUSE 0x3C}");
+const u8 gFameCheckerText_MainScreenUI[] = _("{START_BUTTON}PICK {DPAD_UPDOWN}SELECT {A_BUTTON}OK");
+const u8 gFameCheckerText_PickScreenUI[] = _("{START_BUTTON}PICK {DPAD_UPDOWN}SELECT {B_BUTTON}CANCEL");
+const u8 gFameCheckerText_FlavorTextUI[] = _("{DPAD_ANY}PICK {A_BUTTON}READ {B_BUTTON}CANCEL");
+const u8 gFameCheckerOakName[] = _("OAK");
+const u8 gFameCheckerDaisyName[] = _("DAISY");
+const u8 gFameCheckerBillName[] = _("BILL");
+const u8 gFameCheckerMrFujiName[] = _("FUJI");
+const u8 gText_VarietyOfEventsImportedWireless[] = _("A variety of events will be imported\nover Wireless Communication.");
+const u8 gText_WonderCardsInPossession[] = _("Read the WONDER CARDS in your\npossession.");
+const u8 gText_ReadNewsThatArrived[] = _("Read the NEWS that arrived.");
+const u8 gText_ReturnToTitle[] = _("Return to the title screen.");
+const u8 gText_DontHaveCardNewOneInput[] = _("You don't have a WONDER CARD,\nso a new CARD will be input.");
+const u8 gText_DontHaveNewsNewOneInput[] = _("You don't have any WONDER NEWS,\nso new NEWS will be input.");
+const u8 gText_WhereShouldCardBeAccessed[] = _("Where should the WONDER CARD\nbe accessed?");
+const u8 gText_WhereShouldNewsBeAccessed[] = _("Where should the WONDER NEWS\nbe accessed?");
+const u8 gUnknown_841E76B[] = _("Link standby...\n... ... B Button: Cancel");
+const u8 gText_Communicating[] = _("Communicating…");
+const u8 gText_CommunicationCompleted[] = _("Communication completed.");
+const u8 gText_CommunicationError[] = _("Communication error.");
+const u8 gText_CommunicationCanceled[] = _("Communication has been canceled.");
+const u8 gText_ThrowAwayWonderCard[] = _("Throw away the WONDER CARD\nand input a new CARD?");
+const u8 gText_HaventReceivedCardsGift[] = _("You haven't received the CARD's gift\nyet. Input a new CARD anyway?");
+const u8 gText_WonderCardReceivedFrom[] = _("A WONDER CARD has been received\nfrom {STR_VAR_1}.");
+const u8 gText_WonderNewsReceivedFrom[] = _("A WONDER NEWS item has been\nreceived from {STR_VAR_1}.");
+const u8 gText_WonderCardReceived[] = _("A new WONDER CARD has been\nreceived.");
+const u8 gText_WonderNewsReceived[] = _("A new WONDER NEWS item has been\nreceived.");
+const u8 gText_NewStampReceived[] = _("A new STAMP has been received.");
+const u8 gText_NewTrainerReceived[] = _("A new TRAINER has arrived.");
+const u8 gText_AlreadyHadCard[] = _("You already had that\nWONDER CARD.");
+const u8 gText_AlreadyHadNews[] = _("You already had that\nWONDER NEWS item.");
+const u8 gText_AlreadyHadStamp[] = _("You already had that\nSTAMP.");
+const u8 gText_NoMoreRoomForStamps[] = _("There's no more room for adding\nSTAMPS.");
+const u8 gText_RecordUploadedViaWireless[] = _("Your record has been uploaded via\nWIRELESS COMMUNICATION.");
+const u8 gText_CantAcceptCardFromTrainer[] = _("You can't accept a WONDER CARD\nfrom this TRAINER.");
+const u8 gText_CantAcceptNewsFromTrainer[] = _("You can't accept WONDER NEWS\nfrom this TRAINER.");
+const u8 gText_NothingSentOver[] = _("Nothing was sent over…");
+const u8 gText_WhatToDoWithCards[] = _("What would you like to do\nwith the WONDER CARDS?");
+const u8 gText_WhatToDoWithNews[] = _("What would you like to do\nwith the WONDER NEWS?");
+const u8 gText_SendingWonderCard[] = _("Sending your WONDER CARD…");
+const u8 gText_SendingWonderNews[] = _("Sending your WONDER NEWS item…");
+const u8 gText_WonderCardSentTo[] = _("Your WONDER CARD has been sent\nto {STR_VAR_1}.");
+const u8 gText_WonderNewsSentTo[] = _("Your WONDER NEWS item has been\nsent to {STR_VAR_1}.");
+const u8 gText_StampSentTo[] = _("A STAMP has been sent to {STR_VAR_1}.");
+const u8 gText_GiftSentTo[] = _("A GIFT has been sent to {STR_VAR_1}.");
+const u8 gText_OtherTrainerHasCard[] = _("The other TRAINER has the same\nWONDER CARD already.");
+const u8 gText_OtherTrainerHasNews[] = _("The other TRAINER has the same\nWONDER NEWS already.");
+const u8 gText_OtherTrainerHasStamp[] = _("The other TRAINER has the same\nSTAMP already.");
+const u8 gText_OtherTrainerCanceled[] = _("The other TRAINER canceled\ncommunication.");
+const u8 gText_CantSendGiftToTrainer[] = _("You can't send a MYSTERY GIFT to\nthis TRAINER.");
+const u8 gText_IfThrowAwayCardEventWontHappen[] = _("If you throw away the CARD,\nits event won't happen. Okay?");
+const u8 gText_OkayToDiscardNews[] = _("Is it okay to discard this\nNEWS item?");
+const u8 gText_HaventReceivedGiftOkayToDiscard[] = _("You haven't received the\nGIFT. Is it okay to discard?");
+const u8 gText_DataWillBeSaved[] = _("Data will be saved.\nPlease wait.");
+const u8 gText_SaveCompletedPressA[] = _("Save completed.\nPlease press the A Button.");
+const u8 gText_WonderCardThrownAway[] = _("The WONDER CARD was thrown away.");
+const u8 gText_WonderNewsThrownAway[] = _("The WONDER NEWS was thrown away.");
+const u8 gText_MysteryGift2[] = _("MYSTERY GIFT");
+const u8 gText_PickOKCancel[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}EXIT");
+const u8 gText_WonderCards[] = _("WONDER CARDS");
+const u8 gText_WonderNews[] = _("WONDER NEWS");
+const u8 gText_WirelessCommunication[] = _("WIRELESS COMMUNICATION");
+const u8 gText_Friend2[] = _("FRIEND");
+const u8 gText_Exit3[] = _("EXIT");
+const u8 gText_Receive[] = _("RECEIVE");
+const u8 gText_Send[] = _("SEND");
+const u8 gText_Toss[] = _("TOSS");
+const u8 gUnknown_841EE2B[] = _("DEL. ALL{CLEAR_TO 0x57}CANCEL{CLEAR_TO 0xA4}OK");
diff --git a/src/teachy_tv.c b/src/teachy_tv.c
index 1467131b0..1d49ee3d9 100644
--- a/src/teachy_tv.c
+++ b/src/teachy_tv.c
@@ -500,7 +500,7 @@ static void TeachyTvMainCallback(void)
ScheduleBgCopyTilemapToVram(1);
ScheduleBgCopyTilemapToVram(2);
ScheduleBgCopyTilemapToVram(3);
- HelpSystem_SetSomeVariable(9); // help system something
+ SetHelpContextDontCheckBattle(HELPCONTEXT_BAG);
BlendPalettes(0xFFFFFFFF, 0x10, 0);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
SetVBlankCallback(TeachyTvVblankHandler);
diff --git a/src/text.c b/src/text.c
index 83f089c12..2d4d4a9b0 100644
--- a/src/text.c
+++ b/src/text.c
@@ -1,15 +1,11 @@
#include "global.h"
#include "main.h"
-#include "palette.h"
-#include "string_util.h"
#include "window.h"
#include "text.h"
#include "sprite.h"
-#include "blit.h"
#include "sound.h"
#include "m4a.h"
#include "quest_log.h"
-#include "window.h"
#include "graphics.h"
#include "dynamic_placeholder_text_util.h"
#include "constants/songs.h"
diff --git a/src/text_window.c b/src/text_window.c
index 98f82e818..6fde39078 100644
--- a/src/text_window.c
+++ b/src/text_window.c
@@ -1,7 +1,6 @@
#include "global.h"
#include "bg.h"
#include "palette.h"
-#include "text.h"
#include "window.h"
#include "text_window.h"
#include "text_window_graphics.h"
diff --git a/src/tileset_anims.c b/src/tileset_anims.c
index 44e86448f..04e129049 100644
--- a/src/tileset_anims.c
+++ b/src/tileset_anims.c
@@ -1,10 +1,4 @@
#include "global.h"
-#include "graphics.h"
-#include "palette.h"
-#include "util.h"
-#include "battle_transition.h"
-#include "task.h"
-#include "fieldmap.h"
static EWRAM_DATA struct {
const u16 *src;
@@ -232,7 +226,7 @@ static void sub_8070120(u16 timer)
sub_80700A4(timer >> 4);
}
-void sub_8070154(void)
+void InitTilesetAnim_General(void)
{
sPrimaryTilesetAnimCounter = 0;
sPrimaryTilesetAnimCounterMax = 640;
@@ -250,7 +244,7 @@ static void sub_80701AC(u16 timer)
sub_807017C(timer / 12);
}
-void sub_80701D8(void)
+void InitTilesetAnim_CeladonCity(void)
{
sSecondaryTilesetAnimCounter = 0;
sSecondaryTilesetAnimCounterMax = 120;
@@ -268,7 +262,7 @@ static void sub_8070224(u16 timer)
sub_80701FC(timer / 10);
}
-void sub_8070250(void)
+void InitTilesetAnim_SilphCo(void)
{
sSecondaryTilesetAnimCounter = 0;
sSecondaryTilesetAnimCounterMax = 160;
@@ -286,7 +280,7 @@ static void sub_807029C(u16 timer)
sub_8070274(timer >> 4);
}
-void sub_80702B4(void)
+void InitTilesetAnim_MtEmber(void)
{
sSecondaryTilesetAnimCounter = 0;
sSecondaryTilesetAnimCounterMax = 256;
@@ -306,7 +300,7 @@ static void sub_8070304(u16 timer)
sub_80702DC(timer >> 1);
}
-void sub_807031C(void)
+void InitTilesetAnim_VermilionGym(void)
{
sSecondaryTilesetAnimCounter = 0;
sSecondaryTilesetAnimCounterMax = 240;
@@ -326,7 +320,7 @@ static void sub_8070368(u16 timer)
sub_8070340(timer >> 4);
}
-void sub_8070380(void)
+void InitTilesetAnim_CeladonGym(void)
{
sSecondaryTilesetAnimCounter = 0;
sSecondaryTilesetAnimCounterMax = 256;
diff --git a/src/title_screen.c b/src/title_screen.c
index af78893b9..0ff0a6b96 100644
--- a/src/title_screen.c
+++ b/src/title_screen.c
@@ -575,7 +575,7 @@ static void SetTitleScreenScene_Run(s16 * data)
switch (data[1])
{
case 0:
- HelpSystem_SetSomeVariable2(1);
+ SetHelpContext(HELPCONTEXT_TITLE_SCREEN);
CreateTask(Task_TitleScreen_BlinkPressStart, 0);
CreateTask(Task_FlameOrLeafSpawner, 5);
SetGpuRegsForTitleScreenRun();
diff --git a/src/tm_case.c b/src/tm_case.c
index d45061bde..2f27cc0db 100644
--- a/src/tm_case.c
+++ b/src/tm_case.c
@@ -25,7 +25,6 @@
#include "scanline_effect.h"
#include "sound.h"
#include "strings.h"
-#include "tm_case.h"
#include "menu_indicators.h"
#include "constants/items.h"
#include "constants/songs.h"
@@ -613,7 +612,7 @@ static void PrintListMenuCursorAt_WithColorIdx(u8 a0, u8 a1)
}
else
{
- AddTextPrinterParameterized_ColorByIndex(0, 2, gFameCheckerText_ListMenuCursor, 0, a0, 0, 0, 0, a1);
+ AddTextPrinterParameterized_ColorByIndex(0, 2, gText_SelectorArrow2, 0, a0, 0, 0, 0, a1);
}
}
@@ -798,7 +797,7 @@ static void Task_SelectTMAction_FromFieldBag(u8 taskId)
Menu_InitCursor(sTMCaseDynamicResources->contextMenuWindowId, 2, 0, 2, GetFontAttribute(2, 1) + 2, sTMCaseDynamicResources->numMenuActions, 0);
strbuf = Alloc(256);
GetTMNumberAndMoveString(strbuf, gSpecialVar_ItemId);
- StringAppend(strbuf, gText_IsSelected);
+ StringAppend(strbuf, gText_Var1IsSelected + 2); // +2 skips over the stringvar
AddTextPrinterParameterized_ColorByIndex(2, 2, strbuf, 0, 2, 1, 0, 0, 1);
Free(strbuf);
if (itemid_is_unique(gSpecialVar_ItemId))
@@ -1304,7 +1303,7 @@ static void InitWindowTemplatesAndPals(void)
LoadPalette(gTMCaseMainWindowPalette, 0xA0, 0x20);
LoadPalette(sPal3Override, 0xF6, 0x04);
LoadPalette(sPal3Override, 0xD6, 0x04);
- sub_8107D38(0xc0, 0x01);
+ ListMenuLoadStdPalAt(0xc0, 0x01);
for (i = 0; i < 9; i++)
FillWindowPixelBuffer(i, 0x00);
PutWindowTilemap(0);
diff --git a/src/trade.c b/src/trade.c
index fe5f53be9..30bfa8389 100644
--- a/src/trade.c
+++ b/src/trade.c
@@ -6,7 +6,6 @@
#include "pokemon_icon.h"
#include "graphics.h"
#include "link.h"
-#include "load_save.h"
#include "link_rfu.h"
#include "cable_club.h"
#include "data.h"
@@ -14,7 +13,6 @@
#include "menu.h"
#include "overworld.h"
#include "battle_anim.h"
-#include "pokeball.h"
#include "party_menu.h"
#include "daycare.h"
#include "event_data.h"
@@ -22,7 +20,6 @@
#include "pokemon_summary_screen.h"
#include "pokemon_storage_system.h"
#include "new_menu_helpers.h"
-#include "trade.h"
#include "trade_scene.h"
#include "constants/songs.h"
#include "constants/moves.h"
@@ -765,9 +762,9 @@ static void sub_804C728(void)
if (gWirelessCommType)
{
- sub_800B1F4();
+ SetWirelessCommType1();
OpenLink();
- sub_80FBB20();
+ LinkRfu_CreateIdleTask();
}
else
{
@@ -810,14 +807,14 @@ static void sub_804C728(void)
case 4:
if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE)
{
- sub_80FBB4C();
+ LinkRfu_DestroyIdleTask();
CalculatePlayerPartyCount();
gMain.state++;
sTradeMenuResourcesPtr->unk_A8 = 0;
if (gWirelessCommType)
{
sub_80FA484(TRUE);
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
}
}
break;
@@ -1213,7 +1210,7 @@ static void sub_804D548(void)
}
else
{
- sub_800AA80(32);
+ Link_StartSend5FFFwithParam(32);
sTradeMenuResourcesPtr->unk_6F = 13;
}
}
@@ -2004,11 +2001,11 @@ static void sub_804E908(void)
{
if (gWirelessCommType)
{
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
}
else
{
- sub_800AA80(12);
+ Link_StartSend5FFFwithParam(12);
}
sTradeMenuResourcesPtr->unk_6F = 12;
@@ -2044,7 +2041,7 @@ static void sub_804E9C0(void)
{
if (!sub_80FA484(FALSE))
{
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
sTradeMenuResourcesPtr->unk_6F = 13;
}
}
@@ -2740,30 +2737,30 @@ static bool32 IsDeoxysOrMewUntradable(u16 species, bool8 isObedientBitSet)
return FALSE;
}
-int GetUnionRoomTradeMessageId(struct GFtgtGnameSub a0, struct GFtgtGnameSub a1, u16 species1, u16 species2, u8 type, u16 species3, u8 isObedientBitSet)
+int GetUnionRoomTradeMessageId(struct GFtgtGnameSub playerSub, struct GFtgtGnameSub partnerSub, u16 species1, u16 species2, u8 type, u16 species3, u8 isObedientBitSet)
{
- u8 r9 = a0.hasNationalDex;
- u8 r4 = a0.isChampion;
- u8 r10 = a1.hasNationalDex;
- u8 r0 = a1.isChampion;
- u8 r1 = a1.unk_01_2;
- u8 r2;
+ u8 playerHasNationalDex = playerSub.hasNationalDex;
+ u8 playerIsChampion = playerSub.isChampion;
+ u8 partnerHasNationalDex = partnerSub.hasNationalDex;
+ u8 partnerIsChampion = partnerSub.isChampion;
+ u8 partnerVersion = partnerSub.version;
+ bool8 isNotFRLG;
- if (r1 == VERSION_FIRE_RED || r1 == VERSION_LEAF_GREEN)
+ if (partnerVersion == VERSION_FIRE_RED || partnerVersion == VERSION_LEAF_GREEN)
{
- r2 = 0;
+ isNotFRLG = FALSE;
}
else
{
- r2 = 1;
+ isNotFRLG = TRUE;
}
- if (r2)
+ if (isNotFRLG)
{
- if (!r4)
+ if (!playerIsChampion)
{
return 8;
}
- else if (!r0)
+ else if (!partnerIsChampion)
{
return 9;
}
@@ -2794,7 +2791,7 @@ int GetUnionRoomTradeMessageId(struct GFtgtGnameSub a0, struct GFtgtGnameSub a1,
return 3;
}
- if (!r9)
+ if (!playerHasNationalDex)
{
if (species1 == SPECIES_EGG)
{
@@ -2812,7 +2809,7 @@ int GetUnionRoomTradeMessageId(struct GFtgtGnameSub a0, struct GFtgtGnameSub a1,
}
}
- if (!r10 && species1 > SPECIES_MEW)
+ if (!partnerHasNationalDex && species1 > SPECIES_MEW)
{
return 7;
}
@@ -2820,11 +2817,11 @@ int GetUnionRoomTradeMessageId(struct GFtgtGnameSub a0, struct GFtgtGnameSub a1,
return 0;
}
-int CanRegisterMonForTradingBoard(struct GFtgtGnameSub a0, u16 species, u16 a2, u8 a3)
+int CanRegisterMonForTradingBoard(struct GFtgtGnameSub playerSub, u16 species2, u16 species, u8 obedience)
{
- u8 canTradeEggAndNational = a0.hasNationalDex;
+ u8 canTradeEggAndNational = playerSub.hasNationalDex;
- if (IsDeoxysOrMewUntradable(a2, a3))
+ if (IsDeoxysOrMewUntradable(species, obedience))
{
return 1;
}
@@ -2834,12 +2831,12 @@ int CanRegisterMonForTradingBoard(struct GFtgtGnameSub a0, u16 species, u16 a2,
return 0;
}
- if (species == SPECIES_EGG)
+ if (species2 == SPECIES_EGG)
{
return 2;
}
- if (species > SPECIES_MEW && species != SPECIES_EGG)
+ if (species2 > SPECIES_MEW && species2 != SPECIES_EGG)
{
return 1;
}
diff --git a/src/trade_scene.c b/src/trade_scene.c
index b420cb196..d609a9b53 100644
--- a/src/trade_scene.c
+++ b/src/trade_scene.c
@@ -10,7 +10,6 @@
#include "palette.h"
#include "trade.h"
#include "link.h"
-#include "librfu.h"
#include "link_rfu.h"
#include "text.h"
#include "mevent.h"
@@ -31,7 +30,6 @@
#include "quest_log.h"
#include "help_system.h"
#include "new_menu_helpers.h"
-#include "battle_interface.h"
#include "pokedex.h"
#include "save.h"
#include "load_save.h"
@@ -41,7 +39,7 @@
#include "constants/items.h"
#include "constants/easy_chat.h"
#include "constants/songs.h"
-#include "constants/region_map.h"
+#include "constants/region_map_sections.h"
#include "constants/moves.h"
#define TAG_GLOW1_TILES 5550
@@ -948,13 +946,13 @@ static void TradeAnimInit_LoadGfx(void)
DeactivateAllTextPrinters();
// Doing the graphics load...
DecompressAndLoadBgGfxUsingHeap(0, gBattleTextboxTiles, 0, 0, 0);
- LZDecompressWram(gFile_graphics_interface_menu_map_tilemap, gDecompressionBuffer);
+ LZDecompressWram(gBattleTextboxTilemap, gDecompressionBuffer);
CopyToBgTilemapBuffer(0, gDecompressionBuffer, BG_SCREEN_SIZE, 0);
LoadCompressedPalette(gBattleTextboxPalette, 0x000, 0x20);
InitWindows(gUnknown_826D1BC);
// ... and doing the same load again
DecompressAndLoadBgGfxUsingHeap(0, gBattleTextboxTiles, 0, 0, 0);
- LZDecompressWram(gFile_graphics_interface_menu_map_tilemap, gDecompressionBuffer);
+ LZDecompressWram(gBattleTextboxTilemap, gDecompressionBuffer);
CopyToBgTilemapBuffer(0, gDecompressionBuffer, BG_SCREEN_SIZE, 0);
LoadCompressedPalette(gBattleTextboxPalette, 0x000, 0x20);
}
@@ -2556,7 +2554,7 @@ static void sub_8053E8C(void)
DrawTextOnTradeWindow(0, gStringVar4, 0);
break;
case 1:
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
gMain.state = 100;
sTradeData->timer = 0;
break;
@@ -2594,7 +2592,7 @@ static void sub_8053E8C(void)
}
if (gWirelessCommType)
{
- sub_8144714(2, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
+ MEvent_RecordIdOfWonderCardSenderByEventType(2, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
}
SetContinueGameWarpStatusToDynamicWarp();
sub_80DA3AC();
@@ -2641,7 +2639,7 @@ static void sub_8053E8C(void)
case 41:
if (sTradeData->timer == 0)
{
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
gMain.state = 42;
}
else
@@ -2660,7 +2658,7 @@ static void sub_8053E8C(void)
if (++sTradeData->timer > 60)
{
gMain.state++;
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
}
break;
case 6:
@@ -2682,11 +2680,11 @@ static void sub_8053E8C(void)
{
if (gWirelessCommType && gMain.savedCallback == CB2_ReturnFromLinkTrade)
{
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
}
else
{
- sub_800AAC0();
+ Link_TryStartSend5FFF();
}
gMain.state++;
}
diff --git a/src/trainer_card.c b/src/trainer_card.c
index e4778f5ed..df116d379 100644
--- a/src/trainer_card.c
+++ b/src/trainer_card.c
@@ -14,7 +14,6 @@
#include "event_data.h"
#include "easy_chat.h"
#include "money.h"
-#include "window.h"
#include "strings.h"
#include "string_util.h"
#include "trainer_card.h"
@@ -22,7 +21,6 @@
#include "pokedex.h"
#include "pokemon_icon.h"
#include "graphics.h"
-#include "pokemon_icon.h"
#include "help_system.h"
#include "trainer_pokemon_sprites.h"
#include "new_menu_helpers.h"
@@ -31,15 +29,7 @@
#include "constants/game_stat.h"
#include "constants/vars.h"
#include "constants/species.h"
-
-#define BADGE_COUNT 8
-
-// Trainer Card Types
-enum
-{
- CARD_TYPE_FRLG,
- CARD_TYPE_EMERALD,
-};
+#include "constants/facility_trainer_classes.h"
// Trainer Card Strings
enum
@@ -61,46 +51,43 @@ enum
struct TrainerCardData
{
- /*0x0000*/ u8 taskState;
- /*0x0001*/ u8 printState;
- /*0x0002*/ u8 gfxLoadState;
- /*0x0003*/ u8 bgPalLoadState;
- /*0x0004*/ u8 var_4;
- /*0x0005*/ bool8 isLink;
- /*0x0006*/ u8 var_6;
- /*0x0007*/ u8 var_7;
- /*0x0008*/ u8 var_8;
- /*0x0009*/ bool8 allowDMACopy;
- /*0x000A*/ bool8 hasPokedex;
- /*0x000B*/ bool8 hasHofResult;
- /*0x000C*/ bool8 hasLinkResults;
- /*0x000D*/ bool8 hasBattleTowerWins;
- /*0x000E*/ u8 var_E;
- /*0x000F*/ u8 var_F;
- /*0x0010*/ bool8 hasTrades;
- /*0x0011*/ bool8 hasBadge[BADGE_COUNT];
- /*0x0019*/ u8 var_19[4][13];
- /*0x004D*/ u8 strings[TRAINER_CARD_STRING_COUNT][70];
- /*0x0395*/ u8 var_395;
- /*0x0396*/ u16 monIconPals[0x30];
- /*0x03F6*/ u8 var_3DB[0x60];
- /*0x0456*/ s8 var_456;
- /*0x0457*/ u8 cardType;
- /*0x0458*/ void (*callback2)(void);
- /*0x045C*/ struct TrainerCard trainerCard;
- /*0x04BC*/ u16 var_4BC;
- /*0x04BE*/ u8 var_4BE[0x4AE];
- /*0x096C*/ u16 var_96C[0x258];
- /*0x0E1C*/ u16 var_E1C;
- /*0x0E1E*/ u8 unk_E1E[0x4AE];
- /*0x12CC*/ u16 cardTiles[0x200];
- /*0x16CC*/ u16 bgTiles[0x100];
- /*0x18CC*/ u16 var_18CC[0x1180];
- /*0x3BCC*/ u16 bgTilemap0[0x1000];
- /*0x5BCC*/ u16 bgTilemap2[0x1000];
- /*0x7BCC*/ u16 var_7BCC;
- /*0x7BCE*/ bool8 var_7BCE;
- /*0x7BCF*/ u8 language;
+ u8 mainState;
+ u8 printState;
+ u8 gfxLoadState;
+ u8 bgPalLoadState;
+ u8 flipDrawState;
+ bool8 isLink;
+ u8 timeColonBlinkTimer;
+ bool8 timeColonInvisible;
+ bool8 onBack;
+ bool8 allowDMACopy;
+ bool8 hasPokedex;
+ bool8 hasHofResult;
+ bool8 hasLinkResults;
+ bool8 hasBattleTowerWins;
+ bool8 var_E;
+ bool8 var_F;
+ bool8 hasTrades;
+ bool8 hasBadge[NUM_BADGES];
+ u8 easyChatProfile[TRAINER_CARD_PROFILE_LENGTH][13];
+ u8 strings[TRAINER_CARD_STRING_COUNT][70];
+ u8 var_395;
+ u16 monIconPals[16 * PARTY_SIZE];
+ s8 flipBlendY;
+ u8 cardType;
+ void (*callback2)(void);
+ struct TrainerCard trainerCard;
+ u16 frontTilemap[600];
+ u16 backTilemap[600];
+ u16 bgTilemap[600];
+ u8 badgeTiles[0x80 * NUM_BADGES];
+ u16 stickerTiles[0x100];
+ u16 cardTiles[0x1180];
+ u16 cardTilemapBuffer[0x1000];
+ u16 bgTilemapBuffer[0x1000];
+ u16 var_7BCC;
+ bool8 timeColonNeedDraw;
+ u8 language;
}; /* size = 0x7BD0 */
// RAM
@@ -126,84 +113,84 @@ static void TrainerCardNull(void);
static void sub_8089C5C(void);
static void sub_8089C80(void);
static void sub_8089CA4(void);
-static void ResetTrainerCard(void);
+static void InitBgsAndWindows(void);
static void SetTrainerCardCB2(void);
-static void sub_8089DA4(void);
-static bool8 PrintAllOnCardPage1(void);
-static bool8 PrintStringsOnCardPage2(void);
-static void sub_8089ECC(void);
-static void PrintNameOnCard(void);
+static void SetUpTrainerCardTask(void);
+static bool8 PrintAllOnCardFront(void);
+static bool8 PrintAllOnCardBack(void);
+static void BufferTextForCardBack(void);
+static void PrintNameOnCardFront(void);
static void PrintIdOnCard(void);
static void PrintMoneyOnCard(void);
static u16 GetCaughtMonsCount(void);
static void PrintPokedexOnCard(void);
static void PrintTimeOnCard(void);
static void PrintProfilePhraseOnCard(void);
-static void PrintNameOnCard2(void);
-static void sub_808A4FC(void);
-static void PrintHofTimeOnCard(void);
-static void PrintHofDebutStringOnCard(void);
-static void PrintLinkResultsNumsOnCard(void);
-static void PrintWinsLossesStringOnCard(void);
-static void PrintTradesNumOnCard(void);
+static void BufferNameForCardBack(void);
+static void PrintNameOnCardBack(void);
+static void BufferHofDebutTime(void);
+static void PrintHofDebutTimeOnCard(void);
+static void BufferLinkBattleResults(void);
+static void PrintLinkBattleResultsOnCard(void);
+static void BufferNumTrades(void);
static void PrintTradesStringOnCard(void);
-static void PrintBerryCrushNumOnCard(void);
+static void BufferBerryCrushPoints(void);
static void PrintBerryCrushStringOnCard(void);
-static void PrintUnionNumOnCard(void);
+static void BufferUnionRoomStats(void);
static void PrintUnionStringOnCard(void);
-static void TrainerCard_PrintPokemonIconsOnCard(void);
-static void sub_808AB10(void);
-static void sub_808ABE0(void);
-static void TrainerCardLoadStickerPals(void);
-static void PutTrainerCardWindow(u8 windowId);
+static void PrintPokemonIconsOnCard(void);
+static void LoadMonIconGfx(void);
+static void PrintStickersOnCard(void);
+static void LoadStickerGfx(void);
+static void DrawTrainerCardWindow(u8 windowId);
static bool8 SetTrainerCardBgsAndPals(void);
-static void LoadTrainerCardTilemap2(const u16* ptr);
-static void LoadTrainerCardTilemap0(const u16* ptr);
-static void TrainerCard_PrintStarsAndBadgesOnCard(void);
-static void sub_808B090(void);
-static void sub_808B180(void);
-static void sub_808B1D4(void);
-static bool8 sub_808B1FC(void);
-static void sub_808B21C(u8 taskId);
-static bool8 sub_808B254(struct Task* task);
-static bool8 sub_808B294(struct Task* task);
-static bool8 sub_808B3C4(struct Task* task);
-static bool8 sub_808B4D8(struct Task* task);
-static bool8 sub_808B540(struct Task* task);
-static bool8 sub_808B66C(struct Task *task);
-static void sub_808B774(void);
+static void DrawCardScreenBackground(const u16* ptr);
+static void DrawCardFrontOrBack(const u16* ptr);
+static void DrawStarsAndBadgesOnCard(void);
+static void DrawCardBackStats(void);
+static void BlinkTimeColon(void);
+static void FlipTrainerCard(void);
+static bool8 IsCardFlipTaskActive(void);
+static void Task_DoCardFlipTask(u8 taskId);
+static bool8 Task_BeginCardFlip(struct Task* task);
+static bool8 Task_AnimateCardFlipDown(struct Task* task);
+static bool8 Task_DrawFlippedCardSide(struct Task* task);
+static bool8 Task_SetCardFlipped(struct Task* task);
+static bool8 Task_AnimateCardFlipUp(struct Task* task);
+static bool8 Task_EndCardFlip(struct Task *task);
+static void InitTrainerCardData(void);
static u8 GetCardType(void);
-static void sub_808B838(void);
+static void CreateTrainerCardTrainerPic(void);
// Data
-static const u32 sTrainerCardStickers[] = INCBIN_U32("graphics/trainer_card/stickers.4bpp.lz");
-static const u32 sUnknown_83CC4DC[] = INCBIN_U32("graphics/trainer_card/unk_83CC4DC.bin");
-static const u32 sUnknown_83CC6F0[] = INCBIN_U32("graphics/trainer_card/unk_83CC6F0.bin");
-static const u32 sUnknown_83CC8A8[] = INCBIN_U32("graphics/trainer_card/unk_83CC8A8.bin");
-static const u32 sUnknown_83CC984[] = INCBIN_U32("graphics/trainer_card/unk_83CC984.bin");
-static const u32 sUnknown_83CCAB0[] = INCBIN_U32("graphics/trainer_card/unk_83CCAB0.bin");
-static const u32 sUnknown_83CCCA4[] = INCBIN_U32("graphics/trainer_card/unk_83CCCA4.bin");
-static const u32 sUnknown_83CCE30[] = INCBIN_U32("graphics/trainer_card/unk_83CCE30.bin");
-static const u32 sUnknown_83CCEC8[] = INCBIN_U32("graphics/trainer_card/unk_83CCEC8.bin");
-static const u16 sEmeraldTrainerCard1Stars_Pals[] = INCBIN_U16("graphics/trainer_card/em_1stars_pals.gbapal");
-static const u16 sFireRedTrainerCard1Stars_Pals[] = INCBIN_U16("graphics/trainer_card/fr_1stars_pals.gbapal");
-static const u16 sEmeraldTrainerCard2Stars_Pals[] = INCBIN_U16("graphics/trainer_card/em_2stars_pals.gbapal");
-static const u16 sFireRedTrainerCard2Stars_Pals[] = INCBIN_U16("graphics/trainer_card/fr_2stars_pals.gbapal");
-static const u16 sEmeraldTrainerCard3Stars_Pals[] = INCBIN_U16("graphics/trainer_card/em_3stars_pals.gbapal");
-static const u16 sFireRedTrainerCard3Stars_Pals[] = INCBIN_U16("graphics/trainer_card/fr_3stars_pals.gbapal");
-static const u16 sEmeraldTrainerCard4Stars_Pals[] = INCBIN_U16("graphics/trainer_card/em_4stars_pals.gbapal");
-static const u16 sFireRedTrainerCard4Stars_Pals[] = INCBIN_U16("graphics/trainer_card/fr_4stars_pals.gbapal");
-static const u16 sEmeraldTrainerCardFemaleBackground_Pal[] = INCBIN_U16("graphics/trainer_card/em_female_bg.gbapal");
-static const u16 sFireRedTrainerCardFemaleBackground_Pal[] = INCBIN_U16("graphics/trainer_card/fr_female_bg.gbapal");
-static const u16 sEmeraldTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/em_badges.gbapal");
-static const u16 sFireRedTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/fr_badges.gbapal");
-static const u16 sUnknown_83CD300[] = INCBIN_U16("graphics/trainer_card/unk_83CD300.gbapal");
+static const u32 sTrainerCardStickers_Gfx[] = INCBIN_U32("graphics/trainer_card/stickers.4bpp.lz");
+static const u32 sHoennTrainerCardFront_Tilemap[] = INCBIN_U32("graphics/trainer_card/front_hoenn.bin");
+static const u32 sKantoTrainerCardFront_Tilemap[] = INCBIN_U32("graphics/trainer_card/front.bin");
+static const u32 sHoennTrainerCardBack_Tilemap[] = INCBIN_U32("graphics/trainer_card/back_hoenn.bin");
+static const u32 sKantoTrainerCardBack_Tilemap[] = INCBIN_U32("graphics/trainer_card/back.bin");
+static const u32 sHoennTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_card/front_hoenn_link.bin");
+static const u32 sKantoTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_card/front_link.bin");
+static const u32 sHoennTrainerCardBg_Tilemap[] = INCBIN_U32("graphics/trainer_card/bg_hoenn.bin");
+static const u32 sKantoTrainerCardBg_Tilemap[] = INCBIN_U32("graphics/trainer_card/bg.bin");
+static const u16 sHoennTrainerCard1Stars_Pals[] = INCBIN_U16("graphics/trainer_card/em_1stars_pals.gbapal");
+static const u16 sKantoTrainerCard1Stars_Pals[] = INCBIN_U16("graphics/trainer_card/fr_1stars_pals.gbapal");
+static const u16 sHoennTrainerCard2Stars_Pals[] = INCBIN_U16("graphics/trainer_card/em_2stars_pals.gbapal");
+static const u16 sKantoTrainerCard2Stars_Pals[] = INCBIN_U16("graphics/trainer_card/fr_2stars_pals.gbapal");
+static const u16 sHoennTrainerCard3Stars_Pals[] = INCBIN_U16("graphics/trainer_card/em_3stars_pals.gbapal");
+static const u16 sKantoTrainerCard3Stars_Pals[] = INCBIN_U16("graphics/trainer_card/fr_3stars_pals.gbapal");
+static const u16 sHoennTrainerCard4Stars_Pals[] = INCBIN_U16("graphics/trainer_card/em_4stars_pals.gbapal");
+static const u16 sKantoTrainerCard4Stars_Pals[] = INCBIN_U16("graphics/trainer_card/fr_4stars_pals.gbapal");
+static const u16 sHoennTrainerCardFemaleBackground_Pal[] = INCBIN_U16("graphics/trainer_card/em_female_bg.gbapal");
+static const u16 sKantoTrainerCardFemaleBackground_Pal[] = INCBIN_U16("graphics/trainer_card/fr_female_bg.gbapal");
+static const u16 sHoennTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/em_badges.gbapal");
+static const u16 sKantoTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/fr_badges.gbapal");
+static const u16 sTrainerCardGold_Pal[] = INCBIN_U16("graphics/trainer_card/gold.gbapal");
static const u16 sTrainerCardStickerPal1[] = INCBIN_U16("graphics/trainer_card/sticker1.gbapal");
static const u16 sTrainerCardStickerPal2[] = INCBIN_U16("graphics/trainer_card/sticker2.gbapal");
static const u16 sTrainerCardStickerPal3[] = INCBIN_U16("graphics/trainer_card/sticker3.gbapal");
static const u16 sTrainerCardStickerPal4[] = INCBIN_U16("graphics/trainer_card/sticker4.gbapal");
-static const u32 sEmeraldTrainerCardBadges_Tile[] = INCBIN_U32("graphics/trainer_card/em_badges.4bpp.lz");
-static const u32 sFireRedTrainerCardBadges_Tile[] = INCBIN_U32("graphics/trainer_card/badges.4bpp.lz");
+static const u32 sHoennTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/em_badges.4bpp.lz");
+static const u32 sKantoTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/badges.4bpp.lz");
static const struct BgTemplate sTrainerCardBgTemplates[4] =
{
@@ -277,150 +264,190 @@ static const struct WindowTemplate sTrainerCardWindowTemplates[4] =
DUMMY_WIN_TEMPLATE
};
-static const u16 *const sEmeraldTrainerCardStarPals[] =
+static const u16 *const sHoennTrainerCardStarPals[] =
{
- gEmeraldTrainerCard_Pal,
- sEmeraldTrainerCard1Stars_Pals,
- sEmeraldTrainerCard2Stars_Pals,
- sEmeraldTrainerCard3Stars_Pals,
- sEmeraldTrainerCard4Stars_Pals
+ gHoennTrainerCard_Pal,
+ sHoennTrainerCard1Stars_Pals,
+ sHoennTrainerCard2Stars_Pals,
+ sHoennTrainerCard3Stars_Pals,
+ sHoennTrainerCard4Stars_Pals
};
-static const u16 *const sFireRedTrainerCardStarPals[] =
+static const u16 *const sKantoTrainerCardStarPals[] =
{
- gFireRedTrainerCard_Pal,
- sFireRedTrainerCard1Stars_Pals,
- sFireRedTrainerCard2Stars_Pals,
- sFireRedTrainerCard3Stars_Pals,
- sFireRedTrainerCard4Stars_Pals
+ gKantoTrainerCard_Pal,
+ sKantoTrainerCard1Stars_Pals,
+ sKantoTrainerCard2Stars_Pals,
+ sKantoTrainerCard3Stars_Pals,
+ sKantoTrainerCard4Stars_Pals
};
-static const u8 sFireRedTrainerCardPage1TextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY};
-static const u8 sTrainerCardPage2TextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED};
-static const u8 sEmeraldTrainerCardPage1TextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_TRANSPARENT};
+static const u8 sTrainerCardTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY};
+static const u8 sTrainerCardStatColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED};
+static const u8 sTimeColonInvisibleTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_TRANSPARENT};
static const u8 sTrainerCardFontIds[] = {0, 2, 0};
-static const u8 sTrainerCardPicPositions[][2][2] =
+static const u8 sTrainerPicOffsets[2][GENDER_COUNT][2] =
{
- {{13, 4}, {13, 4}},
- {{1, 0}, {1, 0}}
+ // Kanto
+ {
+ [MALE] = {13, 4},
+ [FEMALE] = {13, 4}
+ },
+ // Hoenn
+ {
+ [MALE] = {1, 0},
+ [FEMALE] = {1, 0}
+ }
};
-static const u8 sLinkTrainerCardFrontPics[][2] =
+static const u8 sTrainerPicFacilityClasses[][2] =
{
- {TRAINER_PIC_RS_MAY_2, TRAINER_PIC_RED},
- {TRAINER_PIC_PROFESSOR_OAK, TRAINER_PIC_RS_BRENDAN_2},
+ [CARD_TYPE_FRLG] =
+ {
+ [MALE] = FACILITY_CLASS_RED,
+ [FEMALE] = FACILITY_CLASS_LEAF
+ },
+ [CARD_TYPE_RSE] =
+ {
+ [MALE] = FACILITY_CLASS_BRENDAN,
+ [FEMALE] = FACILITY_CLASS_MAY
+ },
};
-static const u8 sLinkTrainerCardFacilityClasses[][8] =
+static const u8 sLinkTrainerPicFacilityClasses[GENDER_COUNT][NUM_LINK_TRAINER_CARD_CLASSES] =
{
- {0x74, 0x6F, 0x5C, 0x58, 0x6A, 0x59, 0x6D, 0x6C},
- {0x75, 0x7D, 0x5D, 0x5A, 0x16, 0x30, 0x41, 0x68}
+ [MALE] =
+ {
+ FACILITY_CLASS_COOLTRAINER_3,
+ FACILITY_CLASS_BLACK_BELT_2,
+ FACILITY_CLASS_CAMPER_2,
+ FACILITY_CLASS_YOUNGSTER_2,
+ FACILITY_CLASS_PSYCHIC_3,
+ FACILITY_CLASS_BUG_CATCHER_2,
+ FACILITY_CLASS_TAMER,
+ FACILITY_CLASS_JUGGLER
+ },
+ [FEMALE] =
+ {
+ FACILITY_CLASS_COOLTRAINER_4,
+ FACILITY_CLASS_CHANNELER,
+ FACILITY_CLASS_PICNICKER_2,
+ FACILITY_CLASS_LASS_2,
+ FACILITY_CLASS_PSYCHIC_2,
+ FACILITY_CLASS_BATTLE_GIRL,
+ FACILITY_CLASS_PKMN_BREEDER_2,
+ FACILITY_CLASS_BEAUTY_2
+ }
};
-static bool8 (*const sTrainerCardTasks[])(struct Task *) =
+static bool8 (*const sTrainerCardFlipTasks[])(struct Task *) =
{
- sub_808B254,
- sub_808B294,
- sub_808B3C4,
- sub_808B4D8,
- sub_808B540,
- sub_808B66C
+ Task_BeginCardFlip,
+ Task_AnimateCardFlipDown,
+ Task_DrawFlippedCardSide,
+ Task_SetCardFlipped,
+ Task_AnimateCardFlipUp,
+ Task_EndCardFlip
};
-static const u8 sTrainerCardPlayerNameXPositions[] = {0x14, 0x10};
-static const u8 sTrainerCardPlayerNameYPositions[] = {0x1D, 0x21};
+static const u8 sTrainerCardFrontNameXPositions[] = {0x14, 0x10};
+static const u8 sTrainerCardFrontNameYPositions[] = {0x1D, 0x21};
static const u8 sTrainerCardIdXPositions[] = {0x8E, 0x80};
static const u8 sTrainerCardIdYPositions[] = {0xA, 0x9};
-static const u8 *const sTrainerCardTextColors[] = {sFireRedTrainerCardPage1TextColors, sEmeraldTrainerCardPage1TextColors};
+static const u8 *const sTimeColonTextColors[] = {sTrainerCardTextColors, sTimeColonInvisibleTextColors};
static const u8 sTrainerCardTimeHoursXPositions[] = {0x65, 0x55};
static const u8 sTrainerCardTimeHoursYPositions[] = {0x77, 0x67};
static const u8 sTrainerCardTimeMinutesXPositions[] = {0x7C, 0x6C};
static const u8 sTrainerCardTimeMinutesYPositions[] = {0x58, 0x59};
static const u8 sTrainerCardProfilePhraseXPositions[] = {0x73, 0x69};
static const u8 sTrainerCardProfilePhraseYPositions[] = {0x82, 0x78};
-static const u8 sUnknown_83CD93C[] = {0x8A, 0xD8};
-static const u8 sUnknown_83CD93E[] = {0xB, 0xA};
+static const u8 sTrainerCardBackNameXPositions[] = {0x8A, 0xD8};
+static const u8 sTrainerCardBackNameYPositions[] = {0xB, 0xA};
static const u8 sTrainerCardHofDebutXPositions[] = {0xA, 0x10, 0x0, 0x0};
static const u8 *const sLinkTrainerCardRecordStrings[] = {gText_LinkBattles, gText_LinkCableBattles};
-static const u8 sUnknown_83CD94C[] = {5, 6, 7, 8, 9, 10};
-static const u8 sUnknown_83CD952[] = {0, 4, 8, 12, 16, 20};
-static const u8 sUnknown_83CD958[] = {11, 12, 13, 14};
-static const u8 sUnknown_83CD95C[] = {7, 6, 0, 0};
+static const u8 sPokemonIconPalSlots[] = {5, 6, 7, 8, 9, 10};
+static const u8 sPokemonIconXOffsets[] = {0, 4, 8, 12, 16, 20};
+static const u8 sStickerPalSlots[] = {11, 12, 13, 14};
+static const u8 sStarYOffsets[] = {7, 6, 0, 0};
static const struct TrainerCard sLinkPlayerTrainerCardTemplate1 =
{
- .gender = MALE,
- .stars = 4,
- .hasPokedex = TRUE,
- .caughtAllHoenn = TRUE,
- .hasAllPaintings = TRUE,
- .hofDebutHours = 999,
- .hofDebutMinutes = 59,
- .hofDebutSeconds = 59,
- .caughtMonsCount = 200,
- .trainerId = 0x6072,
- .playTimeHours = 999,
- .playTimeMinutes = 59,
- .linkBattleWins = 5535,
- .linkBattleLosses = 5535,
- .battleTowerWins = 5535,
- .battleTowerStraightWins = 5535,
- .contestsWithFriends = 55555,
- .pokeblocksWithFriends = 44444,
- .pokemonTrades = 33333,
- .money = 999999,
- .var_28 = {0, 0, 0, 0},
- .playerName = _("あかみ どりお"),
+ .rse = {
+ .gender = MALE,
+ .stars = 4,
+ .hasPokedex = TRUE,
+ .caughtAllHoenn = TRUE,
+ .hasAllPaintings = TRUE,
+ .hofDebutHours = 999,
+ .hofDebutMinutes = 59,
+ .hofDebutSeconds = 59,
+ .caughtMonsCount = 200,
+ .trainerId = 0x6072,
+ .playTimeHours = 999,
+ .playTimeMinutes = 59,
+ .linkBattleWins = 5535,
+ .linkBattleLosses = 5535,
+ .battleTowerWins = 5535,
+ .battleTowerStraightWins = 5535,
+ .contestsWithFriends = 55555,
+ .pokeblocksWithFriends = 44444,
+ .pokemonTrades = 33333,
+ .money = 999999,
+ .easyChatProfile = {0, 0, 0, 0},
+ .playerName = _("あかみ どりお")
+ },
.version = VERSION_FIRE_RED,
- .var_3A = 0,
+ .hasAllFrontierSymbols = FALSE,
.berryCrushPoints = 5555,
.unionRoomNum = 8500,
.berriesPicked = 5456,
.jumpsInRow = 6300,
- .var_4C = TRUE,
+ .shouldDrawStickers = TRUE,
.hasAllMons = TRUE,
- .var_4E = 2,
- .var_4F = 0,
- .var_50 = {1, 2, 3, 0},
+ .monIconTint = MON_ICON_TINT_PINK,
+ .facilityClass = 0,
+ .stickers = {1, 2, 3},
.monSpecies = {SPECIES_CHARIZARD, SPECIES_DIGLETT, SPECIES_NIDORINA, SPECIES_FEAROW, SPECIES_PARAS, SPECIES_SLOWBRO}
};
static const struct TrainerCard sLinkPlayerTrainerCardTemplate2 =
{
- .gender = FEMALE,
- .stars = 2,
- .hasPokedex = TRUE,
- .caughtAllHoenn = TRUE,
- .hasAllPaintings = TRUE,
- .hofDebutHours = 999,
- .hofDebutMinutes = 59,
- .hofDebutSeconds = 59,
- .caughtMonsCount = 200,
- .trainerId = 0x6072,
- .playTimeHours = 999,
- .playTimeMinutes = 59,
- .linkBattleWins = 5535,
- .linkBattleLosses = 5535,
- .battleTowerWins = 65535,
- .battleTowerStraightWins = 65535,
- .contestsWithFriends = 55555,
- .pokeblocksWithFriends = 44444,
- .pokemonTrades = 33333,
- .money = 999999,
- .var_28 = {0, 0, 0, 0},
- .playerName = _("るびさふぁこ!"),
+ .rse = {
+ .gender = FEMALE,
+ .stars = 2,
+ .hasPokedex = TRUE,
+ .caughtAllHoenn = TRUE,
+ .hasAllPaintings = TRUE,
+ .hofDebutHours = 999,
+ .hofDebutMinutes = 59,
+ .hofDebutSeconds = 59,
+ .caughtMonsCount = 200,
+ .trainerId = 0x6072,
+ .playTimeHours = 999,
+ .playTimeMinutes = 59,
+ .linkBattleWins = 5535,
+ .linkBattleLosses = 5535,
+ .battleTowerWins = 65535,
+ .battleTowerStraightWins = 65535,
+ .contestsWithFriends = 55555,
+ .pokeblocksWithFriends = 44444,
+ .pokemonTrades = 33333,
+ .money = 999999,
+ .easyChatProfile = {0, 0, 0, 0},
+ .playerName = _("るびさふぁこ!")
+ },
.version = 0,
- .var_3A = 0,
+ .hasAllFrontierSymbols = FALSE,
.berryCrushPoints = 555,
.unionRoomNum = 500,
.berriesPicked = 456,
.jumpsInRow = 300,
- .var_4C = TRUE,
+ .shouldDrawStickers = TRUE,
.hasAllMons = TRUE,
- .var_4E = 2,
- .var_4F = 0,
- .var_50 = {1, 2, 3, 0},
+ .monIconTint = MON_ICON_TINT_PINK,
+ .facilityClass = 0,
+ .stickers = {1, 2, 3},
.monSpecies = {SPECIES_CHARIZARD, SPECIES_DIGLETT, SPECIES_NIDORINA, SPECIES_FEAROW, SPECIES_PARAS, SPECIES_SLOWBRO}
};
@@ -430,7 +457,7 @@ static void VBlankCB_TrainerCard(void)
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
- sub_808B180();
+ BlinkTimeColon();
if (sTrainerCardDataPtr->allowDMACopy)
DmaCopy16(3, &gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 0x140);
}
@@ -463,43 +490,54 @@ static void CloseTrainerCard(u8 taskId)
DestroyTask(taskId);
}
+// States for Task_TrainerCard. Skips the initial states, which are done once in order
+#define STATE_HANDLE_INPUT_FRONT 10
+#define STATE_HANDLE_INPUT_BACK 11
+#define STATE_WAIT_FLIP_TO_BACK 12
+#define STATE_WAIT_FLIP_TO_FRONT 13
+#define STATE_CLOSE_CARD 14
+#define STATE_WAIT_LINK_PARTNER 15
+#define STATE_CLOSE_CARD_LINK 16
+
static void Task_TrainerCard(u8 taskId)
{
- switch (sTrainerCardDataPtr->taskState)
+ switch (sTrainerCardDataPtr->mainState)
{
+ // Draw card initially
case 0:
if (!IsDma3ManagerBusyWithBgCopy())
{
FillWindowPixelBuffer(1, PIXEL_FILL(0));
- sTrainerCardDataPtr->taskState++;
+ sTrainerCardDataPtr->mainState++;
}
break;
case 1:
- if (PrintAllOnCardPage1())
- sTrainerCardDataPtr->taskState++;
+ if (PrintAllOnCardFront())
+ sTrainerCardDataPtr->mainState++;
break;
case 2:
- PutTrainerCardWindow(1);
- sTrainerCardDataPtr->taskState++;
+ DrawTrainerCardWindow(1);
+ sTrainerCardDataPtr->mainState++;
break;
case 3:
FillWindowPixelBuffer(2, PIXEL_FILL(0));
- sub_808B838();
- PutTrainerCardWindow(2);
- sTrainerCardDataPtr->taskState++;
+ CreateTrainerCardTrainerPic();
+ DrawTrainerCardWindow(2);
+ sTrainerCardDataPtr->mainState++;
break;
case 4:
- LoadTrainerCardTilemap2(&sTrainerCardDataPtr->var_E1C);
- sTrainerCardDataPtr->taskState++;
+ DrawCardScreenBackground(sTrainerCardDataPtr->bgTilemap);
+ sTrainerCardDataPtr->mainState++;
break;
case 5:
- LoadTrainerCardTilemap0(&sTrainerCardDataPtr->var_4BC);
- sTrainerCardDataPtr->taskState++;
+ DrawCardFrontOrBack(sTrainerCardDataPtr->frontTilemap);
+ sTrainerCardDataPtr->mainState++;
break;
case 6:
- TrainerCard_PrintStarsAndBadgesOnCard();
- sTrainerCardDataPtr->taskState++;
+ DrawStarsAndBadgesOnCard();
+ sTrainerCardDataPtr->mainState++;
break;
+ // Fade in
case 7:
if (gWirelessCommType == 1 && gReceivedRemoteLinkPlayers == TRUE)
{
@@ -508,71 +546,72 @@ static void Task_TrainerCard(u8 taskId)
}
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
SetVBlankCallback(VBlankCB_TrainerCard);
- sTrainerCardDataPtr->taskState++;
+ sTrainerCardDataPtr->mainState++;
break;
case 8:
if (!UpdatePaletteFade() && !IsDma3ManagerBusyWithBgCopy())
{
PlaySE(SE_CARD3);
- sTrainerCardDataPtr->taskState = 10;
+ sTrainerCardDataPtr->mainState = STATE_HANDLE_INPUT_FRONT;
}
break;
case 9:
if (!IsSEPlaying())
- sTrainerCardDataPtr->taskState++;
+ sTrainerCardDataPtr->mainState++;
break;
- case 10:
- if (!gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->var_7BCE)
+ case STATE_HANDLE_INPUT_FRONT:
+ // Blink the : in play time
+ if (!gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->timeColonNeedDraw)
{
PrintTimeOnCard();
- PutTrainerCardWindow(1);
- sTrainerCardDataPtr->var_7BCE = FALSE;
+ DrawTrainerCardWindow(1);
+ sTrainerCardDataPtr->timeColonNeedDraw = FALSE;
}
if (JOY_NEW(A_BUTTON))
{
- HelpSystem_SetSomeVariable2(11);
- sub_808B1D4();
+ SetHelpContext(HELPCONTEXT_TRAINER_CARD_BACK);
+ FlipTrainerCard();
PlaySE(SE_CARD1);
- sTrainerCardDataPtr->taskState = 12;
+ sTrainerCardDataPtr->mainState = STATE_WAIT_FLIP_TO_BACK;
}
else if (JOY_NEW(B_BUTTON))
{
if (gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->isLink && InUnionRoom() == TRUE)
{
- sTrainerCardDataPtr->taskState = 15;
+ sTrainerCardDataPtr->mainState = STATE_WAIT_LINK_PARTNER;
}
else
{
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
- sTrainerCardDataPtr->taskState = 14;
+ sTrainerCardDataPtr->mainState = STATE_CLOSE_CARD;
}
}
break;
- case 12:
- if (sub_808B1FC() && sub_8058244() != TRUE)
+ case STATE_WAIT_FLIP_TO_BACK:
+ if (IsCardFlipTaskActive() && sub_8058244() != TRUE)
{
PlaySE(SE_CARD3);
- sTrainerCardDataPtr->taskState = 11;
+ sTrainerCardDataPtr->mainState = STATE_HANDLE_INPUT_BACK;
}
break;
- case 11:
+ case STATE_HANDLE_INPUT_BACK:
if (JOY_NEW(B_BUTTON))
{
if (gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->isLink && InUnionRoom() == TRUE)
{
- sTrainerCardDataPtr->taskState = 15;
+ sTrainerCardDataPtr->mainState = STATE_WAIT_LINK_PARTNER;
}
else if (gReceivedRemoteLinkPlayers)
{
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
- sTrainerCardDataPtr->taskState = 14;
+ sTrainerCardDataPtr->mainState = STATE_CLOSE_CARD;
}
else
{
- HelpSystem_SetSomeVariable2(10);
- sub_808B1D4();
- sTrainerCardDataPtr->taskState = 13;
+ SetHelpContext(HELPCONTEXT_TRAINER_CARD_FRONT);
+ FlipTrainerCard();
+ sTrainerCardDataPtr->mainState = STATE_WAIT_FLIP_TO_FRONT;
PlaySE(SE_CARD1);
}
}
@@ -580,37 +619,37 @@ static void Task_TrainerCard(u8 taskId)
{
if (gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->isLink && InUnionRoom() == TRUE)
{
- sTrainerCardDataPtr->taskState = 15;
+ sTrainerCardDataPtr->mainState = STATE_WAIT_LINK_PARTNER;
}
else
{
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
- sTrainerCardDataPtr->taskState = 14;
+ sTrainerCardDataPtr->mainState = STATE_CLOSE_CARD;
}
}
break;
- case 15:
- sub_800AAC0();
+ case STATE_WAIT_LINK_PARTNER:
+ Link_TryStartSend5FFF();
DrawDialogueFrame(0, 1);
AddTextPrinterParameterized(0, 2, gText_WaitingTrainerFinishReading, 0, 1, TEXT_SPEED_FF, 0);
CopyWindowToVram(0, 3);
- sTrainerCardDataPtr->taskState = 16;
+ sTrainerCardDataPtr->mainState = STATE_CLOSE_CARD_LINK;
break;
- case 16:
+ case STATE_CLOSE_CARD_LINK:
if (!gReceivedRemoteLinkPlayers)
{
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
- sTrainerCardDataPtr->taskState = 14;
+ sTrainerCardDataPtr->mainState = STATE_CLOSE_CARD;
}
break;
- case 14:
+ case STATE_CLOSE_CARD:
if (!UpdatePaletteFade())
CloseTrainerCard(taskId);
break;
- case 13:
- if (sub_808B1FC() && sub_8058244() != TRUE)
+ case STATE_WAIT_FLIP_TO_FRONT:
+ if (IsCardFlipTaskActive() && sub_8058244() != TRUE)
{
- sTrainerCardDataPtr->taskState = 10;
+ sTrainerCardDataPtr->mainState = STATE_HANDLE_INPUT_FRONT;
PlaySE(SE_CARD3);
}
break;
@@ -622,45 +661,46 @@ static bool8 LoadCardGfx(void)
switch (sTrainerCardDataPtr->gfxLoadState)
{
case 0:
- if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD)
- LZ77UnCompWram(sUnknown_83CCE30, &sTrainerCardDataPtr->var_E1C);
+ if (sTrainerCardDataPtr->cardType == CARD_TYPE_RSE)
+ LZ77UnCompWram(sHoennTrainerCardBg_Tilemap, sTrainerCardDataPtr->bgTilemap);
else
- LZ77UnCompWram(sUnknown_83CCEC8, &sTrainerCardDataPtr->var_E1C);
+ LZ77UnCompWram(sKantoTrainerCardBg_Tilemap, sTrainerCardDataPtr->bgTilemap);
break;
case 1:
- if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD)
- LZ77UnCompWram(sUnknown_83CC8A8, &sTrainerCardDataPtr->var_96C);
+ if (sTrainerCardDataPtr->cardType == CARD_TYPE_RSE)
+ LZ77UnCompWram(sHoennTrainerCardBack_Tilemap, sTrainerCardDataPtr->backTilemap);
else
- LZ77UnCompWram(sUnknown_83CC984, &sTrainerCardDataPtr->var_96C);
+ LZ77UnCompWram(sKantoTrainerCardBack_Tilemap, sTrainerCardDataPtr->backTilemap);
break;
case 2:
if (!sTrainerCardDataPtr->isLink)
{
- if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD)
- LZ77UnCompWram(sUnknown_83CC4DC, &sTrainerCardDataPtr->var_4BC);
+ if (sTrainerCardDataPtr->cardType == CARD_TYPE_RSE)
+ LZ77UnCompWram(sHoennTrainerCardFront_Tilemap, sTrainerCardDataPtr->frontTilemap);
else
- LZ77UnCompWram(sUnknown_83CC6F0, &sTrainerCardDataPtr->var_4BC);
+ LZ77UnCompWram(sKantoTrainerCardFront_Tilemap, sTrainerCardDataPtr->frontTilemap);
}
else
{
- if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD)
- LZ77UnCompWram(sUnknown_83CCAB0, &sTrainerCardDataPtr->var_4BC);
+ if (sTrainerCardDataPtr->cardType == CARD_TYPE_RSE)
+ LZ77UnCompWram(sHoennTrainerCardFrontLink_Tilemap, sTrainerCardDataPtr->frontTilemap);
else
- LZ77UnCompWram(sUnknown_83CCCA4, &sTrainerCardDataPtr->var_4BC);
+ LZ77UnCompWram(sKantoTrainerCardFrontLink_Tilemap, sTrainerCardDataPtr->frontTilemap);
}
break;
case 3:
- LZ77UnCompWram(sFireRedTrainerCardBadges_Tile, &sTrainerCardDataPtr->cardTiles);
+ // ? Doesnt check for RSE, sHoennTrainerCardBadges_Gfx goes unused
+ LZ77UnCompWram(sKantoTrainerCardBadges_Gfx, sTrainerCardDataPtr->badgeTiles);
break;
case 4:
- if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD)
- LZ77UnCompWram(gEmeraldTrainerCard_Gfx, &sTrainerCardDataPtr->var_18CC);
+ if (sTrainerCardDataPtr->cardType == CARD_TYPE_RSE)
+ LZ77UnCompWram(gHoennTrainerCard_Gfx, &sTrainerCardDataPtr->cardTiles);
else
- LZ77UnCompWram(gFireRedTrainerCard_Gfx, &sTrainerCardDataPtr->var_18CC);
+ LZ77UnCompWram(gKantoTrainerCard_Gfx, &sTrainerCardDataPtr->cardTiles);
break;
case 5:
if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG)
- LZ77UnCompWram(sTrainerCardStickers, &sTrainerCardDataPtr->bgTiles);
+ LZ77UnCompWram(sTrainerCardStickers_Gfx, sTrainerCardDataPtr->stickerTiles);
break;
default:
sTrainerCardDataPtr->gfxLoadState = 0;
@@ -676,7 +716,7 @@ static void CB2_InitTrainerCard(void)
{
case 0:
ResetGpuRegs();
- sub_8089DA4();
+ SetUpTrainerCardTask();
gMain.state++;
break;
case 1:
@@ -696,7 +736,7 @@ static void CB2_InitTrainerCard(void)
gMain.state++;
break;
case 5:
- ResetTrainerCard();
+ InitBgsAndWindows();
gMain.state++;
break;
case 6:
@@ -704,7 +744,7 @@ static void CB2_InitTrainerCard(void)
gMain.state++;
break;
case 7:
- sub_808AB10();
+ LoadMonIconGfx();
gMain.state++;
break;
case 8:
@@ -712,7 +752,7 @@ static void CB2_InitTrainerCard(void)
gMain.state++;
break;
case 9:
- TrainerCardLoadStickerPals();
+ LoadStickerGfx();
gMain.state++;
break;
case 10:
@@ -720,7 +760,7 @@ static void CB2_InitTrainerCard(void)
gMain.state++;
break;
case 11:
- sub_8089ECC();
+ BufferTextForCardBack();
gMain.state++;
break;
case 12:
@@ -746,16 +786,16 @@ static u8 GetTrainerStarCount(struct TrainerCard *trainerCard)
{
u8 stars = 0;
- if (trainerCard->hofDebutHours != 0 || trainerCard->hofDebutMinutes != 0 || trainerCard->hofDebutSeconds != 0)
+ if (trainerCard->rse.hofDebutHours != 0 || trainerCard->rse.hofDebutMinutes != 0 || trainerCard->rse.hofDebutSeconds != 0)
stars++;
- if (trainerCard->caughtAllHoenn)
+ if (trainerCard->rse.caughtAllHoenn)
stars++;
- if (trainerCard->battleTowerStraightWins > 49)
+ if (trainerCard->rse.battleTowerStraightWins > 49)
stars++;
- if (trainerCard->hasAllPaintings)
+ if (trainerCard->rse.hasAllPaintings)
stars++;
return stars;
@@ -766,63 +806,63 @@ static void SetPlayerCardData(struct TrainerCard *trainerCard, u8 cardType)
u32 playTime;
u8 i;
- trainerCard->gender = gSaveBlock2Ptr->playerGender;
- trainerCard->playTimeHours = gSaveBlock2Ptr->playTimeHours;
- trainerCard->playTimeMinutes = gSaveBlock2Ptr->playTimeMinutes;
+ trainerCard->rse.gender = gSaveBlock2Ptr->playerGender;
+ trainerCard->rse.playTimeHours = gSaveBlock2Ptr->playTimeHours;
+ trainerCard->rse.playTimeMinutes = gSaveBlock2Ptr->playTimeMinutes;
playTime = GetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME);
if (!GetGameStat(GAME_STAT_ENTERED_HOF))
playTime = 0;
- trainerCard->hofDebutHours = playTime >> 16;
- trainerCard->hofDebutMinutes = (playTime >> 8) & 0xFF;
- trainerCard->hofDebutSeconds = playTime & 0xFF;
+ trainerCard->rse.hofDebutHours = playTime >> 16;
+ trainerCard->rse.hofDebutMinutes = (playTime >> 8) & 0xFF;
+ trainerCard->rse.hofDebutSeconds = playTime & 0xFF;
if ((playTime >> 16) > 999)
{
- trainerCard->hofDebutHours = 999;
- trainerCard->hofDebutMinutes = 59;
- trainerCard->hofDebutSeconds = 59;
+ trainerCard->rse.hofDebutHours = 999;
+ trainerCard->rse.hofDebutMinutes = 59;
+ trainerCard->rse.hofDebutSeconds = 59;
}
- trainerCard->hasPokedex = FlagGet(FLAG_SYS_POKEDEX_GET);
- trainerCard->caughtAllHoenn = HasAllHoennMons();
- trainerCard->caughtMonsCount = GetCaughtMonsCount();
+ trainerCard->rse.hasPokedex = FlagGet(FLAG_SYS_POKEDEX_GET);
+ trainerCard->rse.caughtAllHoenn = HasAllHoennMons();
+ trainerCard->rse.caughtMonsCount = GetCaughtMonsCount();
- trainerCard->trainerId = (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0];
+ trainerCard->rse.trainerId = (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0];
- trainerCard->linkBattleWins = GetCappedGameStat(GAME_STAT_LINK_BATTLE_WINS, 9999);
- trainerCard->linkBattleLosses = GetCappedGameStat(GAME_STAT_LINK_BATTLE_LOSSES, 9999);
- trainerCard->pokemonTrades = GetCappedGameStat(GAME_STAT_POKEMON_TRADES, 0xFFFF);
+ trainerCard->rse.linkBattleWins = GetCappedGameStat(GAME_STAT_LINK_BATTLE_WINS, 9999);
+ trainerCard->rse.linkBattleLosses = GetCappedGameStat(GAME_STAT_LINK_BATTLE_LOSSES, 9999);
+ trainerCard->rse.pokemonTrades = GetCappedGameStat(GAME_STAT_POKEMON_TRADES, 0xFFFF);
- trainerCard->battleTowerWins = 0;
- trainerCard->battleTowerStraightWins = 0;
- trainerCard->contestsWithFriends = 0;
- trainerCard->pokeblocksWithFriends = 0;
+ trainerCard->rse.battleTowerWins = 0;
+ trainerCard->rse.battleTowerStraightWins = 0;
+ trainerCard->rse.contestsWithFriends = 0;
+ trainerCard->rse.pokeblocksWithFriends = 0;
- trainerCard->hasAllPaintings = FALSE;
+ trainerCard->rse.hasAllPaintings = FALSE;
- trainerCard->money = GetMoney(&gSaveBlock1Ptr->money);
+ trainerCard->rse.money = GetMoney(&gSaveBlock1Ptr->money);
- for (i = 0; i < 4; i++)
- trainerCard->var_28[i] = gSaveBlock1Ptr->easyChatProfile[i];
+ for (i = 0; i < TRAINER_CARD_PROFILE_LENGTH; i++)
+ trainerCard->rse.easyChatProfile[i] = gSaveBlock1Ptr->easyChatProfile[i];
- StringCopy(trainerCard->playerName, gSaveBlock2Ptr->playerName);
+ StringCopy(trainerCard->rse.playerName, gSaveBlock2Ptr->playerName);
if (cardType == CARD_TYPE_FRLG)
{
- trainerCard->stars = GetTrainerStarCount(trainerCard);
+ trainerCard->rse.stars = GetTrainerStarCount(trainerCard);
}
- else if (cardType == CARD_TYPE_EMERALD)
+ else if (cardType == CARD_TYPE_RSE)
{
- trainerCard->stars = 0;
- if (trainerCard->hofDebutHours != 0 || (trainerCard->hofDebutMinutes != 0 || trainerCard->hofDebutSeconds != 0))
- trainerCard->stars = cardType;
+ trainerCard->rse.stars = 0;
+ if (trainerCard->rse.hofDebutHours != 0 || (trainerCard->rse.hofDebutMinutes != 0 || trainerCard->rse.hofDebutSeconds != 0))
+ trainerCard->rse.stars = cardType;
if (HasAllKantoMons())
- trainerCard->stars++;
+ trainerCard->rse.stars++;
if (HasAllMons())
- trainerCard->stars++;
+ trainerCard->rse.stars++;
}
}
@@ -831,43 +871,43 @@ void TrainerCard_GenerateCardForLinkPlayer(struct TrainerCard *trainerCard)
u8 id = 0;
trainerCard->version = GAME_VERSION;
- SetPlayerCardData(trainerCard, CARD_TYPE_EMERALD);
+ SetPlayerCardData(trainerCard, CARD_TYPE_RSE);
if (GetCardType() != CARD_TYPE_FRLG)
return;
- trainerCard->stars = id;
- if (trainerCard->hofDebutHours != 0 || trainerCard->hofDebutMinutes != 0 || trainerCard->hofDebutSeconds != 0)
- trainerCard->stars = 1;
+ trainerCard->rse.stars = id;
+ if (trainerCard->rse.hofDebutHours != 0 || trainerCard->rse.hofDebutMinutes != 0 || trainerCard->rse.hofDebutSeconds != 0)
+ trainerCard->rse.stars = 1;
- trainerCard->caughtAllHoenn = HasAllKantoMons();
+ trainerCard->rse.caughtAllHoenn = HasAllKantoMons();
trainerCard->hasAllMons = HasAllMons();
trainerCard->berriesPicked = gSaveBlock2Ptr->berryPick.berriesPicked;
trainerCard->jumpsInRow = gSaveBlock2Ptr->pokeJump.jumpsInRow;
trainerCard->berryCrushPoints = GetCappedGameStat(GAME_STAT_BERRY_CRUSH_POINTS, 0xFFFF);
trainerCard->unionRoomNum = GetCappedGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES, 0xFFFF);
- trainerCard->var_4C = TRUE;
+ trainerCard->shouldDrawStickers = TRUE;
- if (trainerCard->caughtAllHoenn)
- trainerCard->stars++;
+ if (trainerCard->rse.caughtAllHoenn)
+ trainerCard->rse.stars++;
if (trainerCard->hasAllMons)
- trainerCard->stars++;
+ trainerCard->rse.stars++;
if (trainerCard->berriesPicked >= 200 && trainerCard->jumpsInRow >= 200)
- trainerCard->stars++;
+ trainerCard->rse.stars++;
- id = ((u16)trainerCard->trainerId) % 8;
- if (trainerCard->gender == FEMALE)
- trainerCard->var_4F = sLinkTrainerCardFacilityClasses[1][id];
+ id = ((u16)trainerCard->rse.trainerId) % NUM_LINK_TRAINER_CARD_CLASSES;
+ if (trainerCard->rse.gender == FEMALE)
+ trainerCard->facilityClass = sLinkTrainerPicFacilityClasses[FEMALE][id];
else
- trainerCard->var_4F = sLinkTrainerCardFacilityClasses[0][id];
+ trainerCard->facilityClass = sLinkTrainerPicFacilityClasses[MALE][id];
- trainerCard->var_50[0] = VarGet(VAR_HOF_BRAG_STATE);
- trainerCard->var_50[1] = VarGet(VAR_EGG_BRAG_STATE);
- trainerCard->var_50[2] = VarGet(VAR_LINK_WIN_BRAG_STATE);
+ trainerCard->stickers[0] = VarGet(VAR_HOF_BRAG_STATE);
+ trainerCard->stickers[1] = VarGet(VAR_EGG_BRAG_STATE);
+ trainerCard->stickers[2] = VarGet(VAR_LINK_WIN_BRAG_STATE);
- trainerCard->var_4E = VarGet(VAR_TRAINER_CARD_MON_ICON_TINT_IDX);
+ trainerCard->monIconTint = VarGet(VAR_TRAINER_CARD_MON_ICON_TINT_IDX);
trainerCard->monSpecies[0] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_1));
trainerCard->monSpecies[1] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_2));
@@ -890,19 +930,19 @@ static void SetDataFromTrainerCard(void)
sTrainerCardDataPtr->var_F = FALSE;
sTrainerCardDataPtr->hasTrades = FALSE;
- memset(&sTrainerCardDataPtr->hasBadge, FALSE, BADGE_COUNT);
- if (sTrainerCardDataPtr->trainerCard.hasPokedex)
+ memset(sTrainerCardDataPtr->hasBadge, FALSE, sizeof(sTrainerCardDataPtr->hasBadge));
+ if (sTrainerCardDataPtr->trainerCard.rse.hasPokedex)
sTrainerCardDataPtr->hasPokedex++;
- if (sTrainerCardDataPtr->trainerCard.hofDebutHours != 0
- || sTrainerCardDataPtr->trainerCard.hofDebutMinutes != 0
- || sTrainerCardDataPtr->trainerCard.hofDebutSeconds != 0)
+ if (sTrainerCardDataPtr->trainerCard.rse.hofDebutHours != 0
+ || sTrainerCardDataPtr->trainerCard.rse.hofDebutMinutes != 0
+ || sTrainerCardDataPtr->trainerCard.rse.hofDebutSeconds != 0)
sTrainerCardDataPtr->hasHofResult++;
- if (sTrainerCardDataPtr->trainerCard.linkBattleWins != 0 || sTrainerCardDataPtr->trainerCard.linkBattleLosses != 0)
+ if (sTrainerCardDataPtr->trainerCard.rse.linkBattleWins != 0 || sTrainerCardDataPtr->trainerCard.rse.linkBattleLosses != 0)
sTrainerCardDataPtr->hasLinkResults++;
- if (sTrainerCardDataPtr->trainerCard.pokemonTrades != 0)
+ if (sTrainerCardDataPtr->trainerCard.rse.pokemonTrades != 0)
sTrainerCardDataPtr->hasTrades++;
for (i = 0, badgeFlag = FLAG_BADGE01_GET; badgeFlag <= FLAG_BADGE08_GET; badgeFlag++, i++)
@@ -931,6 +971,7 @@ static void HandleGpuRegs(void)
EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK);
}
+// Part of animating card flip
static void sub_8089BD8(u16 arg0)
{
s8 quotient = (arg0 + 40) / 10;
@@ -938,8 +979,8 @@ static void sub_8089BD8(u16 arg0)
if (quotient <= 4)
quotient = 0;
- sTrainerCardDataPtr->var_456 = quotient;
- SetGpuReg(REG_OFFSET_BLDY, sTrainerCardDataPtr->var_456);
+ sTrainerCardDataPtr->flipBlendY = quotient;
+ SetGpuReg(REG_OFFSET_BLDY, sTrainerCardDataPtr->flipBlendY);
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(sTrainerCardDataPtr->var_7BCC, 160 - sTrainerCardDataPtr->var_7BCC));
}
@@ -980,7 +1021,7 @@ static void sub_8089CA4(void)
SetGpuReg(REG_OFFSET_BG3VOFS, DISPCNT_MODE_0);
}
-static void ResetTrainerCard(void)
+static void InitBgsAndWindows(void)
{
ResetSpriteData();
ResetPaletteFade();
@@ -1001,24 +1042,24 @@ static void ResetTrainerCard(void)
static void SetTrainerCardCB2(void)
{
SetMainCallback2(CB2_TrainerCard);
- HelpSystem_SetSomeVariable2(10);
+ SetHelpContext(HELPCONTEXT_TRAINER_CARD_FRONT);
}
-static void sub_8089DA4(void)
+static void SetUpTrainerCardTask(void)
{
ResetTasks();
ScanlineEffect_Stop();
CreateTask(Task_TrainerCard, 0);
- sub_808B774();
+ InitTrainerCardData();
SetDataFromTrainerCard();
}
-static bool8 PrintAllOnCardPage1(void)
+static bool8 PrintAllOnCardFront(void)
{
switch (sTrainerCardDataPtr->printState)
{
case 0:
- PrintNameOnCard();
+ PrintNameOnCardFront();
break;
case 1:
PrintIdOnCard();
@@ -1043,18 +1084,18 @@ static bool8 PrintAllOnCardPage1(void)
return FALSE;
}
-static bool8 PrintStringsOnCardPage2(void)
+static bool8 PrintAllOnCardBack(void)
{
switch (sTrainerCardDataPtr->printState)
{
case 0:
- sub_808A4FC();
+ PrintNameOnCardBack();
break;
case 1:
- PrintHofDebutStringOnCard();
+ PrintHofDebutTimeOnCard();
break;
case 2:
- PrintWinsLossesStringOnCard();
+ PrintLinkBattleResultsOnCard();
break;
case 3:
PrintTradesStringOnCard();
@@ -1066,10 +1107,10 @@ static bool8 PrintStringsOnCardPage2(void)
PrintUnionStringOnCard();
break;
case 6:
- TrainerCard_PrintPokemonIconsOnCard();
+ PrintPokemonIconsOnCard();
break;
case 7:
- sub_808ABE0();
+ PrintStickersOnCard();
break;
default:
sTrainerCardDataPtr->printState = 0;
@@ -1079,27 +1120,27 @@ static bool8 PrintStringsOnCardPage2(void)
return FALSE;
}
-static void sub_8089ECC(void)
+static void BufferTextForCardBack(void)
{
- PrintNameOnCard2();
- PrintHofTimeOnCard();
- PrintLinkResultsNumsOnCard();
- PrintTradesNumOnCard();
- PrintBerryCrushNumOnCard();
- PrintUnionNumOnCard();
+ BufferNameForCardBack();
+ BufferHofDebutTime();
+ BufferLinkBattleResults();
+ BufferNumTrades();
+ BufferBerryCrushPoints();
+ BufferUnionRoomStats();
}
-static void PrintNameOnCard(void)
+static void PrintNameOnCardFront(void)
{
u8 buffer[2][32];
u8* txtPtr;
txtPtr = StringCopy(buffer[0], gText_TrainerCardName);
txtPtr = buffer[1];
- StringCopy(txtPtr, sTrainerCardDataPtr->trainerCard.playerName);
+ StringCopy(txtPtr, sTrainerCardDataPtr->trainerCard.rse.playerName);
ConvertInternationalString(txtPtr, sTrainerCardDataPtr->language);
StringAppend(buffer[0], txtPtr);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardPlayerNameXPositions[sTrainerCardDataPtr->cardType], sTrainerCardPlayerNameYPositions[sTrainerCardDataPtr->cardType], sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, buffer[0]);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardFrontNameXPositions[sTrainerCardDataPtr->cardType], sTrainerCardFrontNameYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SPEED_FF, buffer[0]);
}
static void PrintIdOnCard(void)
@@ -1108,8 +1149,8 @@ static void PrintIdOnCard(void)
u8* txtPtr;
txtPtr = StringCopy(buffer, gText_TrainerCardIDNo);
- ConvertIntToDecimalStringN(txtPtr, sTrainerCardDataPtr->trainerCard.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardIdXPositions[sTrainerCardDataPtr->cardType], sTrainerCardIdYPositions[sTrainerCardDataPtr->cardType], sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, buffer);
+ ConvertIntToDecimalStringN(txtPtr, sTrainerCardDataPtr->trainerCard.rse.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardIdXPositions[sTrainerCardDataPtr->cardType], sTrainerCardIdYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SPEED_FF, buffer);
}
static void PrintMoneyOnCard(void)
@@ -1119,18 +1160,18 @@ static void PrintMoneyOnCard(void)
u8 x;
txtPtr = StringCopy(buffer, gText_TrainerCardYen);
- ConvertIntToDecimalStringN(txtPtr, sTrainerCardDataPtr->trainerCard.money, STR_CONV_MODE_LEFT_ALIGN, 6);
- if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD)
+ ConvertIntToDecimalStringN(txtPtr, sTrainerCardDataPtr->trainerCard.rse.money, STR_CONV_MODE_LEFT_ALIGN, 6);
+ if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE)
{
x = -122 - 6 * StringLength(buffer);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 20, 56, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_TrainerCardMoney);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 56, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, buffer);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 20, 56, sTrainerCardTextColors, TEXT_SPEED_FF, gText_TrainerCardMoney);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 56, sTrainerCardTextColors, TEXT_SPEED_FF, buffer);
}
else
{
x = 118 - 6 * StringLength(buffer);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 16, 57, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_TrainerCardMoney);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 57, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, buffer);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 16, 57, sTrainerCardTextColors, TEXT_SPEED_FF, gText_TrainerCardMoney);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 57, sTrainerCardTextColors, TEXT_SPEED_FF, buffer);
}
}
@@ -1149,20 +1190,20 @@ static void PrintPokedexOnCard(void)
if (FlagGet(FLAG_SYS_POKEDEX_GET))
{
- ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.caughtMonsCount, 0, 3);
- if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD)
+ ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.caughtMonsCount, 0, 3);
+ if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE)
{
x = -120 - 6 * StringLength(buffer);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 20, 72, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_TrainerCardPokedex);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 72, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, buffer);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 138, 72, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_TrainerCardNull);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 20, 72, sTrainerCardTextColors, TEXT_SPEED_FF, gText_TrainerCardPokedex);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 72, sTrainerCardTextColors, TEXT_SPEED_FF, buffer);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 138, 72, sTrainerCardTextColors, TEXT_SPEED_FF, gText_TrainerCardNull);
}
else
{
x = 120 - 6 * StringLength(buffer);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 16, 73, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_TrainerCardPokedex);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 73, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, buffer);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 138, 73, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_TrainerCardNull);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 16, 73, sTrainerCardTextColors, TEXT_SPEED_FF, gText_TrainerCardPokedex);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 73, sTrainerCardTextColors, TEXT_SPEED_FF, buffer);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 138, 73, sTrainerCardTextColors, TEXT_SPEED_FF, gText_TrainerCardNull);
}
}
}
@@ -1177,8 +1218,8 @@ static void PrintTimeOnCard(void)
minutes = gSaveBlock2Ptr->playTimeMinutes;
if (sTrainerCardDataPtr->isLink)
{
- hours = sTrainerCardDataPtr->trainerCard.playTimeHours;
- minutes = sTrainerCardDataPtr->trainerCard.playTimeMinutes;
+ hours = sTrainerCardDataPtr->trainerCard.rse.playTimeHours;
+ minutes = sTrainerCardDataPtr->trainerCard.rse.playTimeMinutes;
}
if (hours > 999)
@@ -1188,19 +1229,19 @@ static void PrintTimeOnCard(void)
minutes = 59;
FillWindowPixelRect(1, PIXEL_FILL(0), sTrainerCardTimeHoursXPositions[sTrainerCardDataPtr->cardType], sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], 50, 12);
- if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD)
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 20, 88, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_TrainerCardTime);
+ if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE)
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 20, 88, sTrainerCardTextColors, TEXT_SPEED_FF, gText_TrainerCardTime);
else
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 16, 89, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_TrainerCardTime);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 16, 89, sTrainerCardTextColors, TEXT_SPEED_FF, gText_TrainerCardTime);
ConvertIntToDecimalStringN(buffer, hours, STR_CONV_MODE_RIGHT_ALIGN, 3);
AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardTimeHoursXPositions[sTrainerCardDataPtr->cardType],
- sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, buffer);
+ sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SPEED_FF, buffer);
AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardTimeHoursYPositions[sTrainerCardDataPtr->cardType],
- sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors[sTrainerCardDataPtr->var_7], TEXT_SPEED_FF, gText_Colon2);
+ sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], sTimeColonTextColors[sTrainerCardDataPtr->timeColonInvisible], TEXT_SPEED_FF, gText_Colon2);
ConvertIntToDecimalStringN(buffer, minutes, STR_CONV_MODE_LEADING_ZEROS, 2);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardTimeMinutesXPositions[sTrainerCardDataPtr->cardType], sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, buffer);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardTimeMinutesXPositions[sTrainerCardDataPtr->cardType], sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SPEED_FF, buffer);
}
static void PrintProfilePhraseOnCard(void)
@@ -1208,75 +1249,75 @@ static void PrintProfilePhraseOnCard(void)
if (sTrainerCardDataPtr->isLink)
{
AddTextPrinterParameterized3(1, 2, 10, sTrainerCardProfilePhraseXPositions[sTrainerCardDataPtr->cardType],
- sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_19[0]);
+ sTrainerCardTextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->easyChatProfile[0]);
- AddTextPrinterParameterized3(1, 2, GetStringWidth(2, sTrainerCardDataPtr->var_19[0], 0) + 16, sTrainerCardProfilePhraseXPositions[sTrainerCardDataPtr->cardType],
- sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_19[1]);
+ AddTextPrinterParameterized3(1, 2, GetStringWidth(2, sTrainerCardDataPtr->easyChatProfile[0], 0) + 16, sTrainerCardProfilePhraseXPositions[sTrainerCardDataPtr->cardType],
+ sTrainerCardTextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->easyChatProfile[1]);
AddTextPrinterParameterized3(1, 2, 10, sTrainerCardProfilePhraseYPositions[sTrainerCardDataPtr->cardType],
- sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_19[2]);
+ sTrainerCardTextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->easyChatProfile[2]);
- AddTextPrinterParameterized3(1, 2, GetStringWidth(2, sTrainerCardDataPtr->var_19[2], 0) + 16, sTrainerCardProfilePhraseYPositions[sTrainerCardDataPtr->cardType],
- sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_19[3]);
+ AddTextPrinterParameterized3(1, 2, GetStringWidth(2, sTrainerCardDataPtr->easyChatProfile[2], 0) + 16, sTrainerCardProfilePhraseYPositions[sTrainerCardDataPtr->cardType],
+ sTrainerCardTextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->easyChatProfile[3]);
}
}
-static void PrintNameOnCard2(void)
+static void BufferNameForCardBack(void)
{
- StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME], sTrainerCardDataPtr->trainerCard.playerName);
+ StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME], sTrainerCardDataPtr->trainerCard.rse.playerName);
ConvertInternationalString(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME], sTrainerCardDataPtr->language);
- if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD)
+ if (sTrainerCardDataPtr->cardType == CARD_TYPE_RSE)
{
StringAppend(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME], gText_Var1sTrainerCard);
}
}
-static void sub_808A4FC(void)
+static void PrintNameOnCardBack(void)
{
u8 x;
if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG)
{
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sUnknown_83CD93C[sTrainerCardDataPtr->cardType],
- sUnknown_83CD93E[sTrainerCardDataPtr->cardType], sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME]);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardBackNameXPositions[sTrainerCardDataPtr->cardType],
+ sTrainerCardBackNameYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME]);
}
else
{
- x = sUnknown_83CD93C[sTrainerCardDataPtr->cardType] - GetStringWidth(sTrainerCardFontIds[1], sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME], GetFontAttribute(sTrainerCardFontIds[1], FONTATTR_LETTER_SPACING));
+ x = sTrainerCardBackNameXPositions[sTrainerCardDataPtr->cardType] - GetStringWidth(sTrainerCardFontIds[1], sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME], GetFontAttribute(sTrainerCardFontIds[1], FONTATTR_LETTER_SPACING));
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, sUnknown_83CD93E[sTrainerCardDataPtr->cardType],
- sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME]);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, sTrainerCardBackNameYPositions[sTrainerCardDataPtr->cardType],
+ sTrainerCardTextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_NAME]);
}
}
-static void PrintHofTimeOnCard(void)
+static void BufferHofDebutTime(void)
{
u8 buffer[10];
u8* txtPtr;
if (sTrainerCardDataPtr->hasHofResult)
{
- ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.hofDebutHours, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.hofDebutHours, STR_CONV_MODE_RIGHT_ALIGN, 3);
txtPtr = StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME], buffer);
StringAppendN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME], gText_Colon2, 2);
- ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.hofDebutMinutes, STR_CONV_MODE_LEADING_ZEROS, 2);
+ ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.hofDebutMinutes, STR_CONV_MODE_LEADING_ZEROS, 2);
StringAppendN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME], buffer, 3);
StringAppendN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME], gText_Colon2, 2);
- ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.hofDebutSeconds, STR_CONV_MODE_LEADING_ZEROS, 2);
+ ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.hofDebutSeconds, STR_CONV_MODE_LEADING_ZEROS, 2);
StringAppendN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME], buffer, 3);
}
}
-static void PrintHofDebutStringOnCard(void)
+static void PrintHofDebutTimeOnCard(void)
{
if (sTrainerCardDataPtr->hasHofResult)
{
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 35, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_HallOfFameDebut);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 164, 35, sTrainerCardPage2TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME]);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 35, sTrainerCardTextColors, TEXT_SPEED_FF, gText_HallOfFameDebut);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 164, 35, sTrainerCardStatColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_HOF_TIME]);
}
}
-static void PrintLinkResultsNumsOnCard(void)
+static void BufferLinkBattleResults(void)
{
u8 buffer[30];
@@ -1284,31 +1325,31 @@ static void PrintLinkResultsNumsOnCard(void)
{
StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_RECORD], sLinkTrainerCardRecordStrings[sTrainerCardDataPtr->cardType]);
StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_WIN_LOSS], gText_WinLossRatio);
- ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.linkBattleWins, STR_CONV_MODE_RIGHT_ALIGN, 4);
+ ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.linkBattleWins, STR_CONV_MODE_RIGHT_ALIGN, 4);
StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_WINS], buffer);
- ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.linkBattleLosses, STR_CONV_MODE_RIGHT_ALIGN, 4);
+ ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.rse.linkBattleLosses, STR_CONV_MODE_RIGHT_ALIGN, 4);
StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_LOSSES], buffer);
}
}
-static void PrintWinsLossesStringOnCard(void)
+static void PrintLinkBattleResultsOnCard(void)
{
if (sTrainerCardDataPtr->hasLinkResults)
{
AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 51,
- sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_RECORD]);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 130, 51, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_WIN_LOSS]);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 144, 51, sTrainerCardPage2TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_WINS]);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 192, 51, sTrainerCardPage2TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_LOSSES]);
+ sTrainerCardTextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_RECORD]);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 130, 51, sTrainerCardTextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_WIN_LOSS]);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 144, 51, sTrainerCardStatColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_WINS]);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 192, 51, sTrainerCardStatColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_LINK_LOSSES]);
}
}
-static void PrintTradesNumOnCard(void)
+static void BufferNumTrades(void)
{
if (sTrainerCardDataPtr->hasTrades)
{
StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_TRADES], gText_PokemonTrades);
- ConvertIntToDecimalStringN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_TRADE_COUNT], sTrainerCardDataPtr->trainerCard.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5);
+ ConvertIntToDecimalStringN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_TRADE_COUNT], sTrainerCardDataPtr->trainerCard.rse.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5);
}
}
@@ -1316,14 +1357,14 @@ static void PrintTradesStringOnCard(void)
{
if (sTrainerCardDataPtr->hasTrades)
{
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 67, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_TRADES]);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 186, 67, sTrainerCardPage2TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_TRADE_COUNT]);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 67, sTrainerCardTextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_TRADES]);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 186, 67, sTrainerCardStatColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_TRADE_COUNT]);
}
}
-static void PrintBerryCrushNumOnCard(void)
+static void BufferBerryCrushPoints(void)
{
- if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD)
+ if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE)
{
StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_BERRY_CRUSH], gText_BerryCrushes);
ConvertIntToDecimalStringN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_BERRY_CRUSH_COUNT], sTrainerCardDataPtr->trainerCard.berryCrushPoints, STR_CONV_MODE_RIGHT_ALIGN, 5);
@@ -1332,16 +1373,16 @@ static void PrintBerryCrushNumOnCard(void)
static void PrintBerryCrushStringOnCard(void)
{
- if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD && sTrainerCardDataPtr->trainerCard.berryCrushPoints)
+ if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE && sTrainerCardDataPtr->trainerCard.berryCrushPoints)
{
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 99, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_BERRY_CRUSH]);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 186, 99, sTrainerCardPage2TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_BERRY_CRUSH_COUNT]);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 99, sTrainerCardTextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_BERRY_CRUSH]);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 186, 99, sTrainerCardStatColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_BERRY_CRUSH_COUNT]);
}
}
-static void PrintUnionNumOnCard(void)
+static void BufferUnionRoomStats(void)
{
- if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD)
+ if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE)
{
StringCopy(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_UNION_ROOM], gText_UnionRoomTradesBattles);
ConvertIntToDecimalStringN(sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_UNION_ROOM_NUM], sTrainerCardDataPtr->trainerCard.unionRoomNum, STR_CONV_MODE_RIGHT_ALIGN, 5);
@@ -1350,88 +1391,88 @@ static void PrintUnionNumOnCard(void)
static void PrintUnionStringOnCard(void)
{
- if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD && sTrainerCardDataPtr->trainerCard.unionRoomNum)
+ if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE && sTrainerCardDataPtr->trainerCard.unionRoomNum)
{
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 83, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_UNION_ROOM]);
- AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 186, 83, sTrainerCardPage2TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_UNION_ROOM_NUM]);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 83, sTrainerCardTextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_UNION_ROOM]);
+ AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 186, 83, sTrainerCardStatColors, TEXT_SPEED_FF, sTrainerCardDataPtr->strings[TRAINER_CARD_STRING_UNION_ROOM_NUM]);
}
}
-static void TrainerCard_PrintPokemonIconsOnCard(void)
+static void PrintPokemonIconsOnCard(void)
{
u8 i;
- u8 buffer[6];
- u8 buffer2[6];
+ u8 paletteSlots[PARTY_SIZE];
+ u8 xOffsets[PARTY_SIZE];
- memcpy(buffer, sUnknown_83CD94C, sizeof(sUnknown_83CD94C));
- memcpy(buffer2, sUnknown_83CD952, sizeof(sUnknown_83CD952));
- if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD)
+ memcpy(paletteSlots, sPokemonIconPalSlots, sizeof(sPokemonIconPalSlots));
+ memcpy(xOffsets, sPokemonIconXOffsets, sizeof(sPokemonIconXOffsets));
+ if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE)
{
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
if (sTrainerCardDataPtr->trainerCard.monSpecies[i])
{
u8 monSpecies = GetMonIconPaletteIndexFromSpecies(sTrainerCardDataPtr->trainerCard.monSpecies[i]);
- WriteSequenceToBgTilemapBuffer(3, 16 * i + 224, buffer2[i] + 3, 15, 4, 4, buffer[monSpecies], 1);
+ WriteSequenceToBgTilemapBuffer(3, 16 * i + 224, xOffsets[i] + 3, 15, 4, 4, paletteSlots[monSpecies], 1);
}
}
}
}
-static void sub_808AB10(void)
+static void LoadMonIconGfx(void)
{
u8 i;
- CpuSet(gMonIconPalettes, sTrainerCardDataPtr->monIconPals, 32 * 3);
- switch (sTrainerCardDataPtr->trainerCard.var_4E)
+ CpuSet(gMonIconPalettes, sTrainerCardDataPtr->monIconPals, NELEMS(sTrainerCardDataPtr->monIconPals));
+ switch (sTrainerCardDataPtr->trainerCard.monIconTint)
{
- case 0:
+ case MON_ICON_TINT_NORMAL:
break;
- case 1:
+ case MON_ICON_TINT_BLACK:
TintPalette_CustomTone(sTrainerCardDataPtr->monIconPals, 96, 0, 0, 0);
break;
- case 2:
+ case MON_ICON_TINT_PINK:
TintPalette_CustomTone(sTrainerCardDataPtr->monIconPals, 96, 500, 330, 310);
break;
- case 3:
+ case MON_ICON_TINT_SEPIA:
TintPalette_SepiaTone(sTrainerCardDataPtr->monIconPals, 96);
break;
}
LoadPalette(sTrainerCardDataPtr->monIconPals, 80, 192);
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
LoadBgTiles(3, GetMonIconTiles(sTrainerCardDataPtr->trainerCard.monSpecies[i], 0), 512, 16 * i + 32);
}
}
-static void sub_808ABE0(void)
+static void PrintStickersOnCard(void)
{
u8 i;
- u8 buffer[4];
+ u8 palSlots[4];
- memcpy(buffer, sUnknown_83CD958, sizeof(sUnknown_83CD958));
- if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG && sTrainerCardDataPtr->trainerCard.var_4C == 1)
+ memcpy(palSlots, sStickerPalSlots, sizeof(sStickerPalSlots));
+ if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG && sTrainerCardDataPtr->trainerCard.shouldDrawStickers == TRUE)
{
- for (i = 0; i < 3; i++)
+ for (i = 0; i < TRAINER_CARD_STICKER_TYPES; i++)
{
- u8 var_50 = sTrainerCardDataPtr->trainerCard.var_50[i];
- if (sTrainerCardDataPtr->trainerCard.var_50[i])
- WriteSequenceToBgTilemapBuffer(3, i * 4 + 320, i * 3 + 2, 2, 2, 2, buffer[var_50 - 1], 1);
+ u8 sticker = sTrainerCardDataPtr->trainerCard.stickers[i];
+ if (sTrainerCardDataPtr->trainerCard.stickers[i])
+ WriteSequenceToBgTilemapBuffer(3, i * 4 + 320, i * 3 + 2, 2, 2, 2, palSlots[sticker - 1], 1);
}
}
}
-static void TrainerCardLoadStickerPals(void)
+static void LoadStickerGfx(void)
{
LoadPalette(sTrainerCardStickerPal1, 176, 32);
LoadPalette(sTrainerCardStickerPal2, 192, 32);
LoadPalette(sTrainerCardStickerPal3, 208, 32);
LoadPalette(sTrainerCardStickerPal4, 224, 32);
- LoadBgTiles(3, sTrainerCardDataPtr->bgTiles, 1024, 128);
+ LoadBgTiles(3, sTrainerCardDataPtr->stickerTiles, 1024, 128);
}
-static void PutTrainerCardWindow(u8 windowId)
+static void DrawTrainerCardWindow(u8 windowId)
{
PutWindowTilemap(windowId);
CopyWindowToVram(windowId, 3);
@@ -1442,35 +1483,35 @@ static bool8 SetTrainerCardBgsAndPals(void)
switch (sTrainerCardDataPtr->bgPalLoadState)
{
case 0:
- LoadBgTiles(3, sTrainerCardDataPtr->cardTiles, 1024, 0);
+ LoadBgTiles(3, sTrainerCardDataPtr->badgeTiles, ARRAY_COUNT(sTrainerCardDataPtr->badgeTiles), 0);
break;
case 1:
- LoadBgTiles(0, sTrainerCardDataPtr->var_18CC, 6144, 0);
+ LoadBgTiles(0, sTrainerCardDataPtr->cardTiles, 0x1800, 0);
break;
case 2:
- if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD)
- LoadPalette(sEmeraldTrainerCardStarPals[sTrainerCardDataPtr->trainerCard.stars], 0, 96);
+ if (sTrainerCardDataPtr->cardType == CARD_TYPE_RSE)
+ LoadPalette(sHoennTrainerCardStarPals[sTrainerCardDataPtr->trainerCard.rse.stars], 0, 96);
else
- LoadPalette(sFireRedTrainerCardStarPals[sTrainerCardDataPtr->trainerCard.stars], 0, 96);
+ LoadPalette(sKantoTrainerCardStarPals[sTrainerCardDataPtr->trainerCard.rse.stars], 0, 96);
break;
case 3:
- if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD)
- LoadPalette(sEmeraldTrainerCardBadges_Pal, 48, 32);
+ if (sTrainerCardDataPtr->cardType == CARD_TYPE_RSE)
+ LoadPalette(sHoennTrainerCardBadges_Pal, 48, 32);
else
- LoadPalette(sFireRedTrainerCardBadges_Pal, 48, 32);
+ LoadPalette(sKantoTrainerCardBadges_Pal, 48, 32);
break;
case 4:
- if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD && sTrainerCardDataPtr->trainerCard.gender != MALE)
- LoadPalette(sEmeraldTrainerCardFemaleBackground_Pal, 16, 32);
- else if (sTrainerCardDataPtr->trainerCard.gender != MALE)
- LoadPalette(sFireRedTrainerCardFemaleBackground_Pal, 16, 32);
+ if (sTrainerCardDataPtr->cardType == CARD_TYPE_RSE && sTrainerCardDataPtr->trainerCard.rse.gender != MALE)
+ LoadPalette(sHoennTrainerCardFemaleBackground_Pal, 16, 32);
+ else if (sTrainerCardDataPtr->trainerCard.rse.gender != MALE)
+ LoadPalette(sKantoTrainerCardFemaleBackground_Pal, 16, 32);
break;
case 5:
- LoadPalette(sUnknown_83CD300, 64, 32);
+ LoadPalette(sTrainerCardGold_Pal, 64, 32);
break;
case 6:
- SetBgTilemapBuffer(0, sTrainerCardDataPtr->bgTilemap0);
- SetBgTilemapBuffer(2, sTrainerCardDataPtr->bgTilemap2);
+ SetBgTilemapBuffer(0, sTrainerCardDataPtr->cardTilemapBuffer);
+ SetBgTilemapBuffer(2, sTrainerCardDataPtr->bgTilemapBuffer);
break;
default:
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);
@@ -1483,10 +1524,10 @@ static bool8 SetTrainerCardBgsAndPals(void)
return FALSE;
}
-static void LoadTrainerCardTilemap2(const u16* ptr)
+static void DrawCardScreenBackground(const u16* ptr)
{
s16 i, j;
- u16 *dst = sTrainerCardDataPtr->bgTilemap2;
+ u16 *dst = sTrainerCardDataPtr->bgTilemapBuffer;
for (i = 0; i < 20; i++)
{
@@ -1502,10 +1543,10 @@ static void LoadTrainerCardTilemap2(const u16* ptr)
CopyBgTilemapBufferToVram(2);
}
-static void LoadTrainerCardTilemap0(const u16* ptr)
+static void DrawCardFrontOrBack(const u16* ptr)
{
s16 i, j;
- u16 *dst = sTrainerCardDataPtr->bgTilemap0;
+ u16 *dst = sTrainerCardDataPtr->cardTilemapBuffer;
for (i = 0; i < 20; i++)
{
@@ -1521,17 +1562,17 @@ static void LoadTrainerCardTilemap0(const u16* ptr)
CopyBgTilemapBufferToVram(0);
}
-static void TrainerCard_PrintStarsAndBadgesOnCard(void)
+static void DrawStarsAndBadgesOnCard(void)
{
s16 i, x;
u16 tileNum = 192;
u8 palNum = 3;
- FillBgTilemapBufferRect(3, 143, 15, sUnknown_83CD95C[sTrainerCardDataPtr->cardType], sTrainerCardDataPtr->trainerCard.stars, 1, 4);
+ FillBgTilemapBufferRect(3, 143, 15, sStarYOffsets[sTrainerCardDataPtr->cardType], sTrainerCardDataPtr->trainerCard.rse.stars, 1, 4);
if (!sTrainerCardDataPtr->isLink)
{
x = 4;
- for (i = 0; i < BADGE_COUNT; i++, tileNum += 2, x += 3)
+ for (i = 0; i < NUM_BADGES; i++, tileNum += 2, x += 3)
{
if (sTrainerCardDataPtr->hasBadge[i])
{
@@ -1546,9 +1587,9 @@ static void TrainerCard_PrintStarsAndBadgesOnCard(void)
CopyBgTilemapBufferToVram(3);
}
-static void sub_808B090(void)
+static void DrawCardBackStats(void)
{
- if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD)
+ if (sTrainerCardDataPtr->cardType != CARD_TYPE_RSE)
{
if (sTrainerCardDataPtr->hasTrades)
{
@@ -1580,43 +1621,45 @@ static void sub_808B090(void)
CopyBgTilemapBufferToVram(3);
}
-static void sub_808B180(void)
+static void BlinkTimeColon(void)
{
- if (++sTrainerCardDataPtr->var_6 > 60)
+ if (++sTrainerCardDataPtr->timeColonBlinkTimer > 60)
{
- sTrainerCardDataPtr->var_6 = 0;
- sTrainerCardDataPtr->var_7 ^= 1;
- sTrainerCardDataPtr->var_7BCE = TRUE;
+ sTrainerCardDataPtr->timeColonBlinkTimer = 0;
+ sTrainerCardDataPtr->timeColonInvisible ^= 1;
+ sTrainerCardDataPtr->timeColonNeedDraw = TRUE;
}
}
u8 GetTrainerCardStars(u8 cardId)
{
- return gTrainerCards[cardId].stars;
+ return gTrainerCards[cardId].rse.stars;
}
-static void sub_808B1D4(void)
+#define tFlipState data[0]
+
+static void FlipTrainerCard(void)
{
- u8 taskId = CreateTask(sub_808B21C, 0);
- sub_808B21C(taskId);
+ u8 taskId = CreateTask(Task_DoCardFlipTask, 0);
+ Task_DoCardFlipTask(taskId);
SetHBlankCallback(HBlankCB_TrainerCard);
}
-static bool8 sub_808B1FC(void)
+static bool8 IsCardFlipTaskActive(void)
{
- if (FindTaskIdByFunc(sub_808B21C) == 0xFF)
+ if (FindTaskIdByFunc(Task_DoCardFlipTask) == 0xFF)
return TRUE;
else
return FALSE;
}
-static void sub_808B21C(u8 taskId)
+static void Task_DoCardFlipTask(u8 taskId)
{
- while(sTrainerCardTasks[gTasks[taskId].data[0]](&gTasks[taskId]))
+ while(sTrainerCardFlipTasks[gTasks[taskId].tFlipState](&gTasks[taskId]))
;
}
-static bool8 sub_808B254(struct Task* task)
+static bool8 Task_BeginCardFlip(struct Task* task)
{
u32 i;
@@ -1625,15 +1668,12 @@ static bool8 sub_808B254(struct Task* task)
ScanlineEffect_Stop();
ScanlineEffect_Clear();
for (i = 0; i < 160; i++)
- {
gScanlineEffectRegBuffers[1][i] = 0;
- }
-
- task->data[0]++;
+ task->tFlipState++;
return FALSE;
}
-static bool8 sub_808B294(struct Task* task)
+static bool8 Task_AnimateCardFlipDown(struct Task* task)
{
u32 r4, r5, r10, r7, r6, var_24, r9, var;
s16 i;
@@ -1679,12 +1719,12 @@ static bool8 sub_808B294(struct Task* task)
sTrainerCardDataPtr->allowDMACopy = TRUE;
if (task->data[1] >= 77)
- task->data[0]++;
+ task->tFlipState++;
return FALSE;
}
-static bool8 sub_808B3C4(struct Task* task)
+static bool8 Task_DrawFlippedCardSide(struct Task* task)
{
sTrainerCardDataPtr->allowDMACopy = FALSE;
if (sub_8058244() == TRUE)
@@ -1692,72 +1732,74 @@ static bool8 sub_808B3C4(struct Task* task)
do
{
- switch (sTrainerCardDataPtr->var_4)
+ switch (sTrainerCardDataPtr->flipDrawState)
{
case 0:
FillWindowPixelBuffer(1, PIXEL_FILL(0));
FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32);
break;
case 1:
- if (!sTrainerCardDataPtr->var_8)
+ if (!sTrainerCardDataPtr->onBack)
{
- if (!PrintStringsOnCardPage2())
+ if (!PrintAllOnCardBack())
return FALSE;
}
else
{
- if (!PrintAllOnCardPage1())
+ if (!PrintAllOnCardFront())
return FALSE;
}
break;
case 2:
- if (!sTrainerCardDataPtr->var_8)
- LoadTrainerCardTilemap0(sTrainerCardDataPtr->var_96C);
+ if (!sTrainerCardDataPtr->onBack)
+ DrawCardFrontOrBack(sTrainerCardDataPtr->backTilemap);
else
- PutTrainerCardWindow(1);
+ DrawTrainerCardWindow(1);
break;
case 3:
- if (!sTrainerCardDataPtr->var_8)
- sub_808B090();
+ if (!sTrainerCardDataPtr->onBack)
+ DrawCardBackStats();
else
FillWindowPixelBuffer(2, PIXEL_FILL(0));
break;
case 4:
- if (sTrainerCardDataPtr->var_8)
- sub_808B838();
+ if (sTrainerCardDataPtr->onBack)
+ CreateTrainerCardTrainerPic();
break;
default:
- task->data[0]++;
+ task->tFlipState++;
sTrainerCardDataPtr->allowDMACopy = TRUE;
- sTrainerCardDataPtr->var_4 = 0;
+ sTrainerCardDataPtr->flipDrawState = 0;
return FALSE;
}
- sTrainerCardDataPtr->var_4++;
+ sTrainerCardDataPtr->flipDrawState++;
} while (gReceivedRemoteLinkPlayers == 0);
return FALSE;
}
-static bool8 sub_808B4D8(struct Task* task)
+static bool8 Task_SetCardFlipped(struct Task* task)
{
sTrainerCardDataPtr->allowDMACopy = FALSE;
- if (sTrainerCardDataPtr->var_8)
+
+ // If on back of card, draw front of card because its being flipped
+ if (sTrainerCardDataPtr->onBack)
{
- PutTrainerCardWindow(2);
- LoadTrainerCardTilemap2(&sTrainerCardDataPtr->var_E1C);
- LoadTrainerCardTilemap0(&sTrainerCardDataPtr->var_4BC);
- TrainerCard_PrintStarsAndBadgesOnCard();
+ DrawTrainerCardWindow(2);
+ DrawCardScreenBackground(sTrainerCardDataPtr->bgTilemap);
+ DrawCardFrontOrBack(sTrainerCardDataPtr->frontTilemap);
+ DrawStarsAndBadgesOnCard();
}
- PutTrainerCardWindow(1);
- sTrainerCardDataPtr->var_8 ^= 1;
- task->data[0]++;
+ DrawTrainerCardWindow(1);
+ sTrainerCardDataPtr->onBack ^= 1;
+ task->tFlipState++;
sTrainerCardDataPtr->allowDMACopy = TRUE;
PlaySE(SE_CARD2);
return FALSE;
}
-static bool8 sub_808B540(struct Task* task)
+static bool8 Task_AnimateCardFlipUp(struct Task* task)
{
u32 r4, r5, r10, r7, r6, var_24, r9, var;
s16 i;
@@ -1803,17 +1845,17 @@ static bool8 sub_808B540(struct Task* task)
sTrainerCardDataPtr->allowDMACopy = TRUE;
if (task->data[1] <= 0)
- task->data[0]++;
+ task->tFlipState++;
return FALSE;
}
-static bool8 sub_808B66C(struct Task *task)
+static bool8 Task_EndCardFlip(struct Task *task)
{
ShowBg(1);
ShowBg(3);
SetHBlankCallback(NULL);
- DestroyTask(FindTaskIdByFunc(sub_808B21C));
+ DestroyTask(FindTaskIdByFunc(Task_DoCardFlipTask));
return FALSE;
}
@@ -1841,24 +1883,22 @@ void ShowTrainerCardInLink(u8 cardId, void (*callback)(void))
SetMainCallback2(CB2_InitTrainerCard);
}
-static void sub_808B774(void)
+static void InitTrainerCardData(void)
{
u8 i;
- sTrainerCardDataPtr->taskState = 0;
- sTrainerCardDataPtr->var_6 = gSaveBlock2Ptr->playTimeVBlanks;
- sTrainerCardDataPtr->var_7 = 0;
- sTrainerCardDataPtr->var_8 = 0;
- sTrainerCardDataPtr->var_456 = 0;
- if (GetCardType() == CARD_TYPE_EMERALD)
- sTrainerCardDataPtr->cardType = CARD_TYPE_EMERALD;
+ sTrainerCardDataPtr->mainState = 0;
+ sTrainerCardDataPtr->timeColonBlinkTimer = gSaveBlock2Ptr->playTimeVBlanks;
+ sTrainerCardDataPtr->timeColonInvisible = FALSE;
+ sTrainerCardDataPtr->onBack = FALSE;
+ sTrainerCardDataPtr->flipBlendY = 0;
+ if (GetCardType() == CARD_TYPE_RSE)
+ sTrainerCardDataPtr->cardType = CARD_TYPE_RSE;
else
sTrainerCardDataPtr->cardType = CARD_TYPE_FRLG;
- for (i = 0; i < 4; i++)
- {
- CopyEasyChatWord(sTrainerCardDataPtr->var_19[i], sTrainerCardDataPtr->trainerCard.var_28[i]);
- }
+ for (i = 0; i < TRAINER_CARD_PROFILE_LENGTH; i++)
+ CopyEasyChatWord(sTrainerCardDataPtr->easyChatProfile[i], sTrainerCardDataPtr->trainerCard.rse.easyChatProfile[i]);
}
static u8 GetCardType(void)
@@ -1868,39 +1908,39 @@ static u8 GetCardType(void)
if (gGameVersion == VERSION_FIRE_RED || gGameVersion == VERSION_LEAF_GREEN)
return CARD_TYPE_FRLG;
else
- return CARD_TYPE_EMERALD;
+ return CARD_TYPE_RSE;
}
else
{
if (sTrainerCardDataPtr->trainerCard.version == VERSION_FIRE_RED || sTrainerCardDataPtr->trainerCard.version == VERSION_LEAF_GREEN)
return CARD_TYPE_FRLG;
else
- return CARD_TYPE_EMERALD;
+ return CARD_TYPE_RSE;
}
}
-static void sub_808B838(void)
+static void CreateTrainerCardTrainerPic(void)
{
- u8 val = sLinkTrainerCardFrontPics[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.gender];
+ u8 facilityClass = sTrainerPicFacilityClasses[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender];
if (InUnionRoom() == TRUE && gReceivedRemoteLinkPlayers == 1)
{
- val = sTrainerCardDataPtr->trainerCard.var_4F;
- sub_810C330(FacilityClassToPicIndex(val), TRUE, sTrainerCardPicPositions[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.gender][0],
- sTrainerCardPicPositions[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.gender][1], 8, 2);
+ facilityClass = sTrainerCardDataPtr->trainerCard.facilityClass;
+ CreateTrainerCardTrainerPicSprite(FacilityClassToPicIndex(facilityClass), TRUE, sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][0],
+ sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][1], 8, 2);
}
else
{
if (sTrainerCardDataPtr->cardType != CARD_TYPE_FRLG)
{
- sub_810C330(FacilityClassToPicIndex(val), TRUE, sTrainerCardPicPositions[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.gender][0],
- sTrainerCardPicPositions[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.gender][1], 8, 2);
+ CreateTrainerCardTrainerPicSprite(FacilityClassToPicIndex(facilityClass), TRUE, sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][0],
+ sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][1], 8, 2);
}
else
{
- sub_810C330(PlayerGenderToFrontTrainerPicId_Debug(sTrainerCardDataPtr->trainerCard.gender, TRUE), TRUE,
- sTrainerCardPicPositions[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.gender][0],
- sTrainerCardPicPositions[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.gender][1],
+ CreateTrainerCardTrainerPicSprite(PlayerGenderToFrontTrainerPicId_Debug(sTrainerCardDataPtr->trainerCard.rse.gender, TRUE), TRUE,
+ sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][0],
+ sTrainerPicOffsets[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.rse.gender][1],
8, 2);
}
}
diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c
index 7262954c9..8567d791b 100644
--- a/src/trainer_pokemon_sprites.c
+++ b/src/trainer_pokemon_sprites.c
@@ -2,12 +2,9 @@
#include "sprite.h"
#include "window.h"
#include "malloc.h"
-#include "constants/species.h"
#include "palette.h"
#include "decompress.h"
-#include "trainer_pokemon_sprites.h"
#include "pokemon.h"
-#include "constants/trainer_classes.h"
extern const struct CompressedSpriteSheet gMonFrontPicTable[];
extern const struct CompressedSpriteSheet gMonBackPicTable[];
@@ -303,7 +300,7 @@ u16 sub_810C2FC(u16 species, bool8 isFrontPic, u8 paletteSlot, u8 windowId)
return sub_810C050(species, 0, 0, isFrontPic, paletteSlot, windowId, TRUE);
}
-u16 sub_810C330(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId)
+u16 CreateTrainerCardTrainerPicSprite(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId)
{
return sub_810C0C0(species, 0, 0, isFrontPic, destX, destY, paletteSlot, windowId, TRUE);
}
diff --git a/src/trainer_see.c b/src/trainer_see.c
new file mode 100644
index 000000000..3dbfbdf38
--- /dev/null
+++ b/src/trainer_see.c
@@ -0,0 +1,751 @@
+#include "global.h"
+#include "battle_setup.h"
+#include "event_object_movement.h"
+#include "field_effect.h"
+#include "field_player_avatar.h"
+#include "quest_log.h"
+#include "script.h"
+#include "task.h"
+#include "util.h"
+#include "constants/battle_setup.h"
+#include "constants/event_object_movement.h"
+#include "constants/event_objects.h"
+
+typedef u8 (*TrainerApproachFunc)(struct ObjectEvent *, s16, s16, s16);
+typedef bool8 (*TrainerSeeFunc)(u8, struct Task *, struct ObjectEvent *);
+
+/*static*/ bool8 CheckTrainer(u8 trainerObjId);
+/*static*/ u8 GetTrainerApproachDistance(struct ObjectEvent * trainerObj);
+/*static*/ u8 GetTrainerApproachDistanceSouth(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y);
+/*static*/ u8 GetTrainerApproachDistanceNorth(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y);
+/*static*/ u8 GetTrainerApproachDistanceWest(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y);
+/*static*/ u8 GetTrainerApproachDistanceEast(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y);
+/*static*/ u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent * trainerObj, u8 approachDistance, u8 facingDirection);
+/*static*/ void TrainerApproachPlayer(struct ObjectEvent * trainerObj, u8 approachDistance);
+/*static*/ void Task_RunTrainerSeeFuncList(u8 taskId);
+/*static*/ bool8 TrainerSeeFunc_Dummy(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj);
+/*static*/ bool8 TrainerSeeFunc_StartExclMark(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj);
+/*static*/ bool8 TrainerSeeFunc_WaitExclMark(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj);
+/*static*/ bool8 TrainerSeeFunc_TrainerApproach(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj);
+/*static*/ bool8 TrainerSeeFunc_PrepareToEngage(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj);
+/*static*/ bool8 TrainerSeeFunc_End(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj);
+/*static*/ bool8 TrainerSeeFunc_BeginRemoveDisguise(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj);
+/*static*/ bool8 TrainerSeeFunc_WaitRemoveDisguise(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj);
+/*static*/ bool8 TrainerSeeFunc_TrainerInAshFacesPlayer(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj);
+/*static*/ bool8 TrainerSeeFunc_BeginJumpOutOfAsh(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj);
+/*static*/ bool8 TrainerSeeFunc_WaitJumpOutOfAsh(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj);
+/*static*/ bool8 TrainerSeeFunc_EndJumpOutOfAsh(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj);
+/*static*/ bool8 TrainerSeeFunc_OffscreenAboveTrainerCreateCameraObj(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj);
+/*static*/ bool8 TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveUp(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj);
+/*static*/ bool8 TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveDown(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj);
+/*static*/ void Task_DestroyTrainerApproachTask(u8 taskId);
+/*static*/ void SpriteCB_TrainerIcons(struct Sprite * sprite);
+/*static*/ void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnimNum);
+
+/*static*/ const u16 sGfx_Emoticons[] = INCBIN_U16("graphics/object_events/emoticons.4bpp");
+
+// u8 func(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y)
+// range is the maximum distance the trainer can see
+// x and y are the player's coordinates
+// Returns distance to walk if trainer has unobstructed view of player
+// Returns 0 if trainer can't see player
+/*static*/ const TrainerApproachFunc sDirectionalApproachDistanceFuncs[] = {
+ GetTrainerApproachDistanceSouth,
+ GetTrainerApproachDistanceNorth,
+ GetTrainerApproachDistanceWest,
+ GetTrainerApproachDistanceEast
+};
+
+// bool8 func(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj)
+// Returns TRUE to run the next func immediately
+// Returns FALSE to delay the next func to the next frame
+/*static*/ const TrainerSeeFunc sTrainerSeeFuncList[] = {
+ TrainerSeeFunc_Dummy,
+ TrainerSeeFunc_StartExclMark,
+ TrainerSeeFunc_WaitExclMark,
+ TrainerSeeFunc_TrainerApproach,
+ TrainerSeeFunc_PrepareToEngage,
+ TrainerSeeFunc_End,
+ TrainerSeeFunc_BeginRemoveDisguise,
+ TrainerSeeFunc_WaitRemoveDisguise,
+ TrainerSeeFunc_TrainerInAshFacesPlayer,
+ TrainerSeeFunc_BeginJumpOutOfAsh,
+ TrainerSeeFunc_WaitJumpOutOfAsh,
+ TrainerSeeFunc_EndJumpOutOfAsh,
+ TrainerSeeFunc_OffscreenAboveTrainerCreateCameraObj,
+ TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveUp,
+ TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveDown
+};
+
+/*static*/ const TrainerSeeFunc sTrainerSeeFuncList2[] = {
+ TrainerSeeFunc_TrainerInAshFacesPlayer,
+ TrainerSeeFunc_BeginJumpOutOfAsh,
+ TrainerSeeFunc_WaitJumpOutOfAsh,
+ TrainerSeeFunc_EndJumpOutOfAsh
+};
+
+bool8 CheckForTrainersWantingBattle(void)
+{
+ u8 i;
+ if (sub_8111C2C() == TRUE)
+ return FALSE;
+
+ for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
+ {
+ if (gObjectEvents[i].active
+ && (
+ gObjectEvents[i].trainerType == 1
+ || gObjectEvents[i].trainerType == 3
+ )
+ && CheckTrainer(i)
+ )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/*static*/ bool8 CheckTrainer(u8 trainerObjId)
+{
+ const u8 *script = GetObjectEventScriptPointerByObjectEventId(trainerObjId);
+ u8 approachDistance;
+ if (GetTrainerFlagFromScriptPointer(script))
+ return FALSE;
+ approachDistance = GetTrainerApproachDistance(&gObjectEvents[trainerObjId]);
+ if (approachDistance != 0)
+ {
+ if (script[1] == TRAINER_BATTLE_DOUBLE && GetMonsStateToDoubles())
+ return FALSE;
+ ConfigureAndSetUpOneTrainerBattle(trainerObjId, script);
+ TrainerApproachPlayer(&gObjectEvents[trainerObjId], approachDistance - 1);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/*static*/ u8 GetTrainerApproachDistance(struct ObjectEvent *trainerObj)
+{
+ s16 x, y;
+ u8 i;
+ u8 approachDistance;
+
+ PlayerGetDestCoords(&x, &y);
+ if (trainerObj->trainerType == 1) // can only see in one direction
+ {
+ approachDistance = sDirectionalApproachDistanceFuncs[trainerObj->facingDirection - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y);
+ return CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, trainerObj->facingDirection);
+ }
+ else // can see in all directions
+ {
+ for (i = 0; i < 4; i++)
+ {
+ approachDistance = sDirectionalApproachDistanceFuncs[i](trainerObj, trainerObj->trainerRange_berryTreeId, x, y);
+ if (CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, i + 1)) // directions are 1-4 instead of 0-3. south north west east
+ return approachDistance;
+ }
+ }
+
+ return 0;
+}
+
+// Returns how far south the player is from trainer. 0 if out of trainer's sight.
+/*static*/ u8 GetTrainerApproachDistanceSouth(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y)
+{
+ if (trainerObj->currentCoords.x == x
+ && y > trainerObj->currentCoords.y
+ && y <= trainerObj->currentCoords.y + range)
+ {
+ if (range > 3 && GetFirstInactiveObjectEventId() == OBJECT_EVENTS_COUNT)
+ return 0;
+ return (y - trainerObj->currentCoords.y);
+ }
+ else
+ return 0;
+}
+
+// Returns how far north the player is from trainer. 0 if out of trainer's sight.
+/*static*/ u8 GetTrainerApproachDistanceNorth(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y)
+{
+ if (trainerObj->currentCoords.x == x
+ && y < trainerObj->currentCoords.y
+ && y >= trainerObj->currentCoords.y - range)
+ return (trainerObj->currentCoords.y - y);
+ else
+ return 0;
+}
+
+// Returns how far west the player is from trainer. 0 if out of trainer's sight.
+/*static*/ u8 GetTrainerApproachDistanceWest(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y)
+{
+ if (trainerObj->currentCoords.y == y
+ && x < trainerObj->currentCoords.x
+ && x >= trainerObj->currentCoords.x - range)
+ return (trainerObj->currentCoords.x - x);
+ else
+ return 0;
+}
+
+// Returns how far east the player is from trainer. 0 if out of trainer's sight.
+/*static*/ u8 GetTrainerApproachDistanceEast(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y)
+{
+ if (trainerObj->currentCoords.y == y
+ && x > trainerObj->currentCoords.x
+ && x <= trainerObj->currentCoords.x + range)
+ return (x - trainerObj->currentCoords.x);
+ else
+ return 0;
+}
+
+#define COLLISION_MASK (~1)
+
+/*static*/ u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent *trainerObj, u8 approachDistance, u8 direction)
+{
+ s16 x, y;
+ u8 unk19_temp;
+ u8 unk19b_temp;
+ u8 i;
+ u8 collision;
+
+ if (approachDistance == 0)
+ return 0;
+
+ x = trainerObj->currentCoords.x;
+ y = trainerObj->currentCoords.y;
+
+ for (i = 0; i <= approachDistance - 1; i++, MoveCoords(direction, &x, &y))
+ {
+ collision = GetCollisionFlagsAtCoords(trainerObj, x, y, direction);
+ if (collision != 0 && (collision & COLLISION_MASK))
+ return 0;
+ }
+
+ // preserve mapobj_unk_19 before clearing.
+ unk19_temp = trainerObj->range.as_nybbles.x;
+ unk19b_temp = trainerObj->range.as_nybbles.y;
+ trainerObj->range.as_nybbles.x = 0;
+ trainerObj->range.as_nybbles.y = 0;
+
+ collision = GetCollisionAtCoords(trainerObj, x, y, direction);
+
+ trainerObj->range.as_nybbles.x = unk19_temp;
+ trainerObj->range.as_nybbles.y = unk19b_temp;
+ if (collision == 4)
+ return approachDistance;
+
+ return 0;
+}
+
+#define tFuncId data[0]
+#define tTrainerObjHi data[1]
+#define tTrainerObjLo data[2]
+#define tTrainerRange data[3]
+#define tOutOfAshSpriteId data[4]
+#define tData5 data[5]
+
+#define TaskGetTrainerObj(dest, task) do { \
+ (dest) = (struct ObjectEvent *)(((task)->tTrainerObjHi << 16) | ((u16)(task)->tTrainerObjLo)); \
+} while (0)
+
+/*static*/ void TrainerApproachPlayer(struct ObjectEvent * trainerObj, u8 approachDistance)
+{
+ u8 taskId = CreateTask(Task_RunTrainerSeeFuncList, 80);
+ struct Task * task = &gTasks[taskId];
+ task->tTrainerObjHi = ((uintptr_t)trainerObj) >> 16;
+ task->tTrainerObjLo = (uintptr_t)trainerObj;
+ task->tTrainerRange = approachDistance;
+}
+
+/*static*/ void StartTrainerApproachWithFollowupTask(TaskFunc taskFunc)
+{
+ u8 taskId = FindTaskIdByFunc(Task_RunTrainerSeeFuncList);
+ SetTaskFuncWithFollowupFunc(taskId, Task_RunTrainerSeeFuncList, taskFunc);
+ gTasks[taskId].tFuncId = 1;
+ Task_RunTrainerSeeFuncList(taskId);
+}
+
+/*static*/ void Task_RunTrainerSeeFuncList(u8 taskId)
+{
+ struct Task * task = &gTasks[taskId];
+ struct ObjectEvent * trainerObj;
+ TaskGetTrainerObj(trainerObj, task);
+
+ if (!trainerObj->active)
+ {
+ SwitchTaskToFollowupFunc(taskId);
+ }
+ else
+ {
+ while (sTrainerSeeFuncList[task->tFuncId](taskId, task, trainerObj))
+ ;
+ }
+}
+
+// TrainerSeeFuncs
+
+/*static*/ bool8 TrainerSeeFunc_Dummy(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj)
+{
+ return FALSE;
+}
+
+/*static*/ bool8 TrainerSeeFunc_StartExclMark(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj)
+{
+ u8 action;
+ // FRLG introduces trainers who can see the player from offscreen above.
+ // Handle this case here.
+ if (trainerObj->facingDirection == DIR_SOUTH && task->tTrainerRange > 2)
+ {
+ task->tFuncId = 12;
+ }
+ else
+ {
+ ObjectEventGetLocalIdAndMap(trainerObj, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
+ FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON);
+ action = GetFaceDirectionMovementAction(trainerObj->facingDirection);
+ ObjectEventSetHeldMovement(trainerObj, action);
+ task->tFuncId++;
+ }
+ return TRUE;
+}
+
+/*static*/ bool8 TrainerSeeFunc_WaitExclMark(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj)
+{
+ if (FieldEffectActiveListContains(FLDEFF_EXCLAMATION_MARK_ICON))
+ {
+ return FALSE;
+ }
+ else
+ {
+ task->tFuncId++;
+ if (trainerObj->movementType == MOVEMENT_TYPE_TREE_DISGUISE || trainerObj->movementType == MOVEMENT_TYPE_MOUNTAIN_DISGUISE)
+ task->tFuncId = 6;
+ if (trainerObj->movementType == MOVEMENT_TYPE_HIDDEN)
+ task->tFuncId = 8;
+ return TRUE;
+ }
+}
+
+/*static*/ bool8 TrainerSeeFunc_TrainerApproach(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj)
+{
+ if (!ObjectEventIsMovementOverridden(trainerObj) || ObjectEventClearHeldMovementIfFinished(trainerObj))
+ {
+ if (task->tTrainerRange)
+ {
+ ObjectEventSetHeldMovement(trainerObj, GetWalkNormalMovementAction(trainerObj->facingDirection));
+ task->tTrainerRange--;
+ }
+ else
+ {
+ ObjectEventSetHeldMovement(trainerObj, MOVEMENT_ACTION_FACE_PLAYER);
+ task->tFuncId++;
+ }
+ }
+ return FALSE;
+}
+
+/*static*/ bool8 TrainerSeeFunc_PrepareToEngage(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj)
+{
+ struct ObjectEvent *playerObj;
+
+ if (ObjectEventIsMovementOverridden(trainerObj) && !ObjectEventClearHeldMovementIfFinished(trainerObj))
+ return FALSE;
+
+ SetTrainerMovementType(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection));
+ OverrideMovementTypeForObjectEvent(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection));
+ OverrideTemplateCoordsForObjectEvent(trainerObj);
+
+ playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (ObjectEventIsMovementOverridden(playerObj) && !ObjectEventClearHeldMovementIfFinished(playerObj))
+ return FALSE;
+
+ sub_805C774();
+ // Uncomment to have player turn to face their opponent
+ // ObjectEventSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], GetFaceDirectionMovementAction(GetOppositeDirection(trainerObj->facingDirection)));
+ task->tFuncId++;
+ return FALSE;
+}
+
+/*static*/ bool8 TrainerSeeFunc_End(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj)
+{
+ struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];
+
+ if (!ObjectEventIsMovementOverridden(playerObj)
+ || ObjectEventClearHeldMovementIfFinished(playerObj))
+ SwitchTaskToFollowupFunc(taskId); // This ends the trainer walk routine.
+ return FALSE;
+}
+
+// Jumps here if disguised. Not used in FRLG.
+/*static*/ bool8 TrainerSeeFunc_BeginRemoveDisguise(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj)
+{
+ if (!ObjectEventIsMovementOverridden(trainerObj)
+ || ObjectEventClearHeldMovementIfFinished(trainerObj))
+ {
+ ObjectEventSetHeldMovement(trainerObj, MOVEMENT_ACTION_REVEAL_TRAINER);
+ task->tFuncId++;
+ }
+ return FALSE;
+}
+
+/*static*/ bool8 TrainerSeeFunc_WaitRemoveDisguise(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj)
+{
+ if (ObjectEventClearHeldMovementIfFinished(trainerObj))
+ task->tFuncId = 3;
+
+ return FALSE;
+}
+
+// Jump here if hidden in ash. Not used in FRLG.
+/*static*/ bool8 TrainerSeeFunc_TrainerInAshFacesPlayer(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj)
+{
+ if (!ObjectEventIsMovementOverridden(trainerObj)
+ || ObjectEventClearHeldMovementIfFinished(trainerObj))
+ {
+ ObjectEventSetHeldMovement(trainerObj, MOVEMENT_ACTION_FACE_PLAYER);
+ task->tFuncId++;
+ }
+ return FALSE;
+}
+
+/*static*/ bool8 TrainerSeeFunc_BeginJumpOutOfAsh(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj)
+{
+ if (ObjectEventCheckHeldMovementStatus(trainerObj))
+ {
+ gFieldEffectArguments[0] = trainerObj->currentCoords.x;
+ gFieldEffectArguments[1] = trainerObj->currentCoords.y;
+ gFieldEffectArguments[2] = gSprites[trainerObj->spriteId].subpriority - 1;
+ gFieldEffectArguments[3] = 2;
+ task->tOutOfAshSpriteId = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH);
+ task->tFuncId++;
+ }
+ return FALSE;
+}
+
+/*static*/ bool8 TrainerSeeFunc_WaitJumpOutOfAsh(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj)
+{
+ struct Sprite *sprite;
+
+ if (gSprites[task->tOutOfAshSpriteId].animCmdIndex == 2)
+ {
+ trainerObj->fixedPriority = FALSE;
+ trainerObj->triggerGroundEffectsOnMove = TRUE;
+
+ sprite = &gSprites[trainerObj->spriteId];
+ sprite->oam.priority = 2;
+ ObjectEventClearHeldMovementIfFinished(trainerObj);
+ ObjectEventSetHeldMovement(trainerObj, GetJumpInPlaceMovementAction(trainerObj->facingDirection));
+ task->tFuncId++;
+ }
+
+ return FALSE;
+}
+
+/*static*/ bool8 TrainerSeeFunc_EndJumpOutOfAsh(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj)
+{
+ if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH))
+ task->tFuncId = 3;
+
+ return FALSE;
+}
+
+// FRLG exclusive: Scroll the camera up to reveal an offscreen above trainer
+/*static*/ bool8 TrainerSeeFunc_OffscreenAboveTrainerCreateCameraObj(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj)
+{
+ int specialObjectId;
+ task->tData5 = 0;
+ specialObjectId = SpawnSpecialObjectEventParameterized(OBJ_EVENT_GFX_YOUNGSTER, 7, OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->pos.x + 7, gSaveBlock1Ptr->pos.y + 7, 3);
+ gObjectEvents[specialObjectId].invisible = TRUE;
+ CameraObjectSetFollowedObjectId(gObjectEvents[specialObjectId].spriteId);
+ task->tFuncId++;
+ return FALSE;
+}
+
+/*static*/ bool8 TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveUp(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj)
+{
+ u8 specialObjectId;
+ TryGetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &specialObjectId);
+
+ if (ObjectEventIsMovementOverridden(&gObjectEvents[specialObjectId]) && !ObjectEventClearHeldMovementIfFinished(&gObjectEvents[specialObjectId]))
+ return FALSE;
+
+ if (task->tData5 != task->tTrainerRange - 1)
+ {
+ ObjectEventSetHeldMovement(&gObjectEvents[specialObjectId], GetWalkFastMovementAction(DIR_NORTH));
+ task->tData5++;
+ }
+ else
+ {
+ ObjectEventGetLocalIdAndMap(trainerObj, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
+ FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON);
+ task->tData5 = 0;
+ task->tFuncId++;
+ }
+ return FALSE;
+}
+
+/*static*/ bool8 TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveDown(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj)
+{
+ u8 specialObjectId;
+ TryGetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &specialObjectId);
+
+ if (FieldEffectActiveListContains(FLDEFF_EXCLAMATION_MARK_ICON))
+ return FALSE;
+
+ if (ObjectEventIsMovementOverridden(&gObjectEvents[specialObjectId]) && !ObjectEventClearHeldMovementIfFinished(&gObjectEvents[specialObjectId]))
+ return FALSE;
+
+ if (task->tData5 != task->tTrainerRange - 1)
+ {
+ ObjectEventSetHeldMovement(&gObjectEvents[specialObjectId], GetWalkFastMovementAction(DIR_SOUTH));
+ task->tData5++;
+ }
+ else
+ {
+ CameraObjectSetFollowedObjectId(GetPlayerAvatarObjectId());
+ RemoveObjectEventByLocalIdAndMap(OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+ task->tData5 = 0;
+ task->tFuncId = 2;
+ }
+ return FALSE;
+}
+
+#undef tData5
+#undef tOutOfAshSpriteId
+#undef tTrainerRange
+#undef tTrainerObjLo
+#undef tTrainerObjHi
+#undef tFuncId
+
+/*static*/ void Task_RevealTrainer_RunTrainerSeeFuncList(u8 taskId)
+{
+ struct Task * task = &gTasks[taskId];
+ struct ObjectEvent * trainerObj;
+
+ // another objEvent loaded into by loadword?
+ LoadWordFromTwoHalfwords((u16 *)&task->data[1], (uintptr_t *)&trainerObj);
+ if (!task->data[7])
+ {
+ ObjectEventClearHeldMovement(trainerObj);
+ task->data[7]++;
+ }
+ sTrainerSeeFuncList2[task->data[0]](taskId, task, trainerObj);
+ if (task->data[0] == 3 && !FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH))
+ {
+ SetTrainerMovementType(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection));
+ OverrideMovementTypeForObjectEvent(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection));
+ DestroyTask(taskId);
+ }
+ else
+ {
+ trainerObj->heldMovementFinished = FALSE;
+ }
+}
+
+void MovementAction_RevealTrainer_RunTrainerSeeFuncList(struct ObjectEvent *var)
+{
+ StoreWordInTwoHalfwords((u16 *)&gTasks[CreateTask(Task_RevealTrainer_RunTrainerSeeFuncList, 0)].data[1], (u32)var);
+}
+
+void EndTrainerApproach(void)
+{
+ StartTrainerApproachWithFollowupTask(Task_DestroyTrainerApproachTask);
+}
+
+/*static*/ void Task_DestroyTrainerApproachTask(u8 taskId)
+{
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+}
+
+// Trainer See Excl Mark Field Effect
+
+#define sLocalId data[0]
+#define sMapNum data[1]
+#define sMapGroup data[2]
+#define sData3 data[3]
+#define sData4 data[4]
+#define sFldEffId data[7]
+
+/*static*/ const struct OamData sOamData_Emoticons = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = 0,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x16),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(16x16),
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+/*static*/ const struct SpriteFrameImage sSpriteImages_Emoticons[] = {
+ {sGfx_Emoticons + 0x000, 0x80},
+ {sGfx_Emoticons + 0x040, 0x80},
+ {sGfx_Emoticons + 0x080, 0x80},
+
+ {sGfx_Emoticons + 0x180, 0x80},
+ {sGfx_Emoticons + 0x1C0, 0x80},
+ {sGfx_Emoticons + 0x200, 0x80},
+
+ {sGfx_Emoticons + 0x0C0, 0x80},
+ {sGfx_Emoticons + 0x100, 0x80},
+ {sGfx_Emoticons + 0x140, 0x80},
+
+ {sGfx_Emoticons + 0x240, 0x80},
+ {sGfx_Emoticons + 0x280, 0x80},
+ {sGfx_Emoticons + 0x2C0, 0x80},
+
+ {sGfx_Emoticons + 0x300, 0x80},
+ {sGfx_Emoticons + 0x340, 0x80},
+ {sGfx_Emoticons + 0x380, 0x80},
+};
+
+/*static*/ const union AnimCmd sAnimCmd_ExclamationMark1[] = {
+ ANIMCMD_FRAME( 0, 4),
+ ANIMCMD_FRAME( 1, 4),
+ ANIMCMD_FRAME( 2, 52),
+ ANIMCMD_END
+};
+
+/*static*/ const union AnimCmd sAnimCmd_DoubleExclMark[] = {
+ ANIMCMD_FRAME( 6, 4),
+ ANIMCMD_FRAME( 7, 4),
+ ANIMCMD_FRAME( 8, 52),
+ ANIMCMD_END
+};
+
+/*static*/ const union AnimCmd sAnimCmd_X[] = {
+ ANIMCMD_FRAME( 3, 4),
+ ANIMCMD_FRAME( 4, 4),
+ ANIMCMD_FRAME( 5, 52),
+ ANIMCMD_END
+};
+
+/*static*/ const union AnimCmd sAnimCmd_SmileyFace[] = {
+ ANIMCMD_FRAME( 9, 4),
+ ANIMCMD_FRAME(10, 4),
+ ANIMCMD_FRAME(11, 52),
+ ANIMCMD_END
+};
+
+/*static*/ const union AnimCmd sAnimCmd_QuestionMark[] = {
+ ANIMCMD_FRAME(12, 4),
+ ANIMCMD_FRAME(13, 4),
+ ANIMCMD_FRAME(14, 52),
+ ANIMCMD_END
+};
+
+/*static*/ const union AnimCmd *const sSpriteAnimTable_Emoticons[] = {
+ sAnimCmd_ExclamationMark1,
+ sAnimCmd_DoubleExclMark,
+ sAnimCmd_X,
+ sAnimCmd_SmileyFace,
+ sAnimCmd_QuestionMark
+};
+
+/*static*/ const struct SpriteTemplate sSpriteTemplate_Emoticons = {
+ .tileTag = 0xFFFF,
+ .paletteTag = 0xFFFF,
+ .oam = &sOamData_Emoticons,
+ .anims = sSpriteAnimTable_Emoticons,
+ .images = sSpriteImages_Emoticons,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_TrainerIcons
+};
+
+u8 FldEff_ExclamationMarkIcon1(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x53);
+
+ if (spriteId != MAX_SPRITES)
+ SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON, 0);
+
+ return 0;
+}
+
+u8 FldEff_DoubleExclMarkIcon(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x52);
+
+ if (spriteId != MAX_SPRITES)
+ SetIconSpriteData(&gSprites[spriteId], FLDEFF_DOUBLE_EXCL_MARK_ICON, 1);
+
+ return 0;
+}
+
+u8 FldEff_XIcon(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x52);
+
+ if (spriteId != MAX_SPRITES)
+ SetIconSpriteData(&gSprites[spriteId], FLDEFF_X_ICON, 2);
+
+ return 0;
+}
+
+u8 FldEff_SmileyFaceIcon(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x52);
+
+ if (spriteId != MAX_SPRITES)
+ SetIconSpriteData(&gSprites[spriteId], FLDEFF_SMILEY_FACE_ICON, 3);
+
+ return 0;
+}
+
+u8 FldEff_QuestionMarkIcon(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x52);
+
+ if (spriteId != MAX_SPRITES)
+ SetIconSpriteData(&gSprites[spriteId], FLDEFF_QUESTION_MARK_ICON, 4);
+
+ return 0;
+}
+
+/*static*/ void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnimNum)
+{
+ sprite->oam.priority = 1;
+ sprite->coordOffsetEnabled = 1;
+
+ sprite->sLocalId = gFieldEffectArguments[0];
+ sprite->sMapNum = gFieldEffectArguments[1];
+ sprite->sMapGroup = gFieldEffectArguments[2];
+ sprite->sData3 = -5;
+ sprite->sFldEffId = fldEffId;
+
+ StartSpriteAnim(sprite, spriteAnimNum);
+}
+
+/*static*/ void SpriteCB_TrainerIcons(struct Sprite *sprite)
+{
+ u8 objEventId;
+
+ if (TryGetObjectEventIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &objEventId)
+ || sprite->animEnded)
+ {
+ FieldEffectStop(sprite, sprite->sFldEffId);
+ }
+ else
+ {
+ struct Sprite *objEventSprite = &gSprites[gObjectEvents[objEventId].spriteId];
+ sprite->sData4 += sprite->sData3;
+ sprite->pos1.x = objEventSprite->pos1.x;
+ sprite->pos1.y = objEventSprite->pos1.y - 16;
+ sprite->pos2.x = objEventSprite->pos2.x;
+ sprite->pos2.y = objEventSprite->pos2.y + sprite->sData4;
+ if (sprite->sData4)
+ sprite->sData3++;
+ else
+ sprite->sData3 = 0;
+ }
+}
+
+#undef sLocalId
+#undef sMapNum
+#undef sMapGroup
+#undef sData3
+#undef sData4
+#undef sFldEffId
diff --git a/src/trainer_tower.c b/src/trainer_tower.c
index 60c6fd93d..0c673b5aa 100644
--- a/src/trainer_tower.c
+++ b/src/trainer_tower.c
@@ -2,11 +2,9 @@
#include "main.h"
#include "task.h"
#include "malloc.h"
-#include "save.h"
#include "util.h"
#include "string_util.h"
#include "event_data.h"
-#include "random.h"
#include "cereader_tool.h"
#include "easy_chat.h"
#include "text.h"
@@ -20,25 +18,26 @@
#include "menu.h"
#include "new_menu_helpers.h"
#include "sound.h"
-#include "renewable_hidden_items.h"
-#include "constants/flags.h"
#include "constants/vars.h"
#include "constants/items.h"
#include "constants/species.h"
-#include "constants/maps.h"
#include "constants/songs.h"
#include "constants/layouts.h"
#include "constants/trainers.h"
#include "constants/facility_trainer_classes.h"
-#include "constants/object_events.h"
+#include "constants/event_objects.h"
+#include "constants/trainer_tower.h"
+
+#define CURR_FLOOR sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx]
+#define TRAINER_TOWER gSaveBlock1Ptr->trainerTower[gSaveBlock1Ptr->towerChallengeId]
struct UnkStruct_203F458
{
/* 0x0000 */ u8 floorIdx;
- /* 0x0004 */ struct EReaderTrainerHillSet unk_0004;
+ /* 0x0004 */ struct EReaderTrainerTowerSet unk_0004;
};
-struct UnkStruct_203F45C
+struct TrainerTowerOpponent
{
/* 0x00 */ u8 name[11];
/* 0x0C */ u16 speechWin[6];
@@ -52,15 +51,15 @@ struct UnkStruct_203F45C
struct SinglesTrainerInfo
{
- u8 mapObjGfx;
+ u8 objGfx;
u8 facilityClass;
bool8 gender;
};
struct DoublesTrainerInfo
{
- u8 mapObjGfx1;
- u8 mapObjGfx2;
+ u8 objGfx1;
+ u8 objGfx2;
u8 facilityClass;
bool8 gender1;
bool8 gender2;
@@ -68,147 +67,147 @@ struct DoublesTrainerInfo
struct TrainerEncounterMusicPairs
{
- u8 unk0;
- u8 unk1;
+ u8 facilityClass;
+ u8 musicId;
};
static EWRAM_DATA struct UnkStruct_203F458 * sTrainerTowerState = NULL;
-static EWRAM_DATA struct UnkStruct_203F45C * sTrainerTowerOpponent = NULL;
+static EWRAM_DATA struct TrainerTowerOpponent * sTrainerTowerOpponent = NULL;
static EWRAM_DATA u8 sUnused_203F460 = 0;
-static void sub_815DC8C(void); // setup
-static void sub_815DD2C(void); // teardown
-static void sub_815DD44(void);
+static void SetUpTrainerTowerDataStruct(void);
+static void FreeTrainerTowerDataStruct(void);
+static void InitTrainerTowerFloor(void);
static void SetTrainerTowerNPCGraphics(void);
static void TT_ConvertEasyChatMessageToString(u16 *ecWords, u8 *dest);
-static void sub_815DF54(void);
+static void BufferTowerOpponentSpeech(void);
static void TrainerTowerGetOpponentTextColor(u8 battleType, u8 facilityClass);
-static void sub_815E160(void);
-static void sub_815E1C0(void);
-static void sub_815E1F0(void);
-static void TTSpecial_HasReachedTheRoof(void);
-static void sub_815E28C(void);
-static void sub_815E394(void);
-static void sub_815E408(void);
-static void sub_815E4B0(void);
-static void TTSpecial_StartTimer(void);
-static void sub_815E5C4(void);
-static void sub_815E5F0(void);
-static void sub_815E658(void);
-static void sub_815E720(void);
-static void sub_815E88C(void);
-static void sub_815E8B4(void);
-static void sub_815E8CC(void);
-static void sub_815E908(void);
-static void sub_815E948(void);
-static void sub_815E9C8(void);
+static void DoTrainerTowerBattle(void);
+static void TrainerTowerGetChallengeType(void);
+static void TrainerTowerAddFloorCleared(void);
+static void GetFloorAlreadyCleared(void);
+static void StartTrainerTowerChallenge(void);
+static void GetOwnerState(void);
+static void GiveChallengePrize(void);
+static void CheckFinalTime(void);
+static void TrainerTowerResumeTimer(void);
+static void TrainerTowerSetPlayerLost(void);
+static void GetTrainerTowerChallengeStatus(void);
+static void GetCurrentTime(void);
+static void ShowResultsBoard(void);
+static void CloseResultsBoard(void);
+static void TrainerTowerGetDoublesEligiblity(void);
+static void TrainerTowerGetNumFloors(void);
+static void ShouldWarpToCounter(void);
+static void PlayTrainerTowerEncounterMusic(void);
+static void HasSpokenToOwner(void);
static void BuildEnemyParty(void);
static s32 GetPartyMaxLevel(void);
static void ValidateOrResetCurTrainerTowerRecord(void);
static u32 GetTrainerTowerRecordTime(u32 *);
static void SetTrainerTowerRecordTime(u32 *, u32);
-extern const u8 gUnknown_83FE982[];
-extern const u8 gUnknown_83FE998[];
-extern const u8 *const gUnknown_83FE9C4[];
+extern const u8 gText_TimeBoard[];
+extern const u8 gText_XMinYZSec[];
+extern const u8 *const gTrainerTowerChallengeTypeTexts[];
static const struct SinglesTrainerInfo sSingleBattleTrainerInfo[] = {
- {OBJECT_EVENT_GFX_WOMAN_2, FACILITY_CLASS_AROMA_LADY, FEMALE},
- {OBJECT_EVENT_GFX_HIKER, FACILITY_CLASS_RUIN_MANIAC, MALE},
- {OBJECT_EVENT_GFX_TUBER_F, FACILITY_CLASS_TUBER, FEMALE},
- {OBJECT_EVENT_GFX_TUBER_M_2, FACILITY_CLASS_TUBER_2, MALE},
- {OBJECT_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_COOLTRAINER, MALE},
- {OBJECT_EVENT_GFX_COOLTRAINER_F, FACILITY_CLASS_COOLTRAINER_2, FEMALE},
- {OBJECT_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_HEX_MANIAC, MALE},
- {OBJECT_EVENT_GFX_WOMAN_2, FACILITY_CLASS_LADY, FEMALE},
- {OBJECT_EVENT_GFX_BEAUTY, FACILITY_CLASS_BEAUTY, FEMALE},
- {OBJECT_EVENT_GFX_BOY, FACILITY_CLASS_RICH_BOY, MALE},
- {OBJECT_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_POKEMANIAC, MALE},
- {OBJECT_EVENT_GFX_SWIMMER_M_LAND, FACILITY_CLASS_SWIMMER_MALE, MALE},
- {OBJECT_EVENT_GFX_BLACKBELT, FACILITY_CLASS_BLACK_BELT, MALE},
- {OBJECT_EVENT_GFX_ROCKER, FACILITY_CLASS_GUITARIST, MALE},
- {OBJECT_EVENT_GFX_ROCKER, FACILITY_CLASS_KINDLER, MALE},
- {OBJECT_EVENT_GFX_CAMPER, FACILITY_CLASS_CAMPER, MALE},
- {OBJECT_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_BUG_MANIAC, MALE},
- {OBJECT_EVENT_GFX_BOY, FACILITY_CLASS_PSYCHIC, MALE},
- {OBJECT_EVENT_GFX_WOMAN_1, FACILITY_CLASS_PSYCHIC_2, FEMALE},
- {OBJECT_EVENT_GFX_GENTLEMAN, FACILITY_CLASS_GENTLEMAN, MALE},
- {OBJECT_EVENT_GFX_BOY, FACILITY_CLASS_SCHOOL_KID, MALE},
- {OBJECT_EVENT_GFX_WOMAN_1, FACILITY_CLASS_SCHOOL_KID_2, FEMALE},
- {OBJECT_EVENT_GFX_BALDING_MAN, FACILITY_CLASS_POKEFAN, MALE},
- {OBJECT_EVENT_GFX_WOMAN_3, FACILITY_CLASS_POKEFAN_2, FEMALE},
- {OBJECT_EVENT_GFX_OLD_MAN_1, FACILITY_CLASS_EXPERT, MALE},
- {OBJECT_EVENT_GFX_OLD_WOMAN, FACILITY_CLASS_EXPERT_2, FEMALE},
- {OBJECT_EVENT_GFX_YOUNGSTER, FACILITY_CLASS_YOUNGSTER, MALE},
- {OBJECT_EVENT_GFX_FISHER, FACILITY_CLASS_FISHERMAN, MALE},
- {OBJECT_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_DRAGON_TAMER, MALE},
- {OBJECT_EVENT_GFX_ROCKER, FACILITY_CLASS_BIRD_KEEPER, MALE},
- {OBJECT_EVENT_GFX_LITTLE_BOY, FACILITY_CLASS_NINJA_BOY, MALE},
- {OBJECT_EVENT_GFX_BATTLE_GIRL, FACILITY_CLASS_BATTLE_GIRL, FEMALE},
- {OBJECT_EVENT_GFX_BEAUTY, FACILITY_CLASS_PARASOL_LADY, FEMALE},
- {OBJECT_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_SWIMMER_FEMALE, FEMALE},
- {OBJECT_EVENT_GFX_PICNICKER, FACILITY_CLASS_PICNICKER, FEMALE},
- {OBJECT_EVENT_GFX_SAILOR, FACILITY_CLASS_SAILOR, MALE},
- {OBJECT_EVENT_GFX_FAT_MAN, FACILITY_CLASS_COLLECTOR, MALE},
- {OBJECT_EVENT_GFX_MAN, FACILITY_CLASS_PKMN_BREEDER, MALE},
- {OBJECT_EVENT_GFX_WOMAN_2, FACILITY_CLASS_PKMN_BREEDER_2, FEMALE},
- {OBJECT_EVENT_GFX_CAMPER, FACILITY_CLASS_PKMN_RANGER, MALE},
- {OBJECT_EVENT_GFX_PICNICKER, FACILITY_CLASS_PKMN_RANGER_2, FEMALE},
- {OBJECT_EVENT_GFX_LASS, FACILITY_CLASS_LASS, FEMALE},
- {OBJECT_EVENT_GFX_BUG_CATCHER, FACILITY_CLASS_BUG_CATCHER, MALE},
- {OBJECT_EVENT_GFX_HIKER, FACILITY_CLASS_HIKER, MALE},
- {OBJECT_EVENT_GFX_YOUNGSTER, FACILITY_CLASS_YOUNGSTER_2, MALE},
- {OBJECT_EVENT_GFX_BUG_CATCHER, FACILITY_CLASS_BUG_CATCHER_2, MALE},
- {OBJECT_EVENT_GFX_LASS, FACILITY_CLASS_LASS_2, FEMALE},
- {OBJECT_EVENT_GFX_SAILOR, FACILITY_CLASS_SAILOR_2, MALE},
- {OBJECT_EVENT_GFX_CAMPER, FACILITY_CLASS_CAMPER_2, MALE},
- {OBJECT_EVENT_GFX_PICNICKER, FACILITY_CLASS_PICNICKER_2, FEMALE},
- {OBJECT_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_POKEMANIAC_2, MALE},
- {OBJECT_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_SUPER_NERD, MALE},
- {OBJECT_EVENT_GFX_HIKER, FACILITY_CLASS_HIKER_2, MALE},
- {OBJECT_EVENT_GFX_BIKER, FACILITY_CLASS_BIKER, MALE},
- {OBJECT_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_BURGLAR, MALE},
- {OBJECT_EVENT_GFX_BALDING_MAN, FACILITY_CLASS_ENGINEER, MALE},
- {OBJECT_EVENT_GFX_FISHER, FACILITY_CLASS_FISHERMAN_2, MALE},
- {OBJECT_EVENT_GFX_SWIMMER_M_LAND, FACILITY_CLASS_SWIMMER_MALE_2, MALE},
- {OBJECT_EVENT_GFX_BIKER, FACILITY_CLASS_CUE_BALL, MALE},
- {OBJECT_EVENT_GFX_OLD_MAN_1, FACILITY_CLASS_GAMER, MALE},
- {OBJECT_EVENT_GFX_BEAUTY, FACILITY_CLASS_BEAUTY_2, FEMALE},
- {OBJECT_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_SWIMMER_FEMALE_2, FEMALE},
- {OBJECT_EVENT_GFX_BOY, FACILITY_CLASS_PSYCHIC_3, MALE},
- {OBJECT_EVENT_GFX_ROCKER, FACILITY_CLASS_ROCKER, MALE},
- {OBJECT_EVENT_GFX_ROCKER, FACILITY_CLASS_JUGGLER, MALE},
- {OBJECT_EVENT_GFX_MAN, FACILITY_CLASS_TAMER, MALE},
- {OBJECT_EVENT_GFX_ROCKER, FACILITY_CLASS_BIRD_KEEPER_2, MALE},
- {OBJECT_EVENT_GFX_BLACKBELT, FACILITY_CLASS_BLACK_BELT_2, MALE},
- {OBJECT_EVENT_GFX_SCIENTIST, FACILITY_CLASS_SCIENTIST, MALE},
- {OBJECT_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_COOLTRAINER_3, MALE},
- {OBJECT_EVENT_GFX_COOLTRAINER_F, FACILITY_CLASS_COOLTRAINER_4, FEMALE},
- {OBJECT_EVENT_GFX_GENTLEMAN, FACILITY_CLASS_GENTLEMAN_2, MALE},
- {OBJECT_EVENT_GFX_CHANNELER, FACILITY_CLASS_CHANNELER, FEMALE},
- {OBJECT_EVENT_GFX_WOMAN_1, FACILITY_CLASS_PSYCHIC_4, FEMALE},
- {OBJECT_EVENT_GFX_BATTLE_GIRL, FACILITY_CLASS_CRUSH_GIRL, FEMALE},
- {OBJECT_EVENT_GFX_TUBER_F, FACILITY_CLASS_TUBER_3, FEMALE},
- {OBJECT_EVENT_GFX_WOMAN_2, FACILITY_CLASS_PKMN_BREEDER_3, FEMALE},
- {OBJECT_EVENT_GFX_CAMPER, FACILITY_CLASS_PKMN_RANGER_3, MALE},
- {OBJECT_EVENT_GFX_PICNICKER, FACILITY_CLASS_PKMN_RANGER_4, FEMALE},
- {OBJECT_EVENT_GFX_WOMAN_2, FACILITY_CLASS_AROMA_LADY_2, FEMALE},
- {OBJECT_EVENT_GFX_HIKER, FACILITY_CLASS_RUIN_MANIAC_2, MALE},
- {OBJECT_EVENT_GFX_WOMAN_2, FACILITY_CLASS_LADY_2, FEMALE},
- {OBJECT_EVENT_GFX_LASS, FACILITY_CLASS_PAINTER, FEMALE}
+ {OBJ_EVENT_GFX_WOMAN_2, FACILITY_CLASS_AROMA_LADY, FEMALE},
+ {OBJ_EVENT_GFX_HIKER, FACILITY_CLASS_RUIN_MANIAC, MALE},
+ {OBJ_EVENT_GFX_TUBER_F, FACILITY_CLASS_TUBER, FEMALE},
+ {OBJ_EVENT_GFX_TUBER_M_2, FACILITY_CLASS_TUBER_2, MALE},
+ {OBJ_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_COOLTRAINER, MALE},
+ {OBJ_EVENT_GFX_COOLTRAINER_F, FACILITY_CLASS_COOLTRAINER_2, FEMALE},
+ {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_HEX_MANIAC, MALE},
+ {OBJ_EVENT_GFX_WOMAN_2, FACILITY_CLASS_LADY, FEMALE},
+ {OBJ_EVENT_GFX_BEAUTY, FACILITY_CLASS_BEAUTY, FEMALE},
+ {OBJ_EVENT_GFX_BOY, FACILITY_CLASS_RICH_BOY, MALE},
+ {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_POKEMANIAC, MALE},
+ {OBJ_EVENT_GFX_SWIMMER_M_LAND, FACILITY_CLASS_SWIMMER_MALE, MALE},
+ {OBJ_EVENT_GFX_BLACKBELT, FACILITY_CLASS_BLACK_BELT, MALE},
+ {OBJ_EVENT_GFX_ROCKER, FACILITY_CLASS_GUITARIST, MALE},
+ {OBJ_EVENT_GFX_ROCKER, FACILITY_CLASS_KINDLER, MALE},
+ {OBJ_EVENT_GFX_CAMPER, FACILITY_CLASS_CAMPER, MALE},
+ {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_BUG_MANIAC, MALE},
+ {OBJ_EVENT_GFX_BOY, FACILITY_CLASS_PSYCHIC, MALE},
+ {OBJ_EVENT_GFX_WOMAN_1, FACILITY_CLASS_PSYCHIC_2, FEMALE},
+ {OBJ_EVENT_GFX_GENTLEMAN, FACILITY_CLASS_GENTLEMAN, MALE},
+ {OBJ_EVENT_GFX_BOY, FACILITY_CLASS_SCHOOL_KID, MALE},
+ {OBJ_EVENT_GFX_WOMAN_1, FACILITY_CLASS_SCHOOL_KID_2, FEMALE},
+ {OBJ_EVENT_GFX_BALDING_MAN, FACILITY_CLASS_POKEFAN, MALE},
+ {OBJ_EVENT_GFX_WOMAN_3, FACILITY_CLASS_POKEFAN_2, FEMALE},
+ {OBJ_EVENT_GFX_OLD_MAN_1, FACILITY_CLASS_EXPERT, MALE},
+ {OBJ_EVENT_GFX_OLD_WOMAN, FACILITY_CLASS_EXPERT_2, FEMALE},
+ {OBJ_EVENT_GFX_YOUNGSTER, FACILITY_CLASS_YOUNGSTER, MALE},
+ {OBJ_EVENT_GFX_FISHER, FACILITY_CLASS_FISHERMAN, MALE},
+ {OBJ_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_DRAGON_TAMER, MALE},
+ {OBJ_EVENT_GFX_ROCKER, FACILITY_CLASS_BIRD_KEEPER, MALE},
+ {OBJ_EVENT_GFX_LITTLE_BOY, FACILITY_CLASS_NINJA_BOY, MALE},
+ {OBJ_EVENT_GFX_BATTLE_GIRL, FACILITY_CLASS_BATTLE_GIRL, FEMALE},
+ {OBJ_EVENT_GFX_BEAUTY, FACILITY_CLASS_PARASOL_LADY, FEMALE},
+ {OBJ_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_SWIMMER_FEMALE, FEMALE},
+ {OBJ_EVENT_GFX_PICNICKER, FACILITY_CLASS_PICNICKER, FEMALE},
+ {OBJ_EVENT_GFX_SAILOR, FACILITY_CLASS_SAILOR, MALE},
+ {OBJ_EVENT_GFX_FAT_MAN, FACILITY_CLASS_COLLECTOR, MALE},
+ {OBJ_EVENT_GFX_MAN, FACILITY_CLASS_PKMN_BREEDER, MALE},
+ {OBJ_EVENT_GFX_WOMAN_2, FACILITY_CLASS_PKMN_BREEDER_2, FEMALE},
+ {OBJ_EVENT_GFX_CAMPER, FACILITY_CLASS_PKMN_RANGER, MALE},
+ {OBJ_EVENT_GFX_PICNICKER, FACILITY_CLASS_PKMN_RANGER_2, FEMALE},
+ {OBJ_EVENT_GFX_LASS, FACILITY_CLASS_LASS, FEMALE},
+ {OBJ_EVENT_GFX_BUG_CATCHER, FACILITY_CLASS_BUG_CATCHER, MALE},
+ {OBJ_EVENT_GFX_HIKER, FACILITY_CLASS_HIKER, MALE},
+ {OBJ_EVENT_GFX_YOUNGSTER, FACILITY_CLASS_YOUNGSTER_2, MALE},
+ {OBJ_EVENT_GFX_BUG_CATCHER, FACILITY_CLASS_BUG_CATCHER_2, MALE},
+ {OBJ_EVENT_GFX_LASS, FACILITY_CLASS_LASS_2, FEMALE},
+ {OBJ_EVENT_GFX_SAILOR, FACILITY_CLASS_SAILOR_2, MALE},
+ {OBJ_EVENT_GFX_CAMPER, FACILITY_CLASS_CAMPER_2, MALE},
+ {OBJ_EVENT_GFX_PICNICKER, FACILITY_CLASS_PICNICKER_2, FEMALE},
+ {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_POKEMANIAC_2, MALE},
+ {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_SUPER_NERD, MALE},
+ {OBJ_EVENT_GFX_HIKER, FACILITY_CLASS_HIKER_2, MALE},
+ {OBJ_EVENT_GFX_BIKER, FACILITY_CLASS_BIKER, MALE},
+ {OBJ_EVENT_GFX_SUPER_NERD, FACILITY_CLASS_BURGLAR, MALE},
+ {OBJ_EVENT_GFX_BALDING_MAN, FACILITY_CLASS_ENGINEER, MALE},
+ {OBJ_EVENT_GFX_FISHER, FACILITY_CLASS_FISHERMAN_2, MALE},
+ {OBJ_EVENT_GFX_SWIMMER_M_LAND, FACILITY_CLASS_SWIMMER_MALE_2, MALE},
+ {OBJ_EVENT_GFX_BIKER, FACILITY_CLASS_CUE_BALL, MALE},
+ {OBJ_EVENT_GFX_OLD_MAN_1, FACILITY_CLASS_GAMER, MALE},
+ {OBJ_EVENT_GFX_BEAUTY, FACILITY_CLASS_BEAUTY_2, FEMALE},
+ {OBJ_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_SWIMMER_FEMALE_2, FEMALE},
+ {OBJ_EVENT_GFX_BOY, FACILITY_CLASS_PSYCHIC_3, MALE},
+ {OBJ_EVENT_GFX_ROCKER, FACILITY_CLASS_ROCKER, MALE},
+ {OBJ_EVENT_GFX_ROCKER, FACILITY_CLASS_JUGGLER, MALE},
+ {OBJ_EVENT_GFX_MAN, FACILITY_CLASS_TAMER, MALE},
+ {OBJ_EVENT_GFX_ROCKER, FACILITY_CLASS_BIRD_KEEPER_2, MALE},
+ {OBJ_EVENT_GFX_BLACKBELT, FACILITY_CLASS_BLACK_BELT_2, MALE},
+ {OBJ_EVENT_GFX_SCIENTIST, FACILITY_CLASS_SCIENTIST, MALE},
+ {OBJ_EVENT_GFX_COOLTRAINER_M, FACILITY_CLASS_COOLTRAINER_3, MALE},
+ {OBJ_EVENT_GFX_COOLTRAINER_F, FACILITY_CLASS_COOLTRAINER_4, FEMALE},
+ {OBJ_EVENT_GFX_GENTLEMAN, FACILITY_CLASS_GENTLEMAN_2, MALE},
+ {OBJ_EVENT_GFX_CHANNELER, FACILITY_CLASS_CHANNELER, FEMALE},
+ {OBJ_EVENT_GFX_WOMAN_1, FACILITY_CLASS_PSYCHIC_4, FEMALE},
+ {OBJ_EVENT_GFX_BATTLE_GIRL, FACILITY_CLASS_CRUSH_GIRL, FEMALE},
+ {OBJ_EVENT_GFX_TUBER_F, FACILITY_CLASS_TUBER_3, FEMALE},
+ {OBJ_EVENT_GFX_WOMAN_2, FACILITY_CLASS_PKMN_BREEDER_3, FEMALE},
+ {OBJ_EVENT_GFX_CAMPER, FACILITY_CLASS_PKMN_RANGER_3, MALE},
+ {OBJ_EVENT_GFX_PICNICKER, FACILITY_CLASS_PKMN_RANGER_4, FEMALE},
+ {OBJ_EVENT_GFX_WOMAN_2, FACILITY_CLASS_AROMA_LADY_2, FEMALE},
+ {OBJ_EVENT_GFX_HIKER, FACILITY_CLASS_RUIN_MANIAC_2, MALE},
+ {OBJ_EVENT_GFX_WOMAN_2, FACILITY_CLASS_LADY_2, FEMALE},
+ {OBJ_EVENT_GFX_LASS, FACILITY_CLASS_PAINTER, FEMALE}
};
static const struct DoublesTrainerInfo sDoubleBattleTrainerInfo[] = {
- {OBJECT_EVENT_GFX_BEAUTY, OBJECT_EVENT_GFX_WOMAN_1, FACILITY_CLASS_SR_AND_JR, FEMALE, FEMALE},
- {OBJECT_EVENT_GFX_LITTLE_GIRL, OBJECT_EVENT_GFX_LITTLE_GIRL, FACILITY_CLASS_TWINS, FEMALE, FEMALE},
- {OBJECT_EVENT_GFX_BEAUTY, OBJECT_EVENT_GFX_MAN, FACILITY_CLASS_YOUNG_COUPLE, FEMALE, MALE},
- {OBJECT_EVENT_GFX_OLD_MAN_1, OBJECT_EVENT_GFX_OLD_WOMAN, FACILITY_CLASS_OLD_COUPLE, MALE, FEMALE},
- {OBJECT_EVENT_GFX_TUBER_M_2, OBJECT_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_SIS_AND_BRO, MALE, FEMALE},
- {OBJECT_EVENT_GFX_LITTLE_GIRL, OBJECT_EVENT_GFX_LITTLE_GIRL, FACILITY_CLASS_TWINS_2, FEMALE, FEMALE},
- {OBJECT_EVENT_GFX_COOLTRAINER_M, OBJECT_EVENT_GFX_COOLTRAINER_F, FACILITY_CLASS_COOL_COUPLE, MALE, FEMALE},
- {OBJECT_EVENT_GFX_BEAUTY, OBJECT_EVENT_GFX_MAN, FACILITY_CLASS_YOUNG_COUPLE_2, FEMALE, MALE},
- {OBJECT_EVENT_GFX_BATTLE_GIRL, OBJECT_EVENT_GFX_BLACKBELT, FACILITY_CLASS_CRUSH_KIN, FEMALE, MALE},
- {OBJECT_EVENT_GFX_SWIMMER_F_LAND, OBJECT_EVENT_GFX_TUBER_M_2, FACILITY_CLASS_SIS_AND_BRO_2, FEMALE, MALE}
+ {OBJ_EVENT_GFX_BEAUTY, OBJ_EVENT_GFX_WOMAN_1, FACILITY_CLASS_SR_AND_JR, FEMALE, FEMALE},
+ {OBJ_EVENT_GFX_LITTLE_GIRL, OBJ_EVENT_GFX_LITTLE_GIRL, FACILITY_CLASS_TWINS, FEMALE, FEMALE},
+ {OBJ_EVENT_GFX_BEAUTY, OBJ_EVENT_GFX_MAN, FACILITY_CLASS_YOUNG_COUPLE, FEMALE, MALE},
+ {OBJ_EVENT_GFX_OLD_MAN_1, OBJ_EVENT_GFX_OLD_WOMAN, FACILITY_CLASS_OLD_COUPLE, MALE, FEMALE},
+ {OBJ_EVENT_GFX_TUBER_M_2, OBJ_EVENT_GFX_SWIMMER_F_LAND, FACILITY_CLASS_SIS_AND_BRO, MALE, FEMALE},
+ {OBJ_EVENT_GFX_LITTLE_GIRL, OBJ_EVENT_GFX_LITTLE_GIRL, FACILITY_CLASS_TWINS_2, FEMALE, FEMALE},
+ {OBJ_EVENT_GFX_COOLTRAINER_M, OBJ_EVENT_GFX_COOLTRAINER_F, FACILITY_CLASS_COOL_COUPLE, MALE, FEMALE},
+ {OBJ_EVENT_GFX_BEAUTY, OBJ_EVENT_GFX_MAN, FACILITY_CLASS_YOUNG_COUPLE_2, FEMALE, MALE},
+ {OBJ_EVENT_GFX_BATTLE_GIRL, OBJ_EVENT_GFX_BLACKBELT, FACILITY_CLASS_CRUSH_KIN, FEMALE, MALE},
+ {OBJ_EVENT_GFX_SWIMMER_F_LAND, OBJ_EVENT_GFX_TUBER_M_2, FACILITY_CLASS_SIS_AND_BRO_2, FEMALE, MALE}
};
static const struct TrainerEncounterMusicPairs sTrainerEncounterMusicLUT[105] = {
@@ -319,51 +318,52 @@ static const struct TrainerEncounterMusicPairs sTrainerEncounterMusicLUT[105] =
{FACILITY_CLASS_ELITE_FOUR_2, TRAINER_ENCOUNTER_MUSIC_MALE}
};
-static const struct WindowTemplate gUnknown_847A218[] = {
+static const struct WindowTemplate sTimeBoardWindowTemplate[] = {
{0, 3, 1, 27, 18, 15, 0x001},
DUMMY_WIN_TEMPLATE
};
-static const u32 gUnknown_847A228 = 0x70; // unused
-
-static const u8 gUnknown_847A22C[3] = {0, 2, 3};
-
-static void (*const gUnknown_847A230[])(void) = {
- sub_815DD44,
- sub_815DF54,
- sub_815E160,
- sub_815E1C0,
- sub_815E1F0,
- TTSpecial_HasReachedTheRoof,
- sub_815E28C,
- sub_815E394,
- sub_815E408,
- sub_815E4B0,
- TTSpecial_StartTimer,
- sub_815E5C4,
- sub_815E5F0,
- sub_815E658,
- sub_815E720,
- sub_815E88C,
- sub_815E8B4,
- sub_815E8CC,
- sub_815E908,
- sub_815E948,
- sub_815E9C8
+static const u32 sUnused_847A228 = 0x70;
+
+static const u8 sTextColors[3] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY};
+
+static void (*const sTrainerTowerFunctions[])(void) = {
+ [TRAINER_TOWER_FUNC_INIT_FLOOR] = InitTrainerTowerFloor,
+ [TRAINER_TOWER_FUNC_GET_SPEECH] = BufferTowerOpponentSpeech,
+ [TRAINER_TOWER_FUNC_DO_BATTLE] = DoTrainerTowerBattle,
+ [TRAINER_TOWER_FUNC_GET_CHALLENGE_TYPE] = TrainerTowerGetChallengeType,
+ [TRAINER_TOWER_FUNC_CLEARED_FLOOR] = TrainerTowerAddFloorCleared,
+ [TRAINER_TOWER_FUNC_GET_FLOOR_CLEARED] = GetFloorAlreadyCleared,
+ [TRAINER_TOWER_FUNC_START_CHALLENGE] = StartTrainerTowerChallenge,
+ [TRAINER_TOWER_FUNC_GET_OWNER_STATE] = GetOwnerState,
+ [TRAINER_TOWER_FUNC_GIVE_PRIZE] = GiveChallengePrize,
+ [TRAINER_TOWER_FUNC_CHECK_FINAL_TIME] = CheckFinalTime,
+ [TRAINER_TOWER_FUNC_RESUME_TIMER] = TrainerTowerResumeTimer,
+ [TRAINER_TOWER_FUNC_SET_LOST] = TrainerTowerSetPlayerLost,
+ [TRAINER_TOWER_FUNC_GET_CHALLENGE_STATUS] = GetTrainerTowerChallengeStatus,
+ [TRAINER_TOWER_FUNC_GET_TIME] = GetCurrentTime,
+ [TRAINER_TOWER_FUNC_SHOW_RESULTS] = ShowResultsBoard,
+ [TRAINER_TOWER_FUNC_CLOSE_RESULTS] = CloseResultsBoard,
+ [TRAINER_TOWER_FUNC_CHECK_DOUBLES] = TrainerTowerGetDoublesEligiblity,
+ [TRAINER_TOWER_FUNC_GET_NUM_FLOORS] = TrainerTowerGetNumFloors,
+ [TRAINER_TOWER_FUNC_SHOULD_WARP_TO_COUNTER] = ShouldWarpToCounter,
+ [TRAINER_TOWER_FUNC_ENCOUNTER_MUSIC] = PlayTrainerTowerEncounterMusic,
+ [TRAINER_TOWER_FUNC_GET_BEAT_CHALLENGE] = HasSpokenToOwner
};
-static const u16 sFloorLayouts[8][3] = {
- {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_1F, LAYOUT_UNUSED_LAYOUT_834BC2C, LAYOUT_UNUSED_LAYOUT_834D06C},
- {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_2F, LAYOUT_UNUSED_LAYOUT_834BEB4, LAYOUT_UNUSED_LAYOUT_834D2F4},
- {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_3F, LAYOUT_UNUSED_LAYOUT_834C13C, LAYOUT_UNUSED_LAYOUT_834D57C},
- {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_4F, LAYOUT_UNUSED_LAYOUT_834C3C4, LAYOUT_UNUSED_LAYOUT_834D804},
- {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_5F, LAYOUT_UNUSED_LAYOUT_834C64C, LAYOUT_UNUSED_LAYOUT_834DA8C},
- {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_6F, LAYOUT_UNUSED_LAYOUT_834C8D4, LAYOUT_UNUSED_LAYOUT_834DD14},
- {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_7F, LAYOUT_UNUSED_LAYOUT_834CB5C, LAYOUT_UNUSED_LAYOUT_834DF9C},
- {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_8F, LAYOUT_UNUSED_LAYOUT_834CDE4, LAYOUT_UNUSED_LAYOUT_834E224}
+// - 1 excludes Mixed challenge, which just uses one of the 3 other types
+static const u16 sFloorLayouts[MAX_TRAINER_TOWER_FLOORS][NUM_TOWER_CHALLENGE_TYPES - 1] = {
+ {LAYOUT_TRAINER_TOWER_1F, LAYOUT_TRAINER_TOWER_1F_DOUBLES, LAYOUT_TRAINER_TOWER_1F_KNOCKOUT},
+ {LAYOUT_TRAINER_TOWER_2F, LAYOUT_TRAINER_TOWER_2F_DOUBLES, LAYOUT_TRAINER_TOWER_2F_KNOCKOUT},
+ {LAYOUT_TRAINER_TOWER_3F, LAYOUT_TRAINER_TOWER_3F_DOUBLES, LAYOUT_TRAINER_TOWER_3F_KNOCKOUT},
+ {LAYOUT_TRAINER_TOWER_4F, LAYOUT_TRAINER_TOWER_4F_DOUBLES, LAYOUT_TRAINER_TOWER_4F_KNOCKOUT},
+ {LAYOUT_TRAINER_TOWER_5F, LAYOUT_TRAINER_TOWER_5F_DOUBLES, LAYOUT_TRAINER_TOWER_5F_KNOCKOUT},
+ {LAYOUT_TRAINER_TOWER_6F, LAYOUT_TRAINER_TOWER_6F_DOUBLES, LAYOUT_TRAINER_TOWER_6F_KNOCKOUT},
+ {LAYOUT_TRAINER_TOWER_7F, LAYOUT_TRAINER_TOWER_7F_DOUBLES, LAYOUT_TRAINER_TOWER_7F_KNOCKOUT},
+ {LAYOUT_TRAINER_TOWER_8F, LAYOUT_TRAINER_TOWER_8F_DOUBLES, LAYOUT_TRAINER_TOWER_8F_KNOCKOUT}
};
-static const u16 gUnknown_847A2B4[] = {
+static const u16 sPrizeList[] = {
ITEM_HP_UP,
ITEM_PROTEIN,
ITEM_IRON,
@@ -381,21 +381,21 @@ static const u16 gUnknown_847A2B4[] = {
ITEM_UP_GRADE
};
-static const u16 gUnknown_847A2D2[] = {
- MUS_SHOUNEN,
- MUS_SHOUJO,
- MUS_SHOUJO,
- MUS_ROCKET,
- MUS_SHOUNEN,
- MUS_SHOUNEN,
- MUS_ROCKET,
- MUS_ROCKET,
- MUS_SHOUNEN,
- MUS_SHOUJO,
- MUS_SHOUNEN,
- MUS_SHOUNEN,
- MUS_SHOUNEN,
- MUS_SHOUNEN
+static const u16 sTrainerTowerEncounterMusic[] = {
+ [TRAINER_ENCOUNTER_MUSIC_MALE] = MUS_SHOUNEN,
+ [TRAINER_ENCOUNTER_MUSIC_FEMALE] = MUS_SHOUJO,
+ [TRAINER_ENCOUNTER_MUSIC_GIRL] = MUS_SHOUJO,
+ [TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS] = MUS_ROCKET,
+ [TRAINER_ENCOUNTER_MUSIC_INTENSE] = MUS_SHOUNEN,
+ [TRAINER_ENCOUNTER_MUSIC_COOL] = MUS_SHOUNEN,
+ [TRAINER_ENCOUNTER_MUSIC_AQUA] = MUS_ROCKET,
+ [TRAINER_ENCOUNTER_MUSIC_MAGMA] = MUS_ROCKET,
+ [TRAINER_ENCOUNTER_MUSIC_SWIMMER] = MUS_SHOUNEN,
+ [TRAINER_ENCOUNTER_MUSIC_TWINS] = MUS_SHOUJO,
+ [TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR] = MUS_SHOUNEN,
+ [TRAINER_ENCOUNTER_MUSIC_HIKER] = MUS_SHOUNEN,
+ [TRAINER_ENCOUNTER_MUSIC_INTERVIEWER] = MUS_SHOUNEN,
+ [TRAINER_ENCOUNTER_MUSIC_RICH] = MUS_SHOUNEN
};
static const u8 sSingleBattleChallengeMonIdxs[][2] = {
@@ -431,22 +431,22 @@ static const u8 sKnockoutChallengeMonIdxs[][3] = {
{0x01, 0x04, 0x05}
};
-extern const struct EReaderTrainerHillSetSubstruct gUnknown_84827AC;
-extern const struct TrainerTowerFloor *const gUnknown_84827B4[][8];
+extern const struct EReaderTrainerTowerSetSubstruct gUnknown_84827AC;
+extern const struct TrainerTowerFloor *const gUnknown_84827B4[][MAX_TRAINER_TOWER_FLOORS];
-void sub_815D9E8(void)
+void CallTrainerTowerFunc(void)
{
- sub_815DC8C();
- gUnknown_847A230[gSpecialVar_0x8004]();
- sub_815DD2C();
+ SetUpTrainerTowerDataStruct();
+ sTrainerTowerFunctions[gSpecialVar_0x8004]();
+ FreeTrainerTowerDataStruct();
}
-u8 sub_815DA10(void)
+u8 GetTrainerTowerOpponentClass(void)
{
return gFacilityClassToTrainerClass[sTrainerTowerOpponent->facilityClass];
}
-void sub_815DA28(u8 *dest)
+void GetTrainerTowerOpponentName(u8 *dest)
{
StringCopyN(dest, sTrainerTowerOpponent->name, 11);
}
@@ -458,41 +458,39 @@ u8 GetTrainerTowerTrainerFrontSpriteId(void)
void InitTrainerTowerBattleStruct(void)
{
- u16 r10;
- s32 r9;
+ u16 trainerId;
+ int i;
- sub_815DC8C();
+ SetUpTrainerTowerDataStruct();
sTrainerTowerOpponent = AllocZeroed(sizeof(*sTrainerTowerOpponent));
- r10 = VarGet(VAR_TEMP_1);
- StringCopyN(sTrainerTowerOpponent->name, sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10].name, 11);
+ trainerId = VarGet(VAR_TEMP_1);
+ StringCopyN(sTrainerTowerOpponent->name, CURR_FLOOR.trainers[trainerId].name, 11);
- for (r9 = 0; r9 < 6; r9++)
+ for (i = 0; i < 6; i++)
{
- sTrainerTowerOpponent->speechWin[r9] = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10].speechWin[r9];
- sTrainerTowerOpponent->speechLose[r9] = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10].speechLose[r9];
+ sTrainerTowerOpponent->speechWin[i] = CURR_FLOOR.trainers[trainerId].speechWin[i];
+ sTrainerTowerOpponent->speechLose[i] = CURR_FLOOR.trainers[trainerId].speechLose[i];
- if (sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType == 1)
+ if (CURR_FLOOR.challengeType == CHALLENGE_TYPE_DOUBLE)
{
- sTrainerTowerOpponent->speechWin2[r9] = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10 + 1].speechWin[r9];
- sTrainerTowerOpponent->speechLose2[r9] = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10 + 1].speechLose[r9];
+ sTrainerTowerOpponent->speechWin2[i] = CURR_FLOOR.trainers[trainerId + 1].speechWin[i];
+ sTrainerTowerOpponent->speechLose2[i] = CURR_FLOOR.trainers[trainerId + 1].speechLose[i];
}
}
- sTrainerTowerOpponent->battleType = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType;
- sTrainerTowerOpponent->facilityClass = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10].facilityClass;
- sTrainerTowerOpponent->gender = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10].gender;
- SetVBlankCounter1Ptr(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0);
- sub_815DD2C();
+ sTrainerTowerOpponent->battleType = CURR_FLOOR.challengeType;
+ sTrainerTowerOpponent->facilityClass = CURR_FLOOR.trainers[trainerId].facilityClass;
+ sTrainerTowerOpponent->gender = CURR_FLOOR.trainers[trainerId].gender;
+ SetVBlankCounter1Ptr(&TRAINER_TOWER.timer);
+ FreeTrainerTowerDataStruct();
}
void FreeTrainerTowerBattleStruct(void)
{
- Free(sTrainerTowerOpponent);
- sTrainerTowerOpponent = NULL;
+ FREE_AND_SET_NULL(sTrainerTowerOpponent);
}
-void sub_815DBF4(u8 *dest, u8 opponentIdx)
-// TTower_GetBeforeBattleMessage?
+void GetTrainerTowerOpponentWinText(u8 *dest, u8 opponentIdx)
{
VarSet(VAR_TEMP_3, opponentIdx);
TrainerTowerGetOpponentTextColor(sTrainerTowerOpponent->battleType, sTrainerTowerOpponent->facilityClass);
@@ -502,8 +500,7 @@ void sub_815DBF4(u8 *dest, u8 opponentIdx)
TT_ConvertEasyChatMessageToString(sTrainerTowerOpponent->speechWin2, dest);
}
-void sub_815DC40(u8 *dest, u8 opponentIdx)
-// TTower_GetAfterBattleMessage?
+void GetTrainerTowerOpponentLoseText(u8 *dest, u8 opponentIdx)
{
VarSet(VAR_TEMP_3, opponentIdx);
TrainerTowerGetOpponentTextColor(sTrainerTowerOpponent->battleType, sTrainerTowerOpponent->facilityClass);
@@ -513,23 +510,23 @@ void sub_815DC40(u8 *dest, u8 opponentIdx)
TT_ConvertEasyChatMessageToString(sTrainerTowerOpponent->speechLose2, dest);
}
-static void sub_815DC8C(void) // fakematching
+static void SetUpTrainerTowerDataStruct(void) // fakematching
{
- u32 whichTimer = gSaveBlock1Ptr->unkArrayIdx;
+ u32 challengeType = gSaveBlock1Ptr->towerChallengeId;
s32 r4;
const struct TrainerTowerFloor *const * r7;
sTrainerTowerState = AllocZeroed(sizeof(*sTrainerTowerState));
sTrainerTowerState->floorIdx = gMapHeader.mapLayoutId - 42;
- if (sub_815D834() == TRUE)
+ if (ReadTrainerTowerAndValidate() == TRUE)
CEReaderTool_LoadTrainerTower(&sTrainerTowerState->unk_0004);
else
{
struct UnkStruct_203F458 * r0_ = sTrainerTowerState;
- const struct EReaderTrainerHillSetSubstruct * r1 = &gUnknown_84827AC;
- memcpy(&r0_->unk_0004, r1, sizeof(struct EReaderTrainerHillSetSubstruct));
- r7 = gUnknown_84827B4[whichTimer];
- for (r4 = 0; r4 < 8; r4++)
+ const struct EReaderTrainerTowerSetSubstruct * r1 = &gUnknown_84827AC;
+ memcpy(&r0_->unk_0004, r1, sizeof(struct EReaderTrainerTowerSetSubstruct));
+ r7 = gUnknown_84827B4[challengeType];
+ for (r4 = 0; r4 < MAX_TRAINER_TOWER_FLOORS; r4++)
{
#ifndef NONMATCHING
void * r5;
@@ -547,22 +544,21 @@ static void sub_815DC8C(void) // fakematching
}
}
-static void sub_815DD2C(void)
+static void FreeTrainerTowerDataStruct(void)
{
- Free(sTrainerTowerState);
- sTrainerTowerState = NULL;
+ FREE_AND_SET_NULL(sTrainerTowerState);
}
-static void sub_815DD44(void)
+static void InitTrainerTowerFloor(void)
{
- if (gMapHeader.mapLayoutId - LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_LOBBY > sTrainerTowerState->unk_0004.count)
+ if (gMapHeader.mapLayoutId - LAYOUT_TRAINER_TOWER_LOBBY > sTrainerTowerState->unk_0004.numFloors)
{
- gSpecialVar_Result = 3;
- SetCurrentMapLayout(LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_ROOF);
+ gSpecialVar_Result = 3; // Skip past usable challenge types
+ SetCurrentMapLayout(LAYOUT_TRAINER_TOWER_ROOF);
}
else
{
- gSpecialVar_Result = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType;
+ gSpecialVar_Result = CURR_FLOOR.challengeType;
SetCurrentMapLayout(sFloorLayouts[sTrainerTowerState->floorIdx][gSpecialVar_Result]);
SetTrainerTowerNPCGraphics();
}
@@ -570,66 +566,70 @@ static void sub_815DD44(void)
static void SetTrainerTowerNPCGraphics(void)
{
- s32 r3, r4;
- u8 r1, r2, r4_;
- switch (sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType)
+ s32 i, j;
+ u8 trainerGfx1, trainerGfx2, facilityClass;
+ switch (CURR_FLOOR.challengeType)
{
- case 0:
- r2 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[0].facilityClass;
- for (r3 = 0; r3 < NELEMS(sSingleBattleTrainerInfo); r3++)
+ case CHALLENGE_TYPE_SINGLE:
+ facilityClass = CURR_FLOOR.trainers[0].facilityClass;
+ for (i = 0; i < NELEMS(sSingleBattleTrainerInfo); i++)
{
- if (sSingleBattleTrainerInfo[r3].facilityClass == r2)
+ if (sSingleBattleTrainerInfo[i].facilityClass == facilityClass)
break;
}
- if (r3 != NELEMS(sSingleBattleTrainerInfo))
- r1 = sSingleBattleTrainerInfo[r3].mapObjGfx;
+
+ if (i != NELEMS(sSingleBattleTrainerInfo))
+ trainerGfx1 = sSingleBattleTrainerInfo[i].objGfx;
else
- r1 = 18;
- VarSet(VAR_OBJ_GFX_ID_1, r1);
+ trainerGfx1 = OBJ_EVENT_GFX_YOUNGSTER;
+
+ VarSet(VAR_OBJ_GFX_ID_1, trainerGfx1);
break;
- case 1:
- r2 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[0].facilityClass;
- for (r3 = 0; r3 < NELEMS(sDoubleBattleTrainerInfo); r3++)
+ case CHALLENGE_TYPE_DOUBLE:
+ facilityClass = CURR_FLOOR.trainers[0].facilityClass;
+ for (i = 0; i < NELEMS(sDoubleBattleTrainerInfo); i++)
{
- if (sDoubleBattleTrainerInfo[r3].facilityClass == r2)
+ if (sDoubleBattleTrainerInfo[i].facilityClass == facilityClass)
break;
}
- if (r3 != NELEMS(sDoubleBattleTrainerInfo))
+ if (i != NELEMS(sDoubleBattleTrainerInfo))
{
- r1 = sDoubleBattleTrainerInfo[r3].mapObjGfx1;
- r4_ = sDoubleBattleTrainerInfo[r3].mapObjGfx2;
+ trainerGfx1 = sDoubleBattleTrainerInfo[i].objGfx1;
+ trainerGfx2 = sDoubleBattleTrainerInfo[i].objGfx2;
}
else
{
- r1 = OBJECT_EVENT_GFX_YOUNGSTER;
- r4_ = OBJECT_EVENT_GFX_YOUNGSTER;
+ trainerGfx1 = OBJ_EVENT_GFX_YOUNGSTER;
+ trainerGfx2 = OBJ_EVENT_GFX_YOUNGSTER;
}
- VarSet(VAR_OBJ_GFX_ID_0, r1);
- VarSet(VAR_OBJ_GFX_ID_3, r4_);
+ VarSet(VAR_OBJ_GFX_ID_0, trainerGfx1);
+ VarSet(VAR_OBJ_GFX_ID_3, trainerGfx2);
break;
- case 2:
- for (r4 = 0; r4 < 3; r4++)
+ case CHALLENGE_TYPE_KNOCKOUT:
+ for (j = 0; j < MAX_TRAINERS_PER_FLOOR; j++)
{
- r2 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].facilityClass;
- for (r3 = 0; r3 < NELEMS(sSingleBattleTrainerInfo); r3++)
+ facilityClass = CURR_FLOOR.trainers[j].facilityClass;
+ for (i = 0; i < NELEMS(sSingleBattleTrainerInfo); i++)
{
- if (sSingleBattleTrainerInfo[r3].facilityClass == r2)
+ if (sSingleBattleTrainerInfo[i].facilityClass == facilityClass)
break;
}
- if (r3 != NELEMS(sSingleBattleTrainerInfo))
- r1 = sSingleBattleTrainerInfo[r3].mapObjGfx;
+
+ if (i != NELEMS(sSingleBattleTrainerInfo))
+ trainerGfx1 = sSingleBattleTrainerInfo[i].objGfx;
else
- r1 = OBJECT_EVENT_GFX_YOUNGSTER;
- switch (r4)
+ trainerGfx1 = OBJ_EVENT_GFX_YOUNGSTER;
+
+ switch (j)
{
case 0:
- VarSet(VAR_OBJ_GFX_ID_2, r1);
+ VarSet(VAR_OBJ_GFX_ID_2, trainerGfx1);
break;
case 1:
- VarSet(VAR_OBJ_GFX_ID_0, r1);
+ VarSet(VAR_OBJ_GFX_ID_0, trainerGfx1);
break;
case 2:
- VarSet(VAR_OBJ_GFX_ID_1, r1);
+ VarSet(VAR_OBJ_GFX_ID_1, trainerGfx1);
break;
}
}
@@ -652,207 +652,224 @@ static void TT_ConvertEasyChatMessageToString(u16 *ecWords, u8 *dest)
}
}
-static void sub_815DF54(void)
+static void BufferTowerOpponentSpeech(void)
{
- u16 r4 = gSpecialVar_0x8006;
- u8 r1;
- u8 r5 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType;
+ u16 trainerId = gSpecialVar_0x8006;
+ u8 facilityClass;
+ u8 challengeType = CURR_FLOOR.challengeType;
- if (r5 != 1)
- r1 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].facilityClass;
+ if (challengeType != CHALLENGE_TYPE_DOUBLE)
+ facilityClass = CURR_FLOOR.trainers[trainerId].facilityClass;
else
- r1 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[0].facilityClass;
+ facilityClass = CURR_FLOOR.trainers[0].facilityClass;
+
switch (gSpecialVar_0x8005)
{
- case 2:
- TrainerTowerGetOpponentTextColor(r5, r1);
- TT_ConvertEasyChatMessageToString(sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].speechBefore, gStringVar4);
+ case TRAINER_TOWER_TEXT_INTRO:
+ TrainerTowerGetOpponentTextColor(challengeType, facilityClass);
+ TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechBefore, gStringVar4);
break;
- case 3:
- TrainerTowerGetOpponentTextColor(r5, r1);
- TT_ConvertEasyChatMessageToString(sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].speechWin, gStringVar4);
+ case TRAINER_TOWER_TEXT_PLAYER_LOST:
+ TrainerTowerGetOpponentTextColor(challengeType, facilityClass);
+ TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechWin, gStringVar4);
break;
- case 4:
- TrainerTowerGetOpponentTextColor(r5, r1);
- TT_ConvertEasyChatMessageToString(sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].speechLose, gStringVar4);
+ case TRAINER_TOWER_TEXT_PLAYER_WON:
+ TrainerTowerGetOpponentTextColor(challengeType, facilityClass);
+ TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechLose, gStringVar4);
break;
- case 5:
- TT_ConvertEasyChatMessageToString(sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].speechAfter, gStringVar4);
+ case TRAINER_TOWER_TEXT_AFTER:
+ TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechAfter, gStringVar4);
break;
}
}
-static void TrainerTowerGetOpponentTextColor(u8 battleType, u8 facilityClass)
+static void TrainerTowerGetOpponentTextColor(u8 challengeType, u8 facilityClass)
{
- u16 r5 = FALSE;
- s32 r4;
- switch (battleType)
+ u16 gender = MALE;
+ int i;
+ switch (challengeType)
{
- case 0:
- case 2:
- for (r4 = 0; r4 < NELEMS(sSingleBattleTrainerInfo); r4++)
+ case CHALLENGE_TYPE_SINGLE:
+ case CHALLENGE_TYPE_KNOCKOUT:
+ for (i = 0; i < NELEMS(sSingleBattleTrainerInfo); i++)
{
- if (sSingleBattleTrainerInfo[r4].facilityClass == facilityClass)
+ if (sSingleBattleTrainerInfo[i].facilityClass == facilityClass)
break;
}
- if (r4 != NELEMS(sSingleBattleTrainerInfo))
- r5 = sSingleBattleTrainerInfo[r4].gender;
+ if (i != NELEMS(sSingleBattleTrainerInfo))
+ gender = sSingleBattleTrainerInfo[i].gender;
break;
- case 1:
- for (r4 = 0; r4 < NELEMS(sDoubleBattleTrainerInfo); r4++)
+ case CHALLENGE_TYPE_DOUBLE:
+ for (i = 0; i < NELEMS(sDoubleBattleTrainerInfo); i++)
{
- if (sDoubleBattleTrainerInfo[r4].facilityClass == facilityClass)
+ if (sDoubleBattleTrainerInfo[i].facilityClass == facilityClass)
break;
}
- if (r4 != NELEMS(sDoubleBattleTrainerInfo))
+ if (i != NELEMS(sDoubleBattleTrainerInfo))
{
if (VarGet(VAR_TEMP_3))
- r5 = sDoubleBattleTrainerInfo[r4].gender2;
+ gender = sDoubleBattleTrainerInfo[i].gender2;
else
- r5 = sDoubleBattleTrainerInfo[r4].gender1;
+ gender = sDoubleBattleTrainerInfo[i].gender1;
}
break;
}
gSpecialVar_PrevTextColor = gSpecialVar_TextColor;
- gSpecialVar_TextColor = r5;
+ gSpecialVar_TextColor = gender;
}
-static void sub_815E114(void)
+static void CB2_EndTrainerTowerBattle(void)
{
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
-static void sub_815E124(u8 taskId)
+static void Task_DoTrainerTowerBattle(u8 taskId)
{
if (BT_IsDone() == TRUE)
{
- gMain.savedCallback = sub_815E114;
+ gMain.savedCallback = CB2_EndTrainerTowerBattle;
CleanupOverworldWindowsAndTilemaps();
SetMainCallback2(CB2_InitBattle);
DestroyTask(taskId);
}
}
-static void sub_815E160(void)
+static void DoTrainerTowerBattle(void)
{
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_TRAINER_TOWER;
- if (sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType == 1)
+
+ if (CURR_FLOOR.challengeType == CHALLENGE_TYPE_DOUBLE)
gBattleTypeFlags |= BATTLE_TYPE_DOUBLE;
+
gTrainerBattleOpponent_A = 0;
BuildEnemyParty();
- CreateTask(sub_815E124, 1);
+ CreateTask(Task_DoTrainerTowerBattle, 1);
PlayMapChosenOrBattleBGM(0);
BT_StartOnField(BattleSetup_GetBattleTowerBattleTransition());
}
-static void sub_815E1C0(void)
+static void TrainerTowerGetChallengeType(void)
{
if (!gSpecialVar_0x8005)
- gSpecialVar_Result = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType;
+ gSpecialVar_Result = CURR_FLOOR.challengeType;
}
-static void sub_815E1F0(void)
+static void TrainerTowerAddFloorCleared(void)
{
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk8++;
+ TRAINER_TOWER.floorsCleared++;
}
-static void TTSpecial_HasReachedTheRoof(void)
+// So the player can safely go back through defeated floors to use the Poke Center (or exit challenge)
+static void GetFloorAlreadyCleared(void)
{
u16 mapLayoutId = gMapHeader.mapLayoutId;
- if (mapLayoutId - LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_1F == gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk8 && mapLayoutId - LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_LOBBY <= sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].floorIdx)
+ if (mapLayoutId - LAYOUT_TRAINER_TOWER_1F == TRAINER_TOWER.floorsCleared
+ && mapLayoutId - LAYOUT_TRAINER_TOWER_LOBBY <= CURR_FLOOR.floorIdx)
gSpecialVar_Result = FALSE;
else
gSpecialVar_Result = TRUE;
}
-static void sub_815E28C(void)
+static void StartTrainerTowerChallenge(void)
{
- gSaveBlock1Ptr->unkArrayIdx = gSpecialVar_0x8005;
- if (gSaveBlock1Ptr->unkArrayIdx >= NELEMS(gSaveBlock1Ptr->unkArray))
- gSaveBlock1Ptr->unkArrayIdx = 0;
+ gSaveBlock1Ptr->towerChallengeId = gSpecialVar_0x8005;
+ if (gSaveBlock1Ptr->towerChallengeId >= NUM_TOWER_CHALLENGE_TYPES)
+ gSaveBlock1Ptr->towerChallengeId = 0;
ValidateOrResetCurTrainerTowerRecord();
- if (!sub_815D834())
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_5 = TRUE;
+ if (!ReadTrainerTowerAndValidate())
+ TRAINER_TOWER.validated = TRUE;
else
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_5 = FALSE;
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk8 = 0;
- SetVBlankCounter1Ptr(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0);
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0 = 0;
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_2 = FALSE;
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_1 = FALSE;
+ TRAINER_TOWER.validated = FALSE;
+ TRAINER_TOWER.floorsCleared = 0;
+ SetVBlankCounter1Ptr(&TRAINER_TOWER.timer);
+ TRAINER_TOWER.timer = 0;
+ TRAINER_TOWER.spokeToOwner = FALSE;
+ TRAINER_TOWER.checkedFinalTime = FALSE;
}
-static void sub_815E394(void)
+static void GetOwnerState(void)
{
DisableVBlankCounter1();
gSpecialVar_Result = 0;
- if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_2)
+
+ if (TRAINER_TOWER.spokeToOwner)
gSpecialVar_Result++;
- if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_0 && gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_1)
+ if (TRAINER_TOWER.receivedPrize && TRAINER_TOWER.checkedFinalTime)
gSpecialVar_Result++;
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_2 = TRUE;
+
+ TRAINER_TOWER.spokeToOwner = TRUE;
}
-static void sub_815E408(void)
+static void GiveChallengePrize(void)
{
- u16 itemId = gUnknown_847A2B4[sTrainerTowerState->unk_0004.floors->prize];
- if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_0)
+ u16 itemId = sPrizeList[sTrainerTowerState->unk_0004.floors->prize];
+
+ if (TRAINER_TOWER.receivedPrize)
+ {
gSpecialVar_Result = 2;
- else if (AddBagItem(itemId, 1) == 1)
+ }
+ else if (AddBagItem(itemId, 1) == TRUE)
{
CopyItemName(itemId, gStringVar2);
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_0 = TRUE;
+ TRAINER_TOWER.receivedPrize = TRUE;
gSpecialVar_Result = 0;
}
else
+ {
gSpecialVar_Result = 1;
+ }
}
-static void sub_815E4B0(void)
+static void CheckFinalTime(void)
{
- if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_1)
+ if (TRAINER_TOWER.checkedFinalTime)
+ {
gSpecialVar_Result = 2;
- else if (GetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk4) > gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0)
+ }
+ else if (GetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime) > TRAINER_TOWER.timer)
{
- SetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk4, gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0);
+ SetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime, TRAINER_TOWER.timer);
gSpecialVar_Result = 0;
}
else
+ {
gSpecialVar_Result = 1;
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_1 = TRUE;
+ }
+
+ TRAINER_TOWER.checkedFinalTime = TRUE;
}
-static void TTSpecial_StartTimer(void)
+static void TrainerTowerResumeTimer(void)
{
- if (!gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_2)
+ if (!TRAINER_TOWER.spokeToOwner)
{
- if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0 >= 215999)
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0 = 215999;
+ if (TRAINER_TOWER.timer >= TRAINER_TOWER_MAX_TIME)
+ TRAINER_TOWER.timer = TRAINER_TOWER_MAX_TIME;
else
- SetVBlankCounter1Ptr(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0);
+ SetVBlankCounter1Ptr(&TRAINER_TOWER.timer);
}
}
-static void sub_815E5C4(void)
+static void TrainerTowerSetPlayerLost(void)
{
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_3 = 1;
+ TRAINER_TOWER.hasLost = TRUE;
}
-static void sub_815E5F0(void)
+static void GetTrainerTowerChallengeStatus(void)
{
- if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_3)
+ if (TRAINER_TOWER.hasLost)
{
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_3 = FALSE;
- gSpecialVar_Result = 0;
+ TRAINER_TOWER.hasLost = FALSE;
+ gSpecialVar_Result = CHALLENGE_STATUS_LOST;
}
- else if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_4)
+ else if (TRAINER_TOWER.unkA_4)
{
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_4 = FALSE;
- gSpecialVar_Result = 1;
+ TRAINER_TOWER.unkA_4 = FALSE;
+ gSpecialVar_Result = CHALLENGE_STATUS_UNK;
}
else
{
- gSpecialVar_Result = 2;
+ gSpecialVar_Result = CHALLENGE_STATUS_NORMAL;
}
}
@@ -861,8 +878,8 @@ static void sub_815E5F0(void)
\
frames = (src); \
\
- minutes = frames / 3600; \
- frames %= 3600; \
+ minutes = frames / (60 * 60); \
+ frames %= (60 * 60); \
seconds = frames / 60; \
frames %= 60; \
centiseconds = frames * 168 / 100; \
@@ -872,34 +889,34 @@ static void sub_815E5F0(void)
ConvertIntToDecimalStringN(gStringVar3, centiseconds, STR_CONV_MODE_LEADING_ZEROS, 2); \
})
-static void sub_815E658(void)
+static void GetCurrentTime(void)
{
- if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0 >= 215999)
+ if (TRAINER_TOWER.timer >= TRAINER_TOWER_MAX_TIME)
{
DisableVBlankCounter1();
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0 = 215999;
+ TRAINER_TOWER.timer = TRAINER_TOWER_MAX_TIME;
}
- PRINT_TOWER_TIME(gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0);
+ PRINT_TOWER_TIME(TRAINER_TOWER.timer);
}
-static void sub_815E720(void)
+static void ShowResultsBoard(void)
{
u8 windowId;
s32 i;
ValidateOrResetCurTrainerTowerRecord();
- windowId = AddWindow(gUnknown_847A218);
+ windowId = AddWindow(sTimeBoardWindowTemplate);
LoadStdWindowFrameGfx();
DrawStdWindowFrame(windowId, FALSE);
- AddTextPrinterParameterized(windowId, 2, gUnknown_83FE982, 0x4A, 0, 0xFF, NULL);
+ AddTextPrinterParameterized(windowId, 2, gText_TimeBoard, 0x4A, 0, 0xFF, NULL);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++)
{
- PRINT_TOWER_TIME(GetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk4));
+ PRINT_TOWER_TIME(GetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime));
- StringExpandPlaceholders(gStringVar4, gUnknown_83FE998);
- AddTextPrinterParameterized(windowId, 2, gUnknown_83FE9C4[i - 1], 0x18, 0x24 + 0x14 * i, 0xFF, NULL);
+ StringExpandPlaceholders(gStringVar4, gText_XMinYZSec);
+ AddTextPrinterParameterized(windowId, 2, gTrainerTowerChallengeTypeTexts[i - 1], 0x18, 0x24 + 0x14 * i, 0xFF, NULL);
AddTextPrinterParameterized(windowId, 2, gStringVar4, 0x60, 0x2E + 0x14 * i, 0xFF, NULL);
}
@@ -908,23 +925,24 @@ static void sub_815E720(void)
VarSet(VAR_TEMP_1, windowId);
}
-static void sub_815E88C(void)
+static void CloseResultsBoard(void)
{
u8 windowId = VarGet(VAR_TEMP_1);
ClearStdWindowAndFrameToTransparent(windowId, TRUE);
RemoveWindow(windowId);
}
-static void sub_815E8B4(void)
+static void TrainerTowerGetDoublesEligiblity(void)
{
gSpecialVar_Result = GetMonsStateToDoubles();
}
-static void sub_815E8CC(void)
+
+static void TrainerTowerGetNumFloors(void)
{
- if (sTrainerTowerState->unk_0004.count != sTrainerTowerState->unk_0004.floors[0].floorIdx)
+ if (sTrainerTowerState->unk_0004.numFloors != sTrainerTowerState->unk_0004.floors[0].floorIdx)
{
- ConvertIntToDecimalStringN(gStringVar1, sTrainerTowerState->unk_0004.count, STR_CONV_MODE_LEFT_ALIGN, 1);
+ ConvertIntToDecimalStringN(gStringVar1, sTrainerTowerState->unk_0004.numFloors, STR_CONV_MODE_LEFT_ALIGN, 1);
gSpecialVar_Result = TRUE;
}
else
@@ -933,79 +951,78 @@ static void sub_815E8CC(void)
}
}
-static void sub_815E908(void)
+// Dummied? equivalent to gSpecialVar_Result = FALSE
+// If it were to return TRUE the player would be warped back to the lobby
+static void ShouldWarpToCounter(void)
{
- if (gMapHeader.mapLayoutId == LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_LOBBY && VarGet(VAR_MAP_SCENE_TRAINER_TOWER) == 0)
- {
+ if (gMapHeader.mapLayoutId == LAYOUT_TRAINER_TOWER_LOBBY && VarGet(VAR_MAP_SCENE_TRAINER_TOWER) == 0)
gSpecialVar_Result = FALSE;
- }
else
- {
gSpecialVar_Result = FALSE;
- }
}
-static void sub_815E948(void)
+static void PlayTrainerTowerEncounterMusic(void)
{
s32 i;
- u16 var_4001 = VarGet(VAR_TEMP_1);
- u8 r1 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[var_4001].facilityClass;
+ u16 idx = VarGet(VAR_TEMP_1);
+ u8 facilityClass = CURR_FLOOR.trainers[idx].facilityClass;
for (i = 0; i < NELEMS(sTrainerEncounterMusicLUT); i++)
{
- if (sTrainerEncounterMusicLUT[i].unk0 == gFacilityClassToTrainerClass[r1])
+ if (sTrainerEncounterMusicLUT[i].facilityClass == gFacilityClassToTrainerClass[facilityClass])
break;
}
+
if (i != NELEMS(sTrainerEncounterMusicLUT))
{
- var_4001 = sTrainerEncounterMusicLUT[i].unk1;
+ idx = sTrainerEncounterMusicLUT[i].musicId;
}
else
{
- var_4001 = 0;
+ idx = 0;
}
- PlayNewMapMusic(gUnknown_847A2D2[var_4001]);
+ PlayNewMapMusic(sTrainerTowerEncounterMusic[idx]);
}
-static void sub_815E9C8(void)
+static void HasSpokenToOwner(void)
{
- gSpecialVar_Result = gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_2;
+ gSpecialVar_Result = TRAINER_TOWER.spokeToOwner;
}
static void BuildEnemyParty(void)
{
u16 trainerIdx = VarGet(VAR_TEMP_1);
s32 level = GetPartyMaxLevel();
- u8 floorIdx = gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk8;
+ u8 floorIdx = TRAINER_TOWER.floorsCleared;
s32 i;
u8 monIdx;
ZeroEnemyPartyMons();
- switch (sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType)
+ switch (CURR_FLOOR.challengeType)
{
- case 0:
+ case CHALLENGE_TYPE_SINGLE:
default:
for (i = 0; i < 2; i++)
{
monIdx = sSingleBattleChallengeMonIdxs[floorIdx][i];
- sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[trainerIdx].mons[monIdx].level = level;
- CreateBattleTowerMon(&gEnemyParty[i], &sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[trainerIdx].mons[monIdx]);
+ CURR_FLOOR.trainers[trainerIdx].mons[monIdx].level = level;
+ CreateBattleTowerMon(&gEnemyParty[i], &CURR_FLOOR.trainers[trainerIdx].mons[monIdx]);
}
break;
- case 1:
+ case CHALLENGE_TYPE_DOUBLE:
monIdx = sDoubleBattleChallengeMonIdxs[floorIdx][0];
- sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[0].mons[monIdx].level = level;
- CreateBattleTowerMon(&gEnemyParty[0], &sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[0].mons[monIdx]);
+ CURR_FLOOR.trainers[0].mons[monIdx].level = level;
+ CreateBattleTowerMon(&gEnemyParty[0], &CURR_FLOOR.trainers[0].mons[monIdx]);
monIdx = sDoubleBattleChallengeMonIdxs[floorIdx][1];
- sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[1].mons[monIdx].level = level;
- CreateBattleTowerMon(&gEnemyParty[1], &sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[1].mons[monIdx]);
+ CURR_FLOOR.trainers[1].mons[monIdx].level = level;
+ CreateBattleTowerMon(&gEnemyParty[1], &CURR_FLOOR.trainers[1].mons[monIdx]);
break;
- case 2:
+ case CHALLENGE_TYPE_KNOCKOUT:
monIdx = sKnockoutChallengeMonIdxs[floorIdx][trainerIdx];
- sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[trainerIdx].mons[monIdx].level = level;
- CreateBattleTowerMon(&gEnemyParty[0], &sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[trainerIdx].mons[monIdx]);
+ CURR_FLOOR.trainers[trainerIdx].mons[monIdx].level = level;
+ CreateBattleTowerMon(&gEnemyParty[0], &CURR_FLOOR.trainers[trainerIdx].mons[monIdx]);
break;
}
}
@@ -1030,11 +1047,11 @@ static s32 GetPartyMaxLevel(void)
static void ValidateOrResetCurTrainerTowerRecord(void)
{
- if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk9 != sTrainerTowerState->unk_0004.id)
+ if (TRAINER_TOWER.unk9 != sTrainerTowerState->unk_0004.id)
{
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk9 = sTrainerTowerState->unk_0004.id;
- SetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk4, 215999);
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_0 = FALSE;
+ TRAINER_TOWER.unk9 = sTrainerTowerState->unk_0004.id;
+ SetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime, TRAINER_TOWER_MAX_TIME);
+ TRAINER_TOWER.receivedPrize = FALSE;
}
}
@@ -1043,22 +1060,22 @@ void PrintTrainerTowerRecords(void)
s32 i;
u8 windowId = 0;
- sub_815DC8C();
+ SetUpTrainerTowerDataStruct();
FillWindowPixelRect(0, 0, 0, 0, 0xd8, 0x90);
ValidateOrResetCurTrainerTowerRecord();
- AddTextPrinterParameterized3(0, 2, 0x4a, 0, gUnknown_847A22C, 0, gUnknown_83FE982);
+ AddTextPrinterParameterized3(0, 2, 0x4a, 0, sTextColors, 0, gText_TimeBoard);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++)
{
- PRINT_TOWER_TIME(GetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[i].unk4));
- StringExpandPlaceholders(gStringVar4, gUnknown_83FE998);
- AddTextPrinterParameterized3(windowId, 2, 0x18, 0x24 + 0x14 * i, gUnknown_847A22C, 0, gUnknown_83FE9C4[i]);
- AddTextPrinterParameterized3(windowId, 2, 0x60, 0x24 + 0x14 * i, gUnknown_847A22C, 0, gStringVar4);
+ PRINT_TOWER_TIME(GetTrainerTowerRecordTime(&gSaveBlock1Ptr->trainerTower[i].bestTime));
+ StringExpandPlaceholders(gStringVar4, gText_XMinYZSec);
+ AddTextPrinterParameterized3(windowId, 2, 0x18, 0x24 + 0x14 * i, sTextColors, 0, gTrainerTowerChallengeTypeTexts[i]);
+ AddTextPrinterParameterized3(windowId, 2, 0x60, 0x24 + 0x14 * i, sTextColors, 0, gStringVar4);
}
PutWindowTilemap(windowId);
CopyWindowToVram(windowId, 3);
- sub_815DD2C();
+ FreeTrainerTowerDataStruct();
}
static u32 GetTrainerTowerRecordTime(u32 *counter)
@@ -1075,8 +1092,8 @@ void ResetTrainerTowerResults(void)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++)
{
- SetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[i].unk4, 215999);
+ SetTrainerTowerRecordTime(&gSaveBlock1Ptr->trainerTower[i].bestTime, TRAINER_TOWER_MAX_TIME);
}
}
diff --git a/src/trig.c b/src/trig.c
index c2bca3059..2181ebef7 100644
--- a/src/trig.c
+++ b/src/trig.c
@@ -1,5 +1,4 @@
#include "global.h"
-#include "trig.h"
// Values of sin(x*(π/128)) as Q8.8 fixed-point numbers from x = 0 to x = 319
const s16 gSineTable[] =
diff --git a/src/union_room.c b/src/union_room.c
index f942fb7d3..7bace05ef 100644
--- a/src/union_room.c
+++ b/src/union_room.c
@@ -37,6 +37,7 @@
#include "trade_scene.h"
#include "trainer_card.h"
#include "union_room.h"
+#include "union_room_battle.h"
#include "union_room_chat.h"
#include "rfu_union_tool.h"
#include "union_room_message.h"
@@ -45,13 +46,15 @@
#include "constants/cable_club.h"
#include "constants/field_weather.h"
#include "constants/species.h"
+#include "constants/trainer_card.h"
+#include "constants/union_room.h"
static EWRAM_DATA u8 sUnionRoomPlayerName[12] = {};
-static EWRAM_DATA u8 gUnknown_203B058 = 0;
-static EWRAM_DATA u8 gUnknown_203B059 = 0;
+static EWRAM_DATA u8 sPlayerCurrActivity = 0;
+static EWRAM_DATA u8 sPlayerActivityGroupSize = 0;
static EWRAM_DATA union UnkUnion_Main sUnionRoomMain = {};
static EWRAM_DATA u32 sUnref_203B060 = 0;
-EWRAM_DATA struct GFtgtGnameSub gUnknown_203B064 = {};
+EWRAM_DATA struct GFtgtGnameSub gPartnerTgtGnameSub = {};
EWRAM_DATA u16 gUnionRoomOfferedSpecies = SPECIES_NONE;
EWRAM_DATA u8 gUnionRoomRequestedMonType = TYPE_NORMAL;
static EWRAM_DATA struct UnionRoomTrade sUnionRoomTrade = {};
@@ -60,103 +63,103 @@ static struct UnkStruct_Leader * sLeader;
static struct UnkStruct_Group * sGroup;
static struct UnkStruct_URoom * sURoom;
-static void sub_8115A68(u8 taskId);
-static void sub_81161E4(struct UnkStruct_Leader * leader);
-static bool8 sub_8116444(struct UnkStruct_Leader * leader, u32 a1, u32 a2);
-static void sub_81164C8(u8 windowId, s32 itemId, u8 y);
-static u8 sub_8116524(struct UnkStruct_Main0 * a0);
-static u8 sub_81165E8(struct UnkStruct_Main0 * a0);
-static void sub_8116738(u8 taskId);
-static u32 sub_8116D10(struct UnkStruct_Group * group, s32 id);
-static void sub_8116D60(struct UnkStruct_Group * group, s32 id);
-static void sub_8116E1C(u8 taskId);
-static void sub_8116F94(u8 windowId, s32 itemId, u8 y);
-static u8 sub_8116FE4(void);
-static void sub_8117990(void);
-static void sub_81179A4(void);
-static void sub_8117A0C(u8 taskId);
-static void sub_8117F20(u8 taskId);
-static void sub_81182DC(u8 taskId);
-static void sub_81186E0(u8 taskId);
+static void Task_TryBecomeLinkLeader(u8 taskId);
+static void Leader_DestroyResources(struct UnkStruct_Leader * leader);
+static bool8 Leader_SetStateIfMemberListChanged(struct UnkStruct_Leader * leader, u32 state1, u32 state2);
+static void ItemPrintFunc_PossibleGroupMembers(u8 windowId, s32 itemId, u8 y);
+static u8 LeaderUpdateGroupMembership(struct UnkStruct_Main0 * main0);
+static u8 UnionRoomLeaderField0CompactionAndCount(struct UnkStruct_Main0 * main0);
+static void Task_TryJoinLinkGroup(u8 taskId);
+static u32 IsTryingToTradeWithHoennTooSoon(struct UnkStruct_Group * group, s32 id);
+static void AskToJoinRfuGroup(struct UnkStruct_Group * group, s32 id);
+static void Task_ListenToWireless(u8 taskId);
+static void ListMenuItemPrintFunc_UnionRoomGroups(u8 windowId, s32 itemId, u8 y);
+static u8 GetNewLeaderCandidate(void);
+static void CreateTask_RunScriptAndFadeToActivity(void);
+static void CreateTask_StartActivity(void);
+static void Task_MEvent_Leader(u8 taskId);
+static void Task_CardOrNewsWithFriend(u8 taskId);
+static void Task_CardOrNewsOverWireless(u8 taskId);
+static void Task_RunUnionRoom(u8 taskId);
static u16 ReadAsU16(const u8 *data);
-static void sub_8119904(struct UnkStruct_URoom * uRoom);
-static bool32 sub_8119944(struct UnkStruct_URoom * uRoom);
-static void sub_81199FC(u8 taskId);
-static u8 sub_8119B94(void);
-static u8 sub_8119E84(struct UnkStruct_Main4 * arg0, struct UnkStruct_Main4 * arg1, u32 arg2);
-static bool32 sub_8119FB0(struct GFtgtGname * arg0, s16 arg1);
-static u8 sub_811A054(struct UnkStruct_Main4 * arg0, u32 arg1);
-static u8 sub_811A084(struct UnkStruct_Main4 * arg0, u32 arg1);
-static bool32 sub_811A0B4(const u8 * str);
-static bool32 sub_811A0E0(void);
+static void ReceiveUnionRoomActivityPacket(struct UnkStruct_URoom * uRoom);
+static bool32 UnionRoom_HandleContactFromOtherPlayer(struct UnkStruct_URoom * uRoom);
+static void Task_InitUnionRoom(u8 taskId);
+static u8 HandlePlayerListUpdate(void);
+static u8 CreateTask_SearchForChildOrParent(struct UnkStruct_Main4 * main4, struct UnkStruct_Main4 * arg1, u32 arg2);
+static bool32 GetGnameWonderFlagByLinkGroup(struct GFtgtGname * gname, s16 linkGroup);
+static u8 CreateTask_ListenForPartnersWithCompatibleSerialNos(struct UnkStruct_Main4 * main4, u32 linkGroup);
+static u8 CreateTask_ListenForPartnersWithSerial7F7D(struct UnkStruct_Main4 * main4, u32 linkGroup);
+static bool32 UR_PrintFieldMessage(const u8 * str);
+static bool32 UR_RunTextPrinters_CheckPrinter0Active(void);
static bool8 PrintOnTextbox(u8 *textState, const u8 *str);
-static s8 sub_811A14C(u8 *dest, bool32 arg1);
-static s32 sub_811A218(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate);
-static s32 sub_811A2EC(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate, struct UnkStruct_Main0 * arg6);
-static void sub_811A3F8(void);
-static void sub_811A41C(void);
-static void sub_811A444(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx);
-static void sub_811A5E4(struct UnkStruct_x20 * arg0, u8 count);
-static void sub_811A650(struct UnkStruct_x1C * arg0, u8 count);
-static bool8 sub_811A694(struct UnkStruct_Shared * arg0, const struct UnkStruct_Shared * arg1);
-static bool32 sub_811A6DC(struct UnkStruct_Shared * arg0, struct UnkStruct_Shared * arg1);
-static u32 sub_811A748(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1);
-static u8 sub_811A798(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1, u8 arg2);
-static void sub_811A81C(u8 windowId, u8 x, u8 y, struct UnkStruct_x20 * arg3, u8 arg4, u8 id);
-static void sub_811A910(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 * arg3, u8 arg4, u8 id);
-static bool32 sub_811A9B8(void);
-static u32 sub_811A9FC(s32 a0);
-static u32 sub_811AA24(struct UnkStruct_x20 * unkX20);
-static s32 sub_811AA5C(struct UnkStruct_Main0 * arg0, u8 arg1, u8 arg2, u32 playerGender);
+static s8 UnionRoomHandleYesNo(u8 *state_p, bool32 no_draw);
+static s32 ListMenuHandler_AllItemsAvailable(u8 *state_p, u8 *win_id_p, u8 *list_menu_id_p, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate);
+static s32 TradeBoardMenuHandler(u8 *state_p, u8 *win_id_p, u8 *list_menu_id_p, u8 *trade_board_win_id_p, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate, struct UnkStruct_Main0 * traders);
+static void UR_BlankBg0(void);
+static void JoinGroup_BlankBg0AndEnableScriptContexts(void);
+static void UR_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx);
+static void BlankUnkStruct_x20Array(struct UnkStruct_x20 * x20, u8 count);
+static void BlankUnkStruct_x1CArray(struct UnkStruct_x1C * x1C, u8 count);
+static bool8 AreGnameUnameDifferent(struct UnionGnameUnamePair * arg0, const struct UnionGnameUnamePair * arg1);
+static bool32 AreUnionRoomPlayerGnamesDifferent(struct UnionGnameUnamePair * arg0, struct UnionGnameUnamePair * arg1);
+static u32 Findx20Inx1CArray(struct UnkStruct_x20 * x20, struct UnkStruct_x1C * x1Carr);
+static u8 Appendx1Ctox20(struct UnkStruct_x20 * x20arr, struct UnkStruct_x1C * x1C, u8 count);
+static void PrintUnionRoomGroupOnWindow(u8 windowId, u8 x, u8 y, struct UnkStruct_x20 * group, u8 colorIdx, u8 id);
+static void PrintGroupMemberCandidateOnWindowWithColor(u8 windowId, u8 x, u8 y, struct UnkStruct_x20 * group, u8 colorIdx, u8 id);
+static bool32 PlayerIsTalkingToUnionRoomAide(void);
+static u32 GetResponseIdx_InviteToURoomActivity(s32 activity);
+static u32 ConvPartnerUnameAndGetWhetherMetAlready(struct UnkStruct_x20 * unkX20);
+static s32 UnionRoomGetPlayerInteractionResponse(struct UnkStruct_Main0 * main0, u8 overrideGender, u8 playerIdx, u32 playerGender);
static void nullsub_92(u8 windowId, s32 itemId, u8 y);
-static void sub_811ACA4(u8 windowId, s32 itemId, u8 y);
-static s32 sub_811AD7C(struct UnkStruct_x20 * arg, s32 arg1);
-static s32 GetUnionRoomPlayerGender(s32 a0, struct UnkStruct_Main0 * a1);
-static s32 sub_811ADD0(u32 type, u32 species);
-static void sub_811AE68(u8 *dst, s32 arg1, u32 playerGender);
-static void sub_811AECC(u8 *dst, u8 arg1);
-static s32 sub_811AF6C(u8 *dst, u32 gender, u16 *arg2, struct UnkStruct_URoom * arg3);
-static bool32 sub_811B0A4(struct UnkStruct_URoom * arg0);
+static void TradeBoardListMenuItemPrintFunc(u8 windowId, s32 itemId, u8 y);
+static s32 GetIndexOfNthTradeBoardOffer(struct UnkStruct_x20 * x20, s32 n);
+static s32 GetUnionRoomPlayerGender(s32 playerIdx, struct UnkStruct_Main0 * main0);
+static s32 IsRequestedTypeAndSpeciesInPlayerParty(u32 type, u32 species);
+static void GetURoomActivityRejectMsg(u8 *dst, s32 activity, u32 playerGender);
+static void GetURoomActivityStartMsg(u8 *dst, u8 activity);
+static s32 GetChatLeaderActionRequestMessage(u8 *dst, u32 gender, u16 *activity_p, struct UnkStruct_URoom * uroom);
+static bool32 PollPartnerYesNoResponse(struct UnkStruct_URoom * uroom);
static bool32 HasAtLeastTwoMonsOfLevel30OrLower(void);
static void ResetUnionRoomTrade(struct UnionRoomTrade * trade);
static bool32 RegisterTradeMonAndGetIsEgg(u32 monId, struct UnionRoomTrade * trade);
static void RegisterTradeMon(u32 monId, struct UnionRoomTrade * trade);
static u32 GetPartyPositionOfRegisteredMon(struct UnionRoomTrade * trade, u8 mpId);
-static void sub_811B258(bool32 a0);
-static void sub_811B298(void);
-static u8 sub_811B2A8(s32 a0);
-static u8 sub_811B2D8(struct UnkStruct_URoom * arg0);
-static void sub_811B31C(u8 *dest, struct UnkStruct_URoom * uRoom, bool8 gender);
+static void HandleCancelTrade(bool32 unlockObjs);
+static void UR_EnableScriptContext2AndFreezeObjectEvents(void);
+static u8 GetSinglePartnerSpriteGenderParam(s32 linkPlayer);
+static u8 GetActivePartnerSpriteGenderParam(struct UnkStruct_URoom * uroom);
+static void ViewURoomPartnerTrainerCard(u8 *dest, struct UnkStruct_URoom * uRoom, bool8 parent_child);
#define _8456CD8(a, b) ((a) | ((b) << 8))
-static const u8 *const gUnknown_8456C74[] = {
- gUnknown_84571AC,
- gUnknown_8459394,
- gUnknown_84593A4,
- gUnknown_84593B4,
- gUnknown_84593C4,
- gUnknown_84593D4,
- gUnknown_84593E4,
- gUnknown_84593F4,
- gUnknown_84593DC,
- gUnknown_8459400,
- gUnknown_8459410,
- gUnknown_845941C,
- gUnknown_845942C,
- gUnknown_8459434,
- gUnknown_8459440,
- gUnknown_84571AC,
- gUnknown_84571AC,
- gUnknown_84571AC,
- gUnknown_84571AC,
- gUnknown_84571AC,
- gUnknown_84571AC,
- gUnknown_84593E4,
- gUnknown_84593F4
+static const u8 *const sUnionRoomActivityStringPtrs[] = {
+ gUnionRoomActivity_Blank,
+ gUnionRoomActivity_SingleBattle,
+ gUnionRoomActivity_DoubleBattle,
+ gUnionRoomActivity_MultiBattle,
+ gUnionRoomActivity_PokemonTrades,
+ gUnionRoomActivity_Chat,
+ gUnionRoomActivity_WonderCards,
+ gunionRoomActivity_WonderNews,
+ gUnionRoomActivity_Cards,
+ gUnionRoomActivity_PokemonJump,
+ gUnionRoomActivity_BerryCrush,
+ gUnionRoomActivity_BerryPicking,
+ gUnionRoomActivity_Search,
+ gUnionRoomActivity_SpinTradeJP,
+ gUnionRoomActivity_ItemTradeJP,
+ gUnionRoomActivity_Blank,
+ gUnionRoomActivity_Blank,
+ gUnionRoomActivity_Blank,
+ gUnionRoomActivity_Blank,
+ gUnionRoomActivity_Blank,
+ gUnionRoomActivity_Blank,
+ gUnionRoomActivity_WonderCards,
+ gunionRoomActivity_WonderNews
};
-static const struct WindowTemplate gUnknown_8456CD0 = {
+static const struct WindowTemplate sWindowTemplate_BButtonCancel = {
.bg = 0,
.tilemapLeft = 0,
.tilemapTop = 0,
@@ -166,19 +169,19 @@ static const struct WindowTemplate gUnknown_8456CD0 = {
.baseBlock = 0x008
};
-static const u32 gUnknown_8456CD8[] = {
- _8456CD8( 1, 2),
- _8456CD8( 2, 2),
- _8456CD8( 3, 4),
- _8456CD8( 4, 2),
- _8456CD8( 9, 37),
- _8456CD8(10, 37),
- _8456CD8(11, 53),
- _8456CD8(13, 53),
- _8456CD8(14, 53)
+static const u32 sLinkGroupToActivityAndCapacity[] = {
+ [LINK_GROUP_SINGLE_BATTLE] = _8456CD8(ACTIVITY_BATTLE, 2),
+ [LINK_GROUP_DOUBLE_BATTLE] = _8456CD8(ACTIVITY_DBLBATTLE, 2),
+ [LINK_GROUP_MULTI_BATTLE] = _8456CD8(ACTIVITY_MLTBATTLE, 4),
+ [LINK_GROUP_TRADE] = _8456CD8(ACTIVITY_TRADE, 2),
+ [LINK_GROUP_POKEMON_JUMP] = _8456CD8(ACTIVITY_PJUMP, 5 | 0x20),
+ [LINK_GROUP_BERRY_CRUSH] = _8456CD8(ACTIVITY_BCRUSH, 5 | 0x20),
+ [LINK_GROUP_BERRY_PICKING] = _8456CD8(ACTIVITY_BPICK, 5 | 0x30),
+ [LINK_GROUP_WONDER_CARD] = _8456CD8(ACTIVITY_SPINTRADE, 5 | 0x30),
+ [LINK_GROUP_WONDER_NEWS] = _8456CD8(ACTIVITY_ITEMTRADE, 5 | 0x30)
};
-static const struct WindowTemplate gUnknown_8456CFC = {
+static const struct WindowTemplate sWindowTemplate_List_PossibleGroupMembers = {
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 3,
@@ -188,7 +191,7 @@ static const struct WindowTemplate gUnknown_8456CFC = {
.baseBlock = 0x044
};
-static const struct WindowTemplate gUnknown_8456D04 = {
+static const struct WindowTemplate sWindowTemplate_NumPlayerMode = {
.bg = 0,
.tilemapLeft = 16,
.tilemapTop = 3,
@@ -198,18 +201,18 @@ static const struct WindowTemplate gUnknown_8456D04 = {
.baseBlock = 0x0C6
};
-const struct ListMenuItem gUnknown_8456D0C[] = {
- {gUnknown_84571AC, 0},
- {gUnknown_84571AC, 1},
- {gUnknown_84571AC, 2},
- {gUnknown_84571AC, 3},
- {gUnknown_84571AC, 4}
+const struct ListMenuItem sListMenuItems_PossibleGroupMembers[] = {
+ {gUnionRoomActivity_Blank, 0},
+ {gUnionRoomActivity_Blank, 1},
+ {gUnionRoomActivity_Blank, 2},
+ {gUnionRoomActivity_Blank, 3},
+ {gUnionRoomActivity_Blank, 4}
};
-static const struct ListMenuTemplate gUnknown_8456D34 = {
- .items = gUnknown_8456D0C,
+static const struct ListMenuTemplate sListMenuTemplate_PossibleGroupMembers = {
+ .items = sListMenuItems_PossibleGroupMembers,
.moveCursorFunc = NULL,
- .itemPrintFunc = sub_81164C8,
+ .itemPrintFunc = ItemPrintFunc_PossibleGroupMembers,
.totalItems = 5,
.maxShowed = 5,
.windowId = 0,
@@ -227,7 +230,7 @@ static const struct ListMenuTemplate gUnknown_8456D34 = {
.cursorKind = 1
};
-static const struct WindowTemplate gUnknown_8456D4C = {
+static const struct WindowTemplate sWindowTemplate_MysteryGiftList = {
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 3,
@@ -237,7 +240,7 @@ static const struct WindowTemplate gUnknown_8456D4C = {
.baseBlock = 0x044
};
-static const struct WindowTemplate gUnknown_8456D54 = {
+static const struct WindowTemplate sWindowTemplate_MysteryGiftPlayerNameAndId = {
.bg = 0,
.tilemapLeft = 20,
.tilemapTop = 3,
@@ -247,29 +250,29 @@ static const struct WindowTemplate gUnknown_8456D54 = {
.baseBlock = 0x0EE
};
-static const struct ListMenuItem gUnknown_8456D5C[] = {
- {gUnknown_84571AC, 0},
- {gUnknown_84571AC, 1},
- {gUnknown_84571AC, 2},
- {gUnknown_84571AC, 3},
- {gUnknown_84571AC, 4},
- {gUnknown_84571AC, 5},
- {gUnknown_84571AC, 6},
- {gUnknown_84571AC, 7},
- {gUnknown_84571AC, 8},
- {gUnknown_84571AC, 9},
- {gUnknown_84571AC, 10},
- {gUnknown_84571AC, 11},
- {gUnknown_84571AC, 12},
- {gUnknown_84571AC, 13},
- {gUnknown_84571AC, 14},
- {gUnknown_84571AC, 15}
+static const struct ListMenuItem sListMenuItems_UnionRoomGroups[] = {
+ {gUnionRoomActivity_Blank, 0},
+ {gUnionRoomActivity_Blank, 1},
+ {gUnionRoomActivity_Blank, 2},
+ {gUnionRoomActivity_Blank, 3},
+ {gUnionRoomActivity_Blank, 4},
+ {gUnionRoomActivity_Blank, 5},
+ {gUnionRoomActivity_Blank, 6},
+ {gUnionRoomActivity_Blank, 7},
+ {gUnionRoomActivity_Blank, 8},
+ {gUnionRoomActivity_Blank, 9},
+ {gUnionRoomActivity_Blank, 10},
+ {gUnionRoomActivity_Blank, 11},
+ {gUnionRoomActivity_Blank, 12},
+ {gUnionRoomActivity_Blank, 13},
+ {gUnionRoomActivity_Blank, 14},
+ {gUnionRoomActivity_Blank, 15}
};
-static const struct ListMenuTemplate gUnknown_8456DDC = {
- .items = gUnknown_8456D5C,
+static const struct ListMenuTemplate sListMenuTemplate_UnionRoomGroups = {
+ .items = sListMenuItems_UnionRoomGroups,
.moveCursorFunc = ListMenuDefaultCursorMoveFunc,
- .itemPrintFunc = sub_8116F94,
+ .itemPrintFunc = ListMenuItemPrintFunc_UnionRoomGroups,
.totalItems = 16,
.maxShowed = 5,
.windowId = 0,
@@ -287,7 +290,7 @@ static const struct ListMenuTemplate gUnknown_8456DDC = {
.cursorKind = 0
};
-static const struct WindowTemplate gUnknown_8456DF4 = {
+static const struct WindowTemplate sWindowTemplate_InviteToActivity = {
.bg = 0,
.tilemapLeft = 20,
.tilemapTop = 6,
@@ -297,15 +300,15 @@ static const struct WindowTemplate gUnknown_8456DF4 = {
.baseBlock = 0x001
};
-static const struct ListMenuItem gUnknown_8456DFC[] = {
- {gUnknown_8459354, _8456CD8( 8, 2)},
- {gUnknown_8459344, _8456CD8(65, 2)},
- {gUnknown_845934C, _8456CD8(69, 2)},
- {gUnknown_8459360, _8456CD8(64, 0)}
+static const struct ListMenuItem sListMenuItems_InviteToActivity[] = {
+ {gUnknown_8459354, _8456CD8( ACTIVITY_CARD, 2)},
+ {gUnknown_8459344, _8456CD8(ACTIVITY_BATTLE | IN_UNION_ROOM, 2)},
+ {gUnknown_845934C, _8456CD8(ACTIVITY_CHAT | IN_UNION_ROOM, 2)},
+ {gUnknown_8459360, _8456CD8(ACTIVITY_NONE | IN_UNION_ROOM, 0)}
};
-static const struct ListMenuTemplate gUnknown_8456E1C = {
- .items = gUnknown_8456DFC,
+static const struct ListMenuTemplate sListMenuTemplate_InviteToActivity = {
+ .items = sListMenuItems_InviteToActivity,
.moveCursorFunc = ListMenuDefaultCursorMoveFunc,
.itemPrintFunc = NULL,
.totalItems = 4,
@@ -325,7 +328,7 @@ static const struct ListMenuTemplate gUnknown_8456E1C = {
.cursorKind = 0
};
-static const struct WindowTemplate gUnknown_8456E34 = {
+static const struct WindowTemplate sWindowTemplate_TradeBoardRegisterInfoExit = {
.bg = 0,
.tilemapLeft = 18,
.tilemapTop = 8,
@@ -341,7 +344,7 @@ static const struct ListMenuItem gUnknown_8456E3C[] = {
{gUnknown_8459360, 3}
};
-static const struct ListMenuTemplate gUnknown_8456E54 = {
+static const struct ListMenuTemplate sListMenuTemplate_TradeBoardRegisterInfoExit = {
.items = gUnknown_8456E3C,
.moveCursorFunc = ListMenuDefaultCursorMoveFunc,
.itemPrintFunc = NULL,
@@ -362,7 +365,7 @@ static const struct ListMenuTemplate gUnknown_8456E54 = {
.cursorKind = 0
};
-static const struct WindowTemplate gUnknown_8456E6C = {
+static const struct WindowTemplate sWindowTemplate_TypeNames = {
.bg = 0,
.tilemapLeft = 20,
.tilemapTop = 2,
@@ -372,7 +375,7 @@ static const struct WindowTemplate gUnknown_8456E6C = {
.baseBlock = 0x001
};
-static const struct ListMenuItem gUnknown_8456E74[] = {
+static const struct ListMenuItem sListMenuItems_TypeNames[] = {
{gTypeNames[TYPE_NORMAL], TYPE_NORMAL},
{gTypeNames[TYPE_FIRE], TYPE_FIRE},
{gTypeNames[TYPE_WATER], TYPE_WATER},
@@ -393,8 +396,8 @@ static const struct ListMenuItem gUnknown_8456E74[] = {
{gUnknown_8459360, NUMBER_OF_MON_TYPES}
};
-static const struct ListMenuTemplate gUnknown_8456F04 = {
- .items = gUnknown_8456E74,
+static const struct ListMenuTemplate sListMenuTemplate_TypeNames = {
+ .items = sListMenuItems_TypeNames,
.moveCursorFunc = ListMenuDefaultCursorMoveFunc,
.itemPrintFunc = NULL,
.totalItems = NUMBER_OF_MON_TYPES,
@@ -414,7 +417,7 @@ static const struct ListMenuTemplate gUnknown_8456F04 = {
.cursorKind = 0
};
-static const struct WindowTemplate gUnknown_8456F1C = {
+static const struct WindowTemplate sTradeBoardWindowTemplate = {
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 1,
@@ -434,23 +437,23 @@ static const struct WindowTemplate gUnknown_8456F24 = {
.baseBlock = 0x039
};
-static const struct ListMenuItem gUnknown_8456F2C[] = {
- {gUnknown_84571AC, -3},
- {gUnknown_84571AC, 0},
- {gUnknown_84571AC, 1},
- {gUnknown_84571AC, 2},
- {gUnknown_84571AC, 3},
- {gUnknown_84571AC, 4},
- {gUnknown_84571AC, 5},
- {gUnknown_84571AC, 6},
- {gUnknown_84571AC, 7},
+static const struct ListMenuItem sTradeBoardListMenuItems[] = {
+ {gUnionRoomActivity_Blank, -3},
+ {gUnionRoomActivity_Blank, 0},
+ {gUnionRoomActivity_Blank, 1},
+ {gUnionRoomActivity_Blank, 2},
+ {gUnionRoomActivity_Blank, 3},
+ {gUnionRoomActivity_Blank, 4},
+ {gUnionRoomActivity_Blank, 5},
+ {gUnionRoomActivity_Blank, 6},
+ {gUnionRoomActivity_Blank, 7},
{gUnknown_8459368, 8}
};
-static const struct ListMenuTemplate gUnknown_8456F7C = {
- .items = gUnknown_8456F2C,
+static const struct ListMenuTemplate sTradeBoardListMenuTemplate = {
+ .items = sTradeBoardListMenuItems,
.moveCursorFunc = ListMenuDefaultCursorMoveFunc,
- .itemPrintFunc = sub_811ACA4,
+ .itemPrintFunc = TradeBoardListMenuItemPrintFunc,
.totalItems = 10,
.maxShowed = 5,
.windowId = 0,
@@ -479,22 +482,22 @@ static const struct WindowTemplate gUnknown_8456F94 = {
};
static const struct ListMenuItem gUnknown_8456F9C[] = {
- {gUnknown_84571AC, 0},
- {gUnknown_84571AC, 1},
- {gUnknown_84571AC, 2},
- {gUnknown_84571AC, 3},
- {gUnknown_84571AC, 4},
- {gUnknown_84571AC, 5},
- {gUnknown_84571AC, 6},
- {gUnknown_84571AC, 7},
- {gUnknown_84571AC, 8},
- {gUnknown_84571AC, 9},
- {gUnknown_84571AC, 10},
- {gUnknown_84571AC, 11},
- {gUnknown_84571AC, 12},
- {gUnknown_84571AC, 13},
- {gUnknown_84571AC, 14},
- {gUnknown_84571AC, 15}
+ {gUnionRoomActivity_Blank, 0},
+ {gUnionRoomActivity_Blank, 1},
+ {gUnionRoomActivity_Blank, 2},
+ {gUnionRoomActivity_Blank, 3},
+ {gUnionRoomActivity_Blank, 4},
+ {gUnionRoomActivity_Blank, 5},
+ {gUnionRoomActivity_Blank, 6},
+ {gUnionRoomActivity_Blank, 7},
+ {gUnionRoomActivity_Blank, 8},
+ {gUnionRoomActivity_Blank, 9},
+ {gUnionRoomActivity_Blank, 10},
+ {gUnionRoomActivity_Blank, 11},
+ {gUnionRoomActivity_Blank, 12},
+ {gUnionRoomActivity_Blank, 13},
+ {gUnionRoomActivity_Blank, 14},
+ {gUnionRoomActivity_Blank, 15}
};
static const struct ListMenuTemplate gUnknown_845701C = {
@@ -518,54 +521,138 @@ static const struct ListMenuTemplate gUnknown_845701C = {
.cursorKind = 0
};
-static const struct UnkStruct_Shared gUnknown_8457034 = {};
+static const struct UnionGnameUnamePair sUnionGnameUnamePair_Dummy = {};
// starts at gUnknown_082F0474 in pokeemerald, union link groups
-ALIGNED(4) static const u8 gUnknown_845704C[] = {0x01, 0xFF};
-ALIGNED(4) static const u8 gUnknown_8457050[] = {0x02, 0xFF};
-ALIGNED(4) static const u8 gUnknown_8457054[] = {0x03, 0xFF};
-ALIGNED(4) static const u8 gUnknown_8457058[] = {0x04, 0xFF};
-ALIGNED(4) static const u8 gUnknown_845705C[] = {0x09, 0xFF};
-ALIGNED(4) static const u8 gUnknown_8457060[] = {0x0A, 0xFF};
-ALIGNED(4) static const u8 gUnknown_8457064[] = {0x0B, 0xFF};
-ALIGNED(4) static const u8 gUnknown_8457068[] = {0x15, 0xFF};
-ALIGNED(4) static const u8 gUnknown_845706C[] = {0x16, 0xFF};
-ALIGNED(4) static const u8 gUnknown_8457070[] = {0x40, 0x41, 0x44, 0x45, 0x48, 0x51, 0x52, 0x53, 0x54, 0xFF};
-ALIGNED(4) static const u8 gUnknown_845707C[] = {0x0C, 0xFF};
-ALIGNED(4) static const u8 gUnknown_8457080[] = {0x01, 0x02, 0x03, 0x04, 0x09, 0x0A, 0x0B, 0x15, 0x16, 0x0D, 0xFF};
-ALIGNED(4) static const u8 gUnknown_845708C[] = {0x01, 0x02, 0x03, 0x04, 0x0A, 0xFF};
-
-static const u8 *const gUnknown_8457094[] = {
- gUnknown_845704C,
- gUnknown_8457050,
- gUnknown_8457054,
- gUnknown_8457058,
- gUnknown_845705C,
- gUnknown_8457060,
- gUnknown_8457064,
- gUnknown_8457068,
- gUnknown_845706C,
- gUnknown_8457070,
- gUnknown_845707C,
- gUnknown_8457080,
- gUnknown_845708C
+ALIGNED(4) static const u8 gUnknown_845704C[] = {
+ ACTIVITY_BATTLE,
+ 0xFF
};
-static const u8 gUnknown_84570C8[] = {0x01, 0x02, 0x03, 0x04, 0x09, 0x0A, 0x0B, 0x15, 0x16, 0xF7, 0x00, 0xAF, 0xF7, 0x01, 0xFF, 0x00};
+ALIGNED(4) static const u8 gUnknown_8457050[] = {
+ ACTIVITY_DBLBATTLE,
+ 0xFF
+};
+
+ALIGNED(4) static const u8 gUnknown_8457054[] = {
+ ACTIVITY_MLTBATTLE,
+ 0xFF
+};
+
+ALIGNED(4) static const u8 gUnknown_8457058[] = {
+ ACTIVITY_TRADE,
+ 0xFF
+};
+
+ALIGNED(4) static const u8 gUnknown_845705C[] = {
+ ACTIVITY_PJUMP,
+ 0xFF
+};
+
+ALIGNED(4) static const u8 gUnknown_8457060[] = {
+ ACTIVITY_BCRUSH,
+ 0xFF
+};
+
+ALIGNED(4) static const u8 gUnknown_8457064[] = {
+ ACTIVITY_BPICK,
+ 0xFF
+};
+
+ALIGNED(4) static const u8 gUnknown_8457068[] = {
+ ACTIVITY_WCARD2,
+ 0xFF
+};
+
+ALIGNED(4) static const u8 gUnknown_845706C[] = {
+ ACTIVITY_WNEWS2,
+ 0xFF
+};
+
+ALIGNED(4) static const u8 gUnknown_8457070[] = {
+ ACTIVITY_NONE | IN_UNION_ROOM,
+ ACTIVITY_BATTLE | IN_UNION_ROOM,
+ ACTIVITY_TRADE | IN_UNION_ROOM,
+ ACTIVITY_CHAT | IN_UNION_ROOM,
+ ACTIVITY_CARD | IN_UNION_ROOM,
+ ACTIVITY_ACCEPT | IN_UNION_ROOM,
+ ACTIVITY_DECLINE | IN_UNION_ROOM,
+ ACTIVITY_NPCTALK | IN_UNION_ROOM,
+ ACTIVITY_PLYRTALK | IN_UNION_ROOM,
+ 0xFF
+};
+
+ALIGNED(4) static const u8 gUnknown_845707C[] = {
+ ACTIVITY_SEARCH,
+ 0xFF
+};
+
+ALIGNED(4) static const u8 gUnknown_8457080[] = {
+ ACTIVITY_BATTLE,
+ ACTIVITY_DBLBATTLE,
+ ACTIVITY_MLTBATTLE,
+ ACTIVITY_TRADE,
+ ACTIVITY_PJUMP,
+ ACTIVITY_BCRUSH,
+ ACTIVITY_BPICK,
+ ACTIVITY_WCARD2,
+ ACTIVITY_WNEWS2,
+ ACTIVITY_SPINTRADE,
+ 0xFF
+};
+
+ALIGNED(4) static const u8 gUnknown_845708C[] = {
+ ACTIVITY_BATTLE,
+ ACTIVITY_DBLBATTLE,
+ ACTIVITY_MLTBATTLE,
+ ACTIVITY_TRADE,
+ ACTIVITY_BCRUSH,
+ 0xFF
+};
+
+static const u8 *const sAcceptedActivityIds[] = {
+ [LINK_GROUP_SINGLE_BATTLE] = gUnknown_845704C,
+ [LINK_GROUP_DOUBLE_BATTLE] = gUnknown_8457050,
+ [LINK_GROUP_MULTI_BATTLE] = gUnknown_8457054,
+ [LINK_GROUP_TRADE] = gUnknown_8457058,
+ [LINK_GROUP_POKEMON_JUMP] = gUnknown_845705C,
+ [LINK_GROUP_BERRY_CRUSH] = gUnknown_8457060,
+ [LINK_GROUP_BERRY_PICKING] = gUnknown_8457064,
+ [LINK_GROUP_WONDER_CARD] = gUnknown_8457068,
+ [LINK_GROUP_WONDER_NEWS] = gUnknown_845706C,
+ [9] = gUnknown_8457070,
+ [10] = gUnknown_845707C,
+ [11] = gUnknown_8457080,
+ [12] = gUnknown_845708C
+};
+
+static const u8 sLinkGroupToURoomActivity[] = {
+ [LINK_GROUP_SINGLE_BATTLE] = ACTIVITY_BATTLE,
+ [LINK_GROUP_DOUBLE_BATTLE] = ACTIVITY_DBLBATTLE,
+ [LINK_GROUP_MULTI_BATTLE] = ACTIVITY_MLTBATTLE,
+ [LINK_GROUP_TRADE] = ACTIVITY_TRADE,
+ [LINK_GROUP_POKEMON_JUMP] = ACTIVITY_PJUMP,
+ [LINK_GROUP_BERRY_CRUSH] = ACTIVITY_BCRUSH,
+ [LINK_GROUP_BERRY_PICKING] = ACTIVITY_BPICK,
+ [LINK_GROUP_WONDER_CARD] = ACTIVITY_WCARD2,
+ [LINK_GROUP_WONDER_NEWS] = ACTIVITY_WNEWS2
+};
+
+static const u8 sUnref_84570D1[] = _("{DYNAMIC 00}·{DYNAMIC 01}");
#undef _8456CD8
// These are functions in Emerald but inlined in FireRed
-#define IntlConvPartnerUname7(dest, arg1) ({ \
- StringCopy7(dest, (arg1).unk.playerName); \
- ConvertInternationalString(dest, (arg1).unk.gname.unk_00.unk_00_0); \
+#define IntlConvPartnerUname7(dest, arg1) ({ \
+ StringCopy7(dest, (arg1).gname_uname.uname); \
+ ConvertInternationalString(dest, (arg1).gname_uname.gname.unk_00.language); \
})
-#define IntlConvPartnerUname(dest, arg1) ({ \
- StringCopy(dest, (arg1).unk.playerName); \
- ConvertInternationalString(dest, (arg1).unk.gname.unk_00.unk_00_0); \
+#define IntlConvPartnerUname(dest, arg1) ({ \
+ StringCopy(dest, (arg1).gname_uname.uname); \
+ ConvertInternationalString(dest, (arg1).gname_uname.gname.unk_00.language); \
})
#define CopyTrainerCardData(dest, src, _version) ({ \
@@ -578,47 +665,56 @@ static const u8 gUnknown_84570C8[] = {0x01, 0x02, 0x03, 0x04, 0x09, 0x0A, 0x0B,
_maxWidth - strWidth; \
})
-static void sub_811586C(u8 windowId, u8 arg1, u8 stringId)
+// capacityCode is a 2-nybble code
+// Bits 0-3: Capacity
+// Bits 4-7: Min required (if 0, must have exactly Capacity players
+static void PrintNumPlayersWaitingForMsg(u8 windowId, u8 capacityCode, u8 count)
{
FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
- switch (arg1 << 8)
+ switch (capacityCode << 8)
{
case 0x200:
- sub_811A444(windowId, 2, gUnknown_845742C[0][stringId - 1], 0, 2, 0);
+ UR_AddTextPrinterParameterized(windowId, 2, gUnknown_845742C[0][count - 1], 0, 2, UR_COLOR_DKE_WHT_LTE);
break;
case 0x400:
- sub_811A444(windowId, 2, gUnknown_845742C[1][stringId - 1], 0, 2, 0);
+ UR_AddTextPrinterParameterized(windowId, 2, gUnknown_845742C[1][count - 1], 0, 2, UR_COLOR_DKE_WHT_LTE);
break;
case 0x2500:
- sub_811A444(windowId, 2, gUnknown_845742C[2][stringId - 1], 0, 2, 0);
+ UR_AddTextPrinterParameterized(windowId, 2, gUnknown_845742C[2][count - 1], 0, 2, UR_COLOR_DKE_WHT_LTE);
break;
case 0x3500:
- sub_811A444(windowId, 2, gUnknown_845742C[3][stringId - 1], 0, 2, 0);
+ UR_AddTextPrinterParameterized(windowId, 2, gUnknown_845742C[3][count - 1], 0, 2, UR_COLOR_DKE_WHT_LTE);
break;
}
CopyWindowToVram(windowId, 2);
}
-static void sub_8115924(u8 windowId)
+static void PrintPlayerNameAndIdOnWindow(u8 windowId)
{
u8 text[12];
u8 text2[12];
- sub_811A444(windowId, 2, gSaveBlock2Ptr->playerName, 0, 2, 0);
+ UR_AddTextPrinterParameterized(windowId, 2, gSaveBlock2Ptr->playerName, 0, 2, UR_COLOR_DKE_WHT_LTE);
StringCopy(text2, gUnknown_84571B4);
ConvertIntToDecimalStringN(text, ReadAsU16(gSaveBlock2Ptr->playerTrainerId), STR_CONV_MODE_LEADING_ZEROS, 5);
StringAppend(text2, text);
- sub_811A444(windowId, 0, text2, 0, 0x10, 0);
+ UR_AddTextPrinterParameterized(windowId, 0, text2, 0, 0x10, UR_COLOR_DKE_WHT_LTE);
}
-static void sub_811599C(u8 *dst, u8 caseId)
+static void StringExpandPlaceholders_AwaitingCommFromAnother(u8 *dst, u8 caseId)
{
switch (caseId)
{
- case 1 ... 4:
- case 9 ... 11:
- case 21 ... 22:
+ case ACTIVITY_BATTLE:
+ case ACTIVITY_DBLBATTLE:
+ case ACTIVITY_MLTBATTLE:
+ case ACTIVITY_TRADE:
+ case ACTIVITY_PJUMP:
+ case ACTIVITY_BCRUSH:
+ case ACTIVITY_BPICK:
+ case ACTIVITY_WCARD2:
+ case ACTIVITY_WNEWS2:
// UB: argument *dst isn't used, instead it always prints to gStringVar4
StringExpandPlaceholders(gStringVar4, gUnknown_8457234);
break;
@@ -630,7 +726,7 @@ void TryBecomeLinkLeader(void)
u8 taskId;
struct UnkStruct_Leader * dataPtr;
- taskId = CreateTask(sub_8115A68, 0);
+ taskId = CreateTask(Task_TryBecomeLinkLeader, 0);
sUnionRoomMain.leader = dataPtr = (void*)(gTasks[taskId].data);
sLeader = dataPtr;
@@ -639,7 +735,7 @@ void TryBecomeLinkLeader(void)
gSpecialVar_Result = 0;
}
-static void sub_8115A68(u8 taskId)
+static void Task_TryBecomeLinkLeader(u8 taskId)
{
u32 id, val;
struct UnkStruct_Leader * data = sUnionRoomMain.leader;
@@ -647,63 +743,63 @@ static void sub_8115A68(u8 taskId)
switch (data->state)
{
case 0:
- gUnknown_203B058 = gUnknown_8456CD8[gSpecialVar_0x8004];
- gUnknown_203B059 = gUnknown_8456CD8[gSpecialVar_0x8004] >> 8;
- SetHostRFUtgtGname(gUnknown_203B058, 0, 0);
- sub_800B1F4();
+ sPlayerCurrActivity = sLinkGroupToActivityAndCapacity[gSpecialVar_0x8004];
+ sPlayerActivityGroupSize = sLinkGroupToActivityAndCapacity[gSpecialVar_0x8004] >> 8;
+ SetHostRFUtgtGname(sPlayerCurrActivity, 0, 0);
+ SetWirelessCommType1();
OpenLink();
- sub_80FBB8C(gUnknown_203B059 & 0xF);
+ InitializeRfuLinkManager_LinkLeader(sPlayerActivityGroupSize & 0xF);
data->state = 3;
break;
case 3:
data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
- data->field_0 = AllocZeroed(5 * sizeof(struct UnkStruct_x20));
- data->field_8 = AllocZeroed(5 * sizeof(struct UnkStruct_x20));
- sub_811A650(data->field_4->arr, 4);
- sub_811A5E4(data->field_0->arr, 5);
- LinkRfu3_SetGnameUnameFromStaticBuffers(&data->field_0->arr[0].unk.gname, data->field_0->arr[0].unk.playerName);
+ data->field_0 = AllocZeroed(UROOM_MAX_PARTY_SIZE * sizeof(struct UnkStruct_x20));
+ data->field_8 = AllocZeroed(UROOM_MAX_PARTY_SIZE * sizeof(struct UnkStruct_x20));
+ BlankUnkStruct_x1CArray(data->field_4->arr, 4);
+ BlankUnkStruct_x20Array(data->field_0->arr, UROOM_MAX_PARTY_SIZE);
+ LinkRfu3_SetGnameUnameFromStaticBuffers(&data->field_0->arr[0].gname_uname.gname, data->field_0->arr[0].gname_uname.uname);
data->field_0->arr[0].field_18 = 0;
- data->field_0->arr[0].field_1A_0 = 1;
+ data->field_0->arr[0].groupScheduledAnim = UNION_ROOM_SPAWN_IN;
data->field_0->arr[0].field_1A_1 = 0;
data->field_0->arr[0].field_1B = 0;
- data->field_17 = sub_811A054(data->field_4, 0xFF);
- data->field_10 = AddWindow(&gUnknown_8456CD0);
- data->listWindowId = AddWindow(&gUnknown_8456CFC);
- data->field_11 = AddWindow(&gUnknown_8456D04);
+ data->listenTaskId = CreateTask_ListenForPartnersWithCompatibleSerialNos(data->field_4, 0xFF);
+ data->bButtonCancelWindowId = AddWindow(&sWindowTemplate_BButtonCancel);
+ data->listWindowId = AddWindow(&sWindowTemplate_List_PossibleGroupMembers);
+ data->nPlayerModeWindowId = AddWindow(&sWindowTemplate_NumPlayerMode);
- FillWindowPixelBuffer(data->field_10, PIXEL_FILL(2));
- sub_811A444(data->field_10, 0, gUnknown_845747C, 8, 2, 4);
- PutWindowTilemap(data->field_10);
- CopyWindowToVram(data->field_10, 2);
+ FillWindowPixelBuffer(data->bButtonCancelWindowId, PIXEL_FILL(2));
+ UR_AddTextPrinterParameterized(data->bButtonCancelWindowId, 0, gUnknown_845747C, 8, 2, UR_COLOR_WHT_DKE_LTE);
+ PutWindowTilemap(data->bButtonCancelWindowId);
+ CopyWindowToVram(data->bButtonCancelWindowId, 2);
DrawStdWindowFrame(data->listWindowId, FALSE);
- gMultiuseListMenuTemplate = gUnknown_8456D34;
+ gMultiuseListMenuTemplate = sListMenuTemplate_PossibleGroupMembers;
gMultiuseListMenuTemplate.windowId = data->listWindowId;
data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
- DrawStdWindowFrame(data->field_11, FALSE);
- PutWindowTilemap(data->field_11);
- CopyWindowToVram(data->field_11, 2);
+ DrawStdWindowFrame(data->nPlayerModeWindowId, FALSE);
+ PutWindowTilemap(data->nPlayerModeWindowId);
+ CopyWindowToVram(data->nPlayerModeWindowId, 2);
CopyBgTilemapBufferToVram(0);
- data->field_13 = 1;
+ data->playerCount = 1;
data->state = 4;
break;
case 4:
- StringCopy(gStringVar1, gUnknown_8456C74[gUnknown_203B058]);
- if ((gUnknown_203B059 >> 4) != 0)
+ StringCopy(gStringVar1, sUnionRoomActivityStringPtrs[sPlayerCurrActivity]);
+ if ((sPlayerActivityGroupSize >> 4) != 0)
{
- if (data->field_13 > (gUnknown_203B059 >> 4) - 1 && (gUnknown_203B059 & 0xF) != 0)
+ if (data->playerCount > (sPlayerActivityGroupSize >> 4) - 1 && (sPlayerActivityGroupSize & 0xF) != 0)
StringExpandPlaceholders(gStringVar4, gUnknown_8457264);
else
StringExpandPlaceholders(gStringVar4, gUnknown_8457234);
}
else
{
- sub_811599C(gStringVar4, gUnknown_203B058);
+ StringExpandPlaceholders_AwaitingCommFromAnother(gStringVar4, sPlayerCurrActivity);
}
- sub_811586C(data->field_11, gUnknown_203B059, data->field_13);
+ PrintNumPlayersWaitingForMsg(data->nPlayerModeWindowId, sPlayerActivityGroupSize, data->playerCount);
data->state = 5;
break;
case 5:
@@ -711,24 +807,24 @@ static void sub_8115A68(u8 taskId)
data->state = 6;
break;
case 6:
- sub_8116444(data, 7, 10);
+ Leader_SetStateIfMemberListChanged(data, 7, 10);
if (JOY_NEW(B_BUTTON))
{
- if (data->field_13 == 1)
+ if (data->playerCount == 1)
data->state = 23;
- else if ((gUnknown_203B059 & 0xF0) != 0)
+ else if ((sPlayerActivityGroupSize & 0xF0) != 0)
data->state = 30;
else
data->state = 19;
}
- if ((gUnknown_203B059 >> 4) != 0
- && data->field_13 > (gUnknown_203B059 >> 4) - 1
- && (gUnknown_203B059 & 0xF) != 0
+ if ((sPlayerActivityGroupSize >> 4) != 0
+ && data->playerCount > (sPlayerActivityGroupSize >> 4) - 1
+ && (sPlayerActivityGroupSize & 0xF) != 0
&& sub_80FC1CC()
&& JOY_NEW(START_BUTTON))
{
data->state = 15;
- sub_80F8F5C();
+ LinkRfu_StopManagerAndFinalizeSlots();
}
if (data->state == 6 && sub_80FA5D4())
{
@@ -739,20 +835,21 @@ static void sub_8115A68(u8 taskId)
if (!sub_80FA5D4())
{
data->state = 6;
- data->field_13 = sub_81165E8(data->field_0);
+ data->playerCount = UnionRoomLeaderField0CompactionAndCount(data->field_0);
}
break;
case 10:
- id = ((gUnknown_203B058 & 0xF) == 2) ? 1 : 0;
+ id = ((sPlayerCurrActivity & 0xF) == 2) ? 1 : 0;
if (PrintOnTextbox(&data->textState, gUnknown_845767C[id]))
{
- data->field_13 = sub_81165E8(data->field_0);
+ data->playerCount = UnionRoomLeaderField0CompactionAndCount(data->field_0);
RedrawListMenu(data->listTaskId);
data->state = 4;
}
break;
case 29:
- id = ((gUnknown_203B059 & 0xF) == 2) ? 0 : 1;
+ // Other player cancelled.
+ id = ((sPlayerActivityGroupSize & 0xF) == 2) ? 0 : 1;
if (PrintOnTextbox(&data->textState, gUnknown_845767C[id]))
{
data->state = 21;
@@ -765,19 +862,19 @@ static void sub_8115A68(u8 taskId)
}
break;
case 11:
- switch (sub_811A14C(&data->textState, sub_80FA634(ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName)))
+ switch (UnionRoomHandleYesNo(&data->textState, TrainerIdAndNameStillInPartnersList(ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.uname)))
{
case 0:
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(0, 0);
data->field_19 = 5;
- sub_80FA670(5, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ SendByteToPartnerByIdAndName(5, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.uname);
data->state = 12;
break;
case 1:
case -1:
data->field_19 = 6;
- sub_80FA670(6, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ SendByteToPartnerByIdAndName(6, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.uname);
data->state = 12;
break;
case -3:
@@ -786,29 +883,31 @@ static void sub_8115A68(u8 taskId)
}
break;
case 12:
- val = sub_80FA6FC(ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ val = WaitSendByteToPartnerByIdAndName(ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.uname);
if (val == 1)
{
+ // Xfer complete
if (data->field_19 == 5)
{
- data->field_0->arr[data->field_13].field_1B = 0;
+ // Sent "OK"
+ data->field_0->arr[data->playerCount].field_1B = 0;
RedrawListMenu(data->listTaskId);
- data->field_13++;
- if (data->field_13 == (gUnknown_203B059 & 0xF))
+ data->playerCount++;
+ if (data->playerCount == (sPlayerActivityGroupSize & 0xF))
{
- if ((gUnknown_203B059 & 0xF0) != 0 || data->field_13 == 4)
+ if ((sPlayerActivityGroupSize & 0xF0) != 0 || data->playerCount == 4)
{
data->state = 15;
}
else
{
- IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->field_13 - 1]);
+ IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->playerCount - 1]);
StringExpandPlaceholders(gStringVar4, gUnknown_8457554);
data->state = 13;
}
- sub_80F8F5C();
- sub_811586C(data->field_11, gUnknown_203B059, data->field_13);
+ LinkRfu_StopManagerAndFinalizeSlots();
+ PrintNumPlayersWaitingForMsg(data->nPlayerModeWindowId, sPlayerActivityGroupSize, data->playerCount);
}
else
{
@@ -817,9 +916,10 @@ static void sub_8115A68(u8 taskId)
}
else
{
- sub_80FBD4C(data->field_0->arr[data->field_13].unk.playerName, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId));
- data->field_0->arr[data->field_13].field_1A_0 = 0;
- sub_81165E8(data->field_0);
+ // Sent "no"
+ RequestDisconnectSlotByTrainerNameAndId(data->field_0->arr[data->playerCount].gname_uname.uname, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId));
+ data->field_0->arr[data->playerCount].groupScheduledAnim = UNION_ROOM_SPAWN_NONE;
+ UnionRoomLeaderField0CompactionAndCount(data->field_0);
RedrawListMenu(data->listTaskId);
data->state = 4;
}
@@ -828,7 +928,8 @@ static void sub_8115A68(u8 taskId)
}
else if (val == 2)
{
- sub_80FB9E4(0, 0);
+ // Disconnect
+ RfuSetErrorStatus(0, 0);
data->state = 4;
}
break;
@@ -837,22 +938,25 @@ static void sub_8115A68(u8 taskId)
data->state = 14;
break;
case 14:
- if (++data->field_E > 120)
+ if (++data->delayTimerAfterOk > 120)
data->state = 17;
break;
case 15:
+ // Are these members OK?
if (PrintOnTextbox(&data->textState, gUnknown_8457514))
data->state = 16;
break;
case 16:
- switch (sub_811A14C(&data->textState, FALSE))
+ switch (UnionRoomHandleYesNo(&data->textState, FALSE))
{
case 0:
+ // Yes
data->state = 17;
break;
case 1:
case -1:
- if ((gUnknown_203B059 & 0xF0) != 0)
+ // No
+ if ((sPlayerActivityGroupSize & 0xF0) != 0)
data->state = 30;
else
data->state = 19;
@@ -864,16 +968,16 @@ static void sub_8115A68(u8 taskId)
data->state = 20;
break;
case 20:
- switch (sub_811A14C(&data->textState, FALSE))
+ switch (UnionRoomHandleYesNo(&data->textState, FALSE))
{
case 0:
data->state = 23;
break;
case 1:
case -1:
- if ((gUnknown_203B059 & 0xF0) != 0)
+ if ((sPlayerActivityGroupSize & 0xF0) != 0)
data->state = 15;
- else if (data->field_13 == (gUnknown_203B059 & 0xF))
+ else if (data->playerCount == (sPlayerActivityGroupSize & 0xF))
data->state = 15;
else
data->state = 4;
@@ -881,13 +985,15 @@ static void sub_8115A68(u8 taskId)
}
break;
case 17:
- if (!sub_8116444(data, 7, 23))
+ // Go to start
+ // Final membership check
+ if (!Leader_SetStateIfMemberListChanged(data, 7, 23))
data->state = 18;
break;
case 18:
- if (sub_80F8F40())
+ if (LmanAcceptSlotFlagIsNotZero())
{
- if (sub_80F8F7C(FALSE))
+ if (WaitRfuState(FALSE))
{
data->state = 26;
}
@@ -899,14 +1005,16 @@ static void sub_8115A68(u8 taskId)
}
break;
case 30:
+ // Mode with members will be canceled.
if (PrintOnTextbox(&data->textState, gUnknown_8457610))
data->state = 23;
break;
case 21:
case 23:
+ // An error occurred. Please start over from the beginning.
DestroyWirelessStatusIndicatorSprite();
- sub_80F8DC0();
- sub_81161E4(data);
+ LinkRfu_Shutdown();
+ Leader_DestroyResources(data);
data->state++;
break;
case 24:
@@ -920,7 +1028,7 @@ static void sub_8115A68(u8 taskId)
gSpecialVar_Result = 8;
break;
case 26:
- if (sub_80FBA00())
+ if (RfuIsErrorStatus1or2())
{
data->state = 29;
}
@@ -928,9 +1036,9 @@ static void sub_8115A68(u8 taskId)
{
if (gReceivedRemoteLinkPlayers != 0)
{
- sub_80FAFE0(1);
- sub_8117990();
- sub_81161E4(data);
+ UpdateGameData_GroupLockedIn(TRUE);
+ CreateTask_RunScriptAndFadeToActivity();
+ Leader_DestroyResources(data);
DestroyTask(taskId);
}
}
@@ -938,196 +1046,196 @@ static void sub_8115A68(u8 taskId)
}
}
-static void sub_81161E4(struct UnkStruct_Leader * data)
+static void Leader_DestroyResources(struct UnkStruct_Leader * data)
{
- ClearWindowTilemap(data->field_11);
- ClearStdWindowAndFrame(data->field_11, FALSE);
+ ClearWindowTilemap(data->nPlayerModeWindowId);
+ ClearStdWindowAndFrame(data->nPlayerModeWindowId, FALSE);
DestroyListMenuTask(data->listTaskId, 0, 0);
- ClearWindowTilemap(data->field_10);
+ ClearWindowTilemap(data->bButtonCancelWindowId);
ClearStdWindowAndFrame(data->listWindowId, FALSE);
CopyBgTilemapBufferToVram(0);
- RemoveWindow(data->field_11);
+ RemoveWindow(data->nPlayerModeWindowId);
RemoveWindow(data->listWindowId);
- RemoveWindow(data->field_10);
- DestroyTask(data->field_17);
+ RemoveWindow(data->bButtonCancelWindowId);
+ DestroyTask(data->listenTaskId);
Free(data->field_8);
Free(data->field_0);
Free(data->field_4);
}
-static void sub_8116244(u8 *dst, u8 caseId)
+static void Leader_GetAcceptNewMemberPrompt(u8 *dst, u8 activity)
{
- switch (caseId)
+ switch (activity)
{
- case 1:
- case 2:
- case 4:
+ case ACTIVITY_BATTLE:
+ case ACTIVITY_DBLBATTLE:
+ case ACTIVITY_TRADE:
StringExpandPlaceholders(dst, gUnknown_84574A0);
break;
- case 21:
- case 22:
+ case ACTIVITY_WCARD2:
+ case ACTIVITY_WNEWS2:
StringExpandPlaceholders(dst, gUnknown_84574C4);
break;
- case 3:
- case 9:
- case 10:
- case 11:
+ case ACTIVITY_MLTBATTLE:
+ case ACTIVITY_PJUMP:
+ case ACTIVITY_BCRUSH:
+ case ACTIVITY_BPICK:
StringExpandPlaceholders(dst, gUnknown_84574EC);
break;
}
}
-static void sub_81162E0(u8 *dst, u8 caseId)
+static void GetYouDeclinedTheOfferMessage(u8 *dst, u8 activity)
{
- switch (caseId)
+ switch (activity)
{
- case 65:
- case 68:
+ case ACTIVITY_BATTLE | IN_UNION_ROOM:
+ case ACTIVITY_TRADE | IN_UNION_ROOM:
StringExpandPlaceholders(dst, gUnknown_8457E28);
break;
- case 69:
- case 72:
+ case ACTIVITY_CHAT | IN_UNION_ROOM:
+ case ACTIVITY_CARD | IN_UNION_ROOM:
StringExpandPlaceholders(dst, gUnknown_8457E44);
break;
}
}
-static void sub_811631C(u8 *dst, u8 caseId)
+static void GetYouAskedToJoinGroupPleaseWaitMessage(u8 *dst, u8 activity)
{
- switch (caseId)
+ switch (activity)
{
- case 1:
- case 2:
- case 4:
- case 21:
- case 22:
+ case ACTIVITY_BATTLE:
+ case ACTIVITY_DBLBATTLE:
+ case ACTIVITY_TRADE:
+ case ACTIVITY_WCARD2:
+ case ACTIVITY_WNEWS2:
StringExpandPlaceholders(dst, gUnknown_8459238);
break;
- case 3:
- case 9:
- case 10:
- case 11:
+ case ACTIVITY_MLTBATTLE:
+ case ACTIVITY_PJUMP:
+ case ACTIVITY_BCRUSH:
+ case ACTIVITY_BPICK:
StringExpandPlaceholders(dst, gUnknown_8459250);
break;
}
}
-static void sub_81163B0(u8 *dst, u8 caseId)
+static void GetGroupLeaderSentAnOKMessage(u8 *dst, u8 caseId)
{
switch (caseId)
{
- case 1:
- case 2:
- case 4:
- case 21:
- case 22:
+ case ACTIVITY_BATTLE:
+ case ACTIVITY_DBLBATTLE:
+ case ACTIVITY_TRADE:
+ case ACTIVITY_WCARD2:
+ case ACTIVITY_WNEWS2:
StringExpandPlaceholders(dst, gUnknown_84576AC);
break;
- case 3:
- case 9:
- case 10:
- case 11:
+ case ACTIVITY_MLTBATTLE:
+ case ACTIVITY_PJUMP:
+ case ACTIVITY_BCRUSH:
+ case ACTIVITY_BPICK:
StringExpandPlaceholders(dst, gUnknown_84576C4);
break;
}
}
-static bool8 sub_8116444(struct UnkStruct_Leader * data, u32 arg1, u32 arg2)
+static bool8 Leader_SetStateIfMemberListChanged(struct UnkStruct_Leader * data, u32 state1, u32 state2)
{
- switch (sub_8116524(data->field_0))
+ switch (LeaderUpdateGroupMembership(data->field_0))
{
- case 1:
+ case UNION_ROOM_SPAWN_IN:
PlaySE(SE_PC_LOGIN);
RedrawListMenu(data->listTaskId);
- IntlConvPartnerUname7(gStringVar2, data->field_0->arr[data->field_13]);
- sub_8116244(gStringVar4, gUnknown_203B058);
- data->state = arg1;
+ IntlConvPartnerUname7(gStringVar2, data->field_0->arr[data->playerCount]);
+ Leader_GetAcceptNewMemberPrompt(gStringVar4, sPlayerCurrActivity);
+ data->state = state1;
break;
- case 2:
- sub_80FB9E4(0, 0);
+ case UNION_ROOM_SPAWN_OUT:
+ RfuSetErrorStatus(0, 0);
RedrawListMenu(data->listTaskId);
- data->state = arg2;
+ data->state = state2;
return TRUE;
}
return FALSE;
}
-static void sub_81164C8(u8 windowId, s32 itemId, u8 y)
+static void ItemPrintFunc_PossibleGroupMembers(u8 windowId, s32 itemId, u8 y)
{
struct UnkStruct_Leader * data = sUnionRoomMain.leader;
u8 var = 0;
- switch (data->field_0->arr[itemId].field_1A_0)
+ switch (data->field_0->arr[itemId].groupScheduledAnim)
{
- case 1:
+ case UNION_ROOM_SPAWN_IN:
if (data->field_0->arr[itemId].field_1B != 0)
- var = 2;
+ var = UR_COLOR_GRN_WHT_LTG;
break;
- case 2:
- var = 1;
+ case UNION_ROOM_SPAWN_OUT:
+ var = UR_COLOR_RED_WHT_LTR;
break;
}
- sub_811A910(windowId, 0, y, &data->field_0->arr[itemId], var, itemId);
+ PrintGroupMemberCandidateOnWindowWithColor(windowId, 0, y, &data->field_0->arr[itemId], var, itemId);
}
-static u8 sub_8116524(struct UnkStruct_Main0 * arg0)
+static u8 LeaderUpdateGroupMembership(struct UnkStruct_Main0 * arg0)
{
struct UnkStruct_Leader * data = sUnionRoomMain.leader;
- u8 ret = 0;
+ u8 ret = UNION_ROOM_SPAWN_NONE;
u8 i;
s32 id;
- for (i = 1; i < 5; i++)
+ for (i = 1; i < UROOM_MAX_PARTY_SIZE; i++)
{
- u16 var = data->field_0->arr[i].field_1A_0;
- if (var == 1)
+ u16 var = data->field_0->arr[i].groupScheduledAnim;
+ if (var == UNION_ROOM_SPAWN_IN)
{
- id = sub_811A748(&data->field_0->arr[i], data->field_4->arr);
+ id = Findx20Inx1CArray(&data->field_0->arr[i], data->field_4->arr);
if (id != 0xFF)
{
- data->field_0->arr[i].unk = data->field_4->arr[id].unk0;
- data->field_0->arr[i].field_18 = var;
+ data->field_0->arr[i].gname_uname = data->field_4->arr[id].gname_uname;
+ data->field_0->arr[i].field_18 = 1;
}
else
{
- data->field_0->arr[i].field_1A_0 = 2;
- ret = 2;
+ data->field_0->arr[i].groupScheduledAnim = UNION_ROOM_SPAWN_OUT;
+ ret = UNION_ROOM_SPAWN_OUT;
}
}
}
- for (id = 0; id < 4; id++)
- sub_811A798(data->field_0->arr, &data->field_4->arr[id], 5);
+ for (id = 0; id < RFU_CHILD_MAX; id++)
+ Appendx1Ctox20(data->field_0->arr, &data->field_4->arr[id], UROOM_MAX_PARTY_SIZE);
- if (ret != 2)
+ if (ret != UNION_ROOM_SPAWN_OUT)
{
- for (id = 0; id < 5; id++)
+ for (id = 0; id < UROOM_MAX_PARTY_SIZE; id++)
{
if (data->field_0->arr[id].field_1B != 0)
- ret = 1;
+ ret = UNION_ROOM_SPAWN_IN;
}
}
return ret;
}
-static u8 sub_81165E8(struct UnkStruct_Main0 * arg0)
+static u8 UnionRoomLeaderField0CompactionAndCount(struct UnkStruct_Main0 * arg0)
{
struct UnkStruct_Leader * data = sUnionRoomMain.leader;
u8 copiedCount;
s32 i;
u8 ret;
- for (i = 0; i < 5; i++)
+ for (i = 0; i < UROOM_MAX_PARTY_SIZE; i++)
data->field_8->arr[i] = data->field_0->arr[i];
copiedCount = 0;
- for (i = 0; i < 5; i++)
+ for (i = 0; i < UROOM_MAX_PARTY_SIZE; i++)
{
- if (data->field_8->arr[i].field_1A_0 == 1)
+ if (data->field_8->arr[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN)
{
data->field_0->arr[copiedCount] = data->field_8->arr[i];
copiedCount++;
@@ -1135,18 +1243,18 @@ static u8 sub_81165E8(struct UnkStruct_Main0 * arg0)
}
ret = copiedCount;
- for (; copiedCount < 5; copiedCount++)
+ for (; copiedCount < UROOM_MAX_PARTY_SIZE; copiedCount++)
{
- data->field_0->arr[copiedCount].unk = gUnknown_8457034;
+ data->field_0->arr[copiedCount].gname_uname = sUnionGnameUnamePair_Dummy;
data->field_0->arr[copiedCount].field_18 = 0;
- data->field_0->arr[copiedCount].field_1A_0 = 0;
- data->field_0->arr[copiedCount].field_1A_1 = 0;
+ data->field_0->arr[copiedCount].groupScheduledAnim = UNION_ROOM_SPAWN_NONE;
+ data->field_0->arr[copiedCount].field_1A_1 = FALSE;
data->field_0->arr[copiedCount].field_1B = 0;
}
- for (i = 0; i < 5; i++)
+ for (i = 0; i < UROOM_MAX_PARTY_SIZE; i++)
{
- if (data->field_0->arr[i].field_1A_0 != 1)
+ if (data->field_0->arr[i].groupScheduledAnim != UNION_ROOM_SPAWN_IN)
continue;
if (data->field_0->arr[i].field_1B != 0x40)
continue;
@@ -1163,7 +1271,7 @@ void TryJoinLinkGroup(void)
u8 taskId;
struct UnkStruct_Group * dataPtr;
- taskId = CreateTask(sub_8116738, 0);
+ taskId = CreateTask(Task_TryJoinLinkGroup, 0);
sUnionRoomMain.group = dataPtr = (void*)(gTasks[taskId].data);
sGroup = dataPtr;
@@ -1172,7 +1280,7 @@ void TryJoinLinkGroup(void)
gSpecialVar_Result = 0;
}
-static void sub_8116738(u8 taskId)
+static void Task_TryJoinLinkGroup(u8 taskId)
{
s32 id;
struct UnkStruct_Group * data = sUnionRoomMain.group;
@@ -1180,11 +1288,11 @@ static void sub_8116738(u8 taskId)
switch (data->state)
{
case 0:
- SetHostRFUtgtGname(gUnknown_84570C8[gSpecialVar_0x8004], 0, 0);
- gUnknown_203B058 = gUnknown_84570C8[gSpecialVar_0x8004];
- sub_800B1F4();
+ SetHostRFUtgtGname(sLinkGroupToURoomActivity[gSpecialVar_0x8004], 0, 0);
+ sPlayerCurrActivity = sLinkGroupToURoomActivity[gSpecialVar_0x8004];
+ SetWirelessCommType1();
OpenLink();
- sub_80FBBD8();
+ InitializeRfuLinkManager_JoinGroup();
data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
data->field_0 = AllocZeroed(16 * sizeof(struct UnkStruct_x20));
data->state = 1;
@@ -1194,34 +1302,34 @@ static void sub_8116738(u8 taskId)
data->state = 2;
break;
case 2:
- sub_811A650(data->field_4->arr, 4);
- sub_811A5E4(data->field_0->arr, 16);
- data->field_11 = sub_811A054(data->field_4, gSpecialVar_0x8004);
- data->field_C = AddWindow(&gUnknown_8456CD0);
- data->listWindowId = AddWindow(&gUnknown_8456D4C);
- data->field_D = AddWindow(&gUnknown_8456D54);
-
- FillWindowPixelBuffer(data->field_C, PIXEL_FILL(2));
- sub_811A444(data->field_C, 0, gUnknown_8458FC8, 8, 2, 4);
- PutWindowTilemap(data->field_C);
- CopyWindowToVram(data->field_C, 2);
+ BlankUnkStruct_x1CArray(data->field_4->arr, 4);
+ BlankUnkStruct_x20Array(data->field_0->arr, 16);
+ data->listenTaskId = CreateTask_ListenForPartnersWithCompatibleSerialNos(data->field_4, gSpecialVar_0x8004);
+ data->bButtonCancelWindowId = AddWindow(&sWindowTemplate_BButtonCancel);
+ data->listWindowId = AddWindow(&sWindowTemplate_MysteryGiftList);
+ data->playerNameAndIdWindowId = AddWindow(&sWindowTemplate_MysteryGiftPlayerNameAndId);
+
+ FillWindowPixelBuffer(data->bButtonCancelWindowId, PIXEL_FILL(2));
+ UR_AddTextPrinterParameterized(data->bButtonCancelWindowId, 0, gUnknown_8458FC8, 8, 2, UR_COLOR_WHT_DKE_LTE);
+ PutWindowTilemap(data->bButtonCancelWindowId);
+ CopyWindowToVram(data->bButtonCancelWindowId, 2);
DrawStdWindowFrame(data->listWindowId, FALSE);
- gMultiuseListMenuTemplate = gUnknown_8456DDC;
+ gMultiuseListMenuTemplate = sListMenuTemplate_UnionRoomGroups;
gMultiuseListMenuTemplate.windowId = data->listWindowId;
data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
- DrawStdWindowFrame(data->field_D, FALSE);
- PutWindowTilemap(data->field_D);
- sub_8115924(data->field_D);
- CopyWindowToVram(data->field_D, 2);
+ DrawStdWindowFrame(data->playerNameAndIdWindowId, FALSE);
+ PutWindowTilemap(data->playerNameAndIdWindowId);
+ PrintPlayerNameAndIdOnWindow(data->playerNameAndIdWindowId);
+ CopyWindowToVram(data->playerNameAndIdWindowId, 2);
CopyBgTilemapBufferToVram(0);
- data->field_F = 0;
+ data->leaderId = 0;
data->state = 3;
break;
case 3:
- id = sub_8116FE4();
+ id = GetNewLeaderCandidate();
switch (id)
{
case 1:
@@ -1234,19 +1342,20 @@ static void sub_8116738(u8 taskId)
{
// this unused variable along with the assignment is needed to match
u32 unusedVar;
- unusedVar = data->field_0->arr[id].unk.gname.unk_0a_0;
+ unusedVar = data->field_0->arr[id].gname_uname.gname.activity;
- if (data->field_0->arr[id].field_1A_0 == 1 && !data->field_0->arr[id].unk.gname.unk_0a_7)
+ if (data->field_0->arr[id].groupScheduledAnim == UNION_ROOM_SPAWN_IN && !data->field_0->arr[id].gname_uname.gname.started)
{
- u32 var = sub_8116D10(data, id);
+ u32 var = IsTryingToTradeWithHoennTooSoon(data, id);
if (var == 0)
{
- sub_8116D60(data, id);
+ AskToJoinRfuGroup(data, id);
data->state = 5;
PlaySE(SE_PN_ON);
}
else
{
+ // Postgame flags not both set
StringCopy(gStringVar4, gUnknown_8457608[var - 1]);
data->state = 18;
PlaySE(SE_PN_ON);
@@ -1268,30 +1377,38 @@ static void sub_8116738(u8 taskId)
}
break;
case 5:
- sub_811631C(gStringVar4, gUnknown_203B058);
+ GetYouAskedToJoinGroupPleaseWaitMessage(gStringVar4, sPlayerCurrActivity);
if (PrintOnTextbox(&data->textState, gStringVar4))
{
- IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->field_F]);
+ IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->leaderId]);
data->state = 6;
}
break;
case 6:
if (gReceivedRemoteLinkPlayers != 0)
{
- gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.unk_0a_0;
- sub_80FB9E4(0, 0);
- switch (gUnknown_203B058)
+ sPlayerCurrActivity = data->field_0->arr[data->leaderId].gname_uname.gname.activity;
+ RfuSetErrorStatus(0, 0);
+ switch (sPlayerCurrActivity)
{
- case 1 ... 5:
- case 9 ... 11:
- case 13 ... 14:
- case 21 ... 22:
+ case ACTIVITY_BATTLE:
+ case ACTIVITY_DBLBATTLE:
+ case ACTIVITY_MLTBATTLE:
+ case ACTIVITY_TRADE:
+ case ACTIVITY_CHAT:
+ case ACTIVITY_PJUMP:
+ case ACTIVITY_BCRUSH:
+ case ACTIVITY_BPICK:
+ case ACTIVITY_SPINTRADE:
+ case ACTIVITY_ITEMTRADE:
+ case ACTIVITY_WCARD2:
+ case ACTIVITY_WNEWS2:
data->state = 20;
break;
}
}
- switch (sub_80FB9F4())
+ switch (RfuGetErrorStatus())
{
case 1:
data->state = 12;
@@ -1302,31 +1419,32 @@ static void sub_8116738(u8 taskId)
data->state = 14;
break;
case 5:
- sub_81163B0(gStringVar4, gUnknown_203B058);
+ GetGroupLeaderSentAnOKMessage(gStringVar4, sPlayerCurrActivity);
if (PrintOnTextbox(&data->textState, gStringVar4))
{
- sub_80FB9E4(7, 0);
- StringCopy(gStringVar1, gUnknown_8456C74[gUnknown_203B058]);
+ RfuSetErrorStatus(7, 0);
+ StringCopy(gStringVar1, sUnionRoomActivityStringPtrs[sPlayerCurrActivity]);
StringExpandPlaceholders(gStringVar4, gUnknown_8457700);
}
break;
case 7:
- if (data->field_15 > 0xF0)
+ // Wait 4 seconds
+ if (data->delayBeforePrint > 240)
{
if (PrintOnTextbox(&data->textState, gStringVar4))
{
- sub_80FB9E4(12, 0);
- data->field_15 = 0;
+ RfuSetErrorStatus(12, 0);
+ data->delayBeforePrint = 0;
}
}
else
{
- data->field_15++;
+ data->delayBeforePrint++;
}
break;
}
- if (!sub_80FB9F4() && JOY_NEW(B_BUTTON))
+ if (!RfuGetErrorStatus() && JOY_NEW(B_BUTTON))
data->state = 7;
break;
case 7:
@@ -1334,10 +1452,10 @@ static void sub_8116738(u8 taskId)
data->state = 8;
break;
case 8:
- switch (sub_811A14C(&data->textState, sub_80FB9F4()))
+ switch (UnionRoomHandleYesNo(&data->textState, RfuGetErrorStatus()))
{
case 0:
- sub_80FA6BC();
+ LinkRfuNIsend8();
data->state = 9;
RedrawListMenu(data->listTaskId);
break;
@@ -1353,7 +1471,7 @@ static void sub_8116738(u8 taskId)
}
break;
case 9:
- if (sub_80FB9F4())
+ if (RfuGetErrorStatus())
data->state = 6;
break;
case 10:
@@ -1361,23 +1479,23 @@ static void sub_8116738(u8 taskId)
case 14:
case 18:
case 20:
- ClearWindowTilemap(data->field_D);
- ClearStdWindowAndFrame(data->field_D, FALSE);
+ ClearWindowTilemap(data->playerNameAndIdWindowId);
+ ClearStdWindowAndFrame(data->playerNameAndIdWindowId, FALSE);
DestroyListMenuTask(data->listTaskId, 0, 0);
- ClearWindowTilemap(data->field_C);
+ ClearWindowTilemap(data->bButtonCancelWindowId);
ClearStdWindowAndFrame(data->listWindowId, FALSE);
CopyBgTilemapBufferToVram(0);
- RemoveWindow(data->field_D);
+ RemoveWindow(data->playerNameAndIdWindowId);
RemoveWindow(data->listWindowId);
- RemoveWindow(data->field_C);
- DestroyTask(data->field_11);
+ RemoveWindow(data->bButtonCancelWindowId);
+ DestroyTask(data->listenTaskId);
Free(data->field_0);
Free(data->field_4);
data->state++;
break;
case 13:
DestroyWirelessStatusIndicatorSprite();
- if (PrintOnTextbox(&data->textState, gUnknown_8457754[sub_80FB9F4()]))
+ if (PrintOnTextbox(&data->textState, gUnknown_8457754[RfuGetErrorStatus()]))
{
gSpecialVar_Result = 6;
data->state = 23;
@@ -1390,7 +1508,7 @@ static void sub_8116738(u8 taskId)
break;
case 15:
DestroyWirelessStatusIndicatorSprite();
- if (PrintOnTextbox(&data->textState, gUnknown_8457754[sub_80FB9F4()]))
+ if (PrintOnTextbox(&data->textState, gUnknown_8457754[RfuGetErrorStatus()]))
{
gSpecialVar_Result = 8;
data->state = 23;
@@ -1405,25 +1523,25 @@ static void sub_8116738(u8 taskId)
break;
case 23:
DestroyTask(taskId);
- sub_811A41C();
- sub_80F8DC0();
+ JoinGroup_BlankBg0AndEnableScriptContexts();
+ LinkRfu_Shutdown();
break;
case 21:
- sub_8117990();
+ CreateTask_RunScriptAndFadeToActivity();
DestroyTask(taskId);
break;
}
}
-static u32 sub_8116D10(struct UnkStruct_Group * arg0, s32 id)
+static u32 IsTryingToTradeWithHoennTooSoon(struct UnkStruct_Group * arg0, s32 id)
{
struct UnkStruct_x20 * structPtr = &arg0->field_0->arr[id];
- if (gUnknown_203B058 == 4 && structPtr->unk.gname.unk_00.unk_01_2 != VERSION_FIRE_RED && structPtr->unk.gname.unk_00.unk_01_2 != VERSION_LEAF_GREEN)
+ if (sPlayerCurrActivity == ACTIVITY_TRADE && structPtr->gname_uname.gname.unk_00.version != VERSION_FIRE_RED && structPtr->gname_uname.gname.unk_00.version != VERSION_LEAF_GREEN)
{
if (!(gSaveBlock2Ptr->specialSaveWarpFlags & CHAMPION_SAVEWARP))
return 1;
- else if (structPtr->unk.gname.unk_00.isChampion)
+ else if (structPtr->gname_uname.gname.unk_00.isChampion)
return 0;
}
else
@@ -1434,23 +1552,23 @@ static u32 sub_8116D10(struct UnkStruct_Group * arg0, s32 id)
return 2;
}
-static void sub_8116D60(struct UnkStruct_Group * data, s32 id)
+static void AskToJoinRfuGroup(struct UnkStruct_Group * data, s32 id)
{
- data->field_F = id;
+ data->leaderId = id;
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(0, 0);
RedrawListMenu(data->listTaskId);
- IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->field_F]);
- sub_80FB008(gUnknown_84570C8[gSpecialVar_0x8004], 0, 1);
- sub_80FBF54(data->field_0->arr[data->field_F].unk.playerName, ReadAsU16(data->field_0->arr[data->field_F].unk.gname.unk_00.playerTrainerId));
+ IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->leaderId]);
+ UpdateGameDataWithActivitySpriteGendersFlag(sLinkGroupToURoomActivity[gSpecialVar_0x8004], 0, TRUE);
+ CreateTask_RfuReconnectWithParent(data->field_0->arr[data->leaderId].gname_uname.uname, ReadAsU16(data->field_0->arr[data->leaderId].gname_uname.gname.unk_00.playerTrainerId));
}
-u8 sub_8116DE0(void)
+u8 CreateTask_ListenToWireless(void)
{
u8 taskId;
struct UnkStruct_Group * dataPtr;
- taskId = CreateTask(sub_8116E1C, 0);
+ taskId = CreateTask(Task_ListenToWireless, 0);
sUnionRoomMain.group = dataPtr = (void*)(gTasks[taskId].data);
dataPtr->state = 0;
@@ -1461,7 +1579,7 @@ u8 sub_8116DE0(void)
return taskId;
}
-static void sub_8116E1C(u8 taskId)
+static void Task_ListenToWireless(u8 taskId)
{
struct UnkStruct_Group * data = sUnionRoomMain.group;
@@ -1469,53 +1587,53 @@ static void sub_8116E1C(u8 taskId)
{
case 0:
SetHostRFUtgtGname(0, 0, 0);
- sub_800B1F4();
+ SetWirelessCommType1();
OpenLink();
- sub_80FBBD8();
+ InitializeRfuLinkManager_JoinGroup();
sub_80FB128(TRUE);
data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
data->field_0 = AllocZeroed(16 * sizeof(struct UnkStruct_x20));
data->state = 2;
break;
case 2:
- sub_811A650(data->field_4->arr, 4);
- sub_811A5E4(data->field_0->arr, 16);
- data->field_11 = sub_811A054(data->field_4, 0xFF);
- data->field_F = 0;
+ BlankUnkStruct_x1CArray(data->field_4->arr, 4);
+ BlankUnkStruct_x20Array(data->field_0->arr, 16);
+ data->listenTaskId = CreateTask_ListenForPartnersWithCompatibleSerialNos(data->field_4, 0xFF);
+ data->leaderId = 0;
data->state = 3;
break;
case 3:
- if (sub_8116FE4() == 1)
+ if (GetNewLeaderCandidate() == 1)
PlaySE(SE_PC_LOGIN);
if (gTasks[taskId].data[15] == 0xFF)
data->state = 10;
break;
case 10:
- DestroyTask(data->field_11);
+ DestroyTask(data->listenTaskId);
Free(data->field_0);
Free(data->field_4);
- sub_80F8DC0();
+ LinkRfu_Shutdown();
data->state++;
break;
case 11:
- sub_80F8DC0();
+ LinkRfu_Shutdown();
DestroyTask(taskId);
break;
}
}
-static bool32 sub_8116F28(u32 arg0, u32 id)
+static bool32 IsPartnerActivityAcceptable(u32 activity, u32 group)
{
- if (id == 0xFF)
+ if (group == 0xFF)
return TRUE;
- if (id <= NELEMS(gUnknown_8457094)) // UB: <= may access data outside the array
+ if (group <= NELEMS(sAcceptedActivityIds)) // UB: <= may access data outside the array
{
- const u8 *bytes = gUnknown_8457094[id];
+ const u8 *bytes = sAcceptedActivityIds[group];
while ((*(bytes) != 0xFF))
{
- if ((*bytes) == arg0)
+ if ((*bytes) == activity)
return TRUE;
bytes++;
}
@@ -1524,30 +1642,30 @@ static bool32 sub_8116F28(u32 arg0, u32 id)
return FALSE;
}
-static u8 sub_8116F5C(struct UnkStruct_Group * data, u32 id)
+static u8 URoomGroupListGetTextColor(struct UnkStruct_Group * data, u32 id)
{
- if (data->field_0->arr[id].field_1A_0 == 1)
+ if (data->field_0->arr[id].groupScheduledAnim == UNION_ROOM_SPAWN_IN)
{
- if (data->field_0->arr[id].unk.gname.unk_0a_7)
- return 3;
- else if (data->field_0->arr[id].field_1A_1 != 0)
- return 1;
+ if (data->field_0->arr[id].gname_uname.gname.started)
+ return UR_COLOR_WHT_WHT_LTE;
+ else if (data->field_0->arr[id].field_1A_1)
+ return UR_COLOR_RED_WHT_LTR;
else if (data->field_0->arr[id].field_1B != 0)
- return 2;
+ return UR_COLOR_GRN_WHT_LTG;
}
- return 0;
+ return UR_COLOR_DKE_WHT_LTE;
}
-static void sub_8116F94(u8 windowId, s32 itemId, u8 y)
+static void ListMenuItemPrintFunc_UnionRoomGroups(u8 windowId, s32 itemId, u8 y)
{
struct UnkStruct_Group * data = sUnionRoomMain.group;
- u8 var = sub_8116F5C(data, itemId);
+ u8 color_idx = URoomGroupListGetTextColor(data, itemId);
- sub_811A81C(windowId, 8, y, &data->field_0->arr[itemId], var, itemId);
+ PrintUnionRoomGroupOnWindow(windowId, 8, y, &data->field_0->arr[itemId], color_idx, itemId);
}
-static u8 sub_8116FE4(void)
+static u8 GetNewLeaderCandidate(void)
{
struct UnkStruct_Group * data = sUnionRoomMain.group;
u8 ret = 0;
@@ -1556,17 +1674,17 @@ static u8 sub_8116FE4(void)
for (i = 0; i < 16; i++)
{
- if (data->field_0->arr[i].field_1A_0 != 0)
+ if (data->field_0->arr[i].groupScheduledAnim != UNION_ROOM_SPAWN_NONE)
{
- id = sub_811A748(&data->field_0->arr[i], data->field_4->arr);
+ id = Findx20Inx1CArray(&data->field_0->arr[i], data->field_4->arr);
if (id != 0xFF)
{
- if (data->field_0->arr[i].field_1A_0 == 1)
+ if (data->field_0->arr[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN)
{
- if (sub_811A6DC(&data->field_0->arr[i].unk, &data->field_4->arr[id].unk0))
+ if (AreUnionRoomPlayerGnamesDifferent(&data->field_0->arr[i].gname_uname, &data->field_4->arr[id].gname_uname))
{
- data->field_0->arr[i].unk = data->field_4->arr[id].unk0;
- data->field_0->arr[i].field_1B = 0x40;
+ data->field_0->arr[i].gname_uname = data->field_4->arr[id].gname_uname;
+ data->field_0->arr[i].field_1B = 64;
ret = 1;
}
else
@@ -1581,8 +1699,8 @@ static u8 sub_8116FE4(void)
}
else
{
- data->field_0->arr[i].field_1A_0 = 1;
- data->field_0->arr[i].field_1B = 0x40;
+ data->field_0->arr[i].groupScheduledAnim = UNION_ROOM_SPAWN_IN;
+ data->field_0->arr[i].field_1B = 64;
ret = 1;
}
@@ -1590,12 +1708,12 @@ static u8 sub_8116FE4(void)
}
else
{
- if (data->field_0->arr[i].field_1A_0 != 2)
+ if (data->field_0->arr[i].groupScheduledAnim != UNION_ROOM_SPAWN_OUT)
{
data->field_0->arr[i].field_18++;
if (data->field_0->arr[i].field_18 >= 300)
{
- data->field_0->arr[i].field_1A_0 = 2;
+ data->field_0->arr[i].groupScheduledAnim = UNION_ROOM_SPAWN_OUT;
ret = 2;
}
}
@@ -1603,29 +1721,29 @@ static u8 sub_8116FE4(void)
}
}
- for (id = 0; id < 4; id++)
+ for (id = 0; id < RFU_CHILD_MAX; id++)
{
- if (sub_811A798(data->field_0->arr, &data->field_4->arr[id], 16) != 0xFF)
+ if (Appendx1Ctox20(data->field_0->arr, &data->field_4->arr[id], 16) != 0xFF)
ret = 1;
}
return ret;
}
-static void sub_8117100(u8 taskId)
+static void Task_CallCB2ReturnFromLinkTrade(u8 taskId)
{
CB2_ReturnFromLinkTrade();
DestroyTask(taskId);
}
-u8 sub_8117118(void)
+u8 UnionRoom_CreateTask_CallCB2ReturnFromLinkTrade(void)
{
- u8 taskId = CreateTask(sub_8117100, 0);
+ u8 taskId = CreateTask(Task_CallCB2ReturnFromLinkTrade, 0);
return taskId;
}
-static void sub_8117130(u8 taskId)
+static void Task_StartUnionRoomTrade(u8 taskId)
{
u32 monId = GetPartyPositionOfRegisteredMon(&sUnionRoomTrade, GetMultiplayerId());
@@ -1665,7 +1783,7 @@ static void sub_8117130(u8 taskId)
}
}
-static void sub_8117280(u8 taskId)
+static void Task_ExchangeCards(u8 taskId)
{
switch (gTasks[taskId].data[0])
{
@@ -1689,11 +1807,11 @@ static void sub_8117280(u8 taskId)
if (GetLinkPlayerCount() == 2)
{
recvBuff = gBlockRecvBuffer[GetMultiplayerId() ^ 1];
- sub_81446D0(recvBuff[48]);
+ MEventHandleReceivedWonderCard(recvBuff[sizeof(struct TrainerCard) / 2]);
}
else
{
- sub_81446C4();
+ ResetReceivedWonderCardFlag();
}
ResetBlockReceivedFlags();
@@ -1703,16 +1821,16 @@ static void sub_8117280(u8 taskId)
}
}
-static void sub_8117354(void)
+static void CB2_ShowCard(void)
{
switch (gMain.state)
{
case 0:
- CreateTask(sub_8117280, 5);
+ CreateTask(Task_ExchangeCards, 5);
gMain.state++;
break;
case 1:
- if (!FuncIsActiveTask(sub_8117280))
+ if (!FuncIsActiveTask(Task_ExchangeCards))
ShowTrainerCardInLink(GetMultiplayerId() ^ 1, CB2_ReturnToField);
break;
}
@@ -1723,7 +1841,7 @@ static void sub_8117354(void)
BuildOamBuffer();
}
-void sub_81173C0(u16 battleFlags)
+void StartUnionRoomBattle(u16 battleFlags)
{
HealPlayerParty();
SavePlayerParty();
@@ -1731,12 +1849,12 @@ void sub_81173C0(u16 battleFlags)
gLinkPlayers[0].linkType = LINKTYPE_BATTLE;
gLinkPlayers[GetMultiplayerId()].id = GetMultiplayerId();
gLinkPlayers[GetMultiplayerId() ^ 1].id = GetMultiplayerId() ^ 1;
- gMain.savedCallback = sub_8081668;
+ gMain.savedCallback = CB2_ReturnFromCableClubBattle;
gBattleTypeFlags = battleFlags;
PlayBattleBGM();
}
-static void sub_8117440(u16 linkService, u16 x, u16 y)
+static void SetCableClubStateAndWarpCurrentMap(u16 linkService, u16 x, u16 y)
{
VarSet(VAR_CABLE_CLUB_STATE, linkService);
SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y);
@@ -1744,7 +1862,7 @@ static void sub_8117440(u16 linkService, u16 x, u16 y)
WarpIntoMap();
}
-static void sub_81174B4(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 linkService)
+static void SetCableClubStateAndWarpToNewMap(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 linkService)
{
gSpecialVar_0x8004 = linkService;
VarSet(VAR_CABLE_CLUB_STATE, linkService);
@@ -1755,17 +1873,17 @@ static void sub_81174B4(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 linkService)
WarpIntoMap();
}
-static void sub_8117534(void)
+static void CB2_TransitionToCableClub(void)
{
switch (gMain.state)
{
case 0:
- CreateTask(sub_8117280, 5);
+ CreateTask(Task_ExchangeCards, 5);
gMain.state++;
break;
case 1:
- if (!FuncIsActiveTask(sub_8117280))
- SetMainCallback2(sub_8056788);
+ if (!FuncIsActiveTask(Task_ExchangeCards))
+ SetMainCallback2(CB2_ReturnToFieldCableClub);
break;
}
@@ -1775,101 +1893,106 @@ static void sub_8117534(void)
BuildOamBuffer();
}
-static void sub_8117594(void *arg0, bool32 arg1)
+static void CreateTrainerCardInBuffer(void *dest, bool32 setWonderCard)
{
- TrainerCard_GenerateCardForLinkPlayer((struct TrainerCard * )arg0);
- if (arg1)
- *((u16 *)(arg0 + sizeof(struct TrainerCard))) = GetWonderCardFlagId();
+ TrainerCard_GenerateCardForLinkPlayer((struct TrainerCard * )dest);
+ if (setWonderCard)
+ *((u16 *)(dest + sizeof(struct TrainerCard))) = GetWonderCardFlagId();
else
- *((u16 *)(arg0 + sizeof(struct TrainerCard))) = 0;
+ *((u16 *)(dest + sizeof(struct TrainerCard))) = 0;
}
-static void sub_81175BC(u8 taskId)
+static void Task_StartActivity(u8 taskId)
{
- sub_81446C4();
- switch (gUnknown_203B058)
+ ResetReceivedWonderCardFlag();
+ switch (sPlayerCurrActivity)
{
- case 1 ... 4:
- case 9 ... 11:
- case 13:
- case 14:
+ case ACTIVITY_BATTLE:
+ case ACTIVITY_DBLBATTLE:
+ case ACTIVITY_MLTBATTLE:
+ case ACTIVITY_TRADE:
+ case ACTIVITY_PJUMP:
+ case ACTIVITY_BCRUSH:
+ case ACTIVITY_BPICK:
+ case ACTIVITY_SPINTRADE:
+ case ACTIVITY_ITEMTRADE:
RecordMixTrainerNames();
break;
}
- switch (gUnknown_203B058)
+ switch (sPlayerCurrActivity)
{
- case 65:
- case 81:
+ case ACTIVITY_BATTLE | IN_UNION_ROOM:
+ case ACTIVITY_ACCEPT | IN_UNION_ROOM:
CleanupOverworldWindowsAndTilemaps();
- gMain.savedCallback = sub_811C1C8;
+ gMain.savedCallback = CB2_UnionRoomBattle;
InitChooseHalfPartyForBattle(2);
break;
- case 1:
+ case ACTIVITY_BATTLE:
CleanupOverworldWindowsAndTilemaps();
- sub_8117594(gBlockSendBuffer, TRUE);
+ CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);
HealPlayerParty();
SavePlayerParty();
LoadPlayerBag();
- sub_81174B4(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_SINGLE_BATTLE);
- SetMainCallback2(sub_8117534);
+ SetCableClubStateAndWarpToNewMap(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_SINGLE_BATTLE);
+ SetMainCallback2(CB2_TransitionToCableClub);
break;
- case 2:
+ case ACTIVITY_DBLBATTLE:
CleanupOverworldWindowsAndTilemaps();
HealPlayerParty();
SavePlayerParty();
LoadPlayerBag();
- sub_8117594(gBlockSendBuffer, TRUE);
- sub_81174B4(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_DOUBLE_BATTLE);
- SetMainCallback2(sub_8117534);
+ CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);
+ SetCableClubStateAndWarpToNewMap(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_DOUBLE_BATTLE);
+ SetMainCallback2(CB2_TransitionToCableClub);
break;
- case 3:
+ case ACTIVITY_MLTBATTLE:
CleanupOverworldWindowsAndTilemaps();
HealPlayerParty();
SavePlayerParty();
LoadPlayerBag();
- sub_8117594(gBlockSendBuffer, TRUE);
- sub_81174B4(MAP_GROUP(BATTLE_COLOSSEUM_4P), MAP_NUM(BATTLE_COLOSSEUM_4P), 5, 8, USING_MULTI_BATTLE);
- SetMainCallback2(sub_8117534);
+ CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);
+ SetCableClubStateAndWarpToNewMap(MAP_GROUP(BATTLE_COLOSSEUM_4P), MAP_NUM(BATTLE_COLOSSEUM_4P), 5, 8, USING_MULTI_BATTLE);
+ SetMainCallback2(CB2_TransitionToCableClub);
break;
- case 4:
- sub_8117594(gBlockSendBuffer, TRUE);
+ case ACTIVITY_TRADE:
+ CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);
CleanupOverworldWindowsAndTilemaps();
- sub_81174B4(MAP_GROUP(TRADE_CENTER), MAP_NUM(TRADE_CENTER), 5, 8, USING_TRADE_CENTER);
- SetMainCallback2(sub_8117534);
+ SetCableClubStateAndWarpToNewMap(MAP_GROUP(TRADE_CENTER), MAP_NUM(TRADE_CENTER), 5, 8, USING_TRADE_CENTER);
+ SetMainCallback2(CB2_TransitionToCableClub);
break;
- case 68:
- CreateTask(sub_8117130, 0);
+ case ACTIVITY_TRADE | IN_UNION_ROOM:
+ CreateTask(Task_StartUnionRoomTrade, 0);
break;
- case 5:
- case 69:
+ case ACTIVITY_CHAT:
+ case ACTIVITY_CHAT | IN_UNION_ROOM:
if (GetMultiplayerId() == 0)
{
- sub_80F8CFC();
+ LinkRfu_CreateConnectionAsParent();
}
else
{
- sub_80F8D14();
- SetHostRFUtgtGname(69, 0, 1);
+ LinkRfu_StopManagerBeforeEnteringChat();
+ SetHostRFUtgtGname(ACTIVITY_CHAT | IN_UNION_ROOM, 0, 1);
}
EnterUnionRoomChat();
break;
- case 8:
- case 72:
- sub_8117594(gBlockSendBuffer, FALSE);
- SetMainCallback2(sub_8117354);
+ case ACTIVITY_CARD:
+ case ACTIVITY_CARD | IN_UNION_ROOM:
+ CreateTrainerCardInBuffer(gBlockSendBuffer, FALSE);
+ SetMainCallback2(CB2_ShowCard);
break;
- case 9:
- sub_8117440(USING_MINIGAME, 5, 1);
- sub_8147AA8(GetCursorSelectionMonId(), CB2_LoadMap);
+ case ACTIVITY_PJUMP:
+ SetCableClubStateAndWarpCurrentMap(USING_MINIGAME, 5, 1);
+ StartPokemonJump(GetCursorSelectionMonId(), CB2_LoadMap);
break;
- case 10:
- sub_8117440(USING_BERRY_CRUSH, 9, 1);
- sub_814B754(CB2_LoadMap);
+ case ACTIVITY_BCRUSH:
+ SetCableClubStateAndWarpCurrentMap(USING_BERRY_CRUSH, 9, 1);
+ StartBerryCrush(CB2_LoadMap);
break;
- case 11:
- sub_8117440(USING_MINIGAME, 5, 1);
- sub_81507FC(GetCursorSelectionMonId(), CB2_LoadMap);
+ case ACTIVITY_BPICK:
+ SetCableClubStateAndWarpCurrentMap(USING_MINIGAME, 5, 1);
+ StartDodrioBerryPicking(GetCursorSelectionMonId(), CB2_LoadMap);
break;
}
@@ -1878,7 +2001,7 @@ static void sub_81175BC(u8 taskId)
ScriptContext2_Disable();
}
-static void sub_8117900(u8 taskId)
+static void Task_RunScriptAndFadeToActivity(u8 taskId)
{
s16 *data = gTasks[taskId].data;
u16 *sendBuff = (u16*)(gBlockSendBuffer);
@@ -1900,7 +2023,7 @@ static void sub_8117900(u8 taskId)
case 2:
if (!gPaletteFade.active)
{
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
data[0]++;
}
break;
@@ -1908,38 +2031,38 @@ static void sub_8117900(u8 taskId)
if (IsLinkTaskFinished())
{
DestroyTask(taskId);
- sub_81179A4();
+ CreateTask_StartActivity();
}
break;
}
}
-static void sub_8117990(void)
+static void CreateTask_RunScriptAndFadeToActivity(void)
{
- CreateTask(sub_8117900, 0);
+ CreateTask(Task_RunScriptAndFadeToActivity, 0);
}
-static void sub_81179A4(void)
+static void CreateTask_StartActivity(void)
{
- u8 taskId = CreateTask(sub_81175BC, 0);
+ u8 taskId = CreateTask(Task_StartActivity, 0);
gTasks[taskId].data[0] = 0;
}
-void MEvent_CreateTask_Leader(u32 arg0)
+void MEvent_CreateTask_Leader(u32 activity)
{
u8 taskId;
struct UnkStruct_Leader * dataPtr;
- taskId = CreateTask(sub_8117A0C, 0);
+ taskId = CreateTask(Task_MEvent_Leader, 0);
sUnionRoomMain.leader = dataPtr = (void*)(gTasks[taskId].data);
dataPtr->state = 0;
dataPtr->textState = 0;
- dataPtr->field_18 = arg0;
+ dataPtr->activity = activity;
gSpecialVar_Result = 0;
}
-static void sub_8117A0C(u8 taskId)
+static void Task_MEvent_Leader(u8 taskId)
{
struct UnkStruct_Leader * data = sUnionRoomMain.leader;
struct WindowTemplate winTemplate;
@@ -1948,43 +2071,43 @@ static void sub_8117A0C(u8 taskId)
switch (data->state)
{
case 0:
- gUnknown_203B058 = data->field_18;
- gUnknown_203B059 = 2;
- SetHostRFUtgtGname(data->field_18, 0, 0);
- sub_80FAF74(FALSE, FALSE);
- sub_800B1F4();
+ sPlayerCurrActivity = data->activity;
+ sPlayerActivityGroupSize = 2;
+ SetHostRFUtgtGname(data->activity, 0, 0);
+ SetGnameBufferWonderFlags(FALSE, FALSE);
+ SetWirelessCommType1();
OpenLink();
- sub_80FBB8C(2);
+ InitializeRfuLinkManager_LinkLeader(2);
data->state = 1;
break;
case 1:
data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
- data->field_0 = AllocZeroed(5 * sizeof(struct UnkStruct_x20));
- data->field_8 = AllocZeroed(5 * sizeof(struct UnkStruct_x20));
- sub_811A650(data->field_4->arr, 4);
- sub_811A5E4(data->field_0->arr, 5);
- LinkRfu3_SetGnameUnameFromStaticBuffers(&data->field_0->arr[0].unk.gname, data->field_0->arr[0].unk.playerName);
+ data->field_0 = AllocZeroed(UROOM_MAX_PARTY_SIZE * sizeof(struct UnkStruct_x20));
+ data->field_8 = AllocZeroed(UROOM_MAX_PARTY_SIZE * sizeof(struct UnkStruct_x20));
+ BlankUnkStruct_x1CArray(data->field_4->arr, 4);
+ BlankUnkStruct_x20Array(data->field_0->arr, UROOM_MAX_PARTY_SIZE);
+ LinkRfu3_SetGnameUnameFromStaticBuffers(&data->field_0->arr[0].gname_uname.gname, data->field_0->arr[0].gname_uname.uname);
data->field_0->arr[0].field_18 = 0;
- data->field_0->arr[0].field_1A_0 = 1;
- data->field_0->arr[0].field_1A_1 = 0;
+ data->field_0->arr[0].groupScheduledAnim = UNION_ROOM_SPAWN_IN;
+ data->field_0->arr[0].field_1A_1 = FALSE;
data->field_0->arr[0].field_1B = 0;
- data->field_17 = sub_811A054(data->field_4, 0xFF);
+ data->listenTaskId = CreateTask_ListenForPartnersWithCompatibleSerialNos(data->field_4, 0xFF);
- winTemplate = gUnknown_8456CFC;
+ winTemplate = sWindowTemplate_List_PossibleGroupMembers;
winTemplate.baseBlock = GetMysteryGiftBaseBlock();
data->listWindowId = AddWindow(&winTemplate);
MG_DrawTextBorder(data->listWindowId);
- gMultiuseListMenuTemplate = gUnknown_8456D34;
+ gMultiuseListMenuTemplate = sListMenuTemplate_PossibleGroupMembers;
gMultiuseListMenuTemplate.windowId = data->listWindowId;
data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
CopyBgTilemapBufferToVram(0);
- data->field_13 = 1;
+ data->playerCount = 1;
data->state = 2;
break;
case 2:
- StringCopy(gStringVar1, gUnknown_8456C74[gUnknown_203B058]);
- sub_811599C(gStringVar4, gUnknown_203B058);
+ StringCopy(gStringVar1, sUnionRoomActivityStringPtrs[sPlayerCurrActivity]);
+ StringExpandPlaceholders_AwaitingCommFromAnother(gStringVar4, sPlayerCurrActivity);
data->state = 3;
break;
case 3:
@@ -1992,7 +2115,7 @@ static void sub_8117A0C(u8 taskId)
data->state = 4;
break;
case 4:
- sub_8116444(data, 5, 6);
+ Leader_SetStateIfMemberListChanged(data, 5, 6);
if (JOY_NEW(B_BUTTON))
{
data->state = 13;
@@ -2000,9 +2123,10 @@ static void sub_8117A0C(u8 taskId)
}
break;
case 6:
+ // The link with your friend has been dropped...
if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_84577F8))
{
- data->field_13 = sub_81165E8(data->field_0);
+ data->playerCount = UnionRoomLeaderField0CompactionAndCount(data->field_0);
RedrawListMenu(data->listTaskId);
data->state = 2;
}
@@ -2011,44 +2135,44 @@ static void sub_8117A0C(u8 taskId)
data->state = 7;
break;
case 7:
- switch (mevent_message_print_and_prompt_yes_no(&data->textState, (u16 *)&data->field_14, FALSE, gStringVar4))
+ switch (mevent_message_print_and_prompt_yes_no(&data->textState, (u16 *)&data->messageWindowId, FALSE, gStringVar4))
{
case 0:
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(0, 0);
- data->field_0->arr[data->field_13].field_1B = 0;
+ data->field_0->arr[data->playerCount].field_1B = 0;
RedrawListMenu(data->listTaskId);
data->field_19 = 5;
- sub_80FA670(5, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ SendByteToPartnerByIdAndName(5, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.uname);
data->state = 8;
break;
case 1:
case -1:
data->field_19 = 6;
- sub_80FA670(6, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ SendByteToPartnerByIdAndName(6, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.uname);
data->state = 8;
break;
}
break;
case 8:
- val = sub_80FA6FC(ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ val = WaitSendByteToPartnerByIdAndName(ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.uname);
if (val == 1)
{
if (data->field_19 == 5)
{
- data->field_0->arr[data->field_13].field_1B = 0;
+ data->field_0->arr[data->playerCount].field_1B = 0;
RedrawListMenu(data->listTaskId);
- data->field_13++;
- IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->field_13 - 1]);
+ data->playerCount++;
+ IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->playerCount - 1]);
StringExpandPlaceholders(gStringVar4, gUnknown_8457554);
data->state = 9;
- sub_80F8F5C();
+ LinkRfu_StopManagerAndFinalizeSlots();
}
else
{
- sub_80FBD4C(data->field_0->arr[data->field_13].unk.playerName, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId));
- data->field_0->arr[data->field_13].field_1A_0 = 0;
- sub_81165E8(data->field_0);
+ RequestDisconnectSlotByTrainerNameAndId(data->field_0->arr[data->playerCount].gname_uname.uname, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId));
+ data->field_0->arr[data->playerCount].groupScheduledAnim = UNION_ROOM_SPAWN_NONE;
+ UnionRoomLeaderField0CompactionAndCount(data->field_0);
RedrawListMenu(data->listTaskId);
data->state = 2;
}
@@ -2057,7 +2181,7 @@ static void sub_8117A0C(u8 taskId)
}
else if (val == 2)
{
- sub_80FB9E4(0, 0);
+ RfuSetErrorStatus(0, 0);
data->state = 2;
}
break;
@@ -2066,17 +2190,17 @@ static void sub_8117A0C(u8 taskId)
data->state = 10;
break;
case 10:
- if (++data->field_E > 120)
+ if (++data->delayTimerAfterOk > 120)
data->state = 11;
break;
case 11:
- if (!sub_8116444(data, 5, 6))
+ if (!Leader_SetStateIfMemberListChanged(data, 5, 6))
data->state = 12;
break;
case 12:
- if (sub_80F8F40())
+ if (LmanAcceptSlotFlagIsNotZero())
{
- sub_80F8F7C(FALSE);
+ WaitRfuState(FALSE);
data->state = 15;
}
else
@@ -2086,17 +2210,18 @@ static void sub_8117A0C(u8 taskId)
break;
case 13:
DestroyWirelessStatusIndicatorSprite();
- sub_80F8DC0();
+ LinkRfu_Shutdown();
DestroyListMenuTask(data->listTaskId, 0, 0);
CopyBgTilemapBufferToVram(0);
RemoveWindow(data->listWindowId);
- DestroyTask(data->field_17);
+ DestroyTask(data->listenTaskId);
Free(data->field_8);
Free(data->field_0);
Free(data->field_4);
data->state++;
break;
case 14:
+ // Please start over from the beginning.
if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_84571B8))
{
DestroyTask(taskId);
@@ -2104,13 +2229,13 @@ static void sub_8117A0C(u8 taskId)
}
break;
case 15:
- if (sub_80FB9F4() == 1 || sub_80FB9F4() == 2)
+ if (RfuGetErrorStatus() == 1 || RfuGetErrorStatus() == 2)
{
data->state = 13;
}
else if (gReceivedRemoteLinkPlayers != 0)
{
- sub_80FAFE0(1);
+ UpdateGameData_GroupLockedIn(TRUE);
data->state++;
}
break;
@@ -2118,11 +2243,11 @@ static void sub_8117A0C(u8 taskId)
DestroyListMenuTask(data->listTaskId, 0, 0);
CopyBgTilemapBufferToVram(0);
RemoveWindow(data->listWindowId);
- DestroyTask(data->field_17);
+ DestroyTask(data->listenTaskId);
Free(data->field_8);
Free(data->field_0);
Free(data->field_4);
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
data->state++;
break;
case 17:
@@ -2132,22 +2257,22 @@ static void sub_8117A0C(u8 taskId)
}
}
-void MEvent_CreateTask_CardOrNewsWithFriend(u32 arg0)
+void MEvent_CreateTask_CardOrNewsWithFriend(u32 activity)
{
u8 taskId;
struct UnkStruct_Group * dataPtr;
- taskId = CreateTask(sub_8117F20, 0);
+ taskId = CreateTask(Task_CardOrNewsWithFriend, 0);
sUnionRoomMain.group = dataPtr = (void*)(gTasks[taskId].data);
sGroup = dataPtr;
dataPtr->state = 0;
dataPtr->textState = 0;
- dataPtr->field_12 = arg0 - 21;
+ dataPtr->cardOrNews = activity - ACTIVITY_WCARD2; // 0: Card; 1: News
gSpecialVar_Result = 0;
}
-static void sub_8117F20(u8 taskId)
+static void Task_CardOrNewsWithFriend(u8 taskId)
{
s32 id;
struct WindowTemplate winTemplate1, winTemplate2;
@@ -2156,10 +2281,10 @@ static void sub_8117F20(u8 taskId)
switch (data->state)
{
case 0:
- SetHostRFUtgtGname(data->field_12 + 21, 0, 0);
- sub_800B1F4();
+ SetHostRFUtgtGname(data->cardOrNews + ACTIVITY_WCARD2, 0, 0);
+ SetWirelessCommType1();
OpenLink();
- sub_80FBBD8();
+ InitializeRfuLinkManager_JoinGroup();
data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
data->field_0 = AllocZeroed(16 * sizeof(struct UnkStruct_x20));
data->state = 1;
@@ -2169,33 +2294,33 @@ static void sub_8117F20(u8 taskId)
data->state = 2;
break;
case 2:
- sub_811A650(data->field_4->arr, 4);
- sub_811A5E4(data->field_0->arr, 16);
- data->field_11 = sub_811A054(data->field_4, data->field_12 + 7);
+ BlankUnkStruct_x1CArray(data->field_4->arr, 4);
+ BlankUnkStruct_x20Array(data->field_0->arr, 16);
+ data->listenTaskId = CreateTask_ListenForPartnersWithCompatibleSerialNos(data->field_4, data->cardOrNews + LINK_GROUP_WONDER_CARD);
- winTemplate1 = gUnknown_8456D4C;
+ winTemplate1 = sWindowTemplate_MysteryGiftList;
winTemplate1.baseBlock = GetMysteryGiftBaseBlock();
data->listWindowId = AddWindow(&winTemplate1);
- data->field_D = AddWindow(&gUnknown_8456D54);
+ data->playerNameAndIdWindowId = AddWindow(&sWindowTemplate_MysteryGiftPlayerNameAndId);
MG_DrawTextBorder(data->listWindowId);
- gMultiuseListMenuTemplate = gUnknown_8456DDC;
+ gMultiuseListMenuTemplate = sListMenuTemplate_UnionRoomGroups;
gMultiuseListMenuTemplate.windowId = data->listWindowId;
data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
- MG_DrawTextBorder(data->field_D);
- FillWindowPixelBuffer(data->field_D, PIXEL_FILL(1));
- PutWindowTilemap(data->field_D);
- sub_8115924(data->field_D);
- CopyWindowToVram(data->field_D, 2);
+ MG_DrawTextBorder(data->playerNameAndIdWindowId);
+ FillWindowPixelBuffer(data->playerNameAndIdWindowId, PIXEL_FILL(1));
+ PutWindowTilemap(data->playerNameAndIdWindowId);
+ PrintPlayerNameAndIdOnWindow(data->playerNameAndIdWindowId);
+ CopyWindowToVram(data->playerNameAndIdWindowId, 2);
CopyBgTilemapBufferToVram(0);
- data->field_F = 0;
+ data->leaderId = 0;
data->state = 3;
break;
case 3:
- id = sub_8116FE4();
+ id = GetNewLeaderCandidate();
switch (id)
{
case 1:
@@ -2209,16 +2334,16 @@ static void sub_8117F20(u8 taskId)
{
// this unused variable along with the assignment is needed to match
u32 unusedVar;
- unusedVar = data->field_0->arr[id].unk.gname.unk_0a_0;
+ unusedVar = data->field_0->arr[id].gname_uname.gname.activity;
- if (data->field_0->arr[id].field_1A_0 == 1 && !data->field_0->arr[id].unk.gname.unk_0a_7)
+ if (data->field_0->arr[id].groupScheduledAnim == UNION_ROOM_SPAWN_IN && !data->field_0->arr[id].gname_uname.gname.started)
{
- data->field_F = id;
+ data->leaderId = id;
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(0, 0);
RedrawListMenu(data->listTaskId);
- IntlConvPartnerUname(gStringVar1, data->field_0->arr[data->field_F]);
- sub_80FBF54(data->field_0->arr[data->field_F].unk.playerName, ReadAsU16(data->field_0->arr[data->field_F].unk.gname.unk_00.playerTrainerId));
+ IntlConvPartnerUname(gStringVar1, data->field_0->arr[data->leaderId]);
+ CreateTask_RfuReconnectWithParent(data->field_0->arr[data->leaderId].gname_uname.uname, ReadAsU16(data->field_0->arr[data->leaderId].gname_uname.gname.unk_00.playerTrainerId));
PlaySE(SE_PN_ON);
data->state = 4;
}
@@ -2236,17 +2361,17 @@ static void sub_8117F20(u8 taskId)
break;
case 4:
AddTextPrinterToWindow1(gUnknown_8459238);
- IntlConvPartnerUname(gStringVar1, data->field_0->arr[data->field_F]);
+ IntlConvPartnerUname(gStringVar1, data->field_0->arr[data->leaderId]);
data->state = 5;
break;
case 5:
if (gReceivedRemoteLinkPlayers != 0)
{
- gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.unk_0a_0;
+ sPlayerCurrActivity = data->field_0->arr[data->leaderId].gname_uname.gname.activity;
data->state = 10;
}
- switch (sub_80FB9F4())
+ switch (RfuGetErrorStatus())
{
case 1:
case 2:
@@ -2255,7 +2380,7 @@ static void sub_8117F20(u8 taskId)
break;
case 5:
AddTextPrinterToWindow1(gUnknown_84576AC);
- sub_80FB9E4(0, 0);
+ RfuSetErrorStatus(0, 0);
break;
}
break;
@@ -2264,19 +2389,19 @@ static void sub_8117F20(u8 taskId)
case 10:
DestroyListMenuTask(data->listTaskId, 0, 0);
CopyBgTilemapBufferToVram(0);
- RemoveWindow(data->field_D);
+ RemoveWindow(data->playerNameAndIdWindowId);
RemoveWindow(data->listWindowId);
- DestroyTask(data->field_11);
+ DestroyTask(data->listenTaskId);
Free(data->field_0);
Free(data->field_4);
data->state++;
break;
case 9:
- if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_8457838[sub_80FB9F4()]))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_8457838[RfuGetErrorStatus()]))
{
DestroyWirelessStatusIndicatorSprite();
DestroyTask(taskId);
- sub_80F8DC0();
+ LinkRfu_Shutdown();
gSpecialVar_Result = 5;
}
break;
@@ -2284,12 +2409,12 @@ static void sub_8117F20(u8 taskId)
DestroyWirelessStatusIndicatorSprite();
AddTextPrinterToWindow1(gUnknown_84571B8);
DestroyTask(taskId);
- sub_80F8DC0();
+ LinkRfu_Shutdown();
gSpecialVar_Result = 5;
break;
case 11:
data->state++;
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
break;
case 12:
if (IsLinkTaskFinished())
@@ -2298,22 +2423,22 @@ static void sub_8117F20(u8 taskId)
}
}
-void MEvent_CreateTask_CardOrNewsOverWireless(u32 arg0)
+void MEvent_CreateTask_CardOrNewsOverWireless(u32 activity)
{
u8 taskId;
struct UnkStruct_Group * dataPtr;
- taskId = CreateTask(sub_81182DC, 0);
+ taskId = CreateTask(Task_CardOrNewsOverWireless, 0);
sUnionRoomMain.group = dataPtr = (void*)(gTasks[taskId].data);
sGroup = dataPtr;
dataPtr->state = 0;
dataPtr->textState = 0;
- dataPtr->field_12 = arg0 - 21;
+ dataPtr->cardOrNews = activity - ACTIVITY_WCARD2; // 0: Card; 1: News
gSpecialVar_Result = 0;
}
-static void sub_81182DC(u8 taskId)
+static void Task_CardOrNewsOverWireless(u8 taskId)
{
s32 id;
struct WindowTemplate winTemplate;
@@ -2323,9 +2448,9 @@ static void sub_81182DC(u8 taskId)
{
case 0:
SetHostRFUtgtGname(0, 0, 0);
- sub_800B1F4();
+ SetWirelessCommType1();
OpenLink();
- sub_80FBBD8();
+ InitializeRfuLinkManager_JoinGroup();
data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
data->field_0 = AllocZeroed(16 * sizeof(struct UnkStruct_x20));
data->state = 1;
@@ -2335,29 +2460,29 @@ static void sub_81182DC(u8 taskId)
data->state = 2;
break;
case 2:
- sub_811A650(data->field_4->arr, 4);
- sub_811A5E4(data->field_0->arr, 16);
- data->field_11 = sub_811A084(data->field_4, data->field_12 + 7);
+ BlankUnkStruct_x1CArray(data->field_4->arr, 4);
+ BlankUnkStruct_x20Array(data->field_0->arr, 16);
+ data->listenTaskId = CreateTask_ListenForPartnersWithSerial7F7D(data->field_4, data->cardOrNews + LINK_GROUP_WONDER_CARD);
if (data->field_13 != 0)
{
- winTemplate = gUnknown_8456D4C;
+ winTemplate = sWindowTemplate_MysteryGiftList;
winTemplate.baseBlock = GetMysteryGiftBaseBlock();
data->listWindowId = AddWindow(&winTemplate);
MG_DrawTextBorder(data->listWindowId);
- gMultiuseListMenuTemplate = gUnknown_8456DDC;
+ gMultiuseListMenuTemplate = sListMenuTemplate_UnionRoomGroups;
gMultiuseListMenuTemplate.windowId = data->listWindowId;
data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
CopyBgTilemapBufferToVram(0);
}
- data->field_F = 0;
+ data->leaderId = 0;
data->state = 3;
break;
case 3:
- id = sub_8116FE4();
+ id = GetNewLeaderCandidate();
switch (id)
{
case 1:
@@ -2369,17 +2494,17 @@ static void sub_81182DC(u8 taskId)
case 0:
if (data->field_13 != 0)
id = ListMenu_ProcessInput(data->listTaskId);
- if (data->field_14 > 120)
+ if (data->refreshTimer > 120)
{
- if (data->field_0->arr[0].field_1A_0 == 1 && !data->field_0->arr[0].unk.gname.unk_0a_7)
+ if (data->field_0->arr[0].groupScheduledAnim == UNION_ROOM_SPAWN_IN && !data->field_0->arr[0].gname_uname.gname.started)
{
- if (sub_8119FB0(&data->field_0->arr[0].unk.gname, data->field_12 + 7))
+ if (GetGnameWonderFlagByLinkGroup(&data->field_0->arr[0].gname_uname.gname, data->cardOrNews + LINK_GROUP_WONDER_CARD))
{
- data->field_F = 0;
- data->field_14 = 0;
+ data->leaderId = 0;
+ data->refreshTimer = 0;
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(0, 0);
- sub_80FBF54(data->field_0->arr[0].unk.playerName, ReadAsU16(data->field_0->arr[0].unk.gname.unk_00.playerTrainerId));
+ CreateTask_RfuReconnectWithParent(data->field_0->arr[0].gname_uname.uname, ReadAsU16(data->field_0->arr[0].gname_uname.gname.unk_00.playerTrainerId));
PlaySE(SE_PN_ON);
data->state = 4;
}
@@ -2393,25 +2518,25 @@ static void sub_81182DC(u8 taskId)
else if (JOY_NEW(B_BUTTON))
{
data->state = 6;
- data->field_14 = 0;
+ data->refreshTimer = 0;
}
- data->field_14++;
+ data->refreshTimer++;
break;
}
break;
case 4:
AddTextPrinterToWindow1(gUnknown_845928C);
- IntlConvPartnerUname(gStringVar1, data->field_0->arr[data->field_F]);
+ IntlConvPartnerUname(gStringVar1, data->field_0->arr[data->leaderId]);
data->state = 5;
break;
case 5:
if (gReceivedRemoteLinkPlayers != 0)
{
- gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.unk_0a_0;
+ sPlayerCurrActivity = data->field_0->arr[data->leaderId].gname_uname.gname.activity;
data->state = 12;
}
- switch (sub_80FB9F4())
+ switch (RfuGetErrorStatus())
{
case 1:
case 2:
@@ -2420,7 +2545,7 @@ static void sub_81182DC(u8 taskId)
break;
case 5:
AddTextPrinterToWindow1(gUnknown_845777C);
- sub_80FB9E4(0, 0);
+ RfuSetErrorStatus(0, 0);
break;
}
break;
@@ -2434,7 +2559,7 @@ static void sub_81182DC(u8 taskId)
CopyBgTilemapBufferToVram(0);
RemoveWindow(data->listWindowId);
}
- DestroyTask(data->field_11);
+ DestroyTask(data->listenTaskId);
Free(data->field_0);
Free(data->field_4);
data->state++;
@@ -2444,7 +2569,7 @@ static void sub_81182DC(u8 taskId)
{
DestroyWirelessStatusIndicatorSprite();
DestroyTask(taskId);
- sub_80F8DC0();
+ LinkRfu_Shutdown();
gSpecialVar_Result = 5;
}
break;
@@ -2453,22 +2578,22 @@ static void sub_81182DC(u8 taskId)
{
DestroyWirelessStatusIndicatorSprite();
DestroyTask(taskId);
- sub_80F8DC0();
+ LinkRfu_Shutdown();
gSpecialVar_Result = 5;
}
break;
case 11:
- if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_845933C[data->field_12]))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_845933C[data->cardOrNews]))
{
DestroyWirelessStatusIndicatorSprite();
DestroyTask(taskId);
- sub_80F8DC0();
+ LinkRfu_Shutdown();
gSpecialVar_Result = 5;
}
break;
case 13:
data->state++;
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
break;
case 14:
if (IsLinkTaskFinished())
@@ -2482,7 +2607,7 @@ void UnionRoomSpecial(void)
struct UnkStruct_URoom * dataPtr;
ClearAndInitHostRFUtgtGname();
- CreateTask(sub_81186E0, 10);
+ CreateTask(Task_RunUnionRoom, 10);
// dumb line needed to match
sUnionRoomMain.uRoom = sUnionRoomMain.uRoom;
@@ -2497,7 +2622,7 @@ void UnionRoomSpecial(void)
dataPtr->field_12 = 0;
gSpecialVar_Result = 0;
- sub_8107D38(0xD0, 1);
+ ListMenuLoadStdPalAt(0xD0, 1);
}
static u16 ReadAsU16(const u8 *ptr)
@@ -2505,7 +2630,7 @@ static u16 ReadAsU16(const u8 *ptr)
return (ptr[1] << 8) | (ptr[0]);
}
-static void sub_8118664(u32 nextState, const u8 *src)
+static void UnionRoom_ScheduleFieldMessageWithFollowupState(u32 nextState, const u8 *src)
{
struct UnkStruct_URoom * data = sUnionRoomMain.uRoom;
@@ -2515,7 +2640,7 @@ static void sub_8118664(u32 nextState, const u8 *src)
StringExpandPlaceholders(gStringVar4, src);
}
-static void sub_811868C(const u8 *src)
+static void UnionRoom_ScheduleFieldMessageAndExit(const u8 *src)
{
struct UnkStruct_URoom * data = sUnionRoomMain.uRoom;
@@ -2524,17 +2649,17 @@ static void sub_811868C(const u8 *src)
StringExpandPlaceholders(gStringVar4, src);
}
-static void sub_81186B0(struct UnkStruct_URoom * data)
+static void BackUpURoomField0ToDecompressionBuffer(struct UnkStruct_URoom * data)
{
- memcpy(&gDecompressionBuffer[0x3F00], data->field_0, 8 * sizeof(struct UnkStruct_x20));
+ memcpy(&gDecompressionBuffer[0x3F00], data->field_0, UROOM_MAX_GROUP_COUNT * sizeof(struct UnkStruct_x20));
}
-static void sub_81186C8(struct UnkStruct_URoom * data)
+static void RestoreURoomField0FromDecompressionBuffer(struct UnkStruct_URoom * data)
{
- memcpy(data->field_0, &gDecompressionBuffer[0x3F00], 8 * sizeof(struct UnkStruct_x20));
+ memcpy(data->field_0, &gDecompressionBuffer[0x3F00], UROOM_MAX_GROUP_COUNT * sizeof(struct UnkStruct_x20));
}
-static void sub_81186E0(u8 taskId)
+static void Task_RunUnionRoom(u8 taskId)
{
u32 id = 0;
s32 var5 = 0;
@@ -2545,53 +2670,53 @@ static void sub_81186E0(u8 taskId)
switch (data->state)
{
case 0:
- data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
- data->field_C = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
- data->field_0 = AllocZeroed(8 * sizeof(struct UnkStruct_x20));
+ data->field_4 = AllocZeroed(RFU_CHILD_MAX * sizeof(struct UnkStruct_x1C));
+ data->field_C = AllocZeroed(RFU_CHILD_MAX * sizeof(struct UnkStruct_x1C));
+ data->field_0 = AllocZeroed(UROOM_MAX_GROUP_COUNT * sizeof(struct UnkStruct_x20));
data->field_8 = AllocZeroed(sizeof(struct UnkStruct_x20));
- sub_811A5E4(data->field_0->arr, 8);
- gUnknown_203B058 = 0x40;
- data->field_20 = sub_8119E84(data->field_C, data->field_4, 9);
+ BlankUnkStruct_x20Array(data->field_0->arr, UROOM_MAX_GROUP_COUNT);
+ sPlayerCurrActivity = IN_UNION_ROOM;
+ data->field_20 = CreateTask_SearchForChildOrParent(data->field_C, data->field_4, LINK_GROUP_UNION_ROOM_RESUME);
ZeroUnionObjWork(data->unionObjs);
- sub_811BB68();
+ MakeGroupAssemblyAreasPassable();
data->state = 1;
break;
case 1:
- sub_811BAAC(data->spriteIds, taskData[0]);
+ CreateGroupMemberObjectsInvisible(data->spriteIds, taskData[0]);
if (++taskData[0] == 8)
data->state = 2;
break;
case 2:
- SetHostRFUtgtGname(0x40, 0, 0);
- sub_80FAFA0(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);
- sub_800B1F4();
+ SetHostRFUtgtGname(IN_UNION_ROOM, 0, 0);
+ RfuUpdatePlayerGnameStateAndSend(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);
+ SetWirelessCommType1();
OpenLink();
- sub_80FBC00();
- sub_811A5E4(&data->field_8->arr[0], 1);
- sub_811A650(data->field_4->arr, 4);
- sub_811A650(data->field_C->arr, 4);
+ InitializeRfuLinkManager_EnterUnionRoom();
+ BlankUnkStruct_x20Array(&data->field_8->arr[0], 1);
+ BlankUnkStruct_x1CArray(data->field_4->arr, 4);
+ BlankUnkStruct_x1CArray(data->field_C->arr, 4);
gSpecialVar_Result = 0;
data->state = 3;
break;
case 3:
if ((GetPartyMenuType() == PARTY_MENU_TYPE_UNION_ROOM_REGISTER
- || GetPartyMenuType() == PARTY_MENU_TYPE_UNION_ROOM_TRADE)
+ || GetPartyMenuType() == PARTY_MENU_TYPE_UNION_ROOM_TRADE)
&& sUnionRoomTrade.field_0 != 0)
{
id = GetCursorSelectionMonId();
switch (sUnionRoomTrade.field_0)
{
case 1:
- sub_80FB008(0x54, 0, 1);
+ UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);
if (id >= PARTY_SIZE)
{
ResetUnionRoomTrade(&sUnionRoomTrade);
- sub_80FAFA0(0, 0, 0);
- sub_811868C(gUnknown_8458D54);
+ RfuUpdatePlayerGnameStateAndSend(0, 0, 0);
+ UnionRoom_ScheduleFieldMessageAndExit(gUnknown_8458D54);
}
else if (!RegisterTradeMonAndGetIsEgg(GetCursorSelectionMonId(), &sUnionRoomTrade))
{
- sub_8118664(0x34, gUnknown_8458CD4);
+ UnionRoom_ScheduleFieldMessageWithFollowupState(52, gURText_PleaseChooseTypeOfMon);
}
else
{
@@ -2599,16 +2724,16 @@ static void sub_81186E0(u8 taskId)
}
break;
case 2:
- sub_81186C8(data);
+ RestoreURoomField0FromDecompressionBuffer(data);
taskData[1] = sUnionRoomTrade.field_8;
if (id >= PARTY_SIZE)
{
- sub_811868C(gUnknown_8458D9C);
+ UnionRoom_ScheduleFieldMessageAndExit(gUnknown_8458D9C);
}
else
{
- sub_80FB008(0x54, 0, 1);
- gUnknown_203B058 = 0x44;
+ UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);
+ sPlayerCurrActivity = ACTIVITY_TRADE | IN_UNION_ROOM;
RegisterTradeMon(GetCursorSelectionMonId(), &sUnionRoomTrade);
data->state = 51;
}
@@ -2626,7 +2751,7 @@ static void sub_81186E0(u8 taskId)
{
if (gSpecialVar_Result == 9)
{
- sub_80FB008(0x54, 0, 1);
+ UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);
PlaySE(SE_PC_LOGIN);
StringCopy(gStringVar1, gSaveBlock2Ptr->playerName);
data->state = 42;
@@ -2634,7 +2759,7 @@ static void sub_81186E0(u8 taskId)
}
else if (gSpecialVar_Result == 11)
{
- sub_80FB008(0x54, 0, 1);
+ UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);
data->state = 23;
gSpecialVar_Result = 0;
}
@@ -2650,98 +2775,98 @@ static void sub_81186E0(u8 taskId)
{
if (JOY_NEW(A_BUTTON))
{
- if (sub_811BF00(data->field_0, &taskData[0], &taskData[1], data->spriteIds))
+ if (RfuUnionTool_GetGroupAndMemberInFrontOfPlayer(data->field_0, &taskData[0], &taskData[1], data->spriteIds))
{
PlaySE(SE_SELECT);
- sub_811B298();
+ UR_EnableScriptContext2AndFreezeObjectEvents();
data->state = 24;
break;
}
- else if (sub_811A9B8())
+ else if (PlayerIsTalkingToUnionRoomAide())
{
- sub_80FB008(0x54, 0, 1);
+ UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);
PlaySE(SE_PC_LOGIN);
- sub_811B298();
+ UR_EnableScriptContext2AndFreezeObjectEvents();
StringCopy(gStringVar1, gSaveBlock2Ptr->playerName);
data->state = 45;
break;
}
}
- switch (sub_8119B94())
+ switch (HandlePlayerListUpdate())
{
case 1:
PlaySE(SE_TOY_C);
case 2:
- sub_811BECC(data);
+ ScheduleUnionRoomPlayerRefresh(data);
break;
case 4:
data->state = 11;
- sub_811B298();
- sub_80FAFA0(0, 0, 0);
- sub_80FB008(0x53, sub_811B2D8(data), 0);
+ UR_EnableScriptContext2AndFreezeObjectEvents();
+ RfuUpdatePlayerGnameStateAndSend(0, 0, 0);
+ UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_NPCTALK | IN_UNION_ROOM, GetActivePartnerSpriteGenderParam(data), FALSE);
break;
}
- sub_811BEDC(data);
+ HandleUnionRoomPlayerRefresh(data);
}
break;
case 23:
if (!FuncIsActiveTask(Task_StartMenuHandleInput))
{
- sub_80FB008(0x40, 0, 0);
+ UpdateGameDataWithActivitySpriteGendersFlag(IN_UNION_ROOM, 0, FALSE);
data->state = 4;
}
break;
case 24:
- sub_811A0E0();
+ UR_RunTextPrinters_CheckPrinter0Active();
playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0);
- sub_80FB008(0x54, 0, 1);
- switch (sub_811AA5C(data->field_0, taskData[0], taskData[1], playerGender))
+ UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);
+ switch (UnionRoomGetPlayerInteractionResponse(data->field_0, taskData[0], taskData[1], playerGender))
{
case 0:
data->state = 26;
break;
case 1:
- sub_80FC114(data->field_0->arr[taskData[1]].unk.playerName, &data->field_0->arr[taskData[1]].unk.gname, gUnknown_203B058);
+ sub_80FC114(data->field_0->arr[taskData[1]].gname_uname.uname, &data->field_0->arr[taskData[1]].gname_uname.gname, sPlayerCurrActivity);
data->field_12 = id; // Should be just 0, but won't match any other way.
data->state = 25;
break;
case 2:
- sub_8118664(0x13, gStringVar4);
+ UnionRoom_ScheduleFieldMessageWithFollowupState(19, gStringVar4);
break;
}
break;
case 25:
- sub_811A0E0();
- switch (sub_80FB9F4())
+ UR_RunTextPrinters_CheckPrinter0Active();
+ switch (RfuGetErrorStatus())
{
case 4:
- sub_811B258(TRUE);
+ HandleCancelTrade(TRUE);
data->state = 4;
break;
case 1:
case 2:
- if (sub_80FBB0C() == TRUE)
- sub_811868C(gUnknown_8457F90);
+ if (IsUnionRoomListenTaskActive() == TRUE)
+ UnionRoom_ScheduleFieldMessageAndExit(gUnknown_8457F90);
else
- sub_8118664(30, gUnknown_8457F90);
+ UnionRoom_ScheduleFieldMessageWithFollowupState(30, gUnknown_8457F90);
- gUnknown_203B058 = 0x40;
+ sPlayerCurrActivity = IN_UNION_ROOM;
break;
}
if (gReceivedRemoteLinkPlayers != 0)
{
- sub_8117594(gBlockSendBuffer, TRUE);
- CreateTask(sub_8117280, 5);
+ CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);
+ CreateTask(Task_ExchangeCards, 5);
data->state = 38;
}
break;
case 38:
- if (!FuncIsActiveTask(sub_8117280))
+ if (!FuncIsActiveTask(Task_ExchangeCards))
{
- if (gUnknown_203B058 == 0x44)
- sub_8118664(31, gUnknown_84578BC);
+ if (sPlayerCurrActivity == (ACTIVITY_TRADE | IN_UNION_ROOM))
+ UnionRoom_ScheduleFieldMessageWithFollowupState(31, gUnknown_84578BC);
else
data->state = 5;
}
@@ -2749,18 +2874,18 @@ static void sub_81186E0(u8 taskId)
case 30:
if (gReceivedRemoteLinkPlayers == 0)
{
- sub_811B258(FALSE);
- sub_811C028(taskData[0], taskData[1], data->field_0);
+ HandleCancelTrade(FALSE);
+ UpdateUnionGroupMemberFacing(taskData[0], taskData[1], data->field_0);
data->state = 2;
}
break;
case 5:
- id = sub_811AA24(&data->field_0->arr[taskData[1]]);
+ id = ConvPartnerUnameAndGetWhetherMetAlready(&data->field_0->arr[taskData[1]]);
playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0);
- sub_8118664(6, gUnknown_8457B04[id][playerGender]);
+ UnionRoom_ScheduleFieldMessageWithFollowupState(6, gURText_FriendPromptsForActivity[id][playerGender]);
break;
case 6:
- var5 = sub_811A218(&data->textState, &data->field_1B, &data->field_1C, &gUnknown_8456DF4, &gUnknown_8456E1C);
+ var5 = ListMenuHandler_AllItemsAvailable(&data->textState, &data->topListMenuWindowId, &data->topListMenuListMenuId, &sWindowTemplate_InviteToActivity, &sListMenuTemplate_InviteToActivity);
if (var5 != -1)
{
if (gReceivedRemoteLinkPlayers == 0)
@@ -2769,27 +2894,27 @@ static void sub_81186E0(u8 taskId)
}
else
{
- data->field_98 = 0;
+ data->partnerYesNoResponse = 0;
playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0);
- if (var5 == -2 || var5 == 0x40)
+ if (var5 == -2 || var5 == IN_UNION_ROOM)
{
- data->field_4C[0] = 0x40;
- sub_80F9E2C(data->field_4C);
+ data->playerSendBuffer[0] = IN_UNION_ROOM;
+ RfuPrepareSend0x2f00(data->playerSendBuffer);
StringCopy(gStringVar4, gUnknown_845842C[gLinkPlayers[0].gender]);
data->state = 32;
}
else
{
- gUnknown_203B058 = var5;
- gUnknown_203B059 = (u32)(var5) >> 8;
- if (gUnknown_203B058 == 0x41 && !HasAtLeastTwoMonsOfLevel30OrLower())
+ sPlayerCurrActivity = var5;
+ sPlayerActivityGroupSize = (u32)(var5) >> 8;
+ if (sPlayerCurrActivity == (ACTIVITY_BATTLE | IN_UNION_ROOM) && !HasAtLeastTwoMonsOfLevel30OrLower())
{
- sub_8118664(5, gUnknown_845847C);
+ UnionRoom_ScheduleFieldMessageWithFollowupState(5, gUnknown_845847C);
}
else
{
- data->field_4C[0] = gUnknown_203B058 | 0x40;
- sub_80F9E2C(data->field_4C);
+ data->playerSendBuffer[0] = sPlayerCurrActivity | IN_UNION_ROOM;
+ RfuPrepareSend0x2f00(data->playerSendBuffer);
data->state = 27;
}
}
@@ -2801,24 +2926,24 @@ static void sub_81186E0(u8 taskId)
data->state = 36;
break;
case 27:
- sub_811B0A4(data);
+ PollPartnerYesNoResponse(data);
playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0);
- id = sub_811A9FC(data->field_4C[0] & 0x3F);
- if (PrintOnTextbox(&data->textState, gUnknown_84580F4[playerGender][id]))
+ id = GetResponseIdx_InviteToURoomActivity(data->playerSendBuffer[0] & 0x3F);
+ if (PrintOnTextbox(&data->textState, gResponseToURoomActivityInviteStringPtrs[playerGender][id]))
{
taskData[3] = 0;
data->state = 29;
}
break;
case 32:
- sub_800AAC0();
+ Link_TryStartSend5FFF();
data->state = 36;
break;
case 31:
- data->field_4C[0] = 0x44;
- data->field_4C[1] = sUnionRoomTrade.species;
- data->field_4C[2] = sUnionRoomTrade.level;
- sub_80F9E2C(data->field_4C);
+ data->playerSendBuffer[0] = ACTIVITY_TRADE | IN_UNION_ROOM;
+ data->playerSendBuffer[1] = sUnionRoomTrade.species;
+ data->playerSendBuffer[2] = sUnionRoomTrade.level;
+ RfuPrepareSend0x2f00(data->playerSendBuffer);
data->state = 29;
break;
case 29:
@@ -2829,12 +2954,12 @@ static void sub_81186E0(u8 taskId)
}
else
{
- sub_811B0A4(data);
- if (data->field_98 == 0x51)
+ PollPartnerYesNoResponse(data);
+ if (data->partnerYesNoResponse == (ACTIVITY_ACCEPT | IN_UNION_ROOM))
{
- if (gUnknown_203B058 == 8)
+ if (sPlayerCurrActivity == ACTIVITY_CARD)
{
- sub_811B31C(gStringVar4, data, FALSE);
+ ViewURoomPartnerTrainerCard(gStringVar4, data, MODE_CHILD);
data->state = 40;
}
else
@@ -2842,27 +2967,27 @@ static void sub_81186E0(u8 taskId)
data->state = 13;
}
}
- else if (data->field_98 == 0x52)
+ else if (data->partnerYesNoResponse == (ACTIVITY_DECLINE | IN_UNION_ROOM))
{
data->state = 32;
- sub_811AE68(gStringVar4, gUnknown_203B058 | 0x40, gLinkPlayers[0].gender);
- gUnknown_203B058 = 0;
+ GetURoomActivityRejectMsg(gStringVar4, sPlayerCurrActivity | IN_UNION_ROOM, gLinkPlayers[0].gender);
+ sPlayerCurrActivity = 0;
}
}
break;
case 7:
- id = sub_811AA24(&data->field_0->arr[taskData[1]]);
+ id = ConvPartnerUnameAndGetWhetherMetAlready(&data->field_0->arr[taskData[1]]);
playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0);
- sub_8118664(6, gUnknown_8457B04[id][playerGender]);
+ UnionRoom_ScheduleFieldMessageWithFollowupState(6, gURText_FriendPromptsForActivity[id][playerGender]);
break;
case 40:
if (PrintOnTextbox(&data->textState, gStringVar4))
{
data->state = 41;
- sub_800AB9C();
- data->field_98 = 0;
- data->field_9A[0] = 0;
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
+ data->partnerYesNoResponse = 0;
+ data->recvActivityRequest[0] = 0;
}
break;
case 41:
@@ -2882,13 +3007,13 @@ static void sub_81186E0(u8 taskId)
}
break;
case 19:
- switch (sub_811A14C(&data->textState, FALSE))
+ switch (UnionRoomHandleYesNo(&data->textState, FALSE))
{
case 0:
CopyBgTilemapBufferToVram(0);
- gUnknown_203B058 = 0x45;
- sub_80FB008(0x45, 0, 1);
- sub_80FC114(data->field_0->arr[taskData[1]].unk.playerName, &data->field_0->arr[taskData[1]].unk.gname, gUnknown_203B058);
+ sPlayerCurrActivity = ACTIVITY_CHAT | IN_UNION_ROOM;
+ UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_CHAT | IN_UNION_ROOM, 0, TRUE);
+ sub_80FC114(data->field_0->arr[taskData[1]].gname_uname.uname, &data->field_0->arr[taskData[1]].gname_uname.gname, sPlayerCurrActivity);
data->field_12 = taskData[1];
data->state = 20;
taskData[3] = 0;
@@ -2896,7 +3021,7 @@ static void sub_81186E0(u8 taskId)
case 1:
case -1:
playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0);
- sub_811868C(gUnknown_8458548[playerGender]);
+ UnionRoom_ScheduleFieldMessageAndExit(gUnknown_8458548[playerGender]);
break;
}
break;
@@ -2908,20 +3033,20 @@ static void sub_81186E0(u8 taskId)
}
break;
case 21:
- switch (sub_80FB9F4())
+ switch (RfuGetErrorStatus())
{
case 4:
- sub_811B258(TRUE);
+ HandleCancelTrade(TRUE);
data->state = 4;
break;
case 1:
case 2:
playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0);
- sub_80FB008(0x54, 0, 1);
- if (sub_80FBB0C() == TRUE)
- sub_811868C(gUnknown_84585E8[playerGender]);
+ UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);
+ if (IsUnionRoomListenTaskActive() == TRUE)
+ UnionRoom_ScheduleFieldMessageAndExit(gUnknown_84585E8[playerGender]);
else
- sub_8118664(30, gUnknown_84585E8[playerGender]);
+ UnionRoom_ScheduleFieldMessageWithFollowupState(30, gUnknown_84585E8[playerGender]);
break;
case 3:
data->state = 22;
@@ -2930,14 +3055,14 @@ static void sub_81186E0(u8 taskId)
taskData[3]++;
break;
case 22:
- if (sub_80FBA00())
+ if (RfuIsErrorStatus1or2())
{
playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0);
- sub_80FB008(0x54, 0, 1);
- if (sub_80FBB0C() == TRUE)
- sub_811868C(gUnknown_84585E8[playerGender]);
+ UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);
+ if (IsUnionRoomListenTaskActive() == TRUE)
+ UnionRoom_ScheduleFieldMessageAndExit(gUnknown_84585E8[playerGender]);
else
- sub_8118664(30, gUnknown_84585E8[playerGender]);
+ UnionRoom_ScheduleFieldMessageWithFollowupState(30, gUnknown_84585E8[playerGender]);
}
if (gReceivedRemoteLinkPlayers != 0)
data->state = 16;
@@ -2946,24 +3071,24 @@ static void sub_81186E0(u8 taskId)
PlaySE(SE_PINPON);
sub_80F8FA0();
data->state = 12;
- data->field_9A[0] = 0;
+ data->recvActivityRequest[0] = 0;
break;
case 12:
- if (sub_80FBA00())
+ if (RfuIsErrorStatus1or2())
{
- sub_811B258(FALSE);
+ HandleCancelTrade(FALSE);
data->state = 2;
}
else if (gReceivedRemoteLinkPlayers != 0)
{
- sub_8117594(gBlockSendBuffer, TRUE);
- CreateTask(sub_8117280, 5);
+ CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);
+ CreateTask(Task_ExchangeCards, 5);
data->state = 39;
}
break;
case 39:
- sub_8119904(data);
- if (!FuncIsActiveTask(sub_8117280))
+ ReceiveUnionRoomActivityPacket(data);
+ if (!FuncIsActiveTask(Task_ExchangeCards))
{
data->state = 33;
StringCopy(gStringVar1, gLinkPlayers[1].name);
@@ -2972,13 +3097,13 @@ static void sub_81186E0(u8 taskId)
}
break;
case 33:
- sub_8119904(data);
+ ReceiveUnionRoomActivityPacket(data);
if (PrintOnTextbox(&data->textState, gStringVar4))
data->state = 34;
break;
case 34:
- sub_8119904(data);
- if (sub_8119944(data) && JOY_NEW(B_BUTTON))
+ ReceiveUnionRoomActivityPacket(data);
+ if (UnionRoom_HandleContactFromOtherPlayer(data) && JOY_NEW(B_BUTTON))
{
sub_80FBD6C(1);
StringCopy(gStringVar4, gUnknown_8457E60);
@@ -2986,80 +3111,82 @@ static void sub_81186E0(u8 taskId)
}
break;
case 35:
- sub_8118664(9, gStringVar4);
+ // You said yes
+ UnionRoom_ScheduleFieldMessageWithFollowupState(9, gStringVar4);
break;
case 9:
- switch (sub_811A14C(&data->textState, FALSE))
+ switch (UnionRoomHandleYesNo(&data->textState, FALSE))
{
case 0:
- data->field_4C[0] = 0x51;
- if (gUnknown_203B058 == 0x45)
- sub_80FB008(gUnknown_203B058 | 0x40, sub_811B2A8(1), 0);
+ data->playerSendBuffer[0] = ACTIVITY_ACCEPT | IN_UNION_ROOM;
+ if (sPlayerCurrActivity == (ACTIVITY_CHAT | IN_UNION_ROOM))
+ UpdateGameDataWithActivitySpriteGendersFlag(sPlayerCurrActivity | IN_UNION_ROOM, GetSinglePartnerSpriteGenderParam(1), FALSE);
else
- sub_80FB008(gUnknown_203B058 | 0x40, sub_811B2A8(1), 1);
+ UpdateGameDataWithActivitySpriteGendersFlag(sPlayerCurrActivity | IN_UNION_ROOM, GetSinglePartnerSpriteGenderParam(1), TRUE);
data->field_8->arr[0].field_1B = 0;
taskData[3] = 0;
- if (gUnknown_203B058 == 0x41)
+ if (sPlayerCurrActivity == (ACTIVITY_BATTLE | IN_UNION_ROOM))
{
if (!HasAtLeastTwoMonsOfLevel30OrLower())
{
- data->field_4C[0] = 0x52;
- sub_80F9E2C(data->field_4C);
+ data->playerSendBuffer[0] = ACTIVITY_DECLINE | IN_UNION_ROOM;
+ RfuPrepareSend0x2f00(data->playerSendBuffer);
data->state = 10;
StringCopy(gStringVar4, gUnknown_84584C0);
}
else
{
- sub_80F9E2C(data->field_4C);
+ RfuPrepareSend0x2f00(data->playerSendBuffer);
data->state = 13;
}
}
- else if (gUnknown_203B058 == 0x48)
+ else if (sPlayerCurrActivity == (ACTIVITY_CARD | IN_UNION_ROOM))
{
- sub_80F9E2C(data->field_4C);
- sub_811B31C(gStringVar4, data, 1);
+ RfuPrepareSend0x2f00(data->playerSendBuffer);
+ ViewURoomPartnerTrainerCard(gStringVar4, data, MODE_PARENT);
data->state = 40;
}
else
{
- sub_80F9E2C(data->field_4C);
+ RfuPrepareSend0x2f00(data->playerSendBuffer);
data->state = 13;
}
break;
case 1:
case -1:
- data->field_4C[0] = 0x52;
- sub_80F9E2C(data->field_4C);
+ data->playerSendBuffer[0] = ACTIVITY_DECLINE | IN_UNION_ROOM;
+ RfuPrepareSend0x2f00(data->playerSendBuffer);
data->state = 10;
- sub_81162E0(gStringVar4, gUnknown_203B058);
+ GetYouDeclinedTheOfferMessage(gStringVar4, sPlayerCurrActivity);
break;
}
break;
case 10:
- sub_800AAC0();
+ Link_TryStartSend5FFF();
data->state = 36;
break;
case 36:
+ // You said no
if (gReceivedRemoteLinkPlayers == 0)
{
- gUnknown_203B058 = 0x40;
- sub_8118664(0x25, gStringVar4);
- memset(data->field_4C, 0, sizeof(data->field_4C));
- data->field_9A[0] = 0;
- data->field_98 = 0;
+ sPlayerCurrActivity = IN_UNION_ROOM;
+ UnionRoom_ScheduleFieldMessageWithFollowupState(37, gStringVar4);
+ memset(data->playerSendBuffer, 0, sizeof(data->playerSendBuffer));
+ data->recvActivityRequest[0] = 0;
+ data->partnerYesNoResponse = 0;
}
break;
case 37:
data->state = 2;
- sub_811B258(FALSE);
+ HandleCancelTrade(FALSE);
break;
case 13:
- sub_811AECC(gStringVar4, gUnknown_203B058 | 0x40);
- sub_8118664(14, gStringVar4);
+ GetURoomActivityStartMsg(gStringVar4, sPlayerCurrActivity | IN_UNION_ROOM);
+ UnionRoom_ScheduleFieldMessageWithFollowupState(14, gStringVar4);
break;
case 14:
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
data->state = 15;
break;
case 15:
@@ -3072,7 +3199,7 @@ static void sub_81186E0(u8 taskId)
Free(data->field_C);
Free(data->field_4);
DestroyTask(data->field_20);
- sub_811BB40(data->spriteIds);
+ DestroyGroupMemberObjects(data->spriteIds);
data->state = 17;
break;
case 17:
@@ -3082,30 +3209,30 @@ static void sub_81186E0(u8 taskId)
case 18:
if (!UpdatePaletteFade())
{
- sub_811BA78();
+ DeleteUnionObjWorkAndStopTask();
DestroyTask(taskId);
Free(sUnionRoomMain.uRoom);
- sub_81179A4();
+ CreateTask_StartActivity();
}
break;
case 42:
- if (sub_80F9800()->species == SPECIES_NONE)
+ if (GetHostRFUtgtGname()->species == SPECIES_NONE)
{
data->state = 43;
}
else
{
- if (sub_80F9800()->species == SPECIES_EGG)
+ if (GetHostRFUtgtGname()->species == SPECIES_EGG)
{
StringCopy(gStringVar4, gUnknown_8458DE8);
}
else
{
- StringCopy(gStringVar1, gSpeciesNames[sub_80F9800()->species]);
- ConvertIntToDecimalStringN(gStringVar2, sub_80F9800()->level, STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringCopy(gStringVar1, gSpeciesNames[GetHostRFUtgtGname()->species]);
+ ConvertIntToDecimalStringN(gStringVar2, GetHostRFUtgtGname()->level, STR_CONV_MODE_LEFT_ALIGN, 3);
StringExpandPlaceholders(gStringVar4, gUnknown_8458DBC);
}
- sub_8118664(44, gStringVar4);
+ UnionRoom_ScheduleFieldMessageWithFollowupState(44, gStringVar4);
}
break;
case 43:
@@ -3113,23 +3240,23 @@ static void sub_81186E0(u8 taskId)
data->state = 47;
break;
case 47:
- var5 = sub_811A218(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_8456E34, &gUnknown_8456E54);
+ var5 = ListMenuHandler_AllItemsAvailable(&data->textState, &data->tradeBoardSelectWindowId, &data->tradeBoardDetailsWindowId, &sWindowTemplate_TradeBoardRegisterInfoExit, &sListMenuTemplate_TradeBoardRegisterInfoExit);
if (var5 != -1)
{
if (var5 == -2 || var5 == 3)
{
data->state = 4;
- sub_811B258(TRUE);
+ HandleCancelTrade(TRUE);
}
else
{
switch (var5)
{
case 1: // REGISTER
- sub_8118664(53, gUnknown_8458D1C);
+ UnionRoom_ScheduleFieldMessageWithFollowupState(53, gUnknown_8458D1C);
break;
case 2: // INFO
- sub_8118664(47, gUnknown_8458B44);
+ UnionRoom_ScheduleFieldMessageWithFollowupState(47, gUnknown_8458B44);
break;
}
}
@@ -3149,7 +3276,7 @@ static void sub_81186E0(u8 taskId)
}
break;
case 52:
- var5 = sub_811A218(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_8456E6C, &gUnknown_8456F04);
+ var5 = ListMenuHandler_AllItemsAvailable(&data->textState, &data->tradeBoardSelectWindowId, &data->tradeBoardDetailsWindowId, &sWindowTemplate_TypeNames, &sListMenuTemplate_TypeNames);
if (var5 != -1)
{
switch (var5)
@@ -3157,8 +3284,8 @@ static void sub_81186E0(u8 taskId)
case -2:
case 18:
ResetUnionRoomTrade(&sUnionRoomTrade);
- sub_80FAFA0(0, 0, 0);
- sub_811868C(gUnknown_8458D54);
+ RfuUpdatePlayerGnameStateAndSend(0, 0, 0);
+ UnionRoom_ScheduleFieldMessageAndExit(gUnknown_8458D54);
break;
default:
sUnionRoomTrade.type = var5;
@@ -3168,18 +3295,18 @@ static void sub_81186E0(u8 taskId)
}
break;
case 55:
- sub_80FAFA0(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);
- sub_811868C(gUnknown_8458D78);
+ RfuUpdatePlayerGnameStateAndSend(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);
+ UnionRoom_ScheduleFieldMessageAndExit(gUnknown_8458D78);
break;
case 44:
- switch (sub_811A14C(&data->textState, FALSE))
+ switch (UnionRoomHandleYesNo(&data->textState, FALSE))
{
case 0:
data->state = 56;
break;
case 1:
case -1:
- sub_811B258(TRUE);
+ HandleCancelTrade(TRUE);
data->state = 4;
break;
}
@@ -3187,9 +3314,9 @@ static void sub_81186E0(u8 taskId)
case 56:
if (PrintOnTextbox(&data->textState, gUnknown_8458E10))
{
- sub_80FAFA0(0, 0, 0);
+ RfuUpdatePlayerGnameStateAndSend(0, 0, 0);
ResetUnionRoomTrade(&sUnionRoomTrade);
- sub_811B258(TRUE);
+ HandleCancelTrade(TRUE);
data->state = 4;
}
break;
@@ -3198,38 +3325,38 @@ static void sub_81186E0(u8 taskId)
data->state = 46;
break;
case 46:
- sub_811A3F8();
+ UR_BlankBg0();
data->state = 48;
break;
case 48:
- var5 = sub_811A2EC(&data->textState, &data->field_1D, &data->field_4A, &data->field_1E, &gUnknown_8456F24, &gUnknown_8456F7C, data->field_0);
+ var5 = TradeBoardMenuHandler(&data->textState, &data->tradeBoardSelectWindowId, &data->tradeBoardListMenuId, &data->tradeBoardDetailsWindowId, &gUnknown_8456F24, &sTradeBoardListMenuTemplate, data->field_0);
if (var5 != -1)
{
switch (var5)
{
case -2:
case 8:
- sub_811B258(TRUE);
+ HandleCancelTrade(TRUE);
DestroyHelpMessageWindow_();
data->state = 4;
break;
default:
- switch (sub_811ADD0(data->field_0->arr[var5].unk.gname.type, data->field_0->arr[var5].unk.gname.species))
+ switch (IsRequestedTypeAndSpeciesInPlayerParty(data->field_0->arr[var5].gname_uname.gname.type, data->field_0->arr[var5].gname_uname.gname.species))
{
- case 0:
+ case UR_TRADE_MATCH:
IntlConvPartnerUname(gStringVar1, data->field_0->arr[var5]);
- sub_8118664(49, gUnknown_8458E70);
+ UnionRoom_ScheduleFieldMessageWithFollowupState(49, gUnknown_8458E70);
taskData[1] = var5;
break;
- case 1:
+ case UR_TRADE_NOTYPE:
IntlConvPartnerUname(gStringVar1, data->field_0->arr[var5]);
- StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].unk.gname.type]);
- sub_8118664(46, gUnknown_8458ED0);
+ StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].gname_uname.gname.type]);
+ UnionRoom_ScheduleFieldMessageWithFollowupState(46, gUnknown_8458ED0);
break;
- case 2:
+ case UR_TRADE_NOEGG:
IntlConvPartnerUname(gStringVar1, data->field_0->arr[var5]);
- StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].unk.gname.type]);
- sub_8118664(46, gUnknown_8458F04);
+ StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].gname_uname.gname.type]);
+ UnionRoom_ScheduleFieldMessageWithFollowupState(46, gUnknown_8458F04);
break;
}
break;
@@ -3237,14 +3364,14 @@ static void sub_81186E0(u8 taskId)
}
break;
case 49:
- switch (sub_811A14C(&data->textState, FALSE))
+ switch (UnionRoomHandleYesNo(&data->textState, FALSE))
{
case 0:
data->state = 50;
break;
case -1:
case 1:
- sub_811B258(TRUE);
+ HandleCancelTrade(TRUE);
data->state = 4;
break;
}
@@ -3253,27 +3380,27 @@ static void sub_81186E0(u8 taskId)
if (PrintOnTextbox(&data->textState, gUnknown_8458D1C))
{
sUnionRoomTrade.field_0 = 2;
- memcpy(&gUnknown_203B064, &data->field_0->arr[taskData[1]].unk.gname.unk_00, sizeof(gUnknown_203B064));
- gUnionRoomRequestedMonType = data->field_0->arr[taskData[1]].unk.gname.type;
- gUnionRoomOfferedSpecies = data->field_0->arr[taskData[1]].unk.gname.species;
+ memcpy(&gPartnerTgtGnameSub, &data->field_0->arr[taskData[1]].gname_uname.gname.unk_00, sizeof(gPartnerTgtGnameSub));
+ gUnionRoomRequestedMonType = data->field_0->arr[taskData[1]].gname_uname.gname.type;
+ gUnionRoomOfferedSpecies = data->field_0->arr[taskData[1]].gname_uname.gname.species;
gFieldCallback = sub_807DCE4;
ChooseMonForTradingBoard(PARTY_MENU_TYPE_UNION_ROOM_TRADE, CB2_ReturnToField);
- sub_81186B0(data);
+ BackUpURoomField0ToDecompressionBuffer(data);
sUnionRoomTrade.field_8 = taskData[1];
}
break;
case 51:
- gUnknown_203B058 = 0x44;
- sub_80FC114(data->field_0->arr[taskData[1]].unk.playerName, &data->field_0->arr[taskData[1]].unk.gname, 0x44);
+ sPlayerCurrActivity = ACTIVITY_TRADE | IN_UNION_ROOM;
+ sub_80FC114(data->field_0->arr[taskData[1]].gname_uname.uname, &data->field_0->arr[taskData[1]].gname_uname.gname, ACTIVITY_TRADE | IN_UNION_ROOM);
IntlConvPartnerUname(gStringVar1, data->field_0->arr[taskData[1]]);
- sub_811A0B4(gUnknown_8457A34[2]);
+ UR_PrintFieldMessage(gURText_PleaseWaitMsgs[2]);
data->state = 25;
break;
case 26:
if (PrintOnTextbox(&data->textState, gStringVar4))
{
- sub_811B258(TRUE);
- sub_811C028(taskData[0], taskData[1], data->field_0);
+ HandleCancelTrade(TRUE);
+ UpdateUnionGroupMemberFacing(taskData[0], taskData[1], data->field_0);
data->state = 4;
}
break;
@@ -3290,38 +3417,38 @@ void var_800D_set_xB(void)
gSpecialVar_Result = 11;
}
-static void sub_8119904(struct UnkStruct_URoom * arg0)
+static void ReceiveUnionRoomActivityPacket(struct UnkStruct_URoom * uroom)
{
- if (gRecvCmds[1][1] != 0 && (gRecvCmds[1][0] & 0xFF00) == 0x2F00)
+ if (gRecvCmds[1][1] != 0 && (gRecvCmds[1][0] & 0xFF00) == RFU_COMMAND_0x2f00)
{
- arg0->field_9A[0] = gRecvCmds[1][1];
- if (gRecvCmds[1][1] == 0x44)
+ uroom->recvActivityRequest[0] = gRecvCmds[1][1];
+ if (gRecvCmds[1][1] == (ACTIVITY_TRADE | IN_UNION_ROOM))
{
- arg0->field_9A[1] = gRecvCmds[1][2];
- arg0->field_9A[2] = gRecvCmds[1][3];
+ uroom->recvActivityRequest[1] = gRecvCmds[1][2];
+ uroom->recvActivityRequest[2] = gRecvCmds[1][3];
}
}
}
-static bool32 sub_8119944(struct UnkStruct_URoom * arg0)
+static bool32 UnionRoom_HandleContactFromOtherPlayer(struct UnkStruct_URoom * uroom)
{
- if (arg0->field_9A[0] != 0)
+ if (uroom->recvActivityRequest[0] != 0)
{
- s32 var = sub_811AF6C(gStringVar4, gLinkPlayers[1].gender, &arg0->field_9A[0], arg0);
+ s32 var = GetChatLeaderActionRequestMessage(gStringVar4, gLinkPlayers[1].gender, &uroom->recvActivityRequest[0], uroom);
if (var == 0)
{
return TRUE;
}
else if (var == 1)
{
- arg0->state = 35;
- gUnknown_203B058 = arg0->field_9A[0];
+ uroom->state = 35;
+ sPlayerCurrActivity = uroom->recvActivityRequest[0];
return FALSE;
}
else if (var == 2)
{
- arg0->state = 36;
- sub_800AAC0();
+ uroom->state = 36;
+ Link_TryStartSend5FFF();
return FALSE;
}
}
@@ -3336,7 +3463,7 @@ void InitUnionRoom(void)
sUnionRoomPlayerName[0] = EOS;
if (gQuestLogState == 2 || gQuestLogState == 3)
return;
- CreateTask(sub_81199FC, 0);
+ CreateTask(Task_InitUnionRoom, 0);
sUnionRoomMain.uRoom = sUnionRoomMain.uRoom; // Needed to match.
sUnionRoomMain.uRoom = ptr = AllocZeroed(sizeof(struct UnkStruct_URoom));
sURoom = sUnionRoomMain.uRoom;
@@ -3347,7 +3474,7 @@ void InitUnionRoom(void)
sUnionRoomPlayerName[0] = EOS;
}
-static void sub_81199FC(u8 taskId)
+static void Task_InitUnionRoom(u8 taskId)
{
s32 i;
u8 text[32];
@@ -3359,27 +3486,27 @@ static void sub_81199FC(u8 taskId)
structPtr->state = 1;
break;
case 1:
- SetHostRFUtgtGname(0xC, 0, 0);
- sub_800B1F4();
+ SetHostRFUtgtGname(ACTIVITY_SEARCH, 0, 0);
+ SetWirelessCommType1();
OpenLink();
- sub_80FBC00();
- sub_80FB128(1);
+ InitializeRfuLinkManager_EnterUnionRoom();
+ sub_80FB128(TRUE);
structPtr->state = 2;
break;
case 2:
structPtr->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
- sub_811A650(structPtr->field_4->arr, 4);
+ BlankUnkStruct_x1CArray(structPtr->field_4->arr, 4);
structPtr->field_C = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
- sub_811A650(structPtr->field_C->arr, 4);
- structPtr->field_0 = AllocZeroed(8 * sizeof(struct UnkStruct_x20));
- sub_811A5E4(structPtr->field_0->arr, 8);
+ BlankUnkStruct_x1CArray(structPtr->field_C->arr, 4);
+ structPtr->field_0 = AllocZeroed(UROOM_MAX_GROUP_COUNT * sizeof(struct UnkStruct_x20));
+ BlankUnkStruct_x20Array(structPtr->field_0->arr, UROOM_MAX_GROUP_COUNT);
structPtr->field_8 = AllocZeroed(sizeof(struct UnkStruct_x20));
- sub_811A5E4(&structPtr->field_8->arr[0], 1);
- structPtr->field_20 = sub_8119E84(structPtr->field_C, structPtr->field_4, 10);
+ BlankUnkStruct_x20Array(&structPtr->field_8->arr[0], 1);
+ structPtr->field_20 = CreateTask_SearchForChildOrParent(structPtr->field_C, structPtr->field_4, LINK_GROUP_UNION_ROOM_INIT);
structPtr->state = 3;
break;
case 3:
- switch (sub_8119B94())
+ switch (HandlePlayerListUpdate())
{
case 1:
case 2:
@@ -3387,10 +3514,10 @@ static void sub_81199FC(u8 taskId)
{
for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)
{
- if (structPtr->field_0->arr[i].field_1A_0 == 1)
+ if (structPtr->field_0->arr[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN)
{
IntlConvPartnerUname(text, structPtr->field_0->arr[i]);
- if (PlayerHasMetTrainerBefore(ReadAsU16(structPtr->field_0->arr[i].unk.gname.unk_00.playerTrainerId), text))
+ if (PlayerHasMetTrainerBefore(ReadAsU16(structPtr->field_0->arr[i].gname_uname.gname.unk_00.playerTrainerId), text))
{
StringCopy(sUnionRoomPlayerName, text);
break;
@@ -3410,7 +3537,7 @@ static void sub_81199FC(u8 taskId)
Free(structPtr->field_4);
DestroyTask(structPtr->field_20);
Free(sUnionRoomMain.uRoom);
- sub_80F8DC0();
+ LinkRfu_Shutdown();
DestroyTask(taskId);
break;
}
@@ -3430,36 +3557,41 @@ bool16 BufferUnionRoomPlayerName(void)
}
}
-static u8 sub_8119B94(void)
+static u8 HandlePlayerListUpdate(void)
{
s32 i;
u8 j;
struct UnkStruct_URoom * structPtr = sUnionRoomMain.uRoom;
s32 r7 = 0;
- for (i = 0; i < 4; i++)
+ // If someone new joined, register them in field_8
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (sub_811A694(&structPtr->field_C->arr[i].unk0, &gUnknown_8457034) == TRUE)
+ if (AreGnameUnameDifferent(&structPtr->field_C->arr[i].gname_uname, &sUnionGnameUnamePair_Dummy) == TRUE)
{
- structPtr->field_8->arr[0].unk = structPtr->field_C->arr[i].unk0;
+ structPtr->field_8->arr[0].gname_uname = structPtr->field_C->arr[i].gname_uname;
structPtr->field_8->arr[0].field_18 = 0;
- structPtr->field_8->arr[0].field_1A_0 = 1;
+ structPtr->field_8->arr[0].groupScheduledAnim = UNION_ROOM_SPAWN_IN;
structPtr->field_8->arr[0].field_1B = 1;
return 4;
}
}
- for (j = 0; j < 8; j++)
+
+ // Handle changes to existing player statuses
+ for (j = 0; j < UROOM_MAX_GROUP_COUNT; j++)
{
- if (structPtr->field_0->arr[j].field_1A_0 != 0)
+ if (structPtr->field_0->arr[j].groupScheduledAnim != UNION_ROOM_SPAWN_NONE)
{
- i = sub_811A748(&structPtr->field_0->arr[j], &structPtr->field_4->arr[0]);
+ i = Findx20Inx1CArray(&structPtr->field_0->arr[j], &structPtr->field_4->arr[0]);
if (i != 0xFF)
{
- if (structPtr->field_0->arr[j].field_1A_0 == 1)
+ if (structPtr->field_0->arr[j].groupScheduledAnim == UNION_ROOM_SPAWN_IN)
{
- if (sub_811A6DC(&structPtr->field_0->arr[j].unk, &structPtr->field_4->arr[i].unk0))
+ // New join in queue
+ if (AreUnionRoomPlayerGnamesDifferent(&structPtr->field_0->arr[j].gname_uname, &structPtr->field_4->arr[i].gname_uname))
{
- structPtr->field_0->arr[j].unk = structPtr->field_4->arr[i].unk0;
+ // Just joined, copy their names
+ structPtr->field_0->arr[j].gname_uname = structPtr->field_4->arr[i].gname_uname;
structPtr->field_0->arr[j].field_1B = 0x40;
r7 = 1;
}
@@ -3472,116 +3604,121 @@ static u8 sub_8119B94(void)
}
else
{
- structPtr->field_0->arr[j].field_1A_0 = 1;
+ // New join, queue them
+ structPtr->field_0->arr[j].groupScheduledAnim = UNION_ROOM_SPAWN_IN;
structPtr->field_0->arr[j].field_1B = 0;
r7 = 2;
}
structPtr->field_0->arr[j].field_18 = 0;
}
- else if (structPtr->field_0->arr[j].field_1A_0 != 2)
+ else if (structPtr->field_0->arr[j].groupScheduledAnim != UNION_ROOM_SPAWN_OUT)
{
+ // Person may have disconnected. Give them 10 seconds.
structPtr->field_0->arr[j].field_18++;
if (structPtr->field_0->arr[j].field_18 >= 600)
{
- structPtr->field_0->arr[j].field_1A_0 = 2;
+ structPtr->field_0->arr[j].groupScheduledAnim = UNION_ROOM_SPAWN_OUT;
r7 = 2;
}
}
- else if (structPtr->field_0->arr[j].field_1A_0 == 2)
+ else if (structPtr->field_0->arr[j].groupScheduledAnim == UNION_ROOM_SPAWN_OUT)
{
+ // Person dropped. Wait 15 seconds, then remove them.
structPtr->field_0->arr[j].field_18++;
if (structPtr->field_0->arr[j].field_18 >= 900)
{
- sub_811A5E4(&structPtr->field_0->arr[j], 1);
+ BlankUnkStruct_x20Array(&structPtr->field_0->arr[j], 1);
}
}
}
}
- for (i = 0; i < 4; i++)
+
+ // Update the players list
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (sub_811A798(&structPtr->field_0->arr[0], &structPtr->field_4->arr[i], 8) != 0xFF)
+ if (Appendx1Ctox20(&structPtr->field_0->arr[0], &structPtr->field_4->arr[i], UROOM_MAX_GROUP_COUNT) != 0xFF)
r7 = 1;
}
return r7;
}
-static void sub_8119D34(u8 taskId)
+static void Task_SearchForChildOrParent(u8 taskId)
{
s32 i, j;
- struct UnkStruct_Shared sp0;
+ struct UnionGnameUnamePair gname_uname;
struct UnkStruct_Main4 ** ptr = (void*) gTasks[taskId].data;
- bool8 r4;
+ bool8 parent_child;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- r4 = sub_80FCC3C(&sp0.gname, sp0.playerName, i);
- if (!sub_8116F28(sp0.gname.unk_0a_0, gTasks[taskId].data[4]))
+ parent_child = LinkRfu_GetNameIfCompatible(&gname_uname.gname, gname_uname.uname, i);
+ if (!IsPartnerActivityAcceptable(gname_uname.gname.activity, gTasks[taskId].data[4]))
{
- sp0 = gUnknown_8457034;
+ gname_uname = sUnionGnameUnamePair_Dummy;
}
- if (sp0.gname.unk_00.unk_00_0 == 1)
+ if (gname_uname.gname.unk_00.language == LANGUAGE_JAPANESE)
{
- sp0 = gUnknown_8457034;
+ gname_uname = sUnionGnameUnamePair_Dummy;
}
- if (!r4)
+ if (parent_child == MODE_CHILD)
{
for (j = 0; j < i; j++)
{
- if (!sub_811A694(&ptr[1]->arr[j].unk0, &sp0))
+ if (!AreGnameUnameDifferent(&ptr[1]->arr[j].gname_uname, &gname_uname))
{
- sp0 = gUnknown_8457034;
+ gname_uname = sUnionGnameUnamePair_Dummy;
}
}
- ptr[1]->arr[i].unk0 = sp0;
- ptr[1]->arr[i].unk18 = sub_811A694(&ptr[1]->arr[i].unk0, &gUnknown_8457034);
+ ptr[1]->arr[i].gname_uname = gname_uname;
+ ptr[1]->arr[i].active = AreGnameUnameDifferent(&ptr[1]->arr[i].gname_uname, &sUnionGnameUnamePair_Dummy);
}
else
{
- ptr[0]->arr[i].unk0 = sp0;
- ptr[0]->arr[i].unk18 = sub_811A694(&ptr[0]->arr[i].unk0, &gUnknown_8457034);
+ ptr[0]->arr[i].gname_uname = gname_uname;
+ ptr[0]->arr[i].active = AreGnameUnameDifferent(&ptr[0]->arr[i].gname_uname, &sUnionGnameUnamePair_Dummy);
}
}
}
-static u8 sub_8119E84(struct UnkStruct_Main4 * a0, struct UnkStruct_Main4 * a1, u32 a2)
+static u8 CreateTask_SearchForChildOrParent(struct UnkStruct_Main4 * main4_parent, struct UnkStruct_Main4 * main4_child, u32 linkGroup)
{
- u8 taskId = CreateTask(sub_8119D34, 0);
+ u8 taskId = CreateTask(Task_SearchForChildOrParent, 0);
struct UnkStruct_Main4 ** data = (void *)gTasks[taskId].data;
- data[0] = a0;
- data[1] = a1;
- gTasks[taskId].data[4] = a2;
+ data[0] = main4_parent;
+ data[1] = main4_child;
+ gTasks[taskId].data[4] = linkGroup;
return taskId;
}
-static void sub_8119EB8(u8 taskId)
+static void Task_ListenForPartnersWithCompatibleSerialNos(u8 taskId)
{
s32 i, j;
struct UnkStruct_Main4 ** ptr = (void*) gTasks[taskId].data;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- sub_80FCC3C(&ptr[0]->arr[i].unk0.gname, ptr[0]->arr[i].unk0.playerName, i);
- if (!sub_8116F28(ptr[0]->arr[i].unk0.gname.unk_0a_0, gTasks[taskId].data[2]))
+ LinkRfu_GetNameIfCompatible(&ptr[0]->arr[i].gname_uname.gname, ptr[0]->arr[i].gname_uname.uname, i);
+ if (!IsPartnerActivityAcceptable(ptr[0]->arr[i].gname_uname.gname.activity, gTasks[taskId].data[2]))
{
- ptr[0]->arr[i].unk0 = gUnknown_8457034;
+ ptr[0]->arr[i].gname_uname = sUnionGnameUnamePair_Dummy;
}
for (j = 0; j < i; j++)
{
- if (!sub_811A694(&ptr[0]->arr[j].unk0, &ptr[0]->arr[i].unk0))
+ if (!AreGnameUnameDifferent(&ptr[0]->arr[j].gname_uname, &ptr[0]->arr[i].gname_uname))
{
- ptr[0]->arr[i].unk0 = gUnknown_8457034;
+ ptr[0]->arr[i].gname_uname = sUnionGnameUnamePair_Dummy;
}
}
- ptr[0]->arr[i].unk18 = sub_811A694(&ptr[0]->arr[i].unk0, &gUnknown_8457034);
+ ptr[0]->arr[i].active = AreGnameUnameDifferent(&ptr[0]->arr[i].gname_uname, &sUnionGnameUnamePair_Dummy);
}
}
-static bool32 sub_8119FB0(struct GFtgtGname * arg0, s16 arg1)
+static bool32 GetGnameWonderFlagByLinkGroup(struct GFtgtGname * gname, s16 linkGroup)
{
- if (arg1 == 7)
+ if (linkGroup == LINK_GROUP_WONDER_CARD)
{
- if (!arg0->unk_00.unk_00_5)
+ if (!gname->unk_00.hasCard)
{
return FALSE;
}
@@ -3590,9 +3727,9 @@ static bool32 sub_8119FB0(struct GFtgtGname * arg0, s16 arg1)
return TRUE;
}
}
- else if (arg1 == 8)
+ else if (linkGroup == LINK_GROUP_WONDER_NEWS)
{
- if (!arg0->unk_00.unk_00_4)
+ if (!gname->unk_00.hasNews)
{
return FALSE;
}
@@ -3607,40 +3744,40 @@ static bool32 sub_8119FB0(struct GFtgtGname * arg0, s16 arg1)
}
}
-static void sub_8119FD8(u8 taskId)
+static void Task_ListenForPartnersWithSerial7F7D(u8 taskId)
{
s32 i;
struct UnkStruct_Main4 ** ptr = (void*) gTasks[taskId].data;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (sub_80FCCF4(&ptr[0]->arr[i].unk0.gname, ptr[0]->arr[i].unk0.playerName, i))
+ if (LinkRfu_GetNameIfSerial7F7D(&ptr[0]->arr[i].gname_uname.gname, ptr[0]->arr[i].gname_uname.uname, i))
{
- sub_8119FB0(&ptr[0]->arr[i].unk0.gname, gTasks[taskId].data[2]);
+ GetGnameWonderFlagByLinkGroup(&ptr[0]->arr[i].gname_uname.gname, gTasks[taskId].data[2]);
}
- ptr[0]->arr[i].unk18 = sub_811A694(&ptr[0]->arr[i].unk0, &gUnknown_8457034);
+ ptr[0]->arr[i].active = AreGnameUnameDifferent(&ptr[0]->arr[i].gname_uname, &sUnionGnameUnamePair_Dummy);
}
}
-static u8 sub_811A054(struct UnkStruct_Main4 * a0, u32 a1)
+static u8 CreateTask_ListenForPartnersWithCompatibleSerialNos(struct UnkStruct_Main4 * main4, u32 linkGroup)
{
- u8 taskId = CreateTask(sub_8119EB8, 0);
+ u8 taskId = CreateTask(Task_ListenForPartnersWithCompatibleSerialNos, 0);
struct UnkStruct_Main4 ** ptr = (void*) gTasks[taskId].data;
- ptr[0] = a0;
- gTasks[taskId].data[2] = a1;
+ ptr[0] = main4;
+ gTasks[taskId].data[2] = linkGroup;
return taskId;
}
-static u8 sub_811A084(struct UnkStruct_Main4 * a0, u32 a1)
+static u8 CreateTask_ListenForPartnersWithSerial7F7D(struct UnkStruct_Main4 * main4, u32 linkGroup)
{
- u8 taskId = CreateTask(sub_8119FD8, 0);
+ u8 taskId = CreateTask(Task_ListenForPartnersWithSerial7F7D, 0);
struct UnkStruct_Main4 ** ptr = (void*) gTasks[taskId].data;
- ptr[0] = a0;
- gTasks[taskId].data[2] = a1;
+ ptr[0] = main4;
+ gTasks[taskId].data[2] = linkGroup;
return taskId;
}
-static bool32 sub_811A0B4(const u8 *src)
+static bool32 UR_PrintFieldMessage(const u8 *src)
{
LoadStdWindowFrameGfx();
DrawDialogueFrame(0, 1);
@@ -3649,7 +3786,7 @@ static bool32 sub_811A0B4(const u8 *src)
return FALSE;
}
-static bool32 sub_811A0E0(void)
+static bool32 UR_RunTextPrinters_CheckPrinter0Active(void)
{
if (!RunTextPrinters_CheckPrinter0Active())
{
@@ -3683,31 +3820,31 @@ static bool8 PrintOnTextbox(u8 *textState, const u8 *str)
return FALSE;
}
-static s8 sub_811A14C(u8 *arg0, bool32 arg1)
+static s8 UnionRoomHandleYesNo(u8 *state_p, bool32 no_draw)
{
s8 r1;
- switch (*arg0)
+ switch (*state_p)
{
case 0:
- if (arg1)
+ if (no_draw)
{
return -3;
}
DisplayYesNoMenuDefaultYes();
- (*arg0)++;
+ (*state_p)++;
break;
case 1:
- if (arg1)
+ if (no_draw)
{
DestroyYesNoMenu();
- *arg0 = 0;
+ *state_p = 0;
return -3;
}
r1 = Menu_ProcessInputNoWrapClearOnChoose();
if (r1 == -1 || r1 == 0 || r1 == 1)
{
- *arg0 = 0;
+ *state_p = 0;
return r1;
}
break;
@@ -3715,54 +3852,54 @@ static s8 sub_811A14C(u8 *arg0, bool32 arg1)
return -2;
}
-static u8 sub_811A1AC(const struct WindowTemplate * template)
+static u8 CreateTradeBoardWindow(const struct WindowTemplate * template)
{
u8 windowId = AddWindow(template);
DrawStdWindowFrame(windowId, FALSE);
FillWindowPixelBuffer(windowId, PIXEL_FILL(15));
- sub_811A444(windowId, 0, gUnknown_8459378, 8, 1, 6);
+ UR_AddTextPrinterParameterized(windowId, 0, gUnknown_8459378, 8, 1, UR_COLOR_DN5_DN6_LTB);
PutWindowTilemap(windowId);
CopyWindowToVram(windowId, 2);
return windowId;
}
-static void sub_811A1FC(u8 windowId)
+static void DeleteTradeBoardWindow(u8 windowId)
{
ClearStdWindowAndFrame(windowId, TRUE);
RemoveWindow(windowId);
}
-static s32 sub_811A218(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate)
+static s32 ListMenuHandler_AllItemsAvailable(u8 *state_p, u8 *win_id_p, u8 *list_menu_id_p, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate)
{
- s32 r1, r8;
+ s32 input;
- switch (*arg0)
+ switch (*state_p)
{
case 0:
- *arg1 = AddWindow(winTemplate);
- DrawStdWindowFrame(*arg1, FALSE);
+ *win_id_p = AddWindow(winTemplate);
+ DrawStdWindowFrame(*win_id_p, FALSE);
gMultiuseListMenuTemplate = *menuTemplate;
- gMultiuseListMenuTemplate.windowId = *arg1;
- *arg2 = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
- CopyWindowToVram(*arg1, TRUE);
- (*arg0)++;
+ gMultiuseListMenuTemplate.windowId = *win_id_p;
+ *list_menu_id_p = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+ CopyWindowToVram(*win_id_p, TRUE);
+ (*state_p)++;
break;
case 1:
- r8 = ListMenu_ProcessInput(*arg2);
+ input = ListMenu_ProcessInput(*list_menu_id_p);
if (JOY_NEW(A_BUTTON))
{
- DestroyListMenuTask(*arg2, NULL, NULL);
- ClearStdWindowAndFrame(*arg1, TRUE);
- RemoveWindow(*arg1);
- *arg0 = 0;
- return r8;
+ DestroyListMenuTask(*list_menu_id_p, NULL, NULL);
+ ClearStdWindowAndFrame(*win_id_p, TRUE);
+ RemoveWindow(*win_id_p);
+ *state_p = 0;
+ return input;
}
else if (JOY_NEW(B_BUTTON))
{
- DestroyListMenuTask(*arg2, NULL, NULL);
- ClearStdWindowAndFrame(*arg1, TRUE);
- RemoveWindow(*arg1);
- *arg0 = 0;
+ DestroyListMenuTask(*list_menu_id_p, NULL, NULL);
+ ClearStdWindowAndFrame(*win_id_p, TRUE);
+ RemoveWindow(*win_id_p);
+ *state_p = 0;
return -2;
}
break;
@@ -3771,46 +3908,46 @@ static s32 sub_811A218(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate
return -1;
}
-static s32 sub_811A2EC(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate, struct UnkStruct_Main0 * arg6)
+static s32 TradeBoardMenuHandler(u8 *state_p, u8 *win_id_p, u8 *list_menu_id_p, u8 *trade_board_win_id_p, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate, struct UnkStruct_Main0 * traders)
{
s32 input;
s32 r4;
- switch (*arg0)
+ switch (*state_p)
{
case 0:
- *arg3 = sub_811A1AC(&gUnknown_8456F1C);
- *arg1 = AddWindow(winTemplate);
- DrawStdWindowFrame(*arg1, FALSE);
+ *trade_board_win_id_p = CreateTradeBoardWindow(&sTradeBoardWindowTemplate);
+ *win_id_p = AddWindow(winTemplate);
+ DrawStdWindowFrame(*win_id_p, FALSE);
gMultiuseListMenuTemplate = *menuTemplate;
- gMultiuseListMenuTemplate.windowId = *arg1;
- *arg2 = ListMenuInit(&gMultiuseListMenuTemplate, 0, 1);
- CopyWindowToVram(*arg1, TRUE);
- (*arg0)++;
+ gMultiuseListMenuTemplate.windowId = *win_id_p;
+ *list_menu_id_p = ListMenuInit(&gMultiuseListMenuTemplate, 0, 1);
+ CopyWindowToVram(*win_id_p, TRUE);
+ (*state_p)++;
break;
case 1:
- input = ListMenu_ProcessInput(*arg2);
+ input = ListMenu_ProcessInput(*list_menu_id_p);
if (JOY_NEW(A_BUTTON | B_BUTTON))
{
- if (input == 8 || JOY_NEW(B_BUTTON))
+ if (input == UROOM_MAX_GROUP_COUNT || JOY_NEW(B_BUTTON))
{
- DestroyListMenuTask(*arg2, NULL, NULL);
- ClearStdWindowAndFrame(*arg1, TRUE);
- RemoveWindow(*arg1);
- sub_811A1FC(*arg3);
- *arg0 = 0;
+ DestroyListMenuTask(*list_menu_id_p, NULL, NULL);
+ ClearStdWindowAndFrame(*win_id_p, TRUE);
+ RemoveWindow(*win_id_p);
+ DeleteTradeBoardWindow(*trade_board_win_id_p);
+ *state_p = 0;
return -2;
}
else
{
- r4 = sub_811AD7C(arg6->arr, input);
+ r4 = GetIndexOfNthTradeBoardOffer(traders->arr, input);
if (r4 >= 0)
{
- DestroyListMenuTask(*arg2, NULL, NULL);
- ClearStdWindowAndFrame(*arg1, TRUE);
- RemoveWindow(*arg1);
- sub_811A1FC(*arg3);
- *arg0 = 0;
+ DestroyListMenuTask(*list_menu_id_p, NULL, NULL);
+ ClearStdWindowAndFrame(*win_id_p, TRUE);
+ RemoveWindow(*win_id_p);
+ DeleteTradeBoardWindow(*trade_board_win_id_p);
+ *state_p = 0;
return r4;
}
else
@@ -3825,20 +3962,20 @@ static s32 sub_811A2EC(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct Wind
return -1;
}
-static void sub_811A3F8(void)
+static void UR_BlankBg0(void)
{
FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 0);
CopyBgTilemapBufferToVram(0);
}
-static void sub_811A41C(void)
+static void JoinGroup_BlankBg0AndEnableScriptContexts(void)
{
FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 0);
CopyBgTilemapBufferToVram(0);
EnableBothScriptContexts();
}
-static void sub_811A444(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx)
+static void UR_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx)
{
struct TextPrinterTemplate printerTemplate;
@@ -3854,100 +3991,100 @@ static void sub_811A444(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 co
gTextFlags.useAlternateDownArrow = FALSE;
switch (colorIdx)
{
- case 0:
+ case UR_COLOR_DKE_WHT_LTE:
printerTemplate.letterSpacing = 0;
printerTemplate.lineSpacing = 0;
- printerTemplate.fgColor = 2;
- printerTemplate.bgColor = 1;
- printerTemplate.shadowColor = 3;
+ printerTemplate.fgColor = TEXT_COLOR_DARK_GREY;
+ printerTemplate.bgColor = TEXT_COLOR_WHITE;
+ printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GREY;
break;
- case 1:
+ case UR_COLOR_RED_WHT_LTR:
printerTemplate.letterSpacing = 0;
printerTemplate.lineSpacing = 0;
- printerTemplate.fgColor = 4;
- printerTemplate.bgColor = 1;
- printerTemplate.shadowColor = 5;
+ printerTemplate.fgColor = TEXT_COLOR_RED;
+ printerTemplate.bgColor = TEXT_COLOR_WHITE;
+ printerTemplate.shadowColor = TEXT_COLOR_LIGHT_RED;
break;
- case 2:
+ case UR_COLOR_GRN_WHT_LTG:
printerTemplate.letterSpacing = 0;
printerTemplate.lineSpacing = 0;
- printerTemplate.fgColor = 6;
- printerTemplate.bgColor = 1;
- printerTemplate.shadowColor = 7;
+ printerTemplate.fgColor = TEXT_COLOR_GREEN;
+ printerTemplate.bgColor = TEXT_COLOR_WHITE;
+ printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GREEN;
break;
- case 3:
+ case UR_COLOR_WHT_WHT_LTE:
printerTemplate.letterSpacing = 0;
printerTemplate.lineSpacing = 0;
- printerTemplate.fgColor = 1;
- printerTemplate.bgColor = 1;
- printerTemplate.shadowColor = 3;
+ printerTemplate.fgColor = TEXT_COLOR_WHITE;
+ printerTemplate.bgColor = TEXT_COLOR_WHITE;
+ printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GREY;
break;
- case 4:
+ case UR_COLOR_WHT_DKE_LTE:
printerTemplate.letterSpacing = 0;
printerTemplate.lineSpacing = 0;
- printerTemplate.fgColor = 1;
- printerTemplate.bgColor = 2;
- printerTemplate.shadowColor = 3;
+ printerTemplate.fgColor = TEXT_COLOR_WHITE;
+ printerTemplate.bgColor = TEXT_COLOR_DARK_GREY;
+ printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GREY;
break;
- case 5:
+ case UR_COLOR_GRN_DN6_LTB:
printerTemplate.letterSpacing = 0;
printerTemplate.lineSpacing = 0;
- printerTemplate.fgColor = 7;
- printerTemplate.bgColor = 15;
- printerTemplate.shadowColor = 9;
+ printerTemplate.fgColor = TEXT_COLOR_LIGHT_GREEN;
+ printerTemplate.bgColor = TEXT_DYNAMIC_COLOR_6;
+ printerTemplate.shadowColor = TEXT_COLOR_LIGHT_BLUE;
break;
- case 6:
+ case UR_COLOR_DN5_DN6_LTB:
printerTemplate.letterSpacing = 0;
printerTemplate.lineSpacing = 0;
- printerTemplate.fgColor = 14;
- printerTemplate.bgColor = 15;
- printerTemplate.shadowColor = 9;
+ printerTemplate.fgColor = TEXT_DYNAMIC_COLOR_5;
+ printerTemplate.bgColor = TEXT_DYNAMIC_COLOR_6;
+ printerTemplate.shadowColor = TEXT_COLOR_LIGHT_BLUE;
break;
}
AddTextPrinter(&printerTemplate, 0xFF, NULL);
}
-static void sub_811A5E4(struct UnkStruct_x20 * arg0, u8 count)
+static void BlankUnkStruct_x20Array(struct UnkStruct_x20 * x20arr, u8 count)
{
s32 i;
for (i = 0; i < count; i++)
{
- arg0[i].unk = gUnknown_8457034;
- arg0[i].field_18 = 0xFF;
- arg0[i].field_1A_0 = 0;
- arg0[i].field_1A_1 = 0;
- arg0[i].field_1B = 0;
+ x20arr[i].gname_uname = sUnionGnameUnamePair_Dummy;
+ x20arr[i].field_18 = 0xFF;
+ x20arr[i].groupScheduledAnim = UNION_ROOM_SPAWN_NONE;
+ x20arr[i].field_1A_1 = FALSE;
+ x20arr[i].field_1B = 0;
}
}
-static void sub_811A650(struct UnkStruct_x1C * arg0, u8 count)
+static void BlankUnkStruct_x1CArray(struct UnkStruct_x1C * x1Carr, u8 count)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- arg0[i].unk0 = gUnknown_8457034;
- arg0[i].unk18 = 0;
+ x1Carr[i].gname_uname = sUnionGnameUnamePair_Dummy;
+ x1Carr[i].active = FALSE;
}
}
-static bool8 sub_811A694(struct UnkStruct_Shared * arg0, const struct UnkStruct_Shared * arg1)
+static bool8 AreGnameUnameDifferent(struct UnionGnameUnamePair * left, const struct UnionGnameUnamePair * right)
{
s32 i;
for (i = 0; i < 2; i++)
{
- if (arg0->gname.unk_00.playerTrainerId[i] != arg1->gname.unk_00.playerTrainerId[i])
+ if (left->gname.unk_00.playerTrainerId[i] != right->gname.unk_00.playerTrainerId[i])
{
return TRUE;
}
}
- for (i = 0; i < 8; i++)
+ for (i = 0; i < RFU_USER_NAME_LENGTH; i++)
{
- if (arg0->playerName[i] != arg1->playerName[i])
+ if (left->uname[i] != right->uname[i])
{
return TRUE;
}
@@ -3956,34 +4093,34 @@ static bool8 sub_811A694(struct UnkStruct_Shared * arg0, const struct UnkStruct_
return FALSE;
}
-static bool32 sub_811A6DC(struct UnkStruct_Shared * arg0, struct UnkStruct_Shared * arg1)
+static bool32 AreUnionRoomPlayerGnamesDifferent(struct UnionGnameUnamePair * left, struct UnionGnameUnamePair * right)
{
s32 i;
- if (arg0->gname.unk_0a_0 != arg1->gname.unk_0a_0)
+ if (left->gname.activity != right->gname.activity)
{
return TRUE;
}
- if (arg0->gname.unk_0a_7 != arg1->gname.unk_0a_7)
+ if (left->gname.started != right->gname.started)
{
return TRUE;
}
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (arg0->gname.unk_04[i] != arg1->gname.unk_04[i])
+ if (left->gname.child_sprite_gender[i] != right->gname.child_sprite_gender[i])
{
return TRUE;
}
}
- if (arg0->gname.species != arg1->gname.species)
+ if (left->gname.species != right->gname.species)
{
return TRUE;
}
- if (arg0->gname.type != arg1->gname.type)
+ if (left->gname.type != right->gname.type)
{
return TRUE;
}
@@ -3991,38 +4128,38 @@ static bool32 sub_811A6DC(struct UnkStruct_Shared * arg0, struct UnkStruct_Share
return FALSE;
}
-static u32 sub_811A748(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1)
+static u32 Findx20Inx1CArray(struct UnkStruct_x20 * x20, struct UnkStruct_x1C * x1Carr)
{
u8 result = 0xFF;
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (arg1[i].unk18 && !sub_811A694(&arg0->unk, &arg1[i].unk0))
+ if (x1Carr[i].active && !AreGnameUnameDifferent(&x20->gname_uname, &x1Carr[i].gname_uname))
{
result = i;
- arg1[i].unk18 = FALSE;
+ x1Carr[i].active = FALSE;
}
}
return result;
}
-static u8 sub_811A798(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1, u8 arg2)
+static u8 Appendx1Ctox20(struct UnkStruct_x20 * x20arr, struct UnkStruct_x1C * x1C, u8 count)
{
s32 i;
- if (arg1->unk18)
+ if (x1C->active)
{
- for (i = 0; i < arg2; i++)
+ for (i = 0; i < count; i++)
{
- if (arg0[i].field_1A_0 == 0)
+ if (x20arr[i].groupScheduledAnim == UNION_ROOM_SPAWN_NONE)
{
- arg0[i].unk = arg1->unk0;
- arg0[i].field_18 = 0;
- arg0[i].field_1A_0 = 1;
- arg0[i].field_1B = 64;
- arg1->unk18 = FALSE;
+ x20arr[i].gname_uname = x1C->gname_uname;
+ x20arr[i].field_18 = 0;
+ x20arr[i].groupScheduledAnim = UNION_ROOM_SPAWN_IN;
+ x20arr[i].field_1B = 0x40;
+ x1C->active = FALSE;
return i;
}
}
@@ -4031,47 +4168,47 @@ static u8 sub_811A798(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1,
return 0xFF;
}
-static void sub_811A81C(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 * arg3, u8 arg4, u8 id)
+static void PrintUnionRoomGroupOnWindow(u8 windowId, u8 x, u8 y, struct UnkStruct_x20 * group, u8 colorIdx, u8 id)
{
- u8 r2;
- u8 sp0[6];
- u8 sp10[30];
+ u8 activity;
+ u8 id_str[6];
+ u8 uname[30];
ConvertIntToDecimalStringN(gStringVar4, id + 1, STR_CONV_MODE_LEADING_ZEROS, 2);
StringAppend(gStringVar4, gUnknown_84571B0);
- sub_811A444(arg0, 0, gStringVar4, arg1, arg2, 0);
- arg1 += 18;
- r2 = arg3->unk.gname.unk_0a_0;
- if (arg3->field_1A_0 == 1 && !(r2 & 0x40))
+ UR_AddTextPrinterParameterized(windowId, 0, gStringVar4, x, y, UR_COLOR_DKE_WHT_LTE);
+ x += 18;
+ activity = group->gname_uname.gname.activity;
+ if (group->groupScheduledAnim == UNION_ROOM_SPAWN_IN && !(activity & IN_UNION_ROOM))
{
- IntlConvPartnerUname(sp10, *arg3);
- sub_811A444(arg0, 2, sp10, arg1, arg2, arg4);
- ConvertIntToDecimalStringN(sp0, arg3->unk.gname.unk_00.playerTrainerId[0] | (arg3->unk.gname.unk_00.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5);
+ IntlConvPartnerUname(uname, *group);
+ UR_AddTextPrinterParameterized(windowId, 2, uname, x, y, colorIdx);
+ ConvertIntToDecimalStringN(id_str, group->gname_uname.gname.unk_00.playerTrainerId[0] | (group->gname_uname.gname.unk_00.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5);
StringCopy(gStringVar4, gUnknown_84571B4);
- StringAppend(gStringVar4, sp0);
- arg1 += 77;
- sub_811A444(arg0, 0, gStringVar4, arg1, arg2, arg4);
+ StringAppend(gStringVar4, id_str);
+ x += 77;
+ UR_AddTextPrinterParameterized(windowId, 0, gStringVar4, x, y, colorIdx);
}
}
-static void sub_811A910(u8 windowId, u8 x, u8 y, struct UnkStruct_x20 * arg3, u8 arg4, u8 id)
+static void PrintGroupMemberCandidateOnWindowWithColor(u8 windowId, u8 x, u8 y, struct UnkStruct_x20 * group, u8 colorIdx, u8 id)
{
- u8 sp0[6];
- u8 sp10[30];
+ u8 id_str[6];
+ u8 uname[30];
- if (arg3->field_1A_0 == 1)
+ if (group->groupScheduledAnim == UNION_ROOM_SPAWN_IN)
{
- IntlConvPartnerUname(sp10, *arg3);
- sub_811A444(windowId, 2, sp10, x, y, arg4);
- ConvertIntToDecimalStringN(sp0, arg3->unk.gname.unk_00.playerTrainerId[0] | (arg3->unk.gname.unk_00.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5);
+ IntlConvPartnerUname(uname, *group);
+ UR_AddTextPrinterParameterized(windowId, 2, uname, x, y, colorIdx);
+ ConvertIntToDecimalStringN(id_str, group->gname_uname.gname.unk_00.playerTrainerId[0] | (group->gname_uname.gname.unk_00.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5);
StringCopy(gStringVar4, gUnknown_84571B4);
- StringAppend(gStringVar4, sp0);
+ StringAppend(gStringVar4, id_str);
x += 71;
- sub_811A444(windowId, 0, gStringVar4, x, y, arg4);
+ UR_AddTextPrinterParameterized(windowId, 0, gStringVar4, x, y, colorIdx);
}
}
-static bool32 sub_811A9B8(void)
+static bool32 PlayerIsTalkingToUnionRoomAide(void)
{
s16 x, y;
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
@@ -4091,72 +4228,77 @@ static bool32 sub_811A9B8(void)
return FALSE;
}
-static u32 sub_811A9FC(s32 arg0)
+static u32 GetResponseIdx_InviteToURoomActivity(s32 activity)
{
- switch (arg0)
+ switch (activity)
{
- case 5:
+ case ACTIVITY_CHAT:
return 1;
- case 4:
+ case ACTIVITY_TRADE:
return 2;
- case 8:
+ case ACTIVITY_CARD:
return 3;
- case 3:
+ case ACTIVITY_MLTBATTLE:
default:
return 0;
}
}
-static u32 sub_811AA24(struct UnkStruct_x20 * arg0)
+static u32 ConvPartnerUnameAndGetWhetherMetAlready(struct UnkStruct_x20 * x20)
{
u8 sp0[30];
- IntlConvPartnerUname(sp0, *arg0);
- return PlayerHasMetTrainerBefore(ReadAsU16(arg0->unk.gname.unk_00.playerTrainerId), sp0);
+ IntlConvPartnerUname(sp0, *x20);
+ return PlayerHasMetTrainerBefore(ReadAsU16(x20->gname_uname.gname.unk_00.playerTrainerId), sp0);
}
-static s32 sub_811AA5C(struct UnkStruct_Main0 * arg0, u8 arg1, u8 arg2, u32 playerGender)
+static s32 UnionRoomGetPlayerInteractionResponse(struct UnkStruct_Main0 * main0, u8 overrideGender, u8 playerIdx, u32 playerGender)
{
- bool32 r2;
+ bool32 metBefore;
- struct UnkStruct_x20 * r5 = &arg0->arr[arg2];
+ struct UnkStruct_x20 * x20 = &main0->arr[playerIdx];
- if (!r5->unk.gname.unk_0a_7 && arg1 == 0)
+ if (!x20->gname_uname.gname.started && overrideGender == 0)
{
- IntlConvPartnerUname(gStringVar1, *r5);
- r2 = PlayerHasMetTrainerBefore(ReadAsU16(r5->unk.gname.unk_00.playerTrainerId), gStringVar1);
- if (r5->unk.gname.unk_0a_0 == 0x45)
+ IntlConvPartnerUname(gStringVar1, *x20);
+ metBefore = PlayerHasMetTrainerBefore(ReadAsU16(x20->gname_uname.gname.unk_00.playerTrainerId), gStringVar1);
+ if (x20->gname_uname.gname.activity == (ACTIVITY_CHAT | IN_UNION_ROOM))
{
- StringExpandPlaceholders(gStringVar4, gUnknown_8457F80[r2][playerGender]);
+ StringExpandPlaceholders(gStringVar4, gUnknown_8457F80[metBefore][playerGender]);
return 2;
}
else
{
- sub_811A0B4(gUnknown_8457A34[r2]);
+ UR_PrintFieldMessage(gURText_PleaseWaitMsgs[metBefore]);
return 1;
}
}
else
{
- IntlConvPartnerUname(gStringVar1, *r5);
- if (arg1 != 0)
+ IntlConvPartnerUname(gStringVar1, *x20);
+ if (overrideGender != 0)
{
- playerGender = (r5->unk.gname.unk_00.playerTrainerId[arg1 + 1] >> 3) & 1;
+ playerGender = (x20->gname_uname.gname.unk_00.playerTrainerId[overrideGender + 1] >> 3) & 1;
}
- switch (r5->unk.gname.unk_0a_0 & 0x3F)
+ switch (x20->gname_uname.gname.activity & 0x3F)
{
- case 1:
+ case ACTIVITY_BATTLE:
+ // Battling
StringExpandPlaceholders(gStringVar4, gUnknown_8458758[playerGender][Random() % 4]);
break;
- case 4:
+ case ACTIVITY_TRADE:
+ // Trading
StringExpandPlaceholders(gStringVar4, gUnknown_8458A78[playerGender][Random() % 2]);
break;
- case 5:
+ case ACTIVITY_CHAT:
+ // Chatting
StringExpandPlaceholders(gStringVar4, gUnknown_84588BC[playerGender][Random() % 4]);
break;
- case 8:
+ case ACTIVITY_CARD:
+ // Sharing cards
StringExpandPlaceholders(gStringVar4, gUnknown_84589AC[playerGender][Random() % 2]);
break;
default:
+ // Unknown
StringExpandPlaceholders(gStringVar4, gUnknown_8457F90);
break;
}
@@ -4169,73 +4311,73 @@ static void nullsub_92(u8 windowId, s32 itemId, u8 y)
}
-static void sub_811ABE4(u8 windowId, u8 y, struct GFtgtGname * gname, const u8 * uname, u8 colorIdx)
+static void TradeBoardPrintItemInfo(u8 windowId, u8 y, struct GFtgtGname * gname, const u8 * uname, u8 colorIdx)
{
u8 level_t[4];
u16 species = gname->species;
u8 type = gname->type;
u8 level = gname->level;
- sub_811A444(windowId, 2, uname, 8, y, colorIdx);
+ UR_AddTextPrinterParameterized(windowId, 2, uname, 8, y, colorIdx);
if (species == SPECIES_EGG)
{
- sub_811A444(windowId, 2, gUnknown_8458FBC, 0x44, y, colorIdx);
+ UR_AddTextPrinterParameterized(windowId, 2, gText_EggTrade, 0x44, y, colorIdx);
}
else
{
BlitMoveInfoIcon(windowId, type + 1, 0x44, y);
- sub_811A444(windowId, 2, gSpeciesNames[species], 0x76, y, colorIdx);
+ UR_AddTextPrinterParameterized(windowId, 2, gSpeciesNames[species], 0x76, y, colorIdx);
ConvertIntToDecimalStringN(level_t, level, STR_CONV_MODE_LEFT_ALIGN, 3);
- sub_811A444(windowId, 2, level_t, GetStringRightAlignXOffset(2, level_t, 218), y, colorIdx);
+ UR_AddTextPrinterParameterized(windowId, 2, level_t, GetStringRightAlignXOffset(2, level_t, 218), y, colorIdx);
}
}
-static void sub_811ACA4(u8 windowId, s32 itemId, u8 y)
+static void TradeBoardListMenuItemPrintFunc(u8 windowId, s32 itemId, u8 y)
{
struct UnkStruct_Leader * leader = sUnionRoomMain.leader;
struct GFtgtGname * rfu;
s32 i, j;
- u8 uname[8];
+ u8 uname[RFU_USER_NAME_LENGTH];
- if (itemId == -3 && y == gUnknown_8456F7C.upText_Y)
+ if (itemId == -3 && y == sTradeBoardListMenuTemplate.upText_Y)
{
- rfu = sub_80F9800();
+ rfu = GetHostRFUtgtGname();
if (rfu->species != SPECIES_NONE)
{
- sub_811ABE4(windowId, y, rfu, gSaveBlock2Ptr->playerName, 5);
+ TradeBoardPrintItemInfo(windowId, y, rfu, gSaveBlock2Ptr->playerName, 5);
}
}
else
{
j = 0;
- for (i = 0; i < 8; i++)
+ for (i = 0; i < UROOM_MAX_GROUP_COUNT; i++)
{
- if (leader->field_0->arr[i].field_1A_0 == 1 && leader->field_0->arr[i].unk.gname.species != SPECIES_NONE)
+ if (leader->field_0->arr[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN && leader->field_0->arr[i].gname_uname.gname.species != SPECIES_NONE)
{
j++;
}
if (j == itemId + 1)
{
IntlConvPartnerUname(uname, leader->field_0->arr[i]);
- sub_811ABE4(windowId, y, &leader->field_0->arr[i].unk.gname, uname, 6);
+ TradeBoardPrintItemInfo(windowId, y, &leader->field_0->arr[i].gname_uname.gname, uname, 6);
break;
}
}
}
}
-static s32 sub_811AD7C(struct UnkStruct_x20 * arg, s32 arg1)
+static s32 GetIndexOfNthTradeBoardOffer(struct UnkStruct_x20 * x20, s32 n)
{
s32 i;
s32 j = 0;
- for (i = 0; i < 8; i++)
+ for (i = 0; i < UROOM_MAX_GROUP_COUNT; i++)
{
- if (arg[i].field_1A_0 == 1 && arg[i].unk.gname.species != SPECIES_NONE)
+ if (x20[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN && x20[i].gname_uname.gname.species != SPECIES_NONE)
{
j++;
}
- if (j == arg1 + 1)
+ if (j == n + 1)
{
return i;
}
@@ -4244,12 +4386,12 @@ static s32 sub_811AD7C(struct UnkStruct_x20 * arg, s32 arg1)
return -1;
}
-static s32 GetUnionRoomPlayerGender(s32 arg1, struct UnkStruct_Main0 * arg0)
+static s32 GetUnionRoomPlayerGender(s32 playerIdx, struct UnkStruct_Main0 * main0)
{
- return arg0->arr[arg1].unk.gname.playerGender;
+ return main0->arr[playerIdx].gname_uname.gname.playerGender;
}
-static s32 sub_811ADD0(u32 type, u32 species)
+static s32 IsRequestedTypeAndSpeciesInPlayerParty(u32 type, u32 species)
{
s32 i;
@@ -4260,10 +4402,10 @@ static s32 sub_811ADD0(u32 type, u32 species)
species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
if (species == SPECIES_EGG)
{
- return 0;
+ return UR_TRADE_MATCH;
}
}
- return 2;
+ return UR_TRADE_NOEGG;
}
else
{
@@ -4272,77 +4414,77 @@ static s32 sub_811ADD0(u32 type, u32 species)
species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
if (gBaseStats[species].type1 == type || gBaseStats[species].type2 == type)
{
- return 0;
+ return UR_TRADE_MATCH;
}
}
- return 1;
+ return UR_TRADE_NOTYPE;
}
}
-static void sub_811AE68(u8 *dst, s32 arg1, u32 playerGender)
+static void GetURoomActivityRejectMsg(u8 *dst, s32 activity, u32 playerGender)
{
- switch (arg1)
+ switch (activity)
{
- case 0x41:
+ case ACTIVITY_BATTLE | IN_UNION_ROOM:
StringExpandPlaceholders(dst, gUnknown_8458314[playerGender]);
break;
- case 0x45:
+ case ACTIVITY_CHAT | IN_UNION_ROOM:
StringExpandPlaceholders(dst, gUnknown_84585E8[playerGender]);
break;
- case 0x44:
+ case ACTIVITY_TRADE | IN_UNION_ROOM:
StringExpandPlaceholders(dst, gUnknown_8458F9C);
break;
- case 0x48:
+ case ACTIVITY_CARD | IN_UNION_ROOM:
StringExpandPlaceholders(dst, gUnknown_84583B4[playerGender]);
break;
}
}
-static void sub_811AECC(u8 *dst, u8 arg1)
+static void GetURoomActivityStartMsg(u8 *dst, u8 activity)
{
u8 mpId = GetMultiplayerId();
u8 gender = gLinkPlayers[mpId ^ 1].gender;
- switch (arg1)
+ switch (activity)
{
- case 0x41:
+ case ACTIVITY_BATTLE | IN_UNION_ROOM:
StringCopy(dst, gUnknown_8458230[mpId][gender][0]);
break;
- case 0x44:
+ case ACTIVITY_TRADE | IN_UNION_ROOM:
StringCopy(dst, gUnknown_8458230[mpId][gender][2]);
break;
- case 0x45:
+ case ACTIVITY_CHAT | IN_UNION_ROOM:
StringCopy(dst, gUnknown_8458230[mpId][gender][1]);
break;
}
}
-static s32 sub_811AF6C(u8 *dst, u32 gender, u16 *arg2, struct UnkStruct_URoom * arg3)
+static s32 GetChatLeaderActionRequestMessage(u8 *dst, u32 gender, u16 *activity_p, struct UnkStruct_URoom * arg3)
{
s32 result = 0;
u16 species = SPECIES_NONE;
s32 i;
- switch (arg2[0])
+ switch (activity_p[0])
{
- case 0x41:
+ case ACTIVITY_BATTLE | IN_UNION_ROOM:
StringExpandPlaceholders(dst, gUnknown_8457CA4);
result = 1;
break;
- case 0x45:
+ case ACTIVITY_CHAT | IN_UNION_ROOM:
StringExpandPlaceholders(dst, gUnknown_8457CF8);
result = 1;
break;
- case 0x44:
- ConvertIntToDecimalStringN(arg3->field_58[0], sUnionRoomTrade.playerLevel, STR_CONV_MODE_LEFT_ALIGN, 3);
- StringCopy(arg3->field_58[1], gSpeciesNames[sUnionRoomTrade.playerSpecies]);
- for (i = 0; i < 4; i++)
+ case ACTIVITY_TRADE | IN_UNION_ROOM:
+ ConvertIntToDecimalStringN(arg3->activityRequestStrbufs[0], sUnionRoomTrade.playerLevel, STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringCopy(arg3->activityRequestStrbufs[1], gSpeciesNames[sUnionRoomTrade.playerSpecies]);
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (gRfuLinkStatus->partner[i].serialNo == 2)
+ if (gRfuLinkStatus->partner[i].serialNo == 0x0002)
{
- ConvertIntToDecimalStringN(arg3->field_58[2], arg2[2], STR_CONV_MODE_LEFT_ALIGN, 3);
- StringCopy(arg3->field_58[3], gSpeciesNames[arg2[1]]);
- species = arg2[1];
+ ConvertIntToDecimalStringN(arg3->activityRequestStrbufs[2], activity_p[2], STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringCopy(arg3->activityRequestStrbufs[3], gSpeciesNames[activity_p[1]]);
+ species = activity_p[1];
break;
}
}
@@ -4352,19 +4494,20 @@ static s32 sub_811AF6C(u8 *dst, u32 gender, u16 *arg2, struct UnkStruct_URoom *
}
else
{
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(i, arg3->field_58[i]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(i, arg3->activityRequestStrbufs[i]);
}
DynamicPlaceholderTextUtil_ExpandPlaceholders(dst, gUnknown_8457D44);
}
result = 1;
break;
- case 0x48:
+ case ACTIVITY_CARD | IN_UNION_ROOM:
StringExpandPlaceholders(dst, gUnknown_8457C48);
result = 1;
break;
- case 0x40:
+ case IN_UNION_ROOM:
+ // Chat dropped
StringExpandPlaceholders(dst, gUnknown_8457E0C);
result = 2;
break;
@@ -4373,18 +4516,18 @@ static s32 sub_811AF6C(u8 *dst, u32 gender, u16 *arg2, struct UnkStruct_URoom *
return result;
}
-static bool32 sub_811B0A4(struct UnkStruct_URoom * arg0)
+static bool32 PollPartnerYesNoResponse(struct UnkStruct_URoom * uroom)
{
if (gRecvCmds[0][1] != 0)
{
- if (gRecvCmds[0][1] == 0x51)
+ if (gRecvCmds[0][1] == (ACTIVITY_ACCEPT | IN_UNION_ROOM))
{
- arg0->field_98 = 0x51;
+ uroom->partnerYesNoResponse = ACTIVITY_ACCEPT | IN_UNION_ROOM;
return TRUE;
}
- else if (gRecvCmds[0][1] == 0x52)
+ else if (gRecvCmds[0][1] == (ACTIVITY_DECLINE | IN_UNION_ROOM))
{
- arg0->field_98 = 0x52;
+ uroom->partnerYesNoResponse = ACTIVITY_DECLINE | IN_UNION_ROOM;
return TRUE;
}
}
@@ -4418,16 +4561,16 @@ static bool32 HasAtLeastTwoMonsOfLevel30OrLower(void)
return FALSE;
}
-static void ResetUnionRoomTrade(struct UnionRoomTrade * arg0)
+static void ResetUnionRoomTrade(struct UnionRoomTrade * uroomTrade)
{
- arg0->field_0 = 0;
- arg0->type = 0;
- arg0->playerPersonality = 0;
- arg0->playerSpecies = 0;
- arg0->playerLevel = 0;
- arg0->species = 0;
- arg0->level = 0;
- arg0->personality = 0;
+ uroomTrade->field_0 = 0;
+ uroomTrade->type = 0;
+ uroomTrade->playerPersonality = 0;
+ uroomTrade->playerSpecies = 0;
+ uroomTrade->playerLevel = 0;
+ uroomTrade->species = 0;
+ uroomTrade->level = 0;
+ uroomTrade->personality = 0;
}
void Script_ResetUnionRoomTrade(void)
@@ -4494,26 +4637,26 @@ static u32 GetPartyPositionOfRegisteredMon(struct UnionRoomTrade * trade, u8 mul
return response;
}
-static void sub_811B258(bool32 arg0)
+static void HandleCancelTrade(bool32 unlockObjs)
{
- sub_811A3F8();
+ UR_BlankBg0();
ScriptContext2_Disable();
- sub_80696F0();
- gUnknown_203B058 = 0;
- if (arg0)
+ UnionRoom_UnlockPlayerAndChatPartner();
+ sPlayerCurrActivity = 0;
+ if (unlockObjs)
{
- sub_80FAFA0(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);
- sub_80FB008(0x40, 0, 0);
+ RfuUpdatePlayerGnameStateAndSend(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);
+ UpdateGameDataWithActivitySpriteGendersFlag(IN_UNION_ROOM, 0, FALSE);
}
}
-static void sub_811B298(void)
+static void UR_EnableScriptContext2AndFreezeObjectEvents(void)
{
ScriptContext2_Enable();
ScriptFreezeObjectEvents();
}
-static u8 sub_811B2A8(s32 linkPlayer)
+static u8 GetSinglePartnerSpriteGenderParam(s32 linkPlayer)
{
u8 retval = 0x80;
retval |= gLinkPlayers[linkPlayer].gender << 3;
@@ -4521,17 +4664,17 @@ static u8 sub_811B2A8(s32 linkPlayer)
return retval;
}
-static u8 sub_811B2D8(struct UnkStruct_URoom * arg0)
+static u8 GetActivePartnerSpriteGenderParam(struct UnkStruct_URoom * uroom)
{
u8 retVal = 0x80;
u8 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (arg0->field_C->arr[i].unk18)
+ if (uroom->field_C->arr[i].active)
{
- retVal |= arg0->field_C->arr[i].unk0.gname.playerGender << 3;
- retVal |= arg0->field_C->arr[i].unk0.gname.unk_00.playerTrainerId[0] & 7;
+ retVal |= uroom->field_C->arr[i].gname_uname.gname.playerGender << 3;
+ retVal |= uroom->field_C->arr[i].gname_uname.gname.unk_00.playerTrainerId[0] & 7;
break;
}
}
@@ -4539,7 +4682,7 @@ static u8 sub_811B2D8(struct UnkStruct_URoom * arg0)
return retVal;
}
-static void sub_811B31C(u8 *unused, struct UnkStruct_URoom * arg1, bool8 arg2)
+static void ViewURoomPartnerTrainerCard(u8 *unused, struct UnkStruct_URoom * uroom, bool8 parent_child)
{
struct TrainerCard * trainerCard = &gTrainerCards[GetMultiplayerId() ^ 1];
s32 i;
@@ -4547,61 +4690,61 @@ static void sub_811B31C(u8 *unused, struct UnkStruct_URoom * arg1, bool8 arg2)
DynamicPlaceholderTextUtil_Reset();
- StringCopy(arg1->trainerCardStrbufs[0], gTrainerClassNames[sub_80447F0()]);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, arg1->trainerCardStrbufs[0]);
+ StringCopy(uroom->trainerCardStrbufs[0], gTrainerClassNames[sub_80447F0()]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, uroom->trainerCardStrbufs[0]);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, trainerCard->playerName);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, trainerCard->rse.playerName);
- StringCopy(arg1->field_174, gUnknown_84594B0[trainerCard->stars]);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, arg1->field_174);
+ StringCopy(uroom->field_174, gUnknown_84594B0[trainerCard->rse.stars]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, uroom->field_174);
- ConvertIntToDecimalStringN(arg1->trainerCardStrbufs[2], trainerCard->caughtMonsCount, STR_CONV_MODE_LEFT_ALIGN, 3);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, arg1->trainerCardStrbufs[2]);
+ ConvertIntToDecimalStringN(uroom->trainerCardStrbufs[2], trainerCard->rse.caughtMonsCount, STR_CONV_MODE_LEFT_ALIGN, 3);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, uroom->trainerCardStrbufs[2]);
- ConvertIntToDecimalStringN(arg1->trainerCardStrbufs[3], trainerCard->playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3);
- ConvertIntToDecimalStringN(arg1->trainerCardStrbufs[4], trainerCard->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, arg1->trainerCardStrbufs[3]);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, arg1->trainerCardStrbufs[4]);
+ ConvertIntToDecimalStringN(uroom->trainerCardStrbufs[3], trainerCard->rse.playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3);
+ ConvertIntToDecimalStringN(uroom->trainerCardStrbufs[4], trainerCard->rse.playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, uroom->trainerCardStrbufs[3]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, uroom->trainerCardStrbufs[4]);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, gUnknown_84594C4);
- StringCopy(gStringVar4, arg1->field_1A4);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(uroom->field_1A4, gUnknown_84594C4);
+ StringCopy(gStringVar4, uroom->field_1A4);
- n = trainerCard->linkBattleWins;
+ n = trainerCard->rse.linkBattleWins;
if (n > 9999)
{
n = 9999;
}
- ConvertIntToDecimalStringN(arg1->trainerCardStrbufs[0], n, STR_CONV_MODE_LEFT_ALIGN, 4);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, arg1->trainerCardStrbufs[0]);
+ ConvertIntToDecimalStringN(uroom->trainerCardStrbufs[0], n, STR_CONV_MODE_LEFT_ALIGN, 4);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, uroom->trainerCardStrbufs[0]);
- n = trainerCard->linkBattleLosses;
+ n = trainerCard->rse.linkBattleLosses;
if (n > 9999)
{
n = 9999;
}
- ConvertIntToDecimalStringN(arg1->trainerCardStrbufs[1], n, STR_CONV_MODE_LEFT_ALIGN, 4);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, arg1->trainerCardStrbufs[1]);
+ ConvertIntToDecimalStringN(uroom->trainerCardStrbufs[1], n, STR_CONV_MODE_LEFT_ALIGN, 4);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, uroom->trainerCardStrbufs[1]);
- ConvertIntToDecimalStringN(arg1->trainerCardStrbufs[2], trainerCard->pokemonTrades, STR_CONV_MODE_LEFT_ALIGN, 5);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, arg1->trainerCardStrbufs[2]);
+ ConvertIntToDecimalStringN(uroom->trainerCardStrbufs[2], trainerCard->rse.pokemonTrades, STR_CONV_MODE_LEFT_ALIGN, 5);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, uroom->trainerCardStrbufs[2]);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < TRAINER_CARD_PROFILE_LENGTH; i++)
{
- CopyEasyChatWord(arg1->trainerCardStrbufs[i + 3], trainerCard->var_28[i]);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(i + 4, arg1->trainerCardStrbufs[i + 3]);
+ CopyEasyChatWord(uroom->trainerCardStrbufs[i + 3], trainerCard->rse.easyChatProfile[i]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(i + 4, uroom->trainerCardStrbufs[i + 3]);
}
- DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, gUnknown_8459504);
- StringAppend(gStringVar4, arg1->field_1A4);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(uroom->field_1A4, gUnknown_8459504);
+ StringAppend(gStringVar4, uroom->field_1A4);
- if (arg2 == TRUE)
+ if (parent_child == MODE_PARENT)
{
- DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, gUnknown_8459588);
- StringAppend(gStringVar4, arg1->field_1A4);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(uroom->field_1A4, gUnknown_8459588);
+ StringAppend(gStringVar4, uroom->field_1A4);
}
- else if (arg2 == FALSE)
+ else if (parent_child == MODE_CHILD)
{
- DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, gUnknown_8459580[trainerCard->gender]);
- StringAppend(gStringVar4, arg1->field_1A4);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(uroom->field_1A4, gUnknown_8459580[trainerCard->rse.gender]);
+ StringAppend(gStringVar4, uroom->field_1A4);
}
}
diff --git a/src/union_room_battle.c b/src/union_room_battle.c
index b75cc086d..b4d8af9ce 100644
--- a/src/union_room_battle.c
+++ b/src/union_room_battle.c
@@ -13,15 +13,16 @@
#include "text_window.h"
#include "union_room.h"
#include "window.h"
+#include "constants/union_room.h"
-struct UnkStruct_203B08C
+struct UnionRoomBattleWork
{
- s16 a0;
+ s16 textState;
};
-static EWRAM_DATA struct UnkStruct_203B08C * gUnknown_203B08C = NULL;
+static EWRAM_DATA struct UnionRoomBattleWork * sWork = NULL;
-static const struct BgTemplate gUnknown_8457194[] = {
+static const struct BgTemplate sBgTemplates[] = {
{
.bg = 0,
.charBaseIndex = 3,
@@ -29,7 +30,7 @@ static const struct BgTemplate gUnknown_8457194[] = {
}
};
-static const struct WindowTemplate gUnknown_8457198[] = {
+static const struct WindowTemplate sWindowTemplates[] = {
{
.bg = 0,
.tilemapLeft = 2,
@@ -43,10 +44,10 @@ static const struct WindowTemplate gUnknown_8457198[] = {
static const u8 gUnknown_84571A8[] = {1, 2, 3};
-static void sub_811C04C(void)
+static void SetUpPartiesAndStartBattle(void)
{
s32 i;
- sub_81173C0(BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER);
+ StartUnionRoomBattle(BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER);
for (i = 0; i < 2; i++)
{
gEnemyParty[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1];
@@ -65,7 +66,7 @@ static void sub_811C04C(void)
SetMainCallback2(CB2_InitBattle);
}
-static void sub_811C0E0(u8 windowId, const u8 * str, u8 x, u8 y, s32 speed)
+static void UnionRoomBattle_CreateTextPrinter(u8 windowId, const u8 * str, u8 x, u8 y, s32 speed)
{
s32 letterSpacing = 1;
s32 lineSpacing = 1;
@@ -73,13 +74,13 @@ static void sub_811C0E0(u8 windowId, const u8 * str, u8 x, u8 y, s32 speed)
AddTextPrinterParameterized4(windowId, 3, x, y, letterSpacing, lineSpacing, gUnknown_84571A8, speed, str);
}
-static bool32 sub_811C150(s16 * state, const u8 * str, s32 speed)
+static bool32 UnionRoomBattle_PrintTextOnWindow0(s16 * state, const u8 * str, s32 speed)
{
switch (*state)
{
case 0:
DrawTextBorderOuter(0, 0x001, 0xD);
- sub_811C0E0(0, str, 0, 2, speed);
+ UnionRoomBattle_CreateTextPrinter(0, str, 0, 2, speed);
PutWindowTilemap(0);
CopyWindowToVram(0, 3);
(*state)++;
@@ -95,27 +96,27 @@ static bool32 sub_811C150(s16 * state, const u8 * str, s32 speed)
return FALSE;
}
-static void sub_811C1B4(void)
+static void VBlankCB_UnionRoomBattle(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
-void sub_811C1C8(void)
+void CB2_UnionRoomBattle(void)
{
switch (gMain.state)
{
case 0:
SetGpuReg(REG_OFFSET_DISPCNT, 0x0000);
- gUnknown_203B08C = AllocZeroed(sizeof(struct UnkStruct_203B08C));
+ sWork = AllocZeroed(sizeof(struct UnionRoomBattleWork));
ResetSpriteData();
FreeAllSpritePalettes();
ResetTasks();
ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, gUnknown_8457194, 1);
+ InitBgsFromTemplates(0, sBgTemplates, 1);
ResetTempTileDataBuffers();
- if (!InitWindows(gUnknown_8457198))
+ if (!InitWindows(sWindowTemplates))
{
return;
}
@@ -126,11 +127,11 @@ void sub_811C1C8(void)
FillBgTilemapBufferRect(0, 0, 0, 0, 30, 20, 0xF);
TextWindow_SetStdFrame0_WithPal(0, 1, 0xD0);
Menu_LoadStdPal();
- SetVBlankCallback(sub_811C1B4);
+ SetVBlankCallback(VBlankCB_UnionRoomBattle);
gMain.state++;
break;
case 1:
- if (sub_811C150(&gUnknown_203B08C->a0, gText_CommStandbyAwaitingOtherPlayer, 0))
+ if (UnionRoomBattle_PrintTextOnWindow0(&sWork->textState, gText_CommStandbyAwaitingOtherPlayer, 0))
{
gMain.state++;
}
@@ -146,11 +147,11 @@ void sub_811C1C8(void)
memset(gBlockSendBuffer, 0, 0x20);
if (gSelectedOrderFromParty[0] == -gSelectedOrderFromParty[1])
{
- gBlockSendBuffer[0] = 0x52;
+ gBlockSendBuffer[0] = ACTIVITY_DECLINE | 0x40;
}
else
{
- gBlockSendBuffer[0] = 0x51;
+ gBlockSendBuffer[0] = ACTIVITY_ACCEPT | 0x40;
}
SendBlock(0, gBlockSendBuffer, 0x20);
gMain.state++;
@@ -159,15 +160,15 @@ void sub_811C1C8(void)
case 4:
if (GetBlockReceivedStatus() == 3)
{
- if (gBlockRecvBuffer[0][0] == 0x51 && gBlockRecvBuffer[1][0] == 0x51)
+ if (gBlockRecvBuffer[0][0] == (ACTIVITY_ACCEPT | 0x40) && gBlockRecvBuffer[1][0] == (ACTIVITY_ACCEPT | 0x40))
{
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
gMain.state = 50;
}
else
{
- sub_800AAC0();
- if (gBlockRecvBuffer[GetMultiplayerId()][0] == 0x52)
+ Link_TryStartSend5FFF();
+ if (gBlockRecvBuffer[GetMultiplayerId()][0] == (ACTIVITY_DECLINE | 0x40))
{
gMain.state = 6;
}
@@ -182,14 +183,14 @@ void sub_811C1C8(void)
case 50:
if (!UpdatePaletteFade())
{
- sub_800AB9C();
+ PrepareSendLinkCmd2FFE_or_RfuCmd6600();
gMain.state++;
}
break;
case 51:
if (IsLinkTaskFinished())
{
- SetMainCallback2(sub_811C04C);
+ SetMainCallback2(SetUpPartiesAndStartBattle);
}
break;
case 6:
@@ -199,7 +200,7 @@ void sub_811C1C8(void)
}
break;
case 7:
- if (sub_811C150(&gUnknown_203B08C->a0, gText_RefusedBattle, 1))
+ if (UnionRoomBattle_PrintTextOnWindow0(&sWork->textState, gText_RefusedBattle, 1))
{
SetMainCallback2(CB2_ReturnToField);
}
@@ -211,7 +212,7 @@ void sub_811C1C8(void)
}
break;
case 9:
- if (sub_811C150(&gUnknown_203B08C->a0, gText_BattleWasRefused, 1))
+ if (UnionRoomBattle_PrintTextOnWindow0(&sWork->textState, gText_BattleWasRefused, 1))
{
SetMainCallback2(CB2_ReturnToField);
}
diff --git a/src/union_room_chat.c b/src/union_room_chat.c
index 15601c028..4ac4c62cb 100644
--- a/src/union_room_chat.c
+++ b/src/union_room_chat.c
@@ -14,7 +14,7 @@
#include "task.h"
#include "union_room_chat.h"
#include "union_room_chat_display.h"
-#include "data_8479668.h"
+#include "keyboard_text.h"
#include "constants/songs.h"
#define MESSAGE_BUFFER_NCHAR 15
@@ -207,7 +207,7 @@ void EnterUnionRoomChat(void)
sWork = Alloc(sizeof(struct UnionRoomChat));
InitChatWork(sWork);
gKeyRepeatStartDelay = 20;
- sub_812B4AC();
+ HelpSystem_DisableToggleWithRButton();
SetVBlankCallback(NULL);
SetMainCallback2(CB2_LoadInterface);
}
@@ -587,7 +587,7 @@ static void ChatEntryRoutine_ExitChat(void)
case 5:
if (IsLinkTaskFinished() && !GetRfuUnkCE8())
{
- sub_800AAC0();
+ Link_TryStartSend5FFF();
sWork->exitDelayTimer = 0;
sWork->routineState++;
}
@@ -622,7 +622,7 @@ static void ChatEntryRoutine_Drop(void)
case 1:
if (!RunDisplaySubtask(0) && IsLinkTaskFinished() && !GetRfuUnkCE8())
{
- sub_800AAC0();
+ Link_TryStartSend5FFF();
sWork->exitDelayTimer = 0;
sWork->routineState++;
}
@@ -668,7 +668,7 @@ static void ChatEntryRoutine_Disbanded(void)
case 2:
if (RunDisplaySubtask(0) != TRUE && IsLinkTaskFinished() && !GetRfuUnkCE8())
{
- sub_800AAC0();
+ Link_TryStartSend5FFF();
sWork->exitDelayTimer = 0;
sWork->routineState++;
}
@@ -893,7 +893,7 @@ static void ChatEntryRoutine_SaveAndExit(void)
case 13:
if (!gPaletteFade.active)
{
- sub_812B4B8();
+ HelpSystem_EnableToggleWithRButton();
UnionRoomChat_FreeGraphicsWork();
FreeChatWork();
SetMainCallback2(CB2_ReturnToField);
@@ -914,7 +914,7 @@ static bool32 TypeChatMessage_HandleDPad(void)
{
if (JOY_REPT(DPAD_UP))
{
- if (sWork->currentRow)
+ if (sWork->currentRow > 0)
sWork->currentRow--;
else
sWork->currentRow = sKeyboardPageMaxRow[sWork->currentPage];
@@ -938,7 +938,7 @@ static bool32 TypeChatMessage_HandleDPad(void)
{
if (JOY_REPT(DPAD_LEFT))
{
- if (sWork->currentCol)
+ if (sWork->currentCol > 0)
sWork->currentCol--;
else
sWork->currentCol = 4;
diff --git a/src/union_room_message.c b/src/union_room_message.c
index 9ca5aa15b..3aeb40524 100644
--- a/src/union_room_message.c
+++ b/src/union_room_message.c
@@ -1,10 +1,10 @@
#include "global.h"
-#include "union_room_message.h"
#include "mevent_server.h"
+#include "constants/union_room.h"
-ALIGNED(4) const u8 gUnknown_84571AC[] = _("");
+ALIGNED(4) const u8 gUnionRoomActivity_Blank[] = _("");
ALIGNED(4) const u8 gUnknown_84571B0[] = _(":");
-ALIGNED(4) const u8 gUnknown_84571B4[] = _("{EXTRA 7}");
+ALIGNED(4) const u8 gUnknown_84571B4[] = _("{ID}");
ALIGNED(4) const u8 gUnknown_84571B8[] = _("Please start over from the beginning.");
ALIGNED(4) const u8 gUnknown_84571E0[] = _("The WIRELESS COMMUNICATION\nSYSTEM search has been canceled.");
ALIGNED(4) const u8 gUnref_845721C[] = _("ともだちからの れんらくを\nまっています");
@@ -124,6 +124,7 @@ const u8 *const gUnknown_8457754[] = {
ALIGNED(4) const u8 gUnknown_845777C[] = _("The WIRELESS COMMUNICATION\nSYSTEM link has been established.");
ALIGNED(4) const u8 gUnknown_84577BC[] = _("The WIRELESS COMMUNICATION\nSYSTEM link has been dropped…");
+
ALIGNED(4) const u8 gUnknown_84577F8[] = _("The link with your friend has been\ndropped…");
ALIGNED(4) const u8 gUnknown_8457824[] = _("{STR_VAR_1} replied, “No…”");
@@ -150,11 +151,12 @@ const u8 *const gUnknown_8457898[] = {
ALIGNED(4) const u8 gUnknown_84578A0[] = _("はなしかけています…\nしょうしょう おまちください");
ALIGNED(4) const u8 gUnknown_84578BC[] = _("Awaiting {STR_VAR_1}'s response about\nthe trade…");
+
ALIGNED(4) const u8 gUnknown_84578E4[] = _("Communicating{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\n{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.");
ALIGNED(4) const u8 gUnknown_8457950[] = _("Communicating with {STR_VAR_1}{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\n{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.");
ALIGNED(4) const u8 gUnknown_84579BC[] = _("Please wait a while{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\n{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.");
-const u8 *const gUnknown_8457A34[] = {
+const u8 *const gURText_PleaseWaitMsgs[] = {
gUnknown_84578E4,
gUnknown_8457950,
gUnknown_84579BC
@@ -165,7 +167,7 @@ ALIGNED(4) const u8 gUnknown_8457A70[] = _("Hello!\nWould you like to do somethi
ALIGNED(4) const u8 gUnknown_8457A98[] = _("{STR_VAR_1}: Hiya, we meet again!\nWhat are you up for this time?");
ALIGNED(4) const u8 gUnknown_8457AD0[] = _("{STR_VAR_1}: Oh! {PLAYER}, hello!\nWould you like to do something?");
-const u8 *const gUnknown_8457B04[][2] = {
+const u8 *const gURText_FriendPromptsForActivity[][2] = {
{
gUnknown_8457A40,
gUnknown_8457A70
@@ -237,6 +239,7 @@ const u8 *const gUnknown_8457F80[][2] = {
};
ALIGNED(4) const u8 gUnknown_8457F90[] = _("……\nThe TRAINER appears to be busy…\p");
+
ALIGNED(4) const u8 gUnknown_8457FB4[] = _("A battle, huh?\nAll right, just give me some time.");
ALIGNED(4) const u8 gUnknown_8457FE8[] = _("You want to chat, huh?\nSure, just wait a little.");
ALIGNED(4) const u8 gUnknown_845801C[] = _("Sure thing! As my “Greetings,”\nhere's my TRAINER CARD.");
@@ -244,7 +247,7 @@ ALIGNED(4) const u8 gUnknown_8458054[] = _("A battle? Of course, but I need\ntim
ALIGNED(4) const u8 gUnknown_8458088[] = _("Did you want to chat?\nOkay, but please wait a moment.");
ALIGNED(4) const u8 gUnknown_84580C0[] = _("As my introduction, I'll show you\nmy TRAINER CARD.");
-const u8 *const gUnknown_84580F4[][4] = {
+const u8 *const gResponseToURoomActivityInviteStringPtrs[][4] = {
{
gUnknown_8457FB4,
gUnknown_8457FE8,
@@ -415,7 +418,8 @@ ALIGNED(4) const u8 gUnknown_8458AB8[] = _("Welcome to the TRADING BOARD.\pYou m
ALIGNED(4) const u8 gUnknown_8458B44[] = _("This TRADING BOARD is used for\noffering a POKéMON for a trade.\pAll you need to do is register a\nPOKéMON for a trade.\pAnother TRAINER may offer a party\nPOKéMON in return for the trade.\pWe hope you will register POKéMON\nand trade them with many, many\lother TRAINERS.\pWould you like to register one of\nyour POKéMON?");
ALIGNED(4) const u8 gUnref_ThankYouForComing_JP[] = _("こうかんけいじばん の とうろくが\nかんりょう しました\pごりよう ありがとう\nございました!\p");
ALIGNED(4) const u8 gUnref_NoOneRegisteredMon[] = _("けいじばんに だれも ポケモンを\nとうろく していません\p\n");
-ALIGNED(4) const u8 gUnknown_8458CD4[] = _("Please choose the type of POKéMON\nthat you would like in the trade.\n");
+
+ALIGNED(4) const u8 gURText_PleaseChooseTypeOfMon[] = _("Please choose the type of POKéMON\nthat you would like in the trade.\n");
ALIGNED(4) const u8 gUnknown_8458D1C[] = _("Which of your party POKéMON will\nyou offer in trade?\p");
ALIGNED(4) const u8 gUnknown_8458D54[] = _("Registration has been canceled.\p");
ALIGNED(4) const u8 gUnknown_8458D78[] = _("Registration has been completed.\p");
@@ -439,9 +443,10 @@ const u8 *const gUnknown_8458F94[] = {
};
ALIGNED(4) const u8 gUnknown_8458F9C[] = _("Your trade offer was rejected.\p");
-ALIGNED(4) const u8 gUnknown_8458FBC[] = _("EGG TRADE");
+ALIGNED(4) const u8 gText_EggTrade[] = _("EGG TRADE");
ALIGNED(4) const u8 gUnknown_8458FC8[] = _("{DPAD_UPDOWN}CHOOSE {A_BUTTON}JOIN {B_BUTTON}CANCEL");
ALIGNED(4) const u8 gUnknown_8458FE4[] = _("Please choose a TRAINER.");
+
ALIGNED(4) const u8 gUnknown_8459000[] = _("Please choose a TRAINER for\na SINGLE BATTLE.");
ALIGNED(4) const u8 gUnknown_8459030[] = _("Please choose a TRAINER for\na DOUBLE BATTLE.");
ALIGNED(4) const u8 gUnknown_8459060[] = _("Please choose the LEADER\nfor a MULTI BATTLE.");
@@ -453,15 +458,15 @@ ALIGNED(4) const u8 gUnknown_8459160[] = _("BERRY CRUSH!\nPlease choose the LEAD
ALIGNED(4) const u8 gUnknown_8459188[] = _("DODRIO BERRY-PICKING!\nPlease choose the LEADER.");
const u8 *const gUnknown_84591B8[] = {
- gUnknown_8459000,
- gUnknown_8459030,
- gUnknown_8459060,
- gUnknown_8459090,
- gUnknown_845912C,
- gUnknown_8459160,
- gUnknown_8459188,
- gUnknown_84590BC,
- gUnknown_84590F4
+ [LINK_GROUP_SINGLE_BATTLE] = gUnknown_8459000,
+ [LINK_GROUP_DOUBLE_BATTLE] = gUnknown_8459030,
+ [LINK_GROUP_MULTI_BATTLE] = gUnknown_8459060,
+ [LINK_GROUP_TRADE] = gUnknown_8459090,
+ [LINK_GROUP_POKEMON_JUMP] = gUnknown_845912C,
+ [LINK_GROUP_BERRY_CRUSH] = gUnknown_8459160,
+ [LINK_GROUP_BERRY_PICKING] = gUnknown_8459188,
+ [LINK_GROUP_WONDER_CARD] = gUnknown_84590BC,
+ [LINK_GROUP_WONDER_NEWS] = gUnknown_84590F4
};
ALIGNED(4) const u8 gUnknown_84591DC[] = _("Searching for a WIRELESS\nCOMMUNICATION SYSTEM. Wait...");
@@ -470,6 +475,7 @@ ALIGNED(4) const u8 gUnknown_8459238[] = _("Awaiting {STR_VAR_1}'s response…")
ALIGNED(4) const u8 gUnknown_8459250[] = _("{STR_VAR_1} has been asked to register\nyou as a member. Please wait.");
ALIGNED(4) const u8 gUnknown_845928C[] = _("Awaiting a response from the\nWIRELESS COMMUNICATION SYSTEM.");
ALIGNED(4) const u8 gUnref_PlsWaitLittleWHile[] = _("ほかの さんかしゃが そろうまで\nしょうしょう おまちください");
+
ALIGNED(4) const u8 gUnknown_84592E8[] = _("No CARDS appear to be shared \nright now.");
ALIGNED(4) const u8 gUnknown_8459314[] = _("No NEWS appears to be shared\nright now.");
@@ -482,23 +488,26 @@ ALIGNED(4) const u8 gUnknown_8459344[] = _("BATTLE");
ALIGNED(4) const u8 gUnknown_845934C[] = _("CHAT");
ALIGNED(4) const u8 gUnknown_8459354[] = _("GREETINGS");
ALIGNED(4) const u8 gUnknown_8459360[] = _("EXIT");
+
ALIGNED(4) const u8 gUnknown_8459368[] = _("EXIT");
ALIGNED(4) const u8 gUnknown_8459370[] = _("INFO");
ALIGNED(4) const u8 gUnknown_8459378[] = _("NAME{CLEAR_TO 0x3C}WANTED{CLEAR_TO 0x6E}OFFER{CLEAR_TO 0xC6}LV.");
-ALIGNED(4) const u8 gUnknown_8459394[] = _("SINGLE BATTLE");
-ALIGNED(4) const u8 gUnknown_84593A4[] = _("DOUBLE BATTLE");
-ALIGNED(4) const u8 gUnknown_84593B4[] = _("MULTI BATTLE");
-ALIGNED(4) const u8 gUnknown_84593C4[] = _("POKéMON TRADES");
-ALIGNED(4) const u8 gUnknown_84593D4[] = _("CHAT");
-ALIGNED(4) const u8 gUnknown_84593DC[] = _("CARDS");
-ALIGNED(4) const u8 gUnknown_84593E4[] = _("WONDER CARDS");
-ALIGNED(4) const u8 gUnknown_84593F4[] = _("WONDER NEWS");
-ALIGNED(4) const u8 gUnknown_8459400[] = _("POKéMON JUMP");
-ALIGNED(4) const u8 gUnknown_8459410[] = _("BERRY CRUSH");
-ALIGNED(4) const u8 gUnknown_845941C[] = _("BERRY-PICKING");
-ALIGNED(4) const u8 gUnknown_845942C[] = _("SEARCH");
-ALIGNED(4) const u8 gUnknown_8459434[] = _("ぐるぐるこうかん");
-ALIGNED(4) const u8 gUnknown_8459440[] = _("アイテムトレード");
+
+ALIGNED(4) const u8 gUnionRoomActivity_SingleBattle[] = _("SINGLE BATTLE");
+ALIGNED(4) const u8 gUnionRoomActivity_DoubleBattle[] = _("DOUBLE BATTLE");
+ALIGNED(4) const u8 gUnionRoomActivity_MultiBattle[] = _("MULTI BATTLE");
+ALIGNED(4) const u8 gUnionRoomActivity_PokemonTrades[] = _("POKéMON TRADES");
+ALIGNED(4) const u8 gUnionRoomActivity_Chat[] = _("CHAT");
+ALIGNED(4) const u8 gUnionRoomActivity_Cards[] = _("CARDS");
+ALIGNED(4) const u8 gUnionRoomActivity_WonderCards[] = _("WONDER CARDS");
+ALIGNED(4) const u8 gunionRoomActivity_WonderNews[] = _("WONDER NEWS");
+ALIGNED(4) const u8 gUnionRoomActivity_PokemonJump[] = _("POKéMON JUMP");
+ALIGNED(4) const u8 gUnionRoomActivity_BerryCrush[] = _("BERRY CRUSH");
+ALIGNED(4) const u8 gUnionRoomActivity_BerryPicking[] = _("BERRY-PICKING");
+ALIGNED(4) const u8 gUnionRoomActivity_Search[] = _("SEARCH");
+ALIGNED(4) const u8 gUnionRoomActivity_SpinTradeJP[] = _("ぐるぐるこうかん");
+ALIGNED(4) const u8 gUnionRoomActivity_ItemTradeJP[] = _("アイテムトレード");
+
ALIGNED(4) const u8 gUnknown_845944C[] = _("It's a NORMAL CARD.");
ALIGNED(4) const u8 gUnknown_8459460[] = _("It's a BRONZE CARD!");
ALIGNED(4) const u8 gUnknown_8459474[] = _("It's a COPPER CARD!");
@@ -515,6 +524,7 @@ const u8 *const gUnknown_84594B0[] = {
ALIGNED(4) const u8 gUnknown_84594C4[] = _("This is {SPECIAL_F7 0x00} {SPECIAL_F7 0x01}'s\nTRAINER CARD…\l{SPECIAL_F7 0x02}\pPOKéDEX: {SPECIAL_F7 0x03}\nTIME: {SPECIAL_F7 0x04}:{SPECIAL_F7 0x05}\p");
ALIGNED(4) const u8 gUnknown_8459504[] = _("BATTLES: {SPECIAL_F7 0x00} WINS {SPECIAL_F7 0x02} LOSSES\nTRADES: {SPECIAL_F7 0x03} TIMES\p“{SPECIAL_F7 0x04} {SPECIAL_F7 0x05}\n{SPECIAL_F7 0x06} {SPECIAL_F7 0x07}”\p");
+
ALIGNED(4) const u8 gUnknown_8459544[] = _("{SPECIAL_F7 0x01}: Glad to have met you!{PAUSE 60}");
ALIGNED(4) const u8 gUnknown_8459564[] = _("{SPECIAL_F7 0x01}: Glad to meet you!{PAUSE 60}");
diff --git a/src/unk_815C980.c b/src/unk_815C980.c
deleted file mode 100644
index 09b92c834..000000000
--- a/src/unk_815C980.c
+++ /dev/null
@@ -1,437 +0,0 @@
-#include "global.h"
-#include "malloc.h"
-#include "decompress.h"
-#include "unk_815C980.h"
-#include "main.h"
-#include "battle.h"
-
-struct UnkStruct2
-{
- bool8 isActive;
- u8 firstOamId;
- u8 field_2;
- u8 oamCount;
- u8 palTagIndex;
- u8 size;
- u8 shape;
- u8 priority;
- u8 xDelta;
- u8 field_9;
- u16 tileStart;
- s16 x;
- s16 y;
- u16 tileTag;
- u16 palTag;
- u32 field_14;
- s32 field_18;
-};
-
-struct UnkStruct1
-{
- u32 count;
- struct UnkStruct2 *array;
-};
-
-// this file's functions
-static u8 sub_815D244(u8 arg0);;
-static void sub_815CC28(struct UnkStruct2 *arg0);
-static void sub_815CDDC(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2);
-static void sub_815CE90(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2);
-static void sub_815CFEC(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2);
-static bool32 SharesTileWithAnyActive(u32 id);
-static bool32 SharesPalWithAnyActive(u32 id);
-static void sub_8035648(void);
-static u8 sub_815D324(u32 shape, u32 size);
-
-// ewram
-static EWRAM_DATA struct UnkStruct1 *gUnknown_203F454 = {0};
-
-// const rom data
-static const u8 gUnknown_8479658[][4] =
-{
- {0x01, 0x04, 0x10, 0x40},
- {0x02, 0x04, 0x08, 0x20},
- {0x02, 0x04, 0x08, 0x20},
- {0x00, 0x00, 0x00, 0x00}
-};
-
-// code
-bool32 sub_815C980(u32 count)
-{
- u32 i;
-
- if (gUnknown_203F454 != NULL)
- sub_815C9F4();
-
- gUnknown_203F454 = Alloc(sizeof(*gUnknown_203F454));
- if (gUnknown_203F454 == NULL)
- return FALSE;
-
- gUnknown_203F454->array = Alloc(sizeof(struct UnkStruct2) * count);
- if (gUnknown_203F454->array == NULL)
- {
- Free(gUnknown_203F454);
- return FALSE;
- }
-
- gUnknown_203F454->count = count;
- for (i = 0; i < count; i++)
- {
- gUnknown_203F454->array[i].isActive = FALSE;
- gUnknown_203F454->array[i].firstOamId = 0xFF;
- }
-
- return TRUE;
-}
-
-void sub_815C9F4(void)
-{
- if (gUnknown_203F454 != NULL)
- {
- if (gUnknown_203F454->array != NULL)
- {
- u32 i;
-
- for (i = 0; i < gUnknown_203F454->count; i++)
- sub_815D108(i);
-
- Free(gUnknown_203F454->array);
- }
-
- FREE_AND_SET_NULL(gUnknown_203F454);
- }
-}
-
-bool32 sub_815CA40(u32 id, s32 arg1, const struct UnkStruct3 *arg2)
-{
- u32 i;
-
- if (gUnknown_203F454 == NULL)
- return FALSE;
- if (gUnknown_203F454->array[id].isActive)
- return FALSE;
-
- gUnknown_203F454->array[id].firstOamId = sub_815D244(arg2->field_1);
- if (gUnknown_203F454->array[id].firstOamId == 0xFF)
- return FALSE;
-
- gUnknown_203F454->array[id].tileStart = GetSpriteTileStartByTag(arg2->spriteSheet->tag);
- if (gUnknown_203F454->array[id].tileStart == 0xFFFF)
- {
- if (arg2->spriteSheet->size != 0)
- {
- gUnknown_203F454->array[id].tileStart = LoadSpriteSheet(arg2->spriteSheet);
- }
- else
- {
- struct CompressedSpriteSheet compObjectPic;
-
- compObjectPic = *(struct CompressedSpriteSheet*)(arg2->spriteSheet);
- compObjectPic.size = GetDecompressedDataSize(arg2->spriteSheet->data);
- gUnknown_203F454->array[id].tileStart = LoadCompressedSpriteSheet(&compObjectPic);
- }
-
- if (gUnknown_203F454->array[id].tileStart == 0xFFFF)
- return FALSE;
- }
-
- gUnknown_203F454->array[id].palTagIndex = IndexOfSpritePaletteTag(arg2->spritePal->tag);
- if (gUnknown_203F454->array[id].palTagIndex == 0xFF)
- gUnknown_203F454->array[id].palTagIndex = LoadSpritePalette(arg2->spritePal);
-
- gUnknown_203F454->array[id].field_2 = arg2->field_0_0;
- gUnknown_203F454->array[id].oamCount = arg2->field_1;
- gUnknown_203F454->array[id].x = arg2->x;
- gUnknown_203F454->array[id].y = arg2->y;
- gUnknown_203F454->array[id].shape = arg2->shape;
- gUnknown_203F454->array[id].size = arg2->size;
- gUnknown_203F454->array[id].priority = arg2->priority;
- gUnknown_203F454->array[id].xDelta = arg2->xDelta;
- gUnknown_203F454->array[id].field_9 = sub_815D324(arg2->shape, arg2->size);
- gUnknown_203F454->array[id].tileTag = arg2->spriteSheet->tag;
- gUnknown_203F454->array[id].palTag = arg2->spritePal->tag;
- gUnknown_203F454->array[id].isActive = TRUE;
- gUnknown_203F454->array[id].field_14 = 1;
-
- for (i = 1; i < arg2->field_1; i++)
- gUnknown_203F454->array[id].field_14 *= 10;
-
- sub_815CC28(&gUnknown_203F454->array[id]);
- sub_815CD70(id, arg1);
-
- return TRUE;
-}
-
-static void sub_815CC28(struct UnkStruct2 *arg0)
-{
- u32 i;
- u32 oamId = arg0->firstOamId;
- u32 x = arg0->x;
- u32 oamCount = arg0->oamCount + 1;
-
- CpuFill16(0, &gMain.oamBuffer[oamId], sizeof(struct OamData) * oamCount);
- for (i = 0, oamId = arg0->firstOamId; i < oamCount; i++, oamId++)
- {
- gMain.oamBuffer[oamId].y = arg0->y;
- gMain.oamBuffer[oamId].x = x;
- gMain.oamBuffer[oamId].shape = arg0->shape;
- gMain.oamBuffer[oamId].size = arg0->size;
- gMain.oamBuffer[oamId].tileNum = arg0->tileStart;
- gMain.oamBuffer[oamId].priority = arg0->priority;
- gMain.oamBuffer[oamId].paletteNum = arg0->palTagIndex;
-
- x += arg0->xDelta;
- }
-
- oamId--;
- gMain.oamBuffer[oamId].x = arg0->x - arg0->xDelta;
- gMain.oamBuffer[oamId].affineMode = 2;
- gMain.oamBuffer[oamId].tileNum = arg0->tileStart + (arg0->field_9 * 10);
-}
-
-void sub_815CD70(u32 id, s32 arg1)
-{
- bool32 r2;
-
- if (gUnknown_203F454 == NULL)
- return;
- if (!gUnknown_203F454->array[id].isActive)
- return;
-
- gUnknown_203F454->array[id].field_18 = arg1;
- if (arg1 < 0)
- {
- r2 = TRUE;
- arg1 *= -1;
- }
- else
- {
- r2 = FALSE;
- }
-
- switch (gUnknown_203F454->array[id].field_2)
- {
- case 0:
- default:
- sub_815CDDC(&gUnknown_203F454->array[id], arg1, r2);
- break;
- case 1:
- sub_815CE90(&gUnknown_203F454->array[id], arg1, r2);
- break;
- case 2:
- sub_815CFEC(&gUnknown_203F454->array[id], arg1, r2);
- break;
- }
-}
-
-static void sub_815CDDC(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2)
-{
- u32 r5 = arg0->field_14;
- u32 oamId = arg0->firstOamId;
-
- while (r5 != 0)
- {
- u32 r4 = arg1 / r5;
- arg1 -= (r4 * r5);
- r5 /= 10;
-
- gMain.oamBuffer[oamId].tileNum = (r4 * arg0->field_9) + arg0->tileStart;
- oamId++;
- }
-
- if (arg2)
- gMain.oamBuffer[oamId].affineMode = 0;
- else
- gMain.oamBuffer[oamId].affineMode = 2;
-}
-
-static void sub_815CE90(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2)
-{
- u32 r5 = arg0->field_14;
- static int gUnknown_3002078;
- static int gUnknown_300207C;
- static int gUnknown_3002080;
-
- gUnknown_3002078 = arg0->firstOamId;
- gUnknown_300207C = 0;
- gUnknown_3002080 = -1;
-
- while (r5 != 0)
- {
- u32 r4 = arg1 / r5;
- arg1 -= (r4 * r5);
- r5 /= 10;
-
- if (r4 != 0 || gUnknown_3002080 != -1 || r5 == 0)
- {
- gMain.oamBuffer[gUnknown_3002078].tileNum = (r4 * arg0->field_9) + arg0->tileStart;
- gMain.oamBuffer[gUnknown_3002078].affineMode = 0;
-
- if (gUnknown_3002080 == -1)
- gUnknown_3002080 = gUnknown_300207C;
- }
- else
- {
- gMain.oamBuffer[gUnknown_3002078].affineMode = 2;
- }
-
- gUnknown_3002078++;
- gUnknown_300207C++;
- }
-
- if (arg2)
- {
- gMain.oamBuffer[gUnknown_3002078].affineMode = 0;
- gMain.oamBuffer[gUnknown_3002078].x = arg0->x + ((gUnknown_3002080 - 1) * arg0->xDelta);
- }
- else
- {
- gMain.oamBuffer[gUnknown_3002078].affineMode = 2;
- }
-}
-
-static void sub_815CFEC(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2)
-{
- u32 r5 = arg0->field_14;
- u32 oamId = arg0->firstOamId;
- u32 var_28 = 0;
- s32 r9 = 0;
-
- while (r5 != 0)
- {
- u32 r4 = arg1 / r5;
- arg1 -= (r4 * r5);
- r5 /= 10;
-
- if (r4 != 0 || var_28 != 0 || r5 == 0)
- {
- var_28 = 1;
- gMain.oamBuffer[oamId].tileNum = (r4 * arg0->field_9) + arg0->tileStart;
- gMain.oamBuffer[oamId].affineMode = 0;
-
- oamId++;
- r9++;
- }
- }
-
- while (r9 < arg0->oamCount)
- {
- gMain.oamBuffer[oamId].affineMode = 2;
- oamId++;
- r9++;
- }
-
- if (arg2)
- gMain.oamBuffer[oamId].affineMode = 0;
- else
- gMain.oamBuffer[oamId].affineMode = 2;
-}
-
-void sub_815D108(u32 id)
-{
- s32 oamId, oamCount, i;
-
- if (gUnknown_203F454 == NULL)
- return;
- if (!gUnknown_203F454->array[id].isActive)
- return;
-
- oamCount = gUnknown_203F454->array[id].oamCount + 1;
- oamId = gUnknown_203F454->array[id].firstOamId;
-
- for (i = 0; i < oamCount; i++, oamId++)
- gMain.oamBuffer[oamId].affineMode = 2;
-
- if (!SharesTileWithAnyActive(id))
- FreeSpriteTilesByTag(gUnknown_203F454->array[id].tileTag);
- if (!SharesPalWithAnyActive(id))
- FreeSpritePaletteByTag(gUnknown_203F454->array[id].palTag);
-
- gUnknown_203F454->array[id].isActive = FALSE;
-}
-
-void sub_815D1A8(u32 id, bool32 arg1)
-{
- s32 oamId, oamCount, i;
-
- if (gUnknown_203F454 == NULL)
- return;
- if (!gUnknown_203F454->array[id].isActive)
- return;
-
- oamCount = gUnknown_203F454->array[id].oamCount + 1;
- oamId = gUnknown_203F454->array[id].firstOamId;
- if (arg1)
- {
- for (i = 0; i < oamCount; i++, oamId++)
- gMain.oamBuffer[oamId].affineMode = 2;
- }
- else
- {
- for (i = 0; i < oamCount; i++, oamId++)
- gMain.oamBuffer[oamId].affineMode = 0;
-
- sub_815CD70(id, gUnknown_203F454->array[id].field_18);
- }
-}
-
-static u8 sub_815D244(u8 arg0)
-{
- u32 i;
- u16 oamCount = 64;
-
- for (i = 0; i < gUnknown_203F454->count; i++)
- {
- if (!gUnknown_203F454->array[i].isActive)
- {
- if (gUnknown_203F454->array[i].firstOamId != 0xFF && gUnknown_203F454->array[i].oamCount <= arg0)
- return gUnknown_203F454->array[i].firstOamId;
- }
- else
- {
- oamCount += 1 + gUnknown_203F454->array[i].oamCount;
- }
- }
-
- if (oamCount + arg0 + 1 > 128)
- return 0xFF;
- else
- return oamCount;
-}
-
-static bool32 SharesTileWithAnyActive(u32 id)
-{
- u32 i;
-
- for (i = 0; i < gUnknown_203F454->count; i++)
- {
- if (gUnknown_203F454->array[i].isActive && i != id
- && gUnknown_203F454->array[i].tileTag == gUnknown_203F454->array[id].tileTag)
- {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static bool32 SharesPalWithAnyActive(u32 id)
-{
- u32 i;
-
- for (i = 0; i < gUnknown_203F454->count; i++)
- {
- if (gUnknown_203F454->array[i].isActive && i != id
- && gUnknown_203F454->array[i].palTag == gUnknown_203F454->array[id].palTag)
- {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static u8 sub_815D324(u32 shape, u32 size)
-{
- return gUnknown_8479658[shape][size];
-}
diff --git a/src/util.c b/src/util.c
index 93aa60f84..b32799584 100644
--- a/src/util.c
+++ b/src/util.c
@@ -1,5 +1,4 @@
#include "global.h"
-#include "util.h"
const u32 gBitTable[] =
{
diff --git a/src/vs_seeker.c b/src/vs_seeker.c
index 417b281d9..60f5f338f 100644
--- a/src/vs_seeker.c
+++ b/src/vs_seeker.c
@@ -18,19 +18,22 @@
#include "battle.h"
#include "battle_setup.h"
#include "random.h"
-#include "event_object_movement.h"
#include "field_player_avatar.h"
-#include "event_object_80688E4.h"
-#include "event_object_8097404.h"
-#include "unk_810c3a4.h"
#include "vs_seeker.h"
-#include "constants/movement_commands.h"
-#include "constants/object_events.h"
+#include "constants/event_object_movement.h"
+#include "constants/event_objects.h"
#include "constants/trainers.h"
#include "constants/maps.h"
#include "constants/items.h"
#include "constants/quest_log.h"
+enum
+{
+ VSSEEKER_NOT_CHARGED,
+ VSSEEKER_NO_ONE_IN_RANGE,
+ VSSEEKER_CAN_USE,
+};
+
typedef enum
{
VSSEEKER_RESPONSE_NO_RESPONSE,
@@ -548,29 +551,35 @@ static const VsSeekerData sVsSeekerData[] = {
};
static const u8 gUnknown_8453F5C[] = {
- delay_16,
- delay_16,
- delay_16,
- step_end
+ MOVEMENT_ACTION_DELAY_16,
+ MOVEMENT_ACTION_DELAY_16,
+ MOVEMENT_ACTION_DELAY_16,
+ MOVEMENT_ACTION_STEP_END
};
static const u8 gUnknown_8453F60[] = {
- emote_exclamation_mark,
- step_end
+ MOVEMENT_ACTION_EMOTE_EXCLAMATION_MARK,
+ MOVEMENT_ACTION_STEP_END
};
static const u8 sMovementScript_TrainerNoRematch[] = {
- emote_x,
- step_end
+ MOVEMENT_ACTION_EMOTE_X,
+ MOVEMENT_ACTION_STEP_END
};
static const u8 sMovementScript_TrainerRematch[] = {
- walk_in_place_fastest_down,
- emote_double_exclamation_mark,
- step_end
+ MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_DOWN,
+ MOVEMENT_ACTION_EMOTE_DOUBLE_EXCL_MARK,
+ MOVEMENT_ACTION_STEP_END
};
-static const u8 gUnknown_8453F67[] = { 0x08, 0x08, 0x07, 0x09, 0x0a };
+static const u8 gUnknown_8453F67[] = {
+ MOVEMENT_TYPE_FACE_DOWN,
+ MOVEMENT_TYPE_FACE_DOWN,
+ MOVEMENT_TYPE_FACE_UP,
+ MOVEMENT_TYPE_FACE_LEFT,
+ MOVEMENT_TYPE_FACE_RIGHT
+};
// text
@@ -733,20 +742,20 @@ void Task_VsSeeker_0(u8 taskId)
sVsSeeker = AllocZeroed(sizeof(struct VsSeekerStruct));
GatherNearbyTrainerInfo();
respval = CanUseVsSeeker();
- if (respval == 0)
+ if (respval == VSSEEKER_NOT_CHARGED)
{
Free(sVsSeeker);
- DisplayItemMessageOnField(taskId, 2, gUnknown_81C137C, sub_80A1E0C);
+ DisplayItemMessageOnField(taskId, 2, VSSeeker_Text_BatteryNotChargedNeedXSteps, sub_80A1E0C);
}
- else if (respval == 1)
+ else if (respval == VSSEEKER_NO_ONE_IN_RANGE)
{
Free(sVsSeeker);
- DisplayItemMessageOnField(taskId, 2, gUnknown_81C13D6, sub_80A1E0C);
+ DisplayItemMessageOnField(taskId, 2, VSSeeker_Text_NoTrainersWithinRange, sub_80A1E0C);
}
- else if (respval == 2)
+ else if (respval == VSSEEKER_CAN_USE)
{
ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, 0, gSpecialVar_ItemId, 0xffff);
- FieldEffectStart(FLDEFF_UNK_41); // TODO: name this enum
+ FieldEffectStart(FLDEFF_USE_VS_SEEKER);
gTasks[taskId].func = Task_VsSeeker_1;
gTasks[taskId].data[0] = 15;
}
@@ -772,7 +781,7 @@ static void Task_VsSeeker_2(u8 taskId)
data[2]++;
}
- if (!FieldEffectActiveListContains(FLDEFF_UNK_41))
+ if (!FieldEffectActiveListContains(FLDEFF_USE_VS_SEEKER))
{
data[1] = 0;
data[2] = 0;
@@ -812,13 +821,13 @@ static void Task_VsSeeker_3(u8 taskId)
{
if (ScriptMovement_IsObjectMovementFinished(0xFF, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup))
{
- if (sVsSeeker->responseCode == 0)
+ if (sVsSeeker->responseCode == VSSEEKER_RESPONSE_NO_RESPONSE)
{
- DisplayItemMessageOnField(taskId, 2, gUnknown_81C1429, sub_80A1E0C);
+ DisplayItemMessageOnField(taskId, 2, VSSeeker_Text_TrainersNotReady, sub_80A1E0C);
}
else
{
- if (sVsSeeker->responseCode == 2)
+ if (sVsSeeker->responseCode == VSSEEKER_RESPONSE_FOUND_REMATCHES)
StartAllRespondantIdleMovements();
ClearDialogWindowAndFrame(0, 1);
sub_80696C0();
@@ -829,20 +838,20 @@ static void Task_VsSeeker_3(u8 taskId)
}
}
-u8 CanUseVsSeeker(void)
+static u8 CanUseVsSeeker(void)
{
u8 vsSeekerChargeSteps = gSaveBlock1Ptr->trainerRematchStepCounter;
if (vsSeekerChargeSteps == 100)
{
if (GetRematchableTrainerLocalId() == 0xFF)
- return 1;
+ return VSSEEKER_NO_ONE_IN_RANGE;
else
- return 2;
+ return VSSEEKER_CAN_USE;
}
else
{
TV_PrintIntToStringVar(0, 100 - vsSeekerChargeSteps);
- return 0;
+ return VSSEEKER_NOT_CHARGED;
}
}
@@ -926,11 +935,11 @@ static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0)
PlaySE(SE_PIN);
FlagSet(FLAG_SYS_VS_SEEKER_CHARGING);
sub_810C640();
- return 2;
+ return VSSEEKER_RESPONSE_FOUND_REMATCHES;
}
if (sVsSeeker->trainerHasNotYetBeenFought)
- return 1;
- return 0;
+ return VSSEEKER_RESPONSE_UNFOUGHT_TRAINERS;
+ return VSSEEKER_RESPONSE_NO_RESPONSE;
}
void sub_810CB90(void)
@@ -957,7 +966,7 @@ void sub_810CB90(void)
if (gSelectedObjectEvent == sp0)
r4_2->movementType = gUnknown_8453F67[r4_2->facingDirection];
else
- r4_2->movementType = 0x08;
+ r4_2->movementType = MOVEMENT_TYPE_FACE_DOWN;
}
}
}
@@ -1077,7 +1086,7 @@ s32 GetRematchTrainerId(u16 a0)
return sVsSeekerData[i].trainerIdxs[j];
}
-u8 ScrSpecial_GetTrainerEyeRematchFlag(void) // unreferenced, or reference not disassembled
+u8 IsTrainerReadyForRematch(void)
{
return sub_810CED0(sVsSeekerData, gTrainerBattleOpponent_A);
}
@@ -1127,32 +1136,32 @@ static u8 GetRunningBehaviorFromGraphicsId(u8 graphicsId)
{
switch (graphicsId)
{
- case OBJECT_EVENT_GFX_LITTLE_GIRL:
- case OBJECT_EVENT_GFX_YOUNGSTER:
- case OBJECT_EVENT_GFX_BOY:
- case OBJECT_EVENT_GFX_BUG_CATCHER:
- case OBJECT_EVENT_GFX_LASS:
- case OBJECT_EVENT_GFX_WOMAN_1:
- case OBJECT_EVENT_GFX_BATTLE_GIRL:
- case OBJECT_EVENT_GFX_MAN:
- case OBJECT_EVENT_GFX_ROCKER:
- case OBJECT_EVENT_GFX_WOMAN_2:
- case OBJECT_EVENT_GFX_BEAUTY:
- case OBJECT_EVENT_GFX_BALDING_MAN:
- case OBJECT_EVENT_GFX_TUBER_F:
- case OBJECT_EVENT_GFX_CAMPER:
- case OBJECT_EVENT_GFX_PICNICKER:
- case OBJECT_EVENT_GFX_COOLTRAINER_M:
- case OBJECT_EVENT_GFX_COOLTRAINER_F:
- case OBJECT_EVENT_GFX_SWIMMER_M_LAND:
- case OBJECT_EVENT_GFX_SWIMMER_F_LAND:
- case OBJECT_EVENT_GFX_BLACKBELT:
- case OBJECT_EVENT_GFX_HIKER:
- case OBJECT_EVENT_GFX_SAILOR:
+ case OBJ_EVENT_GFX_LITTLE_GIRL:
+ case OBJ_EVENT_GFX_YOUNGSTER:
+ case OBJ_EVENT_GFX_BOY:
+ case OBJ_EVENT_GFX_BUG_CATCHER:
+ case OBJ_EVENT_GFX_LASS:
+ case OBJ_EVENT_GFX_WOMAN_1:
+ case OBJ_EVENT_GFX_BATTLE_GIRL:
+ case OBJ_EVENT_GFX_MAN:
+ case OBJ_EVENT_GFX_ROCKER:
+ case OBJ_EVENT_GFX_WOMAN_2:
+ case OBJ_EVENT_GFX_BEAUTY:
+ case OBJ_EVENT_GFX_BALDING_MAN:
+ case OBJ_EVENT_GFX_TUBER_F:
+ case OBJ_EVENT_GFX_CAMPER:
+ case OBJ_EVENT_GFX_PICNICKER:
+ case OBJ_EVENT_GFX_COOLTRAINER_M:
+ case OBJ_EVENT_GFX_COOLTRAINER_F:
+ case OBJ_EVENT_GFX_SWIMMER_M_LAND:
+ case OBJ_EVENT_GFX_SWIMMER_F_LAND:
+ case OBJ_EVENT_GFX_BLACKBELT:
+ case OBJ_EVENT_GFX_HIKER:
+ case OBJ_EVENT_GFX_SAILOR:
return 0x4e;
- case OBJECT_EVENT_GFX_TUBER_M_1:
- case OBJECT_EVENT_GFX_SWIMMER_M_WATER:
- case OBJECT_EVENT_GFX_SWIMMER_F_WATER:
+ case OBJ_EVENT_GFX_TUBER_M_1:
+ case OBJ_EVENT_GFX_SWIMMER_M_WATER:
+ case OBJ_EVENT_GFX_SWIMMER_F_WATER:
return 0x4f;
default:
return 0x4d;
diff --git a/src/wild_encounter.c b/src/wild_encounter.c
index b32eb583a..cf495db56 100644
--- a/src/wild_encounter.c
+++ b/src/wild_encounter.c
@@ -367,11 +367,11 @@ bool8 StandardWildEncounter(u32 currMetatileBehavior, u16 previousMetatileBehavi
headerId = GetCurrentMapWildMonHeaderId();
if (headerId != 0xFFFF)
{
- if (sub_8058F1C(currMetatileBehavior, 4) == TRUE)
+ if (GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 4) == TRUE)
{
if (gWildMonHeaders[headerId].landMonsInfo == NULL)
return FALSE;
- else if (previousMetatileBehavior != sub_8058F1C(currMetatileBehavior, 0) && !DoGlobalWildEncounterDiceRoll())
+ else if (previousMetatileBehavior != GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0) && !DoGlobalWildEncounterDiceRoll())
return FALSE;
if (DoWildEncounterRateTest(gWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE)
{
@@ -387,7 +387,7 @@ bool8 StandardWildEncounter(u32 currMetatileBehavior, u16 previousMetatileBehavi
return FALSE;
}
- BattleSetup_StartRoamerBattle();
+ StartRoamerBattle();
return TRUE;
}
else
@@ -396,7 +396,7 @@ bool8 StandardWildEncounter(u32 currMetatileBehavior, u16 previousMetatileBehavi
// try a regular wild land encounter
if (TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_REPEL) == TRUE)
{
- BattleSetup_StartWildBattle();
+ StartWildBattle();
return TRUE;
}
else
@@ -405,12 +405,12 @@ bool8 StandardWildEncounter(u32 currMetatileBehavior, u16 previousMetatileBehavi
}
}
}
- else if (sub_8058F1C(currMetatileBehavior, 4) == 2
- || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(sub_8058F1C(currMetatileBehavior, 0)) == TRUE))
+ else if (GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 4) == 2
+ || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0)) == TRUE))
{
if (gWildMonHeaders[headerId].waterMonsInfo == NULL)
return FALSE;
- else if (previousMetatileBehavior != sub_8058F1C(currMetatileBehavior, 0) && !DoGlobalWildEncounterDiceRoll())
+ else if (previousMetatileBehavior != GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0) && !DoGlobalWildEncounterDiceRoll())
return FALSE;
else if (DoWildEncounterRateTest(gWildMonHeaders[headerId].waterMonsInfo->encounterRate, FALSE) != TRUE)
{
@@ -426,14 +426,14 @@ bool8 StandardWildEncounter(u32 currMetatileBehavior, u16 previousMetatileBehavi
return FALSE;
}
- BattleSetup_StartRoamerBattle();
+ StartRoamerBattle();
return TRUE;
}
else // try a regular surfing encounter
{
if (TryGenerateWildMon(gWildMonHeaders[headerId].waterMonsInfo, WILD_AREA_WATER, WILD_CHECK_REPEL) == TRUE)
{
- BattleSetup_StartWildBattle();
+ StartWildBattle();
return TRUE;
}
else
@@ -447,7 +447,7 @@ bool8 StandardWildEncounter(u32 currMetatileBehavior, u16 previousMetatileBehavi
return FALSE;
}
-void ScrSpecial_RockSmashWildEncounter(void)
+void RockSmashWildEncounter(void)
{
u16 headerIdx = GetCurrentMapWildMonHeaderId();
if (headerIdx == 0xFFFF)
@@ -458,7 +458,7 @@ void ScrSpecial_RockSmashWildEncounter(void)
gSpecialVar_Result = FALSE;
else if (TryGenerateWildMon(gWildMonHeaders[headerIdx].rockSmashMonsInfo, WILD_AREA_ROCKS, WILD_CHECK_REPEL) == TRUE)
{
- BattleSetup_StartWildBattle();
+ StartWildBattle();
gSpecialVar_Result = TRUE;
}
else
@@ -474,11 +474,11 @@ bool8 SweetScentWildEncounter(void)
headerId = GetCurrentMapWildMonHeaderId();
if (headerId != 0xFFFF)
{
- if (sub_8058F48(x, y, 4) == 1)
+ if (MapGridGetMetatileAttributeAt(x, y, 4) == 1)
{
if (TryStartRoamerEncounter() == TRUE)
{
- BattleSetup_StartRoamerBattle();
+ StartRoamerBattle();
return TRUE;
}
@@ -487,14 +487,14 @@ bool8 SweetScentWildEncounter(void)
TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, 0);
- BattleSetup_StartWildBattle();
+ StartWildBattle();
return TRUE;
}
- else if (sub_8058F48(x, y, 4) == 2)
+ else if (MapGridGetMetatileAttributeAt(x, y, 4) == 2)
{
if (TryStartRoamerEncounter() == TRUE)
{
- BattleSetup_StartRoamerBattle();
+ StartRoamerBattle();
return TRUE;
}
@@ -502,7 +502,7 @@ bool8 SweetScentWildEncounter(void)
return FALSE;
TryGenerateWildMon(gWildMonHeaders[headerId].waterMonsInfo, WILD_AREA_WATER, 0);
- BattleSetup_StartWildBattle();
+ StartWildBattle();
return TRUE;
}
}
@@ -524,7 +524,7 @@ void FishingWildEncounter(u8 rod)
{
GenerateFishingEncounter(gWildMonHeaders[GetCurrentMapWildMonHeaderId()].fishingMonsInfo, rod);
IncrementGameStat(GAME_STAT_FISHING_CAPTURES);
- BattleSetup_StartWildBattle();
+ StartWildBattle();
}
u16 GetLocalWildMon(bool8 *isWaterMon)
@@ -711,7 +711,7 @@ void ResetEncounterRateModifiers(void)
static bool8 HandleWildEncounterCooldown(u32 currMetatileBehavior)
{
- u8 unk = sub_8058F1C(currMetatileBehavior, 4);
+ u8 unk = GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 4);
u32 minSteps;
u32 encRate;
if (unk == 0)
@@ -763,19 +763,19 @@ bool8 TryStandardWildEncounter(u32 currMetatileBehavior)
{
if (!HandleWildEncounterCooldown(currMetatileBehavior))
{
- sWildEncounterData.prevMetatileBehavior = sub_8058F1C(currMetatileBehavior, 0);
+ sWildEncounterData.prevMetatileBehavior = GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0);
return FALSE;
}
else if (StandardWildEncounter(currMetatileBehavior, sWildEncounterData.prevMetatileBehavior) == TRUE)
{
sWildEncounterData.encounterRateBuff = 0;
sWildEncounterData.stepsSinceLastEncounter = 0;
- sWildEncounterData.prevMetatileBehavior = sub_8058F1C(currMetatileBehavior, 0);
+ sWildEncounterData.prevMetatileBehavior = GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0);
return TRUE;
}
else
{
- sWildEncounterData.prevMetatileBehavior = sub_8058F1C(currMetatileBehavior, 0);
+ sWildEncounterData.prevMetatileBehavior = GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0);
return FALSE;
}
}
diff --git a/src/wild_pokemon_area.c b/src/wild_pokemon_area.c
index 3c5afaf25..ccdd27b40 100644
--- a/src/wild_pokemon_area.c
+++ b/src/wild_pokemon_area.c
@@ -6,7 +6,7 @@
#include "overworld.h"
#include "pokedex_area_markers.h"
#include "constants/vars.h"
-#include "constants/region_map.h"
+#include "constants/region_map_sections.h"
#include "constants/species.h"
struct SeviiDexArea
@@ -244,7 +244,7 @@ static s32 CountRoamerNests(u16 species, struct Subsprite * subsprites)
roamerIdx = GetRoamerIndex(species);
if (roamerIdx < 0)
return 0;
- if (sRoamerPairs[roamerIdx].starter != ScrSpecial_GetStarter())
+ if (sRoamerPairs[roamerIdx].starter != GetStarterSpecies())
return 0;
roamerLocation = GetRoamerLocationMapSectionId();
dexAreaEntryLUTidx = 0;
diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c
index 9be2823aa..a284a6d16 100644
--- a/src/wireless_communication_status_screen.c
+++ b/src/wireless_communication_status_screen.c
@@ -13,40 +13,32 @@
#include "dynamic_placeholder_text_util.h"
#include "overworld.h"
#include "sound.h"
+#include "strings.h"
#include "menu.h"
#include "librfu.h"
#include "link_rfu.h"
#include "union_room.h"
#include "constants/songs.h"
+#include "constants/union_room.h"
struct WirelessCommunicationStatusScreenStruct
{
- u32 field_00[4];
- u32 field_10[4];
- u32 field_20[16];
- u8 field_60;
- u8 field_61;
+ u32 counts[4];
+ u32 lastCounts[4];
+ u32 activities[16];
+ u8 taskId;
+ u8 rfuTaskId;
u8 filler_62[0xA];
};
-struct WirelessCommunicationStatusScreenStruct * gUnknown_3002040;
+static struct WirelessCommunicationStatusScreenStruct * sWCSS;
-extern const u8 gUnknown_841E2B4[];
-extern const u8 gUnknown_841E2BF[];
-extern const u8 gUnknown_841E2C9[];
-extern const u8 gUnknown_841E2D4[];
-extern const u8 gUnknown_841E245[];
-extern const u8 gUnknown_841E263[];
-extern const u8 gUnknown_841E273[];
-extern const u8 gUnknown_841E284[];
-extern const u8 gUnknown_841E29E[];
+static void CB2_InitWirelessCommunicationScreen(void);
+static void Task_WirelessCommunicationScreen(u8 taskId);
+static void WCSS_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 palIdx);
+static bool32 UpdateCommunicationCounts(u32 * counts, u32 * lastCounts, u32 * activities, u8 taskId);
-void sub_814F1E4(void);
-void sub_814F46C(u8 taskId);
-void sub_814F65C(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 palIdx);
-bool32 sub_814F7E4(u32 * a0, u32 * a1, u32 * a2, u8 taskId);
-
-const u16 gUnknown_846F4D0[][16] = {
+static const u16 sWCSS_Palettes[][16] = {
INCBIN_U16("graphics/misc/unk_846f4d0.gbapal"),
INCBIN_U16("graphics/misc/unk_846f4f0.gbapal"),
INCBIN_U16("graphics/misc/unk_846f510.gbapal"),
@@ -65,10 +57,10 @@ const u16 gUnknown_846F4D0[][16] = {
INCBIN_U16("graphics/misc/unk_846f6b0.gbapal")
};
-const u32 gUnknown_846F6D0[] = INCBIN_U32("graphics/misc/unk_846f6d0.4bpp.lz");
-const u16 gUnknown_846F8E0[] = INCBIN_U16("graphics/misc/unk_846f8e0.bin");
+static const u32 sBgTilesGfx[] = INCBIN_U32("graphics/misc/unk_846f6d0.4bpp.lz");
+static const u16 sBgTilemap[] = INCBIN_U16("graphics/misc/unk_846f8e0.bin");
-const struct BgTemplate gUnknown_846FA74[] = {
+static const struct BgTemplate sBGTemplates[] = {
{
.bg = 0,
.charBaseIndex = 2,
@@ -88,7 +80,7 @@ const struct BgTemplate gUnknown_846FA74[] = {
}
};
-const struct WindowTemplate gUnknown_846FA7C[] = {
+static const struct WindowTemplate sWindowTemplates[] = {
{
.bg = 0x00,
.tilemapLeft = 0x03,
@@ -116,47 +108,51 @@ const struct WindowTemplate gUnknown_846FA7C[] = {
}, DUMMY_WIN_TEMPLATE
};
-const u8 *const gUnknown_846FA9C[] = {
+static const u8 *const gUnknown_846FA9C[] = {
gUnknown_841E2B4,
gUnknown_841E2BF,
gUnknown_841E2C9,
gUnknown_841E2D4
};
-const u8 *const gUnknown_846FAAC[] = {
- gUnknown_841E245,
- gUnknown_841E263,
- gUnknown_841E273,
- gUnknown_841E284,
- gUnknown_841E29E
+
+static const u8 *const sHeaderTextPtrs[] = {
+ gText_WirelessCommunicationStatus,
+ gText_PeopleTrading,
+ gText_PeopleBattling,
+ gText_PeopleInUnionRoom,
+ gText_PeopleCommunicating
};
-const u8 gUnknown_846FAC0[][3] = {
- {0x01, 0x01, 0x02},
- {0x02, 0x01, 0x02},
- {0x03, 0x01, 0x04},
- {0x04, 0x00, 0x02},
- {0x15, 0x03, 0x02},
- {0x16, 0x03, 0x02},
- {0x09, 0x04, 0x00},
- {0x0a, 0x04, 0x00},
- {0x0b, 0x04, 0x00},
- {0x0c, 0xff, 0x00},
- {0x0d, 0x00, 0x00},
- {0x0e, 0xff, 0x00},
- {0x0f, 0x04, 0x00},
- {0x10, 0xff, 0x00},
- {0x40, 0x02, 0x01},
- {0x41, 0x02, 0x02},
- {0x44, 0x02, 0x02},
- {0x45, 0x02, 0x00},
- {0x48, 0x02, 0x02},
- {0x54, 0x02, 0x01},
- {0x53, 0x02, 0x02},
- {0x51, 0x02, 0x01},
- {0x52, 0x02, 0x01}
+static const u8 sCountParams[][3] = {
+ // activity, count idx, by
+ // by=0 means count all
+ // UB: no check for count idx == -1
+ {ACTIVITY_BATTLE, 1, 2},
+ {ACTIVITY_DBLBATTLE, 1, 2},
+ {ACTIVITY_MLTBATTLE, 1, 4},
+ {ACTIVITY_TRADE, 0, 2},
+ {ACTIVITY_WCARD2, 3, 2},
+ {ACTIVITY_WNEWS2, 3, 2},
+ {ACTIVITY_PJUMP, 4, 0},
+ {ACTIVITY_BCRUSH, 4, 0},
+ {ACTIVITY_BPICK, 4, 0},
+ {ACTIVITY_SEARCH, -1, 0},
+ {ACTIVITY_SPINTRADE, 0, 0},
+ {ACTIVITY_ITEMTRADE, -1, 0},
+ {0x0f, 4, 0},
+ {0x10, -1, 0},
+ {0x40, 2, 1},
+ {ACTIVITY_BATTLE | 0x40, 2, 2},
+ {ACTIVITY_TRADE | 0x40, 2, 2},
+ {ACTIVITY_CHAT | 0x40, 2, 0},
+ {ACTIVITY_CARD | 0x40, 2, 2},
+ {20 | 0x40, 2, 1},
+ {19 | 0x40, 2, 2},
+ {ACTIVITY_ACCEPT | 0x40, 2, 1},
+ {ACTIVITY_DECLINE | 0x40, 2, 1}
};
-void sub_814F19C(void)
+static void CB2_RunWirelessCommunicationScreen(void)
{
if (!IsDma3ManagerBusyWithBgCopy())
{
@@ -168,50 +164,50 @@ void sub_814F19C(void)
}
}
-void sub_814F1C0(void)
+static void VBlankCB_WirelessCommunicationScreen(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
-void sub_814F1D4(void)
+void ShowWirelessCommunicationScreen(void)
{
- SetMainCallback2(sub_814F1E4);
+ SetMainCallback2(CB2_InitWirelessCommunicationScreen);
}
-void sub_814F1E4(void)
+static void CB2_InitWirelessCommunicationScreen(void)
{
SetGpuReg(REG_OFFSET_DISPCNT, 0);
- gUnknown_3002040 = AllocZeroed(sizeof(*gUnknown_3002040));
+ sWCSS = AllocZeroed(sizeof(*sWCSS));
SetVBlankCallback(NULL);
- ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, gUnknown_846FA74, NELEMS(gUnknown_846FA74));
+ ResetBgsAndClearDma3BusyFlags(FALSE);
+ InitBgsFromTemplates(0, sBGTemplates, NELEMS(sBGTemplates));
SetBgTilemapBuffer(1, Alloc(0x800));
SetBgTilemapBuffer(0, Alloc(0x800));
- DecompressAndLoadBgGfxUsingHeap(1, gUnknown_846F6D0, 0, 0, 0);
- CopyToBgTilemapBuffer(1, gUnknown_846F8E0, 0, 0);
- InitWindows(gUnknown_846FA7C);
+ DecompressAndLoadBgGfxUsingHeap(1, sBgTilesGfx, 0, 0, 0);
+ CopyToBgTilemapBuffer(1, sBgTilemap, 0, 0);
+ InitWindows(sWindowTemplates);
DeactivateAllTextPrinters();
ResetPaletteFade();
ResetSpriteData();
ResetTasks();
ScanlineEffect_Stop();
m4aSoundVSyncOn();
- SetVBlankCallback(sub_814F1C0);
- gUnknown_3002040->field_60 = CreateTask(sub_814F46C, 0);
- gUnknown_3002040->field_61 = sub_8116DE0();
- gUnknown_3002040->field_10[3] = 1;
+ SetVBlankCallback(VBlankCB_WirelessCommunicationScreen);
+ sWCSS->taskId = CreateTask(Task_WirelessCommunicationScreen, 0);
+ sWCSS->rfuTaskId = CreateTask_ListenToWireless();
+ sWCSS->lastCounts[3] = 1;
ChangeBgX(0, 0, 0);
ChangeBgY(0, 0, 0);
ChangeBgX(1, 0, 0);
ChangeBgY(1, 0, 0);
- LoadPalette(gUnknown_846F4D0, 0, 0x20);
+ LoadPalette(sWCSS_Palettes, 0, 0x20);
Menu_LoadStdPalAt(0xf0);
DynamicPlaceholderTextUtil_Reset();
FillBgTilemapBufferRect(0, 0x000, 0, 0, 32, 32, 0xF);
CopyBgTilemapBufferToVram(1);
- SetMainCallback2(sub_814F19C);
+ SetMainCallback2(CB2_RunWirelessCommunicationScreen);
RunTasks();
RunTextPrinters();
AnimateSprites();
@@ -219,7 +215,7 @@ void sub_814F1E4(void)
UpdatePaletteFade();
}
-void sub_814F32C(void)
+static void ExitWirelessCommunicationStatusScreen(void)
{
s32 i;
@@ -228,55 +224,55 @@ void sub_814F32C(void)
{
Free(GetBgTilemapBuffer(i));
}
- Free(gUnknown_3002040);
+ Free(sWCSS);
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
-void sub_814F364(s16 * unk0, s16 * unk1)
+static void WCSS_CyclePalette(s16 * frameCtr_p, s16 * palIdx_p)
{
s32 idx;
- (*unk0)++;
- if (*unk0 > 5)
+ (*frameCtr_p)++;
+ if (*frameCtr_p > 5)
{
- (*unk1)++;
- if (*unk1 == 14)
+ (*palIdx_p)++;
+ if (*palIdx_p == 14)
{
- *unk1 = 0;
+ *palIdx_p = 0;
}
- *unk0 = 0;
+ *frameCtr_p = 0;
}
- idx = *unk1 + 2;
- LoadPalette(gUnknown_846F4D0[idx], 0, 16);
+ idx = *palIdx_p + 2;
+ LoadPalette(sWCSS_Palettes[idx], 0, 16);
}
-void sub_814F3A8(void)
+static void PrintHeaderTexts(void)
{
s32 i;
u32 width;
- FillWindowPixelBuffer(0, 0);
- FillWindowPixelBuffer(1, 0);
- FillWindowPixelBuffer(2, 0);
- width = 0xC0 - GetStringWidth(3, gUnknown_846FAAC[0], 0);
- sub_814F65C(0, 3, gUnknown_846FAAC[0], width / 2, 6, 3);
+ FillWindowPixelBuffer(0, PIXEL_FILL(0));
+ FillWindowPixelBuffer(1, PIXEL_FILL(0));
+ FillWindowPixelBuffer(2, PIXEL_FILL(0));
+ width = 0xC0 - GetStringWidth(3, sHeaderTextPtrs[0], 0);
+ WCSS_AddTextPrinterParameterized(0, 3, sHeaderTextPtrs[0], width / 2, 6, 3);
for (i = 0; i < 3; i++)
{
- sub_814F65C(1, 3, gUnknown_846FAAC[i + 1], 0, 30 * i + 10, 1);
+ WCSS_AddTextPrinterParameterized(1, 3, sHeaderTextPtrs[i + 1], 0, 30 * i + 10, 1);
}
- sub_814F65C(1, 3, gUnknown_846FAAC[i + 1], 0, 30 * i + 10, 2);
+ WCSS_AddTextPrinterParameterized(1, 3, sHeaderTextPtrs[i + 1], 0, 30 * i + 10, 2);
PutWindowTilemap(0);
CopyWindowToVram(0, 2);
PutWindowTilemap(1);
CopyWindowToVram(1, 2);
}
-void sub_814F46C(u8 taskId)
+static void Task_WirelessCommunicationScreen(u8 taskId)
{
s32 i;
switch (gTasks[taskId].data[0])
{
case 0:
- sub_814F3A8();
+ PrintHeaderTexts();
gTasks[taskId].data[0]++;
break;
case 1:
@@ -291,16 +287,16 @@ void sub_814F46C(u8 taskId)
gTasks[taskId].data[0]++;
break;
case 3:
- if (sub_814F7E4(gUnknown_3002040->field_00, gUnknown_3002040->field_10, gUnknown_3002040->field_20, gUnknown_3002040->field_61))
+ if (UpdateCommunicationCounts(sWCSS->counts, sWCSS->lastCounts, sWCSS->activities, sWCSS->rfuTaskId))
{
- FillWindowPixelBuffer(2, 0x00);
+ FillWindowPixelBuffer(2, PIXEL_FILL(0));
for (i = 0; i < 4; i++)
{
- ConvertIntToDecimalStringN(gStringVar4, gUnknown_3002040->field_00[i], STR_CONV_MODE_RIGHT_ALIGN, 2);
+ ConvertIntToDecimalStringN(gStringVar4, sWCSS->counts[i], STR_CONV_MODE_RIGHT_ALIGN, 2);
if (i != 3)
- sub_814F65C(2, 3, gStringVar4, 4, 30 * i + 10, 1);
+ WCSS_AddTextPrinterParameterized(2, 3, gStringVar4, 4, 30 * i + 10, 1);
else
- sub_814F65C(2, 3, gStringVar4, 4, 100, 2);
+ WCSS_AddTextPrinterParameterized(2, 3, gStringVar4, 4, 100, 2);
}
PutWindowTilemap(2);
CopyWindowToVram(2, 3);
@@ -308,10 +304,10 @@ void sub_814F46C(u8 taskId)
if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))
{
PlaySE(SE_SELECT);
- gTasks[gUnknown_3002040->field_61].data[15] = 0xFF;
+ gTasks[sWCSS->rfuTaskId].data[15] = 0xFF;
gTasks[taskId].data[0]++;
}
- sub_814F364(&gTasks[taskId].data[7], &gTasks[taskId].data[8]);
+ WCSS_CyclePalette(&gTasks[taskId].data[7], &gTasks[taskId].data[8]);
break;
case 4:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
@@ -320,117 +316,117 @@ void sub_814F46C(u8 taskId)
case 5:
if (!gPaletteFade.active)
{
- SetMainCallback2(sub_814F32C);
+ SetMainCallback2(ExitWirelessCommunicationStatusScreen);
DestroyTask(taskId);
}
break;
}
}
-void sub_814F65C(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 palIdx)
+static void WCSS_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 palIdx)
{
u8 textColor[3];
switch (palIdx)
{
case 0:
- textColor[0] = 0;
- textColor[1] = 2;
- textColor[2] = 3;
+ textColor[0] = TEXT_COLOR_TRANSPARENT;
+ textColor[1] = TEXT_COLOR_DARK_GREY;
+ textColor[2] = TEXT_COLOR_LIGHT_GREY;
break;
case 1:
- textColor[0] = 0;
- textColor[1] = 1;
- textColor[2] = 3;
+ textColor[0] = TEXT_COLOR_TRANSPARENT;
+ textColor[1] = TEXT_COLOR_WHITE;
+ textColor[2] = TEXT_COLOR_LIGHT_GREY;
break;
case 2:
- textColor[0] = 0;
- textColor[1] = 4;
- textColor[2] = 5;
+ textColor[0] = TEXT_COLOR_TRANSPARENT;
+ textColor[1] = TEXT_COLOR_RED;
+ textColor[2] = TEXT_COLOR_LIGHT_RED;
break;
case 3:
- textColor[0] = 0;
- textColor[1] = 7;
- textColor[2] = 6;
+ textColor[0] = TEXT_COLOR_TRANSPARENT;
+ textColor[1] = TEXT_COLOR_LIGHT_GREEN;
+ textColor[2] = TEXT_COLOR_GREEN;
break;
case 4:
- textColor[0] = 0;
- textColor[1] = 1;
- textColor[2] = 2;
+ textColor[0] = TEXT_COLOR_TRANSPARENT;
+ textColor[1] = TEXT_COLOR_WHITE;
+ textColor[2] = TEXT_COLOR_DARK_GREY;
break;
// default: UB
}
AddTextPrinterParameterized4(windowId, fontId,x, y, fontId == 0 ? 0 : 1, 0, textColor, -1, str);
}
-u32 sub_814F714(struct UnkStruct_x20 * unk20, u32 * arg1)
+static u32 CountMembersInGroup(struct UnkStruct_x20 * unk20, u32 * counts)
{
- u32 r8 = unk20->unk.gname.unk_0a_0;
+ u32 activity = unk20->gname_uname.gname.activity;
s32 i, j, k;
- for (i = 0; i < NELEMS(gUnknown_846FAC0); i++)
+ for (i = 0; i < NELEMS(sCountParams); i++)
{
- if (r8 == gUnknown_846FAC0[i][0] && unk20->field_1A_0 == 1)
+ if (activity == sCountParams[i][0] && unk20->groupScheduledAnim == UNION_ROOM_SPAWN_IN)
{
- if (gUnknown_846FAC0[i][2] == 0)
+ if (sCountParams[i][2] == 0)
{
k = 0;
- for (j = 0; j < 4; j++)
+ for (j = 0; j < RFU_CHILD_MAX; j++)
{
- if (unk20->unk.gname.unk_04[j] != 0) k++;
+ if (unk20->gname_uname.gname.child_sprite_gender[j] != 0) k++;
}
k++;
- arg1[gUnknown_846FAC0[i][1]] += k;
+ counts[sCountParams[i][1]] += k;
}
else
{
- arg1[gUnknown_846FAC0[i][1]] += gUnknown_846FAC0[i][2];
+ counts[sCountParams[i][1]] += sCountParams[i][2];
}
}
}
- return r8;
+ return activity;
}
-bool32 sub_814F7BC(const u32 * ptr0, const u32 * ptr1)
+static bool32 HaveCountsChanged(const u32 * newCounts, const u32 * prevCounts)
{
s32 i;
for (i = 0; i < 4; i++)
{
- if (ptr0[i] != ptr1[i])
+ if (newCounts[i] != prevCounts[i])
return TRUE;
}
return FALSE;
}
-bool32 sub_814F7E4(u32 * a0, u32 * a1, u32 * a2, u8 taskId)
+static bool32 UpdateCommunicationCounts(u32 * counts, u32 * lastCounts, u32 * activities, u8 taskId)
{
- bool32 r8 = FALSE;
- u32 sp0[4] = {0, 0, 0, 0};
+ bool32 activitiesUpdated = FALSE;
+ u32 buffer[4] = {0, 0, 0, 0};
struct UnkStruct_Group * group = (void *)gTasks[taskId].data;
s32 i;
for (i = 0; i < 16; i++)
{
- u32 r1 = sub_814F714(&group->field_0->arr[i], sp0);
- if (r1 != a2[i])
+ u32 activity = CountMembersInGroup(&group->field_0->arr[i], buffer);
+ if (activity != activities[i])
{
- a2[i] = r1;
- r8 = TRUE;
+ activities[i] = activity;
+ activitiesUpdated = TRUE;
}
}
- if (sub_814F7BC(sp0, a1) == FALSE)
+ if (HaveCountsChanged(buffer, lastCounts) == FALSE)
{
- if (r8 == TRUE)
+ if (activitiesUpdated == TRUE)
return TRUE;
else
return FALSE;
}
- memcpy(a0, sp0, sizeof(sp0));
- memcpy(a1, sp0, sizeof(sp0));
- a0[3] = a0[0] + a0[1] + a0[2];
+ memcpy(counts, buffer, sizeof(buffer));
+ memcpy(lastCounts, buffer, sizeof(buffer));
+ counts[3] = counts[0] + counts[1] + counts[2];
return TRUE;
}