summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2019-07-29 21:10:54 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2019-07-29 21:10:54 -0400
commite130a00cdf69c58dbff8e98a69559aeb33f87b60 (patch)
treee128e502a2229f5d934f0436a0eb31dc86350bbb /src
parentef4c86fbfdd18b78700f61b629907a85579197c0 (diff)
parentd4cc0e161bf103d3d3e01fefa02e867d4a2053c2 (diff)
Merge branch 'master' into slot_machine
Diffstat (limited to 'src')
-rw-r--r--src/bag.c29
-rw-r--r--src/battle_ai_script_commands.c340
-rw-r--r--src/battle_anim_mon_movement.c809
-rw-r--r--src/battle_records.c576
-rw-r--r--src/berry.c16
-rw-r--r--src/berry_fix_program.c191
-rw-r--r--src/berry_powder.c130
-rw-r--r--src/bg.c188
-rw-r--r--src/buy_menu_helpers.c216
-rw-r--r--src/cable_car_util.c38
-rw-r--r--src/cereader_tool.c88
-rw-r--r--src/coins.c17
-rw-r--r--src/data/battle_moves.h4617
-rw-r--r--src/data/items.json6062
-rw-r--r--src/data/items.json.txt31
-rw-r--r--src/data/pokemon/base_stats.h12031
-rw-r--r--src/data/pokemon/cry_ids.h140
-rw-r--r--src/data/pokemon/evolution.h187
-rw-r--r--src/data/pokemon/experience_tables.h844
-rw-r--r--src/data/pokemon/item_effects.h420
-rw-r--r--src/data/pokemon/level_up_learnset_pointers.h415
-rw-r--r--src/data/pokemon/level_up_learnsets.h5682
-rw-r--r--src/data/pokemon/tmhm_learnsets.h9388
-rw-r--r--src/data/pokemon/trainer_class_lookups.h308
-rw-r--r--src/daycare.c18
-rw-r--r--src/decompress.c662
-rw-r--r--src/diploma.c285
-rw-r--r--src/dma3_manager.c413
-rw-r--r--src/dynamic_placeholder_text_util.c70
-rw-r--r--src/egg_hatch.c878
-rw-r--r--src/ereader_helpers.c397
-rw-r--r--src/fame_checker.c61
-rw-r--r--src/field_poison.c117
-rw-r--r--src/field_special_scene.c26
-rw-r--r--src/fieldmap.c4
-rw-r--r--src/fldeff_dig.c48
-rw-r--r--src/fldeff_poison.c39
-rw-r--r--src/fldeff_rocksmash.c137
-rw-r--r--src/fldeff_softboiled.c111
-rw-r--r--src/fldeff_strength.c47
-rw-r--r--src/fldeff_sweetscent.c101
-rw-r--r--src/fldeff_teleport.c3
-rw-r--r--src/gpu_regs.c6
-rw-r--r--src/help_system.c1202
-rw-r--r--src/help_system_812B1E0.c1580
-rw-r--r--src/hof_pc.c53
-rw-r--r--src/intro.c2175
-rw-r--r--src/item.c684
-rw-r--r--src/item_menu_icons.c783
-rw-r--r--src/item_pc.c1150
-rw-r--r--src/item_use.c879
-rw-r--r--src/list_menu.c786
-rw-r--r--src/load_save.c15
-rw-r--r--src/mail_data.c186
-rw-r--r--src/main.c19
-rw-r--r--src/map_obj_lock.c6
-rw-r--r--src/menu.c878
-rw-r--r--src/menu2.c12
-rw-r--r--src/menu_helpers.c251
-rw-r--r--src/menu_indicators.c659
-rw-r--r--src/mevent.c160
-rw-r--r--src/mevent_8145654.c41
-rw-r--r--src/money.c13
-rw-r--r--src/multiboot.c416
-rw-r--r--src/mystery_event_script.c2
-rw-r--r--src/mystery_gift_menu.c16
-rw-r--r--src/new_menu_helpers.c765
-rw-r--r--src/oak_speech.c104
-rw-r--r--src/play_time.c65
-rw-r--r--src/pokemon.c2655
-rw-r--r--src/quest_log.c269
-rw-r--r--src/quest_log_8150454.c4
-rw-r--r--src/quest_log_battle.c6
-rw-r--r--src/reset_save_heap.c29
-rw-r--r--src/safari_zone.c80
-rw-r--r--src/save.c2
-rw-r--r--src/save_location.c108
-rw-r--r--src/scrcmd.c16
-rw-r--r--src/script.c2
-rw-r--r--src/seagallop.c4
-rw-r--r--src/slot_machine.c36
-rw-r--r--src/sound.c2
-rw-r--r--src/sprite.c114
-rw-r--r--src/ss_anne.c200
-rw-r--r--src/teachy_tv.c1416
-rw-r--r--src/text.c5
-rw-r--r--src/text_window.c26
-rw-r--r--src/text_window_graphics.c12
-rw-r--r--src/tm_case.c168
-rw-r--r--src/trainer_pokemon_sprites.c4
-rw-r--r--src/trainer_tower.c171
-rw-r--r--src/unk_8159F40.c4
-rw-r--r--src/unk_815C980.c5
-rw-r--r--src/unk_815F138.c322
-rw-r--r--src/vs_seeker.c2
-rw-r--r--src/window.c738
-rw-r--r--src/wireless_communication_status_screen.c8
97 files changed, 62162 insertions, 3332 deletions
diff --git a/src/bag.c b/src/bag.c
index acfeddc60..a63f57702 100644
--- a/src/bag.c
+++ b/src/bag.c
@@ -6,6 +6,7 @@
#include "window.h"
#include "text_window.h"
#include "menu_helpers.h"
+#include "new_menu_helpers.h"
#include "menu.h"
#include "money.h"
#include "bag.h"
@@ -210,16 +211,16 @@ void sub_810B858(void)
else
InitWindows(gUnknown_84530E4);
DeactivateAllTextPrinters();
- sub_815001C(0, 0x64, 0xE0);
- sub_814FEAC(0, 0x6D, 0xD0);
- sub_814FF2C(0, 0x81, 0xC0);
+ TextWindow_SetUserSelectedFrame(0, 0x64, 0xE0);
+ TextWindow_LoadResourcesStdFrame0(0, 0x6D, 0xD0);
+ TextWindow_SetStdFrame0_WithPal(0, 0x81, 0xC0);
LoadPalette(gUnknown_8453098, 0xF0, 0x20);
for (i = 0; i < 3; i++)
{
FillWindowPixelBuffer(i, 0x00);
PutWindowTilemap(i);
}
- schedule_bg_copy_tilemap_to_vram(0);
+ ScheduleBgCopyTilemapToVram(0);
for (i = 0; i < 11; i++)
{
gUnknown_203AD34[i] = 0xFF;
@@ -228,19 +229,19 @@ void sub_810B858(void)
void sub_810B8F0(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, s8 speed, u8 colorIdx)
{
- AddTextPrinterParametrized2(windowId, fontId, x, y, letterSpacing, lineSpacing, &gUnknown_84530B8[colorIdx], speed, str);
+ AddTextPrinterParameterized4(windowId, fontId, x, y, letterSpacing, lineSpacing, &gUnknown_84530B8[colorIdx], speed, str);
}
void sub_810B958(const u8 * str)
{
u32 x = 0x48 - GetStringWidth(1, str, 0);
- box_print(2, 1, x / 2, 1, &gUnknown_84530B8[0], 0, str);
+ AddTextPrinterParameterized3(2, 1, x / 2, 1, &gUnknown_84530B8[0], 0, str);
}
void sub_810B994(void)
{
u32 x;
- SetWindowBorderStyle(2, FALSE, 0x081, 0x0C);
+ DrawStdFrameWithCustomTileAndPalette(2, FALSE, 0x081, 0x0C);
x = 0x40 - GetStringWidth(0, gText_DepositItem, 0);
AddTextPrinterParameterized(2, 0, gText_DepositItem, x / 2, 1, 0, NULL);
}
@@ -252,23 +253,23 @@ u8 sub_810B9DC(u8 a0, u8 a1)
gUnknown_203AD34[a0] = AddWindow(&gUnknown_8453104[a0 + a1]);
if (a0 != 6)
{
- SetWindowBorderStyle(gUnknown_203AD34[a0], FALSE, 0x064, 0x0E);
+ DrawStdFrameWithCustomTileAndPalette(gUnknown_203AD34[a0], FALSE, 0x064, 0x0E);
}
else
{
- SetWindowBorderStyle(gUnknown_203AD34[a0], FALSE, 0x081, 0x0C);
+ DrawStdFrameWithCustomTileAndPalette(gUnknown_203AD34[a0], FALSE, 0x081, 0x0C);
}
- schedule_bg_copy_tilemap_to_vram(0);
+ ScheduleBgCopyTilemapToVram(0);
}
return gUnknown_203AD34[a0];
}
void sub_810BA3C(u8 a0)
{
- sub_810F4D8(gUnknown_203AD34[a0], FALSE);
+ ClearStdWindowAndFrameToTransparent(gUnknown_203AD34[a0], FALSE);
ClearWindowTilemap(gUnknown_203AD34[a0]);
RemoveWindow(gUnknown_203AD34[a0]);
- schedule_bg_copy_tilemap_to_vram(0);
+ ScheduleBgCopyTilemapToVram(0);
gUnknown_203AD34[a0] = 0xFF;
}
@@ -285,11 +286,11 @@ void sub_810BA9C(u8 a0)
{
if (gUnknown_203AD34[a0] != 0xFF)
{
- sub_810F260(gUnknown_203AD34[a0], FALSE);
+ ClearDialogWindowAndFrameToTransparent(gUnknown_203AD34[a0], FALSE);
ClearWindowTilemap(gUnknown_203AD34[a0]);
RemoveWindow(gUnknown_203AD34[a0]);
PutWindowTilemap(1);
- schedule_bg_copy_tilemap_to_vram(0);
+ ScheduleBgCopyTilemapToVram(0);
gUnknown_203AD34[a0] = 0xFF;
}
diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c
index 6343b55cd..1650f1056 100644
--- a/src/battle_ai_script_commands.c
+++ b/src/battle_ai_script_commands.c
@@ -6,6 +6,7 @@
#include "constants/abilities.h"
#include "constants/battle_ai.h"
#include "constants/battle_move_effects.h"
+#include "constants/moves.h"
extern u16 Random(void);
extern void sub_80C7164(void);
@@ -230,10 +231,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] =
BattleAICmd_if_not_taunted, // 0x5D
};
-#ifdef NONMATCHING
-static
-#endif
-const u16 sDiscouragedPowerfulMoveEffects[] =
+static const u16 sDiscouragedPowerfulMoveEffects[] =
{
EFFECT_EXPLOSION,
EFFECT_DREAM_EATER,
@@ -970,331 +968,69 @@ static void BattleAICmd_get_move_power(void)
gAIScriptPtr += 1;
}
-// still a nonmatching
-#ifdef NONMATCHING
static void BattleAICmd_is_most_powerful_move(void)
{
- int i, j;
- s32 damages[MAX_MON_MOVES];
+ s32 i, checkedMove;
+ s32 moveDmgs[4];
for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
+ {
if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sDiscouragedPowerfulMoveEffects[i])
break;
+ }
if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1
- && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF)
+ && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF)
{
gDynamicBasePower = 0;
- eDynamicMoveType = 0;
- eDmgMultiplier = 1;
+ gBattleStruct->dynamicMoveType = 0;
+ gBattleScripting.dmgMultiplier = 1;
gMoveResultFlags = 0;
gCritMultiplier = 1;
- for (i = 0; i < MAX_MON_MOVES; i++)
+ for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++)
{
- for (j = 0; sDiscouragedPowerfulMoveEffects[j] != 0xFFFF; j++)
- { // _08108276
- if (gBattleMoves[gBattleMons[gBankAttacker].moves[i]].effect == sDiscouragedPowerfulMoveEffects[j])
+ for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
+ {
+ if (gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].effect == sDiscouragedPowerfulMoveEffects[i])
break;
}
- // _081082BA
- if (gBattleMons[gBankAttacker].moves[i]
- && sDiscouragedPowerfulMoveEffects[j] == 0xFFFF
- && gBattleMoves[gBattleMons[gBankAttacker].moves[i]].power > 1)
+ if (gBattleMons[sBattler_AI].moves[checkedMove] != MOVE_NONE
+ && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF
+ && gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].power > 1)
{
- gCurrentMove = gBattleMons[gBankAttacker].moves[i];
- AI_CalcDmg(gBankAttacker, gBankTarget);
- TypeCalc(gCurrentMove, gBankAttacker, gBankTarget);
- damages[i] = (gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[i]) / 100;
-
- if (damages[i] == 0) // moves always do at least 1 damage.
- damages[i] = 1;
+ gCurrentMove = gBattleMons[sBattler_AI].moves[checkedMove];
+ AI_CalcDmg(sBattler_AI, gBattlerTarget);
+ TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget);
+ moveDmgs[checkedMove] = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[checkedMove] / 100;
+ if (moveDmgs[checkedMove] == 0)
+ moveDmgs[checkedMove] = 1;
}
else
{
- damages[i] = 0;
+ moveDmgs[checkedMove] = 0;
}
}
- for (i = 0; i < MAX_MON_MOVES; i++)
- if (damages[i] > damages[AI_THINKING_STRUCT->movesetIndex])
+ for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++)
+ {
+ if (moveDmgs[checkedMove] > moveDmgs[AI_THINKING_STRUCT->movesetIndex])
break;
+ }
- if (i == MAX_MON_MOVES)
- AI_THINKING_STRUCT->funcResult = 2;
+ if (checkedMove == MAX_MON_MOVES)
+ AI_THINKING_STRUCT->funcResult = MOVE_MOST_POWERFUL; // Is the most powerful.
else
- AI_THINKING_STRUCT->funcResult = 1;
+ AI_THINKING_STRUCT->funcResult = MOVE_NOT_MOST_POWERFUL; // Not the most powerful.
}
else
{
- AI_THINKING_STRUCT->funcResult = 0;
+ AI_THINKING_STRUCT->funcResult = MOVE_POWER_DISCOURAGED; // Highly discouraged in terms of power.
}
- gAIScriptPtr += 1;
+ gAIScriptPtr++;
}
-#else
-NAKED
-static void BattleAICmd_is_most_powerful_move(void)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- sub sp, 0x14\n\
- movs r3, 0\n\
- ldr r0, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
- ldrh r1, [r0]\n\
- ldr r5, _080C80A8 @ =0x0000ffff\n\
- ldr r6, _080C80AC @ =gBattleMoves\n\
- ldr r2, _080C80B0 @ =gBattleResources\n\
- cmp r1, r5\n\
- beq _080C7FA2\n\
- ldr r0, [r2]\n\
- ldr r0, [r0, 0x14]\n\
- ldrh r1, [r0, 0x2]\n\
- lsls r0, r1, 1\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- adds r0, r6\n\
- ldrb r4, [r0]\n\
- ldr r1, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
-_080C7F92:\n\
- ldrh r0, [r1]\n\
- cmp r4, r0\n\
- beq _080C7FA2\n\
- adds r1, 0x2\n\
- adds r3, 0x1\n\
- ldrh r0, [r1]\n\
- cmp r0, r5\n\
- bne _080C7F92\n\
-_080C7FA2:\n\
- ldr r0, [r2]\n\
- ldr r0, [r0, 0x14]\n\
- ldrh r1, [r0, 0x2]\n\
- lsls r0, r1, 1\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- adds r0, r6\n\
- ldrb r0, [r0, 0x1]\n\
- cmp r0, 0x1\n\
- bhi _080C7FB8\n\
- b _080C8142\n\
-_080C7FB8:\n\
- lsls r0, r3, 1\n\
- ldr r1, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
- adds r0, r1\n\
- ldrh r3, [r0]\n\
- ldr r0, _080C80A8 @ =0x0000ffff\n\
- cmp r3, r0\n\
- beq _080C7FC8\n\
- b _080C8142\n\
-_080C7FC8:\n\
- ldr r0, _080C80B4 @ =gDynamicBasePower\n\
- movs r1, 0\n\
- strh r1, [r0]\n\
- ldr r0, _080C80B8 @ =gBattleStruct\n\
- ldr r0, [r0]\n\
- strb r1, [r0, 0x13]\n\
- ldr r0, _080C80BC @ =gBattleScripting\n\
- movs r2, 0x1\n\
- strb r2, [r0, 0xE]\n\
- ldr r0, _080C80C0 @ =gMoveResultFlags\n\
- strb r1, [r0]\n\
- ldr r0, _080C80C4 @ =gCritMultiplier\n\
- strb r2, [r0]\n\
- movs r6, 0\n\
- mov r9, r3\n\
- ldr r2, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
- ldrh r2, [r2]\n\
- str r2, [sp, 0x10]\n\
-_080C7FEC:\n\
- movs r3, 0\n\
- ldr r5, _080C80C8 @ =gBattleMons\n\
- lsls r4, r6, 1\n\
- ldr r7, _080C80CC @ =sBattler_AI\n\
- lsls r0, r6, 2\n\
- mov r8, r0\n\
- adds r1, r6, 0x1\n\
- mov r10, r1\n\
- ldr r2, [sp, 0x10]\n\
- cmp r2, r9\n\
- beq _080C8030\n\
- ldr r2, _080C80AC @ =gBattleMoves\n\
- ldrb r1, [r7]\n\
- movs r0, 0x58\n\
- muls r0, r1\n\
- adds r0, r4, r0\n\
- adds r1, r5, 0\n\
- adds r1, 0xC\n\
- adds r0, r1\n\
- ldrh r1, [r0]\n\
- lsls r0, r1, 1\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- adds r0, r2\n\
- ldrb r2, [r0]\n\
- ldr r1, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
-_080C8020:\n\
- ldrh r0, [r1]\n\
- cmp r2, r0\n\
- beq _080C8030\n\
- adds r1, 0x2\n\
- adds r3, 0x1\n\
- ldrh r0, [r1]\n\
- cmp r0, r9\n\
- bne _080C8020\n\
-_080C8030:\n\
- ldrb r1, [r7]\n\
- movs r0, 0x58\n\
- muls r0, r1\n\
- adds r0, r4, r0\n\
- adds r1, r5, 0\n\
- adds r1, 0xC\n\
- adds r1, r0, r1\n\
- ldrh r0, [r1]\n\
- cmp r0, 0\n\
- beq _080C80DC\n\
- lsls r0, r3, 1\n\
- ldr r2, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\
- adds r0, r2\n\
- ldrh r0, [r0]\n\
- cmp r0, r9\n\
- bne _080C80DC\n\
- ldr r0, _080C80AC @ =gBattleMoves\n\
- ldrh r2, [r1]\n\
- lsls r1, r2, 1\n\
- adds r1, r2\n\
- lsls r1, 2\n\
- adds r1, r0\n\
- ldrb r0, [r1, 0x1]\n\
- cmp r0, 0x1\n\
- bls _080C80DC\n\
- ldr r5, _080C80D0 @ =gCurrentMove\n\
- strh r2, [r5]\n\
- ldrb r0, [r7]\n\
- ldr r4, _080C80D4 @ =gBattlerTarget\n\
- ldrb r1, [r4]\n\
- bl AI_CalcDmg\n\
- ldrh r0, [r5]\n\
- ldrb r1, [r7]\n\
- ldrb r2, [r4]\n\
- bl TypeCalc\n\
- mov r4, sp\n\
- add r4, r8\n\
- ldr r2, _080C80D8 @ =gBattleMoveDamage\n\
- ldr r0, _080C80B0 @ =gBattleResources\n\
- ldr r0, [r0]\n\
- ldr r0, [r0, 0x14]\n\
- adds r0, 0x18\n\
- adds r0, r6\n\
- ldrb r1, [r0]\n\
- ldr r0, [r2]\n\
- muls r0, r1\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- str r0, [r4]\n\
- cmp r0, 0\n\
- bne _080C80E4\n\
- movs r0, 0x1\n\
- str r0, [r4]\n\
- b _080C80E4\n\
- .align 2, 0\n\
-_080C80A4: .4byte sDiscouragedPowerfulMoveEffects\n\
-_080C80A8: .4byte 0x0000ffff\n\
-_080C80AC: .4byte gBattleMoves\n\
-_080C80B0: .4byte gBattleResources\n\
-_080C80B4: .4byte gDynamicBasePower\n\
-_080C80B8: .4byte gBattleStruct\n\
-_080C80BC: .4byte gBattleScripting\n\
-_080C80C0: .4byte gMoveResultFlags\n\
-_080C80C4: .4byte gCritMultiplier\n\
-_080C80C8: .4byte gBattleMons\n\
-_080C80CC: .4byte sBattler_AI\n\
-_080C80D0: .4byte gCurrentMove\n\
-_080C80D4: .4byte gBattlerTarget\n\
-_080C80D8: .4byte gBattleMoveDamage\n\
-_080C80DC:\n\
- mov r1, sp\n\
- add r1, r8\n\
- movs r0, 0\n\
- str r0, [r1]\n\
-_080C80E4:\n\
- mov r6, r10\n\
- cmp r6, 0x3\n\
- bgt _080C80EC\n\
- b _080C7FEC\n\
-_080C80EC:\n\
- movs r6, 0\n\
- ldr r2, _080C8130 @ =gBattleResources\n\
- ldr r0, [r2]\n\
- ldr r0, [r0, 0x14]\n\
- ldrb r0, [r0, 0x1]\n\
- lsls r0, 2\n\
- add r0, sp\n\
- ldr r1, [sp]\n\
- ldr r0, [r0]\n\
- ldr r5, _080C8134 @ =gAIScriptPtr\n\
- cmp r1, r0\n\
- bgt _080C8122\n\
- adds r4, r2, 0\n\
- mov r3, sp\n\
-_080C8108:\n\
- adds r3, 0x4\n\
- adds r6, 0x1\n\
- cmp r6, 0x3\n\
- bgt _080C8122\n\
- ldr r0, [r4]\n\
- ldr r0, [r0, 0x14]\n\
- ldrb r0, [r0, 0x1]\n\
- lsls r0, 2\n\
- add r0, sp\n\
- ldr r1, [r3]\n\
- ldr r0, [r0]\n\
- cmp r1, r0\n\
- ble _080C8108\n\
-_080C8122:\n\
- cmp r6, 0x4\n\
- bne _080C8138\n\
- ldr r0, [r2]\n\
- ldr r1, [r0, 0x14]\n\
- movs r0, 0x2\n\
- str r0, [r1, 0x8]\n\
- b _080C814C\n\
- .align 2, 0\n\
-_080C8130: .4byte gBattleResources\n\
-_080C8134: .4byte gAIScriptPtr\n\
-_080C8138:\n\
- ldr r0, [r2]\n\
- ldr r1, [r0, 0x14]\n\
- movs r0, 0x1\n\
- str r0, [r1, 0x8]\n\
- b _080C814C\n\
-_080C8142:\n\
- ldr r0, [r2]\n\
- ldr r1, [r0, 0x14]\n\
- movs r0, 0\n\
- str r0, [r1, 0x8]\n\
- ldr r5, _080C8164 @ =gAIScriptPtr\n\
-_080C814C:\n\
- ldr r0, [r5]\n\
- adds r0, 0x1\n\
- str r0, [r5]\n\
- add sp, 0x14\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_080C8164: .4byte gAIScriptPtr\n\
- .syntax divided\n");
-}
-#endif
static void BattleAICmd_get_move(void)
{
@@ -1434,28 +1170,28 @@ static void BattleAICmd_get_ability(void)
return;
}
- if (gBaseStats[gBattleMons[index].species].ability1 != ABILITY_NONE)
+ if (gBaseStats[gBattleMons[index].species].abilities[0] != ABILITY_NONE)
{
- if (gBaseStats[gBattleMons[index].species].ability2 != ABILITY_NONE)
+ if (gBaseStats[gBattleMons[index].species].abilities[1] != ABILITY_NONE)
{
// AI has no knowledge of opponent, so it guesses which ability.
if (Random() % 2)
{
- AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability1;
+ AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].abilities[0];
}
else
{
- AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability2;
+ AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].abilities[1];
}
}
else
{
- AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability1; // it's definitely ability 1.
+ AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].abilities[0]; // it's definitely ability 1.
}
}
else
{
- AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability.
+ AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].abilities[1]; // AI cant actually reach this part since every mon has at least 1 ability.
}
}
else
diff --git a/src/battle_anim_mon_movement.c b/src/battle_anim_mon_movement.c
new file mode 100644
index 000000000..27e6ef28c
--- /dev/null
+++ b/src/battle_anim_mon_movement.c
@@ -0,0 +1,809 @@
+#include "global.h"
+#include "battle.h"
+#include "battle_anim.h"
+#include "task.h"
+#include "trig.h"
+
+#define abs(x) ((x) < 0 ? -(x) : (x))
+
+void sub_8098A6C(u8 taskId);
+void sub_8098C08(u8 taskId);
+void sub_8098D54(u8 taskId);
+void sub_8098EF0(u8 taskId);
+void sub_8099004(u8 taskId);
+void sub_80990AC(struct Sprite * sprite);
+void sub_8099120(struct Sprite * sprite);
+void sub_8099144(struct Sprite * sprite);
+void sub_8099190(struct Sprite * sprite);
+void sub_80991B4(struct Sprite * sprite);
+void sub_8099270(struct Sprite * sprite);
+void sub_80992E0(struct Sprite * sprite);
+void sub_8099394(struct Sprite * sprite);
+void sub_809946C(struct Sprite * sprite);
+void sub_8099530(u8 taskId);
+void sub_8099594(u8 taskId);
+void sub_80996B8(u8 taskId);
+void sub_8099788(u8 taskId);
+void sub_8099908(u8 taskId);
+void sub_8099B54(u8 taskId);
+void sub_8099CB8(u8 taskId);
+
+const struct SpriteTemplate gUnknown_83D4E4C[] = {
+ {
+ 0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_80990AC
+ }, {
+ 0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_8099144
+ }, {
+ 0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_80991B4
+ }, {
+ 0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_80992E0
+ }, {
+ 0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_8099394
+ }
+};
+
+void sub_80989F8(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+
+ if (spriteId == 0xFF)
+ DestroyAnimVisualTask(taskId);
+ else
+ {
+ gSprites[spriteId].pos2.x = gBattleAnimArgs[1];
+ gSprites[spriteId].pos2.y = gBattleAnimArgs[2];
+ gTasks[taskId].data[0] = spriteId;
+ gTasks[taskId].data[1] = gBattleAnimArgs[3];
+ gTasks[taskId].data[2] = gBattleAnimArgs[4];
+ gTasks[taskId].data[3] = gBattleAnimArgs[4];
+ gTasks[taskId].data[4] = gBattleAnimArgs[1];
+ gTasks[taskId].data[5] = gBattleAnimArgs[2];
+ gTasks[taskId].func = sub_8098A6C;
+ gTasks[taskId].func(taskId);
+ }
+}
+
+void sub_8098A6C(u8 taskId)
+{
+ if (gTasks[taskId].data[3] == 0)
+ {
+ if (gSprites[gTasks[taskId].data[0]].pos2.x == 0)
+ gSprites[gTasks[taskId].data[0]].pos2.x = gTasks[taskId].data[4];
+ else
+ gSprites[gTasks[taskId].data[0]].pos2.x = 0;
+ if (gSprites[gTasks[taskId].data[0]].pos2.y == 0)
+ gSprites[gTasks[taskId].data[0]].pos2.y = gTasks[taskId].data[5];
+ else
+ gSprites[gTasks[taskId].data[0]].pos2.y = 0;
+ gTasks[taskId].data[3] = gTasks[taskId].data[2];
+ if (--gTasks[taskId].data[1] == 0)
+ {
+ gSprites[gTasks[taskId].data[0]].pos2.x = 0;
+ gSprites[gTasks[taskId].data[0]].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+ else
+ gTasks[taskId].data[3]--;
+}
+
+void sub_8098B1C(u8 taskId)
+{
+ bool8 abort = FALSE;
+ u8 spriteId;
+ u8 battlerId;
+
+ if (gBattleAnimArgs[0] < MAX_BATTLERS_COUNT)
+ {
+ spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ if (spriteId == 0xFF)
+ abort = TRUE;
+ }
+ else if (gBattleAnimArgs[0] != 8)
+ {
+ switch (gBattleAnimArgs[0])
+ {
+ case 4:
+ battlerId = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
+ break;
+ case 5:
+ battlerId = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
+ break;
+ case 6:
+ battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ break;
+ default:
+ battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
+ break;
+ }
+ if (!sub_8072DF0(battlerId))
+ abort = TRUE;
+ spriteId = gBattlerSpriteIds[battlerId];
+ }
+ else
+ spriteId = gBattlerSpriteIds[gBattleAnimAttacker];
+ if (abort)
+ DestroyAnimVisualTask(taskId);
+ else
+ {
+ gSprites[spriteId].pos2.x = gBattleAnimArgs[1];
+ gSprites[spriteId].pos2.y = gBattleAnimArgs[2];
+ gTasks[taskId].data[0] = spriteId;
+ gTasks[taskId].data[1] = gBattleAnimArgs[3];
+ gTasks[taskId].data[2] = gBattleAnimArgs[4];
+ gTasks[taskId].data[3] = gBattleAnimArgs[4];
+ gTasks[taskId].data[4] = gBattleAnimArgs[1];
+ gTasks[taskId].data[5] = gBattleAnimArgs[2];
+ gTasks[taskId].func = sub_8098C08;
+ gTasks[taskId].func(taskId);
+ }
+}
+
+void sub_8098C08(u8 taskId)
+{
+ if (gTasks[taskId].data[3] == 0)
+ {
+ if (gSprites[gTasks[taskId].data[0]].pos2.x == gTasks[taskId].data[4])
+ gSprites[gTasks[taskId].data[0]].pos2.x = -gTasks[taskId].data[4];
+ else
+ gSprites[gTasks[taskId].data[0]].pos2.x = gTasks[taskId].data[4];
+ if (gSprites[gTasks[taskId].data[0]].pos2.y == gTasks[taskId].data[5])
+ gSprites[gTasks[taskId].data[0]].pos2.y = -gTasks[taskId].data[5];
+ else
+ gSprites[gTasks[taskId].data[0]].pos2.y = gTasks[taskId].data[5];
+ gTasks[taskId].data[3] = gTasks[taskId].data[2];
+ if (--gTasks[taskId].data[1] == 0)
+ {
+ gSprites[gTasks[taskId].data[0]].pos2.x = 0;
+ gSprites[gTasks[taskId].data[0]].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+ else
+ gTasks[taskId].data[3]--;
+}
+
+void sub_8098CD0(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+
+ if (spriteId == 0xFF)
+ DestroyAnimVisualTask(taskId);
+ else
+ {
+ gSprites[spriteId].pos2.x += gBattleAnimArgs[1];
+ gSprites[spriteId].pos2.y += gBattleAnimArgs[2];
+ gTasks[taskId].data[0] = spriteId;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = gBattleAnimArgs[3];
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[4] = gBattleAnimArgs[4];
+ gTasks[taskId].data[5] = gBattleAnimArgs[1] * 2;
+ gTasks[taskId].data[6] = gBattleAnimArgs[2] * 2;
+ gTasks[taskId].func = sub_8098D54;
+ gTasks[taskId].func(taskId);
+ }
+}
+
+void sub_8098D54(u8 taskId)
+{
+ if (gTasks[taskId].data[3] == 0)
+ {
+ if (gTasks[taskId].data[1] & 1)
+ {
+ gSprites[gTasks[taskId].data[0]].pos2.x += gTasks[taskId].data[5];
+ gSprites[gTasks[taskId].data[0]].pos2.y += gTasks[taskId].data[6];
+ }
+ else
+ {
+ gSprites[gTasks[taskId].data[0]].pos2.x -= gTasks[taskId].data[5];
+ gSprites[gTasks[taskId].data[0]].pos2.y -= gTasks[taskId].data[6];
+ }
+ gTasks[taskId].data[3] = gTasks[taskId].data[4];
+ if (++gTasks[taskId].data[1] >= gTasks[taskId].data[2])
+ {
+ if (gTasks[taskId].data[1] & 1)
+ {
+ gSprites[gTasks[taskId].data[0]].pos2.x += gTasks[taskId].data[5] / 2;
+ gSprites[gTasks[taskId].data[0]].pos2.y += gTasks[taskId].data[6] / 2;
+ }
+ else
+ {
+ gSprites[gTasks[taskId].data[0]].pos2.x -= gTasks[taskId].data[5] / 2;
+ gSprites[gTasks[taskId].data[0]].pos2.y -= gTasks[taskId].data[6] / 2;
+ }
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+ else
+ gTasks[taskId].data[3]--;
+}
+
+void sub_8098E90(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+
+ gSprites[spriteId].pos2.x = gBattleAnimArgs[1];
+ gTasks[taskId].data[0] = spriteId;
+ gTasks[taskId].data[1] = gBattleAnimArgs[1];
+ gTasks[taskId].data[2] = gBattleAnimArgs[2];
+ gTasks[taskId].data[3] = gBattleAnimArgs[3];
+ gTasks[taskId].data[4] = gBattleAnimArgs[4];
+ gTasks[taskId].func = sub_8098EF0;
+ gTasks[taskId].func(taskId);
+}
+
+void sub_8098EF0(u8 taskId)
+{
+ u8 spriteId = gTasks[taskId].data[0];
+ s16 data1 = gTasks[taskId].data[1];
+ if (gTasks[taskId].data[2] == gTasks[taskId].data[8]++)
+ {
+ gTasks[taskId].data[8] = 0;
+ if (gSprites[spriteId].pos2.x == data1)
+ data1 = -data1;
+ gSprites[spriteId].pos2.x += data1;
+ }
+ gTasks[taskId].data[1] = data1;
+ gTasks[taskId].data[9] += gTasks[taskId].data[3];
+ gSprites[spriteId].pos2.y = gTasks[taskId].data[9] >> 8;
+ if (--gTasks[taskId].data[4] == 0)
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_8098F84(u8 taskId)
+{
+ u8 r6 = 1;
+ u8 i;
+ u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ if (gBattleAnimArgs[4] > 5)
+ gBattleAnimArgs[4] = 5;
+ for (i = 0; i < gBattleAnimArgs[4]; i++)
+ r6 *= 2;
+ gTasks[taskId].data[0] = spriteId;
+ gTasks[taskId].data[1] = gBattleAnimArgs[1];
+ gTasks[taskId].data[2] = gBattleAnimArgs[2];
+ gTasks[taskId].data[3] = gBattleAnimArgs[3];
+ gTasks[taskId].data[4] = r6;
+ gTasks[taskId].func = sub_8099004;
+ gTasks[taskId].func(taskId);
+}
+
+void sub_8099004(u8 taskId)
+{
+ u8 spriteId = gTasks[taskId].data[0];
+ gSprites[spriteId].pos2.x = Sin(gTasks[taskId].data[5], gTasks[taskId].data[1]);
+ gSprites[spriteId].pos2.y = -Cos(gTasks[taskId].data[5], gTasks[taskId].data[2]);
+ gSprites[spriteId].pos2.y += gTasks[taskId].data[2];
+ gTasks[taskId].data[5] += gTasks[taskId].data[4];
+ gTasks[taskId].data[5] &= 0xFF;
+ if (gTasks[taskId].data[5] == 0)
+ gTasks[taskId].data[3]--;
+ if (gTasks[taskId].data[3] == 0)
+ {
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void sub_809907C(u8 taskId)
+{
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ sub_8098F84(taskId);
+}
+
+void sub_80990AC(struct Sprite * sprite)
+{
+ sprite->invisible = TRUE;
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ sprite->data[1] = -gBattleAnimArgs[1];
+ else
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[0];
+ sprite->data[2] = 0;
+ sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker];
+ sprite->data[4] = gBattleAnimArgs[0];
+ StoreSpriteCallbackInData6(sprite, sub_8099120);
+ sprite->callback = sub_8074DC4;
+}
+
+void sub_8099120(struct Sprite * sprite)
+{
+ sprite->data[0] = sprite->data[4];
+ sprite->data[1] = -sprite->data[1];
+ sprite->callback = sub_8074DC4;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+void sub_8099144(struct Sprite * sprite)
+{
+ u8 spriteId;
+ sprite->invisible = TRUE;
+ spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
+ sprite->data[0] = gBattleAnimArgs[0];
+ sprite->data[1] = 0;
+ sprite->data[2] = gBattleAnimArgs[1];
+ sprite->data[3] = spriteId;
+ sprite->data[4] = gBattleAnimArgs[0];
+ StoreSpriteCallbackInData6(sprite, sub_8099190);
+ sprite->callback = sub_8074DC4;
+}
+
+void sub_8099190(struct Sprite * sprite)
+{
+ sprite->data[0] = sprite->data[4];
+ sprite->data[2] = -sprite->data[2];
+ sprite->callback = sub_8074DC4;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+void sub_80991B4(struct Sprite * sprite)
+{
+ u8 spriteId;
+ if (gBattleAnimArgs[0] == 0)
+ spriteId = gBattlerSpriteIds[gBattleAnimAttacker];
+ else
+ spriteId = gBattlerSpriteIds[gBattleAnimTarget];
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
+ sprite->data[2] = gSprites[spriteId].pos1.x;
+ sprite->data[3] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
+ sprite->data[4] = gSprites[spriteId].pos1.y;
+ sub_80754B8(sprite);
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ sprite->data[5] = gSprites[spriteId].pos2.x;
+ sprite->data[6] = gSprites[spriteId].pos2.y;
+ sprite->invisible = TRUE;
+ if (gBattleAnimArgs[1] == 1)
+ sprite->data[2] = 0;
+ else if (gBattleAnimArgs[1] == 2)
+ sprite->data[1] = 0;
+ sprite->data[7] = gBattleAnimArgs[1];
+ sprite->data[7] |= spriteId << 8;
+ sprite->callback = sub_8099270;
+}
+
+void sub_8099270(struct Sprite * sprite)
+{
+ u8 data7 = sprite->data[7];
+ struct Sprite *otherSprite = &gSprites[sprite->data[7] >> 8];
+ if (sprite->data[0] == 0)
+ {
+ if (data7 == 1 || data7 == 0)
+ otherSprite->pos2.x = 0;
+ if (data7 == 2 || data7 == 0)
+ otherSprite->pos2.y = 0;
+ DestroyAnimSprite(sprite);
+ }
+ else
+ {
+ sprite->data[0]--;
+ sprite->data[3] += sprite->data[1];
+ sprite->data[4] += sprite->data[2];
+ otherSprite->pos2.x = (sprite->data[3] >> 8) + sprite->data[5];
+ otherSprite->pos2.y = (sprite->data[4] >> 8) + sprite->data[6];
+ }
+}
+
+void sub_80992E0(struct Sprite * sprite)
+{
+ u8 battlerId;
+ u8 spriteId;
+ if (gBattleAnimArgs[0] == 0)
+ battlerId = gBattleAnimAttacker;
+ else
+ battlerId = gBattleAnimTarget;
+ spriteId = gBattlerSpriteIds[battlerId];
+ if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ if (gBattleAnimArgs[3] == 1)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[1] = gSprites[spriteId].pos1.x;
+ sprite->data[2] = gSprites[spriteId].pos1.x + gBattleAnimArgs[1];
+ sprite->data[3] = gSprites[spriteId].pos1.y;
+ sprite->data[4] = gSprites[spriteId].pos1.y + gBattleAnimArgs[2];
+ sub_80754B8(sprite);
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ sprite->data[5] = spriteId;
+ sprite->invisible = TRUE;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ sprite->callback = sub_8074E14;
+}
+
+void sub_8099394(struct Sprite * sprite)
+{
+ u8 battlerId;
+ u8 spriteId;
+ sprite->invisible = TRUE;
+ if (gBattleAnimArgs[0] == 0)
+ battlerId = gBattleAnimAttacker;
+ else
+ battlerId = gBattleAnimTarget;
+ spriteId = gBattlerSpriteIds[battlerId];
+ if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ if (gBattleAnimArgs[3] == 1)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[1] = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
+ sprite->data[2] = sprite->data[1] + gBattleAnimArgs[1];
+ sprite->data[3] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
+ sprite->data[4] = sprite->data[3] + gBattleAnimArgs[2];
+ sub_80754B8(sprite);
+ sprite->data[3] = gSprites[spriteId].pos2.x << 8;
+ sprite->data[4] = gSprites[spriteId].pos2.y << 8;
+ sprite->data[5] = spriteId;
+ sprite->data[6] = gBattleAnimArgs[5];
+ if (gBattleAnimArgs[5] == 0)
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ else
+ StoreSpriteCallbackInData6(sprite, sub_809946C);
+ sprite->callback = sub_8074E14;
+}
+
+void sub_809946C(struct Sprite * sprite)
+{
+ gSprites[sprite->data[5]].pos2.x = 0;
+ gSprites[sprite->data[5]].pos2.y = 0;
+ DestroyAnimSprite(sprite);
+}
+
+void sub_809949C(u8 taskId)
+{
+ u16 r7 = 0x8000 / gBattleAnimArgs[3];
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ gBattleAnimArgs[5] = -gBattleAnimArgs[5];
+ }
+ gTasks[taskId].data[0] = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ gTasks[taskId].data[1] = gBattleAnimArgs[1] * 256 / gBattleAnimArgs[3];
+ gTasks[taskId].data[2] = gBattleAnimArgs[2];
+ gTasks[taskId].data[3] = gBattleAnimArgs[3];
+ gTasks[taskId].data[4] = gBattleAnimArgs[4];
+ gTasks[taskId].data[5] = gBattleAnimArgs[5] * 256 / gBattleAnimArgs[6];
+ gTasks[taskId].data[6] = gBattleAnimArgs[6];
+ gTasks[taskId].data[7] = r7;
+ gTasks[taskId].func = sub_8099530;
+}
+
+void sub_8099530(u8 taskId)
+{
+ u8 spriteId = gTasks[taskId].data[0];
+ gTasks[taskId].data[11] += gTasks[taskId].data[1];
+ gSprites[spriteId].pos2.x = gTasks[taskId].data[11] >> 8;
+ gSprites[spriteId].pos2.y = Sin((u8)(gTasks[taskId].data[10] >> 8), gTasks[taskId].data[2]);
+ gTasks[taskId].data[10] += gTasks[taskId].data[7];
+ if (--gTasks[taskId].data[3] == 0)
+ gTasks[taskId].func = sub_8099594;
+}
+
+void sub_8099594(u8 taskId)
+{
+ u8 spriteId;
+
+ if (gTasks[taskId].data[4] > 0)
+ gTasks[taskId].data[4]--;
+ else
+ {
+ spriteId = gTasks[taskId].data[0];
+ gTasks[taskId].data[12] += gTasks[taskId].data[5];
+ gSprites[spriteId].pos2.x = (gTasks[taskId].data[12] >> 8) + (gTasks[taskId].data[11] >> 8);
+ if (--gTasks[taskId].data[6] == 0)
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void sub_80995FC(u8 taskId)
+{
+ u8 spriteId;
+
+ switch (gBattleAnimArgs[0])
+ {
+ case 0:
+ case 1:
+ spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ break;
+ case 2:
+ if (!sub_8072DF0(gBattleAnimAttacker ^ BIT_FLANK))
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ spriteId = gBattlerSpriteIds[gBattleAnimAttacker ^ BIT_FLANK];
+ break;
+ case 3:
+ if (!sub_8072DF0(gBattleAnimTarget ^ BIT_FLANK))
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ spriteId = gBattlerSpriteIds[gBattleAnimTarget ^ BIT_FLANK];
+ break;
+ default:
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ gTasks[taskId].data[0] = spriteId;
+ if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)
+ gTasks[taskId].data[1] = gBattleAnimArgs[1];
+ else
+ gTasks[taskId].data[1] = -gBattleAnimArgs[1];
+ gTasks[taskId].func = sub_80996B8;
+}
+
+void sub_80996B8(u8 taskId)
+{
+ u8 spriteId = gTasks[taskId].data[0];
+ gSprites[spriteId].pos2.x += gTasks[taskId].data[1];
+ if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x < -0x20 || gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x > 0x110)
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_8099704(u8 taskId)
+{
+ u8 spriteId;
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ spriteId = GetAnimBankSpriteId(gBattleAnimArgs[4]);
+ gTasks[taskId].data[0] = gBattleAnimArgs[0];
+ gTasks[taskId].data[1] = gBattleAnimArgs[1];
+ gTasks[taskId].data[2] = gBattleAnimArgs[2];
+ gTasks[taskId].data[3] = gBattleAnimArgs[3];
+ gTasks[taskId].data[4] = spriteId;
+ if (gBattleAnimArgs[4] == 0)
+ gTasks[taskId].data[5] = gBattleAnimAttacker;
+ else
+ gTasks[taskId].data[5] = gBattleAnimTarget;
+ gTasks[taskId].data[12] = 1;
+ gTasks[taskId].func = sub_8099788;
+}
+
+void sub_8099788(u8 taskId)
+{
+ u8 spriteId;
+ u32 r8;
+ s16 r5;
+ u16 tmp;
+
+ spriteId = gTasks[taskId].data[4];
+ tmp = gTasks[taskId].data[10] + gTasks[taskId].data[2];
+ gTasks[taskId].data[10] = tmp;
+ r8 = tmp >> 8;
+ r5 = Sin(r8, gTasks[taskId].data[1]);
+ if (gTasks[taskId].data[0] == 0)
+ {
+ gSprites[spriteId].pos2.x = r5;
+ }
+ else if (GetBattlerSide(gTasks[taskId].data[5]) == B_SIDE_PLAYER)
+ {
+ gSprites[spriteId].pos2.y = abs(r5);
+ }
+ else
+ gSprites[spriteId].pos2.y = -abs(r5);
+ if ((r8 > 0x7F && gTasks[taskId].data[11] == 0 && gTasks[taskId].data[12] == 1) || (r8 < 0x7F && gTasks[taskId].data[11] == 1 && gTasks[taskId].data[12] == 0))
+ {
+ gTasks[taskId].data[11] ^= 1;
+ gTasks[taskId].data[12] ^= 1;
+ if (--gTasks[taskId].data[3] == 0)
+ {
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+}
+
+void sub_80998B0(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[3]);
+ sub_80758E0(spriteId, gBattleAnimArgs[4]);
+ gTasks[taskId].data[0] = gBattleAnimArgs[0];
+ gTasks[taskId].data[1] = gBattleAnimArgs[1];
+ gTasks[taskId].data[2] = gBattleAnimArgs[2];
+ gTasks[taskId].data[3] = gBattleAnimArgs[2];
+ gTasks[taskId].data[4] = spriteId;
+ gTasks[taskId].data[10] = 0x100;
+ gTasks[taskId].data[11] = 0x100;
+ gTasks[taskId].func = sub_8099908;
+}
+
+void sub_8099908(u8 taskId)
+{
+ u8 spriteId;
+ gTasks[taskId].data[10] += gTasks[taskId].data[0];
+ gTasks[taskId].data[11] += gTasks[taskId].data[1];
+ spriteId = gTasks[taskId].data[4];
+ obj_id_set_rotscale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[11], 0);
+ if (--gTasks[taskId].data[2] == 0)
+ {
+ if (gTasks[taskId].data[3] > 0)
+ {
+ gTasks[taskId].data[0] = -gTasks[taskId].data[0];
+ gTasks[taskId].data[1] = -gTasks[taskId].data[1];
+ gTasks[taskId].data[2] = gTasks[taskId].data[3];
+ gTasks[taskId].data[3] = 0;
+ }
+ else
+ {
+ sub_8075980(spriteId);
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+}
+
+void sub_8099980(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
+ sub_80758E0(spriteId, 0);
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = gBattleAnimArgs[0];
+ if (gBattleAnimArgs[3] != 1)
+ gTasks[taskId].data[3] = 0;
+ else
+ gTasks[taskId].data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1];
+ gTasks[taskId].data[4] = gBattleAnimArgs[1];
+ gTasks[taskId].data[5] = spriteId;
+ gTasks[taskId].data[6] = gBattleAnimArgs[3];
+ if (sub_8073788())
+ gTasks[taskId].data[7] = 1;
+ else
+ {
+ if (gBattleAnimArgs[2] == 0)
+ gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : 0;
+ else
+ gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER ? 1 : 0;
+ }
+ if (gTasks[taskId].data[7] && !sub_8073788())
+ {
+ s16 tmp;
+ tmp = gTasks[taskId].data[3];
+ gTasks[taskId].data[3] = -tmp;
+ tmp = gTasks[taskId].data[4];
+ gTasks[taskId].data[4] = -tmp;
+ }
+ gTasks[taskId].func = sub_8099B54;
+}
+
+void sub_8099A78(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
+ sub_80758E0(spriteId, 0);
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = gBattleAnimArgs[0];
+ if (gBattleAnimArgs[2] == 0)
+ {
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ }
+ else
+ {
+ if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ }
+ if (gBattleAnimArgs[3] != 1)
+ gTasks[taskId].data[3] = 0;
+ else
+ gTasks[taskId].data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1];
+ gTasks[taskId].data[4] = gBattleAnimArgs[1];
+ gTasks[taskId].data[5] = spriteId;
+ gTasks[taskId].data[6] = gBattleAnimArgs[3];
+ gTasks[taskId].data[7] = 1;
+ if (gTasks[taskId].data[7] )
+ {
+ s16 tmp;
+ tmp = gTasks[taskId].data[3];
+ gTasks[taskId].data[3] = -tmp;
+ tmp = gTasks[taskId].data[4];
+ gTasks[taskId].data[4] = -tmp;
+ }
+ gTasks[taskId].func = sub_8099B54;
+}
+
+void sub_8099B54(u8 taskId)
+{
+ s16 tmp;
+ gTasks[taskId].data[3] += gTasks[taskId].data[4];
+ obj_id_set_rotscale(gTasks[taskId].data[5], 0x100, 0x100, gTasks[taskId].data[3]);
+ if (gTasks[taskId].data[7])
+ sub_80759DC(gTasks[taskId].data[5]);
+ if (++gTasks[taskId].data[1] >= gTasks[taskId].data[2])
+ {
+ switch (gTasks[taskId].data[6])
+ {
+ case 1:
+ sub_8075980(gTasks[taskId].data[5]);
+ // fallthrough
+ case 0:
+ default:
+ DestroyAnimVisualTask(taskId);
+ break;
+ case 2:
+ gTasks[taskId].data[1] = 0;
+ tmp = gTasks[taskId].data[4];
+ gTasks[taskId].data[4] = -tmp;
+ gTasks[taskId].data[6] = 1;
+ break;
+ }
+ }
+}
+
+void sub_8099BD4(u8 taskId)
+{
+ if (gBattleAnimArgs[0] == 0)
+ {
+ gTasks[taskId].data[15] = gUnknown_2037EEC / 12;
+ if (gTasks[taskId].data[15] < 1)
+ gTasks[taskId].data[15] = 1;
+ if (gTasks[taskId].data[15] > 16)
+ gTasks[taskId].data[15] = 16;
+ }
+ else
+ {
+ gTasks[taskId].data[15] = gUnknown_2037EE8 / 12;
+ if (gTasks[taskId].data[15] < 1)
+ gTasks[taskId].data[15] = 1;
+ if (gTasks[taskId].data[15] > 16)
+ gTasks[taskId].data[15] = 16;
+ }
+ gTasks[taskId].data[14] = gTasks[taskId].data[15] / 2;
+ gTasks[taskId].data[13] = gTasks[taskId].data[14] + (gTasks[taskId].data[15] & 1);
+ gTasks[taskId].data[12] = 0;
+ gTasks[taskId].data[10] = gBattleAnimArgs[3];
+ gTasks[taskId].data[11] = gBattleAnimArgs[4];
+ gTasks[taskId].data[7] = GetAnimBankSpriteId(1);
+ gTasks[taskId].data[8] = gSprites[gTasks[taskId].data[7]].pos2.x;
+ gTasks[taskId].data[9] = gSprites[gTasks[taskId].data[7]].pos2.y;
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = gBattleAnimArgs[1];
+ gTasks[taskId].data[2] = gBattleAnimArgs[2];
+ gTasks[taskId].func = sub_8099CB8;
+}
+
+void sub_8099CB8(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ if (++task->data[0] > task->data[1])
+ {
+ task->data[0] = 0;
+ task->data[12] = (task->data[12] + 1) & 1;
+ if (task->data[10])
+ {
+ if (task->data[12])
+ {
+ gSprites[task->data[7]].pos2.x = task->data[8] + task->data[13];
+ }
+ else
+ {
+ gSprites[task->data[7]].pos2.x = task->data[8] - task->data[14];
+ }
+ }
+ if (task->data[11])
+ {
+ if (task->data[12])
+ {
+ gSprites[task->data[7]].pos2.y = task->data[15];
+ }
+ else
+ {
+ gSprites[task->data[7]].pos2.y = 0;
+ }
+ }
+ if (!--task->data[2])
+ {
+ gSprites[task->data[7]].pos2.x = 0;
+ gSprites[task->data[7]].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ }
+}
diff --git a/src/battle_records.c b/src/battle_records.c
new file mode 100644
index 000000000..79f29eb8a
--- /dev/null
+++ b/src/battle_records.c
@@ -0,0 +1,576 @@
+#include "global.h"
+#include "malloc.h"
+#include "main.h"
+#include "bg.h"
+#include "gpu_regs.h"
+#include "event_data.h"
+#include "palette.h"
+#include "task.h"
+#include "text.h"
+#include "window.h"
+#include "text_window.h"
+#include "battle.h"
+#include "trainer_tower.h"
+#include "trainer_pokemon_sprites.h"
+#include "scanline_effect.h"
+#include "sound.h"
+#include "string_util.h"
+#include "link.h"
+#include "menu.h"
+#include "overworld.h"
+#include "strings.h"
+#include "trainer_card.h"
+#include "constants/battle.h"
+#include "constants/songs.h"
+#include "constants/maps.h"
+
+static EWRAM_DATA u16 * sBg3TilemapBuffer_p = NULL;
+
+static void MainCB2_SetUp(void);
+static void VBlankCB(void);
+static void MainCB2(void);
+static void Task_WaitFadeIn(u8 taskId);
+static void Task_WaitButton(u8 taskId);
+static void Task_FadeOut(u8 taskId);
+static void Task_DestroyAndReturnToField(u8 taskId);
+static void ClearWindowCommitAndRemove(u8 winddowId);
+static void ResetGpu(void);
+static void StopAllRunningTasks(void);
+static void EnableDisplay(void);
+static void ResetBGPos(void);
+static void PrintBattleRecords(void);
+static void CommitWindow(u8 windowId);
+static void LoadFrameGfxOnBg(u8 bgId);
+
+static const u16 sTiles[] = INCBIN_U16("graphics/battle_records/bg_tiles.4bpp");
+static const u16 sPalette[] = INCBIN_U16("graphics/battle_records/palette.gbapal");
+static const u16 sTilemap[] = INCBIN_U16("graphics/battle_records/tilemap.bin");
+
+static const struct WindowTemplate sWindowTemplates[] = {
+ {
+ .bg = 0,
+ .tilemapLeft = 2,
+ .tilemapTop = 1,
+ .width = 27,
+ .height = 18,
+ .paletteNum = 0xF,
+ .baseBlock = 0x014
+ }, DUMMY_WIN_TEMPLATE
+};
+
+static const struct TextColor sTextColor = {
+ 0, 2, 3
+};
+
+static const struct BgTemplate sBgTemplates[2] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0, // 4bpp
+ .priority = 0,
+ .baseTile = 0x000
+ }, {
+ .bg = 3,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0, // 4bpp
+ .priority = 3,
+ .baseTile = 0x000
+ }
+};
+
+static u8 *const sStringVars[3] = {
+ gStringVar1,
+ gStringVar2,
+ gStringVar3
+};
+
+void Special_BattleRecords(void)
+{
+ SetVBlankCallback(NULL);
+ SetMainCallback2(MainCB2_SetUp);
+}
+
+static void MainCB2_SetUp(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ ResetGpu();
+ gMain.state++;
+ break;
+ case 1:
+ StopAllRunningTasks();
+ gMain.state++;
+ break;
+ case 2:
+ sBg3TilemapBuffer_p = AllocZeroed(0x800);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));
+ SetBgTilemapBuffer(3, sBg3TilemapBuffer_p);
+ ResetBGPos();
+ gMain.state++;
+ break;
+ case 3:
+ LoadFrameGfxOnBg(3);
+ LoadPalette(stdpal_get(0), 0xF0, 0x20);
+ gMain.state++;
+ break;
+ case 4:
+ if (IsDma3ManagerBusyWithBgCopy() != TRUE)
+ {
+ ShowBg(0);
+ ShowBg(3);
+ CopyBgTilemapBufferToVram(3);
+ gMain.state++;
+ }
+ break;
+ case 5:
+ InitWindows(sWindowTemplates);
+ DeactivateAllTextPrinters();
+ gMain.state++;
+ break;
+ case 6:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ gMain.state++;
+ break;
+ case 7:
+ EnableDisplay();
+ SetVBlankCallback(VBlankCB);
+ if (gSpecialVar_0x8004)
+ PrintTrainerTowerRecords();
+ else
+ PrintBattleRecords();
+ CreateTask(Task_WaitFadeIn, 8);
+ SetMainCallback2(MainCB2);
+ gMain.state = 0;
+ break;
+ }
+}
+
+static void VBlankCB(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void MainCB2(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void Task_WaitFadeIn(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ gTasks[taskId].func = Task_WaitButton;
+}
+
+static void Task_WaitButton(u8 taskId)
+{
+ struct Task * task = &gTasks[taskId];
+
+ if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ task->func = Task_FadeOut;
+ }
+}
+
+static void Task_FadeOut(u8 taskId)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gTasks[taskId].func = Task_DestroyAndReturnToField;
+}
+
+static void Task_DestroyAndReturnToField(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+ Free(sBg3TilemapBuffer_p);
+ ClearWindowCommitAndRemove(0);
+ FreeAllWindowBuffers();
+ DestroyTask(taskId);
+ }
+}
+
+static void ClearWindowCommitAndRemove(u8 windowId)
+{
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(0));
+ ClearWindowTilemap(windowId);
+ CopyWindowToVram(windowId, 2);
+ RemoveWindow(windowId);
+}
+
+static void ResetGpu(void)
+{
+ {
+ void * dest = (void *)VRAM;
+ u32 size = VRAM_SIZE;
+ DmaClearLarge16(3, dest, size, 0x1000);
+ }
+
+ {
+ void * dest = (void *)OAM;
+ u32 size = OAM_SIZE;
+ DmaClear32(3, dest, size);
+ }
+
+ {
+ void * dest = (void *)PLTT;
+ u32 size = PLTT_SIZE;
+ DmaClear16(3, dest, size);
+ }
+
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2CNT, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3CNT, 0);
+ SetGpuReg(REG_OFFSET_BG3HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+}
+
+static void StopAllRunningTasks(void)
+{
+ ScanlineEffect_Stop();
+ ResetTasks();
+ ResetSpriteData();
+ ResetAllPicSprites();
+ ResetPaletteFade();
+ FreeAllSpritePalettes();
+}
+
+static void EnableDisplay(void)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON);
+}
+
+static void ResetBGPos(void)
+{
+ 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);
+}
+
+static void InitLinkBattleRecord(struct LinkBattleRecord * record)
+{
+ CpuFill16(0, record, sizeof(*record));
+ record->name[0] = EOS;
+ record->trainerId = 0;
+ record->wins = 0;
+ record->losses = 0;
+ record->draws = 0;
+}
+
+static void InitLinkBattleRecords_(struct LinkBattleRecords * records)
+{
+ s32 i;
+
+ for (i = 0; i < LINK_B_RECORDS_COUNT; i++)
+ InitLinkBattleRecord(&records->entries[i]);
+ SetGameStat(GAME_STAT_LINK_BATTLE_WINS, 0);
+ SetGameStat(GAME_STAT_LINK_BATTLE_LOSSES, 0);
+ SetGameStat(GAME_STAT_LINK_BATTLE_DRAWS, 0);
+}
+
+static s32 GetLinkBattleRecordTotalBattles(struct LinkBattleRecord * record)
+{
+ return record->wins + record->losses + record->draws;
+}
+
+static s32 IndexOfOpponentLinkBattleRecord(struct LinkBattleRecords * records, const u8 * name, u16 trainerId)
+{
+ s32 i;
+
+ for (i = 0; i < LINK_B_RECORDS_COUNT; i++)
+ {
+ if (StringCompareN(records->entries[i].name, name, OT_NAME_LENGTH) == 0 && records->entries[i].trainerId == trainerId)
+ return i;
+ }
+
+ return LINK_B_RECORDS_COUNT;
+}
+
+static void SortLinkBattleRecords(struct LinkBattleRecords * records)
+{
+ struct LinkBattleRecord tmp;
+ s32 i;
+ s32 j;
+
+ for (i = LINK_B_RECORDS_COUNT - 1; i > 0; i--)
+ {
+ for (j = i - 1; j >= 0; j--)
+ {
+ if (GetLinkBattleRecordTotalBattles(&records->entries[i]) > GetLinkBattleRecordTotalBattles(&records->entries[j]))
+ {
+ tmp = records->entries[i];
+ records->entries[i] = records->entries[j];
+ records->entries[j] = tmp;
+ }
+ }
+ }
+}
+
+static void UpdateLinkBattleRecord(struct LinkBattleRecord * record, s32 outcome)
+{
+ switch (outcome)
+ {
+ case B_OUTCOME_WON:
+ record->wins++;
+ if (record->wins > 9999)
+ record->wins = 9999;
+ break;
+ case B_OUTCOME_LOST:
+ record->losses++;
+ if (record->losses > 9999)
+ record->losses = 9999;
+ break;
+ case B_OUTCOME_DREW:
+ record->draws++;
+ if (record->draws > 9999)
+ record->draws = 9999;
+ break;
+ }
+}
+
+static void UpdateLinkBattleGameStats(s32 outcome)
+{
+ u8 statId;
+
+ switch (outcome)
+ {
+ case B_OUTCOME_WON:
+ statId = GAME_STAT_LINK_BATTLE_WINS;
+ break;
+ case B_OUTCOME_LOST:
+ statId = GAME_STAT_LINK_BATTLE_LOSSES;
+ break;
+ case B_OUTCOME_DREW:
+ statId = GAME_STAT_LINK_BATTLE_DRAWS;
+ break;
+ default:
+ return;
+ }
+
+ if (GetGameStat(statId) < 9999)
+ IncrementGameStat(statId);
+}
+
+static void AddOpponentLinkBattleRecord(struct LinkBattleRecords * records, const u8 * name, u16 trainerId, s32 outcome, u32 language)
+{
+ u8 namebuf[OT_NAME_LENGTH + 1];
+ s32 i;
+ struct LinkBattleRecord * record;
+
+ if (language == LANGUAGE_JAPANESE)
+ {
+ namebuf[0] = EXT_CTRL_CODE_BEGIN;
+ namebuf[1] = EXT_CTRL_CODE_JPN;
+ StringCopy(&namebuf[2], name);
+ }
+ else
+ StringCopy(namebuf, name);
+ UpdateLinkBattleGameStats(outcome);
+ SortLinkBattleRecords(records);
+ i = IndexOfOpponentLinkBattleRecord(records, namebuf, trainerId);
+ if (i == LINK_B_RECORDS_COUNT)
+ {
+ i = LINK_B_RECORDS_COUNT - 1;
+ record = &records->entries[LINK_B_RECORDS_COUNT - 1];
+ InitLinkBattleRecord(record);
+ StringCopyN(record->name, namebuf, OT_NAME_LENGTH);
+ record->trainerId = trainerId;
+ }
+ UpdateLinkBattleRecord(&records->entries[i], outcome);
+ SortLinkBattleRecords(records);
+}
+
+void InitLinkBattleRecords(void)
+{
+ InitLinkBattleRecords_(&gSaveBlock2Ptr->linkBattleRecords);
+}
+
+static void IncTrainerCardWinCount(s32 battlerId)
+{
+ u16 *wins = &gTrainerCards[battlerId].linkBattleWins;
+ (*wins)++;
+ if (*wins > 9999)
+ *wins = 9999;
+}
+
+static void IncTrainerCardLossCount(s32 battlerId)
+{
+ u16 *losses = &gTrainerCards[battlerId].linkBattleLosses;
+ (*losses)++;
+ if (*losses > 9999)
+ *losses = 9999;
+}
+
+static void UpdateBattleOutcomeOnTrainerCards(s32 battlerId)
+{
+ switch (gBattleOutcome)
+ {
+ case B_OUTCOME_WON:
+ IncTrainerCardWinCount(battlerId ^ 1);
+ IncTrainerCardLossCount(battlerId);
+ break;
+ case B_OUTCOME_LOST:
+ IncTrainerCardLossCount(battlerId ^ 1);
+ IncTrainerCardWinCount(battlerId);
+ break;
+ }
+}
+
+void TryRecordLinkBattleOutcome(s32 battlerId)
+{
+ if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(UNKNOWN_MAP_00_04) || gSaveBlock1Ptr->location.mapNum != MAP_NUM(UNKNOWN_MAP_00_04))
+ {
+ UpdateBattleOutcomeOnTrainerCards(battlerId);
+ AddOpponentLinkBattleRecord(&gSaveBlock2Ptr->linkBattleRecords, gTrainerCards[battlerId].playerName, gTrainerCards[battlerId].trainerId, gBattleOutcome, gLinkPlayers[battlerId].language);
+ }
+}
+
+static void PrintTotalRecord(struct LinkBattleRecords * records)
+{
+ u32 nwins = GetGameStat(GAME_STAT_LINK_BATTLE_WINS);
+ u32 nlosses = GetGameStat(GAME_STAT_LINK_BATTLE_LOSSES);
+ u32 ndraws = GetGameStat(GAME_STAT_LINK_BATTLE_DRAWS);
+ s32 i;
+ s32 j;
+ bool32 foundEnd;
+ u8 * strvar;
+
+ if (nwins > 9999)
+ nwins = 9999;
+ if (nlosses > 9999)
+ nlosses = 9999;
+ if (ndraws > 9999)
+ ndraws = 9999;
+
+ ConvertIntToDecimalStringN(gStringVar1, nwins, STR_CONV_MODE_LEFT_ALIGN, 4);
+ ConvertIntToDecimalStringN(gStringVar2, nlosses, STR_CONV_MODE_LEFT_ALIGN, 4);
+ ConvertIntToDecimalStringN(gStringVar3, ndraws, STR_CONV_MODE_LEFT_ALIGN, 4);
+
+ for (i = 0; i < NELEMS(sStringVars); i++)
+ {
+ strvar = sStringVars[i];
+ foundEnd = FALSE;
+ for (j = 0; j < 4; j++)
+ {
+ if (!foundEnd && *strvar == EOS)
+ foundEnd = TRUE;
+ if (foundEnd)
+ *strvar = CHAR_SPACE;
+ strvar++;
+ }
+ *strvar = 0xFF;
+ }
+
+ StringExpandPlaceholders(gStringVar4, gString_BattleRecords_TotalRecord);
+ AddTextPrinterParameterized4(0, 2, 12, 24, 0, 2, &sTextColor, 0, gStringVar4);
+}
+
+static void PrintOpponentBattleRecord(struct LinkBattleRecord * record, u8 y)
+{
+ u8 i = 0;
+ s32 x;
+
+ if (record->wins == 0 && record->losses == 0 && record->draws == 0)
+ {
+ AddTextPrinterParameterized4(0, 2, 0, y, 0, 2, &sTextColor, 0, gString_BattleRecords_7Dashes);
+ for (i = 0; i < 3; i++)
+ {
+ if (i == 0)
+ x = 0x54;
+ else if (i == 1)
+ x = 0x84;
+ else
+ x = 0xB4;
+ AddTextPrinterParameterized4(0, 2, x, y, 0, 2, &sTextColor, 0, gString_BattleRecords_4Dashes);
+ }
+ }
+ else
+ {
+ for (i = 0; i < 4; i++)
+ {
+ if (i == 0)
+ {
+ x = 0;
+ StringFillWithTerminator(gStringVar1, OT_NAME_LENGTH + 1);
+ StringCopyN(gStringVar1, record->name, OT_NAME_LENGTH);
+ }
+ else if (i == 1)
+ {
+ x = 0x54;
+ ConvertIntToDecimalStringN(gStringVar1, record->wins, STR_CONV_MODE_RIGHT_ALIGN, 4);
+ }
+ else if (i == 2)
+ {
+ x = 0x84;
+ ConvertIntToDecimalStringN(gStringVar1, record->losses, STR_CONV_MODE_RIGHT_ALIGN, 4);
+ }
+ else
+ {
+ x = 0xB4;
+ ConvertIntToDecimalStringN(gStringVar1, record->draws, STR_CONV_MODE_RIGHT_ALIGN, 4);
+ }
+ AddTextPrinterParameterized4(0, 2, x, y, 0, 2, &sTextColor, 0, gStringVar1);
+ }
+ }
+}
+
+static void PrintBattleRecords(void)
+{
+ u32 left;
+ s32 i;
+
+ FillWindowPixelRect(0, PIXEL_FILL(0), 0, 0, 0xD8, 0x90);
+ StringExpandPlaceholders(gStringVar4, gString_BattleRecords_PlayersBattleResults);
+ left = 0xD0 - GetStringWidth(2, gStringVar4, -1);
+ AddTextPrinterParameterized4(0, 2, left / 2, 4, 0, 2, &sTextColor, 0, gStringVar4);
+ PrintTotalRecord(&gSaveBlock2Ptr->linkBattleRecords);
+ AddTextPrinterParameterized4(0, 2, 0x54, 0x30, 0, 2, &sTextColor, 0, gString_BattleRecords_ColumnHeaders);
+ for (i = 0; i < LINK_B_RECORDS_COUNT; i++)
+ PrintOpponentBattleRecord(&gSaveBlock2Ptr->linkBattleRecords.entries[i], 0x3D + 14 * i);
+ CommitWindow(0);
+}
+
+static void CommitWindow(u8 windowId)
+{
+ PutWindowTilemap(windowId);
+ CopyWindowToVram(windowId, 3);
+}
+
+static void LoadFrameGfxOnBg(u8 bg)
+{
+ LoadBgTiles(bg, sTiles, 0xC0, 0);
+ CopyToBgTilemapBufferRect(bg, sTilemap, 0, 0, 32, 32);
+ LoadPalette(sPalette, 0, 0x20);
+}
diff --git a/src/berry.c b/src/berry.c
index 5cbcd4e90..91d83f40c 100644
--- a/src/berry.c
+++ b/src/berry.c
@@ -5,7 +5,7 @@
extern const struct Berry sBerries[];
-#define ENIGMA_BERRY_STRUCT ({const struct Berry2 *berries = (const struct Berry2 *)sBerries;berries[ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY];})
+#define ENIGMA_BERRY_STRUCT ({const struct Berry2 *berries = (const struct Berry2 *)sBerries;berries[ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX];})
void sub_809C718(void)
{
@@ -136,10 +136,10 @@ bool32 IsEnigmaBerryValid(void)
const struct Berry * sub_809C8A0(u8 berryIdx)
{
- if (berryIdx == ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY + 1 && IsEnigmaBerryValid())
+ if (berryIdx == ITEM_TO_BERRY(ITEM_ENIGMA_BERRY) && IsEnigmaBerryValid())
return (struct Berry *)&gSaveBlock1Ptr->enigmaBerry.berry;
- if (berryIdx == 0 || berryIdx > ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY + 1)
+ if (berryIdx == 0 || berryIdx > ITEM_TO_BERRY(ITEM_ENIGMA_BERRY))
berryIdx = 1;
return &sBerries[berryIdx - 1];
@@ -147,18 +147,18 @@ const struct Berry * sub_809C8A0(u8 berryIdx)
u8 ItemIdToBerryType(u16 itemId)
{
- if (itemId - ITEM_CHERI_BERRY < 0 || itemId - ITEM_CHERI_BERRY > ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY)
+ if (itemId - FIRST_BERRY_INDEX < 0 || itemId - FIRST_BERRY_INDEX > ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX)
return 1;
- return itemId - ITEM_CHERI_BERRY + 1;
+ return ITEM_TO_BERRY(itemId);
}
u16 BerryTypeToItemId(u16 berryType)
{
- if (berryType - 1 < 0 || berryType - 1 > ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY)
- return ITEM_CHERI_BERRY;
+ if (berryType - 1 < 0 || berryType - 1 > ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX)
+ return FIRST_BERRY_INDEX;
- return berryType + ITEM_CHERI_BERRY - 1;
+ return berryType + FIRST_BERRY_INDEX - 1;
}
void GetBerryNameByBerryType(u8 berryType, u8 * dest)
diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c
new file mode 100644
index 000000000..f224bbc47
--- /dev/null
+++ b/src/berry_fix_program.c
@@ -0,0 +1,191 @@
+#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
+
+typedef struct {
+ u8 state;
+ u8 unk1;
+ u16 unk2;
+ struct MultiBootParam mb;
+} berryfix_t;
+
+// Static RAM declarations
+
+const void * gUnknown_3005EF0;
+int gUnknown_3005EF4;
+size_t gUnknown_3005EF8;
+struct MultiBootParam gUnknown_3005F00;
+
+// Static ROM declarations
+
+static void mb_berry_fix_maincb(void);
+static void mb_berry_fix_task(u8 taskId);
+
+// .rodata
+
+static const void *const gUnknown_847A890[][3] = {
+ {
+ gBerryFixGameboy_Gfx,
+ gBerryFixGameboy_Tilemap,
+ gBerryFixGameboy_Pal
+ }, {
+ gBerryFixGameboyLogo_Gfx,
+ gBerryFixGameboyLogo_Tilemap,
+ gBerryFixGameboyLogo_Pal
+ }, {
+ gBerryFixGbaTransfer_Gfx,
+ gBerryFixGbaTransfer_Tilemap,
+ gBerryFixGbaTransfer_Pal
+ }, {
+ gBerryFixGbaTransferHighlight_Gfx,
+ gBerryFixGbaTransferHighlight_Tilemap,
+ gBerryFixGbaTransferHighlight_Pal
+ }, {
+ gBerryFixGbaTransferError_Gfx,
+ gBerryFixGbaTransferError_Tilemap,
+ gBerryFixGbaTransferError_Pal
+ }, {
+ gBerryFixWindow_Gfx,
+ gBerryFixWindow_Tilemap,
+ gBerryFixWindow_Pal
+ },
+};
+
+extern const u8 gMultiBootProgram_BerryGlitchFix_Start[0x3BF4];
+extern const u8 gMultiBootProgram_BerryGlitchFix_End[];
+
+// .text
+
+static void mb_berry_fix_print(int scene)
+{
+ REG_DISPCNT = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BLDCNT = 0;
+ LZ77UnCompVram(gUnknown_847A890[scene][0], (void *)BG_CHAR_ADDR(0));
+ LZ77UnCompVram(gUnknown_847A890[scene][1], (void *)BG_SCREEN_ADDR(31));
+ CpuCopy16(gUnknown_847A890[scene][2], (void *)BG_PLTT, 0x200);
+ REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(31) | BGCNT_TXT256x256;
+ REG_DISPCNT = DISPCNT_BG0_ON;
+}
+
+void mb_berry_fix_serve(void) // noreturn
+{
+ u8 taskId;
+ DisableInterrupts(0xFFFF);
+ EnableInterrupts(INTR_FLAG_VBLANK);
+ m4aSoundVSyncOff();
+ SetVBlankCallback(NULL);
+ DmaFill32(3, 0, (void *)VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, (void *)PLTT, PLTT_SIZE);
+ ResetSpriteData();
+ ResetTasks();
+ ScanlineEffect_Stop();
+ gUnknown_3005ECC = 0;
+ taskId = CreateTask(mb_berry_fix_task, 0);
+ gTasks[taskId].data[0] = 0;
+ SetMainCallback2(mb_berry_fix_maincb);
+}
+
+static void mb_berry_fix_maincb(void)
+{
+ RunTasks();
+}
+
+static void mb_berry_fix_task(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ mb_berry_fix_print(5);
+ data[0] = 1;
+ break;
+ case 1:
+ if (JOY_NEW(A_BUTTON))
+ {
+ mb_berry_fix_print(0);
+ data[0] = 2;
+ }
+ break;
+ case 2:
+ if (JOY_NEW(A_BUTTON))
+ {
+ mb_berry_fix_print(1);
+ data[0] = 4;
+ }
+ break;
+ case 4:
+ gUnknown_3005EF0 = gMultiBootProgram_BerryGlitchFix_Start;
+ gUnknown_3005EF8 = gMultiBootProgram_BerryGlitchFix_End - gMultiBootProgram_BerryGlitchFix_Start;
+ gUnknown_3005F00.masterp = (void *)gMultiBootProgram_BerryGlitchFix_Start;
+ gUnknown_3005F00.server_type = MULTIBOOT_SERVER_TYPE_NORMAL;
+ MultiBootInit(&gUnknown_3005F00);
+ data[1] = 0;
+ data[0] = 5;
+ break;
+ case 5:
+ if (gUnknown_3005F00.probe_count == 0 && gUnknown_3005F00.response_bit & 0x2 && gUnknown_3005F00.client_bit & 0x2)
+ {
+ data[1]++;
+ if (data[1] > 180)
+ {
+ mb_berry_fix_print(2);
+ MultiBootStartMaster(&gUnknown_3005F00, gUnknown_3005EF0 + MULTIBOOT_HEADER_SIZE, gUnknown_3005EF8 - MULTIBOOT_HEADER_SIZE, 4, 1);
+ data[1] = 0;
+ data[0] = 6;
+ }
+ else
+ gUnknown_3005EF4 = MultiBootMain(&gUnknown_3005F00);
+ }
+ else
+ {
+ data[1] = 0;
+ gUnknown_3005EF4 = MultiBootMain(&gUnknown_3005F00);
+ }
+ break;
+ case 6:
+ gUnknown_3005EF4 = MultiBootMain(&gUnknown_3005F00);
+ if (MultiBootCheckComplete(&gUnknown_3005F00))
+ {
+ mb_berry_fix_print(3);
+ data[0] = 7;
+ }
+ else if (!(gUnknown_3005F00.client_bit & 2))
+ data[0] = 9;
+ break;
+ case 7:
+ data[0] = 8;
+ break;
+ case 8:
+ if (JOY_NEW(A_BUTTON))
+ {
+ DestroyTask(taskId);
+ DoSoftReset();
+ }
+ break;
+ case 9:
+ mb_berry_fix_print(4);
+ data[0] = 10;
+ break;
+ case 10:
+ if (JOY_NEW(A_BUTTON))
+ data[0] = 0;
+ break;
+ }
+}
diff --git a/src/berry_powder.c b/src/berry_powder.c
new file mode 100644
index 000000000..9b3bbc17f
--- /dev/null
+++ b/src/berry_powder.c
@@ -0,0 +1,130 @@
+#include "global.h"
+#include "event_data.h"
+#include "load_save.h"
+#include "menu.h"
+#include "quest_log.h"
+#include "script_menu.h"
+#include "string_util.h"
+#include "strings.h"
+#include "text.h"
+#include "text_window.h"
+
+EWRAM_DATA u8 gUnknown_203F464 = 0;
+
+u32 sub_815EE3C(u32 * a0)
+{
+ return *a0 ^ gSaveBlock2Ptr->encryptionKey;
+}
+
+void sub_815EE54(u32 * a0, u32 a1)
+{
+ *a0 = gSaveBlock2Ptr->encryptionKey ^ a1;
+}
+
+void sub_815EE6C(u32 a0)
+{
+ ApplyNewEncryptionKeyToWord(&gSaveBlock2Ptr->berryCrush.berryPowderAmount, a0);
+}
+
+bool8 sub_815EE88(u32 a0)
+{
+ if (sub_815EE3C(&gSaveBlock2Ptr->berryCrush.berryPowderAmount) < a0)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+bool8 sub_815EEB0(void)
+{
+ if (sub_815EE3C(&gSaveBlock2Ptr->berryCrush.berryPowderAmount) < gSpecialVar_0x8004)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+bool8 sub_815EEE0(u32 a0)
+{
+ u32 * ptr = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;
+ u32 amount = sub_815EE3C(ptr) + a0;
+ if (amount > 99999)
+ {
+ sub_815EE54(ptr, 99999);
+ return FALSE;
+ }
+ else
+ {
+ sub_815EE54(ptr, amount);
+ return TRUE;
+ }
+}
+
+bool8 sub_815EF20(u32 a0)
+{
+ u32 * ptr = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;
+ if (!sub_815EE88(a0))
+ return FALSE;
+ else
+ {
+ u32 amount = sub_815EE3C(ptr);
+ sub_815EE54(ptr, amount - a0);
+ return TRUE;
+ }
+}
+
+bool8 sub_815EF5C(void)
+{
+ u32 * ptr = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;
+ if (!sub_815EE88(gSpecialVar_0x8004))
+ return FALSE;
+ else
+ {
+ u32 amount = sub_815EE3C(ptr);
+ sub_815EE54(ptr, amount - gSpecialVar_0x8004);
+ return TRUE;
+ }
+}
+
+u32 GetBerryPowder(void)
+{
+ return sub_815EE3C(&gSaveBlock2Ptr->berryCrush.berryPowderAmount);
+}
+
+void sub_815EFBC(u8 windowId, u32 powder, u8 x, u8 y, u8 speed)
+{
+ ConvertIntToDecimalStringN(gStringVar1, powder, STR_CONV_MODE_RIGHT_ALIGN, 5);
+ AddTextPrinterParameterized(windowId, 0, gStringVar1, x, y, speed, NULL);
+}
+
+void sub_815F014(u8 windowId, u16 baseBlock, u8 palette, u32 powder)
+{
+ DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, baseBlock, palette);
+ AddTextPrinterParameterized(windowId, 0, gOtherText_Powder, 0, 0, -1, NULL);
+ sub_815EFBC(windowId, powder, 39, 12, 0);
+}
+
+void sub_815F070(void)
+{
+ sub_815EFBC(gUnknown_203F464, GetBerryPowder(), 39, 12, 0);
+}
+
+void sub_815F094(void)
+{
+ struct WindowTemplate template;
+
+ if (sub_81119D4(sub_809D6D4) != TRUE)
+ {
+ template = SetWindowTemplateFields(0, 1, 1, 8, 3, 15, 32);
+ gUnknown_203F464 = AddWindow(&template);
+ FillWindowPixelBuffer(gUnknown_203F464, 0);
+ PutWindowTilemap(gUnknown_203F464);
+ TextWindow_SetStdFrame0_WithPal(gUnknown_203F464, 0x21D, 0xD0);
+ sub_815F014(gUnknown_203F464, 0x21D, 0xD, GetBerryPowder());
+ }
+}
+
+void sub_815F114(void)
+{
+ ClearWindowTilemap(gUnknown_203F464);
+ ClearStdWindowAndFrameToTransparent(gUnknown_203F464, 1);
+ RemoveWindow(gUnknown_203F464);
+}
diff --git a/src/bg.c b/src/bg.c
index 5cbd7658e..18cb4ec05 100644
--- a/src/bg.c
+++ b/src/bg.c
@@ -605,88 +605,25 @@ u16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset)
return (u8)cursor;
}
-#ifdef NONMATCHING // Matches everything but r5 and r6 are flipped, rrr
bool8 IsDma3ManagerBusyWithBgCopy(void)
{
- u8 mod;
- u8 div;
- s8 reqSpace;
-
int i;
for (i = 0; i < 0x80; i++)
{
- div = i / 0x20;
- mod = i % 0x20;
+ u8 div = i / 0x20;
+ u8 mod = i % 0x20;
- if ((sDmaBusyBitfield[div] & (1 << mod)) != FALSE)
+ if ((sDmaBusyBitfield[div] & (1 << mod)))
{
- reqSpace = CheckForSpaceForDma3Request(i);
+ s8 reqSpace = CheckForSpaceForDma3Request(i);
if (reqSpace == -1)
- {
return TRUE;
- }
-
sDmaBusyBitfield[div] &= ~(1 << mod);
}
}
-
return FALSE;
}
-#else
-NAKED
-bool8 IsDma3ManagerBusyWithBgCopy(void)
-{
- asm("push {r4-r7,lr}\n\
- mov r5, #0\n\
- mov r7, #0x1\n\
- neg r7, r7\n\
-_08001ADC:\n\
- add r0, r5, #0\n\
- cmp r5, #0\n\
- bge _08001AE4\n\
- add r0, #0x1F\n\
-_08001AE4:\n\
- asr r0, #5\n\
- lsl r2, r0, #24\n\
- lsl r0, #5\n\
- sub r0, r5, r0\n\
- lsl r0, #24\n\
- lsr r0, #24\n\
- ldr r1, =sDmaBusyBitfield\n\
- lsr r2, #22\n\
- add r4, r2, r1\n\
- mov r6, #0x1\n\
- lsl r6, r0\n\
- ldr r0, [r4]\n\
- and r0, r6\n\
- cmp r0, #0\n\
- beq _08001B22\n\
- lsl r0, r5, #16\n\
- asr r0, #16\n\
- bl CheckForSpaceForDma3Request\n\
- lsl r0, #24\n\
- asr r0, #24\n\
- cmp r0, r7\n\
- bne _08001B1C\n\
- mov r0, #0x1\n\
- b _08001B2A\n\
- .pool\n\
-_08001B1C:\n\
- ldr r0, [r4]\n\
- bic r0, r6\n\
- str r0, [r4]\n\
-_08001B22:\n\
- add r5, #0x1\n\
- cmp r5, #0x7F\n\
- ble _08001ADC\n\
- mov r0, #0\n\
-_08001B2A:\n\
- pop {r4-r7}\n\
- pop {r1}\n\
- bx r1\n");
-}
-#endif // NONMATCHING
void ShowBg(u8 bg)
{
@@ -928,79 +865,58 @@ void SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dis
SetBgAffineInternal(bg, srcCenterX, srcCenterY, dispCenterX, dispCenterY, scaleX, scaleY, rotationAngle);
}
-u8 Unused_AdjustBgMosaic(u8 a1, u8 a2)
+u8 AdjustBgMosaic(u8 value, u8 mode)
{
- u16 result;
- s16 test1;
- s16 test2;
-
- result = GetGpuReg(REG_OFFSET_MOSAIC);
-
- test1 = result & 0xF;
- test2 = (result >> 4) & 0xF;
- result &= 0xFF00;
+ u16 mosaicSize;
+ s16 bgMosaicH;
+ s16 bgMosaicV;
+ mosaicSize = GetGpuReg(REG_OFFSET_MOSAIC);
+ bgMosaicH = mosaicSize & 0xF;
+ bgMosaicV = (mosaicSize >> 4) & 0xF;
+ mosaicSize &= 0xFF00;
- switch (a2)
+ switch (mode)
{
- case 0:
- default:
- test1 = a1 & 0xF;
- test2 = a1 >> 0x4;
- break;
- case 1:
- test1 = a1 & 0xF;
- break;
- case 2:
- if ((test1 + a1) > 0xF)
- {
- test1 = 0xF;
- }
- else
- {
- test1 += a1;
- }
- break;
- case 3:
- if ((test1 - a1) < 0)
- {
- test1 = 0x0;
- }
- else
- {
- test1 -= a1;
- }
- break;
- case 4:
- test2 = a1 & 0xF;
- break;
- case 5:
- if ((test2 + a1) > 0xF)
- {
- test2 = 0xF;
- }
- else
- {
- test2 += a1;
- }
- break;
- case 6:
- if ((test2 - a1) < 0)
- {
- test2 = 0x0;
- }
- else
- {
- test2 -= a1;
- }
- break;
+ case BG_MOSAIC_SET:
+ default:
+ bgMosaicH = value & 0xF;
+ bgMosaicV = value >> 0x4;
+ break;
+ case BG_MOSAIC_SET_H:
+ bgMosaicH = value & 0xF;
+ break;
+ case BG_MOSAIC_INC_H:
+ if ((bgMosaicH + value) > 0xF)
+ bgMosaicH = 0xF;
+ else
+ bgMosaicH += value;
+ break;
+ case BG_MOSAIC_DEC_H:
+ if ((bgMosaicH - value) < 0)
+ bgMosaicH = 0x0;
+ else
+ bgMosaicH -= value;
+ break;
+ case BG_MOSAIC_SET_V:
+ bgMosaicV = value & 0xF;
+ break;
+ case BG_MOSAIC_INC_V:
+ if ((bgMosaicV + value) > 0xF)
+ bgMosaicV = 0xF;
+ else
+ bgMosaicV += value;
+ break;
+ case BG_MOSAIC_DEC_V:
+ if ((bgMosaicV - value) < 0)
+ bgMosaicV = 0x0;
+ else
+ bgMosaicV -= value;
+ break;
}
-
- result |= ((test2 << 0x4) & 0xF0);
- result |= (test1 & 0xF);
-
- SetGpuReg(REG_OFFSET_MOSAIC, result);
-
- return result;
+ mosaicSize |= ((bgMosaicV << 0x4) & 0xF0);
+ mosaicSize |= (bgMosaicH & 0xF);
+ SetGpuReg(REG_OFFSET_MOSAIC, mosaicSize);
+ return mosaicSize;
}
void SetBgTilemapBuffer(u8 bg, void *tilemap)
diff --git a/src/buy_menu_helpers.c b/src/buy_menu_helpers.c
new file mode 100644
index 000000000..4cdf90e4e
--- /dev/null
+++ b/src/buy_menu_helpers.c
@@ -0,0 +1,216 @@
+#include "global.h"
+#include "task.h"
+#include "text.h"
+#include "window.h"
+#include "text_window.h"
+#include "money.h"
+#include "menu_helpers.h"
+#include "new_menu_helpers.h"
+#include "menu.h"
+#include "shop.h"
+
+static const struct WindowTemplate sShopBuyMenuWindowTemplatesNormal[] =
+{
+ {
+ .bg = 0x0,
+ .tilemapLeft = 0x1,
+ .tilemapTop = 0x1,
+ .width = 0x8,
+ .height = 0x3,
+ .paletteNum = 0xF,
+ .baseBlock = 0x27,
+ },
+ {
+ .bg = 0x0,
+ .tilemapLeft = 0x1,
+ .tilemapTop = 0xB,
+ .width = 0xD,
+ .height = 0x2,
+ .paletteNum = 0xF,
+ .baseBlock = 0x3F,
+ },
+ {
+ .bg = 0x0,
+ .tilemapLeft = 0x2,
+ .tilemapTop = 0xF,
+ .width = 0x1A,
+ .height = 0x4,
+ .paletteNum = 0xE,
+ .baseBlock = 0x59,
+ },
+ {
+ .bg = 0x0,
+ .tilemapLeft = 0x11,
+ .tilemapTop = 0x9,
+ .width = 0xC,
+ .height = 0x4,
+ .paletteNum = 0xE,
+ .baseBlock = 0xC1,
+ },
+ {
+ .bg = 0x0,
+ .tilemapLeft = 0xB,
+ .tilemapTop = 0x1,
+ .width = 0x11,
+ .height = 0xC,
+ .paletteNum = 0xE,
+ .baseBlock = 0xF1,
+ },
+ {
+ .bg = 0x0,
+ .tilemapLeft = 0x5,
+ .tilemapTop = 0xE,
+ .width = 0x19,
+ .height = 0x6,
+ .paletteNum = 0xF,
+ .baseBlock = 0x1BD,
+ },
+ DUMMY_WIN_TEMPLATE,
+};
+
+// firered uses different layout when selling TMs
+static const struct WindowTemplate sShopBuyMenuWindowTemplatesTM[] =
+{
+ {
+ .bg = 0x0,
+ .tilemapLeft = 0x1,
+ .tilemapTop = 0x1,
+ .width = 0x8,
+ .height = 0x3,
+ .paletteNum = 0xF,
+ .baseBlock = 0x27,
+ },
+ {
+ .bg = 0x0,
+ .tilemapLeft = 0x1,
+ .tilemapTop = 0xB,
+ .width = 0xD,
+ .height = 0x2,
+ .paletteNum = 0xF,
+ .baseBlock = 0x3F,
+ },
+ {
+ .bg = 0x0,
+ .tilemapLeft = 0x2,
+ .tilemapTop = 0xF,
+ .width = 0x1A,
+ .height = 0x4,
+ .paletteNum = 0xE,
+ .baseBlock = 0x59,
+ },
+ {
+ .bg = 0x0,
+ .tilemapLeft = 0x11,
+ .tilemapTop = 0x9,
+ .width = 0xC,
+ .height = 0x4,
+ .paletteNum = 0xE,
+ .baseBlock = 0xC1,
+ },
+ {
+ .bg = 0x0,
+ .tilemapLeft = 0xB,
+ .tilemapTop = 0x1,
+ .width = 0x11,
+ .height = 0xA,
+ .paletteNum = 0xE,
+ .baseBlock = 0xF1,
+ },
+ {
+ .bg = 0x0,
+ .tilemapLeft = 0xC,
+ .tilemapTop = 0xC,
+ .width = 0x12,
+ .height = 0x8,
+ .paletteNum = 0xE,
+ .baseBlock = 0x19B,
+ },
+ {
+ .bg = 0x0,
+ .tilemapLeft = 0x1,
+ .tilemapTop = 0xE,
+ .width = 0xA,
+ .height = 0x4,
+ .paletteNum = 0xE,
+ .baseBlock = 0x22B,
+ },
+ DUMMY_WIN_TEMPLATE,
+};
+
+static const struct WindowTemplate sShopBuyMenuYesNoWindowTemplate =
+{
+ .bg = 0x0,
+ .tilemapLeft = 0x15,
+ .tilemapTop = 0x9,
+ .width = 0x6,
+ .height = 0x4,
+ .paletteNum = 0xE,
+ .baseBlock = 0xC1,
+};
+
+static const struct TextColor sShopBuyMenuTextColors[] =
+{
+ {
+ .fgColor = 0,
+ .bgColor = 1,
+ .shadowColor = 2,
+ },
+ {
+ .fgColor = 0,
+ .bgColor = 2,
+ .shadowColor = 3,
+ },
+ {
+ .fgColor = 0,
+ .bgColor = 3,
+ .shadowColor = 2,
+ },
+};
+
+void BuyMenuInitWindows(bool32 isSellingTM)
+{
+ if (isSellingTM != TRUE)
+ InitWindows(sShopBuyMenuWindowTemplatesNormal);
+ else
+ InitWindows(sShopBuyMenuWindowTemplatesTM);
+ DeactivateAllTextPrinters();
+ TextWindow_SetUserSelectedFrame(0, 0x1, 0xD0);
+ TextWindow_LoadResourcesStdFrame0(0, 0x13, 0xE0);
+ TextWindow_SetStdFrame0_WithPal(0, 0xA, 0xF0);
+ PutWindowTilemap(0);
+ PutWindowTilemap(4);
+ PutWindowTilemap(5);
+ if (isSellingTM == TRUE)
+ PutWindowTilemap(6);
+}
+
+void BuyMenuDrawMoneyBox(void)
+{
+ PrintMoneyAmountInMoneyBoxWithBorder(0, 0xA, 0xF, GetMoney(&gSaveBlock1Ptr->money));
+}
+
+void BuyMenuPrint(u8 windowId, u8 font, const u8 *text, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, s8 speed, u8 color)
+{
+ AddTextPrinterParameterized4(windowId, font, x, y, letterSpacing, lineSpacing, &sShopBuyMenuTextColors[color], speed, text);
+}
+
+void BuyMenuDisplayMessage(u8 taskId, const u8 *text, TaskFunc callback)
+{
+ DisplayMessageAndContinueTask(taskId, 2, 0x13, 0xE, sub_809B56C(), GetTextSpeedSetting(), text, callback);
+ ScheduleBgCopyTilemapToVram(0);
+}
+
+void BuyMenuQuantityBoxNormalBorder(u8 windowId, bool8 copyToVram)
+{
+ DrawStdFrameWithCustomTileAndPalette(windowId, copyToVram, 0x1, 0xD);
+}
+
+void BuyMenuQuantityBoxThinBorder(u8 windowId, bool8 copyToVram)
+{
+ DrawStdFrameWithCustomTileAndPalette(windowId, copyToVram, 0xA, 0xF);
+}
+
+void BuyMenuConfirmPurchase(u8 taskId, const struct YesNoFuncTable *yesNo)
+{
+ CreateYesNoMenuWithCallbacks(taskId, &sShopBuyMenuYesNoWindowTemplate, 2, 0, 2, 1, 0xD, yesNo);
+}
diff --git a/src/cable_car_util.c b/src/cable_car_util.c
new file mode 100644
index 000000000..c57038e1c
--- /dev/null
+++ b/src/cable_car_util.c
@@ -0,0 +1,38 @@
+#include "global.h"
+
+static void CableCarUtil_FillWrapped(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height)
+{
+ u8 i;
+ u8 j;
+ u8 x;
+ u8 y;
+
+ for (i = 0, y = top; i < height; i++)
+ {
+ for (x = left, j = 0; j < width; j++)
+ {
+ *(u16 *)&((u8 *)dest)[y * 64 + x * 2] = value;
+ x = (x + 1) % 32;
+ }
+ y = (y + 1) % 32;
+ }
+}
+
+static void CableCarUtil_CopyWrapped(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height)
+{
+ u8 i;
+ u8 j;
+ u8 x;
+ u8 y;
+ const u16 *_src;
+
+ for (i = 0, _src = src, y = top; i < height; i++)
+ {
+ for (x = left, j = 0; j < width; j++)
+ {
+ *(u16 *)&((u8 *)dest)[y * 64 + x * 2] = *_src++;
+ x = (x + 1) % 32;
+ }
+ y = (y + 1) % 32;
+ }
+}
diff --git a/src/cereader_tool.c b/src/cereader_tool.c
new file mode 100644
index 000000000..1b25f4828
--- /dev/null
+++ b/src/cereader_tool.c
@@ -0,0 +1,88 @@
+#include "global.h"
+#include "util.h"
+#include "save.h"
+#include "malloc.h"
+#include "cereader_tool.h"
+
+u8 sub_815D654(void)
+{
+ return (gSaveBlock1Ptr->unkArray[0].unk9 + 1) % 256;
+}
+
+static bool32 ValidateTrainerTowerTrainer(struct TrainerTowerTrainer * trainer)
+{
+ if (trainer->unk_001 < 1 || trainer->unk_001 > 8)
+ return FALSE;
+ if (trainer->unk_002 > 2)
+ return FALSE;
+ if (CalcByteArraySum((const u8 *)trainer, offsetof(typeof(*trainer), checksum)) != trainer->checksum)
+ return FALSE;
+ return TRUE;
+}
+
+bool32 ValidateTrainerTowerData(struct TrainerTowerData * ttdata)
+{
+ u32 count = ttdata->count;
+ s32 i;
+ if (count < 1 || count > 8)
+ return FALSE;
+ for (i = 0; i < count; i++)
+ {
+ if (!ValidateTrainerTowerTrainer(&ttdata->trainers[i]))
+ return FALSE;
+ }
+ if (CalcByteArraySum((const u8 *)ttdata->trainers, count * sizeof(ttdata->trainers[0])) != ttdata->checksum)
+ return FALSE;
+ return TRUE;
+}
+
+#define SEC30_SIZE (offsetof(struct TrainerTowerData, trainers[4]))
+#define SEC31_SIZE (sizeof(struct TrainerTowerData) - SEC30_SIZE)
+
+static bool32 CEReaderTool_SaveTrainerTower_r(struct TrainerTowerData * ttdata, u8 * buffer)
+{
+ AGB_ASSERT_EX(ttdata->dummy == 0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/cereader_tool.c", 198);
+ AGB_ASSERT_EX(ttdata->id == 0, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/cereader_tool.c", 199)
+
+ memset(buffer, 0, 0x1000);
+ memcpy(buffer, ttdata, SEC30_SIZE);
+ buffer[1] = sub_815D654();
+ if (TryWriteSpecialSaveSection(30, buffer) != TRUE)
+ return FALSE;
+ memset(buffer, 0, 0x1000);
+ memcpy(buffer, (u8 *)ttdata + SEC30_SIZE, SEC31_SIZE);
+ if (TryWriteSpecialSaveSection(31, buffer) != TRUE)
+ return FALSE;
+ return TRUE;
+}
+
+bool32 CEReaderTool_SaveTrainerTower(struct TrainerTowerData * ttdata)
+{
+ u8 * buffer = AllocZeroed(0x1000);
+ bool32 result = CEReaderTool_SaveTrainerTower_r(ttdata, buffer);
+ Free(buffer);
+ return result;
+}
+
+static bool32 CEReaderTool_LoadTrainerTower_r(struct TrainerTowerData * ttdata, void * buffer)
+{
+ if (TryCopySpecialSaveSection(30, buffer) != 1)
+ return FALSE;
+ memcpy(ttdata + 0x000, buffer, SEC30_SIZE);
+
+ if (TryCopySpecialSaveSection(31, buffer) != 1)
+ return FALSE;
+ memcpy((u8 *)ttdata + SEC30_SIZE, buffer, SEC31_SIZE);
+
+ if (!ValidateTrainerTowerData(ttdata))
+ return FALSE;
+ return TRUE;
+}
+
+bool32 CEReaderTool_LoadTrainerTower(struct TrainerTowerData * ttdata)
+{
+ void * buffer = AllocZeroed(0x1000);
+ bool32 success = CEReaderTool_LoadTrainerTower_r(ttdata, buffer);
+ Free(buffer);
+ return success;
+}
diff --git a/src/coins.c b/src/coins.c
index 08646e2f9..9de600e7f 100644
--- a/src/coins.c
+++ b/src/coins.c
@@ -3,8 +3,8 @@
#include "text.h"
#include "menu.h"
#include "text_window.h"
+#include "strings.h"
-extern const u8 gText_Coins[];
extern const u8 gUnknown_8417C2D[];
EWRAM_DATA static u8 sCoinsWindowId = 0;
@@ -61,7 +61,7 @@ void PrintCoinsString_Parameterized(u8 windowId, u32 coinAmount, u8 x, u8 y, u8
void sub_80D0674(u8 windowId, u16 tileStart, u8 palette, u32 coinAmount)
{
- SetWindowBorderStyle(windowId, FALSE, tileStart, palette);
+ DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, tileStart, palette);
AddTextPrinterParameterized(windowId, 2, gUnknown_8417C2D, 0, 0, 0xFF, 0);
PrintCoinsString_Parameterized(windowId, coinAmount, 0x10, 0xC, 0);
}
@@ -80,15 +80,14 @@ void PrintCoinsString(u32 coinAmount)
void ShowCoinsWindow(u32 coinAmount, u8 x, u8 y)
{
- struct WindowTemplate template, template2;
+ struct WindowTemplate template;
- SetWindowTemplateFields(&template, 0, x + 1, y + 1, 8, 3, 0xF, 0x20);
- template2 = template; // again, why...
- sCoinsWindowId = AddWindow(&template2);
+ template = SetWindowTemplateFields(0, x + 1, y + 1, 8, 3, 0xF, 0x20);
+ sCoinsWindowId = AddWindow(&template);
FillWindowPixelBuffer(sCoinsWindowId, 0);
PutWindowTilemap(sCoinsWindowId);
- sub_814FF2C(sCoinsWindowId, 0x21D, 0xD0);
- SetWindowBorderStyle(sCoinsWindowId, FALSE, 0x21D, 0xD);
+ TextWindow_SetStdFrame0_WithPal(sCoinsWindowId, 0x21D, 0xD0);
+ DrawStdFrameWithCustomTileAndPalette(sCoinsWindowId, FALSE, 0x21D, 0xD);
AddTextPrinterParameterized(sCoinsWindowId, 2, gUnknown_8417C2D, 0, 0, 0xFF, 0);
PrintCoinsString(coinAmount);
}
@@ -96,6 +95,6 @@ void ShowCoinsWindow(u32 coinAmount, u8 x, u8 y)
void HideCoinsWindow(void)
{
ClearWindowTilemap(sCoinsWindowId);
- sub_810F4D8(sCoinsWindowId, TRUE);
+ ClearStdWindowAndFrameToTransparent(sCoinsWindowId, TRUE);
RemoveWindow(sCoinsWindowId);
}
diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h
new file mode 100644
index 000000000..1fa7f75a9
--- /dev/null
+++ b/src/data/battle_moves.h
@@ -0,0 +1,4617 @@
+const struct BattleMove gBattleMoves[MOVES_COUNT] =
+{
+ [MOVE_NONE] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 0,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_POUND] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 40,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 35,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_KARATE_CHOP] =
+ {
+ .effect = EFFECT_HIGH_CRITICAL,
+ .power = 50,
+ .type = TYPE_FIGHTING,
+ .accuracy = 100,
+ .pp = 25,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_DOUBLE_SLAP] =
+ {
+ .effect = EFFECT_MULTI_HIT,
+ .power = 15,
+ .type = TYPE_NORMAL,
+ .accuracy = 85,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_COMET_PUNCH] =
+ {
+ .effect = EFFECT_MULTI_HIT,
+ .power = 18,
+ .type = TYPE_NORMAL,
+ .accuracy = 85,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_MEGA_PUNCH] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 80,
+ .type = TYPE_NORMAL,
+ .accuracy = 85,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_PAY_DAY] =
+ {
+ .effect = EFFECT_PAY_DAY,
+ .power = 40,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_FIRE_PUNCH] =
+ {
+ .effect = EFFECT_BURN_HIT,
+ .power = 75,
+ .type = TYPE_FIRE,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_ICE_PUNCH] =
+ {
+ .effect = EFFECT_FREEZE_HIT,
+ .power = 75,
+ .type = TYPE_ICE,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_THUNDER_PUNCH] =
+ {
+ .effect = EFFECT_PARALYZE_HIT,
+ .power = 75,
+ .type = TYPE_ELECTRIC,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SCRATCH] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 40,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 35,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_VICE_GRIP] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 55,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_GUILLOTINE] =
+ {
+ .effect = EFFECT_OHKO,
+ .power = 1,
+ .type = TYPE_NORMAL,
+ .accuracy = 30,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_RAZOR_WIND] =
+ {
+ .effect = EFFECT_RAZOR_WIND,
+ .power = 80,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SWORDS_DANCE] =
+ {
+ .effect = EFFECT_ATTACK_UP_2,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_CUT] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 50,
+ .type = TYPE_NORMAL,
+ .accuracy = 95,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_GUST] =
+ {
+ .effect = EFFECT_GUST,
+ .power = 40,
+ .type = TYPE_FLYING,
+ .accuracy = 100,
+ .pp = 35,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_WING_ATTACK] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 60,
+ .type = TYPE_FLYING,
+ .accuracy = 100,
+ .pp = 35,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_WHIRLWIND] =
+ {
+ .effect = EFFECT_ROAR,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = -6,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_FLY] =
+ {
+ .effect = EFFECT_SEMI_INVULNERABLE,
+ .power = 70,
+ .type = TYPE_FLYING,
+ .accuracy = 95,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_BIND] =
+ {
+ .effect = EFFECT_TRAP,
+ .power = 15,
+ .type = TYPE_NORMAL,
+ .accuracy = 75,
+ .pp = 20,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SLAM] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 80,
+ .type = TYPE_NORMAL,
+ .accuracy = 75,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_VINE_WHIP] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 35,
+ .type = TYPE_GRASS,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_STOMP] =
+ {
+ .effect = EFFECT_FLINCH_MINIMIZE_HIT,
+ .power = 65,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_DOUBLE_KICK] =
+ {
+ .effect = EFFECT_DOUBLE_HIT,
+ .power = 30,
+ .type = TYPE_FIGHTING,
+ .accuracy = 100,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_MEGA_KICK] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 120,
+ .type = TYPE_NORMAL,
+ .accuracy = 75,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_JUMP_KICK] =
+ {
+ .effect = EFFECT_RECOIL_IF_MISS,
+ .power = 70,
+ .type = TYPE_FIGHTING,
+ .accuracy = 95,
+ .pp = 25,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_ROLLING_KICK] =
+ {
+ .effect = EFFECT_FLINCH_HIT,
+ .power = 60,
+ .type = TYPE_FIGHTING,
+ .accuracy = 85,
+ .pp = 15,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SAND_ATTACK] =
+ {
+ .effect = EFFECT_ACCURACY_DOWN,
+ .power = 0,
+ .type = TYPE_GROUND,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_HEADBUTT] =
+ {
+ .effect = EFFECT_FLINCH_HIT,
+ .power = 70,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_HORN_ATTACK] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 65,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 25,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_FURY_ATTACK] =
+ {
+ .effect = EFFECT_MULTI_HIT,
+ .power = 15,
+ .type = TYPE_NORMAL,
+ .accuracy = 85,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_HORN_DRILL] =
+ {
+ .effect = EFFECT_OHKO,
+ .power = 1,
+ .type = TYPE_NORMAL,
+ .accuracy = 30,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_TACKLE] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 35,
+ .type = TYPE_NORMAL,
+ .accuracy = 95,
+ .pp = 35,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_BODY_SLAM] =
+ {
+ .effect = EFFECT_PARALYZE_HIT,
+ .power = 85,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_WRAP] =
+ {
+ .effect = EFFECT_TRAP,
+ .power = 15,
+ .type = TYPE_NORMAL,
+ .accuracy = 85,
+ .pp = 20,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_TAKE_DOWN] =
+ {
+ .effect = EFFECT_RECOIL,
+ .power = 90,
+ .type = TYPE_NORMAL,
+ .accuracy = 85,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_THRASH] =
+ {
+ .effect = EFFECT_RAMPAGE,
+ .power = 90,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_RANDOM,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_DOUBLE_EDGE] =
+ {
+ .effect = EFFECT_DOUBLE_EDGE,
+ .power = 120,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_TAIL_WHIP] =
+ {
+ .effect = EFFECT_DEFENSE_DOWN,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_POISON_STING] =
+ {
+ .effect = EFFECT_POISON_HIT,
+ .power = 15,
+ .type = TYPE_POISON,
+ .accuracy = 100,
+ .pp = 35,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_TWINEEDLE] =
+ {
+ .effect = EFFECT_TWINEEDLE,
+ .power = 25,
+ .type = TYPE_BUG,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 20,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_PIN_MISSILE] =
+ {
+ .effect = EFFECT_MULTI_HIT,
+ .power = 14,
+ .type = TYPE_BUG,
+ .accuracy = 85,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_LEER] =
+ {
+ .effect = EFFECT_DEFENSE_DOWN,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_BITE] =
+ {
+ .effect = EFFECT_FLINCH_HIT,
+ .power = 60,
+ .type = TYPE_DARK,
+ .accuracy = 100,
+ .pp = 25,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_GROWL] =
+ {
+ .effect = EFFECT_ATTACK_DOWN,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_ROAR] =
+ {
+ .effect = EFFECT_ROAR,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = -6,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SING] =
+ {
+ .effect = EFFECT_SLEEP,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 55,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SUPERSONIC] =
+ {
+ .effect = EFFECT_CONFUSE,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 55,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SONIC_BOOM] =
+ {
+ .effect = EFFECT_SONICBOOM,
+ .power = 1,
+ .type = TYPE_NORMAL,
+ .accuracy = 90,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_DISABLE] =
+ {
+ .effect = EFFECT_DISABLE,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 55,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_ACID] =
+ {
+ .effect = EFFECT_DEFENSE_DOWN_HIT,
+ .power = 40,
+ .type = TYPE_POISON,
+ .accuracy = 100,
+ .pp = 30,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_EMBER] =
+ {
+ .effect = EFFECT_BURN_HIT,
+ .power = 40,
+ .type = TYPE_FIRE,
+ .accuracy = 100,
+ .pp = 25,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_FLAMETHROWER] =
+ {
+ .effect = EFFECT_BURN_HIT,
+ .power = 95,
+ .type = TYPE_FIRE,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_MIST] =
+ {
+ .effect = EFFECT_MIST,
+ .power = 0,
+ .type = TYPE_ICE,
+ .accuracy = 0,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_WATER_GUN] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 40,
+ .type = TYPE_WATER,
+ .accuracy = 100,
+ .pp = 25,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_HYDRO_PUMP] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 120,
+ .type = TYPE_WATER,
+ .accuracy = 80,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SURF] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 95,
+ .type = TYPE_WATER,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_ICE_BEAM] =
+ {
+ .effect = EFFECT_FREEZE_HIT,
+ .power = 95,
+ .type = TYPE_ICE,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_BLIZZARD] =
+ {
+ .effect = EFFECT_FREEZE_HIT,
+ .power = 120,
+ .type = TYPE_ICE,
+ .accuracy = 70,
+ .pp = 5,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_PSYBEAM] =
+ {
+ .effect = EFFECT_CONFUSE_HIT,
+ .power = 65,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_BUBBLE_BEAM] =
+ {
+ .effect = EFFECT_SPEED_DOWN_HIT,
+ .power = 65,
+ .type = TYPE_WATER,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_AURORA_BEAM] =
+ {
+ .effect = EFFECT_ATTACK_DOWN_HIT,
+ .power = 65,
+ .type = TYPE_ICE,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_HYPER_BEAM] =
+ {
+ .effect = EFFECT_RECHARGE,
+ .power = 150,
+ .type = TYPE_NORMAL,
+ .accuracy = 90,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_PECK] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 35,
+ .type = TYPE_FLYING,
+ .accuracy = 100,
+ .pp = 35,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_DRILL_PECK] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 80,
+ .type = TYPE_FLYING,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SUBMISSION] =
+ {
+ .effect = EFFECT_RECOIL,
+ .power = 80,
+ .type = TYPE_FIGHTING,
+ .accuracy = 80,
+ .pp = 25,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_LOW_KICK] =
+ {
+ .effect = EFFECT_LOW_KICK,
+ .power = 1,
+ .type = TYPE_FIGHTING,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_COUNTER] =
+ {
+ .effect = EFFECT_COUNTER,
+ .power = 1,
+ .type = TYPE_FIGHTING,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_DEPENDS,
+ .priority = -5,
+ .flags = FLAG_MAKES_CONTACT | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SEISMIC_TOSS] =
+ {
+ .effect = EFFECT_LEVEL_DAMAGE,
+ .power = 1,
+ .type = TYPE_FIGHTING,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_STRENGTH] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 80,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_ABSORB] =
+ {
+ .effect = EFFECT_ABSORB,
+ .power = 20,
+ .type = TYPE_GRASS,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_MEGA_DRAIN] =
+ {
+ .effect = EFFECT_ABSORB,
+ .power = 40,
+ .type = TYPE_GRASS,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_LEECH_SEED] =
+ {
+ .effect = EFFECT_LEECH_SEED,
+ .power = 0,
+ .type = TYPE_GRASS,
+ .accuracy = 90,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_GROWTH] =
+ {
+ .effect = EFFECT_SPECIAL_ATTACK_UP,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_RAZOR_LEAF] =
+ {
+ .effect = EFFECT_HIGH_CRITICAL,
+ .power = 55,
+ .type = TYPE_GRASS,
+ .accuracy = 95,
+ .pp = 25,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SOLAR_BEAM] =
+ {
+ .effect = EFFECT_SOLARBEAM,
+ .power = 120,
+ .type = TYPE_GRASS,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_POISON_POWDER] =
+ {
+ .effect = EFFECT_POISON,
+ .power = 0,
+ .type = TYPE_POISON,
+ .accuracy = 75,
+ .pp = 35,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_STUN_SPORE] =
+ {
+ .effect = EFFECT_PARALYZE,
+ .power = 0,
+ .type = TYPE_GRASS,
+ .accuracy = 75,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SLEEP_POWDER] =
+ {
+ .effect = EFFECT_SLEEP,
+ .power = 0,
+ .type = TYPE_GRASS,
+ .accuracy = 75,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_PETAL_DANCE] =
+ {
+ .effect = EFFECT_RAMPAGE,
+ .power = 70,
+ .type = TYPE_GRASS,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_RANDOM,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_STRING_SHOT] =
+ {
+ .effect = EFFECT_SPEED_DOWN,
+ .power = 0,
+ .type = TYPE_BUG,
+ .accuracy = 95,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_DRAGON_RAGE] =
+ {
+ .effect = EFFECT_DRAGON_RAGE,
+ .power = 1,
+ .type = TYPE_DRAGON,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_FIRE_SPIN] =
+ {
+ .effect = EFFECT_TRAP,
+ .power = 15,
+ .type = TYPE_FIRE,
+ .accuracy = 70,
+ .pp = 15,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_THUNDER_SHOCK] =
+ {
+ .effect = EFFECT_PARALYZE_HIT,
+ .power = 40,
+ .type = TYPE_ELECTRIC,
+ .accuracy = 100,
+ .pp = 30,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_THUNDERBOLT] =
+ {
+ .effect = EFFECT_PARALYZE_HIT,
+ .power = 95,
+ .type = TYPE_ELECTRIC,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_THUNDER_WAVE] =
+ {
+ .effect = EFFECT_PARALYZE,
+ .power = 0,
+ .type = TYPE_ELECTRIC,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_THUNDER] =
+ {
+ .effect = EFFECT_THUNDER,
+ .power = 120,
+ .type = TYPE_ELECTRIC,
+ .accuracy = 70,
+ .pp = 10,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_ROCK_THROW] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 50,
+ .type = TYPE_ROCK,
+ .accuracy = 90,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_EARTHQUAKE] =
+ {
+ .effect = EFFECT_EARTHQUAKE,
+ .power = 100,
+ .type = TYPE_GROUND,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_FOES_AND_ALLY,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_FISSURE] =
+ {
+ .effect = EFFECT_OHKO,
+ .power = 1,
+ .type = TYPE_GROUND,
+ .accuracy = 30,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_DIG] =
+ {
+ .effect = EFFECT_SEMI_INVULNERABLE,
+ .power = 60,
+ .type = TYPE_GROUND,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_TOXIC] =
+ {
+ .effect = EFFECT_TOXIC,
+ .power = 0,
+ .type = TYPE_POISON,
+ .accuracy = 85,
+ .pp = 10,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_CONFUSION] =
+ {
+ .effect = EFFECT_CONFUSE_HIT,
+ .power = 50,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 100,
+ .pp = 25,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_PSYCHIC] =
+ {
+ .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT,
+ .power = 90,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_HYPNOSIS] =
+ {
+ .effect = EFFECT_SLEEP,
+ .power = 0,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 60,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_MEDITATE] =
+ {
+ .effect = EFFECT_ATTACK_UP,
+ .power = 0,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 0,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_AGILITY] =
+ {
+ .effect = EFFECT_SPEED_UP_2,
+ .power = 0,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 0,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_QUICK_ATTACK] =
+ {
+ .effect = EFFECT_QUICK_ATTACK,
+ .power = 40,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 1,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_RAGE] =
+ {
+ .effect = EFFECT_RAGE,
+ .power = 20,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_TELEPORT] =
+ {
+ .effect = EFFECT_TELEPORT,
+ .power = 0,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_NIGHT_SHADE] =
+ {
+ .effect = EFFECT_LEVEL_DAMAGE,
+ .power = 1,
+ .type = TYPE_GHOST,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_MIMIC] =
+ {
+ .effect = EFFECT_MIMIC,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED,
+ },
+
+ [MOVE_SCREECH] =
+ {
+ .effect = EFFECT_DEFENSE_DOWN_2,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 85,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_DOUBLE_TEAM] =
+ {
+ .effect = EFFECT_EVASION_UP,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_RECOVER] =
+ {
+ .effect = EFFECT_RESTORE_HP,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_HARDEN] =
+ {
+ .effect = EFFECT_DEFENSE_UP,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_MINIMIZE] =
+ {
+ .effect = EFFECT_MINIMIZE,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_SMOKESCREEN] =
+ {
+ .effect = EFFECT_ACCURACY_DOWN,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_CONFUSE_RAY] =
+ {
+ .effect = EFFECT_CONFUSE,
+ .power = 0,
+ .type = TYPE_GHOST,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_WITHDRAW] =
+ {
+ .effect = EFFECT_DEFENSE_UP,
+ .power = 0,
+ .type = TYPE_WATER,
+ .accuracy = 0,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_DEFENSE_CURL] =
+ {
+ .effect = EFFECT_DEFENSE_CURL,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_BARRIER] =
+ {
+ .effect = EFFECT_DEFENSE_UP_2,
+ .power = 0,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 0,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_LIGHT_SCREEN] =
+ {
+ .effect = EFFECT_LIGHT_SCREEN,
+ .power = 0,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 0,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_HAZE] =
+ {
+ .effect = EFFECT_HAZE,
+ .power = 0,
+ .type = TYPE_ICE,
+ .accuracy = 0,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED,
+ },
+
+ [MOVE_REFLECT] =
+ {
+ .effect = EFFECT_REFLECT,
+ .power = 0,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_FOCUS_ENERGY] =
+ {
+ .effect = EFFECT_FOCUS_ENERGY,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_BIDE] =
+ {
+ .effect = EFFECT_BIDE,
+ .power = 1,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_METRONOME] =
+ {
+ .effect = EFFECT_METRONOME,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_DEPENDS,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_MIRROR_MOVE] =
+ {
+ .effect = EFFECT_MIRROR_MOVE,
+ .power = 0,
+ .type = TYPE_FLYING,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_DEPENDS,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_SELF_DESTRUCT] =
+ {
+ .effect = EFFECT_EXPLOSION,
+ .power = 200,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_FOES_AND_ALLY,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_EGG_BOMB] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 100,
+ .type = TYPE_NORMAL,
+ .accuracy = 75,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_LICK] =
+ {
+ .effect = EFFECT_PARALYZE_HIT,
+ .power = 20,
+ .type = TYPE_GHOST,
+ .accuracy = 100,
+ .pp = 30,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SMOG] =
+ {
+ .effect = EFFECT_POISON_HIT,
+ .power = 20,
+ .type = TYPE_POISON,
+ .accuracy = 70,
+ .pp = 20,
+ .secondaryEffectChance = 40,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SLUDGE] =
+ {
+ .effect = EFFECT_POISON_HIT,
+ .power = 65,
+ .type = TYPE_POISON,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_BONE_CLUB] =
+ {
+ .effect = EFFECT_FLINCH_HIT,
+ .power = 65,
+ .type = TYPE_GROUND,
+ .accuracy = 85,
+ .pp = 20,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_FIRE_BLAST] =
+ {
+ .effect = EFFECT_BURN_HIT,
+ .power = 120,
+ .type = TYPE_FIRE,
+ .accuracy = 85,
+ .pp = 5,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_WATERFALL] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 80,
+ .type = TYPE_WATER,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_CLAMP] =
+ {
+ .effect = EFFECT_TRAP,
+ .power = 35,
+ .type = TYPE_WATER,
+ .accuracy = 75,
+ .pp = 10,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SWIFT] =
+ {
+ .effect = EFFECT_ALWAYS_HIT,
+ .power = 60,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SKULL_BASH] =
+ {
+ .effect = EFFECT_SKULL_BASH,
+ .power = 100,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SPIKE_CANNON] =
+ {
+ .effect = EFFECT_MULTI_HIT,
+ .power = 20,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_CONSTRICT] =
+ {
+ .effect = EFFECT_SPEED_DOWN_HIT,
+ .power = 10,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 35,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_AMNESIA] =
+ {
+ .effect = EFFECT_SPECIAL_DEFENSE_UP_2,
+ .power = 0,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_KINESIS] =
+ {
+ .effect = EFFECT_ACCURACY_DOWN,
+ .power = 0,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 80,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SOFT_BOILED] =
+ {
+ .effect = EFFECT_SOFTBOILED,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_HI_JUMP_KICK] =
+ {
+ .effect = EFFECT_RECOIL_IF_MISS,
+ .power = 85,
+ .type = TYPE_FIGHTING,
+ .accuracy = 90,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_GLARE] =
+ {
+ .effect = EFFECT_PARALYZE,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 75,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_DREAM_EATER] =
+ {
+ .effect = EFFECT_DREAM_EATER,
+ .power = 100,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_POISON_GAS] =
+ {
+ .effect = EFFECT_POISON,
+ .power = 0,
+ .type = TYPE_POISON,
+ .accuracy = 55,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_BARRAGE] =
+ {
+ .effect = EFFECT_MULTI_HIT,
+ .power = 15,
+ .type = TYPE_NORMAL,
+ .accuracy = 85,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_LEECH_LIFE] =
+ {
+ .effect = EFFECT_ABSORB,
+ .power = 20,
+ .type = TYPE_BUG,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_LOVELY_KISS] =
+ {
+ .effect = EFFECT_SLEEP,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 75,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SKY_ATTACK] =
+ {
+ .effect = EFFECT_SKY_ATTACK,
+ .power = 140,
+ .type = TYPE_FLYING,
+ .accuracy = 90,
+ .pp = 5,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_TRANSFORM] =
+ {
+ .effect = EFFECT_TRANSFORM,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_BUBBLE] =
+ {
+ .effect = EFFECT_SPEED_DOWN_HIT,
+ .power = 20,
+ .type = TYPE_WATER,
+ .accuracy = 100,
+ .pp = 30,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_DIZZY_PUNCH] =
+ {
+ .effect = EFFECT_CONFUSE_HIT,
+ .power = 70,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 20,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SPORE] =
+ {
+ .effect = EFFECT_SLEEP,
+ .power = 0,
+ .type = TYPE_GRASS,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_FLASH] =
+ {
+ .effect = EFFECT_ACCURACY_DOWN,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 70,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_PSYWAVE] =
+ {
+ .effect = EFFECT_PSYWAVE,
+ .power = 1,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 80,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SPLASH] =
+ {
+ .effect = EFFECT_SPLASH,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_ACID_ARMOR] =
+ {
+ .effect = EFFECT_DEFENSE_UP_2,
+ .power = 0,
+ .type = TYPE_POISON,
+ .accuracy = 0,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_CRABHAMMER] =
+ {
+ .effect = EFFECT_HIGH_CRITICAL,
+ .power = 90,
+ .type = TYPE_WATER,
+ .accuracy = 85,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_EXPLOSION] =
+ {
+ .effect = EFFECT_EXPLOSION,
+ .power = 250,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_FOES_AND_ALLY,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_FURY_SWIPES] =
+ {
+ .effect = EFFECT_MULTI_HIT,
+ .power = 18,
+ .type = TYPE_NORMAL,
+ .accuracy = 80,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_BONEMERANG] =
+ {
+ .effect = EFFECT_DOUBLE_HIT,
+ .power = 50,
+ .type = TYPE_GROUND,
+ .accuracy = 90,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_REST] =
+ {
+ .effect = EFFECT_REST,
+ .power = 0,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 0,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_ROCK_SLIDE] =
+ {
+ .effect = EFFECT_FLINCH_HIT,
+ .power = 75,
+ .type = TYPE_ROCK,
+ .accuracy = 90,
+ .pp = 10,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_HYPER_FANG] =
+ {
+ .effect = EFFECT_FLINCH_HIT,
+ .power = 80,
+ .type = TYPE_NORMAL,
+ .accuracy = 90,
+ .pp = 15,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SHARPEN] =
+ {
+ .effect = EFFECT_ATTACK_UP,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_CONVERSION] =
+ {
+ .effect = EFFECT_CONVERSION,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_TRI_ATTACK] =
+ {
+ .effect = EFFECT_TRI_ATTACK,
+ .power = 80,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 20,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SUPER_FANG] =
+ {
+ .effect = EFFECT_SUPER_FANG,
+ .power = 1,
+ .type = TYPE_NORMAL,
+ .accuracy = 90,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SLASH] =
+ {
+ .effect = EFFECT_HIGH_CRITICAL,
+ .power = 70,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SUBSTITUTE] =
+ {
+ .effect = EFFECT_SUBSTITUTE,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_STRUGGLE] =
+ {
+ .effect = EFFECT_RECOIL,
+ .power = 50,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 1,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SKETCH] =
+ {
+ .effect = EFFECT_SKETCH,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 1,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_TRIPLE_KICK] =
+ {
+ .effect = EFFECT_TRIPLE_KICK,
+ .power = 10,
+ .type = TYPE_FIGHTING,
+ .accuracy = 90,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_THIEF] =
+ {
+ .effect = EFFECT_THIEF,
+ .power = 40,
+ .type = TYPE_DARK,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SPIDER_WEB] =
+ {
+ .effect = EFFECT_MEAN_LOOK,
+ .power = 0,
+ .type = TYPE_BUG,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_MIND_READER] =
+ {
+ .effect = EFFECT_LOCK_ON,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_NIGHTMARE] =
+ {
+ .effect = EFFECT_NIGHTMARE,
+ .power = 0,
+ .type = TYPE_GHOST,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_FLAME_WHEEL] =
+ {
+ .effect = EFFECT_THAW_HIT,
+ .power = 60,
+ .type = TYPE_FIRE,
+ .accuracy = 100,
+ .pp = 25,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SNORE] =
+ {
+ .effect = EFFECT_SNORE,
+ .power = 40,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_CURSE] =
+ {
+ .effect = EFFECT_CURSE,
+ .power = 0,
+ .type = TYPE_MYSTERY,
+ .accuracy = 0,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_FLAIL] =
+ {
+ .effect = EFFECT_FLAIL,
+ .power = 1,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_CONVERSION_2] =
+ {
+ .effect = EFFECT_CONVERSION_2,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_AEROBLAST] =
+ {
+ .effect = EFFECT_HIGH_CRITICAL,
+ .power = 100,
+ .type = TYPE_FLYING,
+ .accuracy = 95,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_COTTON_SPORE] =
+ {
+ .effect = EFFECT_SPEED_DOWN_2,
+ .power = 0,
+ .type = TYPE_GRASS,
+ .accuracy = 85,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_REVERSAL] =
+ {
+ .effect = EFFECT_FLAIL,
+ .power = 1,
+ .type = TYPE_FIGHTING,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SPITE] =
+ {
+ .effect = EFFECT_SPITE,
+ .power = 0,
+ .type = TYPE_GHOST,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_POWDER_SNOW] =
+ {
+ .effect = EFFECT_FREEZE_HIT,
+ .power = 40,
+ .type = TYPE_ICE,
+ .accuracy = 100,
+ .pp = 25,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_PROTECT] =
+ {
+ .effect = EFFECT_PROTECT,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 3,
+ .flags = 0,
+ },
+
+ [MOVE_MACH_PUNCH] =
+ {
+ .effect = EFFECT_QUICK_ATTACK,
+ .power = 40,
+ .type = TYPE_FIGHTING,
+ .accuracy = 100,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 1,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SCARY_FACE] =
+ {
+ .effect = EFFECT_SPEED_DOWN_2,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 90,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_FAINT_ATTACK] =
+ {
+ .effect = EFFECT_ALWAYS_HIT,
+ .power = 60,
+ .type = TYPE_DARK,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SWEET_KISS] =
+ {
+ .effect = EFFECT_CONFUSE,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 75,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_BELLY_DRUM] =
+ {
+ .effect = EFFECT_BELLY_DRUM,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_SLUDGE_BOMB] =
+ {
+ .effect = EFFECT_POISON_HIT,
+ .power = 90,
+ .type = TYPE_POISON,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_MUD_SLAP] =
+ {
+ .effect = EFFECT_ACCURACY_DOWN_HIT,
+ .power = 20,
+ .type = TYPE_GROUND,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_OCTAZOOKA] =
+ {
+ .effect = EFFECT_ACCURACY_DOWN_HIT,
+ .power = 65,
+ .type = TYPE_WATER,
+ .accuracy = 85,
+ .pp = 10,
+ .secondaryEffectChance = 50,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SPIKES] =
+ {
+ .effect = EFFECT_SPIKES,
+ .power = 0,
+ .type = TYPE_GROUND,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_OPPONENTS_FIELD,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_ZAP_CANNON] =
+ {
+ .effect = EFFECT_PARALYZE_HIT,
+ .power = 100,
+ .type = TYPE_ELECTRIC,
+ .accuracy = 50,
+ .pp = 5,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_FORESIGHT] =
+ {
+ .effect = EFFECT_FORESIGHT,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_DESTINY_BOND] =
+ {
+ .effect = EFFECT_DESTINY_BOND,
+ .power = 0,
+ .type = TYPE_GHOST,
+ .accuracy = 0,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_PERISH_SONG] =
+ {
+ .effect = EFFECT_PERISH_SONG,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_ICY_WIND] =
+ {
+ .effect = EFFECT_SPEED_DOWN_HIT,
+ .power = 55,
+ .type = TYPE_ICE,
+ .accuracy = 95,
+ .pp = 15,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_DETECT] =
+ {
+ .effect = EFFECT_PROTECT,
+ .power = 0,
+ .type = TYPE_FIGHTING,
+ .accuracy = 0,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 3,
+ .flags = 0,
+ },
+
+ [MOVE_BONE_RUSH] =
+ {
+ .effect = EFFECT_MULTI_HIT,
+ .power = 25,
+ .type = TYPE_GROUND,
+ .accuracy = 80,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_LOCK_ON] =
+ {
+ .effect = EFFECT_LOCK_ON,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_OUTRAGE] =
+ {
+ .effect = EFFECT_RAMPAGE,
+ .power = 90,
+ .type = TYPE_DRAGON,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_RANDOM,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SANDSTORM] =
+ {
+ .effect = EFFECT_SANDSTORM,
+ .power = 0,
+ .type = TYPE_ROCK,
+ .accuracy = 0,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_GIGA_DRAIN] =
+ {
+ .effect = EFFECT_ABSORB,
+ .power = 60,
+ .type = TYPE_GRASS,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_ENDURE] =
+ {
+ .effect = EFFECT_ENDURE,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 3,
+ .flags = 0,
+ },
+
+ [MOVE_CHARM] =
+ {
+ .effect = EFFECT_ATTACK_DOWN_2,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_ROLLOUT] =
+ {
+ .effect = EFFECT_ROLLOUT,
+ .power = 30,
+ .type = TYPE_ROCK,
+ .accuracy = 90,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_FALSE_SWIPE] =
+ {
+ .effect = EFFECT_FALSE_SWIPE,
+ .power = 40,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SWAGGER] =
+ {
+ .effect = EFFECT_SWAGGER,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 90,
+ .pp = 15,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_MILK_DRINK] =
+ {
+ .effect = EFFECT_SOFTBOILED,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_SPARK] =
+ {
+ .effect = EFFECT_PARALYZE_HIT,
+ .power = 65,
+ .type = TYPE_ELECTRIC,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_FURY_CUTTER] =
+ {
+ .effect = EFFECT_FURY_CUTTER,
+ .power = 10,
+ .type = TYPE_BUG,
+ .accuracy = 95,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_STEEL_WING] =
+ {
+ .effect = EFFECT_DEFENSE_UP_HIT,
+ .power = 70,
+ .type = TYPE_STEEL,
+ .accuracy = 90,
+ .pp = 25,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_MEAN_LOOK] =
+ {
+ .effect = EFFECT_MEAN_LOOK,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_ATTRACT] =
+ {
+ .effect = EFFECT_ATTRACT,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SLEEP_TALK] =
+ {
+ .effect = EFFECT_SLEEP_TALK,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_DEPENDS,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_HEAL_BELL] =
+ {
+ .effect = EFFECT_HEAL_BELL,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_RETURN] =
+ {
+ .effect = EFFECT_RETURN,
+ .power = 1,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_PRESENT] =
+ {
+ .effect = EFFECT_PRESENT,
+ .power = 1,
+ .type = TYPE_NORMAL,
+ .accuracy = 90,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_FRUSTRATION] =
+ {
+ .effect = EFFECT_FRUSTRATION,
+ .power = 1,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SAFEGUARD] =
+ {
+ .effect = EFFECT_SAFEGUARD,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 25,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_PAIN_SPLIT] =
+ {
+ .effect = EFFECT_PAIN_SPLIT,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SACRED_FIRE] =
+ {
+ .effect = EFFECT_THAW_HIT,
+ .power = 100,
+ .type = TYPE_FIRE,
+ .accuracy = 95,
+ .pp = 5,
+ .secondaryEffectChance = 50,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_MAGNITUDE] =
+ {
+ .effect = EFFECT_MAGNITUDE,
+ .power = 1,
+ .type = TYPE_GROUND,
+ .accuracy = 100,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_FOES_AND_ALLY,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_DYNAMIC_PUNCH] =
+ {
+ .effect = EFFECT_CONFUSE_HIT,
+ .power = 100,
+ .type = TYPE_FIGHTING,
+ .accuracy = 50,
+ .pp = 5,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_MEGAHORN] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 120,
+ .type = TYPE_BUG,
+ .accuracy = 85,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_DRAGON_BREATH] =
+ {
+ .effect = EFFECT_PARALYZE_HIT,
+ .power = 60,
+ .type = TYPE_DRAGON,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_BATON_PASS] =
+ {
+ .effect = EFFECT_BATON_PASS,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_ENCORE] =
+ {
+ .effect = EFFECT_ENCORE,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_PURSUIT] =
+ {
+ .effect = EFFECT_PURSUIT,
+ .power = 40,
+ .type = TYPE_DARK,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_RAPID_SPIN] =
+ {
+ .effect = EFFECT_RAPID_SPIN,
+ .power = 20,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SWEET_SCENT] =
+ {
+ .effect = EFFECT_EVASION_DOWN,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_IRON_TAIL] =
+ {
+ .effect = EFFECT_DEFENSE_DOWN_HIT,
+ .power = 100,
+ .type = TYPE_STEEL,
+ .accuracy = 75,
+ .pp = 15,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_METAL_CLAW] =
+ {
+ .effect = EFFECT_ATTACK_UP_HIT,
+ .power = 50,
+ .type = TYPE_STEEL,
+ .accuracy = 95,
+ .pp = 35,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_VITAL_THROW] =
+ {
+ .effect = EFFECT_VITAL_THROW,
+ .power = 70,
+ .type = TYPE_FIGHTING,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = -1,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_MORNING_SUN] =
+ {
+ .effect = EFFECT_MORNING_SUN,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_SYNTHESIS] =
+ {
+ .effect = EFFECT_SYNTHESIS,
+ .power = 0,
+ .type = TYPE_GRASS,
+ .accuracy = 0,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_MOONLIGHT] =
+ {
+ .effect = EFFECT_MOONLIGHT,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_HIDDEN_POWER] =
+ {
+ .effect = EFFECT_HIDDEN_POWER,
+ .power = 1,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_CROSS_CHOP] =
+ {
+ .effect = EFFECT_HIGH_CRITICAL,
+ .power = 100,
+ .type = TYPE_FIGHTING,
+ .accuracy = 80,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_TWISTER] =
+ {
+ .effect = EFFECT_TWISTER,
+ .power = 40,
+ .type = TYPE_DRAGON,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 20,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_RAIN_DANCE] =
+ {
+ .effect = EFFECT_RAIN_DANCE,
+ .power = 0,
+ .type = TYPE_WATER,
+ .accuracy = 0,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_SUNNY_DAY] =
+ {
+ .effect = EFFECT_SUNNY_DAY,
+ .power = 0,
+ .type = TYPE_FIRE,
+ .accuracy = 0,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_CRUNCH] =
+ {
+ .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT,
+ .power = 80,
+ .type = TYPE_DARK,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 20,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_MIRROR_COAT] =
+ {
+ .effect = EFFECT_MIRROR_COAT,
+ .power = 1,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_DEPENDS,
+ .priority = -5,
+ .flags = FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_PSYCH_UP] =
+ {
+ .effect = EFFECT_PSYCH_UP,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_EXTREME_SPEED] =
+ {
+ .effect = EFFECT_QUICK_ATTACK,
+ .power = 80,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 1,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_ANCIENT_POWER] =
+ {
+ .effect = EFFECT_ALL_STATS_UP_HIT,
+ .power = 60,
+ .type = TYPE_ROCK,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SHADOW_BALL] =
+ {
+ .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT,
+ .power = 80,
+ .type = TYPE_GHOST,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 20,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_FUTURE_SIGHT] =
+ {
+ .effect = EFFECT_FUTURE_SIGHT,
+ .power = 80,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 90,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_ROCK_SMASH] =
+ {
+ .effect = EFFECT_DEFENSE_DOWN_HIT,
+ .power = 20,
+ .type = TYPE_FIGHTING,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 50,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_WHIRLPOOL] =
+ {
+ .effect = EFFECT_TRAP,
+ .power = 15,
+ .type = TYPE_WATER,
+ .accuracy = 70,
+ .pp = 15,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_BEAT_UP] =
+ {
+ .effect = EFFECT_BEAT_UP,
+ .power = 10,
+ .type = TYPE_DARK,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_FAKE_OUT] =
+ {
+ .effect = EFFECT_FAKE_OUT,
+ .power = 40,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 1,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_UPROAR] =
+ {
+ .effect = EFFECT_UPROAR,
+ .power = 50,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_RANDOM,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_STOCKPILE] =
+ {
+ .effect = EFFECT_STOCKPILE,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_SPIT_UP] =
+ {
+ .effect = EFFECT_SPIT_UP,
+ .power = 100,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SWALLOW] =
+ {
+ .effect = EFFECT_SWALLOW,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_HEAT_WAVE] =
+ {
+ .effect = EFFECT_BURN_HIT,
+ .power = 100,
+ .type = TYPE_FIRE,
+ .accuracy = 90,
+ .pp = 10,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_HAIL] =
+ {
+ .effect = EFFECT_HAIL,
+ .power = 0,
+ .type = TYPE_ICE,
+ .accuracy = 0,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED,
+ },
+
+ [MOVE_TORMENT] =
+ {
+ .effect = EFFECT_TORMENT,
+ .power = 0,
+ .type = TYPE_DARK,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_FLATTER] =
+ {
+ .effect = EFFECT_FLATTER,
+ .power = 0,
+ .type = TYPE_DARK,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_WILL_O_WISP] =
+ {
+ .effect = EFFECT_WILL_O_WISP,
+ .power = 0,
+ .type = TYPE_FIRE,
+ .accuracy = 75,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_MEMENTO] =
+ {
+ .effect = EFFECT_MEMENTO,
+ .power = 0,
+ .type = TYPE_DARK,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_FACADE] =
+ {
+ .effect = EFFECT_FACADE,
+ .power = 70,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_FOCUS_PUNCH] =
+ {
+ .effect = EFFECT_FOCUS_PUNCH,
+ .power = 150,
+ .type = TYPE_FIGHTING,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = -3,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED,
+ },
+
+ [MOVE_SMELLING_SALT] =
+ {
+ .effect = EFFECT_SMELLINGSALT,
+ .power = 60,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_FOLLOW_ME] =
+ {
+ .effect = EFFECT_FOLLOW_ME,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 3,
+ .flags = 0,
+ },
+
+ [MOVE_NATURE_POWER] =
+ {
+ .effect = EFFECT_NATURE_POWER,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_DEPENDS,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_CHARGE] =
+ {
+ .effect = EFFECT_CHARGE,
+ .power = 0,
+ .type = TYPE_ELECTRIC,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_TAUNT] =
+ {
+ .effect = EFFECT_TAUNT,
+ .power = 0,
+ .type = TYPE_DARK,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED,
+ },
+
+ [MOVE_HELPING_HAND] =
+ {
+ .effect = EFFECT_HELPING_HAND,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 5,
+ .flags = 0,
+ },
+
+ [MOVE_TRICK] =
+ {
+ .effect = EFFECT_TRICK,
+ .power = 0,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_ROLE_PLAY] =
+ {
+ .effect = EFFECT_ROLE_PLAY,
+ .power = 0,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_WISH] =
+ {
+ .effect = EFFECT_WISH,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED,
+ },
+
+ [MOVE_ASSIST] =
+ {
+ .effect = EFFECT_ASSIST,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_DEPENDS,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_INGRAIN] =
+ {
+ .effect = EFFECT_INGRAIN,
+ .power = 0,
+ .type = TYPE_GRASS,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_SUPERPOWER] =
+ {
+ .effect = EFFECT_SUPERPOWER,
+ .power = 120,
+ .type = TYPE_FIGHTING,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_MAGIC_COAT] =
+ {
+ .effect = EFFECT_MAGIC_COAT,
+ .power = 0,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_DEPENDS,
+ .priority = 4,
+ .flags = 0,
+ },
+
+ [MOVE_RECYCLE] =
+ {
+ .effect = EFFECT_RECYCLE,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_REVENGE] =
+ {
+ .effect = EFFECT_REVENGE,
+ .power = 60,
+ .type = TYPE_FIGHTING,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = -4,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_BRICK_BREAK] =
+ {
+ .effect = EFFECT_BRICK_BREAK,
+ .power = 75,
+ .type = TYPE_FIGHTING,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_YAWN] =
+ {
+ .effect = EFFECT_YAWN,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_KNOCK_OFF] =
+ {
+ .effect = EFFECT_KNOCK_OFF,
+ .power = 20,
+ .type = TYPE_DARK,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_ENDEAVOR] =
+ {
+ .effect = EFFECT_ENDEAVOR,
+ .power = 1,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_ERUPTION] =
+ {
+ .effect = EFFECT_ERUPTION,
+ .power = 150,
+ .type = TYPE_FIRE,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SKILL_SWAP] =
+ {
+ .effect = EFFECT_SKILL_SWAP,
+ .power = 0,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_IMPRISON] =
+ {
+ .effect = EFFECT_IMPRISON,
+ .power = 0,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED,
+ },
+
+ [MOVE_REFRESH] =
+ {
+ .effect = EFFECT_REFRESH,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_GRUDGE] =
+ {
+ .effect = EFFECT_GRUDGE,
+ .power = 0,
+ .type = TYPE_GHOST,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SNATCH] =
+ {
+ .effect = EFFECT_SNATCH,
+ .power = 0,
+ .type = TYPE_DARK,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_DEPENDS,
+ .priority = 4,
+ .flags = 0,
+ },
+
+ [MOVE_SECRET_POWER] =
+ {
+ .effect = EFFECT_SECRET_POWER,
+ .power = 70,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_DIVE] =
+ {
+ .effect = EFFECT_SEMI_INVULNERABLE,
+ .power = 60,
+ .type = TYPE_WATER,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_ARM_THRUST] =
+ {
+ .effect = EFFECT_MULTI_HIT,
+ .power = 15,
+ .type = TYPE_FIGHTING,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_CAMOUFLAGE] =
+ {
+ .effect = EFFECT_CAMOUFLAGE,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_TAIL_GLOW] =
+ {
+ .effect = EFFECT_SPECIAL_ATTACK_UP_2,
+ .power = 0,
+ .type = TYPE_BUG,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_LUSTER_PURGE] =
+ {
+ .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT,
+ .power = 70,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 50,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_MIST_BALL] =
+ {
+ .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT,
+ .power = 70,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 50,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_FEATHER_DANCE] =
+ {
+ .effect = EFFECT_ATTACK_DOWN_2,
+ .power = 0,
+ .type = TYPE_FLYING,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_TEETER_DANCE] =
+ {
+ .effect = EFFECT_TEETER_DANCE,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_FOES_AND_ALLY,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED,
+ },
+
+ [MOVE_BLAZE_KICK] =
+ {
+ .effect = EFFECT_BLAZE_KICK,
+ .power = 85,
+ .type = TYPE_FIRE,
+ .accuracy = 90,
+ .pp = 10,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_MUD_SPORT] =
+ {
+ .effect = EFFECT_MUD_SPORT,
+ .power = 0,
+ .type = TYPE_GROUND,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_ICE_BALL] =
+ {
+ .effect = EFFECT_ROLLOUT,
+ .power = 30,
+ .type = TYPE_ICE,
+ .accuracy = 90,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_NEEDLE_ARM] =
+ {
+ .effect = EFFECT_FLINCH_MINIMIZE_HIT,
+ .power = 60,
+ .type = TYPE_GRASS,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SLACK_OFF] =
+ {
+ .effect = EFFECT_RESTORE_HP,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_HYPER_VOICE] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 90,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_POISON_FANG] =
+ {
+ .effect = EFFECT_POISON_FANG,
+ .power = 50,
+ .type = TYPE_POISON,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_CRUSH_CLAW] =
+ {
+ .effect = EFFECT_DEFENSE_DOWN_HIT,
+ .power = 75,
+ .type = TYPE_NORMAL,
+ .accuracy = 95,
+ .pp = 10,
+ .secondaryEffectChance = 50,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_BLAST_BURN] =
+ {
+ .effect = EFFECT_RECHARGE,
+ .power = 150,
+ .type = TYPE_FIRE,
+ .accuracy = 90,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_HYDRO_CANNON] =
+ {
+ .effect = EFFECT_RECHARGE,
+ .power = 150,
+ .type = TYPE_WATER,
+ .accuracy = 90,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_METEOR_MASH] =
+ {
+ .effect = EFFECT_ATTACK_UP_HIT,
+ .power = 100,
+ .type = TYPE_STEEL,
+ .accuracy = 85,
+ .pp = 10,
+ .secondaryEffectChance = 20,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_ASTONISH] =
+ {
+ .effect = EFFECT_FLINCH_MINIMIZE_HIT,
+ .power = 30,
+ .type = TYPE_GHOST,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_WEATHER_BALL] =
+ {
+ .effect = EFFECT_WEATHER_BALL,
+ .power = 50,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_AROMATHERAPY] =
+ {
+ .effect = EFFECT_HEAL_BELL,
+ .power = 0,
+ .type = TYPE_GRASS,
+ .accuracy = 0,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_FAKE_TEARS] =
+ {
+ .effect = EFFECT_SPECIAL_DEFENSE_DOWN_2,
+ .power = 0,
+ .type = TYPE_DARK,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_AIR_CUTTER] =
+ {
+ .effect = EFFECT_HIGH_CRITICAL,
+ .power = 55,
+ .type = TYPE_FLYING,
+ .accuracy = 95,
+ .pp = 25,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_OVERHEAT] =
+ {
+ .effect = EFFECT_OVERHEAT,
+ .power = 140,
+ .type = TYPE_FIRE,
+ .accuracy = 90,
+ .pp = 5,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_ODOR_SLEUTH] =
+ {
+ .effect = EFFECT_FORESIGHT,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_ROCK_TOMB] =
+ {
+ .effect = EFFECT_SPEED_DOWN_HIT,
+ .power = 50,
+ .type = TYPE_ROCK,
+ .accuracy = 80,
+ .pp = 10,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SILVER_WIND] =
+ {
+ .effect = EFFECT_ALL_STATS_UP_HIT,
+ .power = 60,
+ .type = TYPE_BUG,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_METAL_SOUND] =
+ {
+ .effect = EFFECT_SPECIAL_DEFENSE_DOWN_2,
+ .power = 0,
+ .type = TYPE_STEEL,
+ .accuracy = 85,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_GRASS_WHISTLE] =
+ {
+ .effect = EFFECT_SLEEP,
+ .power = 0,
+ .type = TYPE_GRASS,
+ .accuracy = 55,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_TICKLE] =
+ {
+ .effect = EFFECT_TICKLE,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_COSMIC_POWER] =
+ {
+ .effect = EFFECT_COSMIC_POWER,
+ .power = 0,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_WATER_SPOUT] =
+ {
+ .effect = EFFECT_ERUPTION,
+ .power = 150,
+ .type = TYPE_WATER,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SIGNAL_BEAM] =
+ {
+ .effect = EFFECT_CONFUSE_HIT,
+ .power = 75,
+ .type = TYPE_BUG,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SHADOW_PUNCH] =
+ {
+ .effect = EFFECT_ALWAYS_HIT,
+ .power = 60,
+ .type = TYPE_GHOST,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_EXTRASENSORY] =
+ {
+ .effect = EFFECT_FLINCH_MINIMIZE_HIT,
+ .power = 80,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 100,
+ .pp = 30,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_SKY_UPPERCUT] =
+ {
+ .effect = EFFECT_SKY_UPPERCUT,
+ .power = 85,
+ .type = TYPE_FIGHTING,
+ .accuracy = 90,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SAND_TOMB] =
+ {
+ .effect = EFFECT_TRAP,
+ .power = 15,
+ .type = TYPE_GROUND,
+ .accuracy = 70,
+ .pp = 15,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SHEER_COLD] =
+ {
+ .effect = EFFECT_OHKO,
+ .power = 1,
+ .type = TYPE_ICE,
+ .accuracy = 30,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_MUDDY_WATER] =
+ {
+ .effect = EFFECT_ACCURACY_DOWN_HIT,
+ .power = 95,
+ .type = TYPE_WATER,
+ .accuracy = 85,
+ .pp = 10,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_BOTH,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_BULLET_SEED] =
+ {
+ .effect = EFFECT_MULTI_HIT,
+ .power = 10,
+ .type = TYPE_GRASS,
+ .accuracy = 100,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_AERIAL_ACE] =
+ {
+ .effect = EFFECT_ALWAYS_HIT,
+ .power = 60,
+ .type = TYPE_FLYING,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_ICICLE_SPEAR] =
+ {
+ .effect = EFFECT_MULTI_HIT,
+ .power = 10,
+ .type = TYPE_ICE,
+ .accuracy = 100,
+ .pp = 30,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_IRON_DEFENSE] =
+ {
+ .effect = EFFECT_DEFENSE_UP_2,
+ .power = 0,
+ .type = TYPE_STEEL,
+ .accuracy = 0,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_BLOCK] =
+ {
+ .effect = EFFECT_MEAN_LOOK,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_HOWL] =
+ {
+ .effect = EFFECT_ATTACK_UP,
+ .power = 0,
+ .type = TYPE_NORMAL,
+ .accuracy = 0,
+ .pp = 40,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_DRAGON_CLAW] =
+ {
+ .effect = EFFECT_HIT,
+ .power = 80,
+ .type = TYPE_DRAGON,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_FRENZY_PLANT] =
+ {
+ .effect = EFFECT_RECHARGE,
+ .power = 150,
+ .type = TYPE_GRASS,
+ .accuracy = 90,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_BULK_UP] =
+ {
+ .effect = EFFECT_BULK_UP,
+ .power = 0,
+ .type = TYPE_FIGHTING,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_BOUNCE] =
+ {
+ .effect = EFFECT_SEMI_INVULNERABLE,
+ .power = 85,
+ .type = TYPE_FLYING,
+ .accuracy = 85,
+ .pp = 5,
+ .secondaryEffectChance = 30,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_MUD_SHOT] =
+ {
+ .effect = EFFECT_SPEED_DOWN_HIT,
+ .power = 55,
+ .type = TYPE_GROUND,
+ .accuracy = 95,
+ .pp = 15,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_POISON_TAIL] =
+ {
+ .effect = EFFECT_POISON_TAIL,
+ .power = 50,
+ .type = TYPE_POISON,
+ .accuracy = 100,
+ .pp = 25,
+ .secondaryEffectChance = 10,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_COVET] =
+ {
+ .effect = EFFECT_THIEF,
+ .power = 40,
+ .type = TYPE_NORMAL,
+ .accuracy = 100,
+ .pp = 40,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED,
+ },
+
+ [MOVE_VOLT_TACKLE] =
+ {
+ .effect = EFFECT_DOUBLE_EDGE,
+ .power = 120,
+ .type = TYPE_ELECTRIC,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_MAGICAL_LEAF] =
+ {
+ .effect = EFFECT_ALWAYS_HIT,
+ .power = 60,
+ .type = TYPE_GRASS,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_WATER_SPORT] =
+ {
+ .effect = EFFECT_WATER_SPORT,
+ .power = 0,
+ .type = TYPE_WATER,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_CALM_MIND] =
+ {
+ .effect = EFFECT_CALM_MIND,
+ .power = 0,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_LEAF_BLADE] =
+ {
+ .effect = EFFECT_HIGH_CRITICAL,
+ .power = 70,
+ .type = TYPE_GRASS,
+ .accuracy = 100,
+ .pp = 15,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_DRAGON_DANCE] =
+ {
+ .effect = EFFECT_DRAGON_DANCE,
+ .power = 0,
+ .type = TYPE_DRAGON,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_USER,
+ .priority = 0,
+ .flags = FLAG_SNATCH_AFFECTED,
+ },
+
+ [MOVE_ROCK_BLAST] =
+ {
+ .effect = EFFECT_MULTI_HIT,
+ .power = 25,
+ .type = TYPE_ROCK,
+ .accuracy = 80,
+ .pp = 10,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_SHOCK_WAVE] =
+ {
+ .effect = EFFECT_ALWAYS_HIT,
+ .power = 60,
+ .type = TYPE_ELECTRIC,
+ .accuracy = 0,
+ .pp = 20,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_WATER_PULSE] =
+ {
+ .effect = EFFECT_CONFUSE_HIT,
+ .power = 60,
+ .type = TYPE_WATER,
+ .accuracy = 100,
+ .pp = 20,
+ .secondaryEffectChance = 20,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+
+ [MOVE_DOOM_DESIRE] =
+ {
+ .effect = EFFECT_FUTURE_SIGHT,
+ .power = 120,
+ .type = TYPE_STEEL,
+ .accuracy = 85,
+ .pp = 5,
+ .secondaryEffectChance = 0,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = 0,
+ },
+
+ [MOVE_PSYCHO_BOOST] =
+ {
+ .effect = EFFECT_OVERHEAT,
+ .power = 140,
+ .type = TYPE_PSYCHIC,
+ .accuracy = 90,
+ .pp = 5,
+ .secondaryEffectChance = 100,
+ .target = MOVE_TARGET_SELECTED,
+ .priority = 0,
+ .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED,
+ },
+};
diff --git a/src/data/items.json b/src/data/items.json
new file mode 100644
index 000000000..b976e4c3e
--- /dev/null
+++ b/src/data/items.json
@@ -0,0 +1,6062 @@
+{
+ "items": [
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "MASTER BALL",
+ "itemId": "ITEM_MASTER_BALL",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The best BALL with the ultimate\\nperformance. It will catch any wild\\nPOKéMON without fail.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_POKE_BALLS",
+ "type": 0,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_PokeBallEtc",
+ "secondaryId": 0
+ },
+ {
+ "english": "ULTRA BALL",
+ "itemId": "ITEM_ULTRA_BALL",
+ "price": 1200,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A very high-grade BALL that offers\\na higher POKéMON catch rate than\\na GREAT BALL.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_POKE_BALLS",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_PokeBallEtc",
+ "secondaryId": 1
+ },
+ {
+ "english": "GREAT BALL",
+ "itemId": "ITEM_GREAT_BALL",
+ "price": 600,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A good, quality BALL that offers\\na higher POKéMON catch rate than\\na standard POKé BALL.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_POKE_BALLS",
+ "type": 2,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_PokeBallEtc",
+ "secondaryId": 2
+ },
+ {
+ "english": "POK\u00e9 BALL",
+ "itemId": "ITEM_POKE_BALL",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A BALL thrown to catch a wild\\nPOKéMON. It is designed in a\\ncapsule style.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_POKE_BALLS",
+ "type": 3,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_PokeBallEtc",
+ "secondaryId": 3
+ },
+ {
+ "english": "SAFARI BALL",
+ "itemId": "ITEM_SAFARI_BALL",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A special BALL that is used only in\\nthe SAFARI ZONE. It is finished in\\na camouflage pattern.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_POKE_BALLS",
+ "type": 4,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_PokeBallEtc",
+ "secondaryId": 4
+ },
+ {
+ "english": "NET BALL",
+ "itemId": "ITEM_NET_BALL",
+ "price": 1000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A somewhat different BALL that\\nworks especially well on WATER- and\\nBUG-type POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_POKE_BALLS",
+ "type": 5,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_PokeBallEtc",
+ "secondaryId": 5
+ },
+ {
+ "english": "DIVE BALL",
+ "itemId": "ITEM_DIVE_BALL",
+ "price": 1000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A somewhat different BALL that\\nworks especially well on POKéMON\\ndeep in the sea.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_POKE_BALLS",
+ "type": 6,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_PokeBallEtc",
+ "secondaryId": 6
+ },
+ {
+ "english": "NEST BALL",
+ "itemId": "ITEM_NEST_BALL",
+ "price": 1000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A somewhat different BALL that\\nworks especially well on weaker\\nPOKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_POKE_BALLS",
+ "type": 7,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_PokeBallEtc",
+ "secondaryId": 7
+ },
+ {
+ "english": "REPEAT BALL",
+ "itemId": "ITEM_REPEAT_BALL",
+ "price": 1000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A somewhat different BALL that\\nworks especially well on POKéMON\\ncaught before.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_POKE_BALLS",
+ "type": 8,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_PokeBallEtc",
+ "secondaryId": 8
+ },
+ {
+ "english": "TIMER BALL",
+ "itemId": "ITEM_TIMER_BALL",
+ "price": 1000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A somewhat different BALL that\\nbecomes progressively better the\\nmore turns there are in a battle.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_POKE_BALLS",
+ "type": 9,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_PokeBallEtc",
+ "secondaryId": 9
+ },
+ {
+ "english": "LUXURY BALL",
+ "itemId": "ITEM_LUXURY_BALL",
+ "price": 1000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A comfortable BALL that makes a\\ncaptured wild POKéMON quickly grow\\nfriendly.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_POKE_BALLS",
+ "type": 10,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_PokeBallEtc",
+ "secondaryId": 10
+ },
+ {
+ "english": "PREMIER BALL",
+ "itemId": "ITEM_PREMIER_BALL",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A rare BALL that has been\\nspecially made to commemorate an\\nevent of some sort.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_POKE_BALLS",
+ "type": 11,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_PokeBallEtc",
+ "secondaryId": 11
+ },
+ {
+ "english": "POTION",
+ "itemId": "ITEM_POTION",
+ "price": 300,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 20,
+ "description_english": "A spray-type wound medicine.\\nIt restores the HP of one POKéMON\\nby 20 points.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "ANTIDOTE",
+ "itemId": "ITEM_ANTIDOTE",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A spray-type medicine.\\nIt heals one POKéMON from a\\npoisoning.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "BURN HEAL",
+ "itemId": "ITEM_BURN_HEAL",
+ "price": 250,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A spray-type medicine.\\nIt heals one POKéMON of a burn.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "ICE HEAL",
+ "itemId": "ITEM_ICE_HEAL",
+ "price": 250,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A spray-type medicine.\\nIt defrosts a frozen POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "AWAKENING",
+ "itemId": "ITEM_AWAKENING",
+ "price": 250,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A spray-type medicine.\\nIt awakens a sleeping POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "PARLYZ HEAL",
+ "itemId": "ITEM_PARALYZE_HEAL",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A spray-type medicine.\\nIt heals one POKéMON from\\nparalysis.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "FULL RESTORE",
+ "itemId": "ITEM_FULL_RESTORE",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 255,
+ "description_english": "A medicine that fully restores the\\nHP and heals any status problems\\nof one POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "MAX POTION",
+ "itemId": "ITEM_MAX_POTION",
+ "price": 2500,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 255,
+ "description_english": "A spray-type wound medicine.\\nIt fully restores the HP of one\\nPOKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "HYPER POTION",
+ "itemId": "ITEM_HYPER_POTION",
+ "price": 1200,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 200,
+ "description_english": "A spray-type wound medicine.\\nIt restores the HP of one POKéMON\\nby 200 points.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "SUPER POTION",
+ "itemId": "ITEM_SUPER_POTION",
+ "price": 700,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 50,
+ "description_english": "A spray-type wound medicine.\\nIt restores the HP of one POKéMON\\nby 50 points.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "FULL HEAL",
+ "itemId": "ITEM_FULL_HEAL",
+ "price": 600,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A spray-type medicine.\\nIt heals all the status problems of\\none POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "REVIVE",
+ "itemId": "ITEM_REVIVE",
+ "price": 1500,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A medicine that revives a fainted\\nPOKéMON, restoring HP by half the\\nmaximum amount.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "MAX REVIVE",
+ "itemId": "ITEM_MAX_REVIVE",
+ "price": 4000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A medicine that revives a fainted\\nPOKéMON, restoring HP fully.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "FRESH WATER",
+ "itemId": "ITEM_FRESH_WATER",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 50,
+ "description_english": "Water with a high mineral content.\\nIt restores the HP of one POKéMON\\nby 50 points.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "SODA POP",
+ "itemId": "ITEM_SODA_POP",
+ "price": 300,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 60,
+ "description_english": "A fizzy soda drink.\\nIt restores the HP of one POKéMON\\nby 60 points.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "LEMONADE",
+ "itemId": "ITEM_LEMONADE",
+ "price": 350,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 80,
+ "description_english": "A very sweet drink.\\nIt restores the HP of one POKéMON\\nby 80 points.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "MOOMOO MILK",
+ "itemId": "ITEM_MOOMOO_MILK",
+ "price": 500,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 100,
+ "description_english": "Highly nutritious milk.\\nIt restores the HP of one POKéMON\\nby 100 points.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "ENERGYPOWDER",
+ "itemId": "ITEM_ENERGY_POWDER",
+ "price": 500,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A very bitter medicine powder.\\nIt restores the HP of one POKéMON\\nby 50 points.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "ENERGY ROOT",
+ "itemId": "ITEM_ENERGY_ROOT",
+ "price": 800,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A very bitter root.\\nIt restores the HP of one POKéMON\\nby 200 points.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "HEAL POWDER",
+ "itemId": "ITEM_HEAL_POWDER",
+ "price": 450,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A very bitter medicine powder.\\nIt heals all the status problems of\\none POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "REVIVAL HERB",
+ "itemId": "ITEM_REVIVAL_HERB",
+ "price": 2800,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A very bitter medicinal herb.\\nIt revives a fainted POKéMON,\\nrestoring HP fully.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "ETHER",
+ "itemId": "ITEM_ETHER",
+ "price": 1200,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 10,
+ "description_english": "Restores a selected move's PP by\\n10 points for one POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Ether",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Ether",
+ "secondaryId": 0
+ },
+ {
+ "english": "MAX ETHER",
+ "itemId": "ITEM_MAX_ETHER",
+ "price": 2000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 255,
+ "description_english": "Fully restores a selected move's PP\\nfor one POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Ether",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Ether",
+ "secondaryId": 0
+ },
+ {
+ "english": "ELIXIR",
+ "itemId": "ITEM_ELIXIR",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 10,
+ "description_english": "Restores the PP of all moves for\\none POKéMON by 10 points each.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Ether",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Ether",
+ "secondaryId": 0
+ },
+ {
+ "english": "MAX ELIXIR",
+ "itemId": "ITEM_MAX_ELIXIR",
+ "price": 4500,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 255,
+ "description_english": "Fully restores the PP of all moves\\nfor one POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Ether",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Ether",
+ "secondaryId": 0
+ },
+ {
+ "english": "LAVA COOKIE",
+ "itemId": "ITEM_LAVA_COOKIE",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "LAVARIDGE TOWN's local specialty.\\nIt heals all the status problems of\\none POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "BLUE FLUTE",
+ "itemId": "ITEM_BLUE_FLUTE",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A blue glass flute that awakens\\na sleeping POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "YELLOW FLUTE",
+ "itemId": "ITEM_YELLOW_FLUTE",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A yellow glass flute that snaps one\\nPOKéMON out of confusion.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "RED FLUTE",
+ "itemId": "ITEM_RED_FLUTE",
+ "price": 300,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A red glass flute that snaps one\\nPOKéMON out of infatuation.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "BLACK FLUTE",
+ "itemId": "ITEM_BLACK_FLUTE",
+ "price": 400,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 50,
+ "description_english": "A black glass flute.\\nWhen blown, it makes wild POKéMON\\nless likely to appear.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_BlackFlute",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "WHITE FLUTE",
+ "itemId": "ITEM_WHITE_FLUTE",
+ "price": 500,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 150,
+ "description_english": "A white glass flute.\\nWhen blown, it makes wild POKéMON\\nmore likely to appear.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_BlackFlute",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "BERRY JUICE",
+ "itemId": "ITEM_BERRY_JUICE",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_RESTORE_HP",
+ "holdEffectParam": 20,
+ "description_english": "A 100% pure juice.\\nIt restores the HP of one POKéMON\\nby 20 points.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "SACRED ASH",
+ "itemId": "ITEM_SACRED_ASH",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Revives all fainted POKéMON,\\nrestoring HP fully.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_SacredAsh",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SHOAL SALT",
+ "itemId": "ITEM_SHOAL_SALT",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Pure salt obtained from deep inside\\nthe SHOAL CAVE. It is extremely\\nsalty.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SHOAL SHELL",
+ "itemId": "ITEM_SHOAL_SHELL",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A pretty seashell found deep inside\\nthe SHOAL CAVE. It is striped in\\nblue and white.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "RED SHARD",
+ "itemId": "ITEM_RED_SHARD",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A small red shard.\\nIt appears to be from some sort of\\na tool made long ago.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "BLUE SHARD",
+ "itemId": "ITEM_BLUE_SHARD",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A small blue shard.\\nIt appears to be from some sort of\\na tool made long ago.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "YELLOW SHARD",
+ "itemId": "ITEM_YELLOW_SHARD",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A small yellow shard.\\nIt appears to be from some sort of\\na tool made long ago.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "GREEN SHARD",
+ "itemId": "ITEM_GREEN_SHARD",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A small green shard.\\nIt appears to be from some sort of\\na tool made long ago.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "HP UP",
+ "itemId": "ITEM_HP_UP",
+ "price": 9800,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A nutritious drink for POKéMON.\\nIt raises the base HP of one\\nPOKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "PROTEIN",
+ "itemId": "ITEM_PROTEIN",
+ "price": 9800,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A nutritious drink for POKéMON.\\nIt raises the base ATTACK stat of\\none POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "IRON",
+ "itemId": "ITEM_IRON",
+ "price": 9800,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A nutritious drink for POKéMON.\\nIt raises the base DEFENSE stat of\\none POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "CARBOS",
+ "itemId": "ITEM_CARBOS",
+ "price": 9800,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A nutritious drink for POKéMON.\\nIt raises the base SPEED stat of\\none POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "CALCIUM",
+ "itemId": "ITEM_CALCIUM",
+ "price": 9800,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A nutritious drink for POKéMON.\\nIt raises the base SP. ATK stat\\nof one POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "RARE CANDY",
+ "itemId": "ITEM_RARE_CANDY",
+ "price": 4800,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A candy that is packed with energy.\\nIt raises the level of a POKéMON\\nby one.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_RareCandy",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "PP UP",
+ "itemId": "ITEM_PP_UP",
+ "price": 9800,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Slightly raises the maximum PP of\\na selected move for one POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_PpUp",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "ZINC",
+ "itemId": "ITEM_ZINC",
+ "price": 9800,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A nutritious drink for POKéMON.\\nIt raises the base SP. DEF stat\\nof one POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "PP MAX",
+ "itemId": "ITEM_PP_MAX",
+ "price": 9800,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Raises the PP of a selected move\\nto its maximum level for one\\nPOKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_PpUp",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "GUARD SPEC.",
+ "itemId": "ITEM_GUARD_SPEC",
+ "price": 700,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An item that prevents stat reduction\\namong party POKéMON for five turns\\nafter use.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_GuardSpec",
+ "secondaryId": 0
+ },
+ {
+ "english": "DIRE HIT",
+ "itemId": "ITEM_DIRE_HIT",
+ "price": 650,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Raises the critical-hit ratio of\\nPOKéMON in battle. Wears off if the\\nPOKéMON is withdrawn.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_GuardSpec",
+ "secondaryId": 0
+ },
+ {
+ "english": "X ATTACK",
+ "itemId": "ITEM_X_ATTACK",
+ "price": 500,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Raises the ATTACK stat of POKéMON\\nin battle. Wears off if the POKéMON\\nis withdrawn.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_GuardSpec",
+ "secondaryId": 0
+ },
+ {
+ "english": "X DEFEND",
+ "itemId": "ITEM_X_DEFEND",
+ "price": 550,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Raises the DEFENSE stat of POKéMON\\nin battle. Wears off if the POKéMON\\nis withdrawn.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_GuardSpec",
+ "secondaryId": 0
+ },
+ {
+ "english": "X SPEED",
+ "itemId": "ITEM_X_SPEED",
+ "price": 350,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Raises the SPEED stat of POKéMON\\nin battle. Wears off if the POKéMON\\nis withdrawn.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_GuardSpec",
+ "secondaryId": 0
+ },
+ {
+ "english": "X ACCURACY",
+ "itemId": "ITEM_X_ACCURACY",
+ "price": 950,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Raises the accuracy stat of\\nPOKéMON in battle. Wears off if the\\nPOKéMON is withdrawn.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_GuardSpec",
+ "secondaryId": 0
+ },
+ {
+ "english": "X SPECIAL",
+ "itemId": "ITEM_X_SPECIAL",
+ "price": 350,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Raises the SP. ATK stat of\\nPOKéMON in battle. Wears off if the\\nPOKéMON is withdrawn.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_GuardSpec",
+ "secondaryId": 0
+ },
+ {
+ "english": "POK\u00e9 DOLL",
+ "itemId": "ITEM_POKE_DOLL",
+ "price": 1000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An attractive doll.\\nUse it to flee from any battle with\\na wild POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_PokeDoll",
+ "secondaryId": 0
+ },
+ {
+ "english": "FLUFFY TAIL",
+ "itemId": "ITEM_FLUFFY_TAIL",
+ "price": 1000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An attractive item.\\nUse it to flee from any battle with\\na wild POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_PokeDoll",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SUPER REPEL",
+ "itemId": "ITEM_SUPER_REPEL",
+ "price": 500,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 200,
+ "description_english": "Prevents weak wild POKéMON from\\nappearing for 200 steps.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_SuperRepel",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "MAX REPEL",
+ "itemId": "ITEM_MAX_REPEL",
+ "price": 700,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 250,
+ "description_english": "Prevents weak wild POKéMON from\\nappearing for 250 steps.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_SuperRepel",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "ESCAPE ROPE",
+ "itemId": "ITEM_ESCAPE_ROPE",
+ "price": 550,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A long, durable rope.\\nUse it to escape instantly from a\\ncave or a dungeon.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 2,
+ "fieldUseFunc": "ItemUseOutOfBattle_EscapeRope",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "REPEL",
+ "itemId": "ITEM_REPEL",
+ "price": 350,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 100,
+ "description_english": "Prevents weak wild POKéMON from\\nappearing for 100 steps.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_SuperRepel",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SUN STONE",
+ "itemId": "ITEM_SUN_STONE",
+ "price": 2100,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A peculiar stone that makes certain\\nspecies of POKéMON evolve.\\nIt is as red as the sun.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_EvoItem",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "MOON STONE",
+ "itemId": "ITEM_MOON_STONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A peculiar stone that makes certain\\nspecies of POKéMON evolve.\\nIt is as black as the night sky.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_EvoItem",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "FIRE STONE",
+ "itemId": "ITEM_FIRE_STONE",
+ "price": 2100,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A peculiar stone that makes certain\\nspecies of POKéMON evolve.\\nIt is colored orange.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_EvoItem",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "THUNDERSTONE",
+ "itemId": "ITEM_THUNDER_STONE",
+ "price": 2100,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A peculiar stone that makes certain\\nspecies of POKéMON evolve.\\nIt has a thunderbolt pattern.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_EvoItem",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "WATER STONE",
+ "itemId": "ITEM_WATER_STONE",
+ "price": 2100,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A peculiar stone that makes certain\\nspecies of POKéMON evolve.\\nIt is a clear light blue.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_EvoItem",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "LEAF STONE",
+ "itemId": "ITEM_LEAF_STONE",
+ "price": 2100,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A peculiar stone that makes certain\\nspecies of POKéMON evolve.\\nIt has a leaf pattern.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_EvoItem",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "TINYMUSHROOM",
+ "itemId": "ITEM_TINY_MUSHROOM",
+ "price": 500,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A small and rare mushroom.\\nIt is quite popular among certain\\npeople.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "BIG MUSHROOM",
+ "itemId": "ITEM_BIG_MUSHROOM",
+ "price": 5000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A large and rare mushroom.\\nIt is very popular among certain\\npeople.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "PEARL",
+ "itemId": "ITEM_PEARL",
+ "price": 1400,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A relatively small pearl that\\nsparkles in a pretty silver color.\\nIt can be sold cheaply.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "BIG PEARL",
+ "itemId": "ITEM_BIG_PEARL",
+ "price": 7500,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A quite-large pearl that sparkles\\nin a pretty silver color.\\nIt can be sold at a high price.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "STARDUST",
+ "itemId": "ITEM_STARDUST",
+ "price": 2000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A pretty red sand with a loose,\\nsilky feel.\\nIt can be sold at a high price.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "STAR PIECE",
+ "itemId": "ITEM_STAR_PIECE",
+ "price": 9800,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A shard of a pretty gem that\\nsparkles in a red color.\\nIt can be sold at a high price.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "NUGGET",
+ "itemId": "ITEM_NUGGET",
+ "price": 10000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A nugget of pure gold that gives\\noff a lustrous gleam.\\nIt can be sold at a high price.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "HEART SCALE",
+ "itemId": "ITEM_HEART_SCALE",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A pretty, heart-shaped scale that\\nis extremely rare. It glows faintly\\nin the colors of a rainbow.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "ORANGE MAIL",
+ "itemId": "ITEM_ORANGE_MAIL",
+ "price": 50,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A piece of MAIL featuring a cute\\nZIGZAGOON print.\\nIt is to be held by a POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 0,
+ "fieldUseFunc": "FieldUseFunc_OrangeMail",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "HARBOR MAIL",
+ "itemId": "ITEM_HARBOR_MAIL",
+ "price": 50,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A piece of MAIL featuring a cute\\nWINGULL print.\\nIt is to be held by a POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 0,
+ "fieldUseFunc": "FieldUseFunc_OrangeMail",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 1
+ },
+ {
+ "english": "GLITTER MAIL",
+ "itemId": "ITEM_GLITTER_MAIL",
+ "price": 50,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A piece of MAIL featuring a cute\\nPIKACHU print.\\nIt is to be held by a POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 0,
+ "fieldUseFunc": "FieldUseFunc_OrangeMail",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 2
+ },
+ {
+ "english": "MECH MAIL",
+ "itemId": "ITEM_MECH_MAIL",
+ "price": 50,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A piece of MAIL featuring a cute\\nMAGNEMITE print.\\nIt is to be held by a POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 0,
+ "fieldUseFunc": "FieldUseFunc_OrangeMail",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 3
+ },
+ {
+ "english": "WOOD MAIL",
+ "itemId": "ITEM_WOOD_MAIL",
+ "price": 50,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A piece of MAIL featuring a cute\\nSLAKOTH print.\\nIt is to be held by a POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 0,
+ "fieldUseFunc": "FieldUseFunc_OrangeMail",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 4
+ },
+ {
+ "english": "WAVE MAIL",
+ "itemId": "ITEM_WAVE_MAIL",
+ "price": 50,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A piece of MAIL featuring a cute\\nWAILMER print.\\nIt is to be held by a POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 0,
+ "fieldUseFunc": "FieldUseFunc_OrangeMail",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 5
+ },
+ {
+ "english": "BEAD MAIL",
+ "itemId": "ITEM_BEAD_MAIL",
+ "price": 50,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A piece of MAIL to be held by a\\nPOKéMON. It will bear the print of\\nthe POKéMON holding it.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 0,
+ "fieldUseFunc": "FieldUseFunc_OrangeMail",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 6
+ },
+ {
+ "english": "SHADOW MAIL",
+ "itemId": "ITEM_SHADOW_MAIL",
+ "price": 50,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A piece of MAIL featuring a cute\\nDUSKULL print.\\nIt is to be held by a POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 0,
+ "fieldUseFunc": "FieldUseFunc_OrangeMail",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 7
+ },
+ {
+ "english": "TROPIC MAIL",
+ "itemId": "ITEM_TROPIC_MAIL",
+ "price": 50,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A piece of MAIL featuring a cute\\nBELLOSSOM print.\\nIt is to be held by a POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 0,
+ "fieldUseFunc": "FieldUseFunc_OrangeMail",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 8
+ },
+ {
+ "english": "DREAM MAIL",
+ "itemId": "ITEM_DREAM_MAIL",
+ "price": 50,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A piece of MAIL to be held by a\\nPOKéMON. It will bear the print of\\nthe POKéMON holding it.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 0,
+ "fieldUseFunc": "FieldUseFunc_OrangeMail",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 9
+ },
+ {
+ "english": "FAB MAIL",
+ "itemId": "ITEM_FAB_MAIL",
+ "price": 50,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A piece of MAIL featuring a\\ngorgeous, extravagant print.\\nIt is to be held by a POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 0,
+ "fieldUseFunc": "FieldUseFunc_OrangeMail",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 10
+ },
+ {
+ "english": "RETRO MAIL",
+ "itemId": "ITEM_RETRO_MAIL",
+ "price": 50,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A piece of MAIL featuring a print\\nof three cute POKéMON.\\nIt is to be held by a POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 0,
+ "fieldUseFunc": "FieldUseFunc_OrangeMail",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 11
+ },
+ {
+ "english": "CHERI BERRY",
+ "itemId": "ITEM_CHERI_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_CURE_PAR",
+ "holdEffectParam": 0,
+ "description_english": "When held by a POKéMON, it will be\\nused in battle to heal paralysis.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "CHESTO BERRY",
+ "itemId": "ITEM_CHESTO_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_CURE_SLP",
+ "holdEffectParam": 0,
+ "description_english": "When held by a POKéMON, it will be\\nused in battle to wake up.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "PECHA BERRY",
+ "itemId": "ITEM_PECHA_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_CURE_PSN",
+ "holdEffectParam": 0,
+ "description_english": "When held by a POKéMON, it will be\\nused in battle to cure poison.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "RAWST BERRY",
+ "itemId": "ITEM_RAWST_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_CURE_BRN",
+ "holdEffectParam": 0,
+ "description_english": "When held by a POKéMON, it will be\\nused in battle to heal a burn.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "ASPEAR BERRY",
+ "itemId": "ITEM_ASPEAR_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_CURE_FRZ",
+ "holdEffectParam": 0,
+ "description_english": "When held by a POKéMON, it will be\\nused in battle for defrosting.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "LEPPA BERRY",
+ "itemId": "ITEM_LEPPA_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_RESTORE_PP",
+ "holdEffectParam": 10,
+ "description_english": "When held by a POKéMON, it will be\\nused in battle to restore 10 PP.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Ether",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Ether",
+ "secondaryId": 0
+ },
+ {
+ "english": "ORAN BERRY",
+ "itemId": "ITEM_ORAN_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_RESTORE_HP",
+ "holdEffectParam": 10,
+ "description_english": "When held by a POKéMON, it will be\\nused in battle to restore 10 HP.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "PERSIM BERRY",
+ "itemId": "ITEM_PERSIM_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_CURE_CONFUSION",
+ "holdEffectParam": 0,
+ "description_english": "When held by a POKéMON, it will be\\nused in battle to lift confusion.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "LUM BERRY",
+ "itemId": "ITEM_LUM_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_CURE_STATUS",
+ "holdEffectParam": 0,
+ "description_english": "When held by a POKéMON, it will be\\nused in battle to heal any problem.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "SITRUS BERRY",
+ "itemId": "ITEM_SITRUS_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_RESTORE_HP",
+ "holdEffectParam": 30,
+ "description_english": "When held by a POKéMON, it will be\\nused in battle to restore 30 HP.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 1,
+ "fieldUseFunc": "FieldUseFunc_Medicine",
+ "battleUsage": 1,
+ "battleUseFunc": "BattleUseFunc_Medicine",
+ "secondaryId": 0
+ },
+ {
+ "english": "FIGY BERRY",
+ "itemId": "ITEM_FIGY_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_CONFUSE_SPICY",
+ "holdEffectParam": 8,
+ "description_english": "A hold item that restores HP but\\nmay cause confusion when used.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "WIKI BERRY",
+ "itemId": "ITEM_WIKI_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_CONFUSE_DRY",
+ "holdEffectParam": 8,
+ "description_english": "A hold item that restores HP but\\nmay cause confusion when used.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "MAGO BERRY",
+ "itemId": "ITEM_MAGO_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_CONFUSE_SWEET",
+ "holdEffectParam": 8,
+ "description_english": "A hold item that restores HP but\\nmay cause confusion when used.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "AGUAV BERRY",
+ "itemId": "ITEM_AGUAV_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_CONFUSE_BITTER",
+ "holdEffectParam": 8,
+ "description_english": "A hold item that restores HP but\\nmay cause confusion when used.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "IAPAPA BERRY",
+ "itemId": "ITEM_IAPAPA_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_CONFUSE_SOUR",
+ "holdEffectParam": 8,
+ "description_english": "A hold item that restores HP but\\nmay cause confusion when used.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "RAZZ BERRY",
+ "itemId": "ITEM_RAZZ_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "BLUK BERRY",
+ "itemId": "ITEM_BLUK_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "NANAB BERRY",
+ "itemId": "ITEM_NANAB_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "WEPEAR BERRY",
+ "itemId": "ITEM_WEPEAR_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "PINAP BERRY",
+ "itemId": "ITEM_PINAP_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "POMEG BERRY",
+ "itemId": "ITEM_POMEG_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "KELPSY BERRY",
+ "itemId": "ITEM_KELPSY_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "QUALOT BERRY",
+ "itemId": "ITEM_QUALOT_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "HONDEW BERRY",
+ "itemId": "ITEM_HONDEW_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "GREPA BERRY",
+ "itemId": "ITEM_GREPA_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "TAMATO BERRY",
+ "itemId": "ITEM_TAMATO_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "CORNN BERRY",
+ "itemId": "ITEM_CORNN_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "MAGOST BERRY",
+ "itemId": "ITEM_MAGOST_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "RABUTA BERRY",
+ "itemId": "ITEM_RABUTA_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "NOMEL BERRY",
+ "itemId": "ITEM_NOMEL_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SPELON BERRY",
+ "itemId": "ITEM_SPELON_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "PAMTRE BERRY",
+ "itemId": "ITEM_PAMTRE_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "WATMEL BERRY",
+ "itemId": "ITEM_WATMEL_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "DURIN BERRY",
+ "itemId": "ITEM_DURIN_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "BELUE BERRY",
+ "itemId": "ITEM_BELUE_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "LIECHI BERRY",
+ "itemId": "ITEM_LIECHI_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_ATTACK_UP",
+ "holdEffectParam": 4,
+ "description_english": "When held by a POKéMON, it raises\\nthe ATTACK stat in a pinch.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "GANLON BERRY",
+ "itemId": "ITEM_GANLON_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_DEFENSE_UP",
+ "holdEffectParam": 4,
+ "description_english": "When held by a POKéMON, it raises\\nthe DEFENSE stat in a pinch.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SALAC BERRY",
+ "itemId": "ITEM_SALAC_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_SPEED_UP",
+ "holdEffectParam": 4,
+ "description_english": "When held by a POKéMON, it raises\\nthe SPEED stat in a pinch.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "PETAYA BERRY",
+ "itemId": "ITEM_PETAYA_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_SP_ATTACK_UP",
+ "holdEffectParam": 4,
+ "description_english": "When held by a POKéMON, it raises\\nthe SP. ATK stat in a pinch.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "APICOT BERRY",
+ "itemId": "ITEM_APICOT_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_SP_DEFENSE_UP",
+ "holdEffectParam": 4,
+ "description_english": "When held by a POKéMON, it raises\\nthe SP. DEF stat in a pinch.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "LANSAT BERRY",
+ "itemId": "ITEM_LANSAT_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_CRITICAL_UP",
+ "holdEffectParam": 4,
+ "description_english": "When held by a POKéMON, it raises\\nthe critical-hit ratio in a pinch.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "STARF BERRY",
+ "itemId": "ITEM_STARF_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_RANDOM_STAT_UP",
+ "holdEffectParam": 4,
+ "description_english": "When held by a POKéMON, it sharply\\nraises one stat in a pinch.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "ENIGMA BERRY",
+ "itemId": "ITEM_ENIGMA_BERRY",
+ "price": 20,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Can be ground up into a powder as\\nan ingredient for medicine.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_BERRY_POUCH",
+ "type": 4,
+ "fieldUseFunc": "ItemUseOutOfBattle_EnigmaBerry",
+ "battleUsage": 1,
+ "battleUseFunc": "ItemUseInBattle_EnigmaBerry",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "BRIGHTPOWDER",
+ "itemId": "ITEM_BRIGHT_POWDER",
+ "price": 10,
+ "holdEffect": "HOLD_EFFECT_EVASION_UP",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nIt casts a tricky glare that lowers\\nthe opponent's accuracy.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "WHITE HERB",
+ "itemId": "ITEM_WHITE_HERB",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_RESTORE_STATS",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nIt restores any lowered stat in\\nbattle. It can be used only once.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "MACHO BRACE",
+ "itemId": "ITEM_MACHO_BRACE",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_MACHO_BRACE",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nIt promotes strong growth but\\nlowers SPEED while it is held.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "EXP. SHARE",
+ "itemId": "ITEM_EXP_SHARE",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_EXP_SHARE",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nThe holder gets a share of EXP.\\npoints without having to battle.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "QUICK CLAW",
+ "itemId": "ITEM_QUICK_CLAW",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_QUICK_CLAW",
+ "holdEffectParam": 20,
+ "description_english": "An item to be held by a POKéMON.\\nA light and sharp claw. The holder\\nmay be able to strike first.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SOOTHE BELL",
+ "itemId": "ITEM_SOOTHE_BELL",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_HAPPINESS_UP",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nA bell with a comforting chime that\\nmakes the holder calm and friendly.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "MENTAL HERB",
+ "itemId": "ITEM_MENTAL_HERB",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_CURE_ATTRACT",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nIt snaps the holder out of\\ninfatuation. It can be used once.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "CHOICE BAND",
+ "itemId": "ITEM_CHOICE_BAND",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_CHOICE_BAND",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nIt powers up one move, which\\nbecomes the only usable one.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "KING'S ROCK",
+ "itemId": "ITEM_KINGS_ROCK",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_FLINCH",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nIt may cause the foe to flinch\\nupon taking damage.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SILVERPOWDER",
+ "itemId": "ITEM_SILVER_POWDER",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_BUG_POWER",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nA shiny silver powder that boosts\\nthe power of BUG-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "AMULET COIN",
+ "itemId": "ITEM_AMULET_COIN",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_DOUBLE_PRIZE",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nIt doubles the battle money if the\\nholding POKéMON takes part.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "CLEANSE TAG",
+ "itemId": "ITEM_CLEANSE_TAG",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_REPEL",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nIt repels wild POKéMON if the\\nholder is first in the party.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SOUL DEW",
+ "itemId": "ITEM_SOUL_DEW",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_SOUL_DEW",
+ "holdEffectParam": 0,
+ "description_english": "An orb to be held by a LATIOS or\\nLATIAS. It raises the SP. ATK\\nand SP. DEF stats.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "DEEPSEATOOTH",
+ "itemId": "ITEM_DEEP_SEA_TOOTH",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_DEEP_SEA_TOOTH",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nA fang that gleams a sharp silver.\\nIt raises the SP. ATK stat.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "DEEPSEASCALE",
+ "itemId": "ITEM_DEEP_SEA_SCALE",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_DEEP_SEA_SCALE",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nA scale that shines a faint pink.\\nIt raises the SP. DEF stat.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SMOKE BALL",
+ "itemId": "ITEM_SMOKE_BALL",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_CAN_ALWAYS_RUN",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nThe holding POKéMON can flee from\\nany wild POKéMON for sure.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "EVERSTONE",
+ "itemId": "ITEM_EVERSTONE",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_PREVENT_EVOLVE",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nThe holding POKéMON is prevented\\nfrom evolving.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "FOCUS BAND",
+ "itemId": "ITEM_FOCUS_BAND",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_FOCUS_BAND",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nThe holding POKéMON may endure an\\nattack, leaving just 1 HP.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "LUCKY EGG",
+ "itemId": "ITEM_LUCKY_EGG",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_LUCKY_EGG",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nAn egg filled with happiness that\\nearns extra EXP. points in battle.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SCOPE LENS",
+ "itemId": "ITEM_SCOPE_LENS",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_SCOPE_LENS",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nA lens that boosts the critical-hit\\nratio of the holding POKéMON.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "METAL COAT",
+ "itemId": "ITEM_METAL_COAT",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_STEEL_POWER",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nA special metallic film that boosts\\nthe power of STEEL-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "LEFTOVERS",
+ "itemId": "ITEM_LEFTOVERS",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_LEFTOVERS",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nThe holding POKéMON gradually\\nregains HP during battle.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "DRAGON SCALE",
+ "itemId": "ITEM_DRAGON_SCALE",
+ "price": 2100,
+ "holdEffect": "HOLD_EFFECT_DRAGON_SCALE",
+ "holdEffectParam": 10,
+ "description_english": "A thick and tough scale.\\nA DRAGON-type POKéMON may be\\nholding it.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "LIGHT BALL",
+ "itemId": "ITEM_LIGHT_BALL",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_LIGHT_BALL",
+ "holdEffectParam": 0,
+ "description_english": "An orb to be held by a PIKACHU\\nthat raises the SP. ATK stat.\\nTouching it may cause a shock.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SOFT SAND",
+ "itemId": "ITEM_SOFT_SAND",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_GROUND_POWER",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nA loose, silky sand that boosts the\\npower of GROUND-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "HARD STONE",
+ "itemId": "ITEM_HARD_STONE",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_ROCK_POWER",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nAn unbreakable stone that boosts\\nthe power of ROCK-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "MIRACLE SEED",
+ "itemId": "ITEM_MIRACLE_SEED",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_GRASS_POWER",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nA seed imbued with life that boosts\\nthe power of GRASS-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "BLACKGLASSES",
+ "itemId": "ITEM_BLACK_GLASSES",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_DARK_POWER",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nA shady-looking pair of glasses\\nthat boosts DARK-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "BLACK BELT",
+ "itemId": "ITEM_BLACK_BELT",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_FIGHTING_POWER",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nA belt that boosts determination\\nand FIGHTING-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "MAGNET",
+ "itemId": "ITEM_MAGNET",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_ELECTRIC_POWER",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nA powerful magnet that boosts the\\npower of ELECTRIC-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "MYSTIC WATER",
+ "itemId": "ITEM_MYSTIC_WATER",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_WATER_POWER",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nA teardrop-shaped gem that boosts\\nthe power of WATER-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SHARP BEAK",
+ "itemId": "ITEM_SHARP_BEAK",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_FLYING_POWER",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nA long, sharp beak that boosts the\\npower of FLYING-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "POISON BARB",
+ "itemId": "ITEM_POISON_BARB",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_POISON_POWER",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nA small, poisonous barb that boosts\\nthe power of POISON-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "NEVERMELTICE",
+ "itemId": "ITEM_NEVER_MELT_ICE",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_ICE_POWER",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nA piece of ice that repels heat\\nand boosts ICE-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SPELL TAG",
+ "itemId": "ITEM_SPELL_TAG",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_GHOST_POWER",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nA sinister, eerie tag that boosts\\nGHOST-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "TWISTEDSPOON",
+ "itemId": "ITEM_TWISTED_SPOON",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_PSYCHIC_POWER",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nA spoon imbued with telekinetic\\npower boosts PSYCHIC-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "CHARCOAL",
+ "itemId": "ITEM_CHARCOAL",
+ "price": 9800,
+ "holdEffect": "HOLD_EFFECT_FIRE_POWER",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nA combustible fuel that boosts the\\npower of FIRE-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "DRAGON FANG",
+ "itemId": "ITEM_DRAGON_FANG",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_DRAGON_POWER",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nA hard and sharp fang that boosts\\nthe power of DRAGON-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SILK SCARF",
+ "itemId": "ITEM_SILK_SCARF",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_NORMAL_POWER",
+ "holdEffectParam": 10,
+ "description_english": "An item to be held by a POKéMON.\\nA sumptuous scarf that boosts the\\npower of NORMAL-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "UP-GRADE",
+ "itemId": "ITEM_UP_GRADE",
+ "price": 2100,
+ "holdEffect": "HOLD_EFFECT_UP_GRADE",
+ "holdEffectParam": 0,
+ "description_english": "A transparent device filled with all\\nsorts of data.\\nIt is made by SILPH CO.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SHELL BELL",
+ "itemId": "ITEM_SHELL_BELL",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_SHELL_BELL",
+ "holdEffectParam": 8,
+ "description_english": "An item to be held by a POKéMON.\\nThe holding POKéMON regains some\\nHP upon striking the foe.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SEA INCENSE",
+ "itemId": "ITEM_SEA_INCENSE",
+ "price": 9600,
+ "holdEffect": "HOLD_EFFECT_WATER_POWER",
+ "holdEffectParam": 5,
+ "description_english": "An item to be held by a POKéMON.\\nIt slightly boosts the power of\\nWATER-type moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "LAX INCENSE",
+ "itemId": "ITEM_LAX_INCENSE",
+ "price": 9600,
+ "holdEffect": "HOLD_EFFECT_EVASION_UP",
+ "holdEffectParam": 5,
+ "description_english": "An item to be held by a POKéMON.\\nIts tricky aroma slightly reduces\\nthe foe's accuracy.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "LUCKY PUNCH",
+ "itemId": "ITEM_LUCKY_PUNCH",
+ "price": 10,
+ "holdEffect": "HOLD_EFFECT_LUCKY_PUNCH",
+ "holdEffectParam": 0,
+ "description_english": "A glove to be held by a CHANSEY.\\nIt raises CHANSEY's critical-hit\\nratio.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "METAL POWDER",
+ "itemId": "ITEM_METAL_POWDER",
+ "price": 10,
+ "holdEffect": "HOLD_EFFECT_METAL_POWDER",
+ "holdEffectParam": 0,
+ "description_english": "A fine, hard powder to be held by\\na DITTO.\\nIt raises DITTO's DEFENSE stat.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "THICK CLUB",
+ "itemId": "ITEM_THICK_CLUB",
+ "price": 500,
+ "holdEffect": "HOLD_EFFECT_THICK_CLUB",
+ "holdEffectParam": 0,
+ "description_english": "A hard bone of some sort to be\\nheld by a CUBONE or MAROWAK.\\nIt raises the ATTACK stat.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "STICK",
+ "itemId": "ITEM_STICK",
+ "price": 200,
+ "holdEffect": "HOLD_EFFECT_STICK",
+ "holdEffectParam": 0,
+ "description_english": "A stick of leek to be held by a\\nFARFETCH'D. It raises FARFETCH'D's\\ncritical-hit ratio.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "RED SCARF",
+ "itemId": "ITEM_RED_SCARF",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nIt boosts the holding POKéMON's\\nCOOL condition in CONTESTS.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "BLUE SCARF",
+ "itemId": "ITEM_BLUE_SCARF",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nIt boosts the holding POKéMON's\\nBEAUTY condition in CONTESTS.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "PINK SCARF",
+ "itemId": "ITEM_PINK_SCARF",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nIt boosts the holding POKéMON's\\nCUTE condition in CONTESTS.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "GREEN SCARF",
+ "itemId": "ITEM_GREEN_SCARF",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nIt boosts the holding POKéMON's\\nSMART condition in CONTESTS.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "YELLOW SCARF",
+ "itemId": "ITEM_YELLOW_SCARF",
+ "price": 100,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An item to be held by a POKéMON.\\nIt boosts the holding POKéMON's\\nTOUGH condition in CONTESTS.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "MACH BIKE",
+ "itemId": "ITEM_MACH_BIKE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A folding bicycle that is at least\\ntwice as fast as walking.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 2,
+ "fieldUseFunc": "FieldUseFunc_MachBike",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "COIN CASE",
+ "itemId": "ITEM_COIN_CASE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A case for holding COINS obtained\\nat the GAME CORNER.\\nIt holds up to 9,999 COINS.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_CoinCase",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "ITEMFINDER",
+ "itemId": "ITEM_ITEMFINDER",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A device used for finding items.\\nIf there is a hidden item nearby\\nwhen it is used, it emits a signal.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 2,
+ "fieldUseFunc": "ItemUseOutOfBattle_Itemfinder",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "OLD ROD",
+ "itemId": "ITEM_OLD_ROD",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An old and beat-up fishing rod.\\nUse it by any body of water to \\nfish for wild POKéMON.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 2,
+ "fieldUseFunc": "FieldUseFunc_OldRod",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "GOOD ROD",
+ "itemId": "ITEM_GOOD_ROD",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A new, good-quality fishing rod.\\nUse it by any body of water to \\nfish for wild POKéMON.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 2,
+ "fieldUseFunc": "FieldUseFunc_OldRod",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 1
+ },
+ {
+ "english": "SUPER ROD",
+ "itemId": "ITEM_SUPER_ROD",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An awesome, high-tech fishing rod.\\nUse it by any body of water to fish\\nfor wild POKéMON.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 2,
+ "fieldUseFunc": "FieldUseFunc_OldRod",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 2
+ },
+ {
+ "english": "S.S. TICKET",
+ "itemId": "ITEM_SS_TICKET",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The ticket required for sailing on\\nthe ferry S.S. ANNE.\\nIt has a drawing of a ship on it.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "CONTEST PASS",
+ "itemId": "ITEM_CONTEST_PASS",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The pass required for entering\\nPOKéMON CONTESTS. It has a\\ndrawing of an award ribbon on it.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "WAILMER PAIL",
+ "itemId": "ITEM_WAILMER_PAIL",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A nifty watering pail.\\nUse it to promote strong growth in\\nBERRIES planted in soft soil.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "DEVON GOODS",
+ "itemId": "ITEM_DEVON_GOODS",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A package that contains mechanical\\nparts of some sort made by the\\nDEVON CORPORATION.",
+ "importance": 2,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SOOT SACK",
+ "itemId": "ITEM_SOOT_SACK",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A sack used to collect volcanic\\nash automatically during walks\\nover deep ash.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "BASEMENT KEY",
+ "itemId": "ITEM_BASEMENT_KEY",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The key to NEW MAUVILLE, which\\nwas constructed beneath MAUVILLE\\nCITY.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "ACRO BIKE",
+ "itemId": "ITEM_ACRO_BIKE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A folding bicycle that is capable\\nof stunts like jumps and wheelies.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 2,
+ "fieldUseFunc": "FieldUseFunc_MachBike",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 1
+ },
+ {
+ "english": "{POKEBLOCK} CASE",
+ "itemId": "ITEM_POKEBLOCK_CASE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A case for holding {POKEBLOCK}S made\\nwith a BERRY BLENDER. It releases\\none {POKEBLOCK} when shaken.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "LETTER",
+ "itemId": "ITEM_LETTER",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An extremely important letter to\\nSTEVEN from the PRESIDENT of the\\nDEVON CORPORATION.",
+ "importance": 2,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "EON TICKET",
+ "itemId": "ITEM_EON_TICKET",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The ticket required for sailing on a\\nferry to a distant southern island.\\nIt features a drawing of an island.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 1
+ },
+ {
+ "english": "RED ORB",
+ "itemId": "ITEM_RED_ORB",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An orb that glows red.\\nIt is said to contain an incredible\\npower from ancient times.",
+ "importance": 2,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "BLUE ORB",
+ "itemId": "ITEM_BLUE_ORB",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An orb that glows blue.\\nIt is said to contain an incredible\\npower from ancient times.",
+ "importance": 2,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SCANNER",
+ "itemId": "ITEM_SCANNER",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A device used to search for\\nlife-forms in water.\\nIt looks too difficult to use.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "GO-GOGGLES",
+ "itemId": "ITEM_GO_GOGGLES",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A pair of protective goggles.\\nThey enable a TRAINER to travel\\nthrough even desert sandstorms.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "METEORITE",
+ "itemId": "ITEM_METEORITE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A meteorite that fell from space\\nonto MT. MOON long ago.\\nIt is very lumpy and hard.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "RM. 1 KEY",
+ "itemId": "ITEM_ROOM_1_KEY",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A key that opens the door to Room\\n1 inside the ABANDONED SHIP.\\nIt is old and looks easily broken.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "RM. 2 KEY",
+ "itemId": "ITEM_ROOM_2_KEY",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A key that opens the door to Room\\n2 inside the ABANDONED SHIP.\\nIt is old and looks easily broken.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "RM. 4 KEY",
+ "itemId": "ITEM_ROOM_4_KEY",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A key that opens the door to Room\\n4 inside the ABANDONED SHIP.\\nIt is old and looks easily broken.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "RM. 6 KEY",
+ "itemId": "ITEM_ROOM_6_KEY",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A key that opens the door to Room\\n6 inside the ABANDONED SHIP.\\nIt is old and looks easily broken.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "STORAGE KEY",
+ "itemId": "ITEM_STORAGE_KEY",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A key that opens the storage hold\\ninside the ABANDONED SHIP.\\nIt is old and looks easily broken.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "ROOT FOSSIL",
+ "itemId": "ITEM_ROOT_FOSSIL",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A fossil of an ancient, seafloor-\\ndwelling POKéMON. It appears to be\\npart of a plant root.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "CLAW FOSSIL",
+ "itemId": "ITEM_CLAW_FOSSIL",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A fossil of an ancient, seafloor-\\ndwelling POKéMON. It appears to be\\npart of a claw.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "DEVON SCOPE",
+ "itemId": "ITEM_DEVON_SCOPE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A scope that signals the presence\\nof any unseeable POKéMON.\\nIt is made by the DEVON CORP.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "TM01",
+ "itemId": "ITEM_TM01",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An extremely powerful attack.\\nHowever, if the user is hit before\\nusing the move, they will flinch.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "FocusPunch"
+ },
+ {
+ "english": "TM02",
+ "itemId": "ITEM_TM02",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Sharp, huge claws hook and slash\\nthe foe quickly and with great\\npower.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "DragonClaw"
+ },
+ {
+ "english": "TM03",
+ "itemId": "ITEM_TM03",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The foe is hit with a pulsing blast\\nof water. It may also confuse the\\ntarget.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "WaterPulse"
+ },
+ {
+ "english": "TM04",
+ "itemId": "ITEM_TM04",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The user calms its spirit and\\nfocuses its mind to raise its\\nSP. ATK and SP. DEF stats.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "CalmMind"
+ },
+ {
+ "english": "TM05",
+ "itemId": "ITEM_TM05",
+ "price": 1000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A savage roar that causes the foe\\nto switch out of battle. In the\\nwild, ROAR ends the battle.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Roar"
+ },
+ {
+ "english": "TM06",
+ "itemId": "ITEM_TM06",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A move that leaves the foe badly\\npoisoned. Its poison damage worsens\\nevery turn.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Toxic"
+ },
+ {
+ "english": "TM07",
+ "itemId": "ITEM_TM07",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Summons a hailstorm that lasts for\\nfive turns. The hailstorm damages\\nall types except the ICE type.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Hail"
+ },
+ {
+ "english": "TM08",
+ "itemId": "ITEM_TM08",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The user tightens all its muscles\\nand bulks up, boosting both its\\nATTACK and DEFENSE stats.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "BulkUp"
+ },
+ {
+ "english": "TM09",
+ "itemId": "ITEM_TM09",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The user shoots seeds at the foe\\nin rapid succession. Two to five\\nseeds are shot at once.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "BulletSeed"
+ },
+ {
+ "english": "TM10",
+ "itemId": "ITEM_TM10",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A variable move that changes type\\nand power depending on the POKéMON\\nusing it.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "HiddenPower"
+ },
+ {
+ "english": "TM11",
+ "itemId": "ITEM_TM11",
+ "price": 2000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The weather is turned sunny for\\nfive turns. Over that time, FIRE-\\ntype moves are powered up.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "SunnyDay"
+ },
+ {
+ "english": "TM12",
+ "itemId": "ITEM_TM12",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A taunted foe may become enraged.\\nIt will then only be able to use\\nattack moves.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Taunt"
+ },
+ {
+ "english": "TM13",
+ "itemId": "ITEM_TM13",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An icy-cold beam is shot at the\\nfoe. It may leave the target\\nfrozen.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "IceBeam"
+ },
+ {
+ "english": "TM14",
+ "itemId": "ITEM_TM14",
+ "price": 5500,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A vicious snow-and-wind attack that\\nstrikes all foes in battle. It may\\ncause freezing.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Blizzard"
+ },
+ {
+ "english": "TM15",
+ "itemId": "ITEM_TM15",
+ "price": 7500,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A harsh attack that inflicts severe\\ndamage on the foe. However, the\\nuser must rest the next turn.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "HyperBeam"
+ },
+ {
+ "english": "TM16",
+ "itemId": "ITEM_TM16",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A wall of light is created over\\nfive turns. It reduces damage from\\nSP. ATK attacks.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "LightScreen"
+ },
+ {
+ "english": "TM17",
+ "itemId": "ITEM_TM17",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The user is completely protected\\nfrom attack in the turn it is used.\\nIt may fail if used in succession.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Protect"
+ },
+ {
+ "english": "TM18",
+ "itemId": "ITEM_TM18",
+ "price": 2000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A heavy rain is summoned for five\\nturns. Over that time, WATER-type\\nmoves are powered up.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "RainDance"
+ },
+ {
+ "english": "TM19",
+ "itemId": "ITEM_TM19",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The user strikes the foe with\\ntentacles or roots, stealing the\\ntarget's HP and healing itself.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "GigaDrain"
+ },
+ {
+ "english": "TM20",
+ "itemId": "ITEM_TM20",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Protects the party with a shield\\nagainst all status problems over\\nfive turns.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Safeguard"
+ },
+ {
+ "english": "TM21",
+ "itemId": "ITEM_TM21",
+ "price": 1000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "This attack move grows more\\npowerful the more the POKéMON\\ndislikes its TRAINER.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Frustration"
+ },
+ {
+ "english": "TM22",
+ "itemId": "ITEM_TM22",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A 2-turn attack that uses the first\\nturn for absorbing sunlight, then\\nblasting the foe in the next turn.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "SolarBeam"
+ },
+ {
+ "english": "TM23",
+ "itemId": "ITEM_TM23",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The foe is slammed with a sturdy\\ntail of steel. It may lower the\\ntarget's DEFENSE stat.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "IronTail"
+ },
+ {
+ "english": "TM24",
+ "itemId": "ITEM_TM24",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A massive jolt of electricity is\\nlaunched at the foe. It may cause\\nparalysis.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Thunderbolt"
+ },
+ {
+ "english": "TM25",
+ "itemId": "ITEM_TM25",
+ "price": 5500,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Strikes the foe with a huge\\nthunderbolt. It may cause\\nparalysis.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Thunder"
+ },
+ {
+ "english": "TM26",
+ "itemId": "ITEM_TM26",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Causes an earthquake that strikes\\nall POKéMON in battle, excluding\\nthe user.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Earthquake"
+ },
+ {
+ "english": "TM27",
+ "itemId": "ITEM_TM27",
+ "price": 1000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "This attack move grows more\\npowerful the more the POKéMON\\nlikes its TRAINER.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Return"
+ },
+ {
+ "english": "TM28",
+ "itemId": "ITEM_TM28",
+ "price": 2000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A 2-turn attack in which the user\\ndigs underground, then strikes.\\nIt can be used to exit dungeons.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Dig"
+ },
+ {
+ "english": "TM29",
+ "itemId": "ITEM_TM29",
+ "price": 2000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A powerful blast of telekinetic\\nenergy strikes the foe. It may\\nlower the target's SP. DEF stat.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Psychic"
+ },
+ {
+ "english": "TM30",
+ "itemId": "ITEM_TM30",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The foe is attacked with a shadowy\\nlump. It may lower the target's\\nSP. DEF stat.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "ShadowBall"
+ },
+ {
+ "english": "TM31",
+ "itemId": "ITEM_TM31",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Strikes the foe with a rock-hard\\nfist, etc. It shatters barriers such\\nas REFLECT and LIGHT SCREEN.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "BrickBreak"
+ },
+ {
+ "english": "TM32",
+ "itemId": "ITEM_TM32",
+ "price": 2000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The user begins moving so quickly\\nthat it creates illusory copies to\\nraise its evasiveness.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "DoubleTeam"
+ },
+ {
+ "english": "TM33",
+ "itemId": "ITEM_TM33",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A tough barrier is put up over five\\nturns. It reduces damage from\\nphysical attacks over that time.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Reflect"
+ },
+ {
+ "english": "TM34",
+ "itemId": "ITEM_TM34",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A rapid jolt of electricity strikes\\nthe foe. This attack is impossible\\nto evade.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "ShockWave"
+ },
+ {
+ "english": "TM35",
+ "itemId": "ITEM_TM35",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The foe is roasted with a heavy\\nblast of fire. It may leave the\\ntarget with a burn.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Flamethrower"
+ },
+ {
+ "english": "TM36",
+ "itemId": "ITEM_TM36",
+ "price": 1000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Toxic sludge is hurled at the foe\\nwith great force. It may also\\npoison the target.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "SludgeBomb"
+ },
+ {
+ "english": "TM37",
+ "itemId": "ITEM_TM37",
+ "price": 2000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Summons a sandstorm that lasts for\\nfive turns. It damages all types\\nexcept ROCK, GROUND, and STEEL.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Sandstorm"
+ },
+ {
+ "english": "TM38",
+ "itemId": "ITEM_TM38",
+ "price": 5500,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The foe is incinerated with an\\nintense flame. It may leave the\\ntarget with a burn.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "FireBlast"
+ },
+ {
+ "english": "TM39",
+ "itemId": "ITEM_TM39",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Boulders are hurled at the foe.\\nIt also lowers the target's SPEED\\nstat if it hits.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "RockTomb"
+ },
+ {
+ "english": "TM40",
+ "itemId": "ITEM_TM40",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An extremely fast attack against\\none target. It is impossible to\\nevade.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "AerialAce"
+ },
+ {
+ "english": "TM41",
+ "itemId": "ITEM_TM41",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "If enraged by this move, the target\\nbecomes incapable of using the same\\nmove twice in a row.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Torment"
+ },
+ {
+ "english": "TM42",
+ "itemId": "ITEM_TM42",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An attack move that becomes very\\npowerful if the user is poisoned,\\nburned, or paralyzed.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Facade"
+ },
+ {
+ "english": "TM43",
+ "itemId": "ITEM_TM43",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An attack move that may have an\\nadditional effect depending on the\\nbattle terrain.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "SecretPower"
+ },
+ {
+ "english": "TM44",
+ "itemId": "ITEM_TM44",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A move that makes the user fall\\nasleep over two turns to restore HP\\nand heal any status problems.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Rest"
+ },
+ {
+ "english": "TM45",
+ "itemId": "ITEM_TM45",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The foe, if it is the opposite\\ngender as the user, becomes\\ninfatuated and may not attack.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Attract"
+ },
+ {
+ "english": "TM46",
+ "itemId": "ITEM_TM46",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An attack that gives the user an\\nopportunity to steal the foe's hold\\nitem.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Thief"
+ },
+ {
+ "english": "TM47",
+ "itemId": "ITEM_TM47",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The foe is struck with steel-hard\\nwings. It may also raise the user's\\nDEFENSE stat.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "SteelWing"
+ },
+ {
+ "english": "TM48",
+ "itemId": "ITEM_TM48",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A special power is transmitted to\\nthe foe, causing it to switch\\nabilities with the user.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "SkillSwap"
+ },
+ {
+ "english": "TM49",
+ "itemId": "ITEM_TM49",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A move that steals the effects of\\nany status-changing or healing move\\nthat the foe tries to use.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Snatch"
+ },
+ {
+ "english": "TM50",
+ "itemId": "ITEM_TM50",
+ "price": 3000,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A maximum-power attack of great\\nferocity, but one that also sharply\\nreduces the user's SP. ATK stat.",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Overheat"
+ },
+ {
+ "english": "HM01",
+ "itemId": "ITEM_HM01",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Attacks the foe with sharp blades\\nor claws. It can also cut down thin\\ntrees and grass outside of battle.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Cut"
+ },
+ {
+ "english": "HM02",
+ "itemId": "ITEM_HM02",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The user flies up on the first turn,\\nthen attacks next turn. It can be\\nused to fly to any known town.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Fly"
+ },
+ {
+ "english": "HM03",
+ "itemId": "ITEM_HM03",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Creates a huge wave, then crashes\\nit down on the foe. It can be used\\nfor traveling on water.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Surf"
+ },
+ {
+ "english": "HM04",
+ "itemId": "ITEM_HM04",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The user builds enormous power,\\nthen slams the foe. It can be used\\nfor moving large, round boulders.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Strength"
+ },
+ {
+ "english": "HM05",
+ "itemId": "ITEM_HM05",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Looses a powerful blast of light\\nthat reduces the foe's accuracy.\\nIt also lights up dark caves.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Flash"
+ },
+ {
+ "english": "HM06",
+ "itemId": "ITEM_HM06",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Hits the foe with a rock-crushingly\\ntough attack. It can smash cracked\\nboulders.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "RockSmash"
+ },
+ {
+ "english": "HM07",
+ "itemId": "ITEM_HM07",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A powerful charge attack. It can\\nbe used for climbing a torrential\\nwaterfall.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Waterfall"
+ },
+ {
+ "english": "HM08",
+ "itemId": "ITEM_HM08",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A 2-turn attack in which the user\\ndives underwater on the first turn,\\nthen strikes in the next turn.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_TM_CASE",
+ "type": 1,
+ "fieldUseFunc": "NULL",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0,
+ "moveId": "Dive"
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "????????",
+ "itemId": "ITEM_NONE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "?????",
+ "importance": 0,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "OAK'S PARCEL",
+ "itemId": "ITEM_OAKS_PARCEL",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A parcel to be delivered to PROF.\\nOAK from VIRIDIAN CITY's POKéMON\\nMART.",
+ "importance": 2,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "POK\u00e9 FLUTE",
+ "itemId": "ITEM_POKE_FLUTE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A flute that is said to instantly\\nawaken any POKéMON. It has a\\nlovely tone.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_PokeFlute",
+ "battleUsage": 2,
+ "battleUseFunc": "BattleUseFunc_PokeFlute",
+ "secondaryId": 0
+ },
+ {
+ "english": "SECRET KEY",
+ "itemId": "ITEM_SECRET_KEY",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "The key to CINNABAR ISLAND GYM's\\nfront door. It is colored red and\\ndecorated.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "BIKE VOUCHER",
+ "itemId": "ITEM_BIKE_VOUCHER",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "Take this voucher to the BIKE SHOP\\nin CERULEAN CITY and exchange it\\nfor a bicycle.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "GOLD TEETH",
+ "itemId": "ITEM_GOLD_TEETH",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A set of false teeth lost by the\\nSAFARI ZONE'S WARDEN. It makes his\\nsmile sparkle.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "OLD AMBER",
+ "itemId": "ITEM_OLD_AMBER",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A piece of amber that contains\\nthe genes of an ancient POKéMON.\\nIt is clear with a reddish tint.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "CARD KEY",
+ "itemId": "ITEM_CARD_KEY",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A card-type key that unlocks doors\\nin SILPH CO.'s HEAD OFFICE in\\nSAFFRON CITY.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "LIFT KEY",
+ "itemId": "ITEM_LIFT_KEY",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A key that operates the elevator\\nin TEAM ROCKET's HIDEOUT.\\nIt bears the TEAM ROCKET logo.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "HELIX FOSSIL",
+ "itemId": "ITEM_HELIX_FOSSIL",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A fossil of an ancient, seafloor-\\ndwelling POKéMON. It appears to be\\npart of a seashell.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "DOME FOSSIL",
+ "itemId": "ITEM_DOME_FOSSIL",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A fossil of an ancient, seafloor-\\ndwelling POKéMON. It appears to be\\npart of a shell.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SILPH SCOPE",
+ "itemId": "ITEM_SILPH_SCOPE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A scope that makes unseeable\\nPOKéMON visible.\\nIt is made by SILPH CO.",
+ "importance": 1,
+ "exitsBagOnUse": 0,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "BICYCLE",
+ "itemId": "ITEM_BICYCLE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A folding bicycle that allows\\nfaster movement than the RUNNING\\nSHOES.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 2,
+ "fieldUseFunc": "FieldUseFunc_MachBike",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "TOWN MAP",
+ "itemId": "ITEM_TOWN_MAP",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A very convenient map that can be\\nviewed anytime. It even shows your \\npresent location.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_TownMap",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "VS SEEKER",
+ "itemId": "ITEM_VS_SEEKER",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A device that indicates TRAINERS\\nwho want to battle. The battery\\ncharges while traveling.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 2,
+ "fieldUseFunc": "FieldUseFunc_VsSeeker",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "FAME CHECKER",
+ "itemId": "ITEM_FAME_CHECKER",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A device that enables you to\\nrecall what you've heard and seen\\nabout famous people.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_FameChecker",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "TM CASE",
+ "itemId": "ITEM_TM_CASE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A case that holds TMs and HMs.\\nIt is attached to the BAG's\\ncompartment for important items.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_TmCase",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "BERRY POUCH",
+ "itemId": "ITEM_BERRY_POUCH",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A pouch for carrying BERRIES.\\nIt is attached to the BAG's\\ncompartment for important items.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_BerryPouch",
+ "battleUsage": 3,
+ "battleUseFunc": "BattleUseFunc_BerryPouch",
+ "secondaryId": 0
+ },
+ {
+ "english": "TEACHY TV",
+ "itemId": "ITEM_TEACHY_TV",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A television set that is tuned to\\na program with useful tips for\\nnovice TRAINERS.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 2,
+ "fieldUseFunc": "FieldUseFunc_TeachyTv",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "TRI-PASS",
+ "itemId": "ITEM_TRI_PASS",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A pass for ferries between ONE,\\nTWO, and THREE ISLAND.\\nIt has a drawing of three islands.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "RAINBOW PASS",
+ "itemId": "ITEM_RAINBOW_PASS",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A pass for ferries between\\nVERMILION and the SEVII ISLANDS.\\nIt features a drawing of a rainbow.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "TEA",
+ "itemId": "ITEM_TEA",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An aromatic tea prepared by an old\\nlady. It will slake even the worst\\nthirst.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "MYSTICTICKET",
+ "itemId": "ITEM_MYSTIC_TICKET",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A ticket required to board the ship\\nto NAVEL ROCK.\\nIt glows with a mystic light.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "AURORATICKET",
+ "itemId": "ITEM_AURORA_TICKET",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A ticket required to board the ship\\nto BIRTH ISLAND.\\nIt glows beautifully.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "POWDER JAR",
+ "itemId": "ITEM_POWDER_JAR",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "A jar for storing BERRY POWDER\\nmade using a BERRY CRUSHER.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_PowderJar",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "RUBY",
+ "itemId": "ITEM_RUBY",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An exquisitely beautiful gem that\\nhas a red glow.\\nIt symbolizes passion.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ },
+ {
+ "english": "SAPPHIRE",
+ "itemId": "ITEM_SAPPHIRE",
+ "price": 0,
+ "holdEffect": "HOLD_EFFECT_NONE",
+ "holdEffectParam": 0,
+ "description_english": "An exquisitely beautiful gem that\\nhas a blue glow.\\nIt symbolizes honesty.",
+ "importance": 1,
+ "exitsBagOnUse": 1,
+ "pocket": "POCKET_KEY_ITEMS",
+ "type": 4,
+ "fieldUseFunc": "FieldUseFunc_OakStopsYou",
+ "battleUsage": 0,
+ "battleUseFunc": "NULL",
+ "secondaryId": 0
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/data/items.json.txt b/src/data/items.json.txt
new file mode 100644
index 000000000..0daa783aa
--- /dev/null
+++ b/src/data/items.json.txt
@@ -0,0 +1,31 @@
+{{ doNotModifyHeader }}
+## for item in items
+## if item.pocket == "POCKET_TM_CASE"
+extern const u8 gMoveDescription_{{ item.moveId }}[];
+## endif
+{% if item.itemId != "ITEM_NONE" %}const u8 gItemDescription_{{ item.itemId }}[] = _("{{ item.description_english }}");{% endif %}
+## endfor
+const u8 gItemDescription_ITEM_NONE[] = _("?????");
+
+const struct Item gItems[] = {
+ {% for item in items %}{
+ .name = _("{{ item.english }}"),
+ .itemId = {{ item.itemId }},
+ .price = {{ item.price }},
+ .holdEffect = {{ item.holdEffect }},
+ .holdEffectParam = {{ item.holdEffectParam }},
+## if item.pocket == "POCKET_TM_CASE"
+ .description = gMoveDescription_{{ item.moveId }},
+## else
+ .description = gItemDescription_{{ item.itemId }},
+## endif
+ .importance = {{ item.importance }},
+ .exitsBagOnUse = {{ item.exitsBagOnUse }},
+ .pocket = {{ item.pocket }},
+ .type = {{ item.type }},
+ .fieldUseFunc = {{ item.fieldUseFunc }},
+ .battleUsage = {{ item.battleUsage }},
+ .battleUseFunc = {{ item.battleUseFunc }},
+ .secondaryId = {{ item.secondaryId }}
+ }, {% endfor %}
+};
diff --git a/src/data/pokemon/base_stats.h b/src/data/pokemon/base_stats.h
new file mode 100644
index 000000000..2dbde1483
--- /dev/null
+++ b/src/data/pokemon/base_stats.h
@@ -0,0 +1,12031 @@
+// Maximum value for a female Pokémon is 254 (MON_FEMALE) which is 100% female.
+// 255 (MON_GENDERLESS) is reserved for genderless Pokémon.
+#define PERCENT_FEMALE(percent) min(254, ((percent * 255) / 100))
+
+#define OLD_UNOWN_BASE_STATS \
+ { \
+ .baseHP = 50, \
+ .baseAttack = 150, \
+ .baseDefense = 50, \
+ .baseSpAttack = 150, \
+ .baseSpDefense = 50, \
+ .baseSpeed = 150, \
+ .type1 = TYPE_NORMAL, \
+ .type2 = TYPE_NORMAL, \
+ .catchRate = 3, \
+ .expYield = 1, \
+ .evYield_HP = 2, \
+ .evYield_Attack = 2, \
+ .evYield_Defense = 2, \
+ .evYield_Speed = 2, \
+ .evYield_SpAttack = 2, \
+ .evYield_SpDefense = 2, \
+ .item1 = ITEM_NONE, \
+ .item2 = ITEM_NONE, \
+ .genderRatio = MON_GENDERLESS, \
+ .eggCycles = 120, \
+ .friendship = 0, \
+ .growthRate = GROWTH_MEDIUM_FAST, \
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,\
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,\
+ .abilities = {0, 0}, \
+ .safariZoneFleeRate = 0, \
+ .bodyColor = BODY_COLOR_BLACK, \
+ .noFlip = FALSE, \
+ }
+
+const struct BaseStats gBaseStats[] =
+{
+ [SPECIES_NONE] = {0},
+ [SPECIES_BULBASAUR] =
+ {
+ .baseHP = 45,
+ .baseAttack = 49,
+ .baseDefense = 49,
+ .baseSpeed = 45,
+ .baseSpAttack = 65,
+ .baseSpDefense = 65,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_POISON,
+ .catchRate = 45,
+ .expYield = 64,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_OVERGROW, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_IVYSAUR] =
+ {
+ .baseHP = 60,
+ .baseAttack = 62,
+ .baseDefense = 63,
+ .baseSpeed = 60,
+ .baseSpAttack = 80,
+ .baseSpDefense = 80,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_POISON,
+ .catchRate = 45,
+ .expYield = 141,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_OVERGROW, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_VENUSAUR] =
+ {
+ .baseHP = 80,
+ .baseAttack = 82,
+ .baseDefense = 83,
+ .baseSpeed = 80,
+ .baseSpAttack = 100,
+ .baseSpDefense = 100,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_POISON,
+ .catchRate = 45,
+ .expYield = 208,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_OVERGROW, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CHARMANDER] =
+ {
+ .baseHP = 39,
+ .baseAttack = 52,
+ .baseDefense = 43,
+ .baseSpeed = 65,
+ .baseSpAttack = 60,
+ .baseSpDefense = 50,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 45,
+ .expYield = 65,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_BLAZE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CHARMELEON] =
+ {
+ .baseHP = 58,
+ .baseAttack = 64,
+ .baseDefense = 58,
+ .baseSpeed = 80,
+ .baseSpAttack = 80,
+ .baseSpDefense = 65,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 45,
+ .expYield = 142,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_BLAZE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CHARIZARD] =
+ {
+ .baseHP = 78,
+ .baseAttack = 84,
+ .baseDefense = 78,
+ .baseSpeed = 100,
+ .baseSpAttack = 109,
+ .baseSpDefense = 85,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FLYING,
+ .catchRate = 45,
+ .expYield = 209,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 3,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_BLAZE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SQUIRTLE] =
+ {
+ .baseHP = 44,
+ .baseAttack = 48,
+ .baseDefense = 65,
+ .baseSpeed = 43,
+ .baseSpAttack = 50,
+ .baseSpDefense = 64,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 45,
+ .expYield = 66,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_TORRENT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_WARTORTLE] =
+ {
+ .baseHP = 59,
+ .baseAttack = 63,
+ .baseDefense = 80,
+ .baseSpeed = 58,
+ .baseSpAttack = 65,
+ .baseSpDefense = 80,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 45,
+ .expYield = 143,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_TORRENT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_BLASTOISE] =
+ {
+ .baseHP = 79,
+ .baseAttack = 83,
+ .baseDefense = 100,
+ .baseSpeed = 78,
+ .baseSpAttack = 85,
+ .baseSpDefense = 105,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 45,
+ .expYield = 210,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 3,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_TORRENT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CATERPIE] =
+ {
+ .baseHP = 45,
+ .baseAttack = 30,
+ .baseDefense = 35,
+ .baseSpeed = 45,
+ .baseSpAttack = 20,
+ .baseSpDefense = 20,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_BUG,
+ .catchRate = 255,
+ .expYield = 53,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SHIELD_DUST, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_METAPOD] =
+ {
+ .baseHP = 50,
+ .baseAttack = 20,
+ .baseDefense = 55,
+ .baseSpeed = 30,
+ .baseSpAttack = 25,
+ .baseSpDefense = 25,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_BUG,
+ .catchRate = 120,
+ .expYield = 72,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SHED_SKIN, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_BUTTERFREE] =
+ {
+ .baseHP = 60,
+ .baseAttack = 45,
+ .baseDefense = 50,
+ .baseSpeed = 70,
+ .baseSpAttack = 80,
+ .baseSpDefense = 80,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_FLYING,
+ .catchRate = 45,
+ .expYield = 160,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SILVER_POWDER,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_COMPOUND_EYES, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_WEEDLE] =
+ {
+ .baseHP = 40,
+ .baseAttack = 35,
+ .baseDefense = 30,
+ .baseSpeed = 50,
+ .baseSpAttack = 20,
+ .baseSpDefense = 20,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_POISON,
+ .catchRate = 255,
+ .expYield = 52,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SHIELD_DUST, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_KAKUNA] =
+ {
+ .baseHP = 45,
+ .baseAttack = 25,
+ .baseDefense = 50,
+ .baseSpeed = 35,
+ .baseSpAttack = 25,
+ .baseSpDefense = 25,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_POISON,
+ .catchRate = 120,
+ .expYield = 71,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SHED_SKIN, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_BEEDRILL] =
+ {
+ .baseHP = 65,
+ .baseAttack = 80,
+ .baseDefense = 40,
+ .baseSpeed = 75,
+ .baseSpAttack = 45,
+ .baseSpDefense = 80,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_POISON,
+ .catchRate = 45,
+ .expYield = 159,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_POISON_BARB,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SWARM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PIDGEY] =
+ {
+ .baseHP = 40,
+ .baseAttack = 45,
+ .baseDefense = 40,
+ .baseSpeed = 56,
+ .baseSpAttack = 35,
+ .baseSpDefense = 35,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_FLYING,
+ .catchRate = 255,
+ .expYield = 55,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_KEEN_EYE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PIDGEOTTO] =
+ {
+ .baseHP = 63,
+ .baseAttack = 60,
+ .baseDefense = 55,
+ .baseSpeed = 71,
+ .baseSpAttack = 50,
+ .baseSpDefense = 50,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_FLYING,
+ .catchRate = 120,
+ .expYield = 113,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_KEEN_EYE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PIDGEOT] =
+ {
+ .baseHP = 83,
+ .baseAttack = 80,
+ .baseDefense = 75,
+ .baseSpeed = 91,
+ .baseSpAttack = 70,
+ .baseSpDefense = 70,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_FLYING,
+ .catchRate = 45,
+ .expYield = 172,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 3,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_KEEN_EYE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_RATTATA] =
+ {
+ .baseHP = 30,
+ .baseAttack = 56,
+ .baseDefense = 35,
+ .baseSpeed = 72,
+ .baseSpAttack = 25,
+ .baseSpDefense = 35,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 255,
+ .expYield = 57,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_RUN_AWAY, ABILITY_GUTS },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_RATICATE] =
+ {
+ .baseHP = 55,
+ .baseAttack = 81,
+ .baseDefense = 60,
+ .baseSpeed = 97,
+ .baseSpAttack = 50,
+ .baseSpDefense = 70,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 127,
+ .expYield = 116,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_ORAN_BERRY,
+ .item2 = ITEM_SITRUS_BERRY,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_RUN_AWAY, ABILITY_GUTS },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SPEAROW] =
+ {
+ .baseHP = 40,
+ .baseAttack = 60,
+ .baseDefense = 30,
+ .baseSpeed = 70,
+ .baseSpAttack = 31,
+ .baseSpDefense = 31,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_FLYING,
+ .catchRate = 255,
+ .expYield = 58,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_KEEN_EYE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_FEAROW] =
+ {
+ .baseHP = 65,
+ .baseAttack = 90,
+ .baseDefense = 65,
+ .baseSpeed = 100,
+ .baseSpAttack = 61,
+ .baseSpDefense = 61,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_FLYING,
+ .catchRate = 90,
+ .expYield = 162,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SHARP_BEAK,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_KEEN_EYE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_EKANS] =
+ {
+ .baseHP = 35,
+ .baseAttack = 60,
+ .baseDefense = 44,
+ .baseSpeed = 55,
+ .baseSpAttack = 40,
+ .baseSpDefense = 54,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_POISON,
+ .catchRate = 255,
+ .expYield = 62,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_INTIMIDATE, ABILITY_SHED_SKIN },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ARBOK] =
+ {
+ .baseHP = 60,
+ .baseAttack = 85,
+ .baseDefense = 69,
+ .baseSpeed = 80,
+ .baseSpAttack = 65,
+ .baseSpDefense = 79,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_POISON,
+ .catchRate = 90,
+ .expYield = 147,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_POISON_BARB,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_INTIMIDATE, ABILITY_SHED_SKIN },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PIKACHU] =
+ {
+ .baseHP = 35,
+ .baseAttack = 55,
+ .baseDefense = 30,
+ .baseSpeed = 90,
+ .baseSpAttack = 50,
+ .baseSpDefense = 40,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 190,
+ .expYield = 82,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 10,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_STATIC, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_RAICHU] =
+ {
+ .baseHP = 60,
+ .baseAttack = 90,
+ .baseDefense = 55,
+ .baseSpeed = 100,
+ .baseSpAttack = 90,
+ .baseSpDefense = 80,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 75,
+ .expYield = 122,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 3,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 10,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_STATIC, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SANDSHREW] =
+ {
+ .baseHP = 50,
+ .baseAttack = 75,
+ .baseDefense = 85,
+ .baseSpeed = 40,
+ .baseSpAttack = 20,
+ .baseSpDefense = 30,
+ .type1 = TYPE_GROUND,
+ .type2 = TYPE_GROUND,
+ .catchRate = 255,
+ .expYield = 93,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_SAND_VEIL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SANDSLASH] =
+ {
+ .baseHP = 75,
+ .baseAttack = 100,
+ .baseDefense = 110,
+ .baseSpeed = 65,
+ .baseSpAttack = 45,
+ .baseSpDefense = 55,
+ .type1 = TYPE_GROUND,
+ .type2 = TYPE_GROUND,
+ .catchRate = 90,
+ .expYield = 163,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SOFT_SAND,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_SAND_VEIL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_NIDORAN_F] =
+ {
+ .baseHP = 55,
+ .baseAttack = 47,
+ .baseDefense = 52,
+ .baseSpeed = 41,
+ .baseSpAttack = 40,
+ .baseSpDefense = 40,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_POISON,
+ .catchRate = 235,
+ .expYield = 59,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_FEMALE,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_POISON_POINT, ABILITY_NONE },
+ .safariZoneFleeRate = 50,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_NIDORINA] =
+ {
+ .baseHP = 70,
+ .baseAttack = 62,
+ .baseDefense = 67,
+ .baseSpeed = 56,
+ .baseSpAttack = 55,
+ .baseSpDefense = 55,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_POISON,
+ .catchRate = 120,
+ .expYield = 117,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_FEMALE,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_POISON_POINT, ABILITY_NONE },
+ .safariZoneFleeRate = 75,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_NIDOQUEEN] =
+ {
+ .baseHP = 90,
+ .baseAttack = 82,
+ .baseDefense = 87,
+ .baseSpeed = 76,
+ .baseSpAttack = 75,
+ .baseSpDefense = 85,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_GROUND,
+ .catchRate = 45,
+ .expYield = 194,
+ .evYield_HP = 3,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_FEMALE,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_POISON_POINT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_NIDORAN_M] =
+ {
+ .baseHP = 46,
+ .baseAttack = 57,
+ .baseDefense = 40,
+ .baseSpeed = 50,
+ .baseSpAttack = 40,
+ .baseSpDefense = 40,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_POISON,
+ .catchRate = 235,
+ .expYield = 60,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_MALE,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_POISON_POINT, ABILITY_NONE },
+ .safariZoneFleeRate = 50,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_NIDORINO] =
+ {
+ .baseHP = 61,
+ .baseAttack = 72,
+ .baseDefense = 57,
+ .baseSpeed = 65,
+ .baseSpAttack = 55,
+ .baseSpDefense = 55,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_POISON,
+ .catchRate = 120,
+ .expYield = 118,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_MALE,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_POISON_POINT, ABILITY_NONE },
+ .safariZoneFleeRate = 75,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_NIDOKING] =
+ {
+ .baseHP = 81,
+ .baseAttack = 92,
+ .baseDefense = 77,
+ .baseSpeed = 85,
+ .baseSpAttack = 85,
+ .baseSpDefense = 75,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_GROUND,
+ .catchRate = 45,
+ .expYield = 195,
+ .evYield_HP = 0,
+ .evYield_Attack = 3,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_MALE,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_POISON_POINT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CLEFAIRY] =
+ {
+ .baseHP = 70,
+ .baseAttack = 45,
+ .baseDefense = 48,
+ .baseSpeed = 35,
+ .baseSpAttack = 60,
+ .baseSpDefense = 65,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 150,
+ .expYield = 68,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_MOON_STONE,
+ .genderRatio = PERCENT_FEMALE(75),
+ .eggCycles = 10,
+ .friendship = 140,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_FAIRY,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_CUTE_CHARM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CLEFABLE] =
+ {
+ .baseHP = 95,
+ .baseAttack = 70,
+ .baseDefense = 73,
+ .baseSpeed = 60,
+ .baseSpAttack = 85,
+ .baseSpDefense = 90,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 25,
+ .expYield = 129,
+ .evYield_HP = 3,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_MOON_STONE,
+ .genderRatio = PERCENT_FEMALE(75),
+ .eggCycles = 10,
+ .friendship = 140,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_FAIRY,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_CUTE_CHARM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_VULPIX] =
+ {
+ .baseHP = 38,
+ .baseAttack = 41,
+ .baseDefense = 40,
+ .baseSpeed = 65,
+ .baseSpAttack = 50,
+ .baseSpDefense = 65,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 190,
+ .expYield = 63,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_RAWST_BERRY,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(75),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_FLASH_FIRE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_NINETALES] =
+ {
+ .baseHP = 73,
+ .baseAttack = 76,
+ .baseDefense = 75,
+ .baseSpeed = 100,
+ .baseSpAttack = 81,
+ .baseSpDefense = 100,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 75,
+ .expYield = 178,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_RAWST_BERRY,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(75),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_FLASH_FIRE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_JIGGLYPUFF] =
+ {
+ .baseHP = 115,
+ .baseAttack = 45,
+ .baseDefense = 20,
+ .baseSpeed = 20,
+ .baseSpAttack = 45,
+ .baseSpDefense = 25,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 170,
+ .expYield = 76,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_ORAN_BERRY,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(75),
+ .eggCycles = 10,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_FAIRY,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_CUTE_CHARM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_WIGGLYTUFF] =
+ {
+ .baseHP = 140,
+ .baseAttack = 70,
+ .baseDefense = 45,
+ .baseSpeed = 45,
+ .baseSpAttack = 75,
+ .baseSpDefense = 50,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 50,
+ .expYield = 109,
+ .evYield_HP = 3,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_ORAN_BERRY,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(75),
+ .eggCycles = 10,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_FAIRY,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_CUTE_CHARM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ZUBAT] =
+ {
+ .baseHP = 40,
+ .baseAttack = 45,
+ .baseDefense = 35,
+ .baseSpeed = 55,
+ .baseSpAttack = 30,
+ .baseSpDefense = 40,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_FLYING,
+ .catchRate = 255,
+ .expYield = 54,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_INNER_FOCUS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GOLBAT] =
+ {
+ .baseHP = 75,
+ .baseAttack = 80,
+ .baseDefense = 70,
+ .baseSpeed = 90,
+ .baseSpAttack = 65,
+ .baseSpDefense = 75,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_FLYING,
+ .catchRate = 90,
+ .expYield = 171,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_INNER_FOCUS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ODDISH] =
+ {
+ .baseHP = 45,
+ .baseAttack = 50,
+ .baseDefense = 55,
+ .baseSpeed = 30,
+ .baseSpAttack = 75,
+ .baseSpDefense = 65,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_POISON,
+ .catchRate = 255,
+ .expYield = 78,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_GRASS,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GLOOM] =
+ {
+ .baseHP = 60,
+ .baseAttack = 65,
+ .baseDefense = 70,
+ .baseSpeed = 40,
+ .baseSpAttack = 85,
+ .baseSpDefense = 75,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_POISON,
+ .catchRate = 120,
+ .expYield = 132,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_GRASS,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_VILEPLUME] =
+ {
+ .baseHP = 75,
+ .baseAttack = 80,
+ .baseDefense = 85,
+ .baseSpeed = 50,
+ .baseSpAttack = 100,
+ .baseSpDefense = 90,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_POISON,
+ .catchRate = 45,
+ .expYield = 184,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 3,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_GRASS,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PARAS] =
+ {
+ .baseHP = 35,
+ .baseAttack = 70,
+ .baseDefense = 55,
+ .baseSpeed = 25,
+ .baseSpAttack = 45,
+ .baseSpDefense = 55,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_GRASS,
+ .catchRate = 190,
+ .expYield = 70,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_TINY_MUSHROOM,
+ .item2 = ITEM_BIG_MUSHROOM,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_EFFECT_SPORE, ABILITY_NONE },
+ .safariZoneFleeRate = 50,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PARASECT] =
+ {
+ .baseHP = 60,
+ .baseAttack = 95,
+ .baseDefense = 80,
+ .baseSpeed = 30,
+ .baseSpAttack = 60,
+ .baseSpDefense = 80,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_GRASS,
+ .catchRate = 75,
+ .expYield = 128,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_TINY_MUSHROOM,
+ .item2 = ITEM_BIG_MUSHROOM,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_EFFECT_SPORE, ABILITY_NONE },
+ .safariZoneFleeRate = 75,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_VENONAT] =
+ {
+ .baseHP = 60,
+ .baseAttack = 55,
+ .baseDefense = 50,
+ .baseSpeed = 45,
+ .baseSpAttack = 40,
+ .baseSpDefense = 55,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_POISON,
+ .catchRate = 190,
+ .expYield = 75,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_COMPOUND_EYES, ABILITY_NONE },
+ .safariZoneFleeRate = 50,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_VENOMOTH] =
+ {
+ .baseHP = 70,
+ .baseAttack = 65,
+ .baseDefense = 60,
+ .baseSpeed = 90,
+ .baseSpAttack = 90,
+ .baseSpDefense = 75,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_POISON,
+ .catchRate = 75,
+ .expYield = 138,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SILVER_POWDER,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SHIELD_DUST, ABILITY_NONE },
+ .safariZoneFleeRate = 75,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DIGLETT] =
+ {
+ .baseHP = 10,
+ .baseAttack = 55,
+ .baseDefense = 25,
+ .baseSpeed = 95,
+ .baseSpAttack = 35,
+ .baseSpDefense = 45,
+ .type1 = TYPE_GROUND,
+ .type2 = TYPE_GROUND,
+ .catchRate = 255,
+ .expYield = 81,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_SAND_VEIL, ABILITY_ARENA_TRAP },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DUGTRIO] =
+ {
+ .baseHP = 35,
+ .baseAttack = 80,
+ .baseDefense = 50,
+ .baseSpeed = 120,
+ .baseSpAttack = 50,
+ .baseSpDefense = 70,
+ .type1 = TYPE_GROUND,
+ .type2 = TYPE_GROUND,
+ .catchRate = 50,
+ .expYield = 153,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_SAND_VEIL, ABILITY_ARENA_TRAP },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MEOWTH] =
+ {
+ .baseHP = 40,
+ .baseAttack = 45,
+ .baseDefense = 35,
+ .baseSpeed = 90,
+ .baseSpAttack = 40,
+ .baseSpDefense = 40,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 255,
+ .expYield = 69,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NUGGET,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_PICKUP, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PERSIAN] =
+ {
+ .baseHP = 65,
+ .baseAttack = 70,
+ .baseDefense = 60,
+ .baseSpeed = 115,
+ .baseSpAttack = 65,
+ .baseSpDefense = 65,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 90,
+ .expYield = 148,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_LIMBER, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PSYDUCK] =
+ {
+ .baseHP = 50,
+ .baseAttack = 52,
+ .baseDefense = 48,
+ .baseSpeed = 55,
+ .baseSpAttack = 65,
+ .baseSpDefense = 50,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 190,
+ .expYield = 80,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_DAMP, ABILITY_CLOUD_NINE },
+ .safariZoneFleeRate = 50,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GOLDUCK] =
+ {
+ .baseHP = 80,
+ .baseAttack = 82,
+ .baseDefense = 78,
+ .baseSpeed = 85,
+ .baseSpAttack = 95,
+ .baseSpDefense = 80,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 75,
+ .expYield = 174,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_DAMP, ABILITY_CLOUD_NINE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MANKEY] =
+ {
+ .baseHP = 40,
+ .baseAttack = 80,
+ .baseDefense = 35,
+ .baseSpeed = 70,
+ .baseSpAttack = 35,
+ .baseSpDefense = 45,
+ .type1 = TYPE_FIGHTING,
+ .type2 = TYPE_FIGHTING,
+ .catchRate = 190,
+ .expYield = 74,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_VITAL_SPIRIT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PRIMEAPE] =
+ {
+ .baseHP = 65,
+ .baseAttack = 105,
+ .baseDefense = 60,
+ .baseSpeed = 95,
+ .baseSpAttack = 60,
+ .baseSpDefense = 70,
+ .type1 = TYPE_FIGHTING,
+ .type2 = TYPE_FIGHTING,
+ .catchRate = 75,
+ .expYield = 149,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_VITAL_SPIRIT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GROWLITHE] =
+ {
+ .baseHP = 55,
+ .baseAttack = 70,
+ .baseDefense = 45,
+ .baseSpeed = 60,
+ .baseSpAttack = 70,
+ .baseSpDefense = 50,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 190,
+ .expYield = 91,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_RAWST_BERRY,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(25),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_INTIMIDATE, ABILITY_FLASH_FIRE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ARCANINE] =
+ {
+ .baseHP = 90,
+ .baseAttack = 110,
+ .baseDefense = 80,
+ .baseSpeed = 95,
+ .baseSpAttack = 100,
+ .baseSpDefense = 80,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 75,
+ .expYield = 213,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_RAWST_BERRY,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(25),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_INTIMIDATE, ABILITY_FLASH_FIRE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_POLIWAG] =
+ {
+ .baseHP = 40,
+ .baseAttack = 50,
+ .baseDefense = 40,
+ .baseSpeed = 90,
+ .baseSpAttack = 40,
+ .baseSpDefense = 40,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 255,
+ .expYield = 77,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_WATER_ABSORB, ABILITY_DAMP },
+ .safariZoneFleeRate = 50,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = TRUE,
+ },
+ [SPECIES_POLIWHIRL] =
+ {
+ .baseHP = 65,
+ .baseAttack = 65,
+ .baseDefense = 65,
+ .baseSpeed = 90,
+ .baseSpAttack = 50,
+ .baseSpDefense = 50,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 120,
+ .expYield = 131,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_WATER_ABSORB, ABILITY_DAMP },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = TRUE,
+ },
+ [SPECIES_POLIWRATH] =
+ {
+ .baseHP = 90,
+ .baseAttack = 85,
+ .baseDefense = 95,
+ .baseSpeed = 70,
+ .baseSpAttack = 70,
+ .baseSpDefense = 90,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_FIGHTING,
+ .catchRate = 45,
+ .expYield = 185,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 3,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_WATER_ABSORB, ABILITY_DAMP },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = TRUE,
+ },
+ [SPECIES_ABRA] =
+ {
+ .baseHP = 25,
+ .baseAttack = 20,
+ .baseDefense = 15,
+ .baseSpeed = 90,
+ .baseSpAttack = 105,
+ .baseSpDefense = 55,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 200,
+ .expYield = 73,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_TWISTED_SPOON,
+ .genderRatio = PERCENT_FEMALE(25),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_SYNCHRONIZE, ABILITY_INNER_FOCUS },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_KADABRA] =
+ {
+ .baseHP = 40,
+ .baseAttack = 35,
+ .baseDefense = 30,
+ .baseSpeed = 105,
+ .baseSpAttack = 120,
+ .baseSpDefense = 70,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 100,
+ .expYield = 145,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_TWISTED_SPOON,
+ .genderRatio = PERCENT_FEMALE(25),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_SYNCHRONIZE, ABILITY_INNER_FOCUS },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ALAKAZAM] =
+ {
+ .baseHP = 55,
+ .baseAttack = 50,
+ .baseDefense = 45,
+ .baseSpeed = 120,
+ .baseSpAttack = 135,
+ .baseSpDefense = 85,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 50,
+ .expYield = 186,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 3,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_TWISTED_SPOON,
+ .genderRatio = PERCENT_FEMALE(25),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_SYNCHRONIZE, ABILITY_INNER_FOCUS },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MACHOP] =
+ {
+ .baseHP = 70,
+ .baseAttack = 80,
+ .baseDefense = 50,
+ .baseSpeed = 35,
+ .baseSpAttack = 35,
+ .baseSpDefense = 35,
+ .type1 = TYPE_FIGHTING,
+ .type2 = TYPE_FIGHTING,
+ .catchRate = 180,
+ .expYield = 88,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(25),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_GUTS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MACHOKE] =
+ {
+ .baseHP = 80,
+ .baseAttack = 100,
+ .baseDefense = 70,
+ .baseSpeed = 45,
+ .baseSpAttack = 50,
+ .baseSpDefense = 60,
+ .type1 = TYPE_FIGHTING,
+ .type2 = TYPE_FIGHTING,
+ .catchRate = 90,
+ .expYield = 146,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_FOCUS_BAND,
+ .genderRatio = PERCENT_FEMALE(25),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_GUTS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MACHAMP] =
+ {
+ .baseHP = 90,
+ .baseAttack = 130,
+ .baseDefense = 80,
+ .baseSpeed = 55,
+ .baseSpAttack = 65,
+ .baseSpDefense = 85,
+ .type1 = TYPE_FIGHTING,
+ .type2 = TYPE_FIGHTING,
+ .catchRate = 45,
+ .expYield = 193,
+ .evYield_HP = 0,
+ .evYield_Attack = 3,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_FOCUS_BAND,
+ .genderRatio = PERCENT_FEMALE(25),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_GUTS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_BELLSPROUT] =
+ {
+ .baseHP = 50,
+ .baseAttack = 75,
+ .baseDefense = 35,
+ .baseSpeed = 40,
+ .baseSpAttack = 70,
+ .baseSpDefense = 30,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_POISON,
+ .catchRate = 255,
+ .expYield = 84,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_GRASS,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_WEEPINBELL] =
+ {
+ .baseHP = 65,
+ .baseAttack = 90,
+ .baseDefense = 50,
+ .baseSpeed = 55,
+ .baseSpAttack = 85,
+ .baseSpDefense = 45,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_POISON,
+ .catchRate = 120,
+ .expYield = 151,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_GRASS,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_VICTREEBEL] =
+ {
+ .baseHP = 80,
+ .baseAttack = 105,
+ .baseDefense = 65,
+ .baseSpeed = 70,
+ .baseSpAttack = 100,
+ .baseSpDefense = 60,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_POISON,
+ .catchRate = 45,
+ .expYield = 191,
+ .evYield_HP = 0,
+ .evYield_Attack = 3,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_GRASS,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_TENTACOOL] =
+ {
+ .baseHP = 40,
+ .baseAttack = 40,
+ .baseDefense = 35,
+ .baseSpeed = 70,
+ .baseSpAttack = 50,
+ .baseSpDefense = 100,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_POISON,
+ .catchRate = 190,
+ .expYield = 105,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_3,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_CLEAR_BODY, ABILITY_LIQUID_OOZE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_TENTACRUEL] =
+ {
+ .baseHP = 80,
+ .baseAttack = 70,
+ .baseDefense = 65,
+ .baseSpeed = 100,
+ .baseSpAttack = 80,
+ .baseSpDefense = 120,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_POISON,
+ .catchRate = 60,
+ .expYield = 205,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_3,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_CLEAR_BODY, ABILITY_LIQUID_OOZE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GEODUDE] =
+ {
+ .baseHP = 40,
+ .baseAttack = 80,
+ .baseDefense = 100,
+ .baseSpeed = 20,
+ .baseSpAttack = 30,
+ .baseSpDefense = 30,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_GROUND,
+ .catchRate = 255,
+ .expYield = 86,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_ROCK_HEAD, ABILITY_STURDY },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GRAVELER] =
+ {
+ .baseHP = 55,
+ .baseAttack = 95,
+ .baseDefense = 115,
+ .baseSpeed = 35,
+ .baseSpAttack = 45,
+ .baseSpDefense = 45,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_GROUND,
+ .catchRate = 120,
+ .expYield = 134,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_HARD_STONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_ROCK_HEAD, ABILITY_STURDY },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GOLEM] =
+ {
+ .baseHP = 80,
+ .baseAttack = 110,
+ .baseDefense = 130,
+ .baseSpeed = 45,
+ .baseSpAttack = 55,
+ .baseSpDefense = 65,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_GROUND,
+ .catchRate = 45,
+ .expYield = 177,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 3,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_HARD_STONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_ROCK_HEAD, ABILITY_STURDY },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PONYTA] =
+ {
+ .baseHP = 50,
+ .baseAttack = 85,
+ .baseDefense = 55,
+ .baseSpeed = 90,
+ .baseSpAttack = 65,
+ .baseSpDefense = 65,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 190,
+ .expYield = 152,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_RUN_AWAY, ABILITY_FLASH_FIRE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_RAPIDASH] =
+ {
+ .baseHP = 65,
+ .baseAttack = 100,
+ .baseDefense = 70,
+ .baseSpeed = 105,
+ .baseSpAttack = 80,
+ .baseSpDefense = 80,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 60,
+ .expYield = 192,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_RUN_AWAY, ABILITY_FLASH_FIRE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SLOWPOKE] =
+ {
+ .baseHP = 90,
+ .baseAttack = 65,
+ .baseDefense = 65,
+ .baseSpeed = 15,
+ .baseSpAttack = 40,
+ .baseSpDefense = 40,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 190,
+ .expYield = 99,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_OBLIVIOUS, ABILITY_OWN_TEMPO },
+ .safariZoneFleeRate = 50,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SLOWBRO] =
+ {
+ .baseHP = 95,
+ .baseAttack = 75,
+ .baseDefense = 110,
+ .baseSpeed = 30,
+ .baseSpAttack = 100,
+ .baseSpDefense = 80,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 75,
+ .expYield = 164,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_OBLIVIOUS, ABILITY_OWN_TEMPO },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MAGNEMITE] =
+ {
+ .baseHP = 25,
+ .baseAttack = 35,
+ .baseDefense = 70,
+ .baseSpeed = 45,
+ .baseSpAttack = 95,
+ .baseSpDefense = 55,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_STEEL,
+ .catchRate = 190,
+ .expYield = 89,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_MAGNET_PULL, ABILITY_STURDY },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MAGNETON] =
+ {
+ .baseHP = 50,
+ .baseAttack = 60,
+ .baseDefense = 95,
+ .baseSpeed = 70,
+ .baseSpAttack = 120,
+ .baseSpDefense = 70,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_STEEL,
+ .catchRate = 60,
+ .expYield = 161,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_MAGNET,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_MAGNET_PULL, ABILITY_STURDY },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_FARFETCHD] =
+ {
+ .baseHP = 52,
+ .baseAttack = 65,
+ .baseDefense = 55,
+ .baseSpeed = 60,
+ .baseSpAttack = 58,
+ .baseSpDefense = 62,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_FLYING,
+ .catchRate = 45,
+ .expYield = 94,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_STICK,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_KEEN_EYE, ABILITY_INNER_FOCUS },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DODUO] =
+ {
+ .baseHP = 35,
+ .baseAttack = 85,
+ .baseDefense = 45,
+ .baseSpeed = 75,
+ .baseSpAttack = 35,
+ .baseSpDefense = 35,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_FLYING,
+ .catchRate = 190,
+ .expYield = 96,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_RUN_AWAY, ABILITY_EARLY_BIRD },
+ .safariZoneFleeRate = 50,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DODRIO] =
+ {
+ .baseHP = 60,
+ .baseAttack = 110,
+ .baseDefense = 70,
+ .baseSpeed = 100,
+ .baseSpAttack = 60,
+ .baseSpDefense = 60,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_FLYING,
+ .catchRate = 45,
+ .expYield = 158,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SHARP_BEAK,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_RUN_AWAY, ABILITY_EARLY_BIRD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SEEL] =
+ {
+ .baseHP = 65,
+ .baseAttack = 45,
+ .baseDefense = 55,
+ .baseSpeed = 45,
+ .baseSpAttack = 45,
+ .baseSpDefense = 70,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 190,
+ .expYield = 100,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_ASPEAR_BERRY,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_THICK_FAT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DEWGONG] =
+ {
+ .baseHP = 90,
+ .baseAttack = 70,
+ .baseDefense = 80,
+ .baseSpeed = 70,
+ .baseSpAttack = 70,
+ .baseSpDefense = 95,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_ICE,
+ .catchRate = 75,
+ .expYield = 176,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_ASPEAR_BERRY,
+ .item2 = ITEM_NEVER_MELT_ICE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_THICK_FAT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GRIMER] =
+ {
+ .baseHP = 80,
+ .baseAttack = 80,
+ .baseDefense = 50,
+ .baseSpeed = 25,
+ .baseSpAttack = 40,
+ .baseSpDefense = 50,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_POISON,
+ .catchRate = 190,
+ .expYield = 90,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_STENCH, ABILITY_STICKY_HOLD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MUK] =
+ {
+ .baseHP = 105,
+ .baseAttack = 105,
+ .baseDefense = 75,
+ .baseSpeed = 50,
+ .baseSpAttack = 65,
+ .baseSpDefense = 100,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_POISON,
+ .catchRate = 75,
+ .expYield = 157,
+ .evYield_HP = 1,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_STENCH, ABILITY_STICKY_HOLD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SHELLDER] =
+ {
+ .baseHP = 30,
+ .baseAttack = 65,
+ .baseDefense = 100,
+ .baseSpeed = 40,
+ .baseSpAttack = 45,
+ .baseSpDefense = 25,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 190,
+ .expYield = 97,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_PEARL,
+ .item2 = ITEM_BIG_PEARL,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_3,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_SHELL_ARMOR, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CLOYSTER] =
+ {
+ .baseHP = 50,
+ .baseAttack = 95,
+ .baseDefense = 180,
+ .baseSpeed = 70,
+ .baseSpAttack = 85,
+ .baseSpDefense = 45,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_ICE,
+ .catchRate = 60,
+ .expYield = 203,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_PEARL,
+ .item2 = ITEM_BIG_PEARL,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_3,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_SHELL_ARMOR, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GASTLY] =
+ {
+ .baseHP = 30,
+ .baseAttack = 35,
+ .baseDefense = 30,
+ .baseSpeed = 80,
+ .baseSpAttack = 100,
+ .baseSpDefense = 35,
+ .type1 = TYPE_GHOST,
+ .type2 = TYPE_POISON,
+ .catchRate = 190,
+ .expYield = 95,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_LEVITATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_HAUNTER] =
+ {
+ .baseHP = 45,
+ .baseAttack = 50,
+ .baseDefense = 45,
+ .baseSpeed = 95,
+ .baseSpAttack = 115,
+ .baseSpDefense = 55,
+ .type1 = TYPE_GHOST,
+ .type2 = TYPE_POISON,
+ .catchRate = 90,
+ .expYield = 126,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SPELL_TAG,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_LEVITATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GENGAR] =
+ {
+ .baseHP = 60,
+ .baseAttack = 65,
+ .baseDefense = 60,
+ .baseSpeed = 110,
+ .baseSpAttack = 130,
+ .baseSpDefense = 75,
+ .type1 = TYPE_GHOST,
+ .type2 = TYPE_POISON,
+ .catchRate = 45,
+ .expYield = 190,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 3,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SPELL_TAG,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_LEVITATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ONIX] =
+ {
+ .baseHP = 35,
+ .baseAttack = 45,
+ .baseDefense = 160,
+ .baseSpeed = 70,
+ .baseSpAttack = 30,
+ .baseSpDefense = 45,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_GROUND,
+ .catchRate = 45,
+ .expYield = 108,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_HARD_STONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_ROCK_HEAD, ABILITY_STURDY },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DROWZEE] =
+ {
+ .baseHP = 60,
+ .baseAttack = 48,
+ .baseDefense = 45,
+ .baseSpeed = 42,
+ .baseSpAttack = 43,
+ .baseSpDefense = 90,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 190,
+ .expYield = 102,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_INSOMNIA, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_HYPNO] =
+ {
+ .baseHP = 85,
+ .baseAttack = 73,
+ .baseDefense = 70,
+ .baseSpeed = 67,
+ .baseSpAttack = 73,
+ .baseSpDefense = 115,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 75,
+ .expYield = 165,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_INSOMNIA, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_KRABBY] =
+ {
+ .baseHP = 30,
+ .baseAttack = 105,
+ .baseDefense = 90,
+ .baseSpeed = 50,
+ .baseSpAttack = 25,
+ .baseSpDefense = 25,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 225,
+ .expYield = 115,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_3,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_HYPER_CUTTER, ABILITY_SHELL_ARMOR },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_KINGLER] =
+ {
+ .baseHP = 55,
+ .baseAttack = 130,
+ .baseDefense = 115,
+ .baseSpeed = 75,
+ .baseSpAttack = 50,
+ .baseSpDefense = 50,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 60,
+ .expYield = 206,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_3,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_HYPER_CUTTER, ABILITY_SHELL_ARMOR },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = TRUE,
+ },
+ [SPECIES_VOLTORB] =
+ {
+ .baseHP = 40,
+ .baseAttack = 30,
+ .baseDefense = 50,
+ .baseSpeed = 100,
+ .baseSpAttack = 55,
+ .baseSpDefense = 55,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 190,
+ .expYield = 103,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_SOUNDPROOF, ABILITY_STATIC },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ELECTRODE] =
+ {
+ .baseHP = 60,
+ .baseAttack = 50,
+ .baseDefense = 70,
+ .baseSpeed = 140,
+ .baseSpAttack = 80,
+ .baseSpDefense = 80,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 60,
+ .expYield = 150,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_SOUNDPROOF, ABILITY_STATIC },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_EXEGGCUTE] =
+ {
+ .baseHP = 60,
+ .baseAttack = 40,
+ .baseDefense = 80,
+ .baseSpeed = 40,
+ .baseSpAttack = 60,
+ .baseSpDefense = 45,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 90,
+ .expYield = 98,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_GRASS,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE },
+ .safariZoneFleeRate = 75,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_EXEGGUTOR] =
+ {
+ .baseHP = 95,
+ .baseAttack = 95,
+ .baseDefense = 85,
+ .baseSpeed = 55,
+ .baseSpAttack = 125,
+ .baseSpDefense = 65,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 45,
+ .expYield = 212,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_GRASS,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CUBONE] =
+ {
+ .baseHP = 50,
+ .baseAttack = 50,
+ .baseDefense = 95,
+ .baseSpeed = 35,
+ .baseSpAttack = 40,
+ .baseSpDefense = 50,
+ .type1 = TYPE_GROUND,
+ .type2 = TYPE_GROUND,
+ .catchRate = 190,
+ .expYield = 87,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_THICK_CLUB,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_MONSTER,
+ .abilities = { ABILITY_ROCK_HEAD, ABILITY_LIGHTNING_ROD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MAROWAK] =
+ {
+ .baseHP = 60,
+ .baseAttack = 80,
+ .baseDefense = 110,
+ .baseSpeed = 45,
+ .baseSpAttack = 50,
+ .baseSpDefense = 80,
+ .type1 = TYPE_GROUND,
+ .type2 = TYPE_GROUND,
+ .catchRate = 75,
+ .expYield = 124,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_THICK_CLUB,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_MONSTER,
+ .abilities = { ABILITY_ROCK_HEAD, ABILITY_LIGHTNING_ROD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_HITMONLEE] =
+ {
+ .baseHP = 50,
+ .baseAttack = 120,
+ .baseDefense = 53,
+ .baseSpeed = 87,
+ .baseSpAttack = 35,
+ .baseSpDefense = 110,
+ .type1 = TYPE_FIGHTING,
+ .type2 = TYPE_FIGHTING,
+ .catchRate = 45,
+ .expYield = 139,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_MALE,
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_LIMBER, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_HITMONCHAN] =
+ {
+ .baseHP = 50,
+ .baseAttack = 105,
+ .baseDefense = 79,
+ .baseSpeed = 76,
+ .baseSpAttack = 35,
+ .baseSpDefense = 110,
+ .type1 = TYPE_FIGHTING,
+ .type2 = TYPE_FIGHTING,
+ .catchRate = 45,
+ .expYield = 140,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_MALE,
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_KEEN_EYE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LICKITUNG] =
+ {
+ .baseHP = 90,
+ .baseAttack = 55,
+ .baseDefense = 75,
+ .baseSpeed = 30,
+ .baseSpAttack = 60,
+ .baseSpDefense = 75,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 45,
+ .expYield = 127,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_MONSTER,
+ .abilities = { ABILITY_OWN_TEMPO, ABILITY_OBLIVIOUS },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_KOFFING] =
+ {
+ .baseHP = 40,
+ .baseAttack = 65,
+ .baseDefense = 95,
+ .baseSpeed = 35,
+ .baseSpAttack = 60,
+ .baseSpDefense = 45,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_POISON,
+ .catchRate = 190,
+ .expYield = 114,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_LEVITATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_WEEZING] =
+ {
+ .baseHP = 65,
+ .baseAttack = 90,
+ .baseDefense = 120,
+ .baseSpeed = 60,
+ .baseSpAttack = 85,
+ .baseSpDefense = 70,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_POISON,
+ .catchRate = 60,
+ .expYield = 173,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_LEVITATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_RHYHORN] =
+ {
+ .baseHP = 80,
+ .baseAttack = 85,
+ .baseDefense = 95,
+ .baseSpeed = 25,
+ .baseSpAttack = 30,
+ .baseSpDefense = 30,
+ .type1 = TYPE_GROUND,
+ .type2 = TYPE_ROCK,
+ .catchRate = 120,
+ .expYield = 135,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_LIGHTNING_ROD, ABILITY_ROCK_HEAD },
+ .safariZoneFleeRate = 75,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_RHYDON] =
+ {
+ .baseHP = 105,
+ .baseAttack = 130,
+ .baseDefense = 120,
+ .baseSpeed = 40,
+ .baseSpAttack = 45,
+ .baseSpDefense = 45,
+ .type1 = TYPE_GROUND,
+ .type2 = TYPE_ROCK,
+ .catchRate = 60,
+ .expYield = 204,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_LIGHTNING_ROD, ABILITY_ROCK_HEAD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CHANSEY] =
+ {
+ .baseHP = 250,
+ .baseAttack = 5,
+ .baseDefense = 5,
+ .baseSpeed = 50,
+ .baseSpAttack = 35,
+ .baseSpDefense = 105,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 30,
+ .expYield = 255,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_LUCKY_EGG,
+ .genderRatio = MON_FEMALE,
+ .eggCycles = 40,
+ .friendship = 140,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_FAIRY,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_NATURAL_CURE, ABILITY_SERENE_GRACE },
+ .safariZoneFleeRate = 125,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_TANGELA] =
+ {
+ .baseHP = 65,
+ .baseAttack = 55,
+ .baseDefense = 115,
+ .baseSpeed = 60,
+ .baseSpAttack = 100,
+ .baseSpDefense = 40,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_GRASS,
+ .catchRate = 45,
+ .expYield = 166,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_GRASS,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_KANGASKHAN] =
+ {
+ .baseHP = 105,
+ .baseAttack = 95,
+ .baseDefense = 80,
+ .baseSpeed = 90,
+ .baseSpAttack = 40,
+ .baseSpDefense = 80,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 45,
+ .expYield = 175,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_FEMALE,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_MONSTER,
+ .abilities = { ABILITY_EARLY_BIRD, ABILITY_NONE },
+ .safariZoneFleeRate = 125,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_HORSEA] =
+ {
+ .baseHP = 30,
+ .baseAttack = 40,
+ .baseDefense = 70,
+ .baseSpeed = 60,
+ .baseSpAttack = 70,
+ .baseSpDefense = 25,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 225,
+ .expYield = 83,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SEADRA] =
+ {
+ .baseHP = 55,
+ .baseAttack = 65,
+ .baseDefense = 95,
+ .baseSpeed = 85,
+ .baseSpAttack = 95,
+ .baseSpDefense = 45,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 75,
+ .expYield = 155,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_POISON_POINT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GOLDEEN] =
+ {
+ .baseHP = 45,
+ .baseAttack = 67,
+ .baseDefense = 60,
+ .baseSpeed = 63,
+ .baseSpAttack = 35,
+ .baseSpDefense = 50,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 225,
+ .expYield = 111,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_2,
+ .eggGroup2 = EGG_GROUP_WATER_2,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_WATER_VEIL },
+ .safariZoneFleeRate = 50,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SEAKING] =
+ {
+ .baseHP = 80,
+ .baseAttack = 92,
+ .baseDefense = 65,
+ .baseSpeed = 68,
+ .baseSpAttack = 65,
+ .baseSpDefense = 80,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 60,
+ .expYield = 170,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_2,
+ .eggGroup2 = EGG_GROUP_WATER_2,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_WATER_VEIL },
+ .safariZoneFleeRate = 75,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_STARYU] =
+ {
+ .baseHP = 30,
+ .baseAttack = 45,
+ .baseDefense = 55,
+ .baseSpeed = 85,
+ .baseSpAttack = 70,
+ .baseSpDefense = 55,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 225,
+ .expYield = 106,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_STARDUST,
+ .item2 = ITEM_STAR_PIECE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_3,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_ILLUMINATE, ABILITY_NATURAL_CURE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_STARMIE] =
+ {
+ .baseHP = 60,
+ .baseAttack = 75,
+ .baseDefense = 85,
+ .baseSpeed = 115,
+ .baseSpAttack = 100,
+ .baseSpDefense = 85,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 60,
+ .expYield = 207,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_STARDUST,
+ .item2 = ITEM_STAR_PIECE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_3,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_ILLUMINATE, ABILITY_NATURAL_CURE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MR_MIME] =
+ {
+ .baseHP = 40,
+ .baseAttack = 45,
+ .baseDefense = 65,
+ .baseSpeed = 90,
+ .baseSpAttack = 100,
+ .baseSpDefense = 120,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 45,
+ .expYield = 136,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_SOUNDPROOF, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SCYTHER] =
+ {
+ .baseHP = 70,
+ .baseAttack = 110,
+ .baseDefense = 80,
+ .baseSpeed = 105,
+ .baseSpAttack = 55,
+ .baseSpDefense = 80,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_FLYING,
+ .catchRate = 45,
+ .expYield = 187,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SWARM, ABILITY_NONE },
+ .safariZoneFleeRate = 125,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_JYNX] =
+ {
+ .baseHP = 65,
+ .baseAttack = 50,
+ .baseDefense = 35,
+ .baseSpeed = 95,
+ .baseSpAttack = 115,
+ .baseSpDefense = 95,
+ .type1 = TYPE_ICE,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 45,
+ .expYield = 137,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_FEMALE,
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_OBLIVIOUS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ELECTABUZZ] =
+ {
+ .baseHP = 65,
+ .baseAttack = 83,
+ .baseDefense = 57,
+ .baseSpeed = 105,
+ .baseSpAttack = 95,
+ .baseSpDefense = 85,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 45,
+ .expYield = 156,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(25),
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_STATIC, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = TRUE,
+ },
+ [SPECIES_MAGMAR] =
+ {
+ .baseHP = 65,
+ .baseAttack = 95,
+ .baseDefense = 57,
+ .baseSpeed = 93,
+ .baseSpAttack = 100,
+ .baseSpDefense = 85,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 45,
+ .expYield = 167,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(25),
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_FLAME_BODY, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PINSIR] =
+ {
+ .baseHP = 65,
+ .baseAttack = 125,
+ .baseDefense = 100,
+ .baseSpeed = 85,
+ .baseSpAttack = 55,
+ .baseSpDefense = 70,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_BUG,
+ .catchRate = 45,
+ .expYield = 200,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_HYPER_CUTTER, ABILITY_NONE },
+ .safariZoneFleeRate = 125,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_TAUROS] =
+ {
+ .baseHP = 75,
+ .baseAttack = 100,
+ .baseDefense = 95,
+ .baseSpeed = 110,
+ .baseSpAttack = 40,
+ .baseSpDefense = 70,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 45,
+ .expYield = 211,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_MALE,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_INTIMIDATE, ABILITY_NONE },
+ .safariZoneFleeRate = 125,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MAGIKARP] =
+ {
+ .baseHP = 20,
+ .baseAttack = 10,
+ .baseDefense = 55,
+ .baseSpeed = 80,
+ .baseSpAttack = 15,
+ .baseSpDefense = 20,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 255,
+ .expYield = 20,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 5,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_2,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_NONE },
+ .safariZoneFleeRate = 25,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GYARADOS] =
+ {
+ .baseHP = 95,
+ .baseAttack = 125,
+ .baseDefense = 79,
+ .baseSpeed = 81,
+ .baseSpAttack = 60,
+ .baseSpDefense = 100,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_FLYING,
+ .catchRate = 45,
+ .expYield = 214,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 5,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_2,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_INTIMIDATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LAPRAS] =
+ {
+ .baseHP = 130,
+ .baseAttack = 85,
+ .baseDefense = 80,
+ .baseSpeed = 60,
+ .baseSpAttack = 85,
+ .baseSpDefense = 95,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_ICE,
+ .catchRate = 45,
+ .expYield = 219,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 40,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_WATER_ABSORB, ABILITY_SHELL_ARMOR },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DITTO] =
+ {
+ .baseHP = 48,
+ .baseAttack = 48,
+ .baseDefense = 48,
+ .baseSpeed = 48,
+ .baseSpAttack = 48,
+ .baseSpDefense = 48,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 35,
+ .expYield = 61,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_METAL_POWDER,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_DITTO,
+ .eggGroup2 = EGG_GROUP_DITTO,
+ .abilities = { ABILITY_LIMBER, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_EEVEE] =
+ {
+ .baseHP = 55,
+ .baseAttack = 55,
+ .baseDefense = 50,
+ .baseSpeed = 55,
+ .baseSpAttack = 45,
+ .baseSpDefense = 65,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 45,
+ .expYield = 92,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 35,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_RUN_AWAY, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_VAPOREON] =
+ {
+ .baseHP = 130,
+ .baseAttack = 65,
+ .baseDefense = 60,
+ .baseSpeed = 65,
+ .baseSpAttack = 110,
+ .baseSpDefense = 95,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 45,
+ .expYield = 196,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 35,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_WATER_ABSORB, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_JOLTEON] =
+ {
+ .baseHP = 65,
+ .baseAttack = 65,
+ .baseDefense = 60,
+ .baseSpeed = 130,
+ .baseSpAttack = 110,
+ .baseSpDefense = 95,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 45,
+ .expYield = 197,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 35,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_VOLT_ABSORB, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_FLAREON] =
+ {
+ .baseHP = 65,
+ .baseAttack = 130,
+ .baseDefense = 60,
+ .baseSpeed = 65,
+ .baseSpAttack = 95,
+ .baseSpDefense = 110,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 45,
+ .expYield = 198,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 35,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_FLASH_FIRE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PORYGON] =
+ {
+ .baseHP = 65,
+ .baseAttack = 60,
+ .baseDefense = 70,
+ .baseSpeed = 40,
+ .baseSpAttack = 85,
+ .baseSpDefense = 75,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 45,
+ .expYield = 130,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_TRACE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_OMANYTE] =
+ {
+ .baseHP = 35,
+ .baseAttack = 40,
+ .baseDefense = 100,
+ .baseSpeed = 35,
+ .baseSpAttack = 90,
+ .baseSpDefense = 55,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_WATER,
+ .catchRate = 45,
+ .expYield = 120,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 30,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_SHELL_ARMOR },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_OMASTAR] =
+ {
+ .baseHP = 70,
+ .baseAttack = 60,
+ .baseDefense = 125,
+ .baseSpeed = 55,
+ .baseSpAttack = 115,
+ .baseSpDefense = 70,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_WATER,
+ .catchRate = 45,
+ .expYield = 199,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 30,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_SHELL_ARMOR },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_KABUTO] =
+ {
+ .baseHP = 30,
+ .baseAttack = 80,
+ .baseDefense = 90,
+ .baseSpeed = 55,
+ .baseSpAttack = 55,
+ .baseSpDefense = 45,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_WATER,
+ .catchRate = 45,
+ .expYield = 119,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 30,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_BATTLE_ARMOR },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_KABUTOPS] =
+ {
+ .baseHP = 60,
+ .baseAttack = 115,
+ .baseDefense = 105,
+ .baseSpeed = 80,
+ .baseSpAttack = 65,
+ .baseSpDefense = 70,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_WATER,
+ .catchRate = 45,
+ .expYield = 201,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 30,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_BATTLE_ARMOR },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_AERODACTYL] =
+ {
+ .baseHP = 80,
+ .baseAttack = 105,
+ .baseDefense = 65,
+ .baseSpeed = 130,
+ .baseSpAttack = 60,
+ .baseSpDefense = 75,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_FLYING,
+ .catchRate = 45,
+ .expYield = 202,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 35,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_ROCK_HEAD, ABILITY_PRESSURE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SNORLAX] =
+ {
+ .baseHP = 160,
+ .baseAttack = 110,
+ .baseDefense = 65,
+ .baseSpeed = 30,
+ .baseSpAttack = 65,
+ .baseSpDefense = 110,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 25,
+ .expYield = 154,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_CHESTO_BERRY,
+ .item2 = ITEM_CHESTO_BERRY,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 40,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_MONSTER,
+ .abilities = { ABILITY_IMMUNITY, ABILITY_THICK_FAT },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLACK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ARTICUNO] =
+ {
+ .baseHP = 90,
+ .baseAttack = 85,
+ .baseDefense = 100,
+ .baseSpeed = 85,
+ .baseSpAttack = 95,
+ .baseSpDefense = 125,
+ .type1 = TYPE_ICE,
+ .type2 = TYPE_FLYING,
+ .catchRate = 3,
+ .expYield = 215,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 3,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 80,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_PRESSURE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ZAPDOS] =
+ {
+ .baseHP = 90,
+ .baseAttack = 90,
+ .baseDefense = 85,
+ .baseSpeed = 100,
+ .baseSpAttack = 125,
+ .baseSpDefense = 90,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_FLYING,
+ .catchRate = 3,
+ .expYield = 216,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 3,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 80,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_PRESSURE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MOLTRES] =
+ {
+ .baseHP = 90,
+ .baseAttack = 100,
+ .baseDefense = 90,
+ .baseSpeed = 90,
+ .baseSpAttack = 125,
+ .baseSpDefense = 85,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FLYING,
+ .catchRate = 3,
+ .expYield = 217,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 3,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 80,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_PRESSURE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DRATINI] =
+ {
+ .baseHP = 41,
+ .baseAttack = 64,
+ .baseDefense = 45,
+ .baseSpeed = 50,
+ .baseSpAttack = 50,
+ .baseSpDefense = 50,
+ .type1 = TYPE_DRAGON,
+ .type2 = TYPE_DRAGON,
+ .catchRate = 45,
+ .expYield = 67,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 40,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_SHED_SKIN, ABILITY_NONE },
+ .safariZoneFleeRate = 100,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DRAGONAIR] =
+ {
+ .baseHP = 61,
+ .baseAttack = 84,
+ .baseDefense = 65,
+ .baseSpeed = 70,
+ .baseSpAttack = 70,
+ .baseSpDefense = 70,
+ .type1 = TYPE_DRAGON,
+ .type2 = TYPE_DRAGON,
+ .catchRate = 45,
+ .expYield = 144,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_DRAGON_FANG,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 40,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_SHED_SKIN, ABILITY_NONE },
+ .safariZoneFleeRate = 125,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DRAGONITE] =
+ {
+ .baseHP = 91,
+ .baseAttack = 134,
+ .baseDefense = 95,
+ .baseSpeed = 80,
+ .baseSpAttack = 100,
+ .baseSpDefense = 100,
+ .type1 = TYPE_DRAGON,
+ .type2 = TYPE_FLYING,
+ .catchRate = 45,
+ .expYield = 218,
+ .evYield_HP = 0,
+ .evYield_Attack = 3,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_DRAGON_FANG,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 40,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_INNER_FOCUS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MEWTWO] =
+ {
+ .baseHP = 106,
+ .baseAttack = 110,
+ .baseDefense = 90,
+ .baseSpeed = 130,
+ .baseSpAttack = 154,
+ .baseSpDefense = 90,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 3,
+ .expYield = 220,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 3,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 120,
+ .friendship = 0,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_PRESSURE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MEW] =
+ {
+ .baseHP = 100,
+ .baseAttack = 100,
+ .baseDefense = 100,
+ .baseSpeed = 100,
+ .baseSpAttack = 100,
+ .baseSpDefense = 100,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 45,
+ .expYield = 64,
+ .evYield_HP = 3,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 120,
+ .friendship = 100,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_SYNCHRONIZE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CHIKORITA] =
+ {
+ .baseHP = 45,
+ .baseAttack = 49,
+ .baseDefense = 65,
+ .baseSpeed = 45,
+ .baseSpAttack = 49,
+ .baseSpDefense = 65,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_GRASS,
+ .catchRate = 45,
+ .expYield = 64,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_LUM_BERRY,
+ .item2 = ITEM_LUM_BERRY,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_OVERGROW, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_BAYLEEF] =
+ {
+ .baseHP = 60,
+ .baseAttack = 62,
+ .baseDefense = 80,
+ .baseSpeed = 60,
+ .baseSpAttack = 63,
+ .baseSpDefense = 80,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_GRASS,
+ .catchRate = 45,
+ .expYield = 141,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_OVERGROW, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MEGANIUM] =
+ {
+ .baseHP = 80,
+ .baseAttack = 82,
+ .baseDefense = 100,
+ .baseSpeed = 80,
+ .baseSpAttack = 83,
+ .baseSpDefense = 100,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_GRASS,
+ .catchRate = 45,
+ .expYield = 208,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_OVERGROW, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CYNDAQUIL] =
+ {
+ .baseHP = 39,
+ .baseAttack = 52,
+ .baseDefense = 43,
+ .baseSpeed = 65,
+ .baseSpAttack = 60,
+ .baseSpDefense = 50,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 45,
+ .expYield = 65,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_BLAZE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_QUILAVA] =
+ {
+ .baseHP = 58,
+ .baseAttack = 64,
+ .baseDefense = 58,
+ .baseSpeed = 80,
+ .baseSpAttack = 80,
+ .baseSpDefense = 65,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 45,
+ .expYield = 142,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_BLAZE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_TYPHLOSION] =
+ {
+ .baseHP = 78,
+ .baseAttack = 84,
+ .baseDefense = 78,
+ .baseSpeed = 100,
+ .baseSpAttack = 109,
+ .baseSpDefense = 85,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 45,
+ .expYield = 209,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 3,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_BLAZE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_TOTODILE] =
+ {
+ .baseHP = 50,
+ .baseAttack = 65,
+ .baseDefense = 64,
+ .baseSpeed = 43,
+ .baseSpAttack = 44,
+ .baseSpDefense = 48,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 45,
+ .expYield = 66,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_TORRENT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CROCONAW] =
+ {
+ .baseHP = 65,
+ .baseAttack = 80,
+ .baseDefense = 80,
+ .baseSpeed = 58,
+ .baseSpAttack = 59,
+ .baseSpDefense = 63,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 45,
+ .expYield = 143,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_TORRENT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = TRUE,
+ },
+ [SPECIES_FERALIGATR] =
+ {
+ .baseHP = 85,
+ .baseAttack = 105,
+ .baseDefense = 100,
+ .baseSpeed = 78,
+ .baseSpAttack = 79,
+ .baseSpDefense = 83,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 45,
+ .expYield = 210,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_TORRENT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SENTRET] =
+ {
+ .baseHP = 35,
+ .baseAttack = 46,
+ .baseDefense = 34,
+ .baseSpeed = 20,
+ .baseSpAttack = 35,
+ .baseSpDefense = 45,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 255,
+ .expYield = 57,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_ORAN_BERRY,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_RUN_AWAY, ABILITY_KEEN_EYE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_FURRET] =
+ {
+ .baseHP = 85,
+ .baseAttack = 76,
+ .baseDefense = 64,
+ .baseSpeed = 90,
+ .baseSpAttack = 45,
+ .baseSpDefense = 55,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 90,
+ .expYield = 116,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_ORAN_BERRY,
+ .item2 = ITEM_SITRUS_BERRY,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_RUN_AWAY, ABILITY_KEEN_EYE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_HOOTHOOT] =
+ {
+ .baseHP = 60,
+ .baseAttack = 30,
+ .baseDefense = 30,
+ .baseSpeed = 50,
+ .baseSpAttack = 36,
+ .baseSpDefense = 56,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_FLYING,
+ .catchRate = 255,
+ .expYield = 58,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_INSOMNIA, ABILITY_KEEN_EYE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_NOCTOWL] =
+ {
+ .baseHP = 100,
+ .baseAttack = 50,
+ .baseDefense = 50,
+ .baseSpeed = 70,
+ .baseSpAttack = 76,
+ .baseSpDefense = 96,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_FLYING,
+ .catchRate = 90,
+ .expYield = 162,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_INSOMNIA, ABILITY_KEEN_EYE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LEDYBA] =
+ {
+ .baseHP = 40,
+ .baseAttack = 20,
+ .baseDefense = 30,
+ .baseSpeed = 55,
+ .baseSpAttack = 40,
+ .baseSpDefense = 80,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_FLYING,
+ .catchRate = 255,
+ .expYield = 54,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SWARM, ABILITY_EARLY_BIRD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LEDIAN] =
+ {
+ .baseHP = 55,
+ .baseAttack = 35,
+ .baseDefense = 50,
+ .baseSpeed = 85,
+ .baseSpAttack = 55,
+ .baseSpDefense = 110,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_FLYING,
+ .catchRate = 90,
+ .expYield = 134,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SWARM, ABILITY_EARLY_BIRD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SPINARAK] =
+ {
+ .baseHP = 40,
+ .baseAttack = 60,
+ .baseDefense = 40,
+ .baseSpeed = 30,
+ .baseSpAttack = 40,
+ .baseSpDefense = 40,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_POISON,
+ .catchRate = 255,
+ .expYield = 54,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SWARM, ABILITY_INSOMNIA },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ARIADOS] =
+ {
+ .baseHP = 70,
+ .baseAttack = 90,
+ .baseDefense = 70,
+ .baseSpeed = 40,
+ .baseSpAttack = 60,
+ .baseSpDefense = 60,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_POISON,
+ .catchRate = 90,
+ .expYield = 134,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SWARM, ABILITY_INSOMNIA },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CROBAT] =
+ {
+ .baseHP = 85,
+ .baseAttack = 90,
+ .baseDefense = 80,
+ .baseSpeed = 130,
+ .baseSpAttack = 70,
+ .baseSpDefense = 80,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_FLYING,
+ .catchRate = 90,
+ .expYield = 204,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 3,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_INNER_FOCUS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CHINCHOU] =
+ {
+ .baseHP = 75,
+ .baseAttack = 38,
+ .baseDefense = 38,
+ .baseSpeed = 67,
+ .baseSpAttack = 56,
+ .baseSpDefense = 56,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 190,
+ .expYield = 90,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_YELLOW_SHARD,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_2,
+ .eggGroup2 = EGG_GROUP_WATER_2,
+ .abilities = { ABILITY_VOLT_ABSORB, ABILITY_ILLUMINATE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LANTURN] =
+ {
+ .baseHP = 125,
+ .baseAttack = 58,
+ .baseDefense = 58,
+ .baseSpeed = 67,
+ .baseSpAttack = 76,
+ .baseSpDefense = 76,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 75,
+ .expYield = 156,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_YELLOW_SHARD,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_2,
+ .eggGroup2 = EGG_GROUP_WATER_2,
+ .abilities = { ABILITY_VOLT_ABSORB, ABILITY_ILLUMINATE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PICHU] =
+ {
+ .baseHP = 20,
+ .baseAttack = 40,
+ .baseDefense = 15,
+ .baseSpeed = 60,
+ .baseSpAttack = 35,
+ .baseSpDefense = 35,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 190,
+ .expYield = 42,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 10,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_STATIC, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CLEFFA] =
+ {
+ .baseHP = 50,
+ .baseAttack = 25,
+ .baseDefense = 28,
+ .baseSpeed = 15,
+ .baseSpAttack = 45,
+ .baseSpDefense = 55,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 150,
+ .expYield = 37,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_MOON_STONE,
+ .genderRatio = PERCENT_FEMALE(75),
+ .eggCycles = 10,
+ .friendship = 140,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_CUTE_CHARM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_IGGLYBUFF] =
+ {
+ .baseHP = 90,
+ .baseAttack = 30,
+ .baseDefense = 15,
+ .baseSpeed = 15,
+ .baseSpAttack = 40,
+ .baseSpDefense = 20,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 170,
+ .expYield = 39,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_ORAN_BERRY,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(75),
+ .eggCycles = 10,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_CUTE_CHARM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = TRUE,
+ },
+ [SPECIES_TOGEPI] =
+ {
+ .baseHP = 35,
+ .baseAttack = 20,
+ .baseDefense = 65,
+ .baseSpeed = 20,
+ .baseSpAttack = 40,
+ .baseSpDefense = 65,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 190,
+ .expYield = 74,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 10,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_HUSTLE, ABILITY_SERENE_GRACE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_TOGETIC] =
+ {
+ .baseHP = 55,
+ .baseAttack = 40,
+ .baseDefense = 85,
+ .baseSpeed = 40,
+ .baseSpAttack = 80,
+ .baseSpDefense = 105,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_FLYING,
+ .catchRate = 75,
+ .expYield = 114,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 10,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_HUSTLE, ABILITY_SERENE_GRACE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_NATU] =
+ {
+ .baseHP = 40,
+ .baseAttack = 50,
+ .baseDefense = 45,
+ .baseSpeed = 70,
+ .baseSpAttack = 70,
+ .baseSpDefense = 45,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_FLYING,
+ .catchRate = 190,
+ .expYield = 73,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_SYNCHRONIZE, ABILITY_EARLY_BIRD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_XATU] =
+ {
+ .baseHP = 65,
+ .baseAttack = 75,
+ .baseDefense = 70,
+ .baseSpeed = 95,
+ .baseSpAttack = 95,
+ .baseSpDefense = 70,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_FLYING,
+ .catchRate = 75,
+ .expYield = 171,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_SYNCHRONIZE, ABILITY_EARLY_BIRD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MAREEP] =
+ {
+ .baseHP = 55,
+ .baseAttack = 40,
+ .baseDefense = 40,
+ .baseSpeed = 35,
+ .baseSpAttack = 65,
+ .baseSpDefense = 45,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 235,
+ .expYield = 59,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_STATIC, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_FLAAFFY] =
+ {
+ .baseHP = 70,
+ .baseAttack = 55,
+ .baseDefense = 55,
+ .baseSpeed = 45,
+ .baseSpAttack = 80,
+ .baseSpDefense = 60,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 120,
+ .expYield = 117,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_STATIC, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_AMPHAROS] =
+ {
+ .baseHP = 90,
+ .baseAttack = 75,
+ .baseDefense = 75,
+ .baseSpeed = 55,
+ .baseSpAttack = 115,
+ .baseSpDefense = 90,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 45,
+ .expYield = 194,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 3,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_STATIC, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_BELLOSSOM] =
+ {
+ .baseHP = 75,
+ .baseAttack = 80,
+ .baseDefense = 85,
+ .baseSpeed = 50,
+ .baseSpAttack = 90,
+ .baseSpDefense = 100,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_GRASS,
+ .catchRate = 45,
+ .expYield = 184,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 3,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_GRASS,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MARILL] =
+ {
+ .baseHP = 70,
+ .baseAttack = 20,
+ .baseDefense = 50,
+ .baseSpeed = 40,
+ .baseSpAttack = 20,
+ .baseSpDefense = 50,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 190,
+ .expYield = 58,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 10,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_THICK_FAT, ABILITY_HUGE_POWER },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_AZUMARILL] =
+ {
+ .baseHP = 100,
+ .baseAttack = 50,
+ .baseDefense = 80,
+ .baseSpeed = 50,
+ .baseSpAttack = 50,
+ .baseSpDefense = 80,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 75,
+ .expYield = 153,
+ .evYield_HP = 3,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 10,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_THICK_FAT, ABILITY_HUGE_POWER },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SUDOWOODO] =
+ {
+ .baseHP = 70,
+ .baseAttack = 100,
+ .baseDefense = 115,
+ .baseSpeed = 30,
+ .baseSpAttack = 30,
+ .baseSpDefense = 65,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_ROCK,
+ .catchRate = 65,
+ .expYield = 135,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_STURDY, ABILITY_ROCK_HEAD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_POLITOED] =
+ {
+ .baseHP = 90,
+ .baseAttack = 75,
+ .baseDefense = 75,
+ .baseSpeed = 70,
+ .baseSpAttack = 90,
+ .baseSpDefense = 100,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 45,
+ .expYield = 185,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 3,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_KINGS_ROCK,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_WATER_ABSORB, ABILITY_DAMP },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = TRUE,
+ },
+ [SPECIES_HOPPIP] =
+ {
+ .baseHP = 35,
+ .baseAttack = 35,
+ .baseDefense = 40,
+ .baseSpeed = 50,
+ .baseSpAttack = 35,
+ .baseSpDefense = 55,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_FLYING,
+ .catchRate = 255,
+ .expYield = 74,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FAIRY,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SKIPLOOM] =
+ {
+ .baseHP = 55,
+ .baseAttack = 45,
+ .baseDefense = 50,
+ .baseSpeed = 80,
+ .baseSpAttack = 45,
+ .baseSpDefense = 65,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_FLYING,
+ .catchRate = 120,
+ .expYield = 136,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FAIRY,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_JUMPLUFF] =
+ {
+ .baseHP = 75,
+ .baseAttack = 55,
+ .baseDefense = 70,
+ .baseSpeed = 110,
+ .baseSpAttack = 55,
+ .baseSpDefense = 85,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_FLYING,
+ .catchRate = 45,
+ .expYield = 176,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 3,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FAIRY,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_AIPOM] =
+ {
+ .baseHP = 55,
+ .baseAttack = 70,
+ .baseDefense = 55,
+ .baseSpeed = 85,
+ .baseSpAttack = 40,
+ .baseSpDefense = 55,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 45,
+ .expYield = 94,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_RUN_AWAY, ABILITY_PICKUP },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SUNKERN] =
+ {
+ .baseHP = 30,
+ .baseAttack = 30,
+ .baseDefense = 30,
+ .baseSpeed = 30,
+ .baseSpAttack = 30,
+ .baseSpDefense = 30,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_GRASS,
+ .catchRate = 235,
+ .expYield = 52,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_GRASS,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SUNFLORA] =
+ {
+ .baseHP = 75,
+ .baseAttack = 75,
+ .baseDefense = 55,
+ .baseSpeed = 30,
+ .baseSpAttack = 105,
+ .baseSpDefense = 85,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_GRASS,
+ .catchRate = 120,
+ .expYield = 146,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_GRASS,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_YANMA] =
+ {
+ .baseHP = 65,
+ .baseAttack = 65,
+ .baseDefense = 45,
+ .baseSpeed = 95,
+ .baseSpAttack = 75,
+ .baseSpDefense = 45,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_FLYING,
+ .catchRate = 75,
+ .expYield = 147,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SPEED_BOOST, ABILITY_COMPOUND_EYES },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_WOOPER] =
+ {
+ .baseHP = 55,
+ .baseAttack = 45,
+ .baseDefense = 45,
+ .baseSpeed = 15,
+ .baseSpAttack = 25,
+ .baseSpDefense = 25,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_GROUND,
+ .catchRate = 255,
+ .expYield = 52,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_DAMP, ABILITY_WATER_ABSORB },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_QUAGSIRE] =
+ {
+ .baseHP = 95,
+ .baseAttack = 85,
+ .baseDefense = 85,
+ .baseSpeed = 35,
+ .baseSpAttack = 65,
+ .baseSpDefense = 65,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_GROUND,
+ .catchRate = 90,
+ .expYield = 137,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_DAMP, ABILITY_WATER_ABSORB },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ESPEON] =
+ {
+ .baseHP = 65,
+ .baseAttack = 65,
+ .baseDefense = 60,
+ .baseSpeed = 110,
+ .baseSpAttack = 130,
+ .baseSpDefense = 95,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 45,
+ .expYield = 197,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 35,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_SYNCHRONIZE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_UMBREON] =
+ {
+ .baseHP = 95,
+ .baseAttack = 65,
+ .baseDefense = 110,
+ .baseSpeed = 65,
+ .baseSpAttack = 60,
+ .baseSpDefense = 130,
+ .type1 = TYPE_DARK,
+ .type2 = TYPE_DARK,
+ .catchRate = 45,
+ .expYield = 197,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 35,
+ .friendship = 35,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_SYNCHRONIZE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLACK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MURKROW] =
+ {
+ .baseHP = 60,
+ .baseAttack = 85,
+ .baseDefense = 42,
+ .baseSpeed = 91,
+ .baseSpAttack = 85,
+ .baseSpDefense = 42,
+ .type1 = TYPE_DARK,
+ .type2 = TYPE_FLYING,
+ .catchRate = 30,
+ .expYield = 107,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 35,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_INSOMNIA, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLACK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SLOWKING] =
+ {
+ .baseHP = 95,
+ .baseAttack = 75,
+ .baseDefense = 80,
+ .baseSpeed = 30,
+ .baseSpAttack = 100,
+ .baseSpDefense = 110,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 70,
+ .expYield = 164,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 3,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_KINGS_ROCK,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_OBLIVIOUS, ABILITY_OWN_TEMPO },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MISDREAVUS] =
+ {
+ .baseHP = 60,
+ .baseAttack = 60,
+ .baseDefense = 60,
+ .baseSpeed = 85,
+ .baseSpAttack = 85,
+ .baseSpDefense = 85,
+ .type1 = TYPE_GHOST,
+ .type2 = TYPE_GHOST,
+ .catchRate = 45,
+ .expYield = 147,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SPELL_TAG,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 35,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_LEVITATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_UNOWN] =
+ {
+ .baseHP = 48,
+ .baseAttack = 72,
+ .baseDefense = 48,
+ .baseSpeed = 48,
+ .baseSpAttack = 72,
+ .baseSpDefense = 48,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 225,
+ .expYield = 61,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 40,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_LEVITATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLACK,
+ .noFlip = TRUE,
+ },
+ [SPECIES_WOBBUFFET] =
+ {
+ .baseHP = 190,
+ .baseAttack = 33,
+ .baseDefense = 58,
+ .baseSpeed = 33,
+ .baseSpAttack = 33,
+ .baseSpDefense = 58,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 45,
+ .expYield = 177,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_SHADOW_TAG, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GIRAFARIG] =
+ {
+ .baseHP = 70,
+ .baseAttack = 80,
+ .baseDefense = 65,
+ .baseSpeed = 85,
+ .baseSpAttack = 90,
+ .baseSpDefense = 65,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 60,
+ .expYield = 149,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_PERSIM_BERRY,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_INNER_FOCUS, ABILITY_EARLY_BIRD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PINECO] =
+ {
+ .baseHP = 50,
+ .baseAttack = 65,
+ .baseDefense = 90,
+ .baseSpeed = 15,
+ .baseSpAttack = 35,
+ .baseSpDefense = 35,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_BUG,
+ .catchRate = 190,
+ .expYield = 60,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_STURDY, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_FORRETRESS] =
+ {
+ .baseHP = 75,
+ .baseAttack = 90,
+ .baseDefense = 140,
+ .baseSpeed = 40,
+ .baseSpAttack = 60,
+ .baseSpDefense = 60,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_STEEL,
+ .catchRate = 75,
+ .expYield = 118,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_STURDY, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DUNSPARCE] =
+ {
+ .baseHP = 100,
+ .baseAttack = 70,
+ .baseDefense = 70,
+ .baseSpeed = 45,
+ .baseSpAttack = 65,
+ .baseSpDefense = 65,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 190,
+ .expYield = 75,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_SERENE_GRACE, ABILITY_RUN_AWAY },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GLIGAR] =
+ {
+ .baseHP = 65,
+ .baseAttack = 75,
+ .baseDefense = 105,
+ .baseSpeed = 85,
+ .baseSpAttack = 35,
+ .baseSpDefense = 65,
+ .type1 = TYPE_GROUND,
+ .type2 = TYPE_FLYING,
+ .catchRate = 60,
+ .expYield = 108,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_HYPER_CUTTER, ABILITY_SAND_VEIL },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_STEELIX] =
+ {
+ .baseHP = 75,
+ .baseAttack = 85,
+ .baseDefense = 200,
+ .baseSpeed = 30,
+ .baseSpAttack = 55,
+ .baseSpDefense = 65,
+ .type1 = TYPE_STEEL,
+ .type2 = TYPE_GROUND,
+ .catchRate = 25,
+ .expYield = 196,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_METAL_COAT,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_ROCK_HEAD, ABILITY_STURDY },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SNUBBULL] =
+ {
+ .baseHP = 60,
+ .baseAttack = 80,
+ .baseDefense = 50,
+ .baseSpeed = 30,
+ .baseSpAttack = 40,
+ .baseSpDefense = 40,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 190,
+ .expYield = 63,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(75),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_INTIMIDATE, ABILITY_RUN_AWAY },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GRANBULL] =
+ {
+ .baseHP = 90,
+ .baseAttack = 120,
+ .baseDefense = 75,
+ .baseSpeed = 45,
+ .baseSpAttack = 60,
+ .baseSpDefense = 60,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 75,
+ .expYield = 178,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(75),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_INTIMIDATE, ABILITY_INTIMIDATE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_QWILFISH] =
+ {
+ .baseHP = 65,
+ .baseAttack = 95,
+ .baseDefense = 75,
+ .baseSpeed = 85,
+ .baseSpAttack = 55,
+ .baseSpDefense = 55,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_POISON,
+ .catchRate = 45,
+ .expYield = 100,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_2,
+ .eggGroup2 = EGG_GROUP_WATER_2,
+ .abilities = { ABILITY_POISON_POINT, ABILITY_SWIFT_SWIM },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SCIZOR] =
+ {
+ .baseHP = 70,
+ .baseAttack = 130,
+ .baseDefense = 100,
+ .baseSpeed = 65,
+ .baseSpAttack = 55,
+ .baseSpDefense = 80,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_STEEL,
+ .catchRate = 25,
+ .expYield = 200,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SWARM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SHUCKLE] =
+ {
+ .baseHP = 20,
+ .baseAttack = 10,
+ .baseDefense = 230,
+ .baseSpeed = 5,
+ .baseSpAttack = 10,
+ .baseSpDefense = 230,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_ROCK,
+ .catchRate = 190,
+ .expYield = 80,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_BERRY_JUICE,
+ .item2 = ITEM_BERRY_JUICE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_STURDY, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_HERACROSS] =
+ {
+ .baseHP = 80,
+ .baseAttack = 125,
+ .baseDefense = 75,
+ .baseSpeed = 85,
+ .baseSpAttack = 40,
+ .baseSpDefense = 95,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_FIGHTING,
+ .catchRate = 45,
+ .expYield = 200,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SWARM, ABILITY_GUTS },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SNEASEL] =
+ {
+ .baseHP = 55,
+ .baseAttack = 95,
+ .baseDefense = 55,
+ .baseSpeed = 115,
+ .baseSpAttack = 35,
+ .baseSpDefense = 75,
+ .type1 = TYPE_DARK,
+ .type2 = TYPE_ICE,
+ .catchRate = 60,
+ .expYield = 132,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 35,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_INNER_FOCUS, ABILITY_KEEN_EYE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLACK,
+ .noFlip = TRUE,
+ },
+ [SPECIES_TEDDIURSA] =
+ {
+ .baseHP = 60,
+ .baseAttack = 80,
+ .baseDefense = 50,
+ .baseSpeed = 40,
+ .baseSpAttack = 50,
+ .baseSpDefense = 50,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 120,
+ .expYield = 124,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_ORAN_BERRY,
+ .item2 = ITEM_SITRUS_BERRY,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_PICKUP, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = TRUE,
+ },
+ [SPECIES_URSARING] =
+ {
+ .baseHP = 90,
+ .baseAttack = 130,
+ .baseDefense = 75,
+ .baseSpeed = 55,
+ .baseSpAttack = 75,
+ .baseSpDefense = 75,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 60,
+ .expYield = 189,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_ORAN_BERRY,
+ .item2 = ITEM_SITRUS_BERRY,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_GUTS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SLUGMA] =
+ {
+ .baseHP = 40,
+ .baseAttack = 40,
+ .baseDefense = 40,
+ .baseSpeed = 20,
+ .baseSpAttack = 70,
+ .baseSpDefense = 40,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 190,
+ .expYield = 78,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_MAGMA_ARMOR, ABILITY_FLAME_BODY },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MAGCARGO] =
+ {
+ .baseHP = 50,
+ .baseAttack = 50,
+ .baseDefense = 120,
+ .baseSpeed = 30,
+ .baseSpAttack = 80,
+ .baseSpDefense = 80,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_ROCK,
+ .catchRate = 75,
+ .expYield = 154,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_MAGMA_ARMOR, ABILITY_FLAME_BODY },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SWINUB] =
+ {
+ .baseHP = 50,
+ .baseAttack = 50,
+ .baseDefense = 40,
+ .baseSpeed = 50,
+ .baseSpAttack = 30,
+ .baseSpDefense = 30,
+ .type1 = TYPE_ICE,
+ .type2 = TYPE_GROUND,
+ .catchRate = 225,
+ .expYield = 78,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_ASPEAR_BERRY,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_OBLIVIOUS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PILOSWINE] =
+ {
+ .baseHP = 100,
+ .baseAttack = 100,
+ .baseDefense = 80,
+ .baseSpeed = 50,
+ .baseSpAttack = 60,
+ .baseSpDefense = 60,
+ .type1 = TYPE_ICE,
+ .type2 = TYPE_GROUND,
+ .catchRate = 75,
+ .expYield = 160,
+ .evYield_HP = 1,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_ASPEAR_BERRY,
+ .item2 = ITEM_NEVER_MELT_ICE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_OBLIVIOUS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CORSOLA] =
+ {
+ .baseHP = 55,
+ .baseAttack = 55,
+ .baseDefense = 85,
+ .baseSpeed = 35,
+ .baseSpAttack = 65,
+ .baseSpDefense = 85,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_ROCK,
+ .catchRate = 60,
+ .expYield = 113,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_RED_SHARD,
+ .genderRatio = PERCENT_FEMALE(75),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_HUSTLE, ABILITY_NATURAL_CURE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_REMORAID] =
+ {
+ .baseHP = 35,
+ .baseAttack = 65,
+ .baseDefense = 35,
+ .baseSpeed = 65,
+ .baseSpAttack = 65,
+ .baseSpDefense = 35,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 190,
+ .expYield = 78,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_2,
+ .abilities = { ABILITY_HUSTLE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_OCTILLERY] =
+ {
+ .baseHP = 75,
+ .baseAttack = 105,
+ .baseDefense = 75,
+ .baseSpeed = 45,
+ .baseSpAttack = 105,
+ .baseSpDefense = 75,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 75,
+ .expYield = 164,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_2,
+ .abilities = { ABILITY_SUCTION_CUPS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DELIBIRD] =
+ {
+ .baseHP = 45,
+ .baseAttack = 55,
+ .baseDefense = 45,
+ .baseSpeed = 75,
+ .baseSpAttack = 65,
+ .baseSpDefense = 45,
+ .type1 = TYPE_ICE,
+ .type2 = TYPE_FLYING,
+ .catchRate = 45,
+ .expYield = 183,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_VITAL_SPIRIT, ABILITY_HUSTLE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MANTINE] =
+ {
+ .baseHP = 65,
+ .baseAttack = 40,
+ .baseDefense = 70,
+ .baseSpeed = 70,
+ .baseSpAttack = 80,
+ .baseSpDefense = 140,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_FLYING,
+ .catchRate = 25,
+ .expYield = 168,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_WATER_ABSORB },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SKARMORY] =
+ {
+ .baseHP = 65,
+ .baseAttack = 80,
+ .baseDefense = 140,
+ .baseSpeed = 70,
+ .baseSpAttack = 40,
+ .baseSpDefense = 70,
+ .type1 = TYPE_STEEL,
+ .type2 = TYPE_FLYING,
+ .catchRate = 25,
+ .expYield = 168,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SHARP_BEAK,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_KEEN_EYE, ABILITY_STURDY },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_HOUNDOUR] =
+ {
+ .baseHP = 45,
+ .baseAttack = 60,
+ .baseDefense = 30,
+ .baseSpeed = 65,
+ .baseSpAttack = 80,
+ .baseSpDefense = 50,
+ .type1 = TYPE_DARK,
+ .type2 = TYPE_FIRE,
+ .catchRate = 120,
+ .expYield = 114,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_EARLY_BIRD, ABILITY_FLASH_FIRE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLACK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_HOUNDOOM] =
+ {
+ .baseHP = 75,
+ .baseAttack = 90,
+ .baseDefense = 50,
+ .baseSpeed = 95,
+ .baseSpAttack = 110,
+ .baseSpDefense = 80,
+ .type1 = TYPE_DARK,
+ .type2 = TYPE_FIRE,
+ .catchRate = 45,
+ .expYield = 204,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_EARLY_BIRD, ABILITY_FLASH_FIRE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLACK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_KINGDRA] =
+ {
+ .baseHP = 75,
+ .baseAttack = 95,
+ .baseDefense = 95,
+ .baseSpeed = 85,
+ .baseSpAttack = 95,
+ .baseSpDefense = 95,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_DRAGON,
+ .catchRate = 45,
+ .expYield = 207,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_DRAGON_SCALE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PHANPY] =
+ {
+ .baseHP = 90,
+ .baseAttack = 60,
+ .baseDefense = 60,
+ .baseSpeed = 40,
+ .baseSpAttack = 40,
+ .baseSpDefense = 40,
+ .type1 = TYPE_GROUND,
+ .type2 = TYPE_GROUND,
+ .catchRate = 120,
+ .expYield = 124,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_PICKUP, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DONPHAN] =
+ {
+ .baseHP = 90,
+ .baseAttack = 120,
+ .baseDefense = 120,
+ .baseSpeed = 50,
+ .baseSpAttack = 60,
+ .baseSpDefense = 60,
+ .type1 = TYPE_GROUND,
+ .type2 = TYPE_GROUND,
+ .catchRate = 60,
+ .expYield = 189,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_STURDY, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PORYGON2] =
+ {
+ .baseHP = 85,
+ .baseAttack = 80,
+ .baseDefense = 90,
+ .baseSpeed = 60,
+ .baseSpAttack = 105,
+ .baseSpDefense = 95,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 45,
+ .expYield = 180,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_UP_GRADE,
+ .item2 = ITEM_UP_GRADE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_TRACE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_STANTLER] =
+ {
+ .baseHP = 73,
+ .baseAttack = 95,
+ .baseDefense = 62,
+ .baseSpeed = 85,
+ .baseSpAttack = 85,
+ .baseSpDefense = 65,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 45,
+ .expYield = 165,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_INTIMIDATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SMEARGLE] =
+ {
+ .baseHP = 55,
+ .baseAttack = 20,
+ .baseDefense = 35,
+ .baseSpeed = 75,
+ .baseSpAttack = 20,
+ .baseSpDefense = 45,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 45,
+ .expYield = 106,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_OWN_TEMPO, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_TYROGUE] =
+ {
+ .baseHP = 35,
+ .baseAttack = 35,
+ .baseDefense = 35,
+ .baseSpeed = 35,
+ .baseSpAttack = 35,
+ .baseSpDefense = 35,
+ .type1 = TYPE_FIGHTING,
+ .type2 = TYPE_FIGHTING,
+ .catchRate = 75,
+ .expYield = 91,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_MALE,
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_GUTS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_HITMONTOP] =
+ {
+ .baseHP = 50,
+ .baseAttack = 95,
+ .baseDefense = 95,
+ .baseSpeed = 70,
+ .baseSpAttack = 35,
+ .baseSpDefense = 110,
+ .type1 = TYPE_FIGHTING,
+ .type2 = TYPE_FIGHTING,
+ .catchRate = 45,
+ .expYield = 138,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_MALE,
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_INTIMIDATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SMOOCHUM] =
+ {
+ .baseHP = 45,
+ .baseAttack = 30,
+ .baseDefense = 15,
+ .baseSpeed = 65,
+ .baseSpAttack = 85,
+ .baseSpDefense = 65,
+ .type1 = TYPE_ICE,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 45,
+ .expYield = 87,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_FEMALE,
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_OBLIVIOUS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ELEKID] =
+ {
+ .baseHP = 45,
+ .baseAttack = 63,
+ .baseDefense = 37,
+ .baseSpeed = 95,
+ .baseSpAttack = 65,
+ .baseSpDefense = 55,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 45,
+ .expYield = 106,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(25),
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_STATIC, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = TRUE,
+ },
+ [SPECIES_MAGBY] =
+ {
+ .baseHP = 45,
+ .baseAttack = 75,
+ .baseDefense = 37,
+ .baseSpeed = 83,
+ .baseSpAttack = 70,
+ .baseSpDefense = 55,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 45,
+ .expYield = 117,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(25),
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_FLAME_BODY, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MILTANK] =
+ {
+ .baseHP = 95,
+ .baseAttack = 80,
+ .baseDefense = 105,
+ .baseSpeed = 100,
+ .baseSpAttack = 40,
+ .baseSpDefense = 70,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 45,
+ .expYield = 200,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_MOOMOO_MILK,
+ .item2 = ITEM_MOOMOO_MILK,
+ .genderRatio = MON_FEMALE,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_THICK_FAT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_BLISSEY] =
+ {
+ .baseHP = 255,
+ .baseAttack = 10,
+ .baseDefense = 10,
+ .baseSpeed = 55,
+ .baseSpAttack = 75,
+ .baseSpDefense = 135,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 30,
+ .expYield = 255,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_LUCKY_EGG,
+ .genderRatio = MON_FEMALE,
+ .eggCycles = 40,
+ .friendship = 140,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_FAIRY,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_NATURAL_CURE, ABILITY_SERENE_GRACE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_RAIKOU] =
+ {
+ .baseHP = 90,
+ .baseAttack = 85,
+ .baseDefense = 75,
+ .baseSpeed = 115,
+ .baseSpAttack = 115,
+ .baseSpDefense = 100,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 3,
+ .expYield = 216,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 80,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_PRESSURE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ENTEI] =
+ {
+ .baseHP = 115,
+ .baseAttack = 115,
+ .baseDefense = 85,
+ .baseSpeed = 100,
+ .baseSpAttack = 90,
+ .baseSpDefense = 75,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 3,
+ .expYield = 217,
+ .evYield_HP = 1,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 80,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_PRESSURE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SUICUNE] =
+ {
+ .baseHP = 100,
+ .baseAttack = 75,
+ .baseDefense = 115,
+ .baseSpeed = 85,
+ .baseSpAttack = 90,
+ .baseSpDefense = 115,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 3,
+ .expYield = 215,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 80,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_PRESSURE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LARVITAR] =
+ {
+ .baseHP = 50,
+ .baseAttack = 64,
+ .baseDefense = 50,
+ .baseSpeed = 41,
+ .baseSpAttack = 45,
+ .baseSpDefense = 50,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_GROUND,
+ .catchRate = 45,
+ .expYield = 67,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 40,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_MONSTER,
+ .abilities = { ABILITY_GUTS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PUPITAR] =
+ {
+ .baseHP = 70,
+ .baseAttack = 84,
+ .baseDefense = 70,
+ .baseSpeed = 51,
+ .baseSpAttack = 65,
+ .baseSpDefense = 70,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_GROUND,
+ .catchRate = 45,
+ .expYield = 144,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 40,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_MONSTER,
+ .abilities = { ABILITY_SHED_SKIN, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_TYRANITAR] =
+ {
+ .baseHP = 100,
+ .baseAttack = 134,
+ .baseDefense = 110,
+ .baseSpeed = 61,
+ .baseSpAttack = 95,
+ .baseSpDefense = 100,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_DARK,
+ .catchRate = 45,
+ .expYield = 218,
+ .evYield_HP = 0,
+ .evYield_Attack = 3,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 40,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_MONSTER,
+ .abilities = { ABILITY_SAND_STREAM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LUGIA] =
+ {
+ .baseHP = 106,
+ .baseAttack = 90,
+ .baseDefense = 130,
+ .baseSpeed = 110,
+ .baseSpAttack = 90,
+ .baseSpDefense = 154,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_FLYING,
+ .catchRate = 3,
+ .expYield = 220,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 3,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 120,
+ .friendship = 0,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_PRESSURE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_HO_OH] =
+ {
+ .baseHP = 106,
+ .baseAttack = 130,
+ .baseDefense = 90,
+ .baseSpeed = 90,
+ .baseSpAttack = 110,
+ .baseSpDefense = 154,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FLYING,
+ .catchRate = 3,
+ .expYield = 220,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 3,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 120,
+ .friendship = 0,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_PRESSURE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CELEBI] =
+ {
+ .baseHP = 100,
+ .baseAttack = 100,
+ .baseDefense = 100,
+ .baseSpeed = 100,
+ .baseSpAttack = 100,
+ .baseSpDefense = 100,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_GRASS,
+ .catchRate = 45,
+ .expYield = 64,
+ .evYield_HP = 3,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_LUM_BERRY,
+ .item2 = ITEM_LUM_BERRY,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 120,
+ .friendship = 100,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_NATURAL_CURE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_OLD_UNOWN_B] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_C] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_D] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_E] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_F] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_G] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_H] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_I] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_J] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_K] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_L] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_M] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_N] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_O] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_P] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_Q] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_R] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_S] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_T] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_U] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_V] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_W] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_X] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_Y] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_OLD_UNOWN_Z] = OLD_UNOWN_BASE_STATS,
+ [SPECIES_TREECKO] =
+ {
+ .baseHP = 40,
+ .baseAttack = 45,
+ .baseDefense = 35,
+ .baseSpeed = 70,
+ .baseSpAttack = 65,
+ .baseSpDefense = 55,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_GRASS,
+ .catchRate = 45,
+ .expYield = 65,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_OVERGROW, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GROVYLE] =
+ {
+ .baseHP = 50,
+ .baseAttack = 65,
+ .baseDefense = 45,
+ .baseSpeed = 95,
+ .baseSpAttack = 85,
+ .baseSpDefense = 65,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_GRASS,
+ .catchRate = 45,
+ .expYield = 141,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_OVERGROW, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SCEPTILE] =
+ {
+ .baseHP = 70,
+ .baseAttack = 85,
+ .baseDefense = 65,
+ .baseSpeed = 120,
+ .baseSpAttack = 105,
+ .baseSpDefense = 85,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_GRASS,
+ .catchRate = 45,
+ .expYield = 208,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 3,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_OVERGROW, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_TORCHIC] =
+ {
+ .baseHP = 45,
+ .baseAttack = 60,
+ .baseDefense = 40,
+ .baseSpeed = 45,
+ .baseSpAttack = 70,
+ .baseSpDefense = 50,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 45,
+ .expYield = 65,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_BLAZE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_COMBUSKEN] =
+ {
+ .baseHP = 60,
+ .baseAttack = 85,
+ .baseDefense = 60,
+ .baseSpeed = 55,
+ .baseSpAttack = 85,
+ .baseSpDefense = 60,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIGHTING,
+ .catchRate = 45,
+ .expYield = 142,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_BLAZE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_BLAZIKEN] =
+ {
+ .baseHP = 80,
+ .baseAttack = 120,
+ .baseDefense = 70,
+ .baseSpeed = 80,
+ .baseSpAttack = 110,
+ .baseSpDefense = 70,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIGHTING,
+ .catchRate = 45,
+ .expYield = 209,
+ .evYield_HP = 0,
+ .evYield_Attack = 3,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_BLAZE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MUDKIP] =
+ {
+ .baseHP = 50,
+ .baseAttack = 70,
+ .baseDefense = 50,
+ .baseSpeed = 40,
+ .baseSpAttack = 50,
+ .baseSpDefense = 50,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 45,
+ .expYield = 65,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_TORRENT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MARSHTOMP] =
+ {
+ .baseHP = 70,
+ .baseAttack = 85,
+ .baseDefense = 70,
+ .baseSpeed = 50,
+ .baseSpAttack = 60,
+ .baseSpDefense = 70,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_GROUND,
+ .catchRate = 45,
+ .expYield = 143,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_TORRENT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SWAMPERT] =
+ {
+ .baseHP = 100,
+ .baseAttack = 110,
+ .baseDefense = 90,
+ .baseSpeed = 60,
+ .baseSpAttack = 85,
+ .baseSpDefense = 90,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_GROUND,
+ .catchRate = 45,
+ .expYield = 210,
+ .evYield_HP = 0,
+ .evYield_Attack = 3,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_TORRENT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_POOCHYENA] =
+ {
+ .baseHP = 35,
+ .baseAttack = 55,
+ .baseDefense = 35,
+ .baseSpeed = 35,
+ .baseSpAttack = 30,
+ .baseSpDefense = 30,
+ .type1 = TYPE_DARK,
+ .type2 = TYPE_DARK,
+ .catchRate = 255,
+ .expYield = 55,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_PECHA_BERRY,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_RUN_AWAY, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MIGHTYENA] =
+ {
+ .baseHP = 70,
+ .baseAttack = 90,
+ .baseDefense = 70,
+ .baseSpeed = 70,
+ .baseSpAttack = 60,
+ .baseSpDefense = 60,
+ .type1 = TYPE_DARK,
+ .type2 = TYPE_DARK,
+ .catchRate = 127,
+ .expYield = 128,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_PECHA_BERRY,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_INTIMIDATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ZIGZAGOON] =
+ {
+ .baseHP = 38,
+ .baseAttack = 30,
+ .baseDefense = 41,
+ .baseSpeed = 60,
+ .baseSpAttack = 30,
+ .baseSpDefense = 41,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 255,
+ .expYield = 60,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_ORAN_BERRY,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_PICKUP, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LINOONE] =
+ {
+ .baseHP = 78,
+ .baseAttack = 70,
+ .baseDefense = 61,
+ .baseSpeed = 100,
+ .baseSpAttack = 50,
+ .baseSpDefense = 61,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 90,
+ .expYield = 128,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_ORAN_BERRY,
+ .item2 = ITEM_SITRUS_BERRY,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_PICKUP, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_WURMPLE] =
+ {
+ .baseHP = 45,
+ .baseAttack = 45,
+ .baseDefense = 35,
+ .baseSpeed = 20,
+ .baseSpAttack = 20,
+ .baseSpDefense = 30,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_BUG,
+ .catchRate = 255,
+ .expYield = 54,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SHIELD_DUST, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SILCOON] =
+ {
+ .baseHP = 50,
+ .baseAttack = 35,
+ .baseDefense = 55,
+ .baseSpeed = 15,
+ .baseSpAttack = 25,
+ .baseSpDefense = 25,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_BUG,
+ .catchRate = 120,
+ .expYield = 71,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SHED_SKIN, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_BEAUTIFLY] =
+ {
+ .baseHP = 60,
+ .baseAttack = 70,
+ .baseDefense = 50,
+ .baseSpeed = 65,
+ .baseSpAttack = 90,
+ .baseSpDefense = 50,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_FLYING,
+ .catchRate = 45,
+ .expYield = 161,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 3,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SILVER_POWDER,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SWARM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CASCOON] =
+ {
+ .baseHP = 50,
+ .baseAttack = 35,
+ .baseDefense = 55,
+ .baseSpeed = 15,
+ .baseSpAttack = 25,
+ .baseSpDefense = 25,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_BUG,
+ .catchRate = 120,
+ .expYield = 72,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SHED_SKIN, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DUSTOX] =
+ {
+ .baseHP = 60,
+ .baseAttack = 50,
+ .baseDefense = 70,
+ .baseSpeed = 65,
+ .baseSpAttack = 50,
+ .baseSpDefense = 90,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_POISON,
+ .catchRate = 45,
+ .expYield = 160,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 3,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SILVER_POWDER,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SHIELD_DUST, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LOTAD] =
+ {
+ .baseHP = 40,
+ .baseAttack = 30,
+ .baseDefense = 30,
+ .baseSpeed = 30,
+ .baseSpAttack = 40,
+ .baseSpDefense = 50,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_GRASS,
+ .catchRate = 255,
+ .expYield = 74,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_RAIN_DISH },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LOMBRE] =
+ {
+ .baseHP = 60,
+ .baseAttack = 50,
+ .baseDefense = 50,
+ .baseSpeed = 50,
+ .baseSpAttack = 60,
+ .baseSpDefense = 70,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_GRASS,
+ .catchRate = 120,
+ .expYield = 141,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_RAIN_DISH },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LUDICOLO] =
+ {
+ .baseHP = 80,
+ .baseAttack = 70,
+ .baseDefense = 70,
+ .baseSpeed = 70,
+ .baseSpAttack = 90,
+ .baseSpDefense = 100,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_GRASS,
+ .catchRate = 45,
+ .expYield = 181,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 3,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_RAIN_DISH },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SEEDOT] =
+ {
+ .baseHP = 40,
+ .baseAttack = 40,
+ .baseDefense = 50,
+ .baseSpeed = 30,
+ .baseSpAttack = 30,
+ .baseSpDefense = 30,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_GRASS,
+ .catchRate = 255,
+ .expYield = 74,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_EARLY_BIRD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_NUZLEAF] =
+ {
+ .baseHP = 70,
+ .baseAttack = 70,
+ .baseDefense = 40,
+ .baseSpeed = 60,
+ .baseSpAttack = 60,
+ .baseSpDefense = 40,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_DARK,
+ .catchRate = 120,
+ .expYield = 141,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_EARLY_BIRD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SHIFTRY] =
+ {
+ .baseHP = 90,
+ .baseAttack = 100,
+ .baseDefense = 60,
+ .baseSpeed = 80,
+ .baseSpAttack = 90,
+ .baseSpDefense = 60,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_DARK,
+ .catchRate = 45,
+ .expYield = 181,
+ .evYield_HP = 0,
+ .evYield_Attack = 3,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_EARLY_BIRD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_NINCADA] =
+ {
+ .baseHP = 31,
+ .baseAttack = 45,
+ .baseDefense = 90,
+ .baseSpeed = 40,
+ .baseSpAttack = 30,
+ .baseSpDefense = 30,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_GROUND,
+ .catchRate = 255,
+ .expYield = 65,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_ERRATIC,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_COMPOUND_EYES, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_NINJASK] =
+ {
+ .baseHP = 61,
+ .baseAttack = 90,
+ .baseDefense = 45,
+ .baseSpeed = 160,
+ .baseSpAttack = 50,
+ .baseSpDefense = 50,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_FLYING,
+ .catchRate = 120,
+ .expYield = 155,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_ERRATIC,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SPEED_BOOST, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SHEDINJA] =
+ {
+ .baseHP = 1,
+ .baseAttack = 90,
+ .baseDefense = 45,
+ .baseSpeed = 40,
+ .baseSpAttack = 30,
+ .baseSpDefense = 30,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_GHOST,
+ .catchRate = 45,
+ .expYield = 95,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_ERRATIC,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_WONDER_GUARD, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_TAILLOW] =
+ {
+ .baseHP = 40,
+ .baseAttack = 55,
+ .baseDefense = 30,
+ .baseSpeed = 85,
+ .baseSpAttack = 30,
+ .baseSpDefense = 30,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_FLYING,
+ .catchRate = 200,
+ .expYield = 59,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_GUTS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SWELLOW] =
+ {
+ .baseHP = 60,
+ .baseAttack = 85,
+ .baseDefense = 60,
+ .baseSpeed = 125,
+ .baseSpAttack = 50,
+ .baseSpDefense = 50,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_FLYING,
+ .catchRate = 45,
+ .expYield = 162,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_GUTS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SHROOMISH] =
+ {
+ .baseHP = 60,
+ .baseAttack = 40,
+ .baseDefense = 60,
+ .baseSpeed = 35,
+ .baseSpAttack = 40,
+ .baseSpDefense = 60,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_GRASS,
+ .catchRate = 255,
+ .expYield = 65,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_FLUCTUATING,
+ .eggGroup1 = EGG_GROUP_FAIRY,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_EFFECT_SPORE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_BRELOOM] =
+ {
+ .baseHP = 60,
+ .baseAttack = 130,
+ .baseDefense = 80,
+ .baseSpeed = 70,
+ .baseSpAttack = 60,
+ .baseSpDefense = 60,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_FIGHTING,
+ .catchRate = 90,
+ .expYield = 165,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_FLUCTUATING,
+ .eggGroup1 = EGG_GROUP_FAIRY,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_EFFECT_SPORE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SPINDA] =
+ {
+ .baseHP = 60,
+ .baseAttack = 60,
+ .baseDefense = 60,
+ .baseSpeed = 60,
+ .baseSpAttack = 60,
+ .baseSpDefense = 60,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 255,
+ .expYield = 85,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_CHESTO_BERRY,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_OWN_TEMPO, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = TRUE,
+ },
+ [SPECIES_WINGULL] =
+ {
+ .baseHP = 40,
+ .baseAttack = 30,
+ .baseDefense = 30,
+ .baseSpeed = 85,
+ .baseSpAttack = 55,
+ .baseSpDefense = 30,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_FLYING,
+ .catchRate = 190,
+ .expYield = 64,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_KEEN_EYE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PELIPPER] =
+ {
+ .baseHP = 60,
+ .baseAttack = 50,
+ .baseDefense = 100,
+ .baseSpeed = 65,
+ .baseSpAttack = 85,
+ .baseSpDefense = 70,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_FLYING,
+ .catchRate = 45,
+ .expYield = 164,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_FLYING,
+ .abilities = { ABILITY_KEEN_EYE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SURSKIT] =
+ {
+ .baseHP = 40,
+ .baseAttack = 30,
+ .baseDefense = 32,
+ .baseSpeed = 65,
+ .baseSpAttack = 50,
+ .baseSpDefense = 52,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_WATER,
+ .catchRate = 200,
+ .expYield = 63,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MASQUERAIN] =
+ {
+ .baseHP = 70,
+ .baseAttack = 60,
+ .baseDefense = 62,
+ .baseSpeed = 60,
+ .baseSpAttack = 80,
+ .baseSpDefense = 82,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_FLYING,
+ .catchRate = 75,
+ .expYield = 128,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SILVER_POWDER,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_INTIMIDATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_WAILMER] =
+ {
+ .baseHP = 130,
+ .baseAttack = 70,
+ .baseDefense = 35,
+ .baseSpeed = 60,
+ .baseSpAttack = 70,
+ .baseSpDefense = 35,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 125,
+ .expYield = 137,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 40,
+ .friendship = 70,
+ .growthRate = GROWTH_FLUCTUATING,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_WATER_2,
+ .abilities = { ABILITY_WATER_VEIL, ABILITY_OBLIVIOUS },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_WAILORD] =
+ {
+ .baseHP = 170,
+ .baseAttack = 90,
+ .baseDefense = 45,
+ .baseSpeed = 60,
+ .baseSpAttack = 90,
+ .baseSpDefense = 45,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 60,
+ .expYield = 206,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 40,
+ .friendship = 70,
+ .growthRate = GROWTH_FLUCTUATING,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_WATER_2,
+ .abilities = { ABILITY_WATER_VEIL, ABILITY_OBLIVIOUS },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SKITTY] =
+ {
+ .baseHP = 50,
+ .baseAttack = 45,
+ .baseDefense = 45,
+ .baseSpeed = 50,
+ .baseSpAttack = 35,
+ .baseSpDefense = 35,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 255,
+ .expYield = 65,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_LEPPA_BERRY,
+ .genderRatio = PERCENT_FEMALE(75),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_CUTE_CHARM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DELCATTY] =
+ {
+ .baseHP = 70,
+ .baseAttack = 65,
+ .baseDefense = 65,
+ .baseSpeed = 70,
+ .baseSpAttack = 55,
+ .baseSpDefense = 55,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 60,
+ .expYield = 138,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_LEPPA_BERRY,
+ .genderRatio = PERCENT_FEMALE(75),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_CUTE_CHARM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_KECLEON] =
+ {
+ .baseHP = 60,
+ .baseAttack = 90,
+ .baseDefense = 70,
+ .baseSpeed = 40,
+ .baseSpAttack = 60,
+ .baseSpDefense = 120,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 200,
+ .expYield = 132,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_PERSIM_BERRY,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_COLOR_CHANGE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_BALTOY] =
+ {
+ .baseHP = 40,
+ .baseAttack = 40,
+ .baseDefense = 55,
+ .baseSpeed = 55,
+ .baseSpAttack = 40,
+ .baseSpDefense = 70,
+ .type1 = TYPE_GROUND,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 255,
+ .expYield = 58,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_LEVITATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CLAYDOL] =
+ {
+ .baseHP = 60,
+ .baseAttack = 70,
+ .baseDefense = 105,
+ .baseSpeed = 75,
+ .baseSpAttack = 70,
+ .baseSpDefense = 120,
+ .type1 = TYPE_GROUND,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 90,
+ .expYield = 189,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_LEVITATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLACK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_NOSEPASS] =
+ {
+ .baseHP = 30,
+ .baseAttack = 45,
+ .baseDefense = 135,
+ .baseSpeed = 30,
+ .baseSpAttack = 45,
+ .baseSpDefense = 90,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_ROCK,
+ .catchRate = 255,
+ .expYield = 108,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_STURDY, ABILITY_MAGNET_PULL },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_TORKOAL] =
+ {
+ .baseHP = 70,
+ .baseAttack = 85,
+ .baseDefense = 140,
+ .baseSpeed = 20,
+ .baseSpAttack = 85,
+ .baseSpDefense = 70,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_FIRE,
+ .catchRate = 90,
+ .expYield = 161,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_WHITE_SMOKE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SABLEYE] =
+ {
+ .baseHP = 50,
+ .baseAttack = 75,
+ .baseDefense = 75,
+ .baseSpeed = 50,
+ .baseSpAttack = 65,
+ .baseSpDefense = 65,
+ .type1 = TYPE_DARK,
+ .type2 = TYPE_GHOST,
+ .catchRate = 45,
+ .expYield = 98,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 35,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_KEEN_EYE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_BARBOACH] =
+ {
+ .baseHP = 50,
+ .baseAttack = 48,
+ .baseDefense = 43,
+ .baseSpeed = 60,
+ .baseSpAttack = 46,
+ .baseSpDefense = 41,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_GROUND,
+ .catchRate = 190,
+ .expYield = 92,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_2,
+ .eggGroup2 = EGG_GROUP_WATER_2,
+ .abilities = { ABILITY_OBLIVIOUS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_WHISCASH] =
+ {
+ .baseHP = 110,
+ .baseAttack = 78,
+ .baseDefense = 73,
+ .baseSpeed = 60,
+ .baseSpAttack = 76,
+ .baseSpDefense = 71,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_GROUND,
+ .catchRate = 75,
+ .expYield = 158,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_2,
+ .eggGroup2 = EGG_GROUP_WATER_2,
+ .abilities = { ABILITY_OBLIVIOUS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LUVDISC] =
+ {
+ .baseHP = 43,
+ .baseAttack = 30,
+ .baseDefense = 55,
+ .baseSpeed = 97,
+ .baseSpAttack = 40,
+ .baseSpDefense = 65,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 225,
+ .expYield = 110,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_HEART_SCALE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(75),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_WATER_2,
+ .eggGroup2 = EGG_GROUP_WATER_2,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CORPHISH] =
+ {
+ .baseHP = 43,
+ .baseAttack = 80,
+ .baseDefense = 65,
+ .baseSpeed = 35,
+ .baseSpAttack = 50,
+ .baseSpDefense = 35,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 205,
+ .expYield = 111,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_FLUCTUATING,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_HYPER_CUTTER, ABILITY_SHELL_ARMOR },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CRAWDAUNT] =
+ {
+ .baseHP = 63,
+ .baseAttack = 120,
+ .baseDefense = 85,
+ .baseSpeed = 55,
+ .baseSpAttack = 90,
+ .baseSpDefense = 55,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_DARK,
+ .catchRate = 155,
+ .expYield = 161,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_FLUCTUATING,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_HYPER_CUTTER, ABILITY_SHELL_ARMOR },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_FEEBAS] =
+ {
+ .baseHP = 20,
+ .baseAttack = 15,
+ .baseDefense = 20,
+ .baseSpeed = 80,
+ .baseSpAttack = 10,
+ .baseSpDefense = 55,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 255,
+ .expYield = 61,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_ERRATIC,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MILOTIC] =
+ {
+ .baseHP = 95,
+ .baseAttack = 60,
+ .baseDefense = 79,
+ .baseSpeed = 81,
+ .baseSpAttack = 100,
+ .baseSpDefense = 125,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 60,
+ .expYield = 213,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_ERRATIC,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_MARVEL_SCALE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CARVANHA] =
+ {
+ .baseHP = 45,
+ .baseAttack = 90,
+ .baseDefense = 20,
+ .baseSpeed = 65,
+ .baseSpAttack = 65,
+ .baseSpDefense = 20,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_DARK,
+ .catchRate = 225,
+ .expYield = 88,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_2,
+ .eggGroup2 = EGG_GROUP_WATER_2,
+ .abilities = { ABILITY_ROUGH_SKIN, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SHARPEDO] =
+ {
+ .baseHP = 70,
+ .baseAttack = 120,
+ .baseDefense = 40,
+ .baseSpeed = 95,
+ .baseSpAttack = 95,
+ .baseSpDefense = 40,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_DARK,
+ .catchRate = 60,
+ .expYield = 175,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_2,
+ .eggGroup2 = EGG_GROUP_WATER_2,
+ .abilities = { ABILITY_ROUGH_SKIN, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_TRAPINCH] =
+ {
+ .baseHP = 45,
+ .baseAttack = 100,
+ .baseDefense = 45,
+ .baseSpeed = 10,
+ .baseSpAttack = 45,
+ .baseSpDefense = 45,
+ .type1 = TYPE_GROUND,
+ .type2 = TYPE_GROUND,
+ .catchRate = 255,
+ .expYield = 73,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SOFT_SAND,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_HYPER_CUTTER, ABILITY_ARENA_TRAP },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_VIBRAVA] =
+ {
+ .baseHP = 50,
+ .baseAttack = 70,
+ .baseDefense = 50,
+ .baseSpeed = 70,
+ .baseSpAttack = 50,
+ .baseSpDefense = 50,
+ .type1 = TYPE_GROUND,
+ .type2 = TYPE_DRAGON,
+ .catchRate = 120,
+ .expYield = 126,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_LEVITATE, ABILITY_LEVITATE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_FLYGON] =
+ {
+ .baseHP = 80,
+ .baseAttack = 100,
+ .baseDefense = 80,
+ .baseSpeed = 100,
+ .baseSpAttack = 80,
+ .baseSpDefense = 80,
+ .type1 = TYPE_GROUND,
+ .type2 = TYPE_DRAGON,
+ .catchRate = 45,
+ .expYield = 197,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_BUG,
+ .abilities = { ABILITY_LEVITATE, ABILITY_LEVITATE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MAKUHITA] =
+ {
+ .baseHP = 72,
+ .baseAttack = 60,
+ .baseDefense = 30,
+ .baseSpeed = 25,
+ .baseSpAttack = 20,
+ .baseSpDefense = 30,
+ .type1 = TYPE_FIGHTING,
+ .type2 = TYPE_FIGHTING,
+ .catchRate = 180,
+ .expYield = 87,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(25),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_FLUCTUATING,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_THICK_FAT, ABILITY_GUTS },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_HARIYAMA] =
+ {
+ .baseHP = 144,
+ .baseAttack = 120,
+ .baseDefense = 60,
+ .baseSpeed = 50,
+ .baseSpAttack = 40,
+ .baseSpDefense = 60,
+ .type1 = TYPE_FIGHTING,
+ .type2 = TYPE_FIGHTING,
+ .catchRate = 200,
+ .expYield = 184,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_KINGS_ROCK,
+ .genderRatio = PERCENT_FEMALE(25),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_FLUCTUATING,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_THICK_FAT, ABILITY_GUTS },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ELECTRIKE] =
+ {
+ .baseHP = 40,
+ .baseAttack = 45,
+ .baseDefense = 40,
+ .baseSpeed = 65,
+ .baseSpAttack = 65,
+ .baseSpDefense = 40,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 120,
+ .expYield = 104,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_STATIC, ABILITY_LIGHTNING_ROD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MANECTRIC] =
+ {
+ .baseHP = 70,
+ .baseAttack = 75,
+ .baseDefense = 60,
+ .baseSpeed = 105,
+ .baseSpAttack = 105,
+ .baseSpDefense = 60,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 45,
+ .expYield = 168,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_STATIC, ABILITY_LIGHTNING_ROD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_NUMEL] =
+ {
+ .baseHP = 60,
+ .baseAttack = 60,
+ .baseDefense = 40,
+ .baseSpeed = 35,
+ .baseSpAttack = 65,
+ .baseSpDefense = 45,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_GROUND,
+ .catchRate = 255,
+ .expYield = 88,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_RAWST_BERRY,
+ .item2 = ITEM_RAWST_BERRY,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_OBLIVIOUS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CAMERUPT] =
+ {
+ .baseHP = 70,
+ .baseAttack = 100,
+ .baseDefense = 70,
+ .baseSpeed = 40,
+ .baseSpAttack = 105,
+ .baseSpDefense = 75,
+ .type1 = TYPE_FIRE,
+ .type2 = TYPE_GROUND,
+ .catchRate = 150,
+ .expYield = 175,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_RAWST_BERRY,
+ .item2 = ITEM_RAWST_BERRY,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_MAGMA_ARMOR, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SPHEAL] =
+ {
+ .baseHP = 70,
+ .baseAttack = 40,
+ .baseDefense = 50,
+ .baseSpeed = 25,
+ .baseSpAttack = 55,
+ .baseSpDefense = 50,
+ .type1 = TYPE_ICE,
+ .type2 = TYPE_WATER,
+ .catchRate = 255,
+ .expYield = 75,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_THICK_FAT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SEALEO] =
+ {
+ .baseHP = 90,
+ .baseAttack = 60,
+ .baseDefense = 70,
+ .baseSpeed = 45,
+ .baseSpAttack = 75,
+ .baseSpDefense = 70,
+ .type1 = TYPE_ICE,
+ .type2 = TYPE_WATER,
+ .catchRate = 120,
+ .expYield = 128,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_THICK_FAT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_WALREIN] =
+ {
+ .baseHP = 110,
+ .baseAttack = 80,
+ .baseDefense = 90,
+ .baseSpeed = 65,
+ .baseSpAttack = 95,
+ .baseSpDefense = 90,
+ .type1 = TYPE_ICE,
+ .type2 = TYPE_WATER,
+ .catchRate = 45,
+ .expYield = 192,
+ .evYield_HP = 3,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_THICK_FAT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CACNEA] =
+ {
+ .baseHP = 50,
+ .baseAttack = 85,
+ .baseDefense = 40,
+ .baseSpeed = 35,
+ .baseSpAttack = 85,
+ .baseSpDefense = 40,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_GRASS,
+ .catchRate = 190,
+ .expYield = 97,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_POISON_BARB,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 35,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_GRASS,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_SAND_VEIL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CACTURNE] =
+ {
+ .baseHP = 70,
+ .baseAttack = 115,
+ .baseDefense = 60,
+ .baseSpeed = 55,
+ .baseSpAttack = 115,
+ .baseSpDefense = 60,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_DARK,
+ .catchRate = 60,
+ .expYield = 177,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_POISON_BARB,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 35,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_GRASS,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_SAND_VEIL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SNORUNT] =
+ {
+ .baseHP = 50,
+ .baseAttack = 50,
+ .baseDefense = 50,
+ .baseSpeed = 50,
+ .baseSpAttack = 50,
+ .baseSpDefense = 50,
+ .type1 = TYPE_ICE,
+ .type2 = TYPE_ICE,
+ .catchRate = 190,
+ .expYield = 74,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FAIRY,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_INNER_FOCUS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GLALIE] =
+ {
+ .baseHP = 80,
+ .baseAttack = 80,
+ .baseDefense = 80,
+ .baseSpeed = 80,
+ .baseSpAttack = 80,
+ .baseSpDefense = 80,
+ .type1 = TYPE_ICE,
+ .type2 = TYPE_ICE,
+ .catchRate = 75,
+ .expYield = 187,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NEVER_MELT_ICE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FAIRY,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_INNER_FOCUS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LUNATONE] =
+ {
+ .baseHP = 70,
+ .baseAttack = 55,
+ .baseDefense = 65,
+ .baseSpeed = 70,
+ .baseSpAttack = 95,
+ .baseSpDefense = 85,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 45,
+ .expYield = 150,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_MOON_STONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_LEVITATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SOLROCK] =
+ {
+ .baseHP = 70,
+ .baseAttack = 95,
+ .baseDefense = 85,
+ .baseSpeed = 70,
+ .baseSpAttack = 55,
+ .baseSpDefense = 65,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 45,
+ .expYield = 150,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SUN_STONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_LEVITATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_AZURILL] =
+ {
+ .baseHP = 50,
+ .baseAttack = 20,
+ .baseDefense = 40,
+ .baseSpeed = 20,
+ .baseSpAttack = 20,
+ .baseSpDefense = 40,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 150,
+ .expYield = 33,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(75),
+ .eggCycles = 10,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_THICK_FAT, ABILITY_HUGE_POWER },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SPOINK] =
+ {
+ .baseHP = 60,
+ .baseAttack = 25,
+ .baseDefense = 35,
+ .baseSpeed = 60,
+ .baseSpAttack = 70,
+ .baseSpDefense = 80,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 255,
+ .expYield = 89,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_THICK_FAT, ABILITY_OWN_TEMPO },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLACK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GRUMPIG] =
+ {
+ .baseHP = 80,
+ .baseAttack = 45,
+ .baseDefense = 65,
+ .baseSpeed = 80,
+ .baseSpAttack = 90,
+ .baseSpDefense = 110,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 60,
+ .expYield = 164,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_THICK_FAT, ABILITY_OWN_TEMPO },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_PLUSLE] =
+ {
+ .baseHP = 60,
+ .baseAttack = 50,
+ .baseDefense = 40,
+ .baseSpeed = 95,
+ .baseSpAttack = 85,
+ .baseSpDefense = 75,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 200,
+ .expYield = 120,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FAIRY,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_PLUS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MINUN] =
+ {
+ .baseHP = 60,
+ .baseAttack = 40,
+ .baseDefense = 50,
+ .baseSpeed = 95,
+ .baseSpAttack = 75,
+ .baseSpDefense = 85,
+ .type1 = TYPE_ELECTRIC,
+ .type2 = TYPE_ELECTRIC,
+ .catchRate = 200,
+ .expYield = 120,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FAIRY,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_MINUS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MAWILE] =
+ {
+ .baseHP = 50,
+ .baseAttack = 85,
+ .baseDefense = 85,
+ .baseSpeed = 50,
+ .baseSpAttack = 55,
+ .baseSpDefense = 55,
+ .type1 = TYPE_STEEL,
+ .type2 = TYPE_STEEL,
+ .catchRate = 45,
+ .expYield = 98,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FAIRY,
+ .abilities = { ABILITY_HYPER_CUTTER, ABILITY_INTIMIDATE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLACK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MEDITITE] =
+ {
+ .baseHP = 30,
+ .baseAttack = 40,
+ .baseDefense = 55,
+ .baseSpeed = 60,
+ .baseSpAttack = 40,
+ .baseSpDefense = 55,
+ .type1 = TYPE_FIGHTING,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 180,
+ .expYield = 91,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_PURE_POWER, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_MEDICHAM] =
+ {
+ .baseHP = 60,
+ .baseAttack = 60,
+ .baseDefense = 75,
+ .baseSpeed = 80,
+ .baseSpAttack = 60,
+ .baseSpDefense = 75,
+ .type1 = TYPE_FIGHTING,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 90,
+ .expYield = 153,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_HUMAN_LIKE,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_PURE_POWER, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SWABLU] =
+ {
+ .baseHP = 45,
+ .baseAttack = 40,
+ .baseDefense = 60,
+ .baseSpeed = 50,
+ .baseSpAttack = 40,
+ .baseSpDefense = 75,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_FLYING,
+ .catchRate = 255,
+ .expYield = 74,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_ERRATIC,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_NATURAL_CURE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ALTARIA] =
+ {
+ .baseHP = 75,
+ .baseAttack = 70,
+ .baseDefense = 90,
+ .baseSpeed = 80,
+ .baseSpAttack = 70,
+ .baseSpDefense = 105,
+ .type1 = TYPE_DRAGON,
+ .type2 = TYPE_FLYING,
+ .catchRate = 45,
+ .expYield = 188,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_ERRATIC,
+ .eggGroup1 = EGG_GROUP_FLYING,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_NATURAL_CURE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_WYNAUT] =
+ {
+ .baseHP = 95,
+ .baseAttack = 23,
+ .baseDefense = 48,
+ .baseSpeed = 23,
+ .baseSpAttack = 23,
+ .baseSpDefense = 48,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 125,
+ .expYield = 44,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_SHADOW_TAG, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DUSKULL] =
+ {
+ .baseHP = 20,
+ .baseAttack = 40,
+ .baseDefense = 90,
+ .baseSpeed = 25,
+ .baseSpAttack = 30,
+ .baseSpDefense = 90,
+ .type1 = TYPE_GHOST,
+ .type2 = TYPE_GHOST,
+ .catchRate = 190,
+ .expYield = 97,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SPELL_TAG,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 35,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_LEVITATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLACK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DUSCLOPS] =
+ {
+ .baseHP = 40,
+ .baseAttack = 70,
+ .baseDefense = 130,
+ .baseSpeed = 25,
+ .baseSpAttack = 60,
+ .baseSpDefense = 130,
+ .type1 = TYPE_GHOST,
+ .type2 = TYPE_GHOST,
+ .catchRate = 90,
+ .expYield = 179,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SPELL_TAG,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 35,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_PRESSURE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLACK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ROSELIA] =
+ {
+ .baseHP = 50,
+ .baseAttack = 60,
+ .baseDefense = 45,
+ .baseSpeed = 65,
+ .baseSpAttack = 100,
+ .baseSpDefense = 80,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_POISON,
+ .catchRate = 150,
+ .expYield = 152,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_POISON_BARB,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FAIRY,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_NATURAL_CURE, ABILITY_POISON_POINT },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = TRUE,
+ },
+ [SPECIES_SLAKOTH] =
+ {
+ .baseHP = 60,
+ .baseAttack = 60,
+ .baseDefense = 60,
+ .baseSpeed = 30,
+ .baseSpAttack = 35,
+ .baseSpDefense = 35,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 255,
+ .expYield = 83,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_TRUANT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_VIGOROTH] =
+ {
+ .baseHP = 80,
+ .baseAttack = 80,
+ .baseDefense = 80,
+ .baseSpeed = 90,
+ .baseSpAttack = 55,
+ .baseSpDefense = 55,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 120,
+ .expYield = 126,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 2,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_VITAL_SPIRIT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SLAKING] =
+ {
+ .baseHP = 150,
+ .baseAttack = 160,
+ .baseDefense = 100,
+ .baseSpeed = 100,
+ .baseSpAttack = 95,
+ .baseSpDefense = 65,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 45,
+ .expYield = 210,
+ .evYield_HP = 3,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_TRUANT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GULPIN] =
+ {
+ .baseHP = 70,
+ .baseAttack = 43,
+ .baseDefense = 53,
+ .baseSpeed = 40,
+ .baseSpAttack = 43,
+ .baseSpDefense = 53,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_POISON,
+ .catchRate = 225,
+ .expYield = 75,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_BIG_PEARL,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_FLUCTUATING,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_LIQUID_OOZE, ABILITY_STICKY_HOLD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SWALOT] =
+ {
+ .baseHP = 100,
+ .baseAttack = 73,
+ .baseDefense = 83,
+ .baseSpeed = 55,
+ .baseSpAttack = 73,
+ .baseSpDefense = 83,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_POISON,
+ .catchRate = 75,
+ .expYield = 168,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_BIG_PEARL,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_FLUCTUATING,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_LIQUID_OOZE, ABILITY_STICKY_HOLD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_TROPIUS] =
+ {
+ .baseHP = 99,
+ .baseAttack = 68,
+ .baseDefense = 83,
+ .baseSpeed = 51,
+ .baseSpAttack = 72,
+ .baseSpDefense = 87,
+ .type1 = TYPE_GRASS,
+ .type2 = TYPE_FLYING,
+ .catchRate = 200,
+ .expYield = 169,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_GRASS,
+ .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_WHISMUR] =
+ {
+ .baseHP = 64,
+ .baseAttack = 51,
+ .baseDefense = 23,
+ .baseSpeed = 28,
+ .baseSpAttack = 51,
+ .baseSpDefense = 23,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 190,
+ .expYield = 68,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_CHESTO_BERRY,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_SOUNDPROOF, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LOUDRED] =
+ {
+ .baseHP = 84,
+ .baseAttack = 71,
+ .baseDefense = 43,
+ .baseSpeed = 48,
+ .baseSpAttack = 71,
+ .baseSpDefense = 43,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 120,
+ .expYield = 126,
+ .evYield_HP = 2,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_CHESTO_BERRY,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_SOUNDPROOF, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_EXPLOUD] =
+ {
+ .baseHP = 104,
+ .baseAttack = 91,
+ .baseDefense = 63,
+ .baseSpeed = 68,
+ .baseSpAttack = 91,
+ .baseSpDefense = 63,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 45,
+ .expYield = 184,
+ .evYield_HP = 3,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_CHESTO_BERRY,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_SOUNDPROOF, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CLAMPERL] =
+ {
+ .baseHP = 35,
+ .baseAttack = 64,
+ .baseDefense = 85,
+ .baseSpeed = 32,
+ .baseSpAttack = 74,
+ .baseSpDefense = 55,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 255,
+ .expYield = 142,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_BLUE_SHARD,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_ERRATIC,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_SHELL_ARMOR, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_HUNTAIL] =
+ {
+ .baseHP = 55,
+ .baseAttack = 104,
+ .baseDefense = 105,
+ .baseSpeed = 52,
+ .baseSpAttack = 94,
+ .baseSpDefense = 75,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 60,
+ .expYield = 178,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_ERRATIC,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GOREBYSS] =
+ {
+ .baseHP = 55,
+ .baseAttack = 84,
+ .baseDefense = 105,
+ .baseSpeed = 52,
+ .baseSpAttack = 114,
+ .baseSpDefense = 75,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 60,
+ .expYield = 178,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_ERRATIC,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_1,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PINK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ABSOL] =
+ {
+ .baseHP = 65,
+ .baseAttack = 130,
+ .baseDefense = 60,
+ .baseSpeed = 75,
+ .baseSpAttack = 75,
+ .baseSpDefense = 60,
+ .type1 = TYPE_DARK,
+ .type2 = TYPE_DARK,
+ .catchRate = 30,
+ .expYield = 174,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 35,
+ .growthRate = GROWTH_MEDIUM_SLOW,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_PRESSURE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = TRUE,
+ },
+ [SPECIES_SHUPPET] =
+ {
+ .baseHP = 44,
+ .baseAttack = 75,
+ .baseDefense = 35,
+ .baseSpeed = 45,
+ .baseSpAttack = 63,
+ .baseSpDefense = 33,
+ .type1 = TYPE_GHOST,
+ .type2 = TYPE_GHOST,
+ .catchRate = 225,
+ .expYield = 97,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SPELL_TAG,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 35,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_INSOMNIA, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLACK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_BANETTE] =
+ {
+ .baseHP = 64,
+ .baseAttack = 115,
+ .baseDefense = 65,
+ .baseSpeed = 65,
+ .baseSpAttack = 83,
+ .baseSpDefense = 63,
+ .type1 = TYPE_GHOST,
+ .type2 = TYPE_GHOST,
+ .catchRate = 45,
+ .expYield = 179,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_SPELL_TAG,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 35,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_INSOMNIA, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLACK,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SEVIPER] =
+ {
+ .baseHP = 73,
+ .baseAttack = 100,
+ .baseDefense = 60,
+ .baseSpeed = 65,
+ .baseSpAttack = 100,
+ .baseSpDefense = 60,
+ .type1 = TYPE_POISON,
+ .type2 = TYPE_POISON,
+ .catchRate = 90,
+ .expYield = 165,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_FLUCTUATING,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_SHED_SKIN, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLACK,
+ .noFlip = TRUE,
+ },
+ [SPECIES_ZANGOOSE] =
+ {
+ .baseHP = 73,
+ .baseAttack = 115,
+ .baseDefense = 60,
+ .baseSpeed = 90,
+ .baseSpAttack = 60,
+ .baseSpDefense = 60,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 90,
+ .expYield = 165,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 70,
+ .growthRate = GROWTH_ERRATIC,
+ .eggGroup1 = EGG_GROUP_FIELD,
+ .eggGroup2 = EGG_GROUP_FIELD,
+ .abilities = { ABILITY_IMMUNITY, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = TRUE,
+ },
+ [SPECIES_RELICANTH] =
+ {
+ .baseHP = 100,
+ .baseAttack = 90,
+ .baseDefense = 130,
+ .baseSpeed = 55,
+ .baseSpAttack = 45,
+ .baseSpDefense = 65,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_ROCK,
+ .catchRate = 25,
+ .expYield = 198,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_GREEN_SHARD,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 40,
+ .friendship = 70,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_WATER_1,
+ .eggGroup2 = EGG_GROUP_WATER_2,
+ .abilities = { ABILITY_SWIFT_SWIM, ABILITY_ROCK_HEAD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ARON] =
+ {
+ .baseHP = 50,
+ .baseAttack = 70,
+ .baseDefense = 100,
+ .baseSpeed = 30,
+ .baseSpAttack = 40,
+ .baseSpDefense = 40,
+ .type1 = TYPE_STEEL,
+ .type2 = TYPE_ROCK,
+ .catchRate = 180,
+ .expYield = 96,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_HARD_STONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 35,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_MONSTER,
+ .abilities = { ABILITY_STURDY, ABILITY_ROCK_HEAD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LAIRON] =
+ {
+ .baseHP = 60,
+ .baseAttack = 90,
+ .baseDefense = 140,
+ .baseSpeed = 40,
+ .baseSpAttack = 50,
+ .baseSpDefense = 50,
+ .type1 = TYPE_STEEL,
+ .type2 = TYPE_ROCK,
+ .catchRate = 90,
+ .expYield = 152,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_HARD_STONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 35,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_MONSTER,
+ .abilities = { ABILITY_STURDY, ABILITY_ROCK_HEAD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_AGGRON] =
+ {
+ .baseHP = 70,
+ .baseAttack = 110,
+ .baseDefense = 180,
+ .baseSpeed = 50,
+ .baseSpAttack = 60,
+ .baseSpDefense = 60,
+ .type1 = TYPE_STEEL,
+ .type2 = TYPE_ROCK,
+ .catchRate = 45,
+ .expYield = 205,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 3,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_HARD_STONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 35,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_MONSTER,
+ .eggGroup2 = EGG_GROUP_MONSTER,
+ .abilities = { ABILITY_STURDY, ABILITY_ROCK_HEAD },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CASTFORM] =
+ {
+ .baseHP = 70,
+ .baseAttack = 70,
+ .baseDefense = 70,
+ .baseSpeed = 70,
+ .baseSpAttack = 70,
+ .baseSpDefense = 70,
+ .type1 = TYPE_NORMAL,
+ .type2 = TYPE_NORMAL,
+ .catchRate = 45,
+ .expYield = 145,
+ .evYield_HP = 1,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_MYSTIC_WATER,
+ .item2 = ITEM_MYSTIC_WATER,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_MEDIUM_FAST,
+ .eggGroup1 = EGG_GROUP_FAIRY,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_FORECAST, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_VOLBEAT] =
+ {
+ .baseHP = 65,
+ .baseAttack = 73,
+ .baseDefense = 55,
+ .baseSpeed = 85,
+ .baseSpAttack = 47,
+ .baseSpDefense = 75,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_BUG,
+ .catchRate = 150,
+ .expYield = 146,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_MALE,
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_ERRATIC,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_ILLUMINATE, ABILITY_SWARM },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ILLUMISE] =
+ {
+ .baseHP = 65,
+ .baseAttack = 47,
+ .baseDefense = 55,
+ .baseSpeed = 85,
+ .baseSpAttack = 73,
+ .baseSpDefense = 75,
+ .type1 = TYPE_BUG,
+ .type2 = TYPE_BUG,
+ .catchRate = 150,
+ .expYield = 146,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_FEMALE,
+ .eggCycles = 15,
+ .friendship = 70,
+ .growthRate = GROWTH_FLUCTUATING,
+ .eggGroup1 = EGG_GROUP_BUG,
+ .eggGroup2 = EGG_GROUP_HUMAN_LIKE,
+ .abilities = { ABILITY_OBLIVIOUS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LILEEP] =
+ {
+ .baseHP = 66,
+ .baseAttack = 41,
+ .baseDefense = 77,
+ .baseSpeed = 23,
+ .baseSpAttack = 61,
+ .baseSpDefense = 87,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_GRASS,
+ .catchRate = 45,
+ .expYield = 121,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 30,
+ .friendship = 70,
+ .growthRate = GROWTH_ERRATIC,
+ .eggGroup1 = EGG_GROUP_WATER_3,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_SUCTION_CUPS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_PURPLE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_CRADILY] =
+ {
+ .baseHP = 86,
+ .baseAttack = 81,
+ .baseDefense = 97,
+ .baseSpeed = 43,
+ .baseSpAttack = 81,
+ .baseSpDefense = 107,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_GRASS,
+ .catchRate = 45,
+ .expYield = 201,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 2,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 30,
+ .friendship = 70,
+ .growthRate = GROWTH_ERRATIC,
+ .eggGroup1 = EGG_GROUP_WATER_3,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_SUCTION_CUPS, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ANORITH] =
+ {
+ .baseHP = 45,
+ .baseAttack = 95,
+ .baseDefense = 50,
+ .baseSpeed = 75,
+ .baseSpAttack = 40,
+ .baseSpDefense = 50,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_BUG,
+ .catchRate = 45,
+ .expYield = 119,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 30,
+ .friendship = 70,
+ .growthRate = GROWTH_ERRATIC,
+ .eggGroup1 = EGG_GROUP_WATER_3,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_BATTLE_ARMOR, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_ARMALDO] =
+ {
+ .baseHP = 75,
+ .baseAttack = 125,
+ .baseDefense = 100,
+ .baseSpeed = 45,
+ .baseSpAttack = 70,
+ .baseSpDefense = 80,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_BUG,
+ .catchRate = 45,
+ .expYield = 200,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(12.5),
+ .eggCycles = 30,
+ .friendship = 70,
+ .growthRate = GROWTH_ERRATIC,
+ .eggGroup1 = EGG_GROUP_WATER_3,
+ .eggGroup2 = EGG_GROUP_WATER_3,
+ .abilities = { ABILITY_BATTLE_ARMOR, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_RALTS] =
+ {
+ .baseHP = 28,
+ .baseAttack = 25,
+ .baseDefense = 25,
+ .baseSpeed = 40,
+ .baseSpAttack = 45,
+ .baseSpDefense = 35,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 235,
+ .expYield = 70,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_SYNCHRONIZE, ABILITY_TRACE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_KIRLIA] =
+ {
+ .baseHP = 38,
+ .baseAttack = 35,
+ .baseDefense = 35,
+ .baseSpeed = 50,
+ .baseSpAttack = 65,
+ .baseSpDefense = 55,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 120,
+ .expYield = 140,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 2,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_SYNCHRONIZE, ABILITY_TRACE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GARDEVOIR] =
+ {
+ .baseHP = 68,
+ .baseAttack = 65,
+ .baseDefense = 65,
+ .baseSpeed = 80,
+ .baseSpAttack = 125,
+ .baseSpDefense = 115,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 45,
+ .expYield = 208,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 3,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 20,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_SYNCHRONIZE, ABILITY_TRACE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_BAGON] =
+ {
+ .baseHP = 45,
+ .baseAttack = 75,
+ .baseDefense = 60,
+ .baseSpeed = 50,
+ .baseSpAttack = 40,
+ .baseSpDefense = 30,
+ .type1 = TYPE_DRAGON,
+ .type2 = TYPE_DRAGON,
+ .catchRate = 45,
+ .expYield = 89,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_DRAGON_SCALE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 40,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_DRAGON,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_ROCK_HEAD, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SHELGON] =
+ {
+ .baseHP = 65,
+ .baseAttack = 95,
+ .baseDefense = 100,
+ .baseSpeed = 50,
+ .baseSpAttack = 60,
+ .baseSpDefense = 50,
+ .type1 = TYPE_DRAGON,
+ .type2 = TYPE_DRAGON,
+ .catchRate = 45,
+ .expYield = 144,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_DRAGON_SCALE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 40,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_DRAGON,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_ROCK_HEAD, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_WHITE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_SALAMENCE] =
+ {
+ .baseHP = 95,
+ .baseAttack = 135,
+ .baseDefense = 80,
+ .baseSpeed = 100,
+ .baseSpAttack = 110,
+ .baseSpDefense = 80,
+ .type1 = TYPE_DRAGON,
+ .type2 = TYPE_FLYING,
+ .catchRate = 45,
+ .expYield = 218,
+ .evYield_HP = 0,
+ .evYield_Attack = 3,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_DRAGON_SCALE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 40,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_DRAGON,
+ .eggGroup2 = EGG_GROUP_DRAGON,
+ .abilities = { ABILITY_INTIMIDATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_BELDUM] =
+ {
+ .baseHP = 40,
+ .baseAttack = 55,
+ .baseDefense = 80,
+ .baseSpeed = 30,
+ .baseSpAttack = 35,
+ .baseSpDefense = 60,
+ .type1 = TYPE_STEEL,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 3,
+ .expYield = 103,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 1,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_METAL_COAT,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 40,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_CLEAR_BODY, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_METANG] =
+ {
+ .baseHP = 60,
+ .baseAttack = 75,
+ .baseDefense = 100,
+ .baseSpeed = 50,
+ .baseSpAttack = 55,
+ .baseSpDefense = 80,
+ .type1 = TYPE_STEEL,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 3,
+ .expYield = 153,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_METAL_COAT,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 40,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_CLEAR_BODY, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_METAGROSS] =
+ {
+ .baseHP = 80,
+ .baseAttack = 135,
+ .baseDefense = 130,
+ .baseSpeed = 70,
+ .baseSpAttack = 95,
+ .baseSpDefense = 90,
+ .type1 = TYPE_STEEL,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 3,
+ .expYield = 210,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 3,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_METAL_COAT,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 40,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_MINERAL,
+ .eggGroup2 = EGG_GROUP_MINERAL,
+ .abilities = { ABILITY_CLEAR_BODY, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_REGIROCK] =
+ {
+ .baseHP = 80,
+ .baseAttack = 100,
+ .baseDefense = 200,
+ .baseSpeed = 50,
+ .baseSpAttack = 50,
+ .baseSpDefense = 100,
+ .type1 = TYPE_ROCK,
+ .type2 = TYPE_ROCK,
+ .catchRate = 3,
+ .expYield = 217,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 3,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 80,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_CLEAR_BODY, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BROWN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_REGICE] =
+ {
+ .baseHP = 80,
+ .baseAttack = 50,
+ .baseDefense = 100,
+ .baseSpeed = 50,
+ .baseSpAttack = 100,
+ .baseSpDefense = 200,
+ .type1 = TYPE_ICE,
+ .type2 = TYPE_ICE,
+ .catchRate = 3,
+ .expYield = 216,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 3,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 80,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_CLEAR_BODY, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_REGISTEEL] =
+ {
+ .baseHP = 80,
+ .baseAttack = 75,
+ .baseDefense = 150,
+ .baseSpeed = 50,
+ .baseSpAttack = 75,
+ .baseSpDefense = 150,
+ .type1 = TYPE_STEEL,
+ .type2 = TYPE_STEEL,
+ .catchRate = 3,
+ .expYield = 215,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 2,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 80,
+ .friendship = 35,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_CLEAR_BODY, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GRAY,
+ .noFlip = FALSE,
+ },
+ [SPECIES_KYOGRE] =
+ {
+ .baseHP = 100,
+ .baseAttack = 100,
+ .baseDefense = 90,
+ .baseSpeed = 90,
+ .baseSpAttack = 150,
+ .baseSpDefense = 140,
+ .type1 = TYPE_WATER,
+ .type2 = TYPE_WATER,
+ .catchRate = 5,
+ .expYield = 218,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 3,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 120,
+ .friendship = 0,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_DRIZZLE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_GROUDON] =
+ {
+ .baseHP = 100,
+ .baseAttack = 150,
+ .baseDefense = 140,
+ .baseSpeed = 90,
+ .baseSpAttack = 100,
+ .baseSpDefense = 90,
+ .type1 = TYPE_GROUND,
+ .type2 = TYPE_GROUND,
+ .catchRate = 5,
+ .expYield = 218,
+ .evYield_HP = 0,
+ .evYield_Attack = 3,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 120,
+ .friendship = 0,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_DROUGHT, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_RAYQUAZA] =
+ {
+ .baseHP = 105,
+ .baseAttack = 150,
+ .baseDefense = 90,
+ .baseSpeed = 95,
+ .baseSpAttack = 150,
+ .baseSpDefense = 90,
+ .type1 = TYPE_DRAGON,
+ .type2 = TYPE_FLYING,
+ .catchRate = 3,
+ .expYield = 220,
+ .evYield_HP = 0,
+ .evYield_Attack = 2,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 120,
+ .friendship = 0,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_AIR_LOCK, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_GREEN,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LATIAS] =
+ {
+ .baseHP = 80,
+ .baseAttack = 80,
+ .baseDefense = 90,
+ .baseSpeed = 110,
+ .baseSpAttack = 110,
+ .baseSpDefense = 130,
+ .type1 = TYPE_DRAGON,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 3,
+ .expYield = 211,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 3,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_FEMALE,
+ .eggCycles = 120,
+ .friendship = 90,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_LEVITATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = FALSE,
+ },
+ [SPECIES_LATIOS] =
+ {
+ .baseHP = 80,
+ .baseAttack = 90,
+ .baseDefense = 80,
+ .baseSpeed = 110,
+ .baseSpAttack = 130,
+ .baseSpDefense = 110,
+ .type1 = TYPE_DRAGON,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 3,
+ .expYield = 211,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 3,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_MALE,
+ .eggCycles = 120,
+ .friendship = 90,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_LEVITATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+ [SPECIES_JIRACHI] =
+ {
+ .baseHP = 100,
+ .baseAttack = 100,
+ .baseDefense = 100,
+ .baseSpeed = 100,
+ .baseSpAttack = 100,
+ .baseSpDefense = 100,
+ .type1 = TYPE_STEEL,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 3,
+ .expYield = 215,
+ .evYield_HP = 3,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 0,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_STAR_PIECE,
+ .item2 = ITEM_STAR_PIECE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 120,
+ .friendship = 100,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_SERENE_GRACE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_YELLOW,
+ .noFlip = FALSE,
+ },
+ [SPECIES_DEOXYS] =
+ {
+ .baseHP = 50,
+ .baseAttack = 150,
+ .baseDefense = 50,
+ .baseSpeed = 150,
+ .baseSpAttack = 150,
+ .baseSpDefense = 50,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 3,
+ .expYield = 215,
+ .evYield_HP = 0,
+ .evYield_Attack = 1,
+ .evYield_Defense = 0,
+ .evYield_Speed = 1,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 0,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = MON_GENDERLESS,
+ .eggCycles = 120,
+ .friendship = 0,
+ .growthRate = GROWTH_SLOW,
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,
+ .abilities = { ABILITY_PRESSURE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_RED,
+ .noFlip = TRUE,
+ },
+ [SPECIES_CHIMECHO] =
+ {
+ .baseHP = 65,
+ .baseAttack = 50,
+ .baseDefense = 70,
+ .baseSpeed = 65,
+ .baseSpAttack = 95,
+ .baseSpDefense = 80,
+ .type1 = TYPE_PSYCHIC,
+ .type2 = TYPE_PSYCHIC,
+ .catchRate = 45,
+ .expYield = 147,
+ .evYield_HP = 0,
+ .evYield_Attack = 0,
+ .evYield_Defense = 0,
+ .evYield_Speed = 0,
+ .evYield_SpAttack = 1,
+ .evYield_SpDefense = 1,
+ .item1 = ITEM_NONE,
+ .item2 = ITEM_NONE,
+ .genderRatio = PERCENT_FEMALE(50),
+ .eggCycles = 25,
+ .friendship = 70,
+ .growthRate = GROWTH_FAST,
+ .eggGroup1 = EGG_GROUP_AMORPHOUS,
+ .eggGroup2 = EGG_GROUP_AMORPHOUS,
+ .abilities = { ABILITY_LEVITATE, ABILITY_NONE },
+ .safariZoneFleeRate = 0,
+ .bodyColor = BODY_COLOR_BLUE,
+ .noFlip = FALSE,
+ },
+};
diff --git a/src/data/pokemon/cry_ids.h b/src/data/pokemon/cry_ids.h
new file mode 100644
index 000000000..2eef1eb88
--- /dev/null
+++ b/src/data/pokemon/cry_ids.h
@@ -0,0 +1,140 @@
+#define HOENN_MON_SPECIES_START 277
+
+static const u16 sHoennSpeciesIdToCryId[] =
+{
+ [SPECIES_TREECKO - HOENN_MON_SPECIES_START] = CRY_TREECKO,
+ [SPECIES_GROVYLE - HOENN_MON_SPECIES_START] = CRY_GROVYLE,
+ [SPECIES_SCEPTILE - HOENN_MON_SPECIES_START] = CRY_SCEPTILE,
+ [SPECIES_TORCHIC - HOENN_MON_SPECIES_START] = CRY_TORCHIC,
+ [SPECIES_COMBUSKEN - HOENN_MON_SPECIES_START] = CRY_COMBUSKEN,
+ [SPECIES_BLAZIKEN - HOENN_MON_SPECIES_START] = CRY_BLAZIKEN,
+ [SPECIES_MUDKIP - HOENN_MON_SPECIES_START] = CRY_MUDKIP,
+ [SPECIES_MARSHTOMP - HOENN_MON_SPECIES_START] = CRY_MARSHTOMP,
+ [SPECIES_SWAMPERT - HOENN_MON_SPECIES_START] = CRY_SWAMPERT,
+ [SPECIES_POOCHYENA - HOENN_MON_SPECIES_START] = CRY_POOCHYENA,
+ [SPECIES_MIGHTYENA - HOENN_MON_SPECIES_START] = CRY_MIGHTYENA,
+ [SPECIES_ZIGZAGOON - HOENN_MON_SPECIES_START] = CRY_ZIGZAGOON,
+ [SPECIES_LINOONE - HOENN_MON_SPECIES_START] = CRY_LINOONE,
+ [SPECIES_WURMPLE - HOENN_MON_SPECIES_START] = CRY_WURMPLE,
+ [SPECIES_SILCOON - HOENN_MON_SPECIES_START] = CRY_SILCOON,
+ [SPECIES_BEAUTIFLY - HOENN_MON_SPECIES_START] = CRY_BEAUTIFLY,
+ [SPECIES_CASCOON - HOENN_MON_SPECIES_START] = CRY_CASCOON,
+ [SPECIES_DUSTOX - HOENN_MON_SPECIES_START] = CRY_DUSTOX,
+ [SPECIES_LOTAD - HOENN_MON_SPECIES_START] = CRY_LOTAD,
+ [SPECIES_LOMBRE - HOENN_MON_SPECIES_START] = CRY_LOMBRE,
+ [SPECIES_LUDICOLO - HOENN_MON_SPECIES_START] = CRY_LUDICOLO,
+ [SPECIES_SEEDOT - HOENN_MON_SPECIES_START] = CRY_SEEDOT,
+ [SPECIES_NUZLEAF - HOENN_MON_SPECIES_START] = CRY_NUZLEAF,
+ [SPECIES_SHIFTRY - HOENN_MON_SPECIES_START] = CRY_SHIFTRY,
+ [SPECIES_NINCADA - HOENN_MON_SPECIES_START] = CRY_NINCADA,
+ [SPECIES_NINJASK - HOENN_MON_SPECIES_START] = CRY_NINJASK,
+ [SPECIES_SHEDINJA - HOENN_MON_SPECIES_START] = CRY_SHEDINJA,
+ [SPECIES_TAILLOW - HOENN_MON_SPECIES_START] = CRY_TAILLOW,
+ [SPECIES_SWELLOW - HOENN_MON_SPECIES_START] = CRY_SWELLOW,
+ [SPECIES_SHROOMISH - HOENN_MON_SPECIES_START] = CRY_SHROOMISH,
+ [SPECIES_BRELOOM - HOENN_MON_SPECIES_START] = CRY_BRELOOM,
+ [SPECIES_SPINDA - HOENN_MON_SPECIES_START] = CRY_SPINDA,
+ [SPECIES_WINGULL - HOENN_MON_SPECIES_START] = CRY_WINGULL,
+ [SPECIES_PELIPPER - HOENN_MON_SPECIES_START] = CRY_PELIPPER,
+ [SPECIES_SURSKIT - HOENN_MON_SPECIES_START] = CRY_SURSKIT,
+ [SPECIES_MASQUERAIN - HOENN_MON_SPECIES_START] = CRY_MASQUERAIN,
+ [SPECIES_WAILMER - HOENN_MON_SPECIES_START] = CRY_WAILMER,
+ [SPECIES_WAILORD - HOENN_MON_SPECIES_START] = CRY_WAILORD,
+ [SPECIES_SKITTY - HOENN_MON_SPECIES_START] = CRY_SKITTY,
+ [SPECIES_DELCATTY - HOENN_MON_SPECIES_START] = CRY_DELCATTY,
+ [SPECIES_KECLEON - HOENN_MON_SPECIES_START] = CRY_KECLEON,
+ [SPECIES_BALTOY - HOENN_MON_SPECIES_START] = CRY_BALTOY,
+ [SPECIES_CLAYDOL - HOENN_MON_SPECIES_START] = CRY_CLAYDOL,
+ [SPECIES_NOSEPASS - HOENN_MON_SPECIES_START] = CRY_NOSEPASS,
+ [SPECIES_TORKOAL - HOENN_MON_SPECIES_START] = CRY_TORKOAL,
+ [SPECIES_SABLEYE - HOENN_MON_SPECIES_START] = CRY_SABLEYE,
+ [SPECIES_BARBOACH - HOENN_MON_SPECIES_START] = CRY_BARBOACH,
+ [SPECIES_WHISCASH - HOENN_MON_SPECIES_START] = CRY_WHISCASH,
+ [SPECIES_LUVDISC - HOENN_MON_SPECIES_START] = CRY_LUVDISC,
+ [SPECIES_CORPHISH - HOENN_MON_SPECIES_START] = CRY_CORPHISH,
+ [SPECIES_CRAWDAUNT - HOENN_MON_SPECIES_START] = CRY_CRAWDAUNT,
+ [SPECIES_FEEBAS - HOENN_MON_SPECIES_START] = CRY_FEEBAS,
+ [SPECIES_MILOTIC - HOENN_MON_SPECIES_START] = CRY_MILOTIC,
+ [SPECIES_CARVANHA - HOENN_MON_SPECIES_START] = CRY_CARVANHA,
+ [SPECIES_SHARPEDO - HOENN_MON_SPECIES_START] = CRY_SHARPEDO,
+ [SPECIES_TRAPINCH - HOENN_MON_SPECIES_START] = CRY_TRAPINCH,
+ [SPECIES_VIBRAVA - HOENN_MON_SPECIES_START] = CRY_VIBRAVA,
+ [SPECIES_FLYGON - HOENN_MON_SPECIES_START] = CRY_FLYGON,
+ [SPECIES_MAKUHITA - HOENN_MON_SPECIES_START] = CRY_MAKUHITA,
+ [SPECIES_HARIYAMA - HOENN_MON_SPECIES_START] = CRY_HARIYAMA,
+ [SPECIES_ELECTRIKE - HOENN_MON_SPECIES_START] = CRY_ELECTRIKE,
+ [SPECIES_MANECTRIC - HOENN_MON_SPECIES_START] = CRY_MANECTRIC,
+ [SPECIES_NUMEL - HOENN_MON_SPECIES_START] = CRY_NUMEL,
+ [SPECIES_CAMERUPT - HOENN_MON_SPECIES_START] = CRY_CAMERUPT,
+ [SPECIES_SPHEAL - HOENN_MON_SPECIES_START] = CRY_SPHEAL,
+ [SPECIES_SEALEO - HOENN_MON_SPECIES_START] = CRY_SEALEO,
+ [SPECIES_WALREIN - HOENN_MON_SPECIES_START] = CRY_WALREIN,
+ [SPECIES_CACNEA - HOENN_MON_SPECIES_START] = CRY_CACNEA,
+ [SPECIES_CACTURNE - HOENN_MON_SPECIES_START] = CRY_CACTURNE,
+ [SPECIES_SNORUNT - HOENN_MON_SPECIES_START] = CRY_SNORUNT,
+ [SPECIES_GLALIE - HOENN_MON_SPECIES_START] = CRY_GLALIE,
+ [SPECIES_LUNATONE - HOENN_MON_SPECIES_START] = CRY_LUNATONE,
+ [SPECIES_SOLROCK - HOENN_MON_SPECIES_START] = CRY_SOLROCK,
+ [SPECIES_AZURILL - HOENN_MON_SPECIES_START] = CRY_AZURILL,
+ [SPECIES_SPOINK - HOENN_MON_SPECIES_START] = CRY_SPOINK,
+ [SPECIES_GRUMPIG - HOENN_MON_SPECIES_START] = CRY_GRUMPIG,
+ [SPECIES_PLUSLE - HOENN_MON_SPECIES_START] = CRY_PLUSLE,
+ [SPECIES_MINUN - HOENN_MON_SPECIES_START] = CRY_MINUN,
+ [SPECIES_MAWILE - HOENN_MON_SPECIES_START] = CRY_MAWILE,
+ [SPECIES_MEDITITE - HOENN_MON_SPECIES_START] = CRY_MEDITITE,
+ [SPECIES_MEDICHAM - HOENN_MON_SPECIES_START] = CRY_MEDICHAM,
+ [SPECIES_SWABLU - HOENN_MON_SPECIES_START] = CRY_SWABLU,
+ [SPECIES_ALTARIA - HOENN_MON_SPECIES_START] = CRY_ALTARIA,
+ [SPECIES_WYNAUT - HOENN_MON_SPECIES_START] = CRY_WYNAUT,
+ [SPECIES_DUSKULL - HOENN_MON_SPECIES_START] = CRY_DUSKULL,
+ [SPECIES_DUSCLOPS - HOENN_MON_SPECIES_START] = CRY_DUSCLOPS,
+ [SPECIES_ROSELIA - HOENN_MON_SPECIES_START] = CRY_ROSELIA,
+ [SPECIES_SLAKOTH - HOENN_MON_SPECIES_START] = CRY_SLAKOTH,
+ [SPECIES_VIGOROTH - HOENN_MON_SPECIES_START] = CRY_VIGOROTH,
+ [SPECIES_SLAKING - HOENN_MON_SPECIES_START] = CRY_SLAKING,
+ [SPECIES_GULPIN - HOENN_MON_SPECIES_START] = CRY_GULPIN,
+ [SPECIES_SWALOT - HOENN_MON_SPECIES_START] = CRY_SWALOT,
+ [SPECIES_TROPIUS - HOENN_MON_SPECIES_START] = CRY_TROPIUS,
+ [SPECIES_WHISMUR - HOENN_MON_SPECIES_START] = CRY_WHISMUR,
+ [SPECIES_LOUDRED - HOENN_MON_SPECIES_START] = CRY_LOUDRED,
+ [SPECIES_EXPLOUD - HOENN_MON_SPECIES_START] = CRY_EXPLOUD,
+ [SPECIES_CLAMPERL - HOENN_MON_SPECIES_START] = CRY_CLAMPERL,
+ [SPECIES_HUNTAIL - HOENN_MON_SPECIES_START] = CRY_HUNTAIL,
+ [SPECIES_GOREBYSS - HOENN_MON_SPECIES_START] = CRY_GOREBYSS,
+ [SPECIES_ABSOL - HOENN_MON_SPECIES_START] = CRY_ABSOL,
+ [SPECIES_SHUPPET - HOENN_MON_SPECIES_START] = CRY_SHUPPET,
+ [SPECIES_BANETTE - HOENN_MON_SPECIES_START] = CRY_BANETTE,
+ [SPECIES_SEVIPER - HOENN_MON_SPECIES_START] = CRY_SEVIPER,
+ [SPECIES_ZANGOOSE - HOENN_MON_SPECIES_START] = CRY_ZANGOOSE,
+ [SPECIES_RELICANTH - HOENN_MON_SPECIES_START] = CRY_RELICANTH,
+ [SPECIES_ARON - HOENN_MON_SPECIES_START] = CRY_ARON,
+ [SPECIES_LAIRON - HOENN_MON_SPECIES_START] = CRY_LAIRON,
+ [SPECIES_AGGRON - HOENN_MON_SPECIES_START] = CRY_AGGRON,
+ [SPECIES_CASTFORM - HOENN_MON_SPECIES_START] = CRY_CASTFORM,
+ [SPECIES_VOLBEAT - HOENN_MON_SPECIES_START] = CRY_VOLBEAT,
+ [SPECIES_ILLUMISE - HOENN_MON_SPECIES_START] = CRY_ILLUMISE,
+ [SPECIES_LILEEP - HOENN_MON_SPECIES_START] = CRY_LILEEP,
+ [SPECIES_CRADILY - HOENN_MON_SPECIES_START] = CRY_CRADILY,
+ [SPECIES_ANORITH - HOENN_MON_SPECIES_START] = CRY_ANORITH,
+ [SPECIES_ARMALDO - HOENN_MON_SPECIES_START] = CRY_ARMALDO,
+ [SPECIES_RALTS - HOENN_MON_SPECIES_START] = CRY_RALTS,
+ [SPECIES_KIRLIA - HOENN_MON_SPECIES_START] = CRY_KIRLIA,
+ [SPECIES_GARDEVOIR - HOENN_MON_SPECIES_START] = CRY_GARDEVOIR,
+ [SPECIES_BAGON - HOENN_MON_SPECIES_START] = CRY_BAGON,
+ [SPECIES_SHELGON - HOENN_MON_SPECIES_START] = CRY_SHELGON,
+ [SPECIES_SALAMENCE - HOENN_MON_SPECIES_START] = CRY_SALAMENCE,
+ [SPECIES_BELDUM - HOENN_MON_SPECIES_START] = CRY_BELDUM,
+ [SPECIES_METANG - HOENN_MON_SPECIES_START] = CRY_METANG,
+ [SPECIES_METAGROSS - HOENN_MON_SPECIES_START] = CRY_METAGROSS,
+ [SPECIES_REGIROCK - HOENN_MON_SPECIES_START] = CRY_REGIROCK,
+ [SPECIES_REGICE - HOENN_MON_SPECIES_START] = CRY_REGICE,
+ [SPECIES_REGISTEEL - HOENN_MON_SPECIES_START] = CRY_REGISTEEL,
+ [SPECIES_KYOGRE - HOENN_MON_SPECIES_START] = CRY_KYOGRE,
+ [SPECIES_GROUDON - HOENN_MON_SPECIES_START] = CRY_GROUDON,
+ [SPECIES_RAYQUAZA - HOENN_MON_SPECIES_START] = CRY_RAYQUAZA,
+ [SPECIES_LATIAS - HOENN_MON_SPECIES_START] = CRY_LATIAS,
+ [SPECIES_LATIOS - HOENN_MON_SPECIES_START] = CRY_LATIOS,
+ [SPECIES_JIRACHI - HOENN_MON_SPECIES_START] = CRY_JIRACHI,
+ [SPECIES_DEOXYS - HOENN_MON_SPECIES_START] = CRY_DEOXYS,
+ [SPECIES_CHIMECHO - HOENN_MON_SPECIES_START] = CRY_CHIMECHO,
+};
diff --git a/src/data/pokemon/evolution.h b/src/data/pokemon/evolution.h
new file mode 100644
index 000000000..c9b0cf716
--- /dev/null
+++ b/src/data/pokemon/evolution.h
@@ -0,0 +1,187 @@
+const struct Evolution gEvolutionTable[NUM_SPECIES][EVOS_PER_MON] =
+{
+ [SPECIES_BULBASAUR] = {{EVO_LEVEL, 16, SPECIES_IVYSAUR}},
+ [SPECIES_IVYSAUR] = {{EVO_LEVEL, 32, SPECIES_VENUSAUR}},
+ [SPECIES_CHARMANDER] = {{EVO_LEVEL, 16, SPECIES_CHARMELEON}},
+ [SPECIES_CHARMELEON] = {{EVO_LEVEL, 36, SPECIES_CHARIZARD}},
+ [SPECIES_SQUIRTLE] = {{EVO_LEVEL, 16, SPECIES_WARTORTLE}},
+ [SPECIES_WARTORTLE] = {{EVO_LEVEL, 36, SPECIES_BLASTOISE}},
+ [SPECIES_CATERPIE] = {{EVO_LEVEL, 7, SPECIES_METAPOD}},
+ [SPECIES_METAPOD] = {{EVO_LEVEL, 10, SPECIES_BUTTERFREE}},
+ [SPECIES_WEEDLE] = {{EVO_LEVEL, 7, SPECIES_KAKUNA}},
+ [SPECIES_KAKUNA] = {{EVO_LEVEL, 10, SPECIES_BEEDRILL}},
+ [SPECIES_PIDGEY] = {{EVO_LEVEL, 18, SPECIES_PIDGEOTTO}},
+ [SPECIES_PIDGEOTTO] = {{EVO_LEVEL, 36, SPECIES_PIDGEOT}},
+ [SPECIES_RATTATA] = {{EVO_LEVEL, 20, SPECIES_RATICATE}},
+ [SPECIES_SPEAROW] = {{EVO_LEVEL, 20, SPECIES_FEAROW}},
+ [SPECIES_EKANS] = {{EVO_LEVEL, 22, SPECIES_ARBOK}},
+ [SPECIES_PIKACHU] = {{EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU}},
+ [SPECIES_SANDSHREW] = {{EVO_LEVEL, 22, SPECIES_SANDSLASH}},
+ [SPECIES_NIDORAN_F] = {{EVO_LEVEL, 16, SPECIES_NIDORINA}},
+ [SPECIES_NIDORINA] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_NIDOQUEEN}},
+ [SPECIES_NIDORAN_M] = {{EVO_LEVEL, 16, SPECIES_NIDORINO}},
+ [SPECIES_NIDORINO] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_NIDOKING}},
+ [SPECIES_CLEFAIRY] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_CLEFABLE}},
+ [SPECIES_VULPIX] = {{EVO_ITEM, ITEM_FIRE_STONE, SPECIES_NINETALES}},
+ [SPECIES_JIGGLYPUFF] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_WIGGLYTUFF}},
+ [SPECIES_ZUBAT] = {{EVO_LEVEL, 22, SPECIES_GOLBAT}},
+ [SPECIES_GOLBAT] = {{EVO_FRIENDSHIP, 0, SPECIES_CROBAT}},
+ [SPECIES_ODDISH] = {{EVO_LEVEL, 21, SPECIES_GLOOM}},
+ [SPECIES_GLOOM] = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VILEPLUME},
+ {EVO_ITEM, ITEM_SUN_STONE, SPECIES_BELLOSSOM}},
+ [SPECIES_PARAS] = {{EVO_LEVEL, 24, SPECIES_PARASECT}},
+ [SPECIES_VENONAT] = {{EVO_LEVEL, 31, SPECIES_VENOMOTH}},
+ [SPECIES_DIGLETT] = {{EVO_LEVEL, 26, SPECIES_DUGTRIO}},
+ [SPECIES_MEOWTH] = {{EVO_LEVEL, 28, SPECIES_PERSIAN}},
+ [SPECIES_PSYDUCK] = {{EVO_LEVEL, 33, SPECIES_GOLDUCK}},
+ [SPECIES_MANKEY] = {{EVO_LEVEL, 28, SPECIES_PRIMEAPE}},
+ [SPECIES_GROWLITHE] = {{EVO_ITEM, ITEM_FIRE_STONE, SPECIES_ARCANINE}},
+ [SPECIES_POLIWAG] = {{EVO_LEVEL, 25, SPECIES_POLIWHIRL}},
+ [SPECIES_POLIWHIRL] = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_POLIWRATH},
+ {EVO_TRADE_ITEM, ITEM_KINGS_ROCK, SPECIES_POLITOED}},
+ [SPECIES_ABRA] = {{EVO_LEVEL, 16, SPECIES_KADABRA}},
+ [SPECIES_KADABRA] = {{EVO_TRADE, 0, SPECIES_ALAKAZAM}},
+ [SPECIES_MACHOP] = {{EVO_LEVEL, 28, SPECIES_MACHOKE}},
+ [SPECIES_MACHOKE] = {{EVO_TRADE, 0, SPECIES_MACHAMP}},
+ [SPECIES_BELLSPROUT] = {{EVO_LEVEL, 21, SPECIES_WEEPINBELL}},
+ [SPECIES_WEEPINBELL] = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VICTREEBEL}},
+ [SPECIES_TENTACOOL] = {{EVO_LEVEL, 30, SPECIES_TENTACRUEL}},
+ [SPECIES_GEODUDE] = {{EVO_LEVEL, 25, SPECIES_GRAVELER}},
+ [SPECIES_GRAVELER] = {{EVO_TRADE, 0, SPECIES_GOLEM}},
+ [SPECIES_PONYTA] = {{EVO_LEVEL, 40, SPECIES_RAPIDASH}},
+ [SPECIES_SLOWPOKE] = {{EVO_LEVEL, 37, SPECIES_SLOWBRO},
+ {EVO_TRADE_ITEM, ITEM_KINGS_ROCK, SPECIES_SLOWKING}},
+ [SPECIES_MAGNEMITE] = {{EVO_LEVEL, 30, SPECIES_MAGNETON}},
+ [SPECIES_DODUO] = {{EVO_LEVEL, 31, SPECIES_DODRIO}},
+ [SPECIES_SEEL] = {{EVO_LEVEL, 34, SPECIES_DEWGONG}},
+ [SPECIES_GRIMER] = {{EVO_LEVEL, 38, SPECIES_MUK}},
+ [SPECIES_SHELLDER] = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_CLOYSTER}},
+ [SPECIES_GASTLY] = {{EVO_LEVEL, 25, SPECIES_HAUNTER}},
+ [SPECIES_HAUNTER] = {{EVO_TRADE, 0, SPECIES_GENGAR}},
+ [SPECIES_ONIX] = {{EVO_TRADE_ITEM, ITEM_METAL_COAT, SPECIES_STEELIX}},
+ [SPECIES_DROWZEE] = {{EVO_LEVEL, 26, SPECIES_HYPNO}},
+ [SPECIES_KRABBY] = {{EVO_LEVEL, 28, SPECIES_KINGLER}},
+ [SPECIES_VOLTORB] = {{EVO_LEVEL, 30, SPECIES_ELECTRODE}},
+ [SPECIES_EXEGGCUTE] = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_EXEGGUTOR}},
+ [SPECIES_CUBONE] = {{EVO_LEVEL, 28, SPECIES_MAROWAK}},
+ [SPECIES_KOFFING] = {{EVO_LEVEL, 35, SPECIES_WEEZING}},
+ [SPECIES_RHYHORN] = {{EVO_LEVEL, 42, SPECIES_RHYDON}},
+ [SPECIES_CHANSEY] = {{EVO_FRIENDSHIP, 0, SPECIES_BLISSEY}},
+ [SPECIES_HORSEA] = {{EVO_LEVEL, 32, SPECIES_SEADRA}},
+ [SPECIES_SEADRA] = {{EVO_TRADE_ITEM, ITEM_DRAGON_SCALE, SPECIES_KINGDRA}},
+ [SPECIES_GOLDEEN] = {{EVO_LEVEL, 33, SPECIES_SEAKING}},
+ [SPECIES_STARYU] = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_STARMIE}},
+ [SPECIES_SCYTHER] = {{EVO_TRADE_ITEM, ITEM_METAL_COAT, SPECIES_SCIZOR}},
+ [SPECIES_MAGIKARP] = {{EVO_LEVEL, 20, SPECIES_GYARADOS}},
+ [SPECIES_EEVEE] = {{EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_JOLTEON},
+ {EVO_ITEM, ITEM_WATER_STONE, SPECIES_VAPOREON},
+ {EVO_ITEM, ITEM_FIRE_STONE, SPECIES_FLAREON},
+ {EVO_FRIENDSHIP_DAY, 0, SPECIES_ESPEON},
+ {EVO_FRIENDSHIP_NIGHT, 0, SPECIES_UMBREON}},
+ [SPECIES_PORYGON] = {{EVO_TRADE_ITEM, ITEM_UP_GRADE, SPECIES_PORYGON2}},
+ [SPECIES_OMANYTE] = {{EVO_LEVEL, 40, SPECIES_OMASTAR}},
+ [SPECIES_KABUTO] = {{EVO_LEVEL, 40, SPECIES_KABUTOPS}},
+ [SPECIES_DRATINI] = {{EVO_LEVEL, 30, SPECIES_DRAGONAIR}},
+ [SPECIES_DRAGONAIR] = {{EVO_LEVEL, 55, SPECIES_DRAGONITE}},
+ [SPECIES_CHIKORITA] = {{EVO_LEVEL, 16, SPECIES_BAYLEEF}},
+ [SPECIES_BAYLEEF] = {{EVO_LEVEL, 32, SPECIES_MEGANIUM}},
+ [SPECIES_CYNDAQUIL] = {{EVO_LEVEL, 14, SPECIES_QUILAVA}},
+ [SPECIES_QUILAVA] = {{EVO_LEVEL, 36, SPECIES_TYPHLOSION}},
+ [SPECIES_TOTODILE] = {{EVO_LEVEL, 18, SPECIES_CROCONAW}},
+ [SPECIES_CROCONAW] = {{EVO_LEVEL, 30, SPECIES_FERALIGATR}},
+ [SPECIES_SENTRET] = {{EVO_LEVEL, 15, SPECIES_FURRET}},
+ [SPECIES_HOOTHOOT] = {{EVO_LEVEL, 20, SPECIES_NOCTOWL}},
+ [SPECIES_LEDYBA] = {{EVO_LEVEL, 18, SPECIES_LEDIAN}},
+ [SPECIES_SPINARAK] = {{EVO_LEVEL, 22, SPECIES_ARIADOS}},
+ [SPECIES_CHINCHOU] = {{EVO_LEVEL, 27, SPECIES_LANTURN}},
+ [SPECIES_PICHU] = {{EVO_FRIENDSHIP, 0, SPECIES_PIKACHU}},
+ [SPECIES_CLEFFA] = {{EVO_FRIENDSHIP, 0, SPECIES_CLEFAIRY}},
+ [SPECIES_IGGLYBUFF] = {{EVO_FRIENDSHIP, 0, SPECIES_JIGGLYPUFF}},
+ [SPECIES_TOGEPI] = {{EVO_FRIENDSHIP, 0, SPECIES_TOGETIC}},
+ [SPECIES_NATU] = {{EVO_LEVEL, 25, SPECIES_XATU}},
+ [SPECIES_MAREEP] = {{EVO_LEVEL, 15, SPECIES_FLAAFFY}},
+ [SPECIES_FLAAFFY] = {{EVO_LEVEL, 30, SPECIES_AMPHAROS}},
+ [SPECIES_MARILL] = {{EVO_LEVEL, 18, SPECIES_AZUMARILL}},
+ [SPECIES_HOPPIP] = {{EVO_LEVEL, 18, SPECIES_SKIPLOOM}},
+ [SPECIES_SKIPLOOM] = {{EVO_LEVEL, 27, SPECIES_JUMPLUFF}},
+ [SPECIES_SUNKERN] = {{EVO_ITEM, ITEM_SUN_STONE, SPECIES_SUNFLORA}},
+ [SPECIES_WOOPER] = {{EVO_LEVEL, 20, SPECIES_QUAGSIRE}},
+ [SPECIES_PINECO] = {{EVO_LEVEL, 31, SPECIES_FORRETRESS}},
+ [SPECIES_SNUBBULL] = {{EVO_LEVEL, 23, SPECIES_GRANBULL}},
+ [SPECIES_TEDDIURSA] = {{EVO_LEVEL, 30, SPECIES_URSARING}},
+ [SPECIES_SLUGMA] = {{EVO_LEVEL, 38, SPECIES_MAGCARGO}},
+ [SPECIES_SWINUB] = {{EVO_LEVEL, 33, SPECIES_PILOSWINE}},
+ [SPECIES_REMORAID] = {{EVO_LEVEL, 25, SPECIES_OCTILLERY}},
+ [SPECIES_HOUNDOUR] = {{EVO_LEVEL, 24, SPECIES_HOUNDOOM}},
+ [SPECIES_PHANPY] = {{EVO_LEVEL, 25, SPECIES_DONPHAN}},
+ [SPECIES_TYROGUE] = {{EVO_LEVEL_ATK_LT_DEF, 20, SPECIES_HITMONCHAN},
+ {EVO_LEVEL_ATK_GT_DEF, 20, SPECIES_HITMONLEE},
+ {EVO_LEVEL_ATK_EQ_DEF, 20, SPECIES_HITMONTOP}},
+ [SPECIES_SMOOCHUM] = {{EVO_LEVEL, 30, SPECIES_JYNX}},
+ [SPECIES_ELEKID] = {{EVO_LEVEL, 30, SPECIES_ELECTABUZZ}},
+ [SPECIES_MAGBY] = {{EVO_LEVEL, 30, SPECIES_MAGMAR}},
+ [SPECIES_LARVITAR] = {{EVO_LEVEL, 30, SPECIES_PUPITAR}},
+ [SPECIES_PUPITAR] = {{EVO_LEVEL, 55, SPECIES_TYRANITAR}},
+ [SPECIES_TREECKO] = {{EVO_LEVEL, 16, SPECIES_GROVYLE}},
+ [SPECIES_GROVYLE] = {{EVO_LEVEL, 36, SPECIES_SCEPTILE}},
+ [SPECIES_TORCHIC] = {{EVO_LEVEL, 16, SPECIES_COMBUSKEN}},
+ [SPECIES_COMBUSKEN] = {{EVO_LEVEL, 36, SPECIES_BLAZIKEN}},
+ [SPECIES_MUDKIP] = {{EVO_LEVEL, 16, SPECIES_MARSHTOMP}},
+ [SPECIES_MARSHTOMP] = {{EVO_LEVEL, 36, SPECIES_SWAMPERT}},
+ [SPECIES_POOCHYENA] = {{EVO_LEVEL, 18, SPECIES_MIGHTYENA}},
+ [SPECIES_ZIGZAGOON] = {{EVO_LEVEL, 20, SPECIES_LINOONE}},
+ [SPECIES_WURMPLE] = {{EVO_LEVEL_SILCOON, 7, SPECIES_SILCOON},
+ {EVO_LEVEL_CASCOON, 7, SPECIES_CASCOON}},
+ [SPECIES_SILCOON] = {{EVO_LEVEL, 10, SPECIES_BEAUTIFLY}},
+ [SPECIES_CASCOON] = {{EVO_LEVEL, 10, SPECIES_DUSTOX}},
+ [SPECIES_LOTAD] = {{EVO_LEVEL, 14, SPECIES_LOMBRE}},
+ [SPECIES_LOMBRE] = {{EVO_ITEM, ITEM_WATER_STONE, SPECIES_LUDICOLO}},
+ [SPECIES_SEEDOT] = {{EVO_LEVEL, 14, SPECIES_NUZLEAF}},
+ [SPECIES_NUZLEAF] = {{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_SHIFTRY}},
+ [SPECIES_NINCADA] = {{EVO_LEVEL_NINJASK, 20, SPECIES_NINJASK},
+ {EVO_LEVEL_SHEDINJA, 20, SPECIES_SHEDINJA}},
+ [SPECIES_TAILLOW] = {{EVO_LEVEL, 22, SPECIES_SWELLOW}},
+ [SPECIES_SHROOMISH] = {{EVO_LEVEL, 23, SPECIES_BRELOOM}},
+ [SPECIES_WINGULL] = {{EVO_LEVEL, 25, SPECIES_PELIPPER}},
+ [SPECIES_SURSKIT] = {{EVO_LEVEL, 22, SPECIES_MASQUERAIN}},
+ [SPECIES_WAILMER] = {{EVO_LEVEL, 40, SPECIES_WAILORD}},
+ [SPECIES_SKITTY] = {{EVO_ITEM, ITEM_MOON_STONE, SPECIES_DELCATTY}},
+ [SPECIES_BALTOY] = {{EVO_LEVEL, 36, SPECIES_CLAYDOL}},
+ [SPECIES_BARBOACH] = {{EVO_LEVEL, 30, SPECIES_WHISCASH}},
+ [SPECIES_CORPHISH] = {{EVO_LEVEL, 30, SPECIES_CRAWDAUNT}},
+ [SPECIES_FEEBAS] = {{EVO_BEAUTY, 170, SPECIES_MILOTIC}},
+ [SPECIES_CARVANHA] = {{EVO_LEVEL, 30, SPECIES_SHARPEDO}},
+ [SPECIES_TRAPINCH] = {{EVO_LEVEL, 35, SPECIES_VIBRAVA}},
+ [SPECIES_VIBRAVA] = {{EVO_LEVEL, 45, SPECIES_FLYGON}},
+ [SPECIES_MAKUHITA] = {{EVO_LEVEL, 24, SPECIES_HARIYAMA}},
+ [SPECIES_ELECTRIKE] = {{EVO_LEVEL, 26, SPECIES_MANECTRIC}},
+ [SPECIES_NUMEL] = {{EVO_LEVEL, 33, SPECIES_CAMERUPT}},
+ [SPECIES_SPHEAL] = {{EVO_LEVEL, 32, SPECIES_SEALEO}},
+ [SPECIES_SEALEO] = {{EVO_LEVEL, 44, SPECIES_WALREIN}},
+ [SPECIES_CACNEA] = {{EVO_LEVEL, 32, SPECIES_CACTURNE}},
+ [SPECIES_SNORUNT] = {{EVO_LEVEL, 42, SPECIES_GLALIE}},
+ [SPECIES_AZURILL] = {{EVO_FRIENDSHIP, 0, SPECIES_MARILL}},
+ [SPECIES_SPOINK] = {{EVO_LEVEL, 32, SPECIES_GRUMPIG}},
+ [SPECIES_MEDITITE] = {{EVO_LEVEL, 37, SPECIES_MEDICHAM}},
+ [SPECIES_SWABLU] = {{EVO_LEVEL, 35, SPECIES_ALTARIA}},
+ [SPECIES_WYNAUT] = {{EVO_LEVEL, 15, SPECIES_WOBBUFFET}},
+ [SPECIES_DUSKULL] = {{EVO_LEVEL, 37, SPECIES_DUSCLOPS}},
+ [SPECIES_SLAKOTH] = {{EVO_LEVEL, 18, SPECIES_VIGOROTH}},
+ [SPECIES_VIGOROTH] = {{EVO_LEVEL, 36, SPECIES_SLAKING}},
+ [SPECIES_GULPIN] = {{EVO_LEVEL, 26, SPECIES_SWALOT}},
+ [SPECIES_WHISMUR] = {{EVO_LEVEL, 20, SPECIES_LOUDRED}},
+ [SPECIES_LOUDRED] = {{EVO_LEVEL, 40, SPECIES_EXPLOUD}},
+ [SPECIES_CLAMPERL] = {{EVO_TRADE_ITEM, ITEM_DEEP_SEA_TOOTH, SPECIES_HUNTAIL},
+ {EVO_TRADE_ITEM, ITEM_DEEP_SEA_SCALE, SPECIES_GOREBYSS}},
+ [SPECIES_SHUPPET] = {{EVO_LEVEL, 37, SPECIES_BANETTE}},
+ [SPECIES_ARON] = {{EVO_LEVEL, 32, SPECIES_LAIRON}},
+ [SPECIES_LAIRON] = {{EVO_LEVEL, 42, SPECIES_AGGRON}},
+ [SPECIES_LILEEP] = {{EVO_LEVEL, 40, SPECIES_CRADILY}},
+ [SPECIES_ANORITH] = {{EVO_LEVEL, 40, SPECIES_ARMALDO}},
+ [SPECIES_RALTS] = {{EVO_LEVEL, 20, SPECIES_KIRLIA}},
+ [SPECIES_KIRLIA] = {{EVO_LEVEL, 30, SPECIES_GARDEVOIR}},
+ [SPECIES_BAGON] = {{EVO_LEVEL, 30, SPECIES_SHELGON}},
+ [SPECIES_SHELGON] = {{EVO_LEVEL, 50, SPECIES_SALAMENCE}},
+ [SPECIES_BELDUM] = {{EVO_LEVEL, 20, SPECIES_METANG}},
+ [SPECIES_METANG] = {{EVO_LEVEL, 45, SPECIES_METAGROSS}},
+};
diff --git a/src/data/pokemon/experience_tables.h b/src/data/pokemon/experience_tables.h
new file mode 100644
index 000000000..b2723e9d2
--- /dev/null
+++ b/src/data/pokemon/experience_tables.h
@@ -0,0 +1,844 @@
+#define SQUARE(n)(n * n)
+#define CUBE(n)(n * n * n)
+
+#define EXP_SLOW(n)((5 * CUBE(n)) / 4) // (5 * (n)^3) / 4
+#define EXP_FAST(n)((4 * CUBE(n)) / 5) // (4 * (n)^3) / 5
+#define EXP_MEDIUM_FAST(n)(CUBE(n)) // (n)^3
+#define EXP_MEDIUM_SLOW(n)((6 * CUBE(n)) / 5 - (15 * SQUARE(n)) + (100 * n) - 140) // (6 * (n)^3) / 5 - (15 * (n)^2) + (100 * n) - 140
+#define EXP_ERRATIC(n) \
+ (n <= 50) ? ((100 - n) * CUBE(n) / 50) \
+ :(n <= 68) ? ((150 - n) * CUBE(n) / 100) \
+ :(n <= 98) ? (((1911 - 10 * n) / 3) * CUBE(n) / 500) \
+ : ((160 - n) * CUBE(n) / 100)
+#define EXP_FLUCTUATING(n) \
+ (n <= 15) ? (((n + 1) / 3 + 24) * CUBE(n) / 50) \
+ :(n <= 36) ? ((n + 14) * CUBE(n) / 50) \
+ : (((n / 2) + 32) * CUBE(n) / 50)
+
+const u32 gExperienceTables[][MAX_MON_LEVEL + 1] =
+{
+ { // Medium Fast
+ 0, // 0
+ 1, // 1
+ EXP_MEDIUM_FAST(2),
+ EXP_MEDIUM_FAST(3),
+ EXP_MEDIUM_FAST(4),
+ EXP_MEDIUM_FAST(5),
+ EXP_MEDIUM_FAST(6),
+ EXP_MEDIUM_FAST(7),
+ EXP_MEDIUM_FAST(8),
+ EXP_MEDIUM_FAST(9),
+ EXP_MEDIUM_FAST(10),
+ EXP_MEDIUM_FAST(11),
+ EXP_MEDIUM_FAST(12),
+ EXP_MEDIUM_FAST(13),
+ EXP_MEDIUM_FAST(14),
+ EXP_MEDIUM_FAST(15),
+ EXP_MEDIUM_FAST(16),
+ EXP_MEDIUM_FAST(17),
+ EXP_MEDIUM_FAST(18),
+ EXP_MEDIUM_FAST(19),
+ EXP_MEDIUM_FAST(20),
+ EXP_MEDIUM_FAST(21),
+ EXP_MEDIUM_FAST(22),
+ EXP_MEDIUM_FAST(23),
+ EXP_MEDIUM_FAST(24),
+ EXP_MEDIUM_FAST(25),
+ EXP_MEDIUM_FAST(26),
+ EXP_MEDIUM_FAST(27),
+ EXP_MEDIUM_FAST(28),
+ EXP_MEDIUM_FAST(29),
+ EXP_MEDIUM_FAST(30),
+ EXP_MEDIUM_FAST(31),
+ EXP_MEDIUM_FAST(32),
+ EXP_MEDIUM_FAST(33),
+ EXP_MEDIUM_FAST(34),
+ EXP_MEDIUM_FAST(35),
+ EXP_MEDIUM_FAST(36),
+ EXP_MEDIUM_FAST(37),
+ EXP_MEDIUM_FAST(38),
+ EXP_MEDIUM_FAST(39),
+ EXP_MEDIUM_FAST(40),
+ EXP_MEDIUM_FAST(41),
+ EXP_MEDIUM_FAST(42),
+ EXP_MEDIUM_FAST(43),
+ EXP_MEDIUM_FAST(44),
+ EXP_MEDIUM_FAST(45),
+ EXP_MEDIUM_FAST(46),
+ EXP_MEDIUM_FAST(47),
+ EXP_MEDIUM_FAST(48),
+ EXP_MEDIUM_FAST(49),
+ EXP_MEDIUM_FAST(50),
+ EXP_MEDIUM_FAST(51),
+ EXP_MEDIUM_FAST(52),
+ EXP_MEDIUM_FAST(53),
+ EXP_MEDIUM_FAST(54),
+ EXP_MEDIUM_FAST(55),
+ EXP_MEDIUM_FAST(56),
+ EXP_MEDIUM_FAST(57),
+ EXP_MEDIUM_FAST(58),
+ EXP_MEDIUM_FAST(59),
+ EXP_MEDIUM_FAST(60),
+ EXP_MEDIUM_FAST(61),
+ EXP_MEDIUM_FAST(62),
+ EXP_MEDIUM_FAST(63),
+ EXP_MEDIUM_FAST(64),
+ EXP_MEDIUM_FAST(65),
+ EXP_MEDIUM_FAST(66),
+ EXP_MEDIUM_FAST(67),
+ EXP_MEDIUM_FAST(68),
+ EXP_MEDIUM_FAST(69),
+ EXP_MEDIUM_FAST(70),
+ EXP_MEDIUM_FAST(71),
+ EXP_MEDIUM_FAST(72),
+ EXP_MEDIUM_FAST(73),
+ EXP_MEDIUM_FAST(74),
+ EXP_MEDIUM_FAST(75),
+ EXP_MEDIUM_FAST(76),
+ EXP_MEDIUM_FAST(77),
+ EXP_MEDIUM_FAST(78),
+ EXP_MEDIUM_FAST(79),
+ EXP_MEDIUM_FAST(80),
+ EXP_MEDIUM_FAST(81),
+ EXP_MEDIUM_FAST(82),
+ EXP_MEDIUM_FAST(83),
+ EXP_MEDIUM_FAST(84),
+ EXP_MEDIUM_FAST(85),
+ EXP_MEDIUM_FAST(86),
+ EXP_MEDIUM_FAST(87),
+ EXP_MEDIUM_FAST(88),
+ EXP_MEDIUM_FAST(89),
+ EXP_MEDIUM_FAST(90),
+ EXP_MEDIUM_FAST(91),
+ EXP_MEDIUM_FAST(92),
+ EXP_MEDIUM_FAST(93),
+ EXP_MEDIUM_FAST(94),
+ EXP_MEDIUM_FAST(95),
+ EXP_MEDIUM_FAST(96),
+ EXP_MEDIUM_FAST(97),
+ EXP_MEDIUM_FAST(98),
+ EXP_MEDIUM_FAST(99),
+ EXP_MEDIUM_FAST(100),
+ },
+ { // Erratic
+ 0, // 0
+ 1, // 1
+ EXP_ERRATIC(2),
+ EXP_ERRATIC(3),
+ EXP_ERRATIC(4),
+ EXP_ERRATIC(5),
+ EXP_ERRATIC(6),
+ EXP_ERRATIC(7),
+ EXP_ERRATIC(8),
+ EXP_ERRATIC(9),
+ EXP_ERRATIC(10),
+ EXP_ERRATIC(11),
+ EXP_ERRATIC(12),
+ EXP_ERRATIC(13),
+ EXP_ERRATIC(14),
+ EXP_ERRATIC(15),
+ EXP_ERRATIC(16),
+ EXP_ERRATIC(17),
+ EXP_ERRATIC(18),
+ EXP_ERRATIC(19),
+ EXP_ERRATIC(20),
+ EXP_ERRATIC(21),
+ EXP_ERRATIC(22),
+ EXP_ERRATIC(23),
+ EXP_ERRATIC(24),
+ EXP_ERRATIC(25),
+ EXP_ERRATIC(26),
+ EXP_ERRATIC(27),
+ EXP_ERRATIC(28),
+ EXP_ERRATIC(29),
+ EXP_ERRATIC(30),
+ EXP_ERRATIC(31),
+ EXP_ERRATIC(32),
+ EXP_ERRATIC(33),
+ EXP_ERRATIC(34),
+ EXP_ERRATIC(35),
+ EXP_ERRATIC(36),
+ EXP_ERRATIC(37),
+ EXP_ERRATIC(38),
+ EXP_ERRATIC(39),
+ EXP_ERRATIC(40),
+ EXP_ERRATIC(41),
+ EXP_ERRATIC(42),
+ EXP_ERRATIC(43),
+ EXP_ERRATIC(44),
+ EXP_ERRATIC(45),
+ EXP_ERRATIC(46),
+ EXP_ERRATIC(47),
+ EXP_ERRATIC(48),
+ EXP_ERRATIC(49),
+ EXP_ERRATIC(50),
+ EXP_ERRATIC(51),
+ EXP_ERRATIC(52),
+ EXP_ERRATIC(53),
+ EXP_ERRATIC(54),
+ EXP_ERRATIC(55),
+ EXP_ERRATIC(56),
+ EXP_ERRATIC(57),
+ EXP_ERRATIC(58),
+ EXP_ERRATIC(59),
+ EXP_ERRATIC(60),
+ EXP_ERRATIC(61),
+ EXP_ERRATIC(62),
+ EXP_ERRATIC(63),
+ EXP_ERRATIC(64),
+ EXP_ERRATIC(65),
+ EXP_ERRATIC(66),
+ EXP_ERRATIC(67),
+ EXP_ERRATIC(68),
+ EXP_ERRATIC(69),
+ EXP_ERRATIC(70),
+ EXP_ERRATIC(71),
+ EXP_ERRATIC(72),
+ EXP_ERRATIC(73),
+ EXP_ERRATIC(74),
+ EXP_ERRATIC(75),
+ EXP_ERRATIC(76),
+ EXP_ERRATIC(77),
+ EXP_ERRATIC(78),
+ EXP_ERRATIC(79),
+ EXP_ERRATIC(80),
+ EXP_ERRATIC(81),
+ EXP_ERRATIC(82),
+ EXP_ERRATIC(83),
+ EXP_ERRATIC(84),
+ EXP_ERRATIC(85),
+ EXP_ERRATIC(86),
+ EXP_ERRATIC(87),
+ EXP_ERRATIC(88),
+ EXP_ERRATIC(89),
+ EXP_ERRATIC(90),
+ EXP_ERRATIC(91),
+ EXP_ERRATIC(92),
+ EXP_ERRATIC(93),
+ EXP_ERRATIC(94),
+ EXP_ERRATIC(95),
+ EXP_ERRATIC(96),
+ EXP_ERRATIC(97),
+ EXP_ERRATIC(98),
+ EXP_ERRATIC(99),
+ EXP_ERRATIC(100),
+ },
+ { // Fluctuating
+ 0, // 0
+ 1, // 1
+ EXP_FLUCTUATING(2),
+ EXP_FLUCTUATING(3),
+ EXP_FLUCTUATING(4),
+ EXP_FLUCTUATING(5),
+ EXP_FLUCTUATING(6),
+ EXP_FLUCTUATING(7),
+ EXP_FLUCTUATING(8),
+ EXP_FLUCTUATING(9),
+ EXP_FLUCTUATING(10),
+ EXP_FLUCTUATING(11),
+ EXP_FLUCTUATING(12),
+ EXP_FLUCTUATING(13),
+ EXP_FLUCTUATING(14),
+ EXP_FLUCTUATING(15),
+ EXP_FLUCTUATING(16),
+ EXP_FLUCTUATING(17),
+ EXP_FLUCTUATING(18),
+ EXP_FLUCTUATING(19),
+ EXP_FLUCTUATING(20),
+ EXP_FLUCTUATING(21),
+ EXP_FLUCTUATING(22),
+ EXP_FLUCTUATING(23),
+ EXP_FLUCTUATING(24),
+ EXP_FLUCTUATING(25),
+ EXP_FLUCTUATING(26),
+ EXP_FLUCTUATING(27),
+ EXP_FLUCTUATING(28),
+ EXP_FLUCTUATING(29),
+ EXP_FLUCTUATING(30),
+ EXP_FLUCTUATING(31),
+ EXP_FLUCTUATING(32),
+ EXP_FLUCTUATING(33),
+ EXP_FLUCTUATING(34),
+ EXP_FLUCTUATING(35),
+ EXP_FLUCTUATING(36),
+ EXP_FLUCTUATING(37),
+ EXP_FLUCTUATING(38),
+ EXP_FLUCTUATING(39),
+ EXP_FLUCTUATING(40),
+ EXP_FLUCTUATING(41),
+ EXP_FLUCTUATING(42),
+ EXP_FLUCTUATING(43),
+ EXP_FLUCTUATING(44),
+ EXP_FLUCTUATING(45),
+ EXP_FLUCTUATING(46),
+ EXP_FLUCTUATING(47),
+ EXP_FLUCTUATING(48),
+ EXP_FLUCTUATING(49),
+ EXP_FLUCTUATING(50),
+ EXP_FLUCTUATING(51),
+ EXP_FLUCTUATING(52),
+ EXP_FLUCTUATING(53),
+ EXP_FLUCTUATING(54),
+ EXP_FLUCTUATING(55),
+ EXP_FLUCTUATING(56),
+ EXP_FLUCTUATING(57),
+ EXP_FLUCTUATING(58),
+ EXP_FLUCTUATING(59),
+ EXP_FLUCTUATING(60),
+ EXP_FLUCTUATING(61),
+ EXP_FLUCTUATING(62),
+ EXP_FLUCTUATING(63),
+ EXP_FLUCTUATING(64),
+ EXP_FLUCTUATING(65),
+ EXP_FLUCTUATING(66),
+ EXP_FLUCTUATING(67),
+ EXP_FLUCTUATING(68),
+ EXP_FLUCTUATING(69),
+ EXP_FLUCTUATING(70),
+ EXP_FLUCTUATING(71),
+ EXP_FLUCTUATING(72),
+ EXP_FLUCTUATING(73),
+ EXP_FLUCTUATING(74),
+ EXP_FLUCTUATING(75),
+ EXP_FLUCTUATING(76),
+ EXP_FLUCTUATING(77),
+ EXP_FLUCTUATING(78),
+ EXP_FLUCTUATING(79),
+ EXP_FLUCTUATING(80),
+ EXP_FLUCTUATING(81),
+ EXP_FLUCTUATING(82),
+ EXP_FLUCTUATING(83),
+ EXP_FLUCTUATING(84),
+ EXP_FLUCTUATING(85),
+ EXP_FLUCTUATING(86),
+ EXP_FLUCTUATING(87),
+ EXP_FLUCTUATING(88),
+ EXP_FLUCTUATING(89),
+ EXP_FLUCTUATING(90),
+ EXP_FLUCTUATING(91),
+ EXP_FLUCTUATING(92),
+ EXP_FLUCTUATING(93),
+ EXP_FLUCTUATING(94),
+ EXP_FLUCTUATING(95),
+ EXP_FLUCTUATING(96),
+ EXP_FLUCTUATING(97),
+ EXP_FLUCTUATING(98),
+ EXP_FLUCTUATING(99),
+ EXP_FLUCTUATING(100),
+ },
+ { // Medium Slow
+ 0, // 0
+ 1, // 1
+ EXP_MEDIUM_SLOW(2),
+ EXP_MEDIUM_SLOW(3),
+ EXP_MEDIUM_SLOW(4),
+ EXP_MEDIUM_SLOW(5),
+ EXP_MEDIUM_SLOW(6),
+ EXP_MEDIUM_SLOW(7),
+ EXP_MEDIUM_SLOW(8),
+ EXP_MEDIUM_SLOW(9),
+ EXP_MEDIUM_SLOW(10),
+ EXP_MEDIUM_SLOW(11),
+ EXP_MEDIUM_SLOW(12),
+ EXP_MEDIUM_SLOW(13),
+ EXP_MEDIUM_SLOW(14),
+ EXP_MEDIUM_SLOW(15),
+ EXP_MEDIUM_SLOW(16),
+ EXP_MEDIUM_SLOW(17),
+ EXP_MEDIUM_SLOW(18),
+ EXP_MEDIUM_SLOW(19),
+ EXP_MEDIUM_SLOW(20),
+ EXP_MEDIUM_SLOW(21),
+ EXP_MEDIUM_SLOW(22),
+ EXP_MEDIUM_SLOW(23),
+ EXP_MEDIUM_SLOW(24),
+ EXP_MEDIUM_SLOW(25),
+ EXP_MEDIUM_SLOW(26),
+ EXP_MEDIUM_SLOW(27),
+ EXP_MEDIUM_SLOW(28),
+ EXP_MEDIUM_SLOW(29),
+ EXP_MEDIUM_SLOW(30),
+ EXP_MEDIUM_SLOW(31),
+ EXP_MEDIUM_SLOW(32),
+ EXP_MEDIUM_SLOW(33),
+ EXP_MEDIUM_SLOW(34),
+ EXP_MEDIUM_SLOW(35),
+ EXP_MEDIUM_SLOW(36),
+ EXP_MEDIUM_SLOW(37),
+ EXP_MEDIUM_SLOW(38),
+ EXP_MEDIUM_SLOW(39),
+ EXP_MEDIUM_SLOW(40),
+ EXP_MEDIUM_SLOW(41),
+ EXP_MEDIUM_SLOW(42),
+ EXP_MEDIUM_SLOW(43),
+ EXP_MEDIUM_SLOW(44),
+ EXP_MEDIUM_SLOW(45),
+ EXP_MEDIUM_SLOW(46),
+ EXP_MEDIUM_SLOW(47),
+ EXP_MEDIUM_SLOW(48),
+ EXP_MEDIUM_SLOW(49),
+ EXP_MEDIUM_SLOW(50),
+ EXP_MEDIUM_SLOW(51),
+ EXP_MEDIUM_SLOW(52),
+ EXP_MEDIUM_SLOW(53),
+ EXP_MEDIUM_SLOW(54),
+ EXP_MEDIUM_SLOW(55),
+ EXP_MEDIUM_SLOW(56),
+ EXP_MEDIUM_SLOW(57),
+ EXP_MEDIUM_SLOW(58),
+ EXP_MEDIUM_SLOW(59),
+ EXP_MEDIUM_SLOW(60),
+ EXP_MEDIUM_SLOW(61),
+ EXP_MEDIUM_SLOW(62),
+ EXP_MEDIUM_SLOW(63),
+ EXP_MEDIUM_SLOW(64),
+ EXP_MEDIUM_SLOW(65),
+ EXP_MEDIUM_SLOW(66),
+ EXP_MEDIUM_SLOW(67),
+ EXP_MEDIUM_SLOW(68),
+ EXP_MEDIUM_SLOW(69),
+ EXP_MEDIUM_SLOW(70),
+ EXP_MEDIUM_SLOW(71),
+ EXP_MEDIUM_SLOW(72),
+ EXP_MEDIUM_SLOW(73),
+ EXP_MEDIUM_SLOW(74),
+ EXP_MEDIUM_SLOW(75),
+ EXP_MEDIUM_SLOW(76),
+ EXP_MEDIUM_SLOW(77),
+ EXP_MEDIUM_SLOW(78),
+ EXP_MEDIUM_SLOW(79),
+ EXP_MEDIUM_SLOW(80),
+ EXP_MEDIUM_SLOW(81),
+ EXP_MEDIUM_SLOW(82),
+ EXP_MEDIUM_SLOW(83),
+ EXP_MEDIUM_SLOW(84),
+ EXP_MEDIUM_SLOW(85),
+ EXP_MEDIUM_SLOW(86),
+ EXP_MEDIUM_SLOW(87),
+ EXP_MEDIUM_SLOW(88),
+ EXP_MEDIUM_SLOW(89),
+ EXP_MEDIUM_SLOW(90),
+ EXP_MEDIUM_SLOW(91),
+ EXP_MEDIUM_SLOW(92),
+ EXP_MEDIUM_SLOW(93),
+ EXP_MEDIUM_SLOW(94),
+ EXP_MEDIUM_SLOW(95),
+ EXP_MEDIUM_SLOW(96),
+ EXP_MEDIUM_SLOW(97),
+ EXP_MEDIUM_SLOW(98),
+ EXP_MEDIUM_SLOW(99),
+ EXP_MEDIUM_SLOW(100),
+ },
+ { // Fast
+ 0, // 0
+ 1, // 1
+ EXP_FAST(2),
+ EXP_FAST(3),
+ EXP_FAST(4),
+ EXP_FAST(5),
+ EXP_FAST(6),
+ EXP_FAST(7),
+ EXP_FAST(8),
+ EXP_FAST(9),
+ EXP_FAST(10),
+ EXP_FAST(11),
+ EXP_FAST(12),
+ EXP_FAST(13),
+ EXP_FAST(14),
+ EXP_FAST(15),
+ EXP_FAST(16),
+ EXP_FAST(17),
+ EXP_FAST(18),
+ EXP_FAST(19),
+ EXP_FAST(20),
+ EXP_FAST(21),
+ EXP_FAST(22),
+ EXP_FAST(23),
+ EXP_FAST(24),
+ EXP_FAST(25),
+ EXP_FAST(26),
+ EXP_FAST(27),
+ EXP_FAST(28),
+ EXP_FAST(29),
+ EXP_FAST(30),
+ EXP_FAST(31),
+ EXP_FAST(32),
+ EXP_FAST(33),
+ EXP_FAST(34),
+ EXP_FAST(35),
+ EXP_FAST(36),
+ EXP_FAST(37),
+ EXP_FAST(38),
+ EXP_FAST(39),
+ EXP_FAST(40),
+ EXP_FAST(41),
+ EXP_FAST(42),
+ EXP_FAST(43),
+ EXP_FAST(44),
+ EXP_FAST(45),
+ EXP_FAST(46),
+ EXP_FAST(47),
+ EXP_FAST(48),
+ EXP_FAST(49),
+ EXP_FAST(50),
+ EXP_FAST(51),
+ EXP_FAST(52),
+ EXP_FAST(53),
+ EXP_FAST(54),
+ EXP_FAST(55),
+ EXP_FAST(56),
+ EXP_FAST(57),
+ EXP_FAST(58),
+ EXP_FAST(59),
+ EXP_FAST(60),
+ EXP_FAST(61),
+ EXP_FAST(62),
+ EXP_FAST(63),
+ EXP_FAST(64),
+ EXP_FAST(65),
+ EXP_FAST(66),
+ EXP_FAST(67),
+ EXP_FAST(68),
+ EXP_FAST(69),
+ EXP_FAST(70),
+ EXP_FAST(71),
+ EXP_FAST(72),
+ EXP_FAST(73),
+ EXP_FAST(74),
+ EXP_FAST(75),
+ EXP_FAST(76),
+ EXP_FAST(77),
+ EXP_FAST(78),
+ EXP_FAST(79),
+ EXP_FAST(80),
+ EXP_FAST(81),
+ EXP_FAST(82),
+ EXP_FAST(83),
+ EXP_FAST(84),
+ EXP_FAST(85),
+ EXP_FAST(86),
+ EXP_FAST(87),
+ EXP_FAST(88),
+ EXP_FAST(89),
+ EXP_FAST(90),
+ EXP_FAST(91),
+ EXP_FAST(92),
+ EXP_FAST(93),
+ EXP_FAST(94),
+ EXP_FAST(95),
+ EXP_FAST(96),
+ EXP_FAST(97),
+ EXP_FAST(98),
+ EXP_FAST(99),
+ EXP_FAST(100),
+ },
+ { // Slow
+ 0, // 0
+ 1, // 1
+ EXP_SLOW(2),
+ EXP_SLOW(3),
+ EXP_SLOW(4),
+ EXP_SLOW(5),
+ EXP_SLOW(6),
+ EXP_SLOW(7),
+ EXP_SLOW(8),
+ EXP_SLOW(9),
+ EXP_SLOW(10),
+ EXP_SLOW(11),
+ EXP_SLOW(12),
+ EXP_SLOW(13),
+ EXP_SLOW(14),
+ EXP_SLOW(15),
+ EXP_SLOW(16),
+ EXP_SLOW(17),
+ EXP_SLOW(18),
+ EXP_SLOW(19),
+ EXP_SLOW(20),
+ EXP_SLOW(21),
+ EXP_SLOW(22),
+ EXP_SLOW(23),
+ EXP_SLOW(24),
+ EXP_SLOW(25),
+ EXP_SLOW(26),
+ EXP_SLOW(27),
+ EXP_SLOW(28),
+ EXP_SLOW(29),
+ EXP_SLOW(30),
+ EXP_SLOW(31),
+ EXP_SLOW(32),
+ EXP_SLOW(33),
+ EXP_SLOW(34),
+ EXP_SLOW(35),
+ EXP_SLOW(36),
+ EXP_SLOW(37),
+ EXP_SLOW(38),
+ EXP_SLOW(39),
+ EXP_SLOW(40),
+ EXP_SLOW(41),
+ EXP_SLOW(42),
+ EXP_SLOW(43),
+ EXP_SLOW(44),
+ EXP_SLOW(45),
+ EXP_SLOW(46),
+ EXP_SLOW(47),
+ EXP_SLOW(48),
+ EXP_SLOW(49),
+ EXP_SLOW(50),
+ EXP_SLOW(51),
+ EXP_SLOW(52),
+ EXP_SLOW(53),
+ EXP_SLOW(54),
+ EXP_SLOW(55),
+ EXP_SLOW(56),
+ EXP_SLOW(57),
+ EXP_SLOW(58),
+ EXP_SLOW(59),
+ EXP_SLOW(60),
+ EXP_SLOW(61),
+ EXP_SLOW(62),
+ EXP_SLOW(63),
+ EXP_SLOW(64),
+ EXP_SLOW(65),
+ EXP_SLOW(66),
+ EXP_SLOW(67),
+ EXP_SLOW(68),
+ EXP_SLOW(69),
+ EXP_SLOW(70),
+ EXP_SLOW(71),
+ EXP_SLOW(72),
+ EXP_SLOW(73),
+ EXP_SLOW(74),
+ EXP_SLOW(75),
+ EXP_SLOW(76),
+ EXP_SLOW(77),
+ EXP_SLOW(78),
+ EXP_SLOW(79),
+ EXP_SLOW(80),
+ EXP_SLOW(81),
+ EXP_SLOW(82),
+ EXP_SLOW(83),
+ EXP_SLOW(84),
+ EXP_SLOW(85),
+ EXP_SLOW(86),
+ EXP_SLOW(87),
+ EXP_SLOW(88),
+ EXP_SLOW(89),
+ EXP_SLOW(90),
+ EXP_SLOW(91),
+ EXP_SLOW(92),
+ EXP_SLOW(93),
+ EXP_SLOW(94),
+ EXP_SLOW(95),
+ EXP_SLOW(96),
+ EXP_SLOW(97),
+ EXP_SLOW(98),
+ EXP_SLOW(99),
+ EXP_SLOW(100),
+ },
+ { // Medium Fast copy 2 (unused? to-do: investigate)
+ 0, // 0
+ 1, // 1
+ EXP_MEDIUM_FAST(2),
+ EXP_MEDIUM_FAST(3),
+ EXP_MEDIUM_FAST(4),
+ EXP_MEDIUM_FAST(5),
+ EXP_MEDIUM_FAST(6),
+ EXP_MEDIUM_FAST(7),
+ EXP_MEDIUM_FAST(8),
+ EXP_MEDIUM_FAST(9),
+ EXP_MEDIUM_FAST(10),
+ EXP_MEDIUM_FAST(11),
+ EXP_MEDIUM_FAST(12),
+ EXP_MEDIUM_FAST(13),
+ EXP_MEDIUM_FAST(14),
+ EXP_MEDIUM_FAST(15),
+ EXP_MEDIUM_FAST(16),
+ EXP_MEDIUM_FAST(17),
+ EXP_MEDIUM_FAST(18),
+ EXP_MEDIUM_FAST(19),
+ EXP_MEDIUM_FAST(20),
+ EXP_MEDIUM_FAST(21),
+ EXP_MEDIUM_FAST(22),
+ EXP_MEDIUM_FAST(23),
+ EXP_MEDIUM_FAST(24),
+ EXP_MEDIUM_FAST(25),
+ EXP_MEDIUM_FAST(26),
+ EXP_MEDIUM_FAST(27),
+ EXP_MEDIUM_FAST(28),
+ EXP_MEDIUM_FAST(29),
+ EXP_MEDIUM_FAST(30),
+ EXP_MEDIUM_FAST(31),
+ EXP_MEDIUM_FAST(32),
+ EXP_MEDIUM_FAST(33),
+ EXP_MEDIUM_FAST(34),
+ EXP_MEDIUM_FAST(35),
+ EXP_MEDIUM_FAST(36),
+ EXP_MEDIUM_FAST(37),
+ EXP_MEDIUM_FAST(38),
+ EXP_MEDIUM_FAST(39),
+ EXP_MEDIUM_FAST(40),
+ EXP_MEDIUM_FAST(41),
+ EXP_MEDIUM_FAST(42),
+ EXP_MEDIUM_FAST(43),
+ EXP_MEDIUM_FAST(44),
+ EXP_MEDIUM_FAST(45),
+ EXP_MEDIUM_FAST(46),
+ EXP_MEDIUM_FAST(47),
+ EXP_MEDIUM_FAST(48),
+ EXP_MEDIUM_FAST(49),
+ EXP_MEDIUM_FAST(50),
+ EXP_MEDIUM_FAST(51),
+ EXP_MEDIUM_FAST(52),
+ EXP_MEDIUM_FAST(53),
+ EXP_MEDIUM_FAST(54),
+ EXP_MEDIUM_FAST(55),
+ EXP_MEDIUM_FAST(56),
+ EXP_MEDIUM_FAST(57),
+ EXP_MEDIUM_FAST(58),
+ EXP_MEDIUM_FAST(59),
+ EXP_MEDIUM_FAST(60),
+ EXP_MEDIUM_FAST(61),
+ EXP_MEDIUM_FAST(62),
+ EXP_MEDIUM_FAST(63),
+ EXP_MEDIUM_FAST(64),
+ EXP_MEDIUM_FAST(65),
+ EXP_MEDIUM_FAST(66),
+ EXP_MEDIUM_FAST(67),
+ EXP_MEDIUM_FAST(68),
+ EXP_MEDIUM_FAST(69),
+ EXP_MEDIUM_FAST(70),
+ EXP_MEDIUM_FAST(71),
+ EXP_MEDIUM_FAST(72),
+ EXP_MEDIUM_FAST(73),
+ EXP_MEDIUM_FAST(74),
+ EXP_MEDIUM_FAST(75),
+ EXP_MEDIUM_FAST(76),
+ EXP_MEDIUM_FAST(77),
+ EXP_MEDIUM_FAST(78),
+ EXP_MEDIUM_FAST(79),
+ EXP_MEDIUM_FAST(80),
+ EXP_MEDIUM_FAST(81),
+ EXP_MEDIUM_FAST(82),
+ EXP_MEDIUM_FAST(83),
+ EXP_MEDIUM_FAST(84),
+ EXP_MEDIUM_FAST(85),
+ EXP_MEDIUM_FAST(86),
+ EXP_MEDIUM_FAST(87),
+ EXP_MEDIUM_FAST(88),
+ EXP_MEDIUM_FAST(89),
+ EXP_MEDIUM_FAST(90),
+ EXP_MEDIUM_FAST(91),
+ EXP_MEDIUM_FAST(92),
+ EXP_MEDIUM_FAST(93),
+ EXP_MEDIUM_FAST(94),
+ EXP_MEDIUM_FAST(95),
+ EXP_MEDIUM_FAST(96),
+ EXP_MEDIUM_FAST(97),
+ EXP_MEDIUM_FAST(98),
+ EXP_MEDIUM_FAST(99),
+ EXP_MEDIUM_FAST(100),
+ },
+ { // Medium Fast copy 3 (unused? to-do: investigate)
+ 0, // 0
+ 1, // 1
+ EXP_MEDIUM_FAST(2),
+ EXP_MEDIUM_FAST(3),
+ EXP_MEDIUM_FAST(4),
+ EXP_MEDIUM_FAST(5),
+ EXP_MEDIUM_FAST(6),
+ EXP_MEDIUM_FAST(7),
+ EXP_MEDIUM_FAST(8),
+ EXP_MEDIUM_FAST(9),
+ EXP_MEDIUM_FAST(10),
+ EXP_MEDIUM_FAST(11),
+ EXP_MEDIUM_FAST(12),
+ EXP_MEDIUM_FAST(13),
+ EXP_MEDIUM_FAST(14),
+ EXP_MEDIUM_FAST(15),
+ EXP_MEDIUM_FAST(16),
+ EXP_MEDIUM_FAST(17),
+ EXP_MEDIUM_FAST(18),
+ EXP_MEDIUM_FAST(19),
+ EXP_MEDIUM_FAST(20),
+ EXP_MEDIUM_FAST(21),
+ EXP_MEDIUM_FAST(22),
+ EXP_MEDIUM_FAST(23),
+ EXP_MEDIUM_FAST(24),
+ EXP_MEDIUM_FAST(25),
+ EXP_MEDIUM_FAST(26),
+ EXP_MEDIUM_FAST(27),
+ EXP_MEDIUM_FAST(28),
+ EXP_MEDIUM_FAST(29),
+ EXP_MEDIUM_FAST(30),
+ EXP_MEDIUM_FAST(31),
+ EXP_MEDIUM_FAST(32),
+ EXP_MEDIUM_FAST(33),
+ EXP_MEDIUM_FAST(34),
+ EXP_MEDIUM_FAST(35),
+ EXP_MEDIUM_FAST(36),
+ EXP_MEDIUM_FAST(37),
+ EXP_MEDIUM_FAST(38),
+ EXP_MEDIUM_FAST(39),
+ EXP_MEDIUM_FAST(40),
+ EXP_MEDIUM_FAST(41),
+ EXP_MEDIUM_FAST(42),
+ EXP_MEDIUM_FAST(43),
+ EXP_MEDIUM_FAST(44),
+ EXP_MEDIUM_FAST(45),
+ EXP_MEDIUM_FAST(46),
+ EXP_MEDIUM_FAST(47),
+ EXP_MEDIUM_FAST(48),
+ EXP_MEDIUM_FAST(49),
+ EXP_MEDIUM_FAST(50),
+ EXP_MEDIUM_FAST(51),
+ EXP_MEDIUM_FAST(52),
+ EXP_MEDIUM_FAST(53),
+ EXP_MEDIUM_FAST(54),
+ EXP_MEDIUM_FAST(55),
+ EXP_MEDIUM_FAST(56),
+ EXP_MEDIUM_FAST(57),
+ EXP_MEDIUM_FAST(58),
+ EXP_MEDIUM_FAST(59),
+ EXP_MEDIUM_FAST(60),
+ EXP_MEDIUM_FAST(61),
+ EXP_MEDIUM_FAST(62),
+ EXP_MEDIUM_FAST(63),
+ EXP_MEDIUM_FAST(64),
+ EXP_MEDIUM_FAST(65),
+ EXP_MEDIUM_FAST(66),
+ EXP_MEDIUM_FAST(67),
+ EXP_MEDIUM_FAST(68),
+ EXP_MEDIUM_FAST(69),
+ EXP_MEDIUM_FAST(70),
+ EXP_MEDIUM_FAST(71),
+ EXP_MEDIUM_FAST(72),
+ EXP_MEDIUM_FAST(73),
+ EXP_MEDIUM_FAST(74),
+ EXP_MEDIUM_FAST(75),
+ EXP_MEDIUM_FAST(76),
+ EXP_MEDIUM_FAST(77),
+ EXP_MEDIUM_FAST(78),
+ EXP_MEDIUM_FAST(79),
+ EXP_MEDIUM_FAST(80),
+ EXP_MEDIUM_FAST(81),
+ EXP_MEDIUM_FAST(82),
+ EXP_MEDIUM_FAST(83),
+ EXP_MEDIUM_FAST(84),
+ EXP_MEDIUM_FAST(85),
+ EXP_MEDIUM_FAST(86),
+ EXP_MEDIUM_FAST(87),
+ EXP_MEDIUM_FAST(88),
+ EXP_MEDIUM_FAST(89),
+ EXP_MEDIUM_FAST(90),
+ EXP_MEDIUM_FAST(91),
+ EXP_MEDIUM_FAST(92),
+ EXP_MEDIUM_FAST(93),
+ EXP_MEDIUM_FAST(94),
+ EXP_MEDIUM_FAST(95),
+ EXP_MEDIUM_FAST(96),
+ EXP_MEDIUM_FAST(97),
+ EXP_MEDIUM_FAST(98),
+ EXP_MEDIUM_FAST(99),
+ EXP_MEDIUM_FAST(100),
+ }
+};
diff --git a/src/data/pokemon/item_effects.h b/src/data/pokemon/item_effects.h
new file mode 100644
index 000000000..31a78a748
--- /dev/null
+++ b/src/data/pokemon/item_effects.h
@@ -0,0 +1,420 @@
+static const u8 sItemEffect_Potion[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 20,
+};
+
+static const u8 sItemEffect_Antidote[6] = {
+ [3] = ITEM3_POISON,
+};
+
+static const u8 sItemEffect_BurnHeal[6] = {
+ [3] = ITEM3_BURN,
+};
+
+static const u8 sItemEffect_IceHeal[6] = {
+ [3] = ITEM3_FREEZE,
+};
+
+static const u8 sItemEffect_Awakening[6] = {
+ [3] = ITEM3_SLEEP,
+};
+
+static const u8 sItemEffect_ParalyzeHeal[6] = {
+ [3] = ITEM3_PARALYSIS,
+};
+
+static const u8 sItemEffect_FullRestore[7] = {
+ [3] = ITEM3_STATUS_ALL,
+ [4] = ITEM4_HEAL_HP,
+ [6] = -1,
+};
+
+static const u8 sItemEffect_MaxPotion[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = -1,
+};
+
+static const u8 sItemEffect_HyperPotion[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 200,
+};
+
+static const u8 sItemEffect_SuperPotion[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 50,
+};
+
+static const u8 sItemEffect_FullHeal[6] = {
+ [3] = ITEM3_STATUS_ALL,
+};
+
+static const u8 sItemEffect_Revive[7] = {
+ [4] = ITEM4_REVIVE | ITEM4_HEAL_HP,
+ [6] = -2,
+};
+
+static const u8 sItemEffect_MaxRevive[7] = {
+ [4] = ITEM4_REVIVE | ITEM4_HEAL_HP,
+ [6] = -1,
+};
+
+static const u8 sItemEffect_FreshWater[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 50,
+};
+
+static const u8 sItemEffect_SodaPop[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 60,
+};
+
+static const u8 sItemEffect_Lemonade[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 80,
+};
+
+static const u8 sItemEffect_MoomooMilk[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 100,
+};
+
+static const u8 sItemEffect_EnergyPowder[10] = {
+ [4] = ITEM4_HEAL_HP,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = 50,
+ [7] = -5,
+ [8] = -5,
+ [9] = -10,
+};
+
+static const u8 sItemEffect_EnergyRoot[10] = {
+ [4] = ITEM4_HEAL_HP,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = 200,
+ [7] = -10,
+ [8] = -10,
+ [9] = -15,
+};
+
+static const u8 sItemEffect_HealPowder[9] = {
+ [3] = ITEM3_STATUS_ALL,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = -5,
+ [7] = -5,
+ [8] = -10,
+};
+
+static const u8 sItemEffect_RevivalHerb[10] = {
+ [4] = ITEM4_REVIVE | ITEM4_HEAL_HP,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = -1,
+ [7] = -15,
+ [8] = -15,
+ [9] = -20,
+};
+
+static const u8 sItemEffect_Ether[7] = {
+ [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL,
+ [6] = 10,
+};
+
+static const u8 sItemEffect_MaxEther[7] = {
+ [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL,
+ [6] = 0x7F,
+};
+
+static const u8 sItemEffect_Elixir[7] = {
+ [4] = ITEM4_HEAL_PP_ALL,
+ [6] = 10,
+};
+
+static const u8 sItemEffect_MaxElixir[7] = {
+ [4] = ITEM4_HEAL_PP_ALL,
+ [6] = 0x7F,
+};
+
+static const u8 sItemEffect_LavaCookie[6] = {
+ [3] = ITEM3_STATUS_ALL,
+};
+
+static const u8 sItemEffect_BlueFlute[6] = {
+ [3] = ITEM3_SLEEP,
+};
+
+static const u8 sItemEffect_YellowFlute[6] = {
+ [3] = ITEM3_CONFUSION,
+};
+
+static const u8 sItemEffect_RedFlute[6] = {
+ [0] = ITEM0_INFATUATION,
+};
+
+static const u8 sItemEffect_BerryJuice[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 20,
+};
+
+static const u8 sItemEffect_SacredAsh[7] = {
+ [0] = ITEM0_SACRED_ASH,
+ [4] = ITEM4_REVIVE | ITEM4_HEAL_HP,
+ [6] = -1,
+};
+
+static const u8 sItemEffect_HPUp[10] = {
+ [4] = ITEM4_EV_HP,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = 10,
+ [7] = 5,
+ [8] = 3,
+ [9] = 2,
+};
+
+static const u8 sItemEffect_Protein[10] = {
+ [4] = ITEM4_EV_ATK,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = 10,
+ [7] = 5,
+ [8] = 3,
+ [9] = 2,
+};
+
+static const u8 sItemEffect_Iron[10] = {
+ [5] = ITEM5_EV_DEF | ITEM5_FRIENDSHIP_ALL,
+ [6] = 10,
+ [7] = 5,
+ [8] = 3,
+ [9] = 2,
+};
+
+static const u8 sItemEffect_Carbos[10] = {
+ [5] = ITEM5_EV_SPEED | ITEM5_FRIENDSHIP_ALL,
+ [6] = 10,
+ [7] = 5,
+ [8] = 3,
+ [9] = 2,
+};
+
+static const u8 sItemEffect_Calcium[10] = {
+ [5] = ITEM5_EV_SPATK | ITEM5_FRIENDSHIP_ALL,
+ [6] = 10,
+ [7] = 5,
+ [8] = 3,
+ [9] = 2,
+};
+
+static const u8 sItemEffect_RareCandy[10] = {
+ [3] = ITEM3_LEVEL_UP,
+ [4] = ITEM4_REVIVE | ITEM4_HEAL_HP,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = 0xFD,
+ [7] = 5,
+ [8] = 3,
+ [9] = 2,
+};
+
+static const u8 sItemEffect_PPUp[9] = {
+ [4] = ITEM4_PP_UP,
+ [5] = ITEM5_FRIENDSHIP_ALL,
+ [6] = 5,
+ [7] = 3,
+ [8] = 2,
+};
+
+static const u8 sItemEffect_Zinc[10] = {
+ [5] = ITEM5_EV_SPDEF | ITEM5_FRIENDSHIP_ALL,
+ [6] = 10,
+ [7] = 5,
+ [8] = 3,
+ [9] = 2,
+};
+
+static const u8 sItemEffect_PPMax[9] = {
+ [5] = ITEM5_PP_MAX | ITEM5_FRIENDSHIP_ALL,
+ [6] = 5,
+ [7] = 3,
+ [8] = 2,
+};
+
+static const u8 sItemEffect_GuardSpec[8] = {
+ [3] = ITEM3_MIST,
+ [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
+ [6] = 1,
+ [7] = 1,
+};
+
+static const u8 sItemEffect_DireHit[8] = {
+ [0] = 2 << 4,
+ [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
+ [6] = 1,
+ [7] = 1,
+};
+
+static const u8 sItemEffect_XAttack[8] = {
+ [0] = 1,
+ [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
+ [6] = 1,
+ [7] = 1,
+};
+
+static const u8 sItemEffect_XDefend[8] = {
+ [1] = 1 << 4,
+ [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
+ [6] = 1,
+ [7] = 1,
+};
+
+static const u8 sItemEffect_XSpeed[8] = {
+ [1] = 1,
+ [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
+ [6] = 1,
+ [7] = 1,
+};
+
+static const u8 sItemEffect_XAccuracy[8] = {
+ [2] = 1 << 4,
+ [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
+ [6] = 1,
+ [7] = 1,
+};
+
+static const u8 sItemEffect_XSpecial[8] = {
+ [2] = 1,
+ [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID,
+ [6] = 1,
+ [7] = 1,
+};
+
+static const u8 sItemEffect_SunStone[6] = {
+ [4] = ITEM4_EVO_STONE,
+};
+
+static const u8 sItemEffect_MoonStone[6] = {
+ [4] = ITEM4_EVO_STONE,
+};
+
+static const u8 sItemEffect_FireStone[6] = {
+ [4] = ITEM4_EVO_STONE,
+};
+
+static const u8 sItemEffect_ThunderStone[6] = {
+ [4] = ITEM4_EVO_STONE,
+};
+
+static const u8 sItemEffect_WaterStone[6] = {
+ [4] = ITEM4_EVO_STONE,
+};
+
+static const u8 sItemEffect_LeafStone[6] = {
+ [4] = ITEM4_EVO_STONE,
+};
+
+static const u8 sItemEffect_CheriBerry[6] = {
+ [3] = ITEM3_PARALYSIS,
+};
+
+static const u8 sItemEffect_ChestoBerry[6] = {
+ [3] = ITEM3_SLEEP,
+};
+
+static const u8 sItemEffect_PechaBerry[6] = {
+ [3] = ITEM3_POISON,
+};
+
+static const u8 sItemEffect_RawstBerry[6] = {
+ [3] = ITEM3_BURN,
+};
+
+static const u8 sItemEffect_AspearBerry[6] = {
+ [3] = ITEM3_FREEZE,
+};
+
+static const u8 sItemEffect_LeppaBerry[7] = {
+ [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL,
+ [6] = 10,
+};
+
+static const u8 sItemEffect_OranBerry[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 10,
+};
+
+static const u8 sItemEffect_PersimBerry[6] = {
+ [3] = ITEM3_CONFUSION,
+};
+
+static const u8 sItemEffect_LumBerry[6] = {
+ [3] = ITEM3_STATUS_ALL,
+};
+
+static const u8 sItemEffect_SitrusBerry[7] = {
+ [4] = ITEM4_HEAL_HP,
+ [6] = 30,
+};
+
+const u8 *const gItemEffectTable[] =
+{
+ [ITEM_POTION - ITEM_POTION] = sItemEffect_Potion,
+ [ITEM_ANTIDOTE - ITEM_POTION] = sItemEffect_Antidote,
+ [ITEM_BURN_HEAL - ITEM_POTION] = sItemEffect_BurnHeal,
+ [ITEM_ICE_HEAL - ITEM_POTION] = sItemEffect_IceHeal,
+ [ITEM_AWAKENING - ITEM_POTION] = sItemEffect_Awakening,
+ [ITEM_PARALYZE_HEAL - ITEM_POTION] = sItemEffect_ParalyzeHeal,
+ [ITEM_FULL_RESTORE - ITEM_POTION] = sItemEffect_FullRestore,
+ [ITEM_MAX_POTION - ITEM_POTION] = sItemEffect_MaxPotion,
+ [ITEM_HYPER_POTION - ITEM_POTION] = sItemEffect_HyperPotion,
+ [ITEM_SUPER_POTION - ITEM_POTION] = sItemEffect_SuperPotion,
+ [ITEM_FULL_HEAL - ITEM_POTION] = sItemEffect_FullHeal,
+ [ITEM_REVIVE - ITEM_POTION] = sItemEffect_Revive,
+ [ITEM_MAX_REVIVE - ITEM_POTION] = sItemEffect_MaxRevive,
+ [ITEM_FRESH_WATER - ITEM_POTION] = sItemEffect_FreshWater,
+ [ITEM_SODA_POP - ITEM_POTION] = sItemEffect_SodaPop,
+ [ITEM_LEMONADE - ITEM_POTION] = sItemEffect_Lemonade,
+ [ITEM_MOOMOO_MILK - ITEM_POTION] = sItemEffect_MoomooMilk,
+ [ITEM_ENERGY_POWDER - ITEM_POTION] = sItemEffect_EnergyPowder,
+ [ITEM_ENERGY_ROOT - ITEM_POTION] = sItemEffect_EnergyRoot,
+ [ITEM_HEAL_POWDER - ITEM_POTION] = sItemEffect_HealPowder,
+ [ITEM_REVIVAL_HERB - ITEM_POTION] = sItemEffect_RevivalHerb,
+ [ITEM_ETHER - ITEM_POTION] = sItemEffect_Ether,
+ [ITEM_MAX_ETHER - ITEM_POTION] = sItemEffect_MaxEther,
+ [ITEM_ELIXIR - ITEM_POTION] = sItemEffect_Elixir,
+ [ITEM_MAX_ELIXIR - ITEM_POTION] = sItemEffect_MaxElixir,
+ [ITEM_LAVA_COOKIE - ITEM_POTION] = sItemEffect_LavaCookie,
+ [ITEM_BLUE_FLUTE - ITEM_POTION] = sItemEffect_BlueFlute,
+ [ITEM_YELLOW_FLUTE - ITEM_POTION] = sItemEffect_YellowFlute,
+ [ITEM_RED_FLUTE - ITEM_POTION] = sItemEffect_RedFlute,
+ [ITEM_BERRY_JUICE - ITEM_POTION] = sItemEffect_BerryJuice,
+ [ITEM_SACRED_ASH - ITEM_POTION] = sItemEffect_SacredAsh,
+ [ITEM_HP_UP - ITEM_POTION] = sItemEffect_HPUp,
+ [ITEM_PROTEIN - ITEM_POTION] = sItemEffect_Protein,
+ [ITEM_IRON - ITEM_POTION] = sItemEffect_Iron,
+ [ITEM_CARBOS - ITEM_POTION] = sItemEffect_Carbos,
+ [ITEM_CALCIUM - ITEM_POTION] = sItemEffect_Calcium,
+ [ITEM_RARE_CANDY - ITEM_POTION] = sItemEffect_RareCandy,
+ [ITEM_PP_UP - ITEM_POTION] = sItemEffect_PPUp,
+ [ITEM_ZINC - ITEM_POTION] = sItemEffect_Zinc,
+ [ITEM_PP_MAX - ITEM_POTION] = sItemEffect_PPMax,
+ [ITEM_GUARD_SPEC - ITEM_POTION] = sItemEffect_GuardSpec,
+ [ITEM_DIRE_HIT - ITEM_POTION] = sItemEffect_DireHit,
+ [ITEM_X_ATTACK - ITEM_POTION] = sItemEffect_XAttack,
+ [ITEM_X_DEFEND - ITEM_POTION] = sItemEffect_XDefend,
+ [ITEM_X_SPEED - ITEM_POTION] = sItemEffect_XSpeed,
+ [ITEM_X_ACCURACY - ITEM_POTION] = sItemEffect_XAccuracy,
+ [ITEM_X_SPECIAL - ITEM_POTION] = sItemEffect_XSpecial,
+ [ITEM_SUN_STONE - ITEM_POTION] = sItemEffect_SunStone,
+ [ITEM_MOON_STONE - ITEM_POTION] = sItemEffect_MoonStone,
+ [ITEM_FIRE_STONE - ITEM_POTION] = sItemEffect_FireStone,
+ [ITEM_THUNDER_STONE - ITEM_POTION] = sItemEffect_ThunderStone,
+ [ITEM_WATER_STONE - ITEM_POTION] = sItemEffect_WaterStone,
+ [ITEM_LEAF_STONE - ITEM_POTION] = sItemEffect_LeafStone,
+ [ITEM_CHERI_BERRY - ITEM_POTION] = sItemEffect_CheriBerry,
+ [ITEM_CHESTO_BERRY - ITEM_POTION] = sItemEffect_ChestoBerry,
+ [ITEM_PECHA_BERRY - ITEM_POTION] = sItemEffect_PechaBerry,
+ [ITEM_RAWST_BERRY - ITEM_POTION] = sItemEffect_RawstBerry,
+ [ITEM_ASPEAR_BERRY - ITEM_POTION] = sItemEffect_AspearBerry,
+ [ITEM_LEPPA_BERRY - ITEM_POTION] = sItemEffect_LeppaBerry,
+ [ITEM_ORAN_BERRY - ITEM_POTION] = sItemEffect_OranBerry,
+ [ITEM_PERSIM_BERRY - ITEM_POTION] = sItemEffect_PersimBerry,
+ [ITEM_LUM_BERRY - ITEM_POTION] = sItemEffect_LumBerry,
+ [ITEM_SITRUS_BERRY - ITEM_POTION] = sItemEffect_SitrusBerry,
+ [LAST_BERRY_INDEX - ITEM_POTION] = NULL,
+};
diff --git a/src/data/pokemon/level_up_learnset_pointers.h b/src/data/pokemon/level_up_learnset_pointers.h
new file mode 100644
index 000000000..661458ce3
--- /dev/null
+++ b/src/data/pokemon/level_up_learnset_pointers.h
@@ -0,0 +1,415 @@
+const u16 *const gLevelUpLearnsets[NUM_SPECIES] =
+{
+ [SPECIES_NONE] = sBulbasaurLevelUpLearnset,
+ [SPECIES_BULBASAUR] = sBulbasaurLevelUpLearnset,
+ [SPECIES_IVYSAUR] = sIvysaurLevelUpLearnset,
+ [SPECIES_VENUSAUR] = sVenusaurLevelUpLearnset,
+ [SPECIES_CHARMANDER] = sCharmanderLevelUpLearnset,
+ [SPECIES_CHARMELEON] = sCharmeleonLevelUpLearnset,
+ [SPECIES_CHARIZARD] = sCharizardLevelUpLearnset,
+ [SPECIES_SQUIRTLE] = sSquirtleLevelUpLearnset,
+ [SPECIES_WARTORTLE] = sWartortleLevelUpLearnset,
+ [SPECIES_BLASTOISE] = sBlastoiseLevelUpLearnset,
+ [SPECIES_CATERPIE] = sCaterpieLevelUpLearnset,
+ [SPECIES_METAPOD] = sMetapodLevelUpLearnset,
+ [SPECIES_BUTTERFREE] = sButterfreeLevelUpLearnset,
+ [SPECIES_WEEDLE] = sWeedleLevelUpLearnset,
+ [SPECIES_KAKUNA] = sKakunaLevelUpLearnset,
+ [SPECIES_BEEDRILL] = sBeedrillLevelUpLearnset,
+ [SPECIES_PIDGEY] = sPidgeyLevelUpLearnset,
+ [SPECIES_PIDGEOTTO] = sPidgeottoLevelUpLearnset,
+ [SPECIES_PIDGEOT] = sPidgeotLevelUpLearnset,
+ [SPECIES_RATTATA] = sRattataLevelUpLearnset,
+ [SPECIES_RATICATE] = sRaticateLevelUpLearnset,
+ [SPECIES_SPEAROW] = sSpearowLevelUpLearnset,
+ [SPECIES_FEAROW] = sFearowLevelUpLearnset,
+ [SPECIES_EKANS] = sEkansLevelUpLearnset,
+ [SPECIES_ARBOK] = sArbokLevelUpLearnset,
+ [SPECIES_PIKACHU] = sPikachuLevelUpLearnset,
+ [SPECIES_RAICHU] = sRaichuLevelUpLearnset,
+ [SPECIES_SANDSHREW] = sSandshrewLevelUpLearnset,
+ [SPECIES_SANDSLASH] = sSandslashLevelUpLearnset,
+ [SPECIES_NIDORAN_F] = sNidoranFLevelUpLearnset,
+ [SPECIES_NIDORINA] = sNidorinaLevelUpLearnset,
+ [SPECIES_NIDOQUEEN] = sNidoqueenLevelUpLearnset,
+ [SPECIES_NIDORAN_M] = sNidoranMLevelUpLearnset,
+ [SPECIES_NIDORINO] = sNidorinoLevelUpLearnset,
+ [SPECIES_NIDOKING] = sNidokingLevelUpLearnset,
+ [SPECIES_CLEFAIRY] = sClefairyLevelUpLearnset,
+ [SPECIES_CLEFABLE] = sClefableLevelUpLearnset,
+ [SPECIES_VULPIX] = sVulpixLevelUpLearnset,
+ [SPECIES_NINETALES] = sNinetalesLevelUpLearnset,
+ [SPECIES_JIGGLYPUFF] = sJigglypuffLevelUpLearnset,
+ [SPECIES_WIGGLYTUFF] = sWigglytuffLevelUpLearnset,
+ [SPECIES_ZUBAT] = sZubatLevelUpLearnset,
+ [SPECIES_GOLBAT] = sGolbatLevelUpLearnset,
+ [SPECIES_ODDISH] = sOddishLevelUpLearnset,
+ [SPECIES_GLOOM] = sGloomLevelUpLearnset,
+ [SPECIES_VILEPLUME] = sVileplumeLevelUpLearnset,
+ [SPECIES_PARAS] = sParasLevelUpLearnset,
+ [SPECIES_PARASECT] = sParasectLevelUpLearnset,
+ [SPECIES_VENONAT] = sVenonatLevelUpLearnset,
+ [SPECIES_VENOMOTH] = sVenomothLevelUpLearnset,
+ [SPECIES_DIGLETT] = sDiglettLevelUpLearnset,
+ [SPECIES_DUGTRIO] = sDugtrioLevelUpLearnset,
+ [SPECIES_MEOWTH] = sMeowthLevelUpLearnset,
+ [SPECIES_PERSIAN] = sPersianLevelUpLearnset,
+ [SPECIES_PSYDUCK] = sPsyduckLevelUpLearnset,
+ [SPECIES_GOLDUCK] = sGolduckLevelUpLearnset,
+ [SPECIES_MANKEY] = sMankeyLevelUpLearnset,
+ [SPECIES_PRIMEAPE] = sPrimeapeLevelUpLearnset,
+ [SPECIES_GROWLITHE] = sGrowlitheLevelUpLearnset,
+ [SPECIES_ARCANINE] = sArcanineLevelUpLearnset,
+ [SPECIES_POLIWAG] = sPoliwagLevelUpLearnset,
+ [SPECIES_POLIWHIRL] = sPoliwhirlLevelUpLearnset,
+ [SPECIES_POLIWRATH] = sPoliwrathLevelUpLearnset,
+ [SPECIES_ABRA] = sAbraLevelUpLearnset,
+ [SPECIES_KADABRA] = sKadabraLevelUpLearnset,
+ [SPECIES_ALAKAZAM] = sAlakazamLevelUpLearnset,
+ [SPECIES_MACHOP] = sMachopLevelUpLearnset,
+ [SPECIES_MACHOKE] = sMachokeLevelUpLearnset,
+ [SPECIES_MACHAMP] = sMachampLevelUpLearnset,
+ [SPECIES_BELLSPROUT] = sBellsproutLevelUpLearnset,
+ [SPECIES_WEEPINBELL] = sWeepinbellLevelUpLearnset,
+ [SPECIES_VICTREEBEL] = sVictreebelLevelUpLearnset,
+ [SPECIES_TENTACOOL] = sTentacoolLevelUpLearnset,
+ [SPECIES_TENTACRUEL] = sTentacruelLevelUpLearnset,
+ [SPECIES_GEODUDE] = sGeodudeLevelUpLearnset,
+ [SPECIES_GRAVELER] = sGravelerLevelUpLearnset,
+ [SPECIES_GOLEM] = sGolemLevelUpLearnset,
+ [SPECIES_PONYTA] = sPonytaLevelUpLearnset,
+ [SPECIES_RAPIDASH] = sRapidashLevelUpLearnset,
+ [SPECIES_SLOWPOKE] = sSlowpokeLevelUpLearnset,
+ [SPECIES_SLOWBRO] = sSlowbroLevelUpLearnset,
+ [SPECIES_MAGNEMITE] = sMagnemiteLevelUpLearnset,
+ [SPECIES_MAGNETON] = sMagnetonLevelUpLearnset,
+ [SPECIES_FARFETCHD] = sFarfetchdLevelUpLearnset,
+ [SPECIES_DODUO] = sDoduoLevelUpLearnset,
+ [SPECIES_DODRIO] = sDodrioLevelUpLearnset,
+ [SPECIES_SEEL] = sSeelLevelUpLearnset,
+ [SPECIES_DEWGONG] = sDewgongLevelUpLearnset,
+ [SPECIES_GRIMER] = sGrimerLevelUpLearnset,
+ [SPECIES_MUK] = sMukLevelUpLearnset,
+ [SPECIES_SHELLDER] = sShellderLevelUpLearnset,
+ [SPECIES_CLOYSTER] = sCloysterLevelUpLearnset,
+ [SPECIES_GASTLY] = sGastlyLevelUpLearnset,
+ [SPECIES_HAUNTER] = sHaunterLevelUpLearnset,
+ [SPECIES_GENGAR] = sGengarLevelUpLearnset,
+ [SPECIES_ONIX] = sOnixLevelUpLearnset,
+ [SPECIES_DROWZEE] = sDrowzeeLevelUpLearnset,
+ [SPECIES_HYPNO] = sHypnoLevelUpLearnset,
+ [SPECIES_KRABBY] = sKrabbyLevelUpLearnset,
+ [SPECIES_KINGLER] = sKinglerLevelUpLearnset,
+ [SPECIES_VOLTORB] = sVoltorbLevelUpLearnset,
+ [SPECIES_ELECTRODE] = sElectrodeLevelUpLearnset,
+ [SPECIES_EXEGGCUTE] = sExeggcuteLevelUpLearnset,
+ [SPECIES_EXEGGUTOR] = sExeggutorLevelUpLearnset,
+ [SPECIES_CUBONE] = sCuboneLevelUpLearnset,
+ [SPECIES_MAROWAK] = sMarowakLevelUpLearnset,
+ [SPECIES_HITMONLEE] = sHitmonleeLevelUpLearnset,
+ [SPECIES_HITMONCHAN] = sHitmonchanLevelUpLearnset,
+ [SPECIES_LICKITUNG] = sLickitungLevelUpLearnset,
+ [SPECIES_KOFFING] = sKoffingLevelUpLearnset,
+ [SPECIES_WEEZING] = sWeezingLevelUpLearnset,
+ [SPECIES_RHYHORN] = sRhyhornLevelUpLearnset,
+ [SPECIES_RHYDON] = sRhydonLevelUpLearnset,
+ [SPECIES_CHANSEY] = sChanseyLevelUpLearnset,
+ [SPECIES_TANGELA] = sTangelaLevelUpLearnset,
+ [SPECIES_KANGASKHAN] = sKangaskhanLevelUpLearnset,
+ [SPECIES_HORSEA] = sHorseaLevelUpLearnset,
+ [SPECIES_SEADRA] = sSeadraLevelUpLearnset,
+ [SPECIES_GOLDEEN] = sGoldeenLevelUpLearnset,
+ [SPECIES_SEAKING] = sSeakingLevelUpLearnset,
+ [SPECIES_STARYU] = sStaryuLevelUpLearnset,
+ [SPECIES_STARMIE] = sStarmieLevelUpLearnset,
+ [SPECIES_MR_MIME] = sMrMimeLevelUpLearnset,
+ [SPECIES_SCYTHER] = sScytherLevelUpLearnset,
+ [SPECIES_JYNX] = sJynxLevelUpLearnset,
+ [SPECIES_ELECTABUZZ] = sElectabuzzLevelUpLearnset,
+ [SPECIES_MAGMAR] = sMagmarLevelUpLearnset,
+ [SPECIES_PINSIR] = sPinsirLevelUpLearnset,
+ [SPECIES_TAUROS] = sTaurosLevelUpLearnset,
+ [SPECIES_MAGIKARP] = sMagikarpLevelUpLearnset,
+ [SPECIES_GYARADOS] = sGyaradosLevelUpLearnset,
+ [SPECIES_LAPRAS] = sLaprasLevelUpLearnset,
+ [SPECIES_DITTO] = sDittoLevelUpLearnset,
+ [SPECIES_EEVEE] = sEeveeLevelUpLearnset,
+ [SPECIES_VAPOREON] = sVaporeonLevelUpLearnset,
+ [SPECIES_JOLTEON] = sJolteonLevelUpLearnset,
+ [SPECIES_FLAREON] = sFlareonLevelUpLearnset,
+ [SPECIES_PORYGON] = sPorygonLevelUpLearnset,
+ [SPECIES_OMANYTE] = sOmanyteLevelUpLearnset,
+ [SPECIES_OMASTAR] = sOmastarLevelUpLearnset,
+ [SPECIES_KABUTO] = sKabutoLevelUpLearnset,
+ [SPECIES_KABUTOPS] = sKabutopsLevelUpLearnset,
+ [SPECIES_AERODACTYL] = sAerodactylLevelUpLearnset,
+ [SPECIES_SNORLAX] = sSnorlaxLevelUpLearnset,
+ [SPECIES_ARTICUNO] = sArticunoLevelUpLearnset,
+ [SPECIES_ZAPDOS] = sZapdosLevelUpLearnset,
+ [SPECIES_MOLTRES] = sMoltresLevelUpLearnset,
+ [SPECIES_DRATINI] = sDratiniLevelUpLearnset,
+ [SPECIES_DRAGONAIR] = sDragonairLevelUpLearnset,
+ [SPECIES_DRAGONITE] = sDragoniteLevelUpLearnset,
+ [SPECIES_MEWTWO] = sMewtwoLevelUpLearnset,
+ [SPECIES_MEW] = sMewLevelUpLearnset,
+ [SPECIES_CHIKORITA] = sChikoritaLevelUpLearnset,
+ [SPECIES_BAYLEEF] = sBayleefLevelUpLearnset,
+ [SPECIES_MEGANIUM] = sMeganiumLevelUpLearnset,
+ [SPECIES_CYNDAQUIL] = sCyndaquilLevelUpLearnset,
+ [SPECIES_QUILAVA] = sQuilavaLevelUpLearnset,
+ [SPECIES_TYPHLOSION] = sTyphlosionLevelUpLearnset,
+ [SPECIES_TOTODILE] = sTotodileLevelUpLearnset,
+ [SPECIES_CROCONAW] = sCroconawLevelUpLearnset,
+ [SPECIES_FERALIGATR] = sFeraligatrLevelUpLearnset,
+ [SPECIES_SENTRET] = sSentretLevelUpLearnset,
+ [SPECIES_FURRET] = sFurretLevelUpLearnset,
+ [SPECIES_HOOTHOOT] = sHoothootLevelUpLearnset,
+ [SPECIES_NOCTOWL] = sNoctowlLevelUpLearnset,
+ [SPECIES_LEDYBA] = sLedybaLevelUpLearnset,
+ [SPECIES_LEDIAN] = sLedianLevelUpLearnset,
+ [SPECIES_SPINARAK] = sSpinarakLevelUpLearnset,
+ [SPECIES_ARIADOS] = sAriadosLevelUpLearnset,
+ [SPECIES_CROBAT] = sCrobatLevelUpLearnset,
+ [SPECIES_CHINCHOU] = sChinchouLevelUpLearnset,
+ [SPECIES_LANTURN] = sLanturnLevelUpLearnset,
+ [SPECIES_PICHU] = sPichuLevelUpLearnset,
+ [SPECIES_CLEFFA] = sCleffaLevelUpLearnset,
+ [SPECIES_IGGLYBUFF] = sIgglybuffLevelUpLearnset,
+ [SPECIES_TOGEPI] = sTogepiLevelUpLearnset,
+ [SPECIES_TOGETIC] = sTogeticLevelUpLearnset,
+ [SPECIES_NATU] = sNatuLevelUpLearnset,
+ [SPECIES_XATU] = sXatuLevelUpLearnset,
+ [SPECIES_MAREEP] = sMareepLevelUpLearnset,
+ [SPECIES_FLAAFFY] = sFlaaffyLevelUpLearnset,
+ [SPECIES_AMPHAROS] = sAmpharosLevelUpLearnset,
+ [SPECIES_BELLOSSOM] = sBellossomLevelUpLearnset,
+ [SPECIES_MARILL] = sMarillLevelUpLearnset,
+ [SPECIES_AZUMARILL] = sAzumarillLevelUpLearnset,
+ [SPECIES_SUDOWOODO] = sSudowoodoLevelUpLearnset,
+ [SPECIES_POLITOED] = sPolitoedLevelUpLearnset,
+ [SPECIES_HOPPIP] = sHoppipLevelUpLearnset,
+ [SPECIES_SKIPLOOM] = sSkiploomLevelUpLearnset,
+ [SPECIES_JUMPLUFF] = sJumpluffLevelUpLearnset,
+ [SPECIES_AIPOM] = sAipomLevelUpLearnset,
+ [SPECIES_SUNKERN] = sSunkernLevelUpLearnset,
+ [SPECIES_SUNFLORA] = sSunfloraLevelUpLearnset,
+ [SPECIES_YANMA] = sYanmaLevelUpLearnset,
+ [SPECIES_WOOPER] = sWooperLevelUpLearnset,
+ [SPECIES_QUAGSIRE] = sQuagsireLevelUpLearnset,
+ [SPECIES_ESPEON] = sEspeonLevelUpLearnset,
+ [SPECIES_UMBREON] = sUmbreonLevelUpLearnset,
+ [SPECIES_MURKROW] = sMurkrowLevelUpLearnset,
+ [SPECIES_SLOWKING] = sSlowkingLevelUpLearnset,
+ [SPECIES_MISDREAVUS] = sMisdreavusLevelUpLearnset,
+ [SPECIES_UNOWN] = sUnownLevelUpLearnset,
+ [SPECIES_WOBBUFFET] = sWobbuffetLevelUpLearnset,
+ [SPECIES_GIRAFARIG] = sGirafarigLevelUpLearnset,
+ [SPECIES_PINECO] = sPinecoLevelUpLearnset,
+ [SPECIES_FORRETRESS] = sForretressLevelUpLearnset,
+ [SPECIES_DUNSPARCE] = sDunsparceLevelUpLearnset,
+ [SPECIES_GLIGAR] = sGligarLevelUpLearnset,
+ [SPECIES_STEELIX] = sSteelixLevelUpLearnset,
+ [SPECIES_SNUBBULL] = sSnubbullLevelUpLearnset,
+ [SPECIES_GRANBULL] = sGranbullLevelUpLearnset,
+ [SPECIES_QWILFISH] = sQwilfishLevelUpLearnset,
+ [SPECIES_SCIZOR] = sScizorLevelUpLearnset,
+ [SPECIES_SHUCKLE] = sShuckleLevelUpLearnset,
+ [SPECIES_HERACROSS] = sHeracrossLevelUpLearnset,
+ [SPECIES_SNEASEL] = sSneaselLevelUpLearnset,
+ [SPECIES_TEDDIURSA] = sTeddiursaLevelUpLearnset,
+ [SPECIES_URSARING] = sUrsaringLevelUpLearnset,
+ [SPECIES_SLUGMA] = sSlugmaLevelUpLearnset,
+ [SPECIES_MAGCARGO] = sMagcargoLevelUpLearnset,
+ [SPECIES_SWINUB] = sSwinubLevelUpLearnset,
+ [SPECIES_PILOSWINE] = sPiloswineLevelUpLearnset,
+ [SPECIES_CORSOLA] = sCorsolaLevelUpLearnset,
+ [SPECIES_REMORAID] = sRemoraidLevelUpLearnset,
+ [SPECIES_OCTILLERY] = sOctilleryLevelUpLearnset,
+ [SPECIES_DELIBIRD] = sDelibirdLevelUpLearnset,
+ [SPECIES_MANTINE] = sMantineLevelUpLearnset,
+ [SPECIES_SKARMORY] = sSkarmoryLevelUpLearnset,
+ [SPECIES_HOUNDOUR] = sHoundourLevelUpLearnset,
+ [SPECIES_HOUNDOOM] = sHoundoomLevelUpLearnset,
+ [SPECIES_KINGDRA] = sKingdraLevelUpLearnset,
+ [SPECIES_PHANPY] = sPhanpyLevelUpLearnset,
+ [SPECIES_DONPHAN] = sDonphanLevelUpLearnset,
+ [SPECIES_PORYGON2] = sPorygon2LevelUpLearnset,
+ [SPECIES_STANTLER] = sStantlerLevelUpLearnset,
+ [SPECIES_SMEARGLE] = sSmeargleLevelUpLearnset,
+ [SPECIES_TYROGUE] = sTyrogueLevelUpLearnset,
+ [SPECIES_HITMONTOP] = sHitmontopLevelUpLearnset,
+ [SPECIES_SMOOCHUM] = sSmoochumLevelUpLearnset,
+ [SPECIES_ELEKID] = sElekidLevelUpLearnset,
+ [SPECIES_MAGBY] = sMagbyLevelUpLearnset,
+ [SPECIES_MILTANK] = sMiltankLevelUpLearnset,
+ [SPECIES_BLISSEY] = sBlisseyLevelUpLearnset,
+ [SPECIES_RAIKOU] = sRaikouLevelUpLearnset,
+ [SPECIES_ENTEI] = sEnteiLevelUpLearnset,
+ [SPECIES_SUICUNE] = sSuicuneLevelUpLearnset,
+ [SPECIES_LARVITAR] = sLarvitarLevelUpLearnset,
+ [SPECIES_PUPITAR] = sPupitarLevelUpLearnset,
+ [SPECIES_TYRANITAR] = sTyranitarLevelUpLearnset,
+ [SPECIES_LUGIA] = sLugiaLevelUpLearnset,
+ [SPECIES_HO_OH] = sHoOhLevelUpLearnset,
+ [SPECIES_CELEBI] = sCelebiLevelUpLearnset,
+ [SPECIES_OLD_UNOWN_B] = sSpecies252LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_C] = sSpecies253LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_D] = sSpecies254LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_E] = sSpecies255LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_F] = sSpecies256LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_G] = sSpecies257LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_H] = sSpecies258LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_I] = sSpecies259LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_J] = sSpecies260LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_K] = sSpecies261LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_L] = sSpecies262LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_M] = sSpecies263LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_N] = sSpecies264LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_O] = sSpecies265LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_P] = sSpecies266LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_Q] = sSpecies267LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_R] = sSpecies268LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_S] = sSpecies269LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_T] = sSpecies270LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_U] = sSpecies271LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_V] = sSpecies272LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_W] = sSpecies273LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_X] = sSpecies274LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_Y] = sSpecies275LevelUpLearnset,
+ [SPECIES_OLD_UNOWN_Z] = sSpecies276LevelUpLearnset,
+ [SPECIES_TREECKO] = sTreeckoLevelUpLearnset,
+ [SPECIES_GROVYLE] = sGrovyleLevelUpLearnset,
+ [SPECIES_SCEPTILE] = sSceptileLevelUpLearnset,
+ [SPECIES_TORCHIC] = sTorchicLevelUpLearnset,
+ [SPECIES_COMBUSKEN] = sCombuskenLevelUpLearnset,
+ [SPECIES_BLAZIKEN] = sBlazikenLevelUpLearnset,
+ [SPECIES_MUDKIP] = sMudkipLevelUpLearnset,
+ [SPECIES_MARSHTOMP] = sMarshtompLevelUpLearnset,
+ [SPECIES_SWAMPERT] = sSwampertLevelUpLearnset,
+ [SPECIES_POOCHYENA] = sPoochyenaLevelUpLearnset,
+ [SPECIES_MIGHTYENA] = sMightyenaLevelUpLearnset,
+ [SPECIES_ZIGZAGOON] = sZigzagoonLevelUpLearnset,
+ [SPECIES_LINOONE] = sLinooneLevelUpLearnset,
+ [SPECIES_WURMPLE] = sWurmpleLevelUpLearnset,
+ [SPECIES_SILCOON] = sSilcoonLevelUpLearnset,
+ [SPECIES_BEAUTIFLY] = sBeautiflyLevelUpLearnset,
+ [SPECIES_CASCOON] = sCascoonLevelUpLearnset,
+ [SPECIES_DUSTOX] = sDustoxLevelUpLearnset,
+ [SPECIES_LOTAD] = sLotadLevelUpLearnset,
+ [SPECIES_LOMBRE] = sLombreLevelUpLearnset,
+ [SPECIES_LUDICOLO] = sLudicoloLevelUpLearnset,
+ [SPECIES_SEEDOT] = sSeedotLevelUpLearnset,
+ [SPECIES_NUZLEAF] = sNuzleafLevelUpLearnset,
+ [SPECIES_SHIFTRY] = sShiftryLevelUpLearnset,
+ [SPECIES_NINCADA] = sNincadaLevelUpLearnset,
+ [SPECIES_NINJASK] = sNinjaskLevelUpLearnset,
+ [SPECIES_SHEDINJA] = sShedinjaLevelUpLearnset,
+ [SPECIES_TAILLOW] = sTaillowLevelUpLearnset,
+ [SPECIES_SWELLOW] = sSwellowLevelUpLearnset,
+ [SPECIES_SHROOMISH] = sShroomishLevelUpLearnset,
+ [SPECIES_BRELOOM] = sBreloomLevelUpLearnset,
+ [SPECIES_SPINDA] = sSpindaLevelUpLearnset,
+ [SPECIES_WINGULL] = sWingullLevelUpLearnset,
+ [SPECIES_PELIPPER] = sPelipperLevelUpLearnset,
+ [SPECIES_SURSKIT] = sSurskitLevelUpLearnset,
+ [SPECIES_MASQUERAIN] = sMasquerainLevelUpLearnset,
+ [SPECIES_WAILMER] = sWailmerLevelUpLearnset,
+ [SPECIES_WAILORD] = sWailordLevelUpLearnset,
+ [SPECIES_SKITTY] = sSkittyLevelUpLearnset,
+ [SPECIES_DELCATTY] = sDelcattyLevelUpLearnset,
+ [SPECIES_KECLEON] = sKecleonLevelUpLearnset,
+ [SPECIES_BALTOY] = sBaltoyLevelUpLearnset,
+ [SPECIES_CLAYDOL] = sClaydolLevelUpLearnset,
+ [SPECIES_NOSEPASS] = sNosepassLevelUpLearnset,
+ [SPECIES_TORKOAL] = sTorkoalLevelUpLearnset,
+ [SPECIES_SABLEYE] = sSableyeLevelUpLearnset,
+ [SPECIES_BARBOACH] = sBarboachLevelUpLearnset,
+ [SPECIES_WHISCASH] = sWhiscashLevelUpLearnset,
+ [SPECIES_LUVDISC] = sLuvdiscLevelUpLearnset,
+ [SPECIES_CORPHISH] = sCorphishLevelUpLearnset,
+ [SPECIES_CRAWDAUNT] = sCrawdauntLevelUpLearnset,
+ [SPECIES_FEEBAS] = sFeebasLevelUpLearnset,
+ [SPECIES_MILOTIC] = sMiloticLevelUpLearnset,
+ [SPECIES_CARVANHA] = sCarvanhaLevelUpLearnset,
+ [SPECIES_SHARPEDO] = sSharpedoLevelUpLearnset,
+ [SPECIES_TRAPINCH] = sTrapinchLevelUpLearnset,
+ [SPECIES_VIBRAVA] = sVibravaLevelUpLearnset,
+ [SPECIES_FLYGON] = sFlygonLevelUpLearnset,
+ [SPECIES_MAKUHITA] = sMakuhitaLevelUpLearnset,
+ [SPECIES_HARIYAMA] = sHariyamaLevelUpLearnset,
+ [SPECIES_ELECTRIKE] = sElectrikeLevelUpLearnset,
+ [SPECIES_MANECTRIC] = sManectricLevelUpLearnset,
+ [SPECIES_NUMEL] = sNumelLevelUpLearnset,
+ [SPECIES_CAMERUPT] = sCameruptLevelUpLearnset,
+ [SPECIES_SPHEAL] = sSphealLevelUpLearnset,
+ [SPECIES_SEALEO] = sSealeoLevelUpLearnset,
+ [SPECIES_WALREIN] = sWalreinLevelUpLearnset,
+ [SPECIES_CACNEA] = sCacneaLevelUpLearnset,
+ [SPECIES_CACTURNE] = sCacturneLevelUpLearnset,
+ [SPECIES_SNORUNT] = sSnoruntLevelUpLearnset,
+ [SPECIES_GLALIE] = sGlalieLevelUpLearnset,
+ [SPECIES_LUNATONE] = sLunatoneLevelUpLearnset,
+ [SPECIES_SOLROCK] = sSolrockLevelUpLearnset,
+ [SPECIES_AZURILL] = sAzurillLevelUpLearnset,
+ [SPECIES_SPOINK] = sSpoinkLevelUpLearnset,
+ [SPECIES_GRUMPIG] = sGrumpigLevelUpLearnset,
+ [SPECIES_PLUSLE] = sPlusleLevelUpLearnset,
+ [SPECIES_MINUN] = sMinunLevelUpLearnset,
+ [SPECIES_MAWILE] = sMawileLevelUpLearnset,
+ [SPECIES_MEDITITE] = sMedititeLevelUpLearnset,
+ [SPECIES_MEDICHAM] = sMedichamLevelUpLearnset,
+ [SPECIES_SWABLU] = sSwabluLevelUpLearnset,
+ [SPECIES_ALTARIA] = sAltariaLevelUpLearnset,
+ [SPECIES_WYNAUT] = sWynautLevelUpLearnset,
+ [SPECIES_DUSKULL] = sDuskullLevelUpLearnset,
+ [SPECIES_DUSCLOPS] = sDusclopsLevelUpLearnset,
+ [SPECIES_ROSELIA] = sRoseliaLevelUpLearnset,
+ [SPECIES_SLAKOTH] = sSlakothLevelUpLearnset,
+ [SPECIES_VIGOROTH] = sVigorothLevelUpLearnset,
+ [SPECIES_SLAKING] = sSlakingLevelUpLearnset,
+ [SPECIES_GULPIN] = sGulpinLevelUpLearnset,
+ [SPECIES_SWALOT] = sSwalotLevelUpLearnset,
+ [SPECIES_TROPIUS] = sTropiusLevelUpLearnset,
+ [SPECIES_WHISMUR] = sWhismurLevelUpLearnset,
+ [SPECIES_LOUDRED] = sLoudredLevelUpLearnset,
+ [SPECIES_EXPLOUD] = sExploudLevelUpLearnset,
+ [SPECIES_CLAMPERL] = sClamperlLevelUpLearnset,
+ [SPECIES_HUNTAIL] = sHuntailLevelUpLearnset,
+ [SPECIES_GOREBYSS] = sGorebyssLevelUpLearnset,
+ [SPECIES_ABSOL] = sAbsolLevelUpLearnset,
+ [SPECIES_SHUPPET] = sShuppetLevelUpLearnset,
+ [SPECIES_BANETTE] = sBanetteLevelUpLearnset,
+ [SPECIES_SEVIPER] = sSeviperLevelUpLearnset,
+ [SPECIES_ZANGOOSE] = sZangooseLevelUpLearnset,
+ [SPECIES_RELICANTH] = sRelicanthLevelUpLearnset,
+ [SPECIES_ARON] = sAronLevelUpLearnset,
+ [SPECIES_LAIRON] = sLaironLevelUpLearnset,
+ [SPECIES_AGGRON] = sAggronLevelUpLearnset,
+ [SPECIES_CASTFORM] = sCastformLevelUpLearnset,
+ [SPECIES_VOLBEAT] = sVolbeatLevelUpLearnset,
+ [SPECIES_ILLUMISE] = sIllumiseLevelUpLearnset,
+ [SPECIES_LILEEP] = sLileepLevelUpLearnset,
+ [SPECIES_CRADILY] = sCradilyLevelUpLearnset,
+ [SPECIES_ANORITH] = sAnorithLevelUpLearnset,
+ [SPECIES_ARMALDO] = sArmaldoLevelUpLearnset,
+ [SPECIES_RALTS] = sRaltsLevelUpLearnset,
+ [SPECIES_KIRLIA] = sKirliaLevelUpLearnset,
+ [SPECIES_GARDEVOIR] = sGardevoirLevelUpLearnset,
+ [SPECIES_BAGON] = sBagonLevelUpLearnset,
+ [SPECIES_SHELGON] = sShelgonLevelUpLearnset,
+ [SPECIES_SALAMENCE] = sSalamenceLevelUpLearnset,
+ [SPECIES_BELDUM] = sBeldumLevelUpLearnset,
+ [SPECIES_METANG] = sMetangLevelUpLearnset,
+ [SPECIES_METAGROSS] = sMetagrossLevelUpLearnset,
+ [SPECIES_REGIROCK] = sRegirockLevelUpLearnset,
+ [SPECIES_REGICE] = sRegiceLevelUpLearnset,
+ [SPECIES_REGISTEEL] = sRegisteelLevelUpLearnset,
+ [SPECIES_KYOGRE] = sKyogreLevelUpLearnset,
+ [SPECIES_GROUDON] = sGroudonLevelUpLearnset,
+ [SPECIES_RAYQUAZA] = sRayquazaLevelUpLearnset,
+ [SPECIES_LATIAS] = sLatiasLevelUpLearnset,
+ [SPECIES_LATIOS] = sLatiosLevelUpLearnset,
+ [SPECIES_JIRACHI] = sJirachiLevelUpLearnset,
+ [SPECIES_DEOXYS] = sDeoxysLevelUpLearnset,
+ [SPECIES_CHIMECHO] = sChimechoLevelUpLearnset,
+};
diff --git a/src/data/pokemon/level_up_learnsets.h b/src/data/pokemon/level_up_learnsets.h
new file mode 100644
index 000000000..c6d2ec475
--- /dev/null
+++ b/src/data/pokemon/level_up_learnsets.h
@@ -0,0 +1,5682 @@
+#define LEVEL_UP_MOVE(lvl, move) ((lvl << 9) | move)
+#define LEVEL_UP_END 0xFFFF
+
+static const u16 sBulbasaurLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(4, MOVE_GROWL),
+ LEVEL_UP_MOVE(7, MOVE_LEECH_SEED),
+ LEVEL_UP_MOVE(10, MOVE_VINE_WHIP),
+ LEVEL_UP_MOVE(15, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER),
+ LEVEL_UP_MOVE(20, MOVE_RAZOR_LEAF),
+ LEVEL_UP_MOVE(25, MOVE_SWEET_SCENT),
+ LEVEL_UP_MOVE(32, MOVE_GROWTH),
+ LEVEL_UP_MOVE(39, MOVE_SYNTHESIS),
+ LEVEL_UP_MOVE(46, MOVE_SOLAR_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sIvysaurLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_LEECH_SEED),
+ LEVEL_UP_MOVE(4, MOVE_GROWL),
+ LEVEL_UP_MOVE(7, MOVE_LEECH_SEED),
+ LEVEL_UP_MOVE(10, MOVE_VINE_WHIP),
+ LEVEL_UP_MOVE(15, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER),
+ LEVEL_UP_MOVE(22, MOVE_RAZOR_LEAF),
+ LEVEL_UP_MOVE(29, MOVE_SWEET_SCENT),
+ LEVEL_UP_MOVE(38, MOVE_GROWTH),
+ LEVEL_UP_MOVE(47, MOVE_SYNTHESIS),
+ LEVEL_UP_MOVE(56, MOVE_SOLAR_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sVenusaurLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_LEECH_SEED),
+ LEVEL_UP_MOVE(1, MOVE_VINE_WHIP),
+ LEVEL_UP_MOVE(4, MOVE_GROWL),
+ LEVEL_UP_MOVE(7, MOVE_LEECH_SEED),
+ LEVEL_UP_MOVE(10, MOVE_VINE_WHIP),
+ LEVEL_UP_MOVE(15, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER),
+ LEVEL_UP_MOVE(22, MOVE_RAZOR_LEAF),
+ LEVEL_UP_MOVE(29, MOVE_SWEET_SCENT),
+ LEVEL_UP_MOVE(41, MOVE_GROWTH),
+ LEVEL_UP_MOVE(53, MOVE_SYNTHESIS),
+ LEVEL_UP_MOVE(65, MOVE_SOLAR_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sCharmanderLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(7, MOVE_EMBER),
+ LEVEL_UP_MOVE(13, MOVE_METAL_CLAW),
+ LEVEL_UP_MOVE(19, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(25, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(31, MOVE_FLAMETHROWER),
+ LEVEL_UP_MOVE(37, MOVE_SLASH),
+ LEVEL_UP_MOVE(43, MOVE_DRAGON_RAGE),
+ LEVEL_UP_MOVE(49, MOVE_FIRE_SPIN),
+ LEVEL_UP_END
+};
+
+static const u16 sCharmeleonLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_EMBER),
+ LEVEL_UP_MOVE(7, MOVE_EMBER),
+ LEVEL_UP_MOVE(13, MOVE_METAL_CLAW),
+ LEVEL_UP_MOVE(20, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(27, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(34, MOVE_FLAMETHROWER),
+ LEVEL_UP_MOVE(41, MOVE_SLASH),
+ LEVEL_UP_MOVE(48, MOVE_DRAGON_RAGE),
+ LEVEL_UP_MOVE(55, MOVE_FIRE_SPIN),
+ LEVEL_UP_END
+};
+
+static const u16 sCharizardLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_HEAT_WAVE),
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_EMBER),
+ LEVEL_UP_MOVE(1, MOVE_METAL_CLAW),
+ LEVEL_UP_MOVE(7, MOVE_EMBER),
+ LEVEL_UP_MOVE(13, MOVE_METAL_CLAW),
+ LEVEL_UP_MOVE(20, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(27, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(34, MOVE_FLAMETHROWER),
+ LEVEL_UP_MOVE(36, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(44, MOVE_SLASH),
+ LEVEL_UP_MOVE(54, MOVE_DRAGON_RAGE),
+ LEVEL_UP_MOVE(64, MOVE_FIRE_SPIN),
+ LEVEL_UP_END
+};
+
+static const u16 sSquirtleLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(7, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(10, MOVE_WITHDRAW),
+ LEVEL_UP_MOVE(13, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(18, MOVE_BITE),
+ LEVEL_UP_MOVE(23, MOVE_RAPID_SPIN),
+ LEVEL_UP_MOVE(28, MOVE_PROTECT),
+ LEVEL_UP_MOVE(33, MOVE_RAIN_DANCE),
+ LEVEL_UP_MOVE(40, MOVE_SKULL_BASH),
+ LEVEL_UP_MOVE(47, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sWartortleLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(7, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(10, MOVE_WITHDRAW),
+ LEVEL_UP_MOVE(13, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(19, MOVE_BITE),
+ LEVEL_UP_MOVE(25, MOVE_RAPID_SPIN),
+ LEVEL_UP_MOVE(31, MOVE_PROTECT),
+ LEVEL_UP_MOVE(37, MOVE_RAIN_DANCE),
+ LEVEL_UP_MOVE(45, MOVE_SKULL_BASH),
+ LEVEL_UP_MOVE(53, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sBlastoiseLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(1, MOVE_WITHDRAW),
+ LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(7, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(10, MOVE_WITHDRAW),
+ LEVEL_UP_MOVE(13, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(19, MOVE_BITE),
+ LEVEL_UP_MOVE(25, MOVE_RAPID_SPIN),
+ LEVEL_UP_MOVE(31, MOVE_PROTECT),
+ LEVEL_UP_MOVE(42, MOVE_RAIN_DANCE),
+ LEVEL_UP_MOVE(55, MOVE_SKULL_BASH),
+ LEVEL_UP_MOVE(68, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sCaterpieLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_STRING_SHOT),
+ LEVEL_UP_END
+};
+
+static const u16 sMetapodLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(7, MOVE_HARDEN),
+ LEVEL_UP_END
+};
+
+static const u16 sButterfreeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(10, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(13, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(14, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER),
+ LEVEL_UP_MOVE(18, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(23, MOVE_WHIRLWIND),
+ LEVEL_UP_MOVE(28, MOVE_GUST),
+ LEVEL_UP_MOVE(34, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(40, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(47, MOVE_SILVER_WIND),
+ LEVEL_UP_END
+};
+
+static const u16 sWeedleLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(1, MOVE_STRING_SHOT),
+ LEVEL_UP_END
+};
+
+static const u16 sKakunaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(7, MOVE_HARDEN),
+ LEVEL_UP_END
+};
+
+static const u16 sBeedrillLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(10, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(15, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(20, MOVE_TWINEEDLE),
+ LEVEL_UP_MOVE(25, MOVE_RAGE),
+ LEVEL_UP_MOVE(30, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(35, MOVE_PIN_MISSILE),
+ LEVEL_UP_MOVE(40, MOVE_AGILITY),
+ LEVEL_UP_MOVE(45, MOVE_ENDEAVOR),
+ LEVEL_UP_END
+};
+
+static const u16 sPidgeyLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(5, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(9, MOVE_GUST),
+ LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(19, MOVE_WHIRLWIND),
+ LEVEL_UP_MOVE(25, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(31, MOVE_FEATHER_DANCE),
+ LEVEL_UP_MOVE(39, MOVE_AGILITY),
+ LEVEL_UP_MOVE(47, MOVE_MIRROR_MOVE),
+ LEVEL_UP_END
+};
+
+static const u16 sPidgeottoLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_GUST),
+ LEVEL_UP_MOVE(5, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(9, MOVE_GUST),
+ LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(20, MOVE_WHIRLWIND),
+ LEVEL_UP_MOVE(27, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(34, MOVE_FEATHER_DANCE),
+ LEVEL_UP_MOVE(43, MOVE_AGILITY),
+ LEVEL_UP_MOVE(52, MOVE_MIRROR_MOVE),
+ LEVEL_UP_END
+};
+
+static const u16 sPidgeotLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_GUST),
+ LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(5, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(9, MOVE_GUST),
+ LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(20, MOVE_WHIRLWIND),
+ LEVEL_UP_MOVE(27, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(34, MOVE_FEATHER_DANCE),
+ LEVEL_UP_MOVE(48, MOVE_AGILITY),
+ LEVEL_UP_MOVE(62, MOVE_MIRROR_MOVE),
+ LEVEL_UP_END
+};
+
+static const u16 sRattataLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(13, MOVE_HYPER_FANG),
+ LEVEL_UP_MOVE(20, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(27, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(34, MOVE_SUPER_FANG),
+ LEVEL_UP_MOVE(41, MOVE_ENDEAVOR),
+ LEVEL_UP_END
+};
+
+static const u16 sRaticateLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(13, MOVE_HYPER_FANG),
+ LEVEL_UP_MOVE(20, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(30, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(40, MOVE_SUPER_FANG),
+ LEVEL_UP_MOVE(50, MOVE_ENDEAVOR),
+ LEVEL_UP_END
+};
+
+static const u16 sSpearowLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(7, MOVE_LEER),
+ LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(19, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(25, MOVE_AERIAL_ACE),
+ LEVEL_UP_MOVE(31, MOVE_MIRROR_MOVE),
+ LEVEL_UP_MOVE(37, MOVE_DRILL_PECK),
+ LEVEL_UP_MOVE(43, MOVE_AGILITY),
+ LEVEL_UP_END
+};
+
+static const u16 sFearowLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(7, MOVE_LEER),
+ LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(26, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(32, MOVE_MIRROR_MOVE),
+ LEVEL_UP_MOVE(40, MOVE_DRILL_PECK),
+ LEVEL_UP_MOVE(47, MOVE_AGILITY),
+ LEVEL_UP_END
+};
+
+static const u16 sEkansLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WRAP),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(8, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(13, MOVE_BITE),
+ LEVEL_UP_MOVE(20, MOVE_GLARE),
+ LEVEL_UP_MOVE(25, MOVE_SCREECH),
+ LEVEL_UP_MOVE(32, MOVE_ACID),
+ LEVEL_UP_MOVE(37, MOVE_STOCKPILE),
+ LEVEL_UP_MOVE(37, MOVE_SWALLOW),
+ LEVEL_UP_MOVE(37, MOVE_SPIT_UP),
+ LEVEL_UP_MOVE(44, MOVE_HAZE),
+ LEVEL_UP_END
+};
+
+static const u16 sArbokLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WRAP),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(8, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(13, MOVE_BITE),
+ LEVEL_UP_MOVE(20, MOVE_GLARE),
+ LEVEL_UP_MOVE(28, MOVE_SCREECH),
+ LEVEL_UP_MOVE(38, MOVE_ACID),
+ LEVEL_UP_MOVE(46, MOVE_STOCKPILE),
+ LEVEL_UP_MOVE(46, MOVE_SWALLOW),
+ LEVEL_UP_MOVE(46, MOVE_SPIT_UP),
+ LEVEL_UP_MOVE(56, MOVE_HAZE),
+ LEVEL_UP_END
+};
+
+static const u16 sPikachuLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(6, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(8, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(15, MOVE_DOUBLE_TEAM),
+ LEVEL_UP_MOVE(20, MOVE_SLAM),
+ LEVEL_UP_MOVE(26, MOVE_THUNDERBOLT),
+ LEVEL_UP_MOVE(33, MOVE_AGILITY),
+ LEVEL_UP_MOVE(41, MOVE_THUNDER),
+ LEVEL_UP_MOVE(50, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_END
+};
+
+static const u16 sRaichuLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_THUNDERBOLT),
+ LEVEL_UP_END
+};
+
+static const u16 sSandshrewLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(6, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(11, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(17, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(23, MOVE_SLASH),
+ LEVEL_UP_MOVE(30, MOVE_SWIFT),
+ LEVEL_UP_MOVE(37, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(45, MOVE_SAND_TOMB),
+ LEVEL_UP_MOVE(53, MOVE_SANDSTORM),
+ LEVEL_UP_END
+};
+
+static const u16 sSandslashLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(6, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(11, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(17, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(24, MOVE_SLASH),
+ LEVEL_UP_MOVE(33, MOVE_SWIFT),
+ LEVEL_UP_MOVE(42, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(52, MOVE_SAND_TOMB),
+ LEVEL_UP_MOVE(62, MOVE_SANDSTORM),
+ LEVEL_UP_END
+};
+
+static const u16 sNidoranFLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(8, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK),
+ LEVEL_UP_MOVE(17, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(20, MOVE_BITE),
+ LEVEL_UP_MOVE(23, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(30, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(38, MOVE_FLATTER),
+ LEVEL_UP_MOVE(47, MOVE_CRUNCH),
+ LEVEL_UP_END
+};
+
+static const u16 sNidorinaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(8, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK),
+ LEVEL_UP_MOVE(18, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(22, MOVE_BITE),
+ LEVEL_UP_MOVE(26, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(34, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(43, MOVE_FLATTER),
+ LEVEL_UP_MOVE(53, MOVE_CRUNCH),
+ LEVEL_UP_END
+};
+
+static const u16 sNidoqueenLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_DOUBLE_KICK),
+ LEVEL_UP_MOVE(1, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(22, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(43, MOVE_SUPERPOWER),
+ LEVEL_UP_END
+};
+
+static const u16 sNidoranMLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(8, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK),
+ LEVEL_UP_MOVE(17, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(20, MOVE_HORN_ATTACK),
+ LEVEL_UP_MOVE(23, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(30, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(38, MOVE_FLATTER),
+ LEVEL_UP_MOVE(47, MOVE_HORN_DRILL),
+ LEVEL_UP_END
+};
+
+static const u16 sNidorinoLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(8, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK),
+ LEVEL_UP_MOVE(18, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(22, MOVE_HORN_ATTACK),
+ LEVEL_UP_MOVE(26, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(34, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(43, MOVE_FLATTER),
+ LEVEL_UP_MOVE(53, MOVE_HORN_DRILL),
+ LEVEL_UP_END
+};
+
+static const u16 sNidokingLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(1, MOVE_DOUBLE_KICK),
+ LEVEL_UP_MOVE(1, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(22, MOVE_THRASH),
+ LEVEL_UP_MOVE(43, MOVE_MEGAHORN),
+ LEVEL_UP_END
+};
+
+static const u16 sClefairyLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(5, MOVE_ENCORE),
+ LEVEL_UP_MOVE(9, MOVE_SING),
+ LEVEL_UP_MOVE(13, MOVE_DOUBLE_SLAP),
+ LEVEL_UP_MOVE(17, MOVE_FOLLOW_ME),
+ LEVEL_UP_MOVE(21, MOVE_MINIMIZE),
+ LEVEL_UP_MOVE(25, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(29, MOVE_METRONOME),
+ LEVEL_UP_MOVE(33, MOVE_COSMIC_POWER),
+ LEVEL_UP_MOVE(37, MOVE_MOONLIGHT),
+ LEVEL_UP_MOVE(41, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(45, MOVE_METEOR_MASH),
+ LEVEL_UP_END
+};
+
+static const u16 sClefableLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SING),
+ LEVEL_UP_MOVE(1, MOVE_DOUBLE_SLAP),
+ LEVEL_UP_MOVE(1, MOVE_MINIMIZE),
+ LEVEL_UP_MOVE(1, MOVE_METRONOME),
+ LEVEL_UP_END
+};
+
+static const u16 sVulpixLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_EMBER),
+ LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(9, MOVE_ROAR),
+ LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(17, MOVE_WILL_O_WISP),
+ LEVEL_UP_MOVE(21, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(25, MOVE_IMPRISON),
+ LEVEL_UP_MOVE(29, MOVE_FLAMETHROWER),
+ LEVEL_UP_MOVE(33, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(37, MOVE_GRUDGE),
+ LEVEL_UP_MOVE(41, MOVE_FIRE_SPIN),
+ LEVEL_UP_END
+};
+
+static const u16 sNinetalesLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_EMBER),
+ LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(1, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(45, MOVE_FIRE_SPIN),
+ LEVEL_UP_END
+};
+
+static const u16 sJigglypuffLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SING),
+ LEVEL_UP_MOVE(4, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(9, MOVE_POUND),
+ LEVEL_UP_MOVE(14, MOVE_DISABLE),
+ LEVEL_UP_MOVE(19, MOVE_ROLLOUT),
+ LEVEL_UP_MOVE(24, MOVE_DOUBLE_SLAP),
+ LEVEL_UP_MOVE(29, MOVE_REST),
+ LEVEL_UP_MOVE(34, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(39, MOVE_MIMIC),
+ LEVEL_UP_MOVE(44, MOVE_HYPER_VOICE),
+ LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sWigglytuffLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SING),
+ LEVEL_UP_MOVE(1, MOVE_DISABLE),
+ LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(1, MOVE_DOUBLE_SLAP),
+ LEVEL_UP_END
+};
+
+static const u16 sZubatLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_LEECH_LIFE),
+ LEVEL_UP_MOVE(6, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(11, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(16, MOVE_BITE),
+ LEVEL_UP_MOVE(21, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(26, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(31, MOVE_AIR_CUTTER),
+ LEVEL_UP_MOVE(36, MOVE_MEAN_LOOK),
+ LEVEL_UP_MOVE(41, MOVE_POISON_FANG),
+ LEVEL_UP_MOVE(46, MOVE_HAZE),
+ LEVEL_UP_END
+};
+
+static const u16 sGolbatLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCREECH),
+ LEVEL_UP_MOVE(1, MOVE_LEECH_LIFE),
+ LEVEL_UP_MOVE(1, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(6, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(11, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(16, MOVE_BITE),
+ LEVEL_UP_MOVE(21, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(28, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(35, MOVE_AIR_CUTTER),
+ LEVEL_UP_MOVE(42, MOVE_MEAN_LOOK),
+ LEVEL_UP_MOVE(49, MOVE_POISON_FANG),
+ LEVEL_UP_MOVE(56, MOVE_HAZE),
+ LEVEL_UP_END
+};
+
+static const u16 sOddishLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ABSORB),
+ LEVEL_UP_MOVE(7, MOVE_SWEET_SCENT),
+ LEVEL_UP_MOVE(14, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(16, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(18, MOVE_SLEEP_POWDER),
+ LEVEL_UP_MOVE(23, MOVE_ACID),
+ LEVEL_UP_MOVE(32, MOVE_MOONLIGHT),
+ LEVEL_UP_MOVE(39, MOVE_PETAL_DANCE),
+ LEVEL_UP_END
+};
+
+static const u16 sGloomLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ABSORB),
+ LEVEL_UP_MOVE(1, MOVE_SWEET_SCENT),
+ LEVEL_UP_MOVE(1, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(7, MOVE_SWEET_SCENT),
+ LEVEL_UP_MOVE(14, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(16, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(18, MOVE_SLEEP_POWDER),
+ LEVEL_UP_MOVE(24, MOVE_ACID),
+ LEVEL_UP_MOVE(35, MOVE_MOONLIGHT),
+ LEVEL_UP_MOVE(44, MOVE_PETAL_DANCE),
+ LEVEL_UP_END
+};
+
+static const u16 sVileplumeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ABSORB),
+ LEVEL_UP_MOVE(1, MOVE_AROMATHERAPY),
+ LEVEL_UP_MOVE(1, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(1, MOVE_MEGA_DRAIN),
+ LEVEL_UP_MOVE(44, MOVE_PETAL_DANCE),
+ LEVEL_UP_END
+};
+
+static const u16 sParasLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(7, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(13, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(19, MOVE_LEECH_LIFE),
+ LEVEL_UP_MOVE(25, MOVE_SPORE),
+ LEVEL_UP_MOVE(31, MOVE_SLASH),
+ LEVEL_UP_MOVE(37, MOVE_GROWTH),
+ LEVEL_UP_MOVE(43, MOVE_GIGA_DRAIN),
+ LEVEL_UP_MOVE(49, MOVE_AROMATHERAPY),
+ LEVEL_UP_END
+};
+
+static const u16 sParasectLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(1, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(7, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(13, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(19, MOVE_LEECH_LIFE),
+ LEVEL_UP_MOVE(27, MOVE_SPORE),
+ LEVEL_UP_MOVE(35, MOVE_SLASH),
+ LEVEL_UP_MOVE(43, MOVE_GROWTH),
+ LEVEL_UP_MOVE(51, MOVE_GIGA_DRAIN),
+ LEVEL_UP_MOVE(59, MOVE_AROMATHERAPY),
+ LEVEL_UP_END
+};
+
+static const u16 sVenonatLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_DISABLE),
+ LEVEL_UP_MOVE(1, MOVE_FORESIGHT),
+ LEVEL_UP_MOVE(9, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(17, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(20, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(25, MOVE_LEECH_LIFE),
+ LEVEL_UP_MOVE(28, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(33, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(36, MOVE_SLEEP_POWDER),
+ LEVEL_UP_MOVE(41, MOVE_PSYCHIC),
+ LEVEL_UP_END
+};
+
+static const u16 sVenomothLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SILVER_WIND),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_DISABLE),
+ LEVEL_UP_MOVE(1, MOVE_FORESIGHT),
+ LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(9, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(17, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(20, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(25, MOVE_LEECH_LIFE),
+ LEVEL_UP_MOVE(28, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(31, MOVE_GUST),
+ LEVEL_UP_MOVE(36, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(42, MOVE_SLEEP_POWDER),
+ LEVEL_UP_MOVE(52, MOVE_PSYCHIC),
+ LEVEL_UP_END
+};
+
+static const u16 sDiglettLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(5, MOVE_GROWL),
+ LEVEL_UP_MOVE(9, MOVE_MAGNITUDE),
+ LEVEL_UP_MOVE(17, MOVE_DIG),
+ LEVEL_UP_MOVE(21, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(25, MOVE_MUD_SLAP),
+ LEVEL_UP_MOVE(33, MOVE_SLASH),
+ LEVEL_UP_MOVE(41, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(49, MOVE_FISSURE),
+ LEVEL_UP_END
+};
+
+static const u16 sDugtrioLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TRI_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(5, MOVE_GROWL),
+ LEVEL_UP_MOVE(9, MOVE_MAGNITUDE),
+ LEVEL_UP_MOVE(17, MOVE_DIG),
+ LEVEL_UP_MOVE(21, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(25, MOVE_MUD_SLAP),
+ LEVEL_UP_MOVE(26, MOVE_SAND_TOMB),
+ LEVEL_UP_MOVE(38, MOVE_SLASH),
+ LEVEL_UP_MOVE(51, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(64, MOVE_FISSURE),
+ LEVEL_UP_END
+};
+
+static const u16 sMeowthLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(10, MOVE_BITE),
+ LEVEL_UP_MOVE(18, MOVE_PAY_DAY),
+ LEVEL_UP_MOVE(25, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(31, MOVE_SCREECH),
+ LEVEL_UP_MOVE(36, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(40, MOVE_SLASH),
+ LEVEL_UP_MOVE(43, MOVE_FAKE_OUT),
+ LEVEL_UP_MOVE(45, MOVE_SWAGGER),
+ LEVEL_UP_END
+};
+
+static const u16 sPersianLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(10, MOVE_BITE),
+ LEVEL_UP_MOVE(18, MOVE_PAY_DAY),
+ LEVEL_UP_MOVE(25, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(34, MOVE_SCREECH),
+ LEVEL_UP_MOVE(42, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(49, MOVE_SLASH),
+ LEVEL_UP_MOVE(55, MOVE_FAKE_OUT),
+ LEVEL_UP_MOVE(61, MOVE_SWAGGER),
+ LEVEL_UP_END
+};
+
+static const u16 sPsyduckLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WATER_SPORT),
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(10, MOVE_DISABLE),
+ LEVEL_UP_MOVE(16, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(23, MOVE_SCREECH),
+ LEVEL_UP_MOVE(31, MOVE_PSYCH_UP),
+ LEVEL_UP_MOVE(40, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sGolduckLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WATER_SPORT),
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_DISABLE),
+ LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(10, MOVE_DISABLE),
+ LEVEL_UP_MOVE(16, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(23, MOVE_SCREECH),
+ LEVEL_UP_MOVE(31, MOVE_PSYCH_UP),
+ LEVEL_UP_MOVE(44, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(58, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sMankeyLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(6, MOVE_LOW_KICK),
+ LEVEL_UP_MOVE(11, MOVE_KARATE_CHOP),
+ LEVEL_UP_MOVE(16, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(26, MOVE_SEISMIC_TOSS),
+ LEVEL_UP_MOVE(31, MOVE_CROSS_CHOP),
+ LEVEL_UP_MOVE(36, MOVE_SWAGGER),
+ LEVEL_UP_MOVE(41, MOVE_SCREECH),
+ LEVEL_UP_MOVE(46, MOVE_THRASH),
+ LEVEL_UP_END
+};
+
+static const u16 sPrimeapeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_LOW_KICK),
+ LEVEL_UP_MOVE(1, MOVE_RAGE),
+ LEVEL_UP_MOVE(6, MOVE_LOW_KICK),
+ LEVEL_UP_MOVE(11, MOVE_KARATE_CHOP),
+ LEVEL_UP_MOVE(16, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(26, MOVE_SEISMIC_TOSS),
+ LEVEL_UP_MOVE(28, MOVE_RAGE),
+ LEVEL_UP_MOVE(35, MOVE_CROSS_CHOP),
+ LEVEL_UP_MOVE(44, MOVE_SWAGGER),
+ LEVEL_UP_MOVE(53, MOVE_SCREECH),
+ LEVEL_UP_MOVE(62, MOVE_THRASH),
+ LEVEL_UP_END
+};
+
+static const u16 sGrowlitheLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(1, MOVE_ROAR),
+ LEVEL_UP_MOVE(7, MOVE_EMBER),
+ LEVEL_UP_MOVE(13, MOVE_LEER),
+ LEVEL_UP_MOVE(19, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(31, MOVE_FLAME_WHEEL),
+ LEVEL_UP_MOVE(37, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(43, MOVE_AGILITY),
+ LEVEL_UP_MOVE(49, MOVE_FLAMETHROWER),
+ LEVEL_UP_END
+};
+
+static const u16 sArcanineLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(1, MOVE_ROAR),
+ LEVEL_UP_MOVE(1, MOVE_EMBER),
+ LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(49, MOVE_EXTREME_SPEED),
+ LEVEL_UP_END
+};
+
+static const u16 sPoliwagLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(7, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(13, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(19, MOVE_DOUBLE_SLAP),
+ LEVEL_UP_MOVE(25, MOVE_RAIN_DANCE),
+ LEVEL_UP_MOVE(31, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(37, MOVE_BELLY_DRUM),
+ LEVEL_UP_MOVE(43, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sPoliwhirlLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(7, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(13, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(19, MOVE_DOUBLE_SLAP),
+ LEVEL_UP_MOVE(27, MOVE_RAIN_DANCE),
+ LEVEL_UP_MOVE(35, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(43, MOVE_BELLY_DRUM),
+ LEVEL_UP_MOVE(51, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sPoliwrathLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(1, MOVE_DOUBLE_SLAP),
+ LEVEL_UP_MOVE(1, MOVE_SUBMISSION),
+ LEVEL_UP_MOVE(35, MOVE_SUBMISSION),
+ LEVEL_UP_MOVE(51, MOVE_MIND_READER),
+ LEVEL_UP_END
+};
+
+static const u16 sAbraLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TELEPORT),
+ LEVEL_UP_END
+};
+
+static const u16 sKadabraLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TELEPORT),
+ LEVEL_UP_MOVE(1, MOVE_KINESIS),
+ LEVEL_UP_MOVE(1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(16, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(18, MOVE_DISABLE),
+ LEVEL_UP_MOVE(21, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(23, MOVE_REFLECT),
+ LEVEL_UP_MOVE(25, MOVE_RECOVER),
+ LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(33, MOVE_ROLE_PLAY),
+ LEVEL_UP_MOVE(36, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(43, MOVE_TRICK),
+ LEVEL_UP_END
+};
+
+static const u16 sAlakazamLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TELEPORT),
+ LEVEL_UP_MOVE(1, MOVE_KINESIS),
+ LEVEL_UP_MOVE(1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(16, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(18, MOVE_DISABLE),
+ LEVEL_UP_MOVE(21, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(23, MOVE_REFLECT),
+ LEVEL_UP_MOVE(25, MOVE_RECOVER),
+ LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(33, MOVE_CALM_MIND),
+ LEVEL_UP_MOVE(36, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(43, MOVE_TRICK),
+ LEVEL_UP_END
+};
+
+static const u16 sMachopLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_LOW_KICK),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(13, MOVE_KARATE_CHOP),
+ LEVEL_UP_MOVE(19, MOVE_SEISMIC_TOSS),
+ LEVEL_UP_MOVE(22, MOVE_FORESIGHT),
+ LEVEL_UP_MOVE(25, MOVE_REVENGE),
+ LEVEL_UP_MOVE(31, MOVE_VITAL_THROW),
+ LEVEL_UP_MOVE(37, MOVE_SUBMISSION),
+ LEVEL_UP_MOVE(40, MOVE_CROSS_CHOP),
+ LEVEL_UP_MOVE(43, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(49, MOVE_DYNAMIC_PUNCH),
+ LEVEL_UP_END
+};
+
+static const u16 sMachokeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_LOW_KICK),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(13, MOVE_KARATE_CHOP),
+ LEVEL_UP_MOVE(19, MOVE_SEISMIC_TOSS),
+ LEVEL_UP_MOVE(22, MOVE_FORESIGHT),
+ LEVEL_UP_MOVE(25, MOVE_REVENGE),
+ LEVEL_UP_MOVE(33, MOVE_VITAL_THROW),
+ LEVEL_UP_MOVE(41, MOVE_SUBMISSION),
+ LEVEL_UP_MOVE(46, MOVE_CROSS_CHOP),
+ LEVEL_UP_MOVE(51, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(59, MOVE_DYNAMIC_PUNCH),
+ LEVEL_UP_END
+};
+
+static const u16 sMachampLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_LOW_KICK),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(13, MOVE_KARATE_CHOP),
+ LEVEL_UP_MOVE(19, MOVE_SEISMIC_TOSS),
+ LEVEL_UP_MOVE(22, MOVE_FORESIGHT),
+ LEVEL_UP_MOVE(25, MOVE_REVENGE),
+ LEVEL_UP_MOVE(33, MOVE_VITAL_THROW),
+ LEVEL_UP_MOVE(41, MOVE_SUBMISSION),
+ LEVEL_UP_MOVE(46, MOVE_CROSS_CHOP),
+ LEVEL_UP_MOVE(51, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(59, MOVE_DYNAMIC_PUNCH),
+ LEVEL_UP_END
+};
+
+static const u16 sBellsproutLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_VINE_WHIP),
+ LEVEL_UP_MOVE(6, MOVE_GROWTH),
+ LEVEL_UP_MOVE(11, MOVE_WRAP),
+ LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER),
+ LEVEL_UP_MOVE(17, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(19, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(23, MOVE_ACID),
+ LEVEL_UP_MOVE(30, MOVE_SWEET_SCENT),
+ LEVEL_UP_MOVE(37, MOVE_RAZOR_LEAF),
+ LEVEL_UP_MOVE(45, MOVE_SLAM),
+ LEVEL_UP_END
+};
+
+static const u16 sWeepinbellLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_VINE_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_GROWTH),
+ LEVEL_UP_MOVE(1, MOVE_WRAP),
+ LEVEL_UP_MOVE(6, MOVE_GROWTH),
+ LEVEL_UP_MOVE(11, MOVE_WRAP),
+ LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER),
+ LEVEL_UP_MOVE(17, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(19, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(24, MOVE_ACID),
+ LEVEL_UP_MOVE(33, MOVE_SWEET_SCENT),
+ LEVEL_UP_MOVE(42, MOVE_RAZOR_LEAF),
+ LEVEL_UP_MOVE(54, MOVE_SLAM),
+ LEVEL_UP_END
+};
+
+static const u16 sVictreebelLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_STOCKPILE),
+ LEVEL_UP_MOVE(1, MOVE_SPIT_UP),
+ LEVEL_UP_MOVE(1, MOVE_SWALLOW),
+ LEVEL_UP_MOVE(1, MOVE_VINE_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_SLEEP_POWDER),
+ LEVEL_UP_MOVE(1, MOVE_SWEET_SCENT),
+ LEVEL_UP_MOVE(1, MOVE_RAZOR_LEAF),
+ LEVEL_UP_END
+};
+
+static const u16 sTentacoolLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(6, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(12, MOVE_CONSTRICT),
+ LEVEL_UP_MOVE(19, MOVE_ACID),
+ LEVEL_UP_MOVE(25, MOVE_BUBBLE_BEAM),
+ LEVEL_UP_MOVE(30, MOVE_WRAP),
+ LEVEL_UP_MOVE(36, MOVE_BARRIER),
+ LEVEL_UP_MOVE(43, MOVE_SCREECH),
+ LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sTentacruelLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(1, MOVE_CONSTRICT),
+ LEVEL_UP_MOVE(6, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(12, MOVE_CONSTRICT),
+ LEVEL_UP_MOVE(19, MOVE_ACID),
+ LEVEL_UP_MOVE(25, MOVE_BUBBLE_BEAM),
+ LEVEL_UP_MOVE(30, MOVE_WRAP),
+ LEVEL_UP_MOVE(38, MOVE_BARRIER),
+ LEVEL_UP_MOVE(47, MOVE_SCREECH),
+ LEVEL_UP_MOVE(55, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sGeodudeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(6, MOVE_MUD_SPORT),
+ LEVEL_UP_MOVE(11, MOVE_ROCK_THROW),
+ LEVEL_UP_MOVE(16, MOVE_MAGNITUDE),
+ LEVEL_UP_MOVE(21, MOVE_SELF_DESTRUCT),
+ LEVEL_UP_MOVE(26, MOVE_ROLLOUT),
+ LEVEL_UP_MOVE(31, MOVE_ROCK_BLAST),
+ LEVEL_UP_MOVE(36, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(41, MOVE_EXPLOSION),
+ LEVEL_UP_MOVE(46, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sGravelerLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(1, MOVE_MUD_SPORT),
+ LEVEL_UP_MOVE(1, MOVE_ROCK_THROW),
+ LEVEL_UP_MOVE(6, MOVE_MUD_SPORT),
+ LEVEL_UP_MOVE(11, MOVE_ROCK_THROW),
+ LEVEL_UP_MOVE(16, MOVE_MAGNITUDE),
+ LEVEL_UP_MOVE(21, MOVE_SELF_DESTRUCT),
+ LEVEL_UP_MOVE(29, MOVE_ROLLOUT),
+ LEVEL_UP_MOVE(37, MOVE_ROCK_BLAST),
+ LEVEL_UP_MOVE(45, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(53, MOVE_EXPLOSION),
+ LEVEL_UP_MOVE(62, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sGolemLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(1, MOVE_MUD_SPORT),
+ LEVEL_UP_MOVE(1, MOVE_ROCK_THROW),
+ LEVEL_UP_MOVE(6, MOVE_MUD_SPORT),
+ LEVEL_UP_MOVE(11, MOVE_ROCK_THROW),
+ LEVEL_UP_MOVE(16, MOVE_MAGNITUDE),
+ LEVEL_UP_MOVE(21, MOVE_SELF_DESTRUCT),
+ LEVEL_UP_MOVE(29, MOVE_ROLLOUT),
+ LEVEL_UP_MOVE(37, MOVE_ROCK_BLAST),
+ LEVEL_UP_MOVE(45, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(53, MOVE_EXPLOSION),
+ LEVEL_UP_MOVE(62, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sPonytaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(5, MOVE_GROWL),
+ LEVEL_UP_MOVE(9, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(14, MOVE_EMBER),
+ LEVEL_UP_MOVE(19, MOVE_STOMP),
+ LEVEL_UP_MOVE(25, MOVE_FIRE_SPIN),
+ LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(38, MOVE_AGILITY),
+ LEVEL_UP_MOVE(45, MOVE_BOUNCE),
+ LEVEL_UP_MOVE(53, MOVE_FIRE_BLAST),
+ LEVEL_UP_END
+};
+
+static const u16 sRapidashLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_EMBER),
+ LEVEL_UP_MOVE(5, MOVE_GROWL),
+ LEVEL_UP_MOVE(9, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(14, MOVE_EMBER),
+ LEVEL_UP_MOVE(19, MOVE_STOMP),
+ LEVEL_UP_MOVE(25, MOVE_FIRE_SPIN),
+ LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(38, MOVE_AGILITY),
+ LEVEL_UP_MOVE(40, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(50, MOVE_BOUNCE),
+ LEVEL_UP_MOVE(63, MOVE_FIRE_BLAST),
+ LEVEL_UP_END
+};
+
+static const u16 sSlowpokeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_CURSE),
+ LEVEL_UP_MOVE(1, MOVE_YAWN),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(6, MOVE_GROWL),
+ LEVEL_UP_MOVE(13, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(17, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(24, MOVE_DISABLE),
+ LEVEL_UP_MOVE(29, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(36, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(40, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(47, MOVE_PSYCH_UP),
+ LEVEL_UP_END
+};
+
+static const u16 sSlowbroLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_CURSE),
+ LEVEL_UP_MOVE(1, MOVE_YAWN),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(6, MOVE_GROWL),
+ LEVEL_UP_MOVE(13, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(17, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(24, MOVE_DISABLE),
+ LEVEL_UP_MOVE(29, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(36, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(37, MOVE_WITHDRAW),
+ LEVEL_UP_MOVE(44, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(55, MOVE_PSYCH_UP),
+ LEVEL_UP_END
+};
+
+static const u16 sMagnemiteLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_METAL_SOUND),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(6, MOVE_THUNDER_SHOCK),
+ LEVEL_UP_MOVE(11, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(16, MOVE_SONIC_BOOM),
+ LEVEL_UP_MOVE(21, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(26, MOVE_SPARK),
+ LEVEL_UP_MOVE(32, MOVE_LOCK_ON),
+ LEVEL_UP_MOVE(38, MOVE_SWIFT),
+ LEVEL_UP_MOVE(44, MOVE_SCREECH),
+ LEVEL_UP_MOVE(50, MOVE_ZAP_CANNON),
+ LEVEL_UP_END
+};
+
+static const u16 sMagnetonLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_METAL_SOUND),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK),
+ LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(6, MOVE_THUNDER_SHOCK),
+ LEVEL_UP_MOVE(11, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(16, MOVE_SONIC_BOOM),
+ LEVEL_UP_MOVE(21, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(26, MOVE_SPARK),
+ LEVEL_UP_MOVE(35, MOVE_LOCK_ON),
+ LEVEL_UP_MOVE(44, MOVE_TRI_ATTACK),
+ LEVEL_UP_MOVE(53, MOVE_SCREECH),
+ LEVEL_UP_MOVE(62, MOVE_ZAP_CANNON),
+ LEVEL_UP_END
+};
+
+static const u16 sFarfetchdLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(6, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(11, MOVE_LEER),
+ LEVEL_UP_MOVE(16, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(21, MOVE_KNOCK_OFF),
+ LEVEL_UP_MOVE(26, MOVE_FURY_CUTTER),
+ LEVEL_UP_MOVE(31, MOVE_SWORDS_DANCE),
+ LEVEL_UP_MOVE(36, MOVE_AGILITY),
+ LEVEL_UP_MOVE(41, MOVE_SLASH),
+ LEVEL_UP_MOVE(46, MOVE_FALSE_SWIPE),
+ LEVEL_UP_END
+};
+
+static const u16 sDoduoLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(9, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(21, MOVE_TRI_ATTACK),
+ LEVEL_UP_MOVE(25, MOVE_RAGE),
+ LEVEL_UP_MOVE(33, MOVE_UPROAR),
+ LEVEL_UP_MOVE(37, MOVE_DRILL_PECK),
+ LEVEL_UP_MOVE(45, MOVE_AGILITY),
+ LEVEL_UP_END
+};
+
+static const u16 sDodrioLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(1, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(9, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(21, MOVE_TRI_ATTACK),
+ LEVEL_UP_MOVE(25, MOVE_RAGE),
+ LEVEL_UP_MOVE(38, MOVE_UPROAR),
+ LEVEL_UP_MOVE(47, MOVE_DRILL_PECK),
+ LEVEL_UP_MOVE(60, MOVE_AGILITY),
+ LEVEL_UP_END
+};
+
+static const u16 sSeelLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(9, MOVE_GROWL),
+ LEVEL_UP_MOVE(17, MOVE_ICY_WIND),
+ LEVEL_UP_MOVE(21, MOVE_AURORA_BEAM),
+ LEVEL_UP_MOVE(29, MOVE_REST),
+ LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(41, MOVE_ICE_BEAM),
+ LEVEL_UP_MOVE(49, MOVE_SAFEGUARD),
+ LEVEL_UP_END
+};
+
+static const u16 sDewgongLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SIGNAL_BEAM),
+ LEVEL_UP_MOVE(1, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_ICY_WIND),
+ LEVEL_UP_MOVE(1, MOVE_AURORA_BEAM),
+ LEVEL_UP_MOVE(9, MOVE_GROWL),
+ LEVEL_UP_MOVE(17, MOVE_ICY_WIND),
+ LEVEL_UP_MOVE(21, MOVE_AURORA_BEAM),
+ LEVEL_UP_MOVE(29, MOVE_REST),
+ LEVEL_UP_MOVE(34, MOVE_SHEER_COLD),
+ LEVEL_UP_MOVE(42, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(51, MOVE_ICE_BEAM),
+ LEVEL_UP_MOVE(64, MOVE_SAFEGUARD),
+ LEVEL_UP_END
+};
+
+static const u16 sGrimerLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POISON_GAS),
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(4, MOVE_HARDEN),
+ LEVEL_UP_MOVE(8, MOVE_DISABLE),
+ LEVEL_UP_MOVE(13, MOVE_SLUDGE),
+ LEVEL_UP_MOVE(19, MOVE_MINIMIZE),
+ LEVEL_UP_MOVE(26, MOVE_SCREECH),
+ LEVEL_UP_MOVE(34, MOVE_ACID_ARMOR),
+ LEVEL_UP_MOVE(43, MOVE_SLUDGE_BOMB),
+ LEVEL_UP_MOVE(53, MOVE_MEMENTO),
+ LEVEL_UP_END
+};
+
+static const u16 sMukLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POISON_GAS),
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(4, MOVE_HARDEN),
+ LEVEL_UP_MOVE(8, MOVE_DISABLE),
+ LEVEL_UP_MOVE(13, MOVE_SLUDGE),
+ LEVEL_UP_MOVE(19, MOVE_MINIMIZE),
+ LEVEL_UP_MOVE(26, MOVE_SCREECH),
+ LEVEL_UP_MOVE(34, MOVE_ACID_ARMOR),
+ LEVEL_UP_MOVE(47, MOVE_SLUDGE_BOMB),
+ LEVEL_UP_MOVE(61, MOVE_MEMENTO),
+ LEVEL_UP_END
+};
+
+static const u16 sShellderLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_WITHDRAW),
+ LEVEL_UP_MOVE(8, MOVE_ICICLE_SPEAR),
+ LEVEL_UP_MOVE(15, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(22, MOVE_AURORA_BEAM),
+ LEVEL_UP_MOVE(29, MOVE_PROTECT),
+ LEVEL_UP_MOVE(36, MOVE_LEER),
+ LEVEL_UP_MOVE(43, MOVE_CLAMP),
+ LEVEL_UP_MOVE(50, MOVE_ICE_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sCloysterLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WITHDRAW),
+ LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(1, MOVE_AURORA_BEAM),
+ LEVEL_UP_MOVE(1, MOVE_PROTECT),
+ LEVEL_UP_MOVE(36, MOVE_SPIKES),
+ LEVEL_UP_MOVE(43, MOVE_SPIKE_CANNON),
+ LEVEL_UP_END
+};
+
+static const u16 sGastlyLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(1, MOVE_LICK),
+ LEVEL_UP_MOVE(8, MOVE_SPITE),
+ LEVEL_UP_MOVE(13, MOVE_CURSE),
+ LEVEL_UP_MOVE(16, MOVE_NIGHT_SHADE),
+ LEVEL_UP_MOVE(21, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(28, MOVE_DREAM_EATER),
+ LEVEL_UP_MOVE(33, MOVE_DESTINY_BOND),
+ LEVEL_UP_MOVE(36, MOVE_SHADOW_BALL),
+ LEVEL_UP_MOVE(41, MOVE_NIGHTMARE),
+ LEVEL_UP_MOVE(48, MOVE_MEAN_LOOK),
+ LEVEL_UP_END
+};
+
+static const u16 sHaunterLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(1, MOVE_LICK),
+ LEVEL_UP_MOVE(1, MOVE_SPITE),
+ LEVEL_UP_MOVE(8, MOVE_SPITE),
+ LEVEL_UP_MOVE(13, MOVE_CURSE),
+ LEVEL_UP_MOVE(16, MOVE_NIGHT_SHADE),
+ LEVEL_UP_MOVE(21, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(25, MOVE_SHADOW_PUNCH),
+ LEVEL_UP_MOVE(31, MOVE_DREAM_EATER),
+ LEVEL_UP_MOVE(39, MOVE_DESTINY_BOND),
+ LEVEL_UP_MOVE(45, MOVE_SHADOW_BALL),
+ LEVEL_UP_MOVE(53, MOVE_NIGHTMARE),
+ LEVEL_UP_MOVE(64, MOVE_MEAN_LOOK),
+ LEVEL_UP_END
+};
+
+static const u16 sGengarLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(1, MOVE_LICK),
+ LEVEL_UP_MOVE(1, MOVE_SPITE),
+ LEVEL_UP_MOVE(8, MOVE_SPITE),
+ LEVEL_UP_MOVE(13, MOVE_CURSE),
+ LEVEL_UP_MOVE(16, MOVE_NIGHT_SHADE),
+ LEVEL_UP_MOVE(21, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(25, MOVE_SHADOW_PUNCH),
+ LEVEL_UP_MOVE(31, MOVE_DREAM_EATER),
+ LEVEL_UP_MOVE(39, MOVE_DESTINY_BOND),
+ LEVEL_UP_MOVE(45, MOVE_SHADOW_BALL),
+ LEVEL_UP_MOVE(53, MOVE_NIGHTMARE),
+ LEVEL_UP_MOVE(64, MOVE_MEAN_LOOK),
+ LEVEL_UP_END
+};
+
+static const u16 sOnixLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_SCREECH),
+ LEVEL_UP_MOVE(8, MOVE_BIND),
+ LEVEL_UP_MOVE(12, MOVE_ROCK_THROW),
+ LEVEL_UP_MOVE(19, MOVE_HARDEN),
+ LEVEL_UP_MOVE(23, MOVE_RAGE),
+ LEVEL_UP_MOVE(30, MOVE_DRAGON_BREATH),
+ LEVEL_UP_MOVE(34, MOVE_SANDSTORM),
+ LEVEL_UP_MOVE(41, MOVE_SLAM),
+ LEVEL_UP_MOVE(45, MOVE_IRON_TAIL),
+ LEVEL_UP_MOVE(52, MOVE_SAND_TOMB),
+ LEVEL_UP_MOVE(56, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sDrowzeeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(7, MOVE_DISABLE),
+ LEVEL_UP_MOVE(11, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(17, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(21, MOVE_POISON_GAS),
+ LEVEL_UP_MOVE(27, MOVE_MEDITATE),
+ LEVEL_UP_MOVE(31, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(37, MOVE_PSYCH_UP),
+ LEVEL_UP_MOVE(41, MOVE_SWAGGER),
+ LEVEL_UP_MOVE(47, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_END
+};
+
+static const u16 sHypnoLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_NIGHTMARE),
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(1, MOVE_DISABLE),
+ LEVEL_UP_MOVE(1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(7, MOVE_DISABLE),
+ LEVEL_UP_MOVE(11, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(17, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(21, MOVE_POISON_GAS),
+ LEVEL_UP_MOVE(29, MOVE_MEDITATE),
+ LEVEL_UP_MOVE(35, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(43, MOVE_PSYCH_UP),
+ LEVEL_UP_MOVE(49, MOVE_SWAGGER),
+ LEVEL_UP_MOVE(57, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_END
+};
+
+static const u16 sKrabbyLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(5, MOVE_LEER),
+ LEVEL_UP_MOVE(12, MOVE_VICE_GRIP),
+ LEVEL_UP_MOVE(16, MOVE_HARDEN),
+ LEVEL_UP_MOVE(23, MOVE_MUD_SHOT),
+ LEVEL_UP_MOVE(27, MOVE_STOMP),
+ LEVEL_UP_MOVE(34, MOVE_GUILLOTINE),
+ LEVEL_UP_MOVE(38, MOVE_PROTECT),
+ LEVEL_UP_MOVE(45, MOVE_CRABHAMMER),
+ LEVEL_UP_MOVE(49, MOVE_FLAIL),
+ LEVEL_UP_END
+};
+
+static const u16 sKinglerLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_METAL_CLAW),
+ LEVEL_UP_MOVE(1, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_VICE_GRIP),
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(5, MOVE_LEER),
+ LEVEL_UP_MOVE(12, MOVE_VICE_GRIP),
+ LEVEL_UP_MOVE(16, MOVE_HARDEN),
+ LEVEL_UP_MOVE(23, MOVE_MUD_SHOT),
+ LEVEL_UP_MOVE(27, MOVE_STOMP),
+ LEVEL_UP_MOVE(38, MOVE_GUILLOTINE),
+ LEVEL_UP_MOVE(42, MOVE_PROTECT),
+ LEVEL_UP_MOVE(57, MOVE_CRABHAMMER),
+ LEVEL_UP_MOVE(65, MOVE_FLAIL),
+ LEVEL_UP_END
+};
+
+static const u16 sVoltorbLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_CHARGE),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(8, MOVE_SCREECH),
+ LEVEL_UP_MOVE(15, MOVE_SONIC_BOOM),
+ LEVEL_UP_MOVE(21, MOVE_SPARK),
+ LEVEL_UP_MOVE(27, MOVE_SELF_DESTRUCT),
+ LEVEL_UP_MOVE(32, MOVE_ROLLOUT),
+ LEVEL_UP_MOVE(37, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(42, MOVE_SWIFT),
+ LEVEL_UP_MOVE(46, MOVE_EXPLOSION),
+ LEVEL_UP_MOVE(49, MOVE_MIRROR_COAT),
+ LEVEL_UP_END
+};
+
+static const u16 sElectrodeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_CHARGE),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_SCREECH),
+ LEVEL_UP_MOVE(1, MOVE_SONIC_BOOM),
+ LEVEL_UP_MOVE(8, MOVE_SCREECH),
+ LEVEL_UP_MOVE(15, MOVE_SONIC_BOOM),
+ LEVEL_UP_MOVE(21, MOVE_SPARK),
+ LEVEL_UP_MOVE(27, MOVE_SELF_DESTRUCT),
+ LEVEL_UP_MOVE(34, MOVE_ROLLOUT),
+ LEVEL_UP_MOVE(41, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(48, MOVE_SWIFT),
+ LEVEL_UP_MOVE(54, MOVE_EXPLOSION),
+ LEVEL_UP_MOVE(59, MOVE_MIRROR_COAT),
+ LEVEL_UP_END
+};
+
+static const u16 sExeggcuteLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BARRAGE),
+ LEVEL_UP_MOVE(1, MOVE_UPROAR),
+ LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(7, MOVE_REFLECT),
+ LEVEL_UP_MOVE(13, MOVE_LEECH_SEED),
+ LEVEL_UP_MOVE(19, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(25, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(31, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(37, MOVE_SLEEP_POWDER),
+ LEVEL_UP_MOVE(43, MOVE_SOLAR_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sExeggutorLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BARRAGE),
+ LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(19, MOVE_STOMP),
+ LEVEL_UP_MOVE(31, MOVE_EGG_BOMB),
+ LEVEL_UP_END
+};
+
+static const u16 sCuboneLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(9, MOVE_BONE_CLUB),
+ LEVEL_UP_MOVE(13, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(17, MOVE_LEER),
+ LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(25, MOVE_BONEMERANG),
+ LEVEL_UP_MOVE(29, MOVE_RAGE),
+ LEVEL_UP_MOVE(33, MOVE_FALSE_SWIPE),
+ LEVEL_UP_MOVE(37, MOVE_THRASH),
+ LEVEL_UP_MOVE(41, MOVE_BONE_RUSH),
+ LEVEL_UP_MOVE(45, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sMarowakLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_BONE_CLUB),
+ LEVEL_UP_MOVE(1, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(9, MOVE_BONE_CLUB),
+ LEVEL_UP_MOVE(13, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(17, MOVE_LEER),
+ LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(25, MOVE_BONEMERANG),
+ LEVEL_UP_MOVE(32, MOVE_RAGE),
+ LEVEL_UP_MOVE(39, MOVE_FALSE_SWIPE),
+ LEVEL_UP_MOVE(46, MOVE_THRASH),
+ LEVEL_UP_MOVE(53, MOVE_BONE_RUSH),
+ LEVEL_UP_MOVE(61, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sHitmonleeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_REVENGE),
+ LEVEL_UP_MOVE(1, MOVE_DOUBLE_KICK),
+ LEVEL_UP_MOVE(6, MOVE_MEDITATE),
+ LEVEL_UP_MOVE(11, MOVE_ROLLING_KICK),
+ LEVEL_UP_MOVE(16, MOVE_JUMP_KICK),
+ LEVEL_UP_MOVE(20, MOVE_BRICK_BREAK),
+ LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(26, MOVE_HI_JUMP_KICK),
+ LEVEL_UP_MOVE(31, MOVE_MIND_READER),
+ LEVEL_UP_MOVE(36, MOVE_FORESIGHT),
+ LEVEL_UP_MOVE(41, MOVE_ENDURE),
+ LEVEL_UP_MOVE(46, MOVE_MEGA_KICK),
+ LEVEL_UP_MOVE(51, MOVE_REVERSAL),
+ LEVEL_UP_END
+};
+
+static const u16 sHitmonchanLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_REVENGE),
+ LEVEL_UP_MOVE(1, MOVE_COMET_PUNCH),
+ LEVEL_UP_MOVE(7, MOVE_AGILITY),
+ LEVEL_UP_MOVE(13, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(20, MOVE_MACH_PUNCH),
+ LEVEL_UP_MOVE(26, MOVE_THUNDER_PUNCH),
+ LEVEL_UP_MOVE(26, MOVE_ICE_PUNCH),
+ LEVEL_UP_MOVE(26, MOVE_FIRE_PUNCH),
+ LEVEL_UP_MOVE(32, MOVE_SKY_UPPERCUT),
+ LEVEL_UP_MOVE(38, MOVE_MEGA_PUNCH),
+ LEVEL_UP_MOVE(44, MOVE_DETECT),
+ LEVEL_UP_MOVE(50, MOVE_COUNTER),
+ LEVEL_UP_END
+};
+
+static const u16 sLickitungLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_LICK),
+ LEVEL_UP_MOVE(7, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(12, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(18, MOVE_KNOCK_OFF),
+ LEVEL_UP_MOVE(23, MOVE_STOMP),
+ LEVEL_UP_MOVE(29, MOVE_WRAP),
+ LEVEL_UP_MOVE(34, MOVE_DISABLE),
+ LEVEL_UP_MOVE(40, MOVE_SLAM),
+ LEVEL_UP_MOVE(45, MOVE_SCREECH),
+ LEVEL_UP_MOVE(51, MOVE_REFRESH),
+ LEVEL_UP_END
+};
+
+static const u16 sKoffingLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POISON_GAS),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(9, MOVE_SMOG),
+ LEVEL_UP_MOVE(17, MOVE_SELF_DESTRUCT),
+ LEVEL_UP_MOVE(21, MOVE_SLUDGE),
+ LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(33, MOVE_HAZE),
+ LEVEL_UP_MOVE(41, MOVE_EXPLOSION),
+ LEVEL_UP_MOVE(45, MOVE_DESTINY_BOND),
+ LEVEL_UP_MOVE(49, MOVE_MEMENTO),
+ LEVEL_UP_END
+};
+
+static const u16 sWeezingLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POISON_GAS),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_SMOG),
+ LEVEL_UP_MOVE(1, MOVE_SELF_DESTRUCT),
+ LEVEL_UP_MOVE(9, MOVE_SMOG),
+ LEVEL_UP_MOVE(17, MOVE_SELF_DESTRUCT),
+ LEVEL_UP_MOVE(21, MOVE_SLUDGE),
+ LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(33, MOVE_HAZE),
+ LEVEL_UP_MOVE(44, MOVE_EXPLOSION),
+ LEVEL_UP_MOVE(51, MOVE_DESTINY_BOND),
+ LEVEL_UP_MOVE(58, MOVE_MEMENTO),
+ LEVEL_UP_END
+};
+
+static const u16 sRhyhornLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_HORN_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(10, MOVE_STOMP),
+ LEVEL_UP_MOVE(15, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(24, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(29, MOVE_ROCK_BLAST),
+ LEVEL_UP_MOVE(38, MOVE_HORN_DRILL),
+ LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(52, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(57, MOVE_MEGAHORN),
+ LEVEL_UP_END
+};
+
+static const u16 sRhydonLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_HORN_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_STOMP),
+ LEVEL_UP_MOVE(1, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(10, MOVE_STOMP),
+ LEVEL_UP_MOVE(15, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(24, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(29, MOVE_ROCK_BLAST),
+ LEVEL_UP_MOVE(38, MOVE_HORN_DRILL),
+ LEVEL_UP_MOVE(46, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(58, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(66, MOVE_MEGAHORN),
+ LEVEL_UP_END
+};
+
+static const u16 sChanseyLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(9, MOVE_REFRESH),
+ LEVEL_UP_MOVE(13, MOVE_SOFT_BOILED),
+ LEVEL_UP_MOVE(17, MOVE_DOUBLE_SLAP),
+ LEVEL_UP_MOVE(23, MOVE_MINIMIZE),
+ LEVEL_UP_MOVE(29, MOVE_SING),
+ LEVEL_UP_MOVE(35, MOVE_EGG_BOMB),
+ LEVEL_UP_MOVE(41, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(49, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sTangelaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_INGRAIN),
+ LEVEL_UP_MOVE(1, MOVE_CONSTRICT),
+ LEVEL_UP_MOVE(4, MOVE_SLEEP_POWDER),
+ LEVEL_UP_MOVE(10, MOVE_ABSORB),
+ LEVEL_UP_MOVE(13, MOVE_GROWTH),
+ LEVEL_UP_MOVE(19, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(22, MOVE_VINE_WHIP),
+ LEVEL_UP_MOVE(28, MOVE_BIND),
+ LEVEL_UP_MOVE(31, MOVE_MEGA_DRAIN),
+ LEVEL_UP_MOVE(37, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(40, MOVE_SLAM),
+ LEVEL_UP_MOVE(46, MOVE_TICKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sKangaskhanLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_COMET_PUNCH),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(7, MOVE_BITE),
+ LEVEL_UP_MOVE(13, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(19, MOVE_FAKE_OUT),
+ LEVEL_UP_MOVE(25, MOVE_MEGA_PUNCH),
+ LEVEL_UP_MOVE(31, MOVE_RAGE),
+ LEVEL_UP_MOVE(37, MOVE_ENDURE),
+ LEVEL_UP_MOVE(43, MOVE_DIZZY_PUNCH),
+ LEVEL_UP_MOVE(49, MOVE_REVERSAL),
+ LEVEL_UP_END
+};
+
+static const u16 sHorseaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(8, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(15, MOVE_LEER),
+ LEVEL_UP_MOVE(22, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(29, MOVE_TWISTER),
+ LEVEL_UP_MOVE(36, MOVE_AGILITY),
+ LEVEL_UP_MOVE(43, MOVE_HYDRO_PUMP),
+ LEVEL_UP_MOVE(50, MOVE_DRAGON_DANCE),
+ LEVEL_UP_END
+};
+
+static const u16 sSeadraLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(1, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(8, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(15, MOVE_LEER),
+ LEVEL_UP_MOVE(22, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(29, MOVE_TWISTER),
+ LEVEL_UP_MOVE(40, MOVE_AGILITY),
+ LEVEL_UP_MOVE(51, MOVE_HYDRO_PUMP),
+ LEVEL_UP_MOVE(62, MOVE_DRAGON_DANCE),
+ LEVEL_UP_END
+};
+
+static const u16 sGoldeenLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_WATER_SPORT),
+ LEVEL_UP_MOVE(10, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(15, MOVE_HORN_ATTACK),
+ LEVEL_UP_MOVE(24, MOVE_FLAIL),
+ LEVEL_UP_MOVE(29, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(38, MOVE_WATERFALL),
+ LEVEL_UP_MOVE(43, MOVE_HORN_DRILL),
+ LEVEL_UP_MOVE(52, MOVE_AGILITY),
+ LEVEL_UP_MOVE(57, MOVE_MEGAHORN),
+ LEVEL_UP_END
+};
+
+static const u16 sSeakingLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_WATER_SPORT),
+ LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(10, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(15, MOVE_HORN_ATTACK),
+ LEVEL_UP_MOVE(24, MOVE_FLAIL),
+ LEVEL_UP_MOVE(29, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(41, MOVE_WATERFALL),
+ LEVEL_UP_MOVE(49, MOVE_HORN_DRILL),
+ LEVEL_UP_MOVE(61, MOVE_AGILITY),
+ LEVEL_UP_MOVE(69, MOVE_MEGAHORN),
+ LEVEL_UP_END
+};
+
+static const u16 sStaryuLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(6, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(10, MOVE_RAPID_SPIN),
+ LEVEL_UP_MOVE(15, MOVE_RECOVER),
+ LEVEL_UP_MOVE(19, MOVE_CAMOUFLAGE),
+ LEVEL_UP_MOVE(24, MOVE_SWIFT),
+ LEVEL_UP_MOVE(28, MOVE_BUBBLE_BEAM),
+ LEVEL_UP_MOVE(33, MOVE_MINIMIZE),
+ LEVEL_UP_MOVE(37, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(42, MOVE_COSMIC_POWER),
+ LEVEL_UP_MOVE(46, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sStarmieLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(1, MOVE_RAPID_SPIN),
+ LEVEL_UP_MOVE(1, MOVE_RECOVER),
+ LEVEL_UP_MOVE(1, MOVE_SWIFT),
+ LEVEL_UP_MOVE(33, MOVE_CONFUSE_RAY),
+ LEVEL_UP_END
+};
+
+static const u16 sMrMimeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BARRIER),
+ LEVEL_UP_MOVE(5, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(8, MOVE_SUBSTITUTE),
+ LEVEL_UP_MOVE(12, MOVE_MEDITATE),
+ LEVEL_UP_MOVE(15, MOVE_DOUBLE_SLAP),
+ LEVEL_UP_MOVE(19, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(19, MOVE_REFLECT),
+ LEVEL_UP_MOVE(22, MOVE_MAGICAL_LEAF),
+ LEVEL_UP_MOVE(26, MOVE_ENCORE),
+ LEVEL_UP_MOVE(29, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(33, MOVE_RECYCLE),
+ LEVEL_UP_MOVE(36, MOVE_TRICK),
+ LEVEL_UP_MOVE(40, MOVE_ROLE_PLAY),
+ LEVEL_UP_MOVE(43, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(47, MOVE_BATON_PASS),
+ LEVEL_UP_MOVE(50, MOVE_SAFEGUARD),
+ LEVEL_UP_END
+};
+
+static const u16 sScytherLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(6, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(11, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(16, MOVE_FALSE_SWIPE),
+ LEVEL_UP_MOVE(21, MOVE_AGILITY),
+ LEVEL_UP_MOVE(26, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(31, MOVE_SLASH),
+ LEVEL_UP_MOVE(36, MOVE_SWORDS_DANCE),
+ LEVEL_UP_MOVE(41, MOVE_DOUBLE_TEAM),
+ LEVEL_UP_MOVE(46, MOVE_FURY_CUTTER),
+ LEVEL_UP_END
+};
+
+static const u16 sJynxLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(1, MOVE_LICK),
+ LEVEL_UP_MOVE(1, MOVE_LOVELY_KISS),
+ LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW),
+ LEVEL_UP_MOVE(9, MOVE_LOVELY_KISS),
+ LEVEL_UP_MOVE(13, MOVE_POWDER_SNOW),
+ LEVEL_UP_MOVE(21, MOVE_DOUBLE_SLAP),
+ LEVEL_UP_MOVE(25, MOVE_ICE_PUNCH),
+ LEVEL_UP_MOVE(35, MOVE_MEAN_LOOK),
+ LEVEL_UP_MOVE(41, MOVE_FAKE_TEARS),
+ LEVEL_UP_MOVE(51, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(57, MOVE_PERISH_SONG),
+ LEVEL_UP_MOVE(67, MOVE_BLIZZARD),
+ LEVEL_UP_END
+};
+
+static const u16 sElectabuzzLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_THUNDER_PUNCH),
+ LEVEL_UP_MOVE(9, MOVE_THUNDER_PUNCH),
+ LEVEL_UP_MOVE(17, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(25, MOVE_SWIFT),
+ LEVEL_UP_MOVE(36, MOVE_SCREECH),
+ LEVEL_UP_MOVE(47, MOVE_THUNDERBOLT),
+ LEVEL_UP_MOVE(58, MOVE_THUNDER),
+ LEVEL_UP_END
+};
+
+static const u16 sMagmarLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_EMBER),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_SMOG),
+ LEVEL_UP_MOVE(1, MOVE_FIRE_PUNCH),
+ LEVEL_UP_MOVE(7, MOVE_LEER),
+ LEVEL_UP_MOVE(13, MOVE_SMOG),
+ LEVEL_UP_MOVE(19, MOVE_FIRE_PUNCH),
+ LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(33, MOVE_SUNNY_DAY),
+ LEVEL_UP_MOVE(41, MOVE_FLAMETHROWER),
+ LEVEL_UP_MOVE(49, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(57, MOVE_FIRE_BLAST),
+ LEVEL_UP_END
+};
+
+static const u16 sPinsirLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_VICE_GRIP),
+ LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(7, MOVE_BIND),
+ LEVEL_UP_MOVE(13, MOVE_SEISMIC_TOSS),
+ LEVEL_UP_MOVE(19, MOVE_HARDEN),
+ LEVEL_UP_MOVE(25, MOVE_REVENGE),
+ LEVEL_UP_MOVE(31, MOVE_BRICK_BREAK),
+ LEVEL_UP_MOVE(37, MOVE_GUILLOTINE),
+ LEVEL_UP_MOVE(43, MOVE_SUBMISSION),
+ LEVEL_UP_MOVE(49, MOVE_SWORDS_DANCE),
+ LEVEL_UP_END
+};
+
+static const u16 sTaurosLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(4, MOVE_RAGE),
+ LEVEL_UP_MOVE(8, MOVE_HORN_ATTACK),
+ LEVEL_UP_MOVE(13, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(19, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(26, MOVE_SWAGGER),
+ LEVEL_UP_MOVE(34, MOVE_REST),
+ LEVEL_UP_MOVE(43, MOVE_THRASH),
+ LEVEL_UP_MOVE(53, MOVE_TAKE_DOWN),
+ LEVEL_UP_END
+};
+
+static const u16 sMagikarpLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SPLASH),
+ LEVEL_UP_MOVE(15, MOVE_TACKLE),
+ LEVEL_UP_MOVE(30, MOVE_FLAIL),
+ LEVEL_UP_END
+};
+
+static const u16 sGyaradosLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_THRASH),
+ LEVEL_UP_MOVE(20, MOVE_BITE),
+ LEVEL_UP_MOVE(25, MOVE_DRAGON_RAGE),
+ LEVEL_UP_MOVE(30, MOVE_LEER),
+ LEVEL_UP_MOVE(35, MOVE_TWISTER),
+ LEVEL_UP_MOVE(40, MOVE_HYDRO_PUMP),
+ LEVEL_UP_MOVE(45, MOVE_RAIN_DANCE),
+ LEVEL_UP_MOVE(50, MOVE_DRAGON_DANCE),
+ LEVEL_UP_MOVE(55, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sLaprasLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_SING),
+ LEVEL_UP_MOVE(7, MOVE_MIST),
+ LEVEL_UP_MOVE(13, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(19, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(25, MOVE_PERISH_SONG),
+ LEVEL_UP_MOVE(31, MOVE_ICE_BEAM),
+ LEVEL_UP_MOVE(37, MOVE_RAIN_DANCE),
+ LEVEL_UP_MOVE(43, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP),
+ LEVEL_UP_MOVE(55, MOVE_SHEER_COLD),
+ LEVEL_UP_END
+};
+
+static const u16 sDittoLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TRANSFORM),
+ LEVEL_UP_END
+};
+
+static const u16 sEeveeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(16, MOVE_GROWL),
+ LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(30, MOVE_BITE),
+ LEVEL_UP_MOVE(36, MOVE_BATON_PASS),
+ LEVEL_UP_MOVE(42, MOVE_TAKE_DOWN),
+ LEVEL_UP_END
+};
+
+static const u16 sVaporeonLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(16, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(30, MOVE_BITE),
+ LEVEL_UP_MOVE(36, MOVE_AURORA_BEAM),
+ LEVEL_UP_MOVE(42, MOVE_HAZE),
+ LEVEL_UP_MOVE(47, MOVE_ACID_ARMOR),
+ LEVEL_UP_MOVE(52, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sJolteonLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(16, MOVE_THUNDER_SHOCK),
+ LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(30, MOVE_DOUBLE_KICK),
+ LEVEL_UP_MOVE(36, MOVE_PIN_MISSILE),
+ LEVEL_UP_MOVE(42, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(47, MOVE_AGILITY),
+ LEVEL_UP_MOVE(52, MOVE_THUNDER),
+ LEVEL_UP_END
+};
+
+static const u16 sFlareonLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(16, MOVE_EMBER),
+ LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(30, MOVE_BITE),
+ LEVEL_UP_MOVE(36, MOVE_FIRE_SPIN),
+ LEVEL_UP_MOVE(42, MOVE_SMOG),
+ LEVEL_UP_MOVE(47, MOVE_LEER),
+ LEVEL_UP_MOVE(52, MOVE_FLAMETHROWER),
+ LEVEL_UP_END
+};
+
+static const u16 sPorygonLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_CONVERSION_2),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_CONVERSION),
+ LEVEL_UP_MOVE(9, MOVE_AGILITY),
+ LEVEL_UP_MOVE(12, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(20, MOVE_RECOVER),
+ LEVEL_UP_MOVE(24, MOVE_SHARPEN),
+ LEVEL_UP_MOVE(32, MOVE_LOCK_ON),
+ LEVEL_UP_MOVE(36, MOVE_TRI_ATTACK),
+ LEVEL_UP_MOVE(44, MOVE_RECYCLE),
+ LEVEL_UP_MOVE(48, MOVE_ZAP_CANNON),
+ LEVEL_UP_END
+};
+
+static const u16 sOmanyteLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_CONSTRICT),
+ LEVEL_UP_MOVE(1, MOVE_WITHDRAW),
+ LEVEL_UP_MOVE(13, MOVE_BITE),
+ LEVEL_UP_MOVE(19, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(25, MOVE_MUD_SHOT),
+ LEVEL_UP_MOVE(31, MOVE_LEER),
+ LEVEL_UP_MOVE(37, MOVE_PROTECT),
+ LEVEL_UP_MOVE(43, MOVE_TICKLE),
+ LEVEL_UP_MOVE(49, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(55, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sOmastarLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_CONSTRICT),
+ LEVEL_UP_MOVE(1, MOVE_WITHDRAW),
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(13, MOVE_BITE),
+ LEVEL_UP_MOVE(19, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(25, MOVE_MUD_SHOT),
+ LEVEL_UP_MOVE(31, MOVE_LEER),
+ LEVEL_UP_MOVE(37, MOVE_PROTECT),
+ LEVEL_UP_MOVE(40, MOVE_SPIKE_CANNON),
+ LEVEL_UP_MOVE(46, MOVE_TICKLE),
+ LEVEL_UP_MOVE(55, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(65, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sKabutoLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(13, MOVE_ABSORB),
+ LEVEL_UP_MOVE(19, MOVE_LEER),
+ LEVEL_UP_MOVE(25, MOVE_MUD_SHOT),
+ LEVEL_UP_MOVE(31, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(37, MOVE_ENDURE),
+ LEVEL_UP_MOVE(43, MOVE_METAL_SOUND),
+ LEVEL_UP_MOVE(49, MOVE_MEGA_DRAIN),
+ LEVEL_UP_MOVE(55, MOVE_ANCIENT_POWER),
+ LEVEL_UP_END
+};
+
+static const u16 sKabutopsLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_FURY_CUTTER),
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(1, MOVE_ABSORB),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(13, MOVE_ABSORB),
+ LEVEL_UP_MOVE(19, MOVE_LEER),
+ LEVEL_UP_MOVE(25, MOVE_MUD_SHOT),
+ LEVEL_UP_MOVE(31, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(37, MOVE_ENDURE),
+ LEVEL_UP_MOVE(40, MOVE_SLASH),
+ LEVEL_UP_MOVE(46, MOVE_METAL_SOUND),
+ LEVEL_UP_MOVE(55, MOVE_MEGA_DRAIN),
+ LEVEL_UP_MOVE(65, MOVE_ANCIENT_POWER),
+ LEVEL_UP_END
+};
+
+static const u16 sAerodactylLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(8, MOVE_AGILITY),
+ LEVEL_UP_MOVE(15, MOVE_BITE),
+ LEVEL_UP_MOVE(22, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(29, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(36, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(50, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sSnorlaxLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(5, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(9, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(13, MOVE_BELLY_DRUM),
+ LEVEL_UP_MOVE(17, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(21, MOVE_YAWN),
+ LEVEL_UP_MOVE(25, MOVE_REST),
+ LEVEL_UP_MOVE(29, MOVE_SNORE),
+ LEVEL_UP_MOVE(33, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(37, MOVE_SLEEP_TALK),
+ LEVEL_UP_MOVE(41, MOVE_BLOCK),
+ LEVEL_UP_MOVE(45, MOVE_COVET),
+ LEVEL_UP_MOVE(49, MOVE_ROLLOUT),
+ LEVEL_UP_MOVE(53, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sArticunoLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_GUST),
+ LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW),
+ LEVEL_UP_MOVE(13, MOVE_MIST),
+ LEVEL_UP_MOVE(25, MOVE_AGILITY),
+ LEVEL_UP_MOVE(37, MOVE_MIND_READER),
+ LEVEL_UP_MOVE(49, MOVE_ICE_BEAM),
+ LEVEL_UP_MOVE(61, MOVE_REFLECT),
+ LEVEL_UP_MOVE(73, MOVE_BLIZZARD),
+ LEVEL_UP_MOVE(85, MOVE_SHEER_COLD),
+ LEVEL_UP_END
+};
+
+static const u16 sZapdosLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK),
+ LEVEL_UP_MOVE(13, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(25, MOVE_AGILITY),
+ LEVEL_UP_MOVE(37, MOVE_DETECT),
+ LEVEL_UP_MOVE(49, MOVE_DRILL_PECK),
+ LEVEL_UP_MOVE(61, MOVE_CHARGE),
+ LEVEL_UP_MOVE(73, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(85, MOVE_THUNDER),
+ LEVEL_UP_END
+};
+
+static const u16 sMoltresLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_EMBER),
+ LEVEL_UP_MOVE(13, MOVE_FIRE_SPIN),
+ LEVEL_UP_MOVE(25, MOVE_AGILITY),
+ LEVEL_UP_MOVE(37, MOVE_ENDURE),
+ LEVEL_UP_MOVE(49, MOVE_FLAMETHROWER),
+ LEVEL_UP_MOVE(61, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(73, MOVE_HEAT_WAVE),
+ LEVEL_UP_MOVE(85, MOVE_SKY_ATTACK),
+ LEVEL_UP_END
+};
+
+static const u16 sDratiniLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WRAP),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(8, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(15, MOVE_TWISTER),
+ LEVEL_UP_MOVE(22, MOVE_DRAGON_RAGE),
+ LEVEL_UP_MOVE(29, MOVE_SLAM),
+ LEVEL_UP_MOVE(36, MOVE_AGILITY),
+ LEVEL_UP_MOVE(43, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(50, MOVE_OUTRAGE),
+ LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sDragonairLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WRAP),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(1, MOVE_TWISTER),
+ LEVEL_UP_MOVE(8, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(15, MOVE_TWISTER),
+ LEVEL_UP_MOVE(22, MOVE_DRAGON_RAGE),
+ LEVEL_UP_MOVE(29, MOVE_SLAM),
+ LEVEL_UP_MOVE(38, MOVE_AGILITY),
+ LEVEL_UP_MOVE(47, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(56, MOVE_OUTRAGE),
+ LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sDragoniteLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WRAP),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(1, MOVE_TWISTER),
+ LEVEL_UP_MOVE(8, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(15, MOVE_TWISTER),
+ LEVEL_UP_MOVE(22, MOVE_DRAGON_RAGE),
+ LEVEL_UP_MOVE(29, MOVE_SLAM),
+ LEVEL_UP_MOVE(38, MOVE_AGILITY),
+ LEVEL_UP_MOVE(47, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(55, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(61, MOVE_OUTRAGE),
+ LEVEL_UP_MOVE(75, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sMewtwoLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(1, MOVE_DISABLE),
+ LEVEL_UP_MOVE(11, MOVE_BARRIER),
+ LEVEL_UP_MOVE(22, MOVE_MIST),
+ LEVEL_UP_MOVE(33, MOVE_SWIFT),
+ LEVEL_UP_MOVE(44, MOVE_RECOVER),
+ LEVEL_UP_MOVE(55, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(66, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(77, MOVE_PSYCH_UP),
+ LEVEL_UP_MOVE(88, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(99, MOVE_AMNESIA),
+ LEVEL_UP_END
+};
+
+static const u16 sMewLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(10, MOVE_TRANSFORM),
+ LEVEL_UP_MOVE(20, MOVE_MEGA_PUNCH),
+ LEVEL_UP_MOVE(30, MOVE_METRONOME),
+ LEVEL_UP_MOVE(40, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(50, MOVE_ANCIENT_POWER),
+ LEVEL_UP_END
+};
+
+static const u16 sChikoritaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(8, MOVE_RAZOR_LEAF),
+ LEVEL_UP_MOVE(12, MOVE_REFLECT),
+ LEVEL_UP_MOVE(15, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(22, MOVE_SYNTHESIS),
+ LEVEL_UP_MOVE(29, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(36, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(43, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(50, MOVE_SOLAR_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sBayleefLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_RAZOR_LEAF),
+ LEVEL_UP_MOVE(1, MOVE_REFLECT),
+ LEVEL_UP_MOVE(8, MOVE_RAZOR_LEAF),
+ LEVEL_UP_MOVE(12, MOVE_REFLECT),
+ LEVEL_UP_MOVE(15, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(23, MOVE_SYNTHESIS),
+ LEVEL_UP_MOVE(31, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(39, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(47, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(55, MOVE_SOLAR_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sMeganiumLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_RAZOR_LEAF),
+ LEVEL_UP_MOVE(1, MOVE_REFLECT),
+ LEVEL_UP_MOVE(8, MOVE_RAZOR_LEAF),
+ LEVEL_UP_MOVE(12, MOVE_REFLECT),
+ LEVEL_UP_MOVE(15, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(23, MOVE_SYNTHESIS),
+ LEVEL_UP_MOVE(31, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(41, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(51, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(61, MOVE_SOLAR_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sCyndaquilLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(6, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(12, MOVE_EMBER),
+ LEVEL_UP_MOVE(19, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(27, MOVE_FLAME_WHEEL),
+ LEVEL_UP_MOVE(36, MOVE_SWIFT),
+ LEVEL_UP_MOVE(46, MOVE_FLAMETHROWER),
+ LEVEL_UP_END
+};
+
+static const u16 sQuilavaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(6, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(12, MOVE_EMBER),
+ LEVEL_UP_MOVE(21, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(31, MOVE_FLAME_WHEEL),
+ LEVEL_UP_MOVE(42, MOVE_SWIFT),
+ LEVEL_UP_MOVE(54, MOVE_FLAMETHROWER),
+ LEVEL_UP_END
+};
+
+static const u16 sTyphlosionLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(1, MOVE_EMBER),
+ LEVEL_UP_MOVE(6, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(12, MOVE_EMBER),
+ LEVEL_UP_MOVE(21, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(31, MOVE_FLAME_WHEEL),
+ LEVEL_UP_MOVE(45, MOVE_SWIFT),
+ LEVEL_UP_MOVE(60, MOVE_FLAMETHROWER),
+ LEVEL_UP_END
+};
+
+static const u16 sTotodileLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(7, MOVE_RAGE),
+ LEVEL_UP_MOVE(13, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(20, MOVE_BITE),
+ LEVEL_UP_MOVE(27, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(35, MOVE_SLASH),
+ LEVEL_UP_MOVE(43, MOVE_SCREECH),
+ LEVEL_UP_MOVE(52, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sCroconawLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_RAGE),
+ LEVEL_UP_MOVE(7, MOVE_RAGE),
+ LEVEL_UP_MOVE(13, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(21, MOVE_BITE),
+ LEVEL_UP_MOVE(28, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(37, MOVE_SLASH),
+ LEVEL_UP_MOVE(45, MOVE_SCREECH),
+ LEVEL_UP_MOVE(55, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sFeraligatrLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_RAGE),
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(7, MOVE_RAGE),
+ LEVEL_UP_MOVE(13, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(21, MOVE_BITE),
+ LEVEL_UP_MOVE(28, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(38, MOVE_SLASH),
+ LEVEL_UP_MOVE(47, MOVE_SCREECH),
+ LEVEL_UP_MOVE(58, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sSentretLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(4, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(12, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(17, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(24, MOVE_SLAM),
+ LEVEL_UP_MOVE(31, MOVE_FOLLOW_ME),
+ LEVEL_UP_MOVE(40, MOVE_REST),
+ LEVEL_UP_MOVE(49, MOVE_AMNESIA),
+ LEVEL_UP_END
+};
+
+static const u16 sFurretLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(4, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(12, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(19, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(28, MOVE_SLAM),
+ LEVEL_UP_MOVE(37, MOVE_FOLLOW_ME),
+ LEVEL_UP_MOVE(48, MOVE_REST),
+ LEVEL_UP_MOVE(59, MOVE_AMNESIA),
+ LEVEL_UP_END
+};
+
+static const u16 sHoothootLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(6, MOVE_FORESIGHT),
+ LEVEL_UP_MOVE(11, MOVE_PECK),
+ LEVEL_UP_MOVE(16, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(22, MOVE_REFLECT),
+ LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(34, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(48, MOVE_DREAM_EATER),
+ LEVEL_UP_END
+};
+
+static const u16 sNoctowlLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_FORESIGHT),
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(6, MOVE_FORESIGHT),
+ LEVEL_UP_MOVE(11, MOVE_PECK),
+ LEVEL_UP_MOVE(16, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(25, MOVE_REFLECT),
+ LEVEL_UP_MOVE(33, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(41, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(57, MOVE_DREAM_EATER),
+ LEVEL_UP_END
+};
+
+static const u16 sLedybaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(8, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(15, MOVE_COMET_PUNCH),
+ LEVEL_UP_MOVE(22, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(22, MOVE_REFLECT),
+ LEVEL_UP_MOVE(22, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(29, MOVE_BATON_PASS),
+ LEVEL_UP_MOVE(36, MOVE_SWIFT),
+ LEVEL_UP_MOVE(43, MOVE_AGILITY),
+ LEVEL_UP_MOVE(50, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sLedianLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(8, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(15, MOVE_COMET_PUNCH),
+ LEVEL_UP_MOVE(24, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(24, MOVE_REFLECT),
+ LEVEL_UP_MOVE(24, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(33, MOVE_BATON_PASS),
+ LEVEL_UP_MOVE(42, MOVE_SWIFT),
+ LEVEL_UP_MOVE(51, MOVE_AGILITY),
+ LEVEL_UP_MOVE(60, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpinarakLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(1, MOVE_STRING_SHOT),
+ LEVEL_UP_MOVE(6, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(11, MOVE_CONSTRICT),
+ LEVEL_UP_MOVE(17, MOVE_NIGHT_SHADE),
+ LEVEL_UP_MOVE(23, MOVE_LEECH_LIFE),
+ LEVEL_UP_MOVE(30, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(37, MOVE_SPIDER_WEB),
+ LEVEL_UP_MOVE(45, MOVE_AGILITY),
+ LEVEL_UP_MOVE(53, MOVE_PSYCHIC),
+ LEVEL_UP_END
+};
+
+static const u16 sAriadosLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(1, MOVE_STRING_SHOT),
+ LEVEL_UP_MOVE(1, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(1, MOVE_CONSTRICT),
+ LEVEL_UP_MOVE(6, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(11, MOVE_CONSTRICT),
+ LEVEL_UP_MOVE(17, MOVE_NIGHT_SHADE),
+ LEVEL_UP_MOVE(25, MOVE_LEECH_LIFE),
+ LEVEL_UP_MOVE(34, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(43, MOVE_SPIDER_WEB),
+ LEVEL_UP_MOVE(53, MOVE_AGILITY),
+ LEVEL_UP_MOVE(63, MOVE_PSYCHIC),
+ LEVEL_UP_END
+};
+
+static const u16 sCrobatLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCREECH),
+ LEVEL_UP_MOVE(1, MOVE_LEECH_LIFE),
+ LEVEL_UP_MOVE(1, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(6, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(11, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(16, MOVE_BITE),
+ LEVEL_UP_MOVE(21, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(28, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(35, MOVE_AIR_CUTTER),
+ LEVEL_UP_MOVE(42, MOVE_MEAN_LOOK),
+ LEVEL_UP_MOVE(49, MOVE_POISON_FANG),
+ LEVEL_UP_MOVE(56, MOVE_HAZE),
+ LEVEL_UP_END
+};
+
+static const u16 sChinchouLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(5, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(13, MOVE_FLAIL),
+ LEVEL_UP_MOVE(17, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(25, MOVE_SPARK),
+ LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(41, MOVE_HYDRO_PUMP),
+ LEVEL_UP_MOVE(49, MOVE_CHARGE),
+ LEVEL_UP_END
+};
+
+static const u16 sLanturnLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(1, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(5, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(13, MOVE_FLAIL),
+ LEVEL_UP_MOVE(17, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(25, MOVE_SPARK),
+ LEVEL_UP_MOVE(32, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP),
+ LEVEL_UP_MOVE(61, MOVE_CHARGE),
+ LEVEL_UP_END
+};
+
+static const u16 sPichuLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK),
+ LEVEL_UP_MOVE(1, MOVE_CHARM),
+ LEVEL_UP_MOVE(6, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(8, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(11, MOVE_SWEET_KISS),
+ LEVEL_UP_END
+};
+
+static const u16 sCleffaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(1, MOVE_CHARM),
+ LEVEL_UP_MOVE(4, MOVE_ENCORE),
+ LEVEL_UP_MOVE(8, MOVE_SING),
+ LEVEL_UP_MOVE(13, MOVE_SWEET_KISS),
+ LEVEL_UP_MOVE(17, MOVE_MAGICAL_LEAF),
+ LEVEL_UP_END
+};
+
+static const u16 sIgglybuffLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SING),
+ LEVEL_UP_MOVE(1, MOVE_CHARM),
+ LEVEL_UP_MOVE(4, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(9, MOVE_POUND),
+ LEVEL_UP_MOVE(14, MOVE_SWEET_KISS),
+ LEVEL_UP_END
+};
+
+static const u16 sTogepiLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_CHARM),
+ LEVEL_UP_MOVE(4, MOVE_METRONOME),
+ LEVEL_UP_MOVE(9, MOVE_SWEET_KISS),
+ LEVEL_UP_MOVE(13, MOVE_YAWN),
+ LEVEL_UP_MOVE(17, MOVE_ENCORE),
+ LEVEL_UP_MOVE(21, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(25, MOVE_FOLLOW_ME),
+ LEVEL_UP_MOVE(29, MOVE_WISH),
+ LEVEL_UP_MOVE(33, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(37, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_MOVE(41, MOVE_BATON_PASS),
+ LEVEL_UP_END
+};
+
+static const u16 sTogeticLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_MAGICAL_LEAF),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_CHARM),
+ LEVEL_UP_MOVE(1, MOVE_METRONOME),
+ LEVEL_UP_MOVE(1, MOVE_SWEET_KISS),
+ LEVEL_UP_MOVE(4, MOVE_METRONOME),
+ LEVEL_UP_MOVE(9, MOVE_SWEET_KISS),
+ LEVEL_UP_MOVE(13, MOVE_YAWN),
+ LEVEL_UP_MOVE(17, MOVE_ENCORE),
+ LEVEL_UP_MOVE(21, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(25, MOVE_FOLLOW_ME),
+ LEVEL_UP_MOVE(29, MOVE_WISH),
+ LEVEL_UP_MOVE(33, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(37, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_MOVE(41, MOVE_BATON_PASS),
+ LEVEL_UP_END
+};
+
+static const u16 sNatuLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(10, MOVE_NIGHT_SHADE),
+ LEVEL_UP_MOVE(20, MOVE_TELEPORT),
+ LEVEL_UP_MOVE(30, MOVE_WISH),
+ LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(40, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(50, MOVE_PSYCHIC),
+ LEVEL_UP_END
+};
+
+static const u16 sXatuLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(10, MOVE_NIGHT_SHADE),
+ LEVEL_UP_MOVE(20, MOVE_TELEPORT),
+ LEVEL_UP_MOVE(35, MOVE_WISH),
+ LEVEL_UP_MOVE(35, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(50, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(65, MOVE_PSYCHIC),
+ LEVEL_UP_END
+};
+
+static const u16 sMareepLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(9, MOVE_THUNDER_SHOCK),
+ LEVEL_UP_MOVE(16, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(23, MOVE_COTTON_SPORE),
+ LEVEL_UP_MOVE(30, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(37, MOVE_THUNDER),
+ LEVEL_UP_END
+};
+
+static const u16 sFlaaffyLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK),
+ LEVEL_UP_MOVE(9, MOVE_THUNDER_SHOCK),
+ LEVEL_UP_MOVE(18, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(27, MOVE_COTTON_SPORE),
+ LEVEL_UP_MOVE(36, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(45, MOVE_THUNDER),
+ LEVEL_UP_END
+};
+
+static const u16 sAmpharosLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_THUNDER_SHOCK),
+ LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(9, MOVE_THUNDER_SHOCK),
+ LEVEL_UP_MOVE(18, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(27, MOVE_COTTON_SPORE),
+ LEVEL_UP_MOVE(30, MOVE_THUNDER_PUNCH),
+ LEVEL_UP_MOVE(42, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(57, MOVE_THUNDER),
+ LEVEL_UP_END
+};
+
+static const u16 sBellossomLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ABSORB),
+ LEVEL_UP_MOVE(1, MOVE_SWEET_SCENT),
+ LEVEL_UP_MOVE(1, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(1, MOVE_MAGICAL_LEAF),
+ LEVEL_UP_MOVE(44, MOVE_PETAL_DANCE),
+ LEVEL_UP_MOVE(55, MOVE_SOLAR_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sMarillLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(3, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(6, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(10, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(15, MOVE_ROLLOUT),
+ LEVEL_UP_MOVE(21, MOVE_BUBBLE_BEAM),
+ LEVEL_UP_MOVE(28, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_MOVE(36, MOVE_RAIN_DANCE),
+ LEVEL_UP_MOVE(45, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sAzumarillLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(3, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(6, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(10, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(15, MOVE_ROLLOUT),
+ LEVEL_UP_MOVE(24, MOVE_BUBBLE_BEAM),
+ LEVEL_UP_MOVE(34, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_MOVE(45, MOVE_RAIN_DANCE),
+ LEVEL_UP_MOVE(57, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sSudowoodoLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ROCK_THROW),
+ LEVEL_UP_MOVE(1, MOVE_MIMIC),
+ LEVEL_UP_MOVE(9, MOVE_FLAIL),
+ LEVEL_UP_MOVE(17, MOVE_LOW_KICK),
+ LEVEL_UP_MOVE(25, MOVE_ROCK_SLIDE),
+ LEVEL_UP_MOVE(33, MOVE_BLOCK),
+ LEVEL_UP_MOVE(41, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(49, MOVE_SLAM),
+ LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sPolitoedLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(1, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(1, MOVE_DOUBLE_SLAP),
+ LEVEL_UP_MOVE(1, MOVE_PERISH_SONG),
+ LEVEL_UP_MOVE(35, MOVE_PERISH_SONG),
+ LEVEL_UP_MOVE(51, MOVE_SWAGGER),
+ LEVEL_UP_END
+};
+
+static const u16 sHoppipLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SPLASH),
+ LEVEL_UP_MOVE(5, MOVE_SYNTHESIS),
+ LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(10, MOVE_TACKLE),
+ LEVEL_UP_MOVE(13, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(15, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(17, MOVE_SLEEP_POWDER),
+ LEVEL_UP_MOVE(20, MOVE_LEECH_SEED),
+ LEVEL_UP_MOVE(25, MOVE_COTTON_SPORE),
+ LEVEL_UP_MOVE(30, MOVE_MEGA_DRAIN),
+ LEVEL_UP_END
+};
+
+static const u16 sSkiploomLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SPLASH),
+ LEVEL_UP_MOVE(1, MOVE_SYNTHESIS),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(5, MOVE_SYNTHESIS),
+ LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(10, MOVE_TACKLE),
+ LEVEL_UP_MOVE(13, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(15, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(17, MOVE_SLEEP_POWDER),
+ LEVEL_UP_MOVE(22, MOVE_LEECH_SEED),
+ LEVEL_UP_MOVE(29, MOVE_COTTON_SPORE),
+ LEVEL_UP_MOVE(36, MOVE_MEGA_DRAIN),
+ LEVEL_UP_END
+};
+
+static const u16 sJumpluffLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SPLASH),
+ LEVEL_UP_MOVE(1, MOVE_SYNTHESIS),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(5, MOVE_SYNTHESIS),
+ LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(10, MOVE_TACKLE),
+ LEVEL_UP_MOVE(13, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(15, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(17, MOVE_SLEEP_POWDER),
+ LEVEL_UP_MOVE(22, MOVE_LEECH_SEED),
+ LEVEL_UP_MOVE(33, MOVE_COTTON_SPORE),
+ LEVEL_UP_MOVE(44, MOVE_MEGA_DRAIN),
+ LEVEL_UP_END
+};
+
+static const u16 sAipomLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(6, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(13, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(18, MOVE_BATON_PASS),
+ LEVEL_UP_MOVE(25, MOVE_TICKLE),
+ LEVEL_UP_MOVE(31, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(38, MOVE_SWIFT),
+ LEVEL_UP_MOVE(43, MOVE_SCREECH),
+ LEVEL_UP_MOVE(50, MOVE_AGILITY),
+ LEVEL_UP_END
+};
+
+static const u16 sSunkernLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ABSORB),
+ LEVEL_UP_MOVE(6, MOVE_GROWTH),
+ LEVEL_UP_MOVE(13, MOVE_MEGA_DRAIN),
+ LEVEL_UP_MOVE(18, MOVE_INGRAIN),
+ LEVEL_UP_MOVE(25, MOVE_ENDEAVOR),
+ LEVEL_UP_MOVE(30, MOVE_SUNNY_DAY),
+ LEVEL_UP_MOVE(37, MOVE_SYNTHESIS),
+ LEVEL_UP_MOVE(42, MOVE_GIGA_DRAIN),
+ LEVEL_UP_END
+};
+
+static const u16 sSunfloraLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ABSORB),
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(6, MOVE_GROWTH),
+ LEVEL_UP_MOVE(13, MOVE_RAZOR_LEAF),
+ LEVEL_UP_MOVE(18, MOVE_INGRAIN),
+ LEVEL_UP_MOVE(25, MOVE_BULLET_SEED),
+ LEVEL_UP_MOVE(30, MOVE_SUNNY_DAY),
+ LEVEL_UP_MOVE(37, MOVE_PETAL_DANCE),
+ LEVEL_UP_MOVE(42, MOVE_SOLAR_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sYanmaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_FORESIGHT),
+ LEVEL_UP_MOVE(6, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(12, MOVE_DOUBLE_TEAM),
+ LEVEL_UP_MOVE(17, MOVE_SONIC_BOOM),
+ LEVEL_UP_MOVE(23, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(28, MOVE_DETECT),
+ LEVEL_UP_MOVE(34, MOVE_UPROAR),
+ LEVEL_UP_MOVE(39, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(45, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(50, MOVE_SCREECH),
+ LEVEL_UP_END
+};
+
+static const u16 sWooperLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(11, MOVE_SLAM),
+ LEVEL_UP_MOVE(16, MOVE_MUD_SHOT),
+ LEVEL_UP_MOVE(21, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(31, MOVE_YAWN),
+ LEVEL_UP_MOVE(36, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(41, MOVE_RAIN_DANCE),
+ LEVEL_UP_MOVE(51, MOVE_MIST),
+ LEVEL_UP_MOVE(51, MOVE_HAZE),
+ LEVEL_UP_END
+};
+
+static const u16 sQuagsireLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(11, MOVE_SLAM),
+ LEVEL_UP_MOVE(16, MOVE_MUD_SHOT),
+ LEVEL_UP_MOVE(23, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(35, MOVE_YAWN),
+ LEVEL_UP_MOVE(42, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(49, MOVE_RAIN_DANCE),
+ LEVEL_UP_MOVE(61, MOVE_MIST),
+ LEVEL_UP_MOVE(61, MOVE_HAZE),
+ LEVEL_UP_END
+};
+
+static const u16 sEspeonLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(16, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(30, MOVE_SWIFT),
+ LEVEL_UP_MOVE(36, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(42, MOVE_PSYCH_UP),
+ LEVEL_UP_MOVE(47, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(52, MOVE_MORNING_SUN),
+ LEVEL_UP_END
+};
+
+static const u16 sUmbreonLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(8, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(16, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(30, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(36, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(42, MOVE_MEAN_LOOK),
+ LEVEL_UP_MOVE(47, MOVE_SCREECH),
+ LEVEL_UP_MOVE(52, MOVE_MOONLIGHT),
+ LEVEL_UP_END
+};
+
+static const u16 sMurkrowLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(9, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(14, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(22, MOVE_HAZE),
+ LEVEL_UP_MOVE(27, MOVE_NIGHT_SHADE),
+ LEVEL_UP_MOVE(35, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(40, MOVE_TAUNT),
+ LEVEL_UP_MOVE(48, MOVE_MEAN_LOOK),
+ LEVEL_UP_END
+};
+
+static const u16 sSlowkingLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_CURSE),
+ LEVEL_UP_MOVE(1, MOVE_YAWN),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(6, MOVE_GROWL),
+ LEVEL_UP_MOVE(13, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(17, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(24, MOVE_DISABLE),
+ LEVEL_UP_MOVE(29, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(36, MOVE_SWAGGER),
+ LEVEL_UP_MOVE(40, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(47, MOVE_PSYCH_UP),
+ LEVEL_UP_END
+};
+
+static const u16 sMisdreavusLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_PSYWAVE),
+ LEVEL_UP_MOVE(6, MOVE_SPITE),
+ LEVEL_UP_MOVE(11, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(17, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(23, MOVE_MEAN_LOOK),
+ LEVEL_UP_MOVE(30, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(37, MOVE_PAIN_SPLIT),
+ LEVEL_UP_MOVE(45, MOVE_PERISH_SONG),
+ LEVEL_UP_MOVE(53, MOVE_GRUDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sUnownLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_HIDDEN_POWER),
+ LEVEL_UP_END
+};
+
+static const u16 sWobbuffetLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_COUNTER),
+ LEVEL_UP_MOVE(1, MOVE_MIRROR_COAT),
+ LEVEL_UP_MOVE(1, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(1, MOVE_DESTINY_BOND),
+ LEVEL_UP_END
+};
+
+static const u16 sGirafarigLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(7, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(13, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(19, MOVE_STOMP),
+ LEVEL_UP_MOVE(25, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(31, MOVE_AGILITY),
+ LEVEL_UP_MOVE(37, MOVE_BATON_PASS),
+ LEVEL_UP_MOVE(43, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(49, MOVE_CRUNCH),
+ LEVEL_UP_END
+};
+
+static const u16 sPinecoLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_PROTECT),
+ LEVEL_UP_MOVE(8, MOVE_SELF_DESTRUCT),
+ LEVEL_UP_MOVE(15, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(22, MOVE_RAPID_SPIN),
+ LEVEL_UP_MOVE(29, MOVE_BIDE),
+ LEVEL_UP_MOVE(36, MOVE_EXPLOSION),
+ LEVEL_UP_MOVE(43, MOVE_SPIKES),
+ LEVEL_UP_MOVE(50, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sForretressLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_PROTECT),
+ LEVEL_UP_MOVE(1, MOVE_SELF_DESTRUCT),
+ LEVEL_UP_MOVE(8, MOVE_SELF_DESTRUCT),
+ LEVEL_UP_MOVE(15, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(22, MOVE_RAPID_SPIN),
+ LEVEL_UP_MOVE(29, MOVE_BIDE),
+ LEVEL_UP_MOVE(31, MOVE_ZAP_CANNON),
+ LEVEL_UP_MOVE(39, MOVE_EXPLOSION),
+ LEVEL_UP_MOVE(49, MOVE_SPIKES),
+ LEVEL_UP_MOVE(59, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sDunsparceLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_RAGE),
+ LEVEL_UP_MOVE(4, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(11, MOVE_YAWN),
+ LEVEL_UP_MOVE(14, MOVE_GLARE),
+ LEVEL_UP_MOVE(21, MOVE_ROLLOUT),
+ LEVEL_UP_MOVE(24, MOVE_SPITE),
+ LEVEL_UP_MOVE(31, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(34, MOVE_SCREECH),
+ LEVEL_UP_MOVE(41, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(44, MOVE_FLAIL),
+ LEVEL_UP_MOVE(51, MOVE_ENDEAVOR),
+ LEVEL_UP_END
+};
+
+static const u16 sGligarLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(6, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(13, MOVE_HARDEN),
+ LEVEL_UP_MOVE(20, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(28, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(36, MOVE_SLASH),
+ LEVEL_UP_MOVE(44, MOVE_SCREECH),
+ LEVEL_UP_MOVE(52, MOVE_GUILLOTINE),
+ LEVEL_UP_END
+};
+
+static const u16 sSteelixLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_SCREECH),
+ LEVEL_UP_MOVE(8, MOVE_BIND),
+ LEVEL_UP_MOVE(12, MOVE_ROCK_THROW),
+ LEVEL_UP_MOVE(19, MOVE_HARDEN),
+ LEVEL_UP_MOVE(23, MOVE_RAGE),
+ LEVEL_UP_MOVE(30, MOVE_DRAGON_BREATH),
+ LEVEL_UP_MOVE(34, MOVE_SANDSTORM),
+ LEVEL_UP_MOVE(41, MOVE_SLAM),
+ LEVEL_UP_MOVE(45, MOVE_IRON_TAIL),
+ LEVEL_UP_MOVE(52, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(56, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sSnubbullLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(8, MOVE_CHARM),
+ LEVEL_UP_MOVE(13, MOVE_BITE),
+ LEVEL_UP_MOVE(19, MOVE_LICK),
+ LEVEL_UP_MOVE(26, MOVE_ROAR),
+ LEVEL_UP_MOVE(34, MOVE_RAGE),
+ LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(53, MOVE_CRUNCH),
+ LEVEL_UP_END
+};
+
+static const u16 sGranbullLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(8, MOVE_CHARM),
+ LEVEL_UP_MOVE(13, MOVE_BITE),
+ LEVEL_UP_MOVE(19, MOVE_LICK),
+ LEVEL_UP_MOVE(28, MOVE_ROAR),
+ LEVEL_UP_MOVE(38, MOVE_RAGE),
+ LEVEL_UP_MOVE(49, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(61, MOVE_CRUNCH),
+ LEVEL_UP_END
+};
+
+static const u16 sQwilfishLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SPIKES),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(9, MOVE_HARDEN),
+ LEVEL_UP_MOVE(9, MOVE_MINIMIZE),
+ LEVEL_UP_MOVE(13, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(21, MOVE_PIN_MISSILE),
+ LEVEL_UP_MOVE(25, MOVE_REVENGE),
+ LEVEL_UP_MOVE(33, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(37, MOVE_HYDRO_PUMP),
+ LEVEL_UP_MOVE(45, MOVE_DESTINY_BOND),
+ LEVEL_UP_END
+};
+
+static const u16 sScizorLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(6, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(11, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(16, MOVE_FALSE_SWIPE),
+ LEVEL_UP_MOVE(21, MOVE_AGILITY),
+ LEVEL_UP_MOVE(26, MOVE_METAL_CLAW),
+ LEVEL_UP_MOVE(31, MOVE_SLASH),
+ LEVEL_UP_MOVE(36, MOVE_SWORDS_DANCE),
+ LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE),
+ LEVEL_UP_MOVE(46, MOVE_FURY_CUTTER),
+ LEVEL_UP_END
+};
+
+static const u16 sShuckleLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_CONSTRICT),
+ LEVEL_UP_MOVE(1, MOVE_WITHDRAW),
+ LEVEL_UP_MOVE(9, MOVE_WRAP),
+ LEVEL_UP_MOVE(14, MOVE_ENCORE),
+ LEVEL_UP_MOVE(23, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(28, MOVE_BIDE),
+ LEVEL_UP_MOVE(37, MOVE_REST),
+ LEVEL_UP_END
+};
+
+static const u16 sHeracrossLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(6, MOVE_HORN_ATTACK),
+ LEVEL_UP_MOVE(11, MOVE_ENDURE),
+ LEVEL_UP_MOVE(17, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(23, MOVE_BRICK_BREAK),
+ LEVEL_UP_MOVE(30, MOVE_COUNTER),
+ LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(45, MOVE_REVERSAL),
+ LEVEL_UP_MOVE(53, MOVE_MEGAHORN),
+ LEVEL_UP_END
+};
+
+static const u16 sSneaselLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_TAUNT),
+ LEVEL_UP_MOVE(8, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(15, MOVE_SCREECH),
+ LEVEL_UP_MOVE(22, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(29, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(36, MOVE_AGILITY),
+ LEVEL_UP_MOVE(43, MOVE_ICY_WIND),
+ LEVEL_UP_MOVE(50, MOVE_SLASH),
+ LEVEL_UP_MOVE(57, MOVE_BEAT_UP),
+ LEVEL_UP_MOVE(64, MOVE_METAL_CLAW),
+ LEVEL_UP_END
+};
+
+static const u16 sTeddiursaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(7, MOVE_LICK),
+ LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(19, MOVE_FAKE_TEARS),
+ LEVEL_UP_MOVE(25, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(31, MOVE_REST),
+ LEVEL_UP_MOVE(37, MOVE_SLASH),
+ LEVEL_UP_MOVE(43, MOVE_SNORE),
+ LEVEL_UP_MOVE(49, MOVE_THRASH),
+ LEVEL_UP_END
+};
+
+static const u16 sUrsaringLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_LICK),
+ LEVEL_UP_MOVE(1, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(7, MOVE_LICK),
+ LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(19, MOVE_FAKE_TEARS),
+ LEVEL_UP_MOVE(25, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(31, MOVE_REST),
+ LEVEL_UP_MOVE(37, MOVE_SLASH),
+ LEVEL_UP_MOVE(43, MOVE_SNORE),
+ LEVEL_UP_MOVE(49, MOVE_THRASH),
+ LEVEL_UP_END
+};
+
+static const u16 sSlugmaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_YAWN),
+ LEVEL_UP_MOVE(1, MOVE_SMOG),
+ LEVEL_UP_MOVE(8, MOVE_EMBER),
+ LEVEL_UP_MOVE(15, MOVE_ROCK_THROW),
+ LEVEL_UP_MOVE(22, MOVE_HARDEN),
+ LEVEL_UP_MOVE(29, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(36, MOVE_FLAMETHROWER),
+ LEVEL_UP_MOVE(43, MOVE_ROCK_SLIDE),
+ LEVEL_UP_MOVE(50, MOVE_BODY_SLAM),
+ LEVEL_UP_END
+};
+
+static const u16 sMagcargoLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_YAWN),
+ LEVEL_UP_MOVE(1, MOVE_SMOG),
+ LEVEL_UP_MOVE(1, MOVE_EMBER),
+ LEVEL_UP_MOVE(1, MOVE_ROCK_THROW),
+ LEVEL_UP_MOVE(8, MOVE_EMBER),
+ LEVEL_UP_MOVE(15, MOVE_ROCK_THROW),
+ LEVEL_UP_MOVE(22, MOVE_HARDEN),
+ LEVEL_UP_MOVE(29, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(36, MOVE_FLAMETHROWER),
+ LEVEL_UP_MOVE(48, MOVE_ROCK_SLIDE),
+ LEVEL_UP_MOVE(60, MOVE_BODY_SLAM),
+ LEVEL_UP_END
+};
+
+static const u16 sSwinubLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(10, MOVE_POWDER_SNOW),
+ LEVEL_UP_MOVE(19, MOVE_ENDURE),
+ LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(37, MOVE_MIST),
+ LEVEL_UP_MOVE(46, MOVE_BLIZZARD),
+ LEVEL_UP_MOVE(55, MOVE_AMNESIA),
+ LEVEL_UP_END
+};
+
+static const u16 sPiloswineLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_HORN_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW),
+ LEVEL_UP_MOVE(1, MOVE_ENDURE),
+ LEVEL_UP_MOVE(10, MOVE_POWDER_SNOW),
+ LEVEL_UP_MOVE(19, MOVE_ENDURE),
+ LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(33, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(42, MOVE_MIST),
+ LEVEL_UP_MOVE(56, MOVE_BLIZZARD),
+ LEVEL_UP_MOVE(70, MOVE_AMNESIA),
+ LEVEL_UP_END
+};
+
+static const u16 sCorsolaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(6, MOVE_HARDEN),
+ LEVEL_UP_MOVE(12, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(17, MOVE_RECOVER),
+ LEVEL_UP_MOVE(17, MOVE_REFRESH),
+ LEVEL_UP_MOVE(23, MOVE_BUBBLE_BEAM),
+ LEVEL_UP_MOVE(28, MOVE_SPIKE_CANNON),
+ LEVEL_UP_MOVE(34, MOVE_ROCK_BLAST),
+ LEVEL_UP_MOVE(39, MOVE_MIRROR_COAT),
+ LEVEL_UP_MOVE(45, MOVE_ANCIENT_POWER),
+ LEVEL_UP_END
+};
+
+static const u16 sRemoraidLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(11, MOVE_LOCK_ON),
+ LEVEL_UP_MOVE(22, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(22, MOVE_AURORA_BEAM),
+ LEVEL_UP_MOVE(22, MOVE_BUBBLE_BEAM),
+ LEVEL_UP_MOVE(33, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(44, MOVE_ICE_BEAM),
+ LEVEL_UP_MOVE(55, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sOctilleryLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(11, MOVE_CONSTRICT),
+ LEVEL_UP_MOVE(22, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(22, MOVE_AURORA_BEAM),
+ LEVEL_UP_MOVE(22, MOVE_BUBBLE_BEAM),
+ LEVEL_UP_MOVE(25, MOVE_OCTAZOOKA),
+ LEVEL_UP_MOVE(38, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(54, MOVE_ICE_BEAM),
+ LEVEL_UP_MOVE(70, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sDelibirdLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PRESENT),
+ LEVEL_UP_END
+};
+
+static const u16 sMantineLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(8, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(15, MOVE_BUBBLE_BEAM),
+ LEVEL_UP_MOVE(22, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(29, MOVE_AGILITY),
+ LEVEL_UP_MOVE(36, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(43, MOVE_WATER_PULSE),
+ LEVEL_UP_MOVE(50, MOVE_CONFUSE_RAY),
+ LEVEL_UP_END
+};
+
+static const u16 sSkarmoryLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(10, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(13, MOVE_SWIFT),
+ LEVEL_UP_MOVE(16, MOVE_AGILITY),
+ LEVEL_UP_MOVE(26, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(29, MOVE_AIR_CUTTER),
+ LEVEL_UP_MOVE(32, MOVE_STEEL_WING),
+ LEVEL_UP_MOVE(42, MOVE_SPIKES),
+ LEVEL_UP_MOVE(45, MOVE_METAL_SOUND),
+ LEVEL_UP_END
+};
+
+static const u16 sHoundourLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_EMBER),
+ LEVEL_UP_MOVE(7, MOVE_HOWL),
+ LEVEL_UP_MOVE(13, MOVE_SMOG),
+ LEVEL_UP_MOVE(19, MOVE_ROAR),
+ LEVEL_UP_MOVE(25, MOVE_BITE),
+ LEVEL_UP_MOVE(31, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(37, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(43, MOVE_FLAMETHROWER),
+ LEVEL_UP_MOVE(49, MOVE_CRUNCH),
+ LEVEL_UP_END
+};
+
+static const u16 sHoundoomLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_EMBER),
+ LEVEL_UP_MOVE(1, MOVE_HOWL),
+ LEVEL_UP_MOVE(7, MOVE_HOWL),
+ LEVEL_UP_MOVE(13, MOVE_SMOG),
+ LEVEL_UP_MOVE(19, MOVE_ROAR),
+ LEVEL_UP_MOVE(27, MOVE_BITE),
+ LEVEL_UP_MOVE(35, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(43, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(51, MOVE_FLAMETHROWER),
+ LEVEL_UP_MOVE(59, MOVE_CRUNCH),
+ LEVEL_UP_END
+};
+
+static const u16 sKingdraLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(1, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(8, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(15, MOVE_LEER),
+ LEVEL_UP_MOVE(22, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(29, MOVE_TWISTER),
+ LEVEL_UP_MOVE(40, MOVE_AGILITY),
+ LEVEL_UP_MOVE(51, MOVE_HYDRO_PUMP),
+ LEVEL_UP_MOVE(62, MOVE_DRAGON_DANCE),
+ LEVEL_UP_END
+};
+
+static const u16 sPhanpyLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(9, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(17, MOVE_FLAIL),
+ LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(33, MOVE_ROLLOUT),
+ LEVEL_UP_MOVE(41, MOVE_ENDURE),
+ LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sDonphanLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(1, MOVE_HORN_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(9, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(17, MOVE_FLAIL),
+ LEVEL_UP_MOVE(25, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(33, MOVE_ROLLOUT),
+ LEVEL_UP_MOVE(41, MOVE_RAPID_SPIN),
+ LEVEL_UP_MOVE(49, MOVE_EARTHQUAKE),
+ LEVEL_UP_END
+};
+
+static const u16 sPorygon2LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_CONVERSION_2),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_CONVERSION),
+ LEVEL_UP_MOVE(9, MOVE_AGILITY),
+ LEVEL_UP_MOVE(12, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(20, MOVE_RECOVER),
+ LEVEL_UP_MOVE(24, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(32, MOVE_LOCK_ON),
+ LEVEL_UP_MOVE(36, MOVE_TRI_ATTACK),
+ LEVEL_UP_MOVE(44, MOVE_RECYCLE),
+ LEVEL_UP_MOVE(48, MOVE_ZAP_CANNON),
+ LEVEL_UP_END
+};
+
+static const u16 sStantlerLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(7, MOVE_LEER),
+ LEVEL_UP_MOVE(11, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(17, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(21, MOVE_STOMP),
+ LEVEL_UP_MOVE(27, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(31, MOVE_ROLE_PLAY),
+ LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(41, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(47, MOVE_CALM_MIND),
+ LEVEL_UP_END
+};
+
+static const u16 sSmeargleLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SKETCH),
+ LEVEL_UP_MOVE(11, MOVE_SKETCH),
+ LEVEL_UP_MOVE(21, MOVE_SKETCH),
+ LEVEL_UP_MOVE(31, MOVE_SKETCH),
+ LEVEL_UP_MOVE(41, MOVE_SKETCH),
+ LEVEL_UP_MOVE(51, MOVE_SKETCH),
+ LEVEL_UP_MOVE(61, MOVE_SKETCH),
+ LEVEL_UP_MOVE(71, MOVE_SKETCH),
+ LEVEL_UP_MOVE(81, MOVE_SKETCH),
+ LEVEL_UP_MOVE(91, MOVE_SKETCH),
+ LEVEL_UP_END
+};
+
+static const u16 sTyrogueLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sHitmontopLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_REVENGE),
+ LEVEL_UP_MOVE(1, MOVE_ROLLING_KICK),
+ LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(13, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(19, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(20, MOVE_TRIPLE_KICK),
+ LEVEL_UP_MOVE(25, MOVE_RAPID_SPIN),
+ LEVEL_UP_MOVE(31, MOVE_COUNTER),
+ LEVEL_UP_MOVE(37, MOVE_AGILITY),
+ LEVEL_UP_MOVE(43, MOVE_DETECT),
+ LEVEL_UP_MOVE(49, MOVE_ENDEAVOR),
+ LEVEL_UP_END
+};
+
+static const u16 sSmoochumLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(1, MOVE_LICK),
+ LEVEL_UP_MOVE(9, MOVE_SWEET_KISS),
+ LEVEL_UP_MOVE(13, MOVE_POWDER_SNOW),
+ LEVEL_UP_MOVE(21, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(25, MOVE_SING),
+ LEVEL_UP_MOVE(33, MOVE_MEAN_LOOK),
+ LEVEL_UP_MOVE(37, MOVE_FAKE_TEARS),
+ LEVEL_UP_MOVE(45, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(49, MOVE_PERISH_SONG),
+ LEVEL_UP_MOVE(57, MOVE_BLIZZARD),
+ LEVEL_UP_END
+};
+
+static const u16 sElekidLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(9, MOVE_THUNDER_PUNCH),
+ LEVEL_UP_MOVE(17, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(25, MOVE_SWIFT),
+ LEVEL_UP_MOVE(33, MOVE_SCREECH),
+ LEVEL_UP_MOVE(41, MOVE_THUNDERBOLT),
+ LEVEL_UP_MOVE(49, MOVE_THUNDER),
+ LEVEL_UP_END
+};
+
+static const u16 sMagbyLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_EMBER),
+ LEVEL_UP_MOVE(7, MOVE_LEER),
+ LEVEL_UP_MOVE(13, MOVE_SMOG),
+ LEVEL_UP_MOVE(19, MOVE_FIRE_PUNCH),
+ LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(31, MOVE_SUNNY_DAY),
+ LEVEL_UP_MOVE(37, MOVE_FLAMETHROWER),
+ LEVEL_UP_MOVE(43, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(49, MOVE_FIRE_BLAST),
+ LEVEL_UP_END
+};
+
+static const u16 sMiltankLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(4, MOVE_GROWL),
+ LEVEL_UP_MOVE(8, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(13, MOVE_STOMP),
+ LEVEL_UP_MOVE(19, MOVE_MILK_DRINK),
+ LEVEL_UP_MOVE(26, MOVE_BIDE),
+ LEVEL_UP_MOVE(34, MOVE_ROLLOUT),
+ LEVEL_UP_MOVE(43, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(53, MOVE_HEAL_BELL),
+ LEVEL_UP_END
+};
+
+static const u16 sBlisseyLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(4, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(7, MOVE_REFRESH),
+ LEVEL_UP_MOVE(10, MOVE_SOFT_BOILED),
+ LEVEL_UP_MOVE(13, MOVE_DOUBLE_SLAP),
+ LEVEL_UP_MOVE(18, MOVE_MINIMIZE),
+ LEVEL_UP_MOVE(23, MOVE_SING),
+ LEVEL_UP_MOVE(28, MOVE_EGG_BOMB),
+ LEVEL_UP_MOVE(33, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(40, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(47, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sRaikouLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(11, MOVE_THUNDER_SHOCK),
+ LEVEL_UP_MOVE(21, MOVE_ROAR),
+ LEVEL_UP_MOVE(31, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(41, MOVE_SPARK),
+ LEVEL_UP_MOVE(51, MOVE_REFLECT),
+ LEVEL_UP_MOVE(61, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(71, MOVE_THUNDER),
+ LEVEL_UP_MOVE(81, MOVE_CALM_MIND),
+ LEVEL_UP_END
+};
+
+static const u16 sEnteiLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(11, MOVE_EMBER),
+ LEVEL_UP_MOVE(21, MOVE_ROAR),
+ LEVEL_UP_MOVE(31, MOVE_FIRE_SPIN),
+ LEVEL_UP_MOVE(41, MOVE_STOMP),
+ LEVEL_UP_MOVE(51, MOVE_FLAMETHROWER),
+ LEVEL_UP_MOVE(61, MOVE_SWAGGER),
+ LEVEL_UP_MOVE(71, MOVE_FIRE_BLAST),
+ LEVEL_UP_MOVE(81, MOVE_CALM_MIND),
+ LEVEL_UP_END
+};
+
+static const u16 sSuicuneLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(11, MOVE_BUBBLE_BEAM),
+ LEVEL_UP_MOVE(21, MOVE_RAIN_DANCE),
+ LEVEL_UP_MOVE(31, MOVE_GUST),
+ LEVEL_UP_MOVE(41, MOVE_AURORA_BEAM),
+ LEVEL_UP_MOVE(51, MOVE_MIST),
+ LEVEL_UP_MOVE(61, MOVE_MIRROR_COAT),
+ LEVEL_UP_MOVE(71, MOVE_HYDRO_PUMP),
+ LEVEL_UP_MOVE(81, MOVE_CALM_MIND),
+ LEVEL_UP_END
+};
+
+static const u16 sLarvitarLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(8, MOVE_SANDSTORM),
+ LEVEL_UP_MOVE(15, MOVE_SCREECH),
+ LEVEL_UP_MOVE(22, MOVE_ROCK_SLIDE),
+ LEVEL_UP_MOVE(29, MOVE_THRASH),
+ LEVEL_UP_MOVE(36, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(43, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(50, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sPupitarLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_SANDSTORM),
+ LEVEL_UP_MOVE(1, MOVE_SCREECH),
+ LEVEL_UP_MOVE(8, MOVE_SANDSTORM),
+ LEVEL_UP_MOVE(15, MOVE_SCREECH),
+ LEVEL_UP_MOVE(22, MOVE_ROCK_SLIDE),
+ LEVEL_UP_MOVE(29, MOVE_THRASH),
+ LEVEL_UP_MOVE(38, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(47, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(56, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sTyranitarLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_SANDSTORM),
+ LEVEL_UP_MOVE(1, MOVE_SCREECH),
+ LEVEL_UP_MOVE(8, MOVE_SANDSTORM),
+ LEVEL_UP_MOVE(15, MOVE_SCREECH),
+ LEVEL_UP_MOVE(22, MOVE_ROCK_SLIDE),
+ LEVEL_UP_MOVE(29, MOVE_THRASH),
+ LEVEL_UP_MOVE(38, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(47, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(61, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(75, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sLugiaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WHIRLWIND),
+ LEVEL_UP_MOVE(11, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(22, MOVE_GUST),
+ LEVEL_UP_MOVE(33, MOVE_RECOVER),
+ LEVEL_UP_MOVE(44, MOVE_HYDRO_PUMP),
+ LEVEL_UP_MOVE(55, MOVE_RAIN_DANCE),
+ LEVEL_UP_MOVE(66, MOVE_SWIFT),
+ LEVEL_UP_MOVE(77, MOVE_AEROBLAST),
+ LEVEL_UP_MOVE(88, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(99, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_END
+};
+
+static const u16 sHoOhLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WHIRLWIND),
+ LEVEL_UP_MOVE(11, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(22, MOVE_GUST),
+ LEVEL_UP_MOVE(33, MOVE_RECOVER),
+ LEVEL_UP_MOVE(44, MOVE_FIRE_BLAST),
+ LEVEL_UP_MOVE(55, MOVE_SUNNY_DAY),
+ LEVEL_UP_MOVE(66, MOVE_SWIFT),
+ LEVEL_UP_MOVE(77, MOVE_SACRED_FIRE),
+ LEVEL_UP_MOVE(88, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(99, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_END
+};
+
+static const u16 sCelebiLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_LEECH_SEED),
+ LEVEL_UP_MOVE(1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(1, MOVE_RECOVER),
+ LEVEL_UP_MOVE(1, MOVE_HEAL_BELL),
+ LEVEL_UP_MOVE(10, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(20, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(40, MOVE_BATON_PASS),
+ LEVEL_UP_MOVE(50, MOVE_PERISH_SONG),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies252LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies253LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies254LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies255LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies256LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies257LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies258LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies259LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies260LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies261LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies262LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies263LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies264LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies265LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies266LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies267LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies268LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies269LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies270LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies271LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies272LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies273LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies274LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies275LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sSpecies276LevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_END
+};
+
+static const u16 sTreeckoLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(6, MOVE_ABSORB),
+ LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(16, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(21, MOVE_SCREECH),
+ LEVEL_UP_MOVE(26, MOVE_MEGA_DRAIN),
+ LEVEL_UP_MOVE(31, MOVE_AGILITY),
+ LEVEL_UP_MOVE(36, MOVE_SLAM),
+ LEVEL_UP_MOVE(41, MOVE_DETECT),
+ LEVEL_UP_MOVE(46, MOVE_GIGA_DRAIN),
+ LEVEL_UP_END
+};
+
+static const u16 sGrovyleLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_ABSORB),
+ LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(6, MOVE_ABSORB),
+ LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(16, MOVE_FURY_CUTTER),
+ LEVEL_UP_MOVE(17, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(23, MOVE_SCREECH),
+ LEVEL_UP_MOVE(29, MOVE_LEAF_BLADE),
+ LEVEL_UP_MOVE(35, MOVE_AGILITY),
+ LEVEL_UP_MOVE(41, MOVE_SLAM),
+ LEVEL_UP_MOVE(47, MOVE_DETECT),
+ LEVEL_UP_MOVE(53, MOVE_FALSE_SWIPE),
+ LEVEL_UP_END
+};
+
+static const u16 sSceptileLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_ABSORB),
+ LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(6, MOVE_ABSORB),
+ LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(16, MOVE_FURY_CUTTER),
+ LEVEL_UP_MOVE(17, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(23, MOVE_SCREECH),
+ LEVEL_UP_MOVE(29, MOVE_LEAF_BLADE),
+ LEVEL_UP_MOVE(35, MOVE_AGILITY),
+ LEVEL_UP_MOVE(43, MOVE_SLAM),
+ LEVEL_UP_MOVE(51, MOVE_DETECT),
+ LEVEL_UP_MOVE(59, MOVE_FALSE_SWIPE),
+ LEVEL_UP_END
+};
+
+static const u16 sTorchicLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(10, MOVE_EMBER),
+ LEVEL_UP_MOVE(16, MOVE_PECK),
+ LEVEL_UP_MOVE(19, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(25, MOVE_FIRE_SPIN),
+ LEVEL_UP_MOVE(28, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(34, MOVE_SLASH),
+ LEVEL_UP_MOVE(37, MOVE_MIRROR_MOVE),
+ LEVEL_UP_MOVE(43, MOVE_FLAMETHROWER),
+ LEVEL_UP_END
+};
+
+static const u16 sCombuskenLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(1, MOVE_EMBER),
+ LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(13, MOVE_EMBER),
+ LEVEL_UP_MOVE(16, MOVE_DOUBLE_KICK),
+ LEVEL_UP_MOVE(17, MOVE_PECK),
+ LEVEL_UP_MOVE(21, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(28, MOVE_BULK_UP),
+ LEVEL_UP_MOVE(32, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(39, MOVE_SLASH),
+ LEVEL_UP_MOVE(43, MOVE_MIRROR_MOVE),
+ LEVEL_UP_MOVE(50, MOVE_SKY_UPPERCUT),
+ LEVEL_UP_END
+};
+
+static const u16 sBlazikenLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_FIRE_PUNCH),
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(1, MOVE_EMBER),
+ LEVEL_UP_MOVE(7, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(13, MOVE_EMBER),
+ LEVEL_UP_MOVE(16, MOVE_DOUBLE_KICK),
+ LEVEL_UP_MOVE(17, MOVE_PECK),
+ LEVEL_UP_MOVE(21, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(28, MOVE_BULK_UP),
+ LEVEL_UP_MOVE(32, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(36, MOVE_BLAZE_KICK),
+ LEVEL_UP_MOVE(42, MOVE_SLASH),
+ LEVEL_UP_MOVE(49, MOVE_MIRROR_MOVE),
+ LEVEL_UP_MOVE(59, MOVE_SKY_UPPERCUT),
+ LEVEL_UP_END
+};
+
+static const u16 sMudkipLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(6, MOVE_MUD_SLAP),
+ LEVEL_UP_MOVE(10, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(15, MOVE_BIDE),
+ LEVEL_UP_MOVE(19, MOVE_FORESIGHT),
+ LEVEL_UP_MOVE(24, MOVE_MUD_SPORT),
+ LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(33, MOVE_WHIRLPOOL),
+ LEVEL_UP_MOVE(37, MOVE_PROTECT),
+ LEVEL_UP_MOVE(42, MOVE_HYDRO_PUMP),
+ LEVEL_UP_MOVE(46, MOVE_ENDEAVOR),
+ LEVEL_UP_END
+};
+
+static const u16 sMarshtompLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_MUD_SLAP),
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(6, MOVE_MUD_SLAP),
+ LEVEL_UP_MOVE(10, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(15, MOVE_BIDE),
+ LEVEL_UP_MOVE(16, MOVE_MUD_SHOT),
+ LEVEL_UP_MOVE(20, MOVE_FORESIGHT),
+ LEVEL_UP_MOVE(25, MOVE_MUD_SPORT),
+ LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(37, MOVE_MUDDY_WATER),
+ LEVEL_UP_MOVE(42, MOVE_PROTECT),
+ LEVEL_UP_MOVE(46, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(53, MOVE_ENDEAVOR),
+ LEVEL_UP_END
+};
+
+static const u16 sSwampertLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_MUD_SLAP),
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(6, MOVE_MUD_SLAP),
+ LEVEL_UP_MOVE(10, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(15, MOVE_BIDE),
+ LEVEL_UP_MOVE(16, MOVE_MUD_SHOT),
+ LEVEL_UP_MOVE(20, MOVE_FORESIGHT),
+ LEVEL_UP_MOVE(25, MOVE_MUD_SPORT),
+ LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(39, MOVE_MUDDY_WATER),
+ LEVEL_UP_MOVE(46, MOVE_PROTECT),
+ LEVEL_UP_MOVE(52, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(61, MOVE_ENDEAVOR),
+ LEVEL_UP_END
+};
+
+static const u16 sPoochyenaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(5, MOVE_HOWL),
+ LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(13, MOVE_BITE),
+ LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(21, MOVE_ROAR),
+ LEVEL_UP_MOVE(25, MOVE_SWAGGER),
+ LEVEL_UP_MOVE(29, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(33, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(37, MOVE_TAUNT),
+ LEVEL_UP_MOVE(41, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(45, MOVE_THIEF),
+ LEVEL_UP_END
+};
+
+static const u16 sMightyenaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_HOWL),
+ LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(5, MOVE_HOWL),
+ LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(13, MOVE_BITE),
+ LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(22, MOVE_ROAR),
+ LEVEL_UP_MOVE(27, MOVE_SWAGGER),
+ LEVEL_UP_MOVE(32, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(42, MOVE_TAUNT),
+ LEVEL_UP_MOVE(47, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(52, MOVE_THIEF),
+ LEVEL_UP_END
+};
+
+static const u16 sZigzagoonLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(9, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(13, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(21, MOVE_MUD_SPORT),
+ LEVEL_UP_MOVE(25, MOVE_PIN_MISSILE),
+ LEVEL_UP_MOVE(29, MOVE_COVET),
+ LEVEL_UP_MOVE(33, MOVE_FLAIL),
+ LEVEL_UP_MOVE(37, MOVE_REST),
+ LEVEL_UP_MOVE(41, MOVE_BELLY_DRUM),
+ LEVEL_UP_END
+};
+
+static const u16 sLinooneLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(5, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(9, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(13, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(23, MOVE_MUD_SPORT),
+ LEVEL_UP_MOVE(29, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(35, MOVE_COVET),
+ LEVEL_UP_MOVE(41, MOVE_SLASH),
+ LEVEL_UP_MOVE(47, MOVE_REST),
+ LEVEL_UP_MOVE(53, MOVE_BELLY_DRUM),
+ LEVEL_UP_END
+};
+
+static const u16 sWurmpleLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_STRING_SHOT),
+ LEVEL_UP_MOVE(5, MOVE_POISON_STING),
+ LEVEL_UP_END
+};
+
+static const u16 sSilcoonLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(7, MOVE_HARDEN),
+ LEVEL_UP_END
+};
+
+static const u16 sBeautiflyLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ABSORB),
+ LEVEL_UP_MOVE(10, MOVE_ABSORB),
+ LEVEL_UP_MOVE(13, MOVE_GUST),
+ LEVEL_UP_MOVE(17, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(20, MOVE_MORNING_SUN),
+ LEVEL_UP_MOVE(24, MOVE_MEGA_DRAIN),
+ LEVEL_UP_MOVE(27, MOVE_WHIRLWIND),
+ LEVEL_UP_MOVE(31, MOVE_ATTRACT),
+ LEVEL_UP_MOVE(34, MOVE_SILVER_WIND),
+ LEVEL_UP_MOVE(38, MOVE_GIGA_DRAIN),
+ LEVEL_UP_END
+};
+
+static const u16 sCascoonLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(7, MOVE_HARDEN),
+ LEVEL_UP_END
+};
+
+static const u16 sDustoxLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(10, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(13, MOVE_GUST),
+ LEVEL_UP_MOVE(17, MOVE_PROTECT),
+ LEVEL_UP_MOVE(20, MOVE_MOONLIGHT),
+ LEVEL_UP_MOVE(24, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(27, MOVE_WHIRLWIND),
+ LEVEL_UP_MOVE(31, MOVE_LIGHT_SCREEN),
+ LEVEL_UP_MOVE(34, MOVE_SILVER_WIND),
+ LEVEL_UP_MOVE(38, MOVE_TOXIC),
+ LEVEL_UP_END
+};
+
+static const u16 sLotadLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(3, MOVE_GROWL),
+ LEVEL_UP_MOVE(7, MOVE_ABSORB),
+ LEVEL_UP_MOVE(13, MOVE_NATURE_POWER),
+ LEVEL_UP_MOVE(21, MOVE_MIST),
+ LEVEL_UP_MOVE(31, MOVE_RAIN_DANCE),
+ LEVEL_UP_MOVE(43, MOVE_MEGA_DRAIN),
+ LEVEL_UP_END
+};
+
+static const u16 sLombreLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(3, MOVE_GROWL),
+ LEVEL_UP_MOVE(7, MOVE_ABSORB),
+ LEVEL_UP_MOVE(13, MOVE_NATURE_POWER),
+ LEVEL_UP_MOVE(19, MOVE_FAKE_OUT),
+ LEVEL_UP_MOVE(25, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(31, MOVE_WATER_SPORT),
+ LEVEL_UP_MOVE(37, MOVE_THIEF),
+ LEVEL_UP_MOVE(43, MOVE_UPROAR),
+ LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sLudicoloLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_ABSORB),
+ LEVEL_UP_MOVE(1, MOVE_NATURE_POWER),
+ LEVEL_UP_END
+};
+
+static const u16 sSeedotLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BIDE),
+ LEVEL_UP_MOVE(3, MOVE_HARDEN),
+ LEVEL_UP_MOVE(7, MOVE_GROWTH),
+ LEVEL_UP_MOVE(13, MOVE_NATURE_POWER),
+ LEVEL_UP_MOVE(21, MOVE_SYNTHESIS),
+ LEVEL_UP_MOVE(31, MOVE_SUNNY_DAY),
+ LEVEL_UP_MOVE(43, MOVE_EXPLOSION),
+ LEVEL_UP_END
+};
+
+static const u16 sNuzleafLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(3, MOVE_HARDEN),
+ LEVEL_UP_MOVE(7, MOVE_GROWTH),
+ LEVEL_UP_MOVE(13, MOVE_NATURE_POWER),
+ LEVEL_UP_MOVE(19, MOVE_FAKE_OUT),
+ LEVEL_UP_MOVE(25, MOVE_TORMENT),
+ LEVEL_UP_MOVE(31, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(37, MOVE_RAZOR_WIND),
+ LEVEL_UP_MOVE(43, MOVE_SWAGGER),
+ LEVEL_UP_MOVE(49, MOVE_EXTRASENSORY),
+ LEVEL_UP_END
+};
+
+static const u16 sShiftryLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(1, MOVE_GROWTH),
+ LEVEL_UP_MOVE(1, MOVE_NATURE_POWER),
+ LEVEL_UP_END
+};
+
+static const u16 sNincadaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(5, MOVE_LEECH_LIFE),
+ LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(19, MOVE_MIND_READER),
+ LEVEL_UP_MOVE(25, MOVE_FALSE_SWIPE),
+ LEVEL_UP_MOVE(31, MOVE_MUD_SLAP),
+ LEVEL_UP_MOVE(38, MOVE_METAL_CLAW),
+ LEVEL_UP_MOVE(45, MOVE_DIG),
+ LEVEL_UP_END
+};
+
+static const u16 sNinjaskLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(1, MOVE_LEECH_LIFE),
+ LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(5, MOVE_LEECH_LIFE),
+ LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(19, MOVE_MIND_READER),
+ LEVEL_UP_MOVE(20, MOVE_DOUBLE_TEAM),
+ LEVEL_UP_MOVE(20, MOVE_FURY_CUTTER),
+ LEVEL_UP_MOVE(20, MOVE_SCREECH),
+ LEVEL_UP_MOVE(25, MOVE_SWORDS_DANCE),
+ LEVEL_UP_MOVE(31, MOVE_SLASH),
+ LEVEL_UP_MOVE(38, MOVE_AGILITY),
+ LEVEL_UP_MOVE(45, MOVE_BATON_PASS),
+ LEVEL_UP_END
+};
+
+static const u16 sShedinjaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(5, MOVE_LEECH_LIFE),
+ LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(19, MOVE_MIND_READER),
+ LEVEL_UP_MOVE(25, MOVE_SPITE),
+ LEVEL_UP_MOVE(31, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(38, MOVE_SHADOW_BALL),
+ LEVEL_UP_MOVE(45, MOVE_GRUDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sTaillowLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(4, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(8, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(13, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(19, MOVE_DOUBLE_TEAM),
+ LEVEL_UP_MOVE(26, MOVE_ENDEAVOR),
+ LEVEL_UP_MOVE(34, MOVE_AERIAL_ACE),
+ LEVEL_UP_MOVE(43, MOVE_AGILITY),
+ LEVEL_UP_END
+};
+
+static const u16 sSwellowLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(4, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(8, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(13, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(19, MOVE_DOUBLE_TEAM),
+ LEVEL_UP_MOVE(28, MOVE_ENDEAVOR),
+ LEVEL_UP_MOVE(38, MOVE_AERIAL_ACE),
+ LEVEL_UP_MOVE(49, MOVE_AGILITY),
+ LEVEL_UP_END
+};
+
+static const u16 sShroomishLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ABSORB),
+ LEVEL_UP_MOVE(4, MOVE_TACKLE),
+ LEVEL_UP_MOVE(7, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(10, MOVE_LEECH_SEED),
+ LEVEL_UP_MOVE(16, MOVE_MEGA_DRAIN),
+ LEVEL_UP_MOVE(22, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(28, MOVE_POISON_POWDER),
+ LEVEL_UP_MOVE(36, MOVE_GROWTH),
+ LEVEL_UP_MOVE(45, MOVE_GIGA_DRAIN),
+ LEVEL_UP_MOVE(54, MOVE_SPORE),
+ LEVEL_UP_END
+};
+
+static const u16 sBreloomLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ABSORB),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(1, MOVE_LEECH_SEED),
+ LEVEL_UP_MOVE(4, MOVE_TACKLE),
+ LEVEL_UP_MOVE(7, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(10, MOVE_LEECH_SEED),
+ LEVEL_UP_MOVE(16, MOVE_MEGA_DRAIN),
+ LEVEL_UP_MOVE(22, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(23, MOVE_MACH_PUNCH),
+ LEVEL_UP_MOVE(28, MOVE_COUNTER),
+ LEVEL_UP_MOVE(36, MOVE_SKY_UPPERCUT),
+ LEVEL_UP_MOVE(45, MOVE_MIND_READER),
+ LEVEL_UP_MOVE(54, MOVE_DYNAMIC_PUNCH),
+ LEVEL_UP_END
+};
+
+static const u16 sSpindaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(5, MOVE_UPROAR),
+ LEVEL_UP_MOVE(12, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(16, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(23, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(27, MOVE_DIZZY_PUNCH),
+ LEVEL_UP_MOVE(34, MOVE_TEETER_DANCE),
+ LEVEL_UP_MOVE(38, MOVE_PSYCH_UP),
+ LEVEL_UP_MOVE(45, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_MOVE(49, MOVE_FLAIL),
+ LEVEL_UP_MOVE(56, MOVE_THRASH),
+ LEVEL_UP_END
+};
+
+static const u16 sWingullLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(7, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(13, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(21, MOVE_MIST),
+ LEVEL_UP_MOVE(31, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(43, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(55, MOVE_AGILITY),
+ LEVEL_UP_END
+};
+
+static const u16 sPelipperLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(1, MOVE_WATER_SPORT),
+ LEVEL_UP_MOVE(1, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(3, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(7, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(13, MOVE_WING_ATTACK),
+ LEVEL_UP_MOVE(21, MOVE_MIST),
+ LEVEL_UP_MOVE(25, MOVE_PROTECT),
+ LEVEL_UP_MOVE(33, MOVE_STOCKPILE),
+ LEVEL_UP_MOVE(33, MOVE_SWALLOW),
+ LEVEL_UP_MOVE(47, MOVE_SPIT_UP),
+ LEVEL_UP_MOVE(61, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sSurskitLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(13, MOVE_SWEET_SCENT),
+ LEVEL_UP_MOVE(19, MOVE_WATER_SPORT),
+ LEVEL_UP_MOVE(25, MOVE_BUBBLE_BEAM),
+ LEVEL_UP_MOVE(31, MOVE_AGILITY),
+ LEVEL_UP_MOVE(37, MOVE_MIST),
+ LEVEL_UP_MOVE(37, MOVE_HAZE),
+ LEVEL_UP_END
+};
+
+static const u16 sMasquerainLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(1, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_SWEET_SCENT),
+ LEVEL_UP_MOVE(1, MOVE_WATER_SPORT),
+ LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(13, MOVE_SWEET_SCENT),
+ LEVEL_UP_MOVE(19, MOVE_WATER_SPORT),
+ LEVEL_UP_MOVE(26, MOVE_GUST),
+ LEVEL_UP_MOVE(33, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(40, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(47, MOVE_SILVER_WIND),
+ LEVEL_UP_MOVE(53, MOVE_WHIRLWIND),
+ LEVEL_UP_END
+};
+
+static const u16 sWailmerLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SPLASH),
+ LEVEL_UP_MOVE(5, MOVE_GROWL),
+ LEVEL_UP_MOVE(10, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(14, MOVE_ROLLOUT),
+ LEVEL_UP_MOVE(19, MOVE_WHIRLPOOL),
+ LEVEL_UP_MOVE(23, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(28, MOVE_WATER_PULSE),
+ LEVEL_UP_MOVE(32, MOVE_MIST),
+ LEVEL_UP_MOVE(37, MOVE_REST),
+ LEVEL_UP_MOVE(41, MOVE_WATER_SPOUT),
+ LEVEL_UP_MOVE(46, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sWailordLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SPLASH),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(1, MOVE_ROLLOUT),
+ LEVEL_UP_MOVE(5, MOVE_GROWL),
+ LEVEL_UP_MOVE(10, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(14, MOVE_ROLLOUT),
+ LEVEL_UP_MOVE(19, MOVE_WHIRLPOOL),
+ LEVEL_UP_MOVE(23, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(28, MOVE_WATER_PULSE),
+ LEVEL_UP_MOVE(32, MOVE_MIST),
+ LEVEL_UP_MOVE(37, MOVE_REST),
+ LEVEL_UP_MOVE(44, MOVE_WATER_SPOUT),
+ LEVEL_UP_MOVE(52, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(59, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sSkittyLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(3, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(7, MOVE_ATTRACT),
+ LEVEL_UP_MOVE(13, MOVE_SING),
+ LEVEL_UP_MOVE(15, MOVE_DOUBLE_SLAP),
+ LEVEL_UP_MOVE(19, MOVE_ASSIST),
+ LEVEL_UP_MOVE(25, MOVE_CHARM),
+ LEVEL_UP_MOVE(27, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(31, MOVE_COVET),
+ LEVEL_UP_MOVE(37, MOVE_HEAL_BELL),
+ LEVEL_UP_MOVE(39, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sDelcattyLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_ATTRACT),
+ LEVEL_UP_MOVE(1, MOVE_SING),
+ LEVEL_UP_MOVE(1, MOVE_DOUBLE_SLAP),
+ LEVEL_UP_END
+};
+
+static const u16 sKecleonLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_THIEF),
+ LEVEL_UP_MOVE(1, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(1, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(1, MOVE_LICK),
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(4, MOVE_BIND),
+ LEVEL_UP_MOVE(7, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(12, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(17, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(24, MOVE_SCREECH),
+ LEVEL_UP_MOVE(31, MOVE_SLASH),
+ LEVEL_UP_MOVE(40, MOVE_SUBSTITUTE),
+ LEVEL_UP_MOVE(49, MOVE_ANCIENT_POWER),
+ LEVEL_UP_END
+};
+
+static const u16 sBaltoyLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(3, MOVE_HARDEN),
+ LEVEL_UP_MOVE(5, MOVE_RAPID_SPIN),
+ LEVEL_UP_MOVE(7, MOVE_MUD_SLAP),
+ LEVEL_UP_MOVE(11, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(15, MOVE_ROCK_TOMB),
+ LEVEL_UP_MOVE(19, MOVE_SELF_DESTRUCT),
+ LEVEL_UP_MOVE(25, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(31, MOVE_SANDSTORM),
+ LEVEL_UP_MOVE(37, MOVE_COSMIC_POWER),
+ LEVEL_UP_MOVE(45, MOVE_EXPLOSION),
+ LEVEL_UP_END
+};
+
+static const u16 sClaydolLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TELEPORT),
+ LEVEL_UP_MOVE(1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(1, MOVE_RAPID_SPIN),
+ LEVEL_UP_MOVE(3, MOVE_HARDEN),
+ LEVEL_UP_MOVE(5, MOVE_RAPID_SPIN),
+ LEVEL_UP_MOVE(7, MOVE_MUD_SLAP),
+ LEVEL_UP_MOVE(11, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(15, MOVE_ROCK_TOMB),
+ LEVEL_UP_MOVE(19, MOVE_SELF_DESTRUCT),
+ LEVEL_UP_MOVE(25, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(31, MOVE_SANDSTORM),
+ LEVEL_UP_MOVE(36, MOVE_HYPER_BEAM),
+ LEVEL_UP_MOVE(42, MOVE_COSMIC_POWER),
+ LEVEL_UP_MOVE(55, MOVE_EXPLOSION),
+ LEVEL_UP_END
+};
+
+static const u16 sNosepassLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(7, MOVE_HARDEN),
+ LEVEL_UP_MOVE(13, MOVE_ROCK_THROW),
+ LEVEL_UP_MOVE(16, MOVE_BLOCK),
+ LEVEL_UP_MOVE(22, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(28, MOVE_ROCK_SLIDE),
+ LEVEL_UP_MOVE(31, MOVE_SANDSTORM),
+ LEVEL_UP_MOVE(37, MOVE_REST),
+ LEVEL_UP_MOVE(43, MOVE_ZAP_CANNON),
+ LEVEL_UP_MOVE(46, MOVE_LOCK_ON),
+ LEVEL_UP_END
+};
+
+static const u16 sTorkoalLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_EMBER),
+ LEVEL_UP_MOVE(4, MOVE_SMOG),
+ LEVEL_UP_MOVE(7, MOVE_CURSE),
+ LEVEL_UP_MOVE(14, MOVE_SMOKESCREEN),
+ LEVEL_UP_MOVE(17, MOVE_FIRE_SPIN),
+ LEVEL_UP_MOVE(20, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(27, MOVE_PROTECT),
+ LEVEL_UP_MOVE(30, MOVE_FLAMETHROWER),
+ LEVEL_UP_MOVE(33, MOVE_IRON_DEFENSE),
+ LEVEL_UP_MOVE(40, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(43, MOVE_FLAIL),
+ LEVEL_UP_MOVE(46, MOVE_HEAT_WAVE),
+ LEVEL_UP_END
+};
+
+static const u16 sSableyeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(5, MOVE_FORESIGHT),
+ LEVEL_UP_MOVE(9, MOVE_NIGHT_SHADE),
+ LEVEL_UP_MOVE(13, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(17, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(21, MOVE_FAKE_OUT),
+ LEVEL_UP_MOVE(25, MOVE_DETECT),
+ LEVEL_UP_MOVE(29, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(33, MOVE_KNOCK_OFF),
+ LEVEL_UP_MOVE(37, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(41, MOVE_SHADOW_BALL),
+ LEVEL_UP_MOVE(45, MOVE_MEAN_LOOK),
+ LEVEL_UP_END
+};
+
+static const u16 sBarboachLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_MUD_SLAP),
+ LEVEL_UP_MOVE(6, MOVE_MUD_SPORT),
+ LEVEL_UP_MOVE(6, MOVE_WATER_SPORT),
+ LEVEL_UP_MOVE(11, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(16, MOVE_MAGNITUDE),
+ LEVEL_UP_MOVE(21, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(26, MOVE_REST),
+ LEVEL_UP_MOVE(26, MOVE_SNORE),
+ LEVEL_UP_MOVE(31, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(36, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(41, MOVE_FISSURE),
+ LEVEL_UP_END
+};
+
+static const u16 sWhiscashLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TICKLE),
+ LEVEL_UP_MOVE(1, MOVE_MUD_SLAP),
+ LEVEL_UP_MOVE(1, MOVE_MUD_SPORT),
+ LEVEL_UP_MOVE(1, MOVE_WATER_SPORT),
+ LEVEL_UP_MOVE(6, MOVE_MUD_SPORT),
+ LEVEL_UP_MOVE(6, MOVE_WATER_SPORT),
+ LEVEL_UP_MOVE(11, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(16, MOVE_MAGNITUDE),
+ LEVEL_UP_MOVE(21, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(26, MOVE_REST),
+ LEVEL_UP_MOVE(26, MOVE_SNORE),
+ LEVEL_UP_MOVE(36, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(46, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(56, MOVE_FISSURE),
+ LEVEL_UP_END
+};
+
+static const u16 sLuvdiscLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(4, MOVE_CHARM),
+ LEVEL_UP_MOVE(12, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(16, MOVE_AGILITY),
+ LEVEL_UP_MOVE(24, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(28, MOVE_ATTRACT),
+ LEVEL_UP_MOVE(36, MOVE_SWEET_KISS),
+ LEVEL_UP_MOVE(40, MOVE_FLAIL),
+ LEVEL_UP_MOVE(48, MOVE_SAFEGUARD),
+ LEVEL_UP_END
+};
+
+static const u16 sCorphishLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(7, MOVE_HARDEN),
+ LEVEL_UP_MOVE(10, MOVE_VICE_GRIP),
+ LEVEL_UP_MOVE(13, MOVE_LEER),
+ LEVEL_UP_MOVE(19, MOVE_BUBBLE_BEAM),
+ LEVEL_UP_MOVE(22, MOVE_PROTECT),
+ LEVEL_UP_MOVE(25, MOVE_KNOCK_OFF),
+ LEVEL_UP_MOVE(31, MOVE_TAUNT),
+ LEVEL_UP_MOVE(34, MOVE_CRABHAMMER),
+ LEVEL_UP_MOVE(37, MOVE_SWORDS_DANCE),
+ LEVEL_UP_MOVE(43, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(46, MOVE_GUILLOTINE),
+ LEVEL_UP_END
+};
+
+static const u16 sCrawdauntLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(1, MOVE_VICE_GRIP),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(7, MOVE_HARDEN),
+ LEVEL_UP_MOVE(10, MOVE_VICE_GRIP),
+ LEVEL_UP_MOVE(13, MOVE_LEER),
+ LEVEL_UP_MOVE(19, MOVE_BUBBLE_BEAM),
+ LEVEL_UP_MOVE(22, MOVE_PROTECT),
+ LEVEL_UP_MOVE(25, MOVE_KNOCK_OFF),
+ LEVEL_UP_MOVE(33, MOVE_TAUNT),
+ LEVEL_UP_MOVE(38, MOVE_CRABHAMMER),
+ LEVEL_UP_MOVE(43, MOVE_SWORDS_DANCE),
+ LEVEL_UP_MOVE(51, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(56, MOVE_GUILLOTINE),
+ LEVEL_UP_END
+};
+
+static const u16 sFeebasLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SPLASH),
+ LEVEL_UP_MOVE(15, MOVE_TACKLE),
+ LEVEL_UP_MOVE(30, MOVE_FLAIL),
+ LEVEL_UP_END
+};
+
+static const u16 sMiloticLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(5, MOVE_WRAP),
+ LEVEL_UP_MOVE(10, MOVE_WATER_SPORT),
+ LEVEL_UP_MOVE(15, MOVE_REFRESH),
+ LEVEL_UP_MOVE(20, MOVE_WATER_PULSE),
+ LEVEL_UP_MOVE(25, MOVE_TWISTER),
+ LEVEL_UP_MOVE(30, MOVE_RECOVER),
+ LEVEL_UP_MOVE(35, MOVE_RAIN_DANCE),
+ LEVEL_UP_MOVE(40, MOVE_HYDRO_PUMP),
+ LEVEL_UP_MOVE(45, MOVE_ATTRACT),
+ LEVEL_UP_MOVE(50, MOVE_SAFEGUARD),
+ LEVEL_UP_END
+};
+
+static const u16 sCarvanhaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(7, MOVE_RAGE),
+ LEVEL_UP_MOVE(13, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(16, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(22, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(28, MOVE_SCREECH),
+ LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(37, MOVE_SWAGGER),
+ LEVEL_UP_MOVE(43, MOVE_AGILITY),
+ LEVEL_UP_END
+};
+
+static const u16 sSharpedoLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(1, MOVE_RAGE),
+ LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(7, MOVE_RAGE),
+ LEVEL_UP_MOVE(13, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(16, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(22, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(28, MOVE_SCREECH),
+ LEVEL_UP_MOVE(33, MOVE_SLASH),
+ LEVEL_UP_MOVE(38, MOVE_TAUNT),
+ LEVEL_UP_MOVE(43, MOVE_SWAGGER),
+ LEVEL_UP_MOVE(48, MOVE_SKULL_BASH),
+ LEVEL_UP_MOVE(53, MOVE_AGILITY),
+ LEVEL_UP_END
+};
+
+static const u16 sTrapinchLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(17, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(25, MOVE_SAND_TOMB),
+ LEVEL_UP_MOVE(33, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(41, MOVE_DIG),
+ LEVEL_UP_MOVE(49, MOVE_SANDSTORM),
+ LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sVibravaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_SAND_TOMB),
+ LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(17, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(25, MOVE_SAND_TOMB),
+ LEVEL_UP_MOVE(33, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(35, MOVE_DRAGON_BREATH),
+ LEVEL_UP_MOVE(41, MOVE_SCREECH),
+ LEVEL_UP_MOVE(49, MOVE_SANDSTORM),
+ LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sFlygonLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_SAND_TOMB),
+ LEVEL_UP_MOVE(9, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(17, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(25, MOVE_SAND_TOMB),
+ LEVEL_UP_MOVE(33, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(35, MOVE_DRAGON_BREATH),
+ LEVEL_UP_MOVE(41, MOVE_SCREECH),
+ LEVEL_UP_MOVE(53, MOVE_SANDSTORM),
+ LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sMakuhitaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(4, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(10, MOVE_ARM_THRUST),
+ LEVEL_UP_MOVE(13, MOVE_VITAL_THROW),
+ LEVEL_UP_MOVE(19, MOVE_FAKE_OUT),
+ LEVEL_UP_MOVE(22, MOVE_WHIRLWIND),
+ LEVEL_UP_MOVE(28, MOVE_KNOCK_OFF),
+ LEVEL_UP_MOVE(31, MOVE_SMELLING_SALT),
+ LEVEL_UP_MOVE(37, MOVE_BELLY_DRUM),
+ LEVEL_UP_MOVE(40, MOVE_ENDURE),
+ LEVEL_UP_MOVE(46, MOVE_SEISMIC_TOSS),
+ LEVEL_UP_MOVE(49, MOVE_REVERSAL),
+ LEVEL_UP_END
+};
+
+static const u16 sHariyamaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(1, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(1, MOVE_ARM_THRUST),
+ LEVEL_UP_MOVE(4, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(10, MOVE_ARM_THRUST),
+ LEVEL_UP_MOVE(13, MOVE_VITAL_THROW),
+ LEVEL_UP_MOVE(19, MOVE_FAKE_OUT),
+ LEVEL_UP_MOVE(22, MOVE_WHIRLWIND),
+ LEVEL_UP_MOVE(29, MOVE_KNOCK_OFF),
+ LEVEL_UP_MOVE(33, MOVE_SMELLING_SALT),
+ LEVEL_UP_MOVE(40, MOVE_BELLY_DRUM),
+ LEVEL_UP_MOVE(44, MOVE_ENDURE),
+ LEVEL_UP_MOVE(51, MOVE_SEISMIC_TOSS),
+ LEVEL_UP_MOVE(55, MOVE_REVERSAL),
+ LEVEL_UP_END
+};
+
+static const u16 sElectrikeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(4, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(9, MOVE_LEER),
+ LEVEL_UP_MOVE(12, MOVE_HOWL),
+ LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(20, MOVE_SPARK),
+ LEVEL_UP_MOVE(25, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(28, MOVE_ROAR),
+ LEVEL_UP_MOVE(33, MOVE_BITE),
+ LEVEL_UP_MOVE(36, MOVE_THUNDER),
+ LEVEL_UP_MOVE(41, MOVE_CHARGE),
+ LEVEL_UP_END
+};
+
+static const u16 sManectricLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_HOWL),
+ LEVEL_UP_MOVE(4, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(9, MOVE_LEER),
+ LEVEL_UP_MOVE(12, MOVE_HOWL),
+ LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(20, MOVE_SPARK),
+ LEVEL_UP_MOVE(25, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(31, MOVE_ROAR),
+ LEVEL_UP_MOVE(39, MOVE_BITE),
+ LEVEL_UP_MOVE(45, MOVE_THUNDER),
+ LEVEL_UP_MOVE(53, MOVE_CHARGE),
+ LEVEL_UP_END
+};
+
+static const u16 sNumelLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(11, MOVE_EMBER),
+ LEVEL_UP_MOVE(19, MOVE_MAGNITUDE),
+ LEVEL_UP_MOVE(25, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(29, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(31, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(35, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(41, MOVE_FLAMETHROWER),
+ LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sCameruptLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_EMBER),
+ LEVEL_UP_MOVE(1, MOVE_MAGNITUDE),
+ LEVEL_UP_MOVE(11, MOVE_EMBER),
+ LEVEL_UP_MOVE(19, MOVE_MAGNITUDE),
+ LEVEL_UP_MOVE(25, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(29, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(31, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(33, MOVE_ROCK_SLIDE),
+ LEVEL_UP_MOVE(37, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(45, MOVE_ERUPTION),
+ LEVEL_UP_MOVE(55, MOVE_FISSURE),
+ LEVEL_UP_END
+};
+
+static const u16 sSphealLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(7, MOVE_ENCORE),
+ LEVEL_UP_MOVE(13, MOVE_ICE_BALL),
+ LEVEL_UP_MOVE(19, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(25, MOVE_AURORA_BEAM),
+ LEVEL_UP_MOVE(31, MOVE_HAIL),
+ LEVEL_UP_MOVE(37, MOVE_REST),
+ LEVEL_UP_MOVE(37, MOVE_SNORE),
+ LEVEL_UP_MOVE(43, MOVE_BLIZZARD),
+ LEVEL_UP_MOVE(49, MOVE_SHEER_COLD),
+ LEVEL_UP_END
+};
+
+static const u16 sSealeoLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(7, MOVE_ENCORE),
+ LEVEL_UP_MOVE(13, MOVE_ICE_BALL),
+ LEVEL_UP_MOVE(19, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(25, MOVE_AURORA_BEAM),
+ LEVEL_UP_MOVE(31, MOVE_HAIL),
+ LEVEL_UP_MOVE(39, MOVE_REST),
+ LEVEL_UP_MOVE(39, MOVE_SNORE),
+ LEVEL_UP_MOVE(47, MOVE_BLIZZARD),
+ LEVEL_UP_MOVE(55, MOVE_SHEER_COLD),
+ LEVEL_UP_END
+};
+
+static const u16 sWalreinLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_DEFENSE_CURL),
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(7, MOVE_ENCORE),
+ LEVEL_UP_MOVE(13, MOVE_ICE_BALL),
+ LEVEL_UP_MOVE(19, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(25, MOVE_AURORA_BEAM),
+ LEVEL_UP_MOVE(31, MOVE_HAIL),
+ LEVEL_UP_MOVE(39, MOVE_REST),
+ LEVEL_UP_MOVE(39, MOVE_SNORE),
+ LEVEL_UP_MOVE(50, MOVE_BLIZZARD),
+ LEVEL_UP_MOVE(61, MOVE_SHEER_COLD),
+ LEVEL_UP_END
+};
+
+static const u16 sCacneaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(5, MOVE_ABSORB),
+ LEVEL_UP_MOVE(9, MOVE_GROWTH),
+ LEVEL_UP_MOVE(13, MOVE_LEECH_SEED),
+ LEVEL_UP_MOVE(17, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(21, MOVE_PIN_MISSILE),
+ LEVEL_UP_MOVE(25, MOVE_INGRAIN),
+ LEVEL_UP_MOVE(29, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(33, MOVE_SPIKES),
+ LEVEL_UP_MOVE(37, MOVE_NEEDLE_ARM),
+ LEVEL_UP_MOVE(41, MOVE_COTTON_SPORE),
+ LEVEL_UP_MOVE(45, MOVE_SANDSTORM),
+ LEVEL_UP_MOVE(49, MOVE_DESTINY_BOND),
+ LEVEL_UP_END
+};
+
+static const u16 sCacturneLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_REVENGE),
+ LEVEL_UP_MOVE(1, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_ABSORB),
+ LEVEL_UP_MOVE(1, MOVE_GROWTH),
+ LEVEL_UP_MOVE(5, MOVE_ABSORB),
+ LEVEL_UP_MOVE(9, MOVE_GROWTH),
+ LEVEL_UP_MOVE(13, MOVE_LEECH_SEED),
+ LEVEL_UP_MOVE(17, MOVE_SAND_ATTACK),
+ LEVEL_UP_MOVE(21, MOVE_PIN_MISSILE),
+ LEVEL_UP_MOVE(25, MOVE_INGRAIN),
+ LEVEL_UP_MOVE(29, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(35, MOVE_SPIKES),
+ LEVEL_UP_MOVE(41, MOVE_NEEDLE_ARM),
+ LEVEL_UP_MOVE(47, MOVE_COTTON_SPORE),
+ LEVEL_UP_MOVE(53, MOVE_SANDSTORM),
+ LEVEL_UP_MOVE(59, MOVE_DESTINY_BOND),
+ LEVEL_UP_END
+};
+
+static const u16 sSnoruntLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(7, MOVE_DOUBLE_TEAM),
+ LEVEL_UP_MOVE(10, MOVE_BITE),
+ LEVEL_UP_MOVE(16, MOVE_ICY_WIND),
+ LEVEL_UP_MOVE(19, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(25, MOVE_PROTECT),
+ LEVEL_UP_MOVE(28, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(34, MOVE_ICE_BEAM),
+ LEVEL_UP_MOVE(37, MOVE_HAIL),
+ LEVEL_UP_MOVE(43, MOVE_BLIZZARD),
+ LEVEL_UP_END
+};
+
+static const u16 sGlalieLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POWDER_SNOW),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_DOUBLE_TEAM),
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(7, MOVE_DOUBLE_TEAM),
+ LEVEL_UP_MOVE(10, MOVE_BITE),
+ LEVEL_UP_MOVE(16, MOVE_ICY_WIND),
+ LEVEL_UP_MOVE(19, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(25, MOVE_PROTECT),
+ LEVEL_UP_MOVE(28, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(34, MOVE_ICE_BEAM),
+ LEVEL_UP_MOVE(42, MOVE_HAIL),
+ LEVEL_UP_MOVE(53, MOVE_BLIZZARD),
+ LEVEL_UP_MOVE(61, MOVE_SHEER_COLD),
+ LEVEL_UP_END
+};
+
+static const u16 sLunatoneLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(7, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(13, MOVE_ROCK_THROW),
+ LEVEL_UP_MOVE(19, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(25, MOVE_PSYWAVE),
+ LEVEL_UP_MOVE(31, MOVE_COSMIC_POWER),
+ LEVEL_UP_MOVE(37, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(43, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(49, MOVE_EXPLOSION),
+ LEVEL_UP_END
+};
+
+static const u16 sSolrockLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(7, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(13, MOVE_ROCK_THROW),
+ LEVEL_UP_MOVE(19, MOVE_FIRE_SPIN),
+ LEVEL_UP_MOVE(25, MOVE_PSYWAVE),
+ LEVEL_UP_MOVE(31, MOVE_COSMIC_POWER),
+ LEVEL_UP_MOVE(37, MOVE_ROCK_SLIDE),
+ LEVEL_UP_MOVE(43, MOVE_SOLAR_BEAM),
+ LEVEL_UP_MOVE(49, MOVE_EXPLOSION),
+ LEVEL_UP_END
+};
+
+static const u16 sAzurillLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SPLASH),
+ LEVEL_UP_MOVE(3, MOVE_CHARM),
+ LEVEL_UP_MOVE(6, MOVE_TAIL_WHIP),
+ LEVEL_UP_MOVE(10, MOVE_BUBBLE),
+ LEVEL_UP_MOVE(15, MOVE_SLAM),
+ LEVEL_UP_MOVE(21, MOVE_WATER_GUN),
+ LEVEL_UP_END
+};
+
+static const u16 sSpoinkLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SPLASH),
+ LEVEL_UP_MOVE(7, MOVE_PSYWAVE),
+ LEVEL_UP_MOVE(10, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(16, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(19, MOVE_PSYCH_UP),
+ LEVEL_UP_MOVE(25, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(28, MOVE_MAGIC_COAT),
+ LEVEL_UP_MOVE(34, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(37, MOVE_REST),
+ LEVEL_UP_MOVE(37, MOVE_SNORE),
+ LEVEL_UP_MOVE(43, MOVE_BOUNCE),
+ LEVEL_UP_END
+};
+
+static const u16 sGrumpigLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SPLASH),
+ LEVEL_UP_MOVE(1, MOVE_PSYWAVE),
+ LEVEL_UP_MOVE(1, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(1, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(7, MOVE_PSYWAVE),
+ LEVEL_UP_MOVE(10, MOVE_ODOR_SLEUTH),
+ LEVEL_UP_MOVE(16, MOVE_PSYBEAM),
+ LEVEL_UP_MOVE(19, MOVE_PSYCH_UP),
+ LEVEL_UP_MOVE(25, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(28, MOVE_MAGIC_COAT),
+ LEVEL_UP_MOVE(37, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(43, MOVE_REST),
+ LEVEL_UP_MOVE(43, MOVE_SNORE),
+ LEVEL_UP_MOVE(55, MOVE_BOUNCE),
+ LEVEL_UP_END
+};
+
+static const u16 sPlusleLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(4, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(10, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(13, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(19, MOVE_SPARK),
+ LEVEL_UP_MOVE(22, MOVE_ENCORE),
+ LEVEL_UP_MOVE(28, MOVE_FAKE_TEARS),
+ LEVEL_UP_MOVE(31, MOVE_CHARGE),
+ LEVEL_UP_MOVE(37, MOVE_THUNDER),
+ LEVEL_UP_MOVE(40, MOVE_BATON_PASS),
+ LEVEL_UP_MOVE(47, MOVE_AGILITY),
+ LEVEL_UP_END
+};
+
+static const u16 sMinunLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(4, MOVE_THUNDER_WAVE),
+ LEVEL_UP_MOVE(10, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(13, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(19, MOVE_SPARK),
+ LEVEL_UP_MOVE(22, MOVE_ENCORE),
+ LEVEL_UP_MOVE(28, MOVE_CHARM),
+ LEVEL_UP_MOVE(31, MOVE_CHARGE),
+ LEVEL_UP_MOVE(37, MOVE_THUNDER),
+ LEVEL_UP_MOVE(40, MOVE_BATON_PASS),
+ LEVEL_UP_MOVE(47, MOVE_AGILITY),
+ LEVEL_UP_END
+};
+
+static const u16 sMawileLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(6, MOVE_FAKE_TEARS),
+ LEVEL_UP_MOVE(11, MOVE_BITE),
+ LEVEL_UP_MOVE(16, MOVE_SWEET_SCENT),
+ LEVEL_UP_MOVE(21, MOVE_VICE_GRIP),
+ LEVEL_UP_MOVE(26, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(31, MOVE_BATON_PASS),
+ LEVEL_UP_MOVE(36, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE),
+ LEVEL_UP_MOVE(46, MOVE_STOCKPILE),
+ LEVEL_UP_MOVE(46, MOVE_SWALLOW),
+ LEVEL_UP_MOVE(46, MOVE_SPIT_UP),
+ LEVEL_UP_END
+};
+
+static const u16 sMedititeLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BIDE),
+ LEVEL_UP_MOVE(4, MOVE_MEDITATE),
+ LEVEL_UP_MOVE(9, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(12, MOVE_DETECT),
+ LEVEL_UP_MOVE(17, MOVE_HIDDEN_POWER),
+ LEVEL_UP_MOVE(20, MOVE_SWAGGER),
+ LEVEL_UP_MOVE(25, MOVE_MIND_READER),
+ LEVEL_UP_MOVE(28, MOVE_CALM_MIND),
+ LEVEL_UP_MOVE(33, MOVE_HI_JUMP_KICK),
+ LEVEL_UP_MOVE(36, MOVE_PSYCH_UP),
+ LEVEL_UP_MOVE(41, MOVE_REVERSAL),
+ LEVEL_UP_MOVE(44, MOVE_RECOVER),
+ LEVEL_UP_END
+};
+
+static const u16 sMedichamLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_FIRE_PUNCH),
+ LEVEL_UP_MOVE(1, MOVE_THUNDER_PUNCH),
+ LEVEL_UP_MOVE(1, MOVE_ICE_PUNCH),
+ LEVEL_UP_MOVE(1, MOVE_BIDE),
+ LEVEL_UP_MOVE(1, MOVE_MEDITATE),
+ LEVEL_UP_MOVE(1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(1, MOVE_DETECT),
+ LEVEL_UP_MOVE(4, MOVE_MEDITATE),
+ LEVEL_UP_MOVE(9, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(12, MOVE_DETECT),
+ LEVEL_UP_MOVE(17, MOVE_HIDDEN_POWER),
+ LEVEL_UP_MOVE(20, MOVE_SWAGGER),
+ LEVEL_UP_MOVE(25, MOVE_MIND_READER),
+ LEVEL_UP_MOVE(28, MOVE_CALM_MIND),
+ LEVEL_UP_MOVE(33, MOVE_HI_JUMP_KICK),
+ LEVEL_UP_MOVE(36, MOVE_PSYCH_UP),
+ LEVEL_UP_MOVE(47, MOVE_REVERSAL),
+ LEVEL_UP_MOVE(56, MOVE_RECOVER),
+ LEVEL_UP_END
+};
+
+static const u16 sSwabluLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(8, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(11, MOVE_SING),
+ LEVEL_UP_MOVE(18, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(21, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(28, MOVE_MIST),
+ LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(38, MOVE_MIRROR_MOVE),
+ LEVEL_UP_MOVE(41, MOVE_REFRESH),
+ LEVEL_UP_MOVE(48, MOVE_PERISH_SONG),
+ LEVEL_UP_END
+};
+
+static const u16 sAltariaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PECK),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(1, MOVE_SING),
+ LEVEL_UP_MOVE(8, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(11, MOVE_SING),
+ LEVEL_UP_MOVE(18, MOVE_FURY_ATTACK),
+ LEVEL_UP_MOVE(21, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(28, MOVE_MIST),
+ LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(35, MOVE_DRAGON_BREATH),
+ LEVEL_UP_MOVE(40, MOVE_DRAGON_DANCE),
+ LEVEL_UP_MOVE(45, MOVE_REFRESH),
+ LEVEL_UP_MOVE(54, MOVE_PERISH_SONG),
+ LEVEL_UP_MOVE(59, MOVE_SKY_ATTACK),
+ LEVEL_UP_END
+};
+
+static const u16 sWynautLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SPLASH),
+ LEVEL_UP_MOVE(1, MOVE_CHARM),
+ LEVEL_UP_MOVE(1, MOVE_ENCORE),
+ LEVEL_UP_MOVE(15, MOVE_COUNTER),
+ LEVEL_UP_MOVE(15, MOVE_MIRROR_COAT),
+ LEVEL_UP_MOVE(15, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(15, MOVE_DESTINY_BOND),
+ LEVEL_UP_END
+};
+
+static const u16 sDuskullLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_NIGHT_SHADE),
+ LEVEL_UP_MOVE(5, MOVE_DISABLE),
+ LEVEL_UP_MOVE(12, MOVE_FORESIGHT),
+ LEVEL_UP_MOVE(16, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(23, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(27, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(34, MOVE_CURSE),
+ LEVEL_UP_MOVE(38, MOVE_WILL_O_WISP),
+ LEVEL_UP_MOVE(45, MOVE_MEAN_LOOK),
+ LEVEL_UP_MOVE(49, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_END
+};
+
+static const u16 sDusclopsLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_BIND),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_NIGHT_SHADE),
+ LEVEL_UP_MOVE(1, MOVE_DISABLE),
+ LEVEL_UP_MOVE(5, MOVE_DISABLE),
+ LEVEL_UP_MOVE(12, MOVE_FORESIGHT),
+ LEVEL_UP_MOVE(16, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(23, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(27, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(34, MOVE_CURSE),
+ LEVEL_UP_MOVE(37, MOVE_SHADOW_PUNCH),
+ LEVEL_UP_MOVE(41, MOVE_WILL_O_WISP),
+ LEVEL_UP_MOVE(51, MOVE_MEAN_LOOK),
+ LEVEL_UP_MOVE(58, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_END
+};
+
+static const u16 sRoseliaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ABSORB),
+ LEVEL_UP_MOVE(5, MOVE_GROWTH),
+ LEVEL_UP_MOVE(9, MOVE_POISON_STING),
+ LEVEL_UP_MOVE(13, MOVE_STUN_SPORE),
+ LEVEL_UP_MOVE(17, MOVE_MEGA_DRAIN),
+ LEVEL_UP_MOVE(21, MOVE_LEECH_SEED),
+ LEVEL_UP_MOVE(25, MOVE_MAGICAL_LEAF),
+ LEVEL_UP_MOVE(29, MOVE_GRASS_WHISTLE),
+ LEVEL_UP_MOVE(33, MOVE_GIGA_DRAIN),
+ LEVEL_UP_MOVE(37, MOVE_SWEET_SCENT),
+ LEVEL_UP_MOVE(41, MOVE_INGRAIN),
+ LEVEL_UP_MOVE(45, MOVE_TOXIC),
+ LEVEL_UP_MOVE(49, MOVE_PETAL_DANCE),
+ LEVEL_UP_MOVE(53, MOVE_AROMATHERAPY),
+ LEVEL_UP_MOVE(57, MOVE_SYNTHESIS),
+ LEVEL_UP_END
+};
+
+static const u16 sSlakothLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_YAWN),
+ LEVEL_UP_MOVE(7, MOVE_ENCORE),
+ LEVEL_UP_MOVE(13, MOVE_SLACK_OFF),
+ LEVEL_UP_MOVE(19, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(25, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(31, MOVE_COVET),
+ LEVEL_UP_MOVE(37, MOVE_COUNTER),
+ LEVEL_UP_MOVE(43, MOVE_FLAIL),
+ LEVEL_UP_END
+};
+
+static const u16 sVigorothLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(1, MOVE_ENCORE),
+ LEVEL_UP_MOVE(1, MOVE_UPROAR),
+ LEVEL_UP_MOVE(7, MOVE_ENCORE),
+ LEVEL_UP_MOVE(13, MOVE_UPROAR),
+ LEVEL_UP_MOVE(19, MOVE_FURY_SWIPES),
+ LEVEL_UP_MOVE(25, MOVE_ENDURE),
+ LEVEL_UP_MOVE(31, MOVE_SLASH),
+ LEVEL_UP_MOVE(37, MOVE_COUNTER),
+ LEVEL_UP_MOVE(43, MOVE_FOCUS_PUNCH),
+ LEVEL_UP_MOVE(49, MOVE_REVERSAL),
+ LEVEL_UP_END
+};
+
+static const u16 sSlakingLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_YAWN),
+ LEVEL_UP_MOVE(1, MOVE_ENCORE),
+ LEVEL_UP_MOVE(1, MOVE_SLACK_OFF),
+ LEVEL_UP_MOVE(7, MOVE_ENCORE),
+ LEVEL_UP_MOVE(13, MOVE_SLACK_OFF),
+ LEVEL_UP_MOVE(19, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(25, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(31, MOVE_COVET),
+ LEVEL_UP_MOVE(36, MOVE_SWAGGER),
+ LEVEL_UP_MOVE(37, MOVE_COUNTER),
+ LEVEL_UP_MOVE(43, MOVE_FLAIL),
+ LEVEL_UP_END
+};
+
+static const u16 sGulpinLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(6, MOVE_YAWN),
+ LEVEL_UP_MOVE(9, MOVE_POISON_GAS),
+ LEVEL_UP_MOVE(14, MOVE_SLUDGE),
+ LEVEL_UP_MOVE(17, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(23, MOVE_ENCORE),
+ LEVEL_UP_MOVE(28, MOVE_TOXIC),
+ LEVEL_UP_MOVE(34, MOVE_STOCKPILE),
+ LEVEL_UP_MOVE(34, MOVE_SPIT_UP),
+ LEVEL_UP_MOVE(34, MOVE_SWALLOW),
+ LEVEL_UP_MOVE(39, MOVE_SLUDGE_BOMB),
+ LEVEL_UP_END
+};
+
+static const u16 sSwalotLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(1, MOVE_YAWN),
+ LEVEL_UP_MOVE(1, MOVE_POISON_GAS),
+ LEVEL_UP_MOVE(1, MOVE_SLUDGE),
+ LEVEL_UP_MOVE(6, MOVE_YAWN),
+ LEVEL_UP_MOVE(9, MOVE_POISON_GAS),
+ LEVEL_UP_MOVE(14, MOVE_SLUDGE),
+ LEVEL_UP_MOVE(17, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(23, MOVE_ENCORE),
+ LEVEL_UP_MOVE(26, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(31, MOVE_TOXIC),
+ LEVEL_UP_MOVE(40, MOVE_STOCKPILE),
+ LEVEL_UP_MOVE(40, MOVE_SPIT_UP),
+ LEVEL_UP_MOVE(40, MOVE_SWALLOW),
+ LEVEL_UP_MOVE(48, MOVE_SLUDGE_BOMB),
+ LEVEL_UP_END
+};
+
+static const u16 sTropiusLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_GUST),
+ LEVEL_UP_MOVE(7, MOVE_GROWTH),
+ LEVEL_UP_MOVE(11, MOVE_RAZOR_LEAF),
+ LEVEL_UP_MOVE(17, MOVE_STOMP),
+ LEVEL_UP_MOVE(21, MOVE_SWEET_SCENT),
+ LEVEL_UP_MOVE(27, MOVE_WHIRLWIND),
+ LEVEL_UP_MOVE(31, MOVE_MAGICAL_LEAF),
+ LEVEL_UP_MOVE(37, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(41, MOVE_SOLAR_BEAM),
+ LEVEL_UP_MOVE(47, MOVE_SYNTHESIS),
+ LEVEL_UP_END
+};
+
+static const u16 sWhismurLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(5, MOVE_UPROAR),
+ LEVEL_UP_MOVE(11, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(15, MOVE_HOWL),
+ LEVEL_UP_MOVE(21, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(25, MOVE_STOMP),
+ LEVEL_UP_MOVE(31, MOVE_SCREECH),
+ LEVEL_UP_MOVE(35, MOVE_ROAR),
+ LEVEL_UP_MOVE(41, MOVE_REST),
+ LEVEL_UP_MOVE(41, MOVE_SLEEP_TALK),
+ LEVEL_UP_MOVE(45, MOVE_HYPER_VOICE),
+ LEVEL_UP_END
+};
+
+static const u16 sLoudredLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(1, MOVE_UPROAR),
+ LEVEL_UP_MOVE(1, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(1, MOVE_HOWL),
+ LEVEL_UP_MOVE(5, MOVE_UPROAR),
+ LEVEL_UP_MOVE(11, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(15, MOVE_HOWL),
+ LEVEL_UP_MOVE(23, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(29, MOVE_STOMP),
+ LEVEL_UP_MOVE(37, MOVE_SCREECH),
+ LEVEL_UP_MOVE(43, MOVE_ROAR),
+ LEVEL_UP_MOVE(51, MOVE_REST),
+ LEVEL_UP_MOVE(51, MOVE_SLEEP_TALK),
+ LEVEL_UP_MOVE(57, MOVE_HYPER_VOICE),
+ LEVEL_UP_END
+};
+
+static const u16 sExploudLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_POUND),
+ LEVEL_UP_MOVE(1, MOVE_UPROAR),
+ LEVEL_UP_MOVE(1, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(1, MOVE_HOWL),
+ LEVEL_UP_MOVE(5, MOVE_UPROAR),
+ LEVEL_UP_MOVE(11, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(15, MOVE_HOWL),
+ LEVEL_UP_MOVE(23, MOVE_SUPERSONIC),
+ LEVEL_UP_MOVE(29, MOVE_STOMP),
+ LEVEL_UP_MOVE(37, MOVE_SCREECH),
+ LEVEL_UP_MOVE(40, MOVE_HYPER_BEAM),
+ LEVEL_UP_MOVE(45, MOVE_ROAR),
+ LEVEL_UP_MOVE(55, MOVE_REST),
+ LEVEL_UP_MOVE(55, MOVE_SLEEP_TALK),
+ LEVEL_UP_MOVE(63, MOVE_HYPER_VOICE),
+ LEVEL_UP_END
+};
+
+static const u16 sClamperlLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_CLAMP),
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(1, MOVE_WHIRLPOOL),
+ LEVEL_UP_MOVE(1, MOVE_IRON_DEFENSE),
+ LEVEL_UP_END
+};
+
+static const u16 sHuntailLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WHIRLPOOL),
+ LEVEL_UP_MOVE(8, MOVE_BITE),
+ LEVEL_UP_MOVE(15, MOVE_SCREECH),
+ LEVEL_UP_MOVE(22, MOVE_WATER_PULSE),
+ LEVEL_UP_MOVE(29, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(36, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(43, MOVE_BATON_PASS),
+ LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sGorebyssLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WHIRLPOOL),
+ LEVEL_UP_MOVE(8, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(15, MOVE_AGILITY),
+ LEVEL_UP_MOVE(22, MOVE_WATER_PULSE),
+ LEVEL_UP_MOVE(29, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(36, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(43, MOVE_BATON_PASS),
+ LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sAbsolLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(5, MOVE_LEER),
+ LEVEL_UP_MOVE(9, MOVE_TAUNT),
+ LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(17, MOVE_RAZOR_WIND),
+ LEVEL_UP_MOVE(21, MOVE_BITE),
+ LEVEL_UP_MOVE(26, MOVE_SWORDS_DANCE),
+ LEVEL_UP_MOVE(31, MOVE_DOUBLE_TEAM),
+ LEVEL_UP_MOVE(36, MOVE_SLASH),
+ LEVEL_UP_MOVE(41, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(46, MOVE_PERISH_SONG),
+ LEVEL_UP_END
+};
+
+static const u16 sShuppetLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_KNOCK_OFF),
+ LEVEL_UP_MOVE(8, MOVE_SCREECH),
+ LEVEL_UP_MOVE(13, MOVE_NIGHT_SHADE),
+ LEVEL_UP_MOVE(20, MOVE_CURSE),
+ LEVEL_UP_MOVE(25, MOVE_SPITE),
+ LEVEL_UP_MOVE(32, MOVE_WILL_O_WISP),
+ LEVEL_UP_MOVE(37, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(44, MOVE_SHADOW_BALL),
+ LEVEL_UP_MOVE(49, MOVE_SNATCH),
+ LEVEL_UP_MOVE(56, MOVE_GRUDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sBanetteLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_KNOCK_OFF),
+ LEVEL_UP_MOVE(1, MOVE_SCREECH),
+ LEVEL_UP_MOVE(1, MOVE_NIGHT_SHADE),
+ LEVEL_UP_MOVE(1, MOVE_CURSE),
+ LEVEL_UP_MOVE(8, MOVE_SCREECH),
+ LEVEL_UP_MOVE(13, MOVE_NIGHT_SHADE),
+ LEVEL_UP_MOVE(20, MOVE_CURSE),
+ LEVEL_UP_MOVE(25, MOVE_SPITE),
+ LEVEL_UP_MOVE(32, MOVE_WILL_O_WISP),
+ LEVEL_UP_MOVE(39, MOVE_FAINT_ATTACK),
+ LEVEL_UP_MOVE(48, MOVE_SHADOW_BALL),
+ LEVEL_UP_MOVE(55, MOVE_SNATCH),
+ LEVEL_UP_MOVE(64, MOVE_GRUDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sSeviperLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WRAP),
+ LEVEL_UP_MOVE(7, MOVE_LICK),
+ LEVEL_UP_MOVE(10, MOVE_BITE),
+ LEVEL_UP_MOVE(16, MOVE_POISON_TAIL),
+ LEVEL_UP_MOVE(19, MOVE_SCREECH),
+ LEVEL_UP_MOVE(25, MOVE_GLARE),
+ LEVEL_UP_MOVE(28, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(34, MOVE_POISON_FANG),
+ LEVEL_UP_MOVE(37, MOVE_SWAGGER),
+ LEVEL_UP_MOVE(43, MOVE_HAZE),
+ LEVEL_UP_END
+};
+
+static const u16 sZangooseLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(4, MOVE_LEER),
+ LEVEL_UP_MOVE(7, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(10, MOVE_SWORDS_DANCE),
+ LEVEL_UP_MOVE(13, MOVE_FURY_CUTTER),
+ LEVEL_UP_MOVE(19, MOVE_SLASH),
+ LEVEL_UP_MOVE(25, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(31, MOVE_CRUSH_CLAW),
+ LEVEL_UP_MOVE(37, MOVE_TAUNT),
+ LEVEL_UP_MOVE(46, MOVE_DETECT),
+ LEVEL_UP_MOVE(55, MOVE_FALSE_SWIPE),
+ LEVEL_UP_END
+};
+
+static const u16 sRelicanthLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(8, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(15, MOVE_ROCK_TOMB),
+ LEVEL_UP_MOVE(22, MOVE_YAWN),
+ LEVEL_UP_MOVE(29, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(36, MOVE_MUD_SPORT),
+ LEVEL_UP_MOVE(43, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(50, MOVE_REST),
+ LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_MOVE(64, MOVE_HYDRO_PUMP),
+ LEVEL_UP_END
+};
+
+static const u16 sAronLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(4, MOVE_HARDEN),
+ LEVEL_UP_MOVE(7, MOVE_MUD_SLAP),
+ LEVEL_UP_MOVE(10, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(13, MOVE_METAL_CLAW),
+ LEVEL_UP_MOVE(17, MOVE_IRON_DEFENSE),
+ LEVEL_UP_MOVE(21, MOVE_ROAR),
+ LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(29, MOVE_IRON_TAIL),
+ LEVEL_UP_MOVE(34, MOVE_PROTECT),
+ LEVEL_UP_MOVE(39, MOVE_METAL_SOUND),
+ LEVEL_UP_MOVE(44, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sLaironLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(1, MOVE_MUD_SLAP),
+ LEVEL_UP_MOVE(1, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(4, MOVE_HARDEN),
+ LEVEL_UP_MOVE(7, MOVE_MUD_SLAP),
+ LEVEL_UP_MOVE(10, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(13, MOVE_METAL_CLAW),
+ LEVEL_UP_MOVE(17, MOVE_IRON_DEFENSE),
+ LEVEL_UP_MOVE(21, MOVE_ROAR),
+ LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(29, MOVE_IRON_TAIL),
+ LEVEL_UP_MOVE(37, MOVE_PROTECT),
+ LEVEL_UP_MOVE(45, MOVE_METAL_SOUND),
+ LEVEL_UP_MOVE(53, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sAggronLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(1, MOVE_MUD_SLAP),
+ LEVEL_UP_MOVE(1, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(4, MOVE_HARDEN),
+ LEVEL_UP_MOVE(7, MOVE_MUD_SLAP),
+ LEVEL_UP_MOVE(10, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(13, MOVE_METAL_CLAW),
+ LEVEL_UP_MOVE(17, MOVE_IRON_DEFENSE),
+ LEVEL_UP_MOVE(21, MOVE_ROAR),
+ LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(29, MOVE_IRON_TAIL),
+ LEVEL_UP_MOVE(37, MOVE_PROTECT),
+ LEVEL_UP_MOVE(50, MOVE_METAL_SOUND),
+ LEVEL_UP_MOVE(63, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sCastformLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(10, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(10, MOVE_EMBER),
+ LEVEL_UP_MOVE(10, MOVE_POWDER_SNOW),
+ LEVEL_UP_MOVE(20, MOVE_RAIN_DANCE),
+ LEVEL_UP_MOVE(20, MOVE_SUNNY_DAY),
+ LEVEL_UP_MOVE(20, MOVE_HAIL),
+ LEVEL_UP_MOVE(30, MOVE_WEATHER_BALL),
+ LEVEL_UP_END
+};
+
+static const u16 sVolbeatLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(5, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(9, MOVE_DOUBLE_TEAM),
+ LEVEL_UP_MOVE(13, MOVE_MOONLIGHT),
+ LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(21, MOVE_TAIL_GLOW),
+ LEVEL_UP_MOVE(25, MOVE_SIGNAL_BEAM),
+ LEVEL_UP_MOVE(29, MOVE_PROTECT),
+ LEVEL_UP_MOVE(33, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(37, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sIllumiseLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TACKLE),
+ LEVEL_UP_MOVE(5, MOVE_SWEET_SCENT),
+ LEVEL_UP_MOVE(9, MOVE_CHARM),
+ LEVEL_UP_MOVE(13, MOVE_MOONLIGHT),
+ LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK),
+ LEVEL_UP_MOVE(21, MOVE_WISH),
+ LEVEL_UP_MOVE(25, MOVE_ENCORE),
+ LEVEL_UP_MOVE(29, MOVE_FLATTER),
+ LEVEL_UP_MOVE(33, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(37, MOVE_COVET),
+ LEVEL_UP_END
+};
+
+static const u16 sLileepLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(8, MOVE_CONSTRICT),
+ LEVEL_UP_MOVE(15, MOVE_ACID),
+ LEVEL_UP_MOVE(22, MOVE_INGRAIN),
+ LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(36, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(43, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(50, MOVE_STOCKPILE),
+ LEVEL_UP_MOVE(50, MOVE_SPIT_UP),
+ LEVEL_UP_MOVE(50, MOVE_SWALLOW),
+ LEVEL_UP_END
+};
+
+static const u16 sCradilyLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(1, MOVE_CONSTRICT),
+ LEVEL_UP_MOVE(1, MOVE_ACID),
+ LEVEL_UP_MOVE(1, MOVE_INGRAIN),
+ LEVEL_UP_MOVE(8, MOVE_CONSTRICT),
+ LEVEL_UP_MOVE(15, MOVE_ACID),
+ LEVEL_UP_MOVE(22, MOVE_INGRAIN),
+ LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY),
+ LEVEL_UP_MOVE(36, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(48, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(60, MOVE_STOCKPILE),
+ LEVEL_UP_MOVE(60, MOVE_SPIT_UP),
+ LEVEL_UP_MOVE(60, MOVE_SWALLOW),
+ LEVEL_UP_END
+};
+
+static const u16 sAnorithLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(7, MOVE_HARDEN),
+ LEVEL_UP_MOVE(13, MOVE_MUD_SPORT),
+ LEVEL_UP_MOVE(19, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(25, MOVE_METAL_CLAW),
+ LEVEL_UP_MOVE(31, MOVE_PROTECT),
+ LEVEL_UP_MOVE(37, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(43, MOVE_FURY_CUTTER),
+ LEVEL_UP_MOVE(49, MOVE_SLASH),
+ LEVEL_UP_MOVE(55, MOVE_ROCK_BLAST),
+ LEVEL_UP_END
+};
+
+static const u16 sArmaldoLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_SCRATCH),
+ LEVEL_UP_MOVE(1, MOVE_HARDEN),
+ LEVEL_UP_MOVE(1, MOVE_MUD_SPORT),
+ LEVEL_UP_MOVE(1, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(7, MOVE_HARDEN),
+ LEVEL_UP_MOVE(13, MOVE_MUD_SPORT),
+ LEVEL_UP_MOVE(19, MOVE_WATER_GUN),
+ LEVEL_UP_MOVE(25, MOVE_METAL_CLAW),
+ LEVEL_UP_MOVE(31, MOVE_PROTECT),
+ LEVEL_UP_MOVE(37, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(46, MOVE_FURY_CUTTER),
+ LEVEL_UP_MOVE(55, MOVE_SLASH),
+ LEVEL_UP_MOVE(64, MOVE_ROCK_BLAST),
+ LEVEL_UP_END
+};
+
+static const u16 sRaltsLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(6, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(11, MOVE_DOUBLE_TEAM),
+ LEVEL_UP_MOVE(16, MOVE_TELEPORT),
+ LEVEL_UP_MOVE(21, MOVE_CALM_MIND),
+ LEVEL_UP_MOVE(26, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(31, MOVE_IMPRISON),
+ LEVEL_UP_MOVE(36, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(41, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(46, MOVE_DREAM_EATER),
+ LEVEL_UP_END
+};
+
+static const u16 sKirliaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_MAGICAL_LEAF),
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(1, MOVE_DOUBLE_TEAM),
+ LEVEL_UP_MOVE(1, MOVE_TELEPORT),
+ LEVEL_UP_MOVE(6, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(11, MOVE_DOUBLE_TEAM),
+ LEVEL_UP_MOVE(16, MOVE_TELEPORT),
+ LEVEL_UP_MOVE(21, MOVE_CALM_MIND),
+ LEVEL_UP_MOVE(26, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(33, MOVE_IMPRISON),
+ LEVEL_UP_MOVE(40, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(47, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(54, MOVE_DREAM_EATER),
+ LEVEL_UP_END
+};
+
+static const u16 sGardevoirLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_GROWL),
+ LEVEL_UP_MOVE(1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(1, MOVE_DOUBLE_TEAM),
+ LEVEL_UP_MOVE(1, MOVE_TELEPORT),
+ LEVEL_UP_MOVE(6, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(11, MOVE_DOUBLE_TEAM),
+ LEVEL_UP_MOVE(16, MOVE_TELEPORT),
+ LEVEL_UP_MOVE(21, MOVE_CALM_MIND),
+ LEVEL_UP_MOVE(26, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(33, MOVE_IMPRISON),
+ LEVEL_UP_MOVE(42, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(51, MOVE_HYPNOSIS),
+ LEVEL_UP_MOVE(60, MOVE_DREAM_EATER),
+ LEVEL_UP_END
+};
+
+static const u16 sBagonLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_RAGE),
+ LEVEL_UP_MOVE(5, MOVE_BITE),
+ LEVEL_UP_MOVE(9, MOVE_LEER),
+ LEVEL_UP_MOVE(17, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(25, MOVE_EMBER),
+ LEVEL_UP_MOVE(33, MOVE_DRAGON_BREATH),
+ LEVEL_UP_MOVE(37, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(41, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(49, MOVE_DRAGON_CLAW),
+ LEVEL_UP_MOVE(53, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sShelgonLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_RAGE),
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(5, MOVE_BITE),
+ LEVEL_UP_MOVE(9, MOVE_LEER),
+ LEVEL_UP_MOVE(17, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(25, MOVE_EMBER),
+ LEVEL_UP_MOVE(30, MOVE_PROTECT),
+ LEVEL_UP_MOVE(38, MOVE_DRAGON_BREATH),
+ LEVEL_UP_MOVE(47, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(56, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(69, MOVE_DRAGON_CLAW),
+ LEVEL_UP_MOVE(78, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sSalamenceLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_RAGE),
+ LEVEL_UP_MOVE(1, MOVE_BITE),
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(5, MOVE_BITE),
+ LEVEL_UP_MOVE(9, MOVE_LEER),
+ LEVEL_UP_MOVE(17, MOVE_HEADBUTT),
+ LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY),
+ LEVEL_UP_MOVE(25, MOVE_EMBER),
+ LEVEL_UP_MOVE(30, MOVE_PROTECT),
+ LEVEL_UP_MOVE(38, MOVE_DRAGON_BREATH),
+ LEVEL_UP_MOVE(47, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(50, MOVE_FLY),
+ LEVEL_UP_MOVE(61, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(79, MOVE_DRAGON_CLAW),
+ LEVEL_UP_MOVE(93, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_END
+};
+
+static const u16 sBeldumLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TAKE_DOWN),
+ LEVEL_UP_END
+};
+
+static const u16 sMetangLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(20, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(20, MOVE_METAL_CLAW),
+ LEVEL_UP_MOVE(26, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(32, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(38, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(44, MOVE_IRON_DEFENSE),
+ LEVEL_UP_MOVE(50, MOVE_METEOR_MASH),
+ LEVEL_UP_MOVE(56, MOVE_AGILITY),
+ LEVEL_UP_MOVE(62, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sMetagrossLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(1, MOVE_METAL_CLAW),
+ LEVEL_UP_MOVE(1, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(20, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(20, MOVE_METAL_CLAW),
+ LEVEL_UP_MOVE(26, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(32, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(38, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(44, MOVE_IRON_DEFENSE),
+ LEVEL_UP_MOVE(55, MOVE_METEOR_MASH),
+ LEVEL_UP_MOVE(66, MOVE_AGILITY),
+ LEVEL_UP_MOVE(77, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sRegirockLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_EXPLOSION),
+ LEVEL_UP_MOVE(9, MOVE_ROCK_THROW),
+ LEVEL_UP_MOVE(17, MOVE_CURSE),
+ LEVEL_UP_MOVE(25, MOVE_SUPERPOWER),
+ LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE),
+ LEVEL_UP_MOVE(49, MOVE_ZAP_CANNON),
+ LEVEL_UP_MOVE(57, MOVE_LOCK_ON),
+ LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sRegiceLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_EXPLOSION),
+ LEVEL_UP_MOVE(9, MOVE_ICY_WIND),
+ LEVEL_UP_MOVE(17, MOVE_CURSE),
+ LEVEL_UP_MOVE(25, MOVE_SUPERPOWER),
+ LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(41, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(49, MOVE_ZAP_CANNON),
+ LEVEL_UP_MOVE(57, MOVE_LOCK_ON),
+ LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sRegisteelLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_EXPLOSION),
+ LEVEL_UP_MOVE(9, MOVE_METAL_CLAW),
+ LEVEL_UP_MOVE(17, MOVE_CURSE),
+ LEVEL_UP_MOVE(25, MOVE_SUPERPOWER),
+ LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE),
+ LEVEL_UP_MOVE(41, MOVE_AMNESIA),
+ LEVEL_UP_MOVE(49, MOVE_ZAP_CANNON),
+ LEVEL_UP_MOVE(57, MOVE_LOCK_ON),
+ LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sKyogreLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WATER_PULSE),
+ LEVEL_UP_MOVE(5, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(15, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(20, MOVE_BODY_SLAM),
+ LEVEL_UP_MOVE(30, MOVE_CALM_MIND),
+ LEVEL_UP_MOVE(35, MOVE_ICE_BEAM),
+ LEVEL_UP_MOVE(45, MOVE_HYDRO_PUMP),
+ LEVEL_UP_MOVE(50, MOVE_REST),
+ LEVEL_UP_MOVE(60, MOVE_SHEER_COLD),
+ LEVEL_UP_MOVE(65, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_MOVE(75, MOVE_WATER_SPOUT),
+ LEVEL_UP_END
+};
+
+static const u16 sGroudonLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_MUD_SHOT),
+ LEVEL_UP_MOVE(5, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(15, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(20, MOVE_SLASH),
+ LEVEL_UP_MOVE(30, MOVE_BULK_UP),
+ LEVEL_UP_MOVE(35, MOVE_EARTHQUAKE),
+ LEVEL_UP_MOVE(45, MOVE_FIRE_BLAST),
+ LEVEL_UP_MOVE(50, MOVE_REST),
+ LEVEL_UP_MOVE(60, MOVE_FISSURE),
+ LEVEL_UP_MOVE(65, MOVE_SOLAR_BEAM),
+ LEVEL_UP_MOVE(75, MOVE_ERUPTION),
+ LEVEL_UP_END
+};
+
+static const u16 sRayquazaLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_TWISTER),
+ LEVEL_UP_MOVE(5, MOVE_SCARY_FACE),
+ LEVEL_UP_MOVE(15, MOVE_ANCIENT_POWER),
+ LEVEL_UP_MOVE(20, MOVE_DRAGON_CLAW),
+ LEVEL_UP_MOVE(30, MOVE_DRAGON_DANCE),
+ LEVEL_UP_MOVE(35, MOVE_CRUNCH),
+ LEVEL_UP_MOVE(45, MOVE_FLY),
+ LEVEL_UP_MOVE(50, MOVE_REST),
+ LEVEL_UP_MOVE(60, MOVE_EXTREME_SPEED),
+ LEVEL_UP_MOVE(65, MOVE_OUTRAGE),
+ LEVEL_UP_MOVE(75, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sLatiasLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PSYWAVE),
+ LEVEL_UP_MOVE(5, MOVE_WISH),
+ LEVEL_UP_MOVE(10, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(15, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(20, MOVE_DRAGON_BREATH),
+ LEVEL_UP_MOVE(25, MOVE_WATER_SPORT),
+ LEVEL_UP_MOVE(30, MOVE_REFRESH),
+ LEVEL_UP_MOVE(35, MOVE_MIST_BALL),
+ LEVEL_UP_MOVE(40, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(45, MOVE_RECOVER),
+ LEVEL_UP_MOVE(50, MOVE_CHARM),
+ LEVEL_UP_END
+};
+
+static const u16 sLatiosLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_PSYWAVE),
+ LEVEL_UP_MOVE(5, MOVE_MEMENTO),
+ LEVEL_UP_MOVE(10, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(15, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(20, MOVE_DRAGON_BREATH),
+ LEVEL_UP_MOVE(25, MOVE_PROTECT),
+ LEVEL_UP_MOVE(30, MOVE_REFRESH),
+ LEVEL_UP_MOVE(35, MOVE_LUSTER_PURGE),
+ LEVEL_UP_MOVE(40, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(45, MOVE_RECOVER),
+ LEVEL_UP_MOVE(50, MOVE_DRAGON_DANCE),
+ LEVEL_UP_END
+};
+
+static const u16 sJirachiLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WISH),
+ LEVEL_UP_MOVE(1, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(5, MOVE_REST),
+ LEVEL_UP_MOVE(10, MOVE_SWIFT),
+ LEVEL_UP_MOVE(15, MOVE_HELPING_HAND),
+ LEVEL_UP_MOVE(20, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(25, MOVE_REFRESH),
+ LEVEL_UP_MOVE(30, MOVE_REST),
+ LEVEL_UP_MOVE(35, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_MOVE(40, MOVE_FUTURE_SIGHT),
+ LEVEL_UP_MOVE(45, MOVE_COSMIC_POWER),
+ LEVEL_UP_MOVE(50, MOVE_DOOM_DESIRE),
+ LEVEL_UP_END
+};
+
+static const u16 sDeoxysLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_LEER),
+ LEVEL_UP_MOVE(1, MOVE_WRAP),
+ LEVEL_UP_MOVE(5, MOVE_NIGHT_SHADE),
+ LEVEL_UP_MOVE(10, MOVE_TELEPORT),
+ LEVEL_UP_MOVE(15, MOVE_TAUNT),
+ LEVEL_UP_MOVE(20, MOVE_PURSUIT),
+ LEVEL_UP_MOVE(25, MOVE_PSYCHIC),
+ LEVEL_UP_MOVE(30, MOVE_SUPERPOWER),
+ LEVEL_UP_MOVE(35, MOVE_COSMIC_POWER),
+ LEVEL_UP_MOVE(40, MOVE_ZAP_CANNON),
+ LEVEL_UP_MOVE(45, MOVE_PSYCHO_BOOST),
+ LEVEL_UP_MOVE(50, MOVE_HYPER_BEAM),
+ LEVEL_UP_END
+};
+
+static const u16 sChimechoLevelUpLearnset[] = {
+ LEVEL_UP_MOVE(1, MOVE_WRAP),
+ LEVEL_UP_MOVE(6, MOVE_GROWL),
+ LEVEL_UP_MOVE(9, MOVE_ASTONISH),
+ LEVEL_UP_MOVE(14, MOVE_CONFUSION),
+ LEVEL_UP_MOVE(17, MOVE_TAKE_DOWN),
+ LEVEL_UP_MOVE(22, MOVE_UPROAR),
+ LEVEL_UP_MOVE(25, MOVE_YAWN),
+ LEVEL_UP_MOVE(30, MOVE_PSYWAVE),
+ LEVEL_UP_MOVE(33, MOVE_DOUBLE_EDGE),
+ LEVEL_UP_MOVE(38, MOVE_HEAL_BELL),
+ LEVEL_UP_MOVE(41, MOVE_SAFEGUARD),
+ LEVEL_UP_MOVE(46, MOVE_PSYCHIC),
+ LEVEL_UP_END
+};
diff --git a/src/data/pokemon/tmhm_learnsets.h b/src/data/pokemon/tmhm_learnsets.h
new file mode 100644
index 000000000..1e3e347ca
--- /dev/null
+++ b/src/data/pokemon/tmhm_learnsets.h
@@ -0,0 +1,9388 @@
+#define TMHM_LEARNSET(moves) {(u32)(moves), ((u64)(moves) >> 32)}
+#define TMHM(tmhm) ((u64)1 << (ITEM_##tmhm - ITEM_TM01_FOCUS_PUNCH))
+
+// This table determines which TMs and HMs a species is capable of learning.
+// Each entry is a 64-bit bit array spread across two 32-bit values, with
+// each bit corresponding to a machine.
+static const u32 sTMHMLearnsets[][2] =
+{
+ [SPECIES_NONE] = TMHM_LEARNSET(0),
+
+ [SPECIES_BULBASAUR] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_IVYSAUR] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_VENUSAUR] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_CHARMANDER] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_CHARMELEON] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_CHARIZARD] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM02_FLY)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SQUIRTLE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_WARTORTLE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_BLASTOISE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_CATERPIE] = TMHM_LEARNSET(0),
+
+ [SPECIES_METAPOD] = TMHM_LEARNSET(0),
+
+ [SPECIES_BUTTERFREE] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_WEEDLE] = TMHM_LEARNSET(0),
+
+ [SPECIES_KAKUNA] = TMHM_LEARNSET(0),
+
+ [SPECIES_BEEDRILL] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_PIDGEY] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)),
+
+ [SPECIES_PIDGEOTTO] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)),
+
+ [SPECIES_PIDGEOT] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)),
+
+ [SPECIES_RATTATA] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_RATICATE] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SPEAROW] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)),
+
+ [SPECIES_FEAROW] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)),
+
+ [SPECIES_EKANS] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM04_STRENGTH)),
+
+ [SPECIES_ARBOK] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM04_STRENGTH)),
+
+ [SPECIES_PIKACHU] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_RAICHU] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SANDSHREW] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SANDSLASH] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_NIDORAN_F] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_NIDORINA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_NIDOQUEEN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_NIDORAN_M] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_NIDORINO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_NIDOKING] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_CLEFAIRY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_CLEFABLE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_VULPIX] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)),
+
+ [SPECIES_NINETALES] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)),
+
+ [SPECIES_JIGGLYPUFF] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_WIGGLYTUFF] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_ZUBAT] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(TM49_SNATCH)),
+
+ [SPECIES_GOLBAT] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(TM49_SNATCH)),
+
+ [SPECIES_ODDISH] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_GLOOM] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_VILEPLUME] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_PARAS] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_PARASECT] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_VENONAT] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_VENOMOTH] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_DIGLETT] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_DUGTRIO] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_MEOWTH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_PERSIAN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_PSYDUCK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_GOLDUCK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_MANKEY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_PRIMEAPE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_GROWLITHE] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_ARCANINE] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_POLIWAG] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_POLIWHIRL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_POLIWRATH] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_ABRA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_KADABRA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_ALAKAZAM] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_MACHOP] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_MACHOKE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_MACHAMP] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_BELLSPROUT] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_WEEPINBELL] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_VICTREEBEL] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_TENTACOOL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_TENTACRUEL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_GEODUDE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_GRAVELER] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_GOLEM] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_PONYTA] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM04_STRENGTH)),
+
+ [SPECIES_RAPIDASH] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM04_STRENGTH)),
+
+ [SPECIES_SLOWPOKE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_SLOWBRO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_MAGNEMITE] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_MAGNETON] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_FARFETCHD] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM01_CUT)
+ | TMHM(HM02_FLY)),
+
+ [SPECIES_DODUO] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)),
+
+ [SPECIES_DODRIO] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)),
+
+ [SPECIES_SEEL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_DEWGONG] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_GRIMER] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)),
+
+ [SPECIES_MUK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SHELLDER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_CLOYSTER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_GASTLY] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)),
+
+ [SPECIES_HAUNTER] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)),
+
+ [SPECIES_GENGAR] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_ONIX] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_DROWZEE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_HYPNO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_KRABBY] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_KINGLER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_VOLTORB] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_ELECTRODE] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_EXEGGCUTE] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_EXEGGUTOR] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_CUBONE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_MAROWAK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_HITMONLEE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_HITMONCHAN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_LICKITUNG] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_KOFFING] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_WEEZING] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_RHYHORN] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_RHYDON] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_CHANSEY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_TANGELA] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_KANGASKHAN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_HORSEA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_SEADRA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_GOLDEEN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_SEAKING] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_STARYU] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(HM03_SURF)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_STARMIE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM03_SURF)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_MR_MIME] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_SCYTHER] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM01_CUT)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_JYNX] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_ELECTABUZZ] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_MAGMAR] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_PINSIR] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_TAUROS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_MAGIKARP] = TMHM_LEARNSET(0),
+
+ [SPECIES_GYARADOS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_LAPRAS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_DITTO] = TMHM_LEARNSET(0),
+
+ [SPECIES_EEVEE] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)),
+
+ [SPECIES_VAPOREON] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_JOLTEON] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_FLAREON] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)),
+
+ [SPECIES_PORYGON] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_OMANYTE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM03_SURF)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_OMASTAR] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM03_SURF)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_KABUTO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM03_SURF)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)),
+
+ [SPECIES_KABUTOPS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_AERODACTYL] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SNORLAX] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)),
+
+ [SPECIES_ARTICUNO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_ZAPDOS] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_MOLTRES] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM02_FLY)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_DRATINI] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)),
+
+ [SPECIES_DRAGONAIR] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)),
+
+ [SPECIES_DRAGONITE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM01_CUT)
+ | TMHM(HM02_FLY)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_MEWTWO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_MEW] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM02_FLY)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_CHIKORITA] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_BAYLEEF] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_MEGANIUM] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_CYNDAQUIL] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM01_CUT)),
+
+ [SPECIES_QUILAVA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_TYPHLOSION] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_TOTODILE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_CROCONAW] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_FERALIGATR] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_SENTRET] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)),
+
+ [SPECIES_FURRET] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_HOOTHOOT] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_NOCTOWL] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_LEDYBA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_LEDIAN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_SPINARAK] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_ARIADOS] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_CROBAT] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM02_FLY)),
+
+ [SPECIES_CHINCHOU] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_LANTURN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_PICHU] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_CLEFFA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_IGGLYBUFF] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_TOGEPI] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_TOGETIC] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_NATU] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_XATU] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM02_FLY)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_MAREEP] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_FLAAFFY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_AMPHAROS] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_BELLOSSOM] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_MARILL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_AZUMARILL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_SUDOWOODO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_POLITOED] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_HOPPIP] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_SKIPLOOM] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_JUMPLUFF] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_AIPOM] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SUNKERN] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_SUNFLORA] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_YANMA] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_WOOPER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_QUAGSIRE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_ESPEON] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_UMBREON] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_MURKROW] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM02_FLY)),
+
+ [SPECIES_SLOWKING] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_MISDREAVUS] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_UNOWN] = TMHM_LEARNSET(0),
+
+ [SPECIES_WOBBUFFET] = TMHM_LEARNSET(0),
+
+ [SPECIES_GIRAFARIG] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_PINECO] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_FORRETRESS] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_DUNSPARCE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_GLIGAR] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_STEELIX] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SNUBBULL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_GRANBULL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_QWILFISH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_SCIZOR] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SHUCKLE] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_HERACROSS] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SNEASEL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_TEDDIURSA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_URSARING] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SLUGMA] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_MAGCARGO] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SWINUB] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_PILOSWINE] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_CORSOLA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_REMORAID] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_OCTILLERY] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_DELIBIRD] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM02_FLY)),
+
+ [SPECIES_MANTINE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_SKARMORY] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM01_CUT)
+ | TMHM(HM02_FLY)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_HOUNDOUR] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM49_SNATCH)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_HOUNDOOM] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM49_SNATCH)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_KINGDRA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_PHANPY] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_DONPHAN] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_PORYGON2] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_STANTLER] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_SMEARGLE] = TMHM_LEARNSET(0),
+
+ [SPECIES_TYROGUE] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_HITMONTOP] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SMOOCHUM] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_ELEKID] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_MAGBY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_MILTANK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_BLISSEY] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_RAIKOU] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_ENTEI] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SUICUNE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_LARVITAR] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_PUPITAR] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_TYRANITAR] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_LUGIA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM02_FLY)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_HO_OH] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM02_FLY)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_CELEBI] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_OLD_UNOWN_B] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_C] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_D] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_E] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_F] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_G] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_H] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_I] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_J] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_K] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_L] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_M] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_N] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_O] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_P] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_Q] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_R] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_S] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_T] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_U] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_V] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_W] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_X] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_Y] = TMHM_LEARNSET(0),
+
+ [SPECIES_OLD_UNOWN_Z] = TMHM_LEARNSET(0),
+
+ [SPECIES_TREECKO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_GROVYLE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SCEPTILE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_TORCHIC] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_COMBUSKEN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_BLAZIKEN] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_MUDKIP] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_MARSHTOMP] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_SWAMPERT] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_POOCHYENA] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_MIGHTYENA] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_ZIGZAGOON] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_LINOONE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_WURMPLE] = TMHM_LEARNSET(0),
+
+ [SPECIES_SILCOON] = TMHM_LEARNSET(0),
+
+ [SPECIES_BEAUTIFLY] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_CASCOON] = TMHM_LEARNSET(0),
+
+ [SPECIES_DUSTOX] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_LOTAD] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM03_SURF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_LOMBRE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_LUDICOLO] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_SEEDOT] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_NUZLEAF] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SHIFTRY] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_NINCADA] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_NINJASK] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_SHEDINJA] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_TAILLOW] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)),
+
+ [SPECIES_SWELLOW] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)),
+
+ [SPECIES_SHROOMISH] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_BRELOOM] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SPINDA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_WINGULL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)),
+
+ [SPECIES_PELIPPER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)
+ | TMHM(HM03_SURF)),
+
+ [SPECIES_SURSKIT] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_MASQUERAIN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_WAILMER] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_WAILORD] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_SKITTY] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_DELCATTY] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_KECLEON] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_BALTOY] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_CLAYDOL] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_NOSEPASS] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_TORKOAL] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SABLEYE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_BARBOACH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_WHISCASH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_LUVDISC] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_CORPHISH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)),
+
+ [SPECIES_CRAWDAUNT] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_FEEBAS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_MILOTIC] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_CARVANHA] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_SHARPEDO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_TRAPINCH] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_VIBRAVA] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_FLYGON] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_MAKUHITA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_HARIYAMA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_ELECTRIKE] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_MANECTRIC] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_NUMEL] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_CAMERUPT] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SPHEAL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_SEALEO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_WALREIN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_CACNEA] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_CACTURNE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_SNORUNT] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_GLALIE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_LUNATONE] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_SOLROCK] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_AZURILL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)),
+
+ [SPECIES_SPOINK] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_GRUMPIG] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_PLUSLE] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_MINUN] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_MAWILE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_MEDITITE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_MEDICHAM] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SWABLU] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)),
+
+ [SPECIES_ALTARIA] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM02_FLY)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_WYNAUT] = TMHM_LEARNSET(0),
+
+ [SPECIES_DUSKULL] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_DUSCLOPS] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_ROSELIA] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_SLAKOTH] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_VIGOROTH] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SLAKING] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_GULPIN] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SWALOT] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_TROPIUS] = TMHM_LEARNSET(TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM01_CUT)
+ | TMHM(HM02_FLY)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_WHISMUR] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)),
+
+ [SPECIES_LOUDRED] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_EXPLOUD] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_CLAMPERL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_HUNTAIL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_GOREBYSS] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_ABSOL] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SHUPPET] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_BANETTE] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_SEVIPER] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_ZANGOOSE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_RELICANTH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_ARON] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_LAIRON] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_AGGRON] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_CASTFORM] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_VOLBEAT] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_ILLUMISE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_LILEEP] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)),
+
+ [SPECIES_CRADILY] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM09_BULLET_SEED)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM19_GIGA_DRAIN)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_ANORITH] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_ARMALDO] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_RALTS] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_KIRLIA] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_GARDEVOIR] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM46_THIEF)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_BAGON] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SHELGON] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_SALAMENCE] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM01_CUT)
+ | TMHM(HM02_FLY)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_BELDUM] = TMHM_LEARNSET(0),
+
+ [SPECIES_METANG] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_METAGROSS] = TMHM_LEARNSET(TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM36_SLUDGE_BOMB)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_REGIROCK] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_REGICE] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_REGISTEEL] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_KYOGRE] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM07_HAIL)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_GROUDON] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM28_DIG)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_RAYQUAZA] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM08_BULK_UP)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM14_BLIZZARD)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM23_IRON_TAIL)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM35_FLAMETHROWER)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM38_FIRE_BLAST)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM50_OVERHEAT)
+ | TMHM(HM02_FLY)
+ | TMHM(HM03_SURF)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM06_ROCK_SMASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_LATIAS] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM01_CUT)
+ | TMHM(HM02_FLY)
+ | TMHM(HM03_SURF)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_LATIOS] = TMHM_LEARNSET(TMHM(TM02_DRAGON_CLAW)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM05_ROAR)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM26_EARTHQUAKE)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM47_STEEL_WING)
+ | TMHM(HM01_CUT)
+ | TMHM(HM02_FLY)
+ | TMHM(HM03_SURF)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM07_WATERFALL)
+ | TMHM(HM08_DIVE)),
+
+ [SPECIES_JIRACHI] = TMHM_LEARNSET(TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM37_SANDSTORM)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(HM05_FLASH)),
+
+ [SPECIES_DEOXYS] = TMHM_LEARNSET(TMHM(TM01_FOCUS_PUNCH)
+ | TMHM(TM03_WATER_PULSE)
+ | TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM13_ICE_BEAM)
+ | TMHM(TM15_HYPER_BEAM)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM22_SOLARBEAM)
+ | TMHM(TM24_THUNDERBOLT)
+ | TMHM(TM25_THUNDER)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM31_BRICK_BREAK)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM39_ROCK_TOMB)
+ | TMHM(TM40_AERIAL_ACE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM01_CUT)
+ | TMHM(HM04_STRENGTH)
+ | TMHM(HM05_FLASH)
+ | TMHM(HM06_ROCK_SMASH)),
+
+ [SPECIES_CHIMECHO] = TMHM_LEARNSET(TMHM(TM04_CALM_MIND)
+ | TMHM(TM06_TOXIC)
+ | TMHM(TM10_HIDDEN_POWER)
+ | TMHM(TM11_SUNNY_DAY)
+ | TMHM(TM12_TAUNT)
+ | TMHM(TM16_LIGHT_SCREEN)
+ | TMHM(TM17_PROTECT)
+ | TMHM(TM18_RAIN_DANCE)
+ | TMHM(TM20_SAFEGUARD)
+ | TMHM(TM21_FRUSTRATION)
+ | TMHM(TM27_RETURN)
+ | TMHM(TM29_PSYCHIC)
+ | TMHM(TM30_SHADOW_BALL)
+ | TMHM(TM32_DOUBLE_TEAM)
+ | TMHM(TM33_REFLECT)
+ | TMHM(TM34_SHOCK_WAVE)
+ | TMHM(TM41_TORMENT)
+ | TMHM(TM42_FACADE)
+ | TMHM(TM43_SECRET_POWER)
+ | TMHM(TM44_REST)
+ | TMHM(TM45_ATTRACT)
+ | TMHM(TM48_SKILL_SWAP)
+ | TMHM(TM49_SNATCH)
+ | TMHM(HM05_FLASH)),
+
+};
diff --git a/src/data/pokemon/trainer_class_lookups.h b/src/data/pokemon/trainer_class_lookups.h
new file mode 100644
index 000000000..faf23bf31
--- /dev/null
+++ b/src/data/pokemon/trainer_class_lookups.h
@@ -0,0 +1,308 @@
+// TODO: document trainer pic indices with macro
+const u8 gFacilityClassToPicIndex[] =
+{
+ [FACILITY_CLASS_AQUA_LEADER] = 0,
+ [FACILITY_CLASS_TEAM_AQUA] = 1,
+ [FACILITY_CLASS_TEAM_AQUA_2] = 2,
+ [FACILITY_CLASS_AROMA_LADY] = 3,
+ [FACILITY_CLASS_RUIN_MANIAC] = 4,
+ [FACILITY_CLASS_INTERVIEWER] = 5,
+ [FACILITY_CLASS_TUBER] = 6,
+ [FACILITY_CLASS_TUBER_2] = 7,
+ [FACILITY_CLASS_COOLTRAINER] = 8,
+ [FACILITY_CLASS_COOLTRAINER_2] = 9,
+ [FACILITY_CLASS_HEX_MANIAC] = 10,
+ [FACILITY_CLASS_LADY] = 11,
+ [FACILITY_CLASS_BEAUTY] = 12,
+ [FACILITY_CLASS_RICH_BOY] = 13,
+ [FACILITY_CLASS_POKEMANIAC] = 14,
+ [FACILITY_CLASS_SWIMMER_MALE] = 15,
+ [FACILITY_CLASS_BLACK_BELT] = 16,
+ [FACILITY_CLASS_GUITARIST] = 17,
+ [FACILITY_CLASS_KINDLER] = 18,
+ [FACILITY_CLASS_CAMPER] = 19,
+ [FACILITY_CLASS_BUG_MANIAC] = 20,
+ [FACILITY_CLASS_PSYCHIC] = 21,
+ [FACILITY_CLASS_PSYCHIC_2] = 22,
+ [FACILITY_CLASS_GENTLEMAN] = 23,
+ [FACILITY_CLASS_ELITE_FOUR] = 24,
+ [FACILITY_CLASS_ELITE_FOUR_2] = 25,
+ [FACILITY_CLASS_LEADER] = 26,
+ [FACILITY_CLASS_LEADER_2] = 27,
+ [FACILITY_CLASS_LEADER_3] = 28,
+ [FACILITY_CLASS_SCHOOL_KID] = 29,
+ [FACILITY_CLASS_SCHOOL_KID_2] = 30,
+ [FACILITY_CLASS_SR_AND_JR] = 31,
+ [FACILITY_CLASS_POKEFAN] = 32,
+ [FACILITY_CLASS_POKEFAN_2] = 33,
+ [FACILITY_CLASS_EXPERT] = 34,
+ [FACILITY_CLASS_EXPERT_2] = 35,
+ [FACILITY_CLASS_YOUNGSTER] = 36,
+ [FACILITY_CLASS_CHAMPION] = 37,
+ [FACILITY_CLASS_FISHERMAN] = 38,
+ [FACILITY_CLASS_TRIATHLETE] = 39,
+ [FACILITY_CLASS_TRIATHLETE_2] = 40,
+ [FACILITY_CLASS_TRIATHLETE_3] = 41,
+ [FACILITY_CLASS_TRIATHLETE_4] = 42,
+ [FACILITY_CLASS_TRIATHLETE_5] = 43,
+ [FACILITY_CLASS_TRIATHLETE_6] = 44,
+ [FACILITY_CLASS_DRAGON_TAMER] = 45,
+ [FACILITY_CLASS_BIRD_KEEPER] = 46,
+ [FACILITY_CLASS_NINJA_BOY] = 47,
+ [FACILITY_CLASS_BATTLE_GIRL] = 48,
+ [FACILITY_CLASS_PARASOL_LADY] = 49,
+ [FACILITY_CLASS_SWIMMER_FEMALE] = 50,
+ [FACILITY_CLASS_PICNICKER] = 51,
+ [FACILITY_CLASS_TWINS] = 52,
+ [FACILITY_CLASS_SAILOR] = 53,
+ [FACILITY_CLASS_BOARDER] = 36,
+ [FACILITY_CLASS_BOARDER_2] = 36,
+ [FACILITY_CLASS_COLLECTOR] = 54,
+ [FACILITY_CLASS_PKMN_TRAINER] = 55,
+ [FACILITY_CLASS_PKMN_TRAINER_2] = 56,
+ [FACILITY_CLASS_PKMN_TRAINER_3] = 56,
+ [FACILITY_CLASS_PKMN_TRAINER_4] = 56,
+ [FACILITY_CLASS_PKMN_TRAINER_5] = 57,
+ [FACILITY_CLASS_PKMN_TRAINER_6] = 57,
+ [FACILITY_CLASS_PKMN_TRAINER_7] = 57,
+ [FACILITY_CLASS_PKMN_BREEDER] = 58,
+ [FACILITY_CLASS_PKMN_BREEDER_2] = 59,
+ [FACILITY_CLASS_PKMN_RANGER] = 60,
+ [FACILITY_CLASS_PKMN_RANGER_2] = 61,
+ [FACILITY_CLASS_MAGMA_LEADER] = 62,
+ [FACILITY_CLASS_TEAM_MAGMA] = 63,
+ [FACILITY_CLASS_TEAM_MAGMA_2] = 64,
+ [FACILITY_CLASS_LASS] = 65,
+ [FACILITY_CLASS_BUG_CATCHER] = 66,
+ [FACILITY_CLASS_HIKER] = 67,
+ [FACILITY_CLASS_YOUNG_COUPLE] = 68,
+ [FACILITY_CLASS_OLD_COUPLE] = 69,
+ [FACILITY_CLASS_SIS_AND_BRO] = 70,
+ [FACILITY_CLASS_AQUA_ADMIN] = 71,
+ [FACILITY_CLASS_AQUA_ADMIN_2] = 72,
+ [FACILITY_CLASS_MAGMA_ADMIN] = 73,
+ [FACILITY_CLASS_MAGMA_ADMIN_2] = 74,
+ [FACILITY_CLASS_LEADER_4] = 75,
+ [FACILITY_CLASS_LEADER_5] = 76,
+ [FACILITY_CLASS_LEADER_6] = 77,
+ [FACILITY_CLASS_LEADER_7] = 78,
+ [FACILITY_CLASS_LEADER_8] = 79,
+ [FACILITY_CLASS_ELITE_FOUR_3] = 80,
+ [FACILITY_CLASS_ELITE_FOUR_4] = 81,
+ [FACILITY_CLASS_YOUNGSTER_2] = 82,
+ [FACILITY_CLASS_BUG_CATCHER_2] = 83,
+ [FACILITY_CLASS_LASS_2] = 84,
+ [FACILITY_CLASS_SAILOR_2] = 85,
+ [FACILITY_CLASS_CAMPER_2] = 86,
+ [FACILITY_CLASS_PICNICKER_2] = 87,
+ [FACILITY_CLASS_POKEMANIAC_2] = 88,
+ [FACILITY_CLASS_SUPER_NERD] = 89,
+ [FACILITY_CLASS_HIKER_2] = 90,
+ [FACILITY_CLASS_BIKER] = 91,
+ [FACILITY_CLASS_BURGLAR] = 92,
+ [FACILITY_CLASS_ENGINEER] = 93,
+ [FACILITY_CLASS_FISHERMAN_2] = 94,
+ [FACILITY_CLASS_SWIMMER_MALE_2] = 95,
+ [FACILITY_CLASS_CUE_BALL] = 96,
+ [FACILITY_CLASS_GAMER] = 97,
+ [FACILITY_CLASS_BEAUTY_2] = 98,
+ [FACILITY_CLASS_SWIMMER_FEMALE_2] = 99,
+ [FACILITY_CLASS_PSYCHIC_3] = 100,
+ [FACILITY_CLASS_ROCKER] = 101,
+ [FACILITY_CLASS_JUGGLER] = 102,
+ [FACILITY_CLASS_TAMER] = 103,
+ [FACILITY_CLASS_BIRD_KEEPER_2] = 104,
+ [FACILITY_CLASS_BLACK_BELT_2] = 105,
+ [FACILITY_CLASS_RIVAL] = 106,
+ [FACILITY_CLASS_SCIENTIST] = 107,
+ [FACILITY_CLASS_BOSS] = 108,
+ [FACILITY_CLASS_TEAM_ROCKET] = 109,
+ [FACILITY_CLASS_COOLTRAINER_3] = 110,
+ [FACILITY_CLASS_COOLTRAINER_4] = 111,
+ [FACILITY_CLASS_ELITE_FOUR_5] = 112,
+ [FACILITY_CLASS_ELITE_FOUR_6] = 113,
+ [FACILITY_CLASS_LEADER_9] = 116,
+ [FACILITY_CLASS_LEADER_10] = 117,
+ [FACILITY_CLASS_GENTLEMAN_2] = 123,
+ [FACILITY_CLASS_RIVAL_2] = 124,
+ [FACILITY_CLASS_CHAMPION_2] = 125,
+ [FACILITY_CLASS_CHANNELER] = 126,
+ [FACILITY_CLASS_TWINS_2] = 127,
+ [FACILITY_CLASS_COOL_COUPLE] = 128,
+ [FACILITY_CLASS_YOUNG_COUPLE_2] = 129,
+ [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_TEAM_ROCKET_2] = 137,
+ [FACILITY_CLASS_PSYCHIC_4] = 138,
+ [FACILITY_CLASS_CRUSH_GIRL] = 139,
+ [FACILITY_CLASS_TUBER_3] = 140,
+ [FACILITY_CLASS_PKMN_BREEDER_3] = 141,
+ [FACILITY_CLASS_PKMN_RANGER_3] = 142,
+ [FACILITY_CLASS_PKMN_RANGER_4] = 143,
+ [FACILITY_CLASS_AROMA_LADY_2] = 144,
+ [FACILITY_CLASS_RUIN_MANIAC_2] = 145,
+ [FACILITY_CLASS_LADY_2] = 146,
+ [FACILITY_CLASS_PAINTER] = 147,
+ [FACILITY_CLASS_ELITE_FOUR_7] = 112,
+ [FACILITY_CLASS_ELITE_FOUR_8] = 113,
+ [FACILITY_CLASS_CHAMPION_3] = 125,
+};
+
+const u8 gFacilityClassToTrainerClass[] =
+{
+ [FACILITY_CLASS_AQUA_LEADER] = CLASS_AQUA_LEADER,
+ [FACILITY_CLASS_TEAM_AQUA] = CLASS_TEAM_AQUA,
+ [FACILITY_CLASS_TEAM_AQUA_2] = CLASS_TEAM_AQUA,
+ [FACILITY_CLASS_AROMA_LADY] = CLASS_AROMA_LADY,
+ [FACILITY_CLASS_RUIN_MANIAC] = CLASS_RUIN_MANIAC,
+ [FACILITY_CLASS_INTERVIEWER] = CLASS_INTERVIEWER,
+ [FACILITY_CLASS_TUBER] = CLASS_TUBER,
+ [FACILITY_CLASS_TUBER_2] = CLASS_TUBER_2,
+ [FACILITY_CLASS_COOLTRAINER] = CLASS_COOLTRAINER,
+ [FACILITY_CLASS_COOLTRAINER_2] = CLASS_COOLTRAINER,
+ [FACILITY_CLASS_HEX_MANIAC] = CLASS_HEX_MANIAC,
+ [FACILITY_CLASS_LADY] = CLASS_LADY,
+ [FACILITY_CLASS_BEAUTY] = CLASS_BEAUTY,
+ [FACILITY_CLASS_RICH_BOY] = CLASS_RICH_BOY,
+ [FACILITY_CLASS_POKEMANIAC] = CLASS_POKEMANIAC,
+ [FACILITY_CLASS_SWIMMER_MALE] = CLASS_SWIMMER_MALE,
+ [FACILITY_CLASS_BLACK_BELT] = CLASS_BLACK_BELT,
+ [FACILITY_CLASS_GUITARIST] = CLASS_GUITARIST,
+ [FACILITY_CLASS_KINDLER] = CLASS_KINDLER,
+ [FACILITY_CLASS_CAMPER] = CLASS_CAMPER,
+ [FACILITY_CLASS_BUG_MANIAC] = CLASS_BUG_MANIAC,
+ [FACILITY_CLASS_PSYCHIC] = CLASS_PSYCHIC,
+ [FACILITY_CLASS_PSYCHIC_2] = CLASS_PSYCHIC,
+ [FACILITY_CLASS_GENTLEMAN] = CLASS_GENTLEMAN,
+ [FACILITY_CLASS_ELITE_FOUR] = CLASS_ELITE_FOUR,
+ [FACILITY_CLASS_ELITE_FOUR_2] = CLASS_ELITE_FOUR,
+ [FACILITY_CLASS_LEADER] = CLASS_LEADER,
+ [FACILITY_CLASS_LEADER_2] = CLASS_LEADER,
+ [FACILITY_CLASS_LEADER_3] = CLASS_LEADER,
+ [FACILITY_CLASS_SCHOOL_KID] = CLASS_SCHOOL_KID,
+ [FACILITY_CLASS_SCHOOL_KID_2] = CLASS_SCHOOL_KID,
+ [FACILITY_CLASS_SR_AND_JR] = CLASS_SR_AND_JR,
+ [FACILITY_CLASS_POKEFAN] = CLASS_POKEFAN,
+ [FACILITY_CLASS_POKEFAN_2] = CLASS_POKEFAN,
+ [FACILITY_CLASS_EXPERT] = CLASS_EXPERT,
+ [FACILITY_CLASS_EXPERT_2] = CLASS_EXPERT,
+ [FACILITY_CLASS_YOUNGSTER] = CLASS_YOUNGSTER,
+ [FACILITY_CLASS_CHAMPION] = CLASS_CHAMPION,
+ [FACILITY_CLASS_FISHERMAN] = CLASS_FISHERMAN,
+ [FACILITY_CLASS_TRIATHLETE] = CLASS_TRIATHLETE,
+ [FACILITY_CLASS_TRIATHLETE_2] = CLASS_TRIATHLETE,
+ [FACILITY_CLASS_TRIATHLETE_3] = CLASS_TRIATHLETE,
+ [FACILITY_CLASS_TRIATHLETE_4] = CLASS_TRIATHLETE,
+ [FACILITY_CLASS_TRIATHLETE_5] = CLASS_TRIATHLETE,
+ [FACILITY_CLASS_TRIATHLETE_6] = CLASS_TRIATHLETE,
+ [FACILITY_CLASS_DRAGON_TAMER] = CLASS_DRAGON_TAMER,
+ [FACILITY_CLASS_BIRD_KEEPER] = CLASS_BIRD_KEEPER,
+ [FACILITY_CLASS_NINJA_BOY] = CLASS_NINJA_BOY,
+ [FACILITY_CLASS_BATTLE_GIRL] = CLASS_BATTLE_GIRL,
+ [FACILITY_CLASS_PARASOL_LADY] = CLASS_PARASOL_LADY,
+ [FACILITY_CLASS_SWIMMER_FEMALE] = CLASS_SWIMMER_FEMALE,
+ [FACILITY_CLASS_PICNICKER] = CLASS_PICNICKER,
+ [FACILITY_CLASS_TWINS] = CLASS_TWINS,
+ [FACILITY_CLASS_SAILOR] = CLASS_SAILOR,
+ [FACILITY_CLASS_BOARDER] = CLASS_BOARDER,
+ [FACILITY_CLASS_BOARDER_2] = CLASS_BOARDER,
+ [FACILITY_CLASS_COLLECTOR] = CLASS_COLLECTOR,
+ [FACILITY_CLASS_PKMN_TRAINER] = CLASS_PKMN_TRAINER_3,
+ [FACILITY_CLASS_PKMN_TRAINER_2] = CLASS_PKMN_TRAINER_3,
+ [FACILITY_CLASS_PKMN_TRAINER_3] = CLASS_PKMN_TRAINER_3,
+ [FACILITY_CLASS_PKMN_TRAINER_4] = CLASS_PKMN_TRAINER_3,
+ [FACILITY_CLASS_PKMN_TRAINER_5] = CLASS_PKMN_TRAINER_3,
+ [FACILITY_CLASS_PKMN_TRAINER_6] = CLASS_PKMN_TRAINER_3,
+ [FACILITY_CLASS_PKMN_TRAINER_7] = CLASS_PKMN_TRAINER_3,
+ [FACILITY_CLASS_PKMN_BREEDER] = CLASS_PKMN_BREEDER,
+ [FACILITY_CLASS_PKMN_BREEDER_2] = CLASS_PKMN_BREEDER,
+ [FACILITY_CLASS_PKMN_RANGER] = CLASS_PKMN_RANGER,
+ [FACILITY_CLASS_PKMN_RANGER_2] = CLASS_PKMN_RANGER,
+ [FACILITY_CLASS_MAGMA_LEADER] = CLASS_MAGMA_LEADER,
+ [FACILITY_CLASS_TEAM_MAGMA] = CLASS_TEAM_MAGMA,
+ [FACILITY_CLASS_TEAM_MAGMA_2] = CLASS_TEAM_MAGMA,
+ [FACILITY_CLASS_LASS] = CLASS_LASS,
+ [FACILITY_CLASS_BUG_CATCHER] = CLASS_BUG_CATCHER,
+ [FACILITY_CLASS_HIKER] = CLASS_HIKER,
+ [FACILITY_CLASS_YOUNG_COUPLE] = CLASS_YOUNG_COUPLE,
+ [FACILITY_CLASS_OLD_COUPLE] = CLASS_OLD_COUPLE,
+ [FACILITY_CLASS_SIS_AND_BRO] = CLASS_SIS_AND_BRO,
+ [FACILITY_CLASS_AQUA_ADMIN] = CLASS_AQUA_ADMIN,
+ [FACILITY_CLASS_AQUA_ADMIN_2] = CLASS_AQUA_ADMIN,
+ [FACILITY_CLASS_MAGMA_ADMIN] = CLASS_MAGMA_ADMIN,
+ [FACILITY_CLASS_MAGMA_ADMIN_2] = CLASS_MAGMA_ADMIN,
+ [FACILITY_CLASS_LEADER_4] = CLASS_LEADER,
+ [FACILITY_CLASS_LEADER_5] = CLASS_LEADER,
+ [FACILITY_CLASS_LEADER_6] = CLASS_LEADER,
+ [FACILITY_CLASS_LEADER_7] = CLASS_LEADER,
+ [FACILITY_CLASS_LEADER_8] = CLASS_LEADER,
+ [FACILITY_CLASS_ELITE_FOUR_3] = CLASS_ELITE_FOUR,
+ [FACILITY_CLASS_ELITE_FOUR_4] = CLASS_ELITE_FOUR,
+ [FACILITY_CLASS_YOUNGSTER_2] = CLASS_YOUNGSTER_2,
+ [FACILITY_CLASS_BUG_CATCHER_2] = CLASS_BUG_CATCHER_2,
+ [FACILITY_CLASS_LASS_2] = CLASS_LASS_2,
+ [FACILITY_CLASS_SAILOR_2] = CLASS_SAILOR_2,
+ [FACILITY_CLASS_CAMPER_2] = CLASS_CAMPER_2,
+ [FACILITY_CLASS_PICNICKER_2] = CLASS_PICNICKER_2,
+ [FACILITY_CLASS_POKEMANIAC_2] = CLASS_POKEMANIAC_2,
+ [FACILITY_CLASS_SUPER_NERD] = CLASS_SUPER_NERD,
+ [FACILITY_CLASS_HIKER_2] = CLASS_HIKER_2,
+ [FACILITY_CLASS_BIKER] = CLASS_BIKER,
+ [FACILITY_CLASS_BURGLAR] = CLASS_BURGLAR,
+ [FACILITY_CLASS_ENGINEER] = CLASS_ENGINEER,
+ [FACILITY_CLASS_FISHERMAN_2] = CLASS_FISHERMAN_2,
+ [FACILITY_CLASS_SWIMMER_MALE_2] = CLASS_SWIMMER_MALE_2,
+ [FACILITY_CLASS_CUE_BALL] = CLASS_CUE_BALL,
+ [FACILITY_CLASS_GAMER] = CLASS_GAMER,
+ [FACILITY_CLASS_BEAUTY_2] = CLASS_BEAUTY_2,
+ [FACILITY_CLASS_SWIMMER_FEMALE_2] = CLASS_SWIMMER_FEMALE_2,
+ [FACILITY_CLASS_PSYCHIC_3] = CLASS_PSYCHIC_2,
+ [FACILITY_CLASS_ROCKER] = CLASS_ROCKER,
+ [FACILITY_CLASS_JUGGLER] = CLASS_JUGGLER,
+ [FACILITY_CLASS_TAMER] = CLASS_TAMER,
+ [FACILITY_CLASS_BIRD_KEEPER_2] = CLASS_BIRD_KEEPER_2,
+ [FACILITY_CLASS_BLACK_BELT_2] = CLASS_BLACK_BELT_2,
+ [FACILITY_CLASS_RIVAL] = CLASS_RIVAL,
+ [FACILITY_CLASS_SCIENTIST] = CLASS_SCIENTIST,
+ [FACILITY_CLASS_BOSS] = CLASS_BOSS,
+ [FACILITY_CLASS_TEAM_ROCKET] = CLASS_TEAM_ROCKET,
+ [FACILITY_CLASS_COOLTRAINER_3] = CLASS_COOLTRAINER_2,
+ [FACILITY_CLASS_COOLTRAINER_4] = CLASS_COOLTRAINER_2,
+ [FACILITY_CLASS_ELITE_FOUR_5] = CLASS_ELITE_FOUR_2,
+ [FACILITY_CLASS_ELITE_FOUR_6] = CLASS_ELITE_FOUR_2,
+ [FACILITY_CLASS_LEADER_9] = CLASS_LEADER_2,
+ [FACILITY_CLASS_LEADER_10] = CLASS_LEADER_2,
+ [FACILITY_CLASS_GENTLEMAN_2] = CLASS_GENTLEMAN_2,
+ [FACILITY_CLASS_RIVAL_2] = CLASS_RIVAL_2,
+ [FACILITY_CLASS_CHAMPION_2] = CLASS_CHAMPION_2,
+ [FACILITY_CLASS_CHANNELER] = CLASS_CHANNELER,
+ [FACILITY_CLASS_TWINS_2] = CLASS_TWINS_2,
+ [FACILITY_CLASS_COOL_COUPLE] = CLASS_COOL_COUPLE,
+ [FACILITY_CLASS_YOUNG_COUPLE_2] = CLASS_YOUNG_COUPLE_2,
+ [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_TEAM_ROCKET_2] = CLASS_TEAM_ROCKET,
+ [FACILITY_CLASS_PSYCHIC_4] = CLASS_PSYCHIC_2,
+ [FACILITY_CLASS_CRUSH_GIRL] = CLASS_CRUSH_GIRL,
+ [FACILITY_CLASS_TUBER_3] = CLASS_TUBER_3,
+ [FACILITY_CLASS_PKMN_BREEDER_3] = CLASS_PKMN_BREEDER_2,
+ [FACILITY_CLASS_PKMN_RANGER_3] = CLASS_PKMN_RANGER_2,
+ [FACILITY_CLASS_PKMN_RANGER_4] = CLASS_PKMN_RANGER_2,
+ [FACILITY_CLASS_AROMA_LADY_2] = CLASS_AROMA_LADY_2,
+ [FACILITY_CLASS_RUIN_MANIAC_2] = CLASS_RUIN_MANIAC_2,
+ [FACILITY_CLASS_LADY_2] = CLASS_LADY_2,
+ [FACILITY_CLASS_PAINTER] = CLASS_PAINTER,
+ [FACILITY_CLASS_ELITE_FOUR_7] = CLASS_ELITE_FOUR_2,
+ [FACILITY_CLASS_ELITE_FOUR_8] = CLASS_ELITE_FOUR_2,
+ [FACILITY_CLASS_CHAMPION_3] = CLASS_CHAMPION_2,
+};
diff --git a/src/daycare.c b/src/daycare.c
index 26ebedc5d..abc3b23ca 100644
--- a/src/daycare.c
+++ b/src/daycare.c
@@ -5,7 +5,7 @@
#include "string_util.h"
#include "constants/species.h"
#include "constants/items.h"
-#include "mail.h"
+#include "mail_data.h"
#include "pokemon_storage_system.h"
#include "event_data.h"
#include "random.h"
@@ -163,7 +163,7 @@ static const u8 *const sCompatibilityMessages[] =
static const u8 sNewLineText[] = _("\n");
static const u8 sJapaneseEggNickname[] = _("タマゴ"); // "tamago" ("egg" in Japanese)
-static const u16 sEggPalette[] = INCBIN_U16("graphics/pokemon/palettes/egg_palette.gbapal");
+static const u16 sEggPalette[] = INCBIN_U16("graphics/pokemon/egg/normal.gbapal");
static const u8 sEggHatchTiles[] = INCBIN_U8("graphics/misc/egg_hatch.4bpp");
static const u8 sEggShardTiles[] = INCBIN_U8("graphics/misc/egg_shard.4bpp");
@@ -1533,7 +1533,7 @@ static void DaycarePrintMonInfo(u8 windowId, s32 daycareSlotId, u8 y)
static void Task_HandleDaycareLevelMenuInput(u8 taskId)
{
- u32 input = ListMenuHandleInput(gTasks[taskId].tMenuListTaskId);
+ u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuListTaskId);
if (gMain.newKeys & A_BUTTON)
{
@@ -1547,7 +1547,7 @@ static void Task_HandleDaycareLevelMenuInput(u8 taskId)
gSpecialVar_Result = 2;
break;
}
- DestroyListMenu(gTasks[taskId].tMenuListTaskId, NULL, NULL);
+ DestroyListMenuTask(gTasks[taskId].tMenuListTaskId, NULL, NULL);
ClearStdWindowAndFrame(gTasks[taskId].tWindowId, TRUE);
RemoveWindow(gTasks[taskId].tWindowId);
DestroyTask(taskId);
@@ -1556,7 +1556,7 @@ static void Task_HandleDaycareLevelMenuInput(u8 taskId)
else if (gMain.newKeys & B_BUTTON)
{
gSpecialVar_Result = 2;
- DestroyListMenu(gTasks[taskId].tMenuListTaskId, NULL, NULL);
+ DestroyListMenuTask(gTasks[taskId].tMenuListTaskId, NULL, NULL);
ClearStdWindowAndFrame(gTasks[taskId].tWindowId, TRUE);
RemoveWindow(gTasks[taskId].tWindowId);
DestroyTask(taskId);
@@ -1768,8 +1768,8 @@ static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID, u16* speciesLoc
{
u16 species = GetMonData(mon, MON_DATA_SPECIES);
u32 pid = GetMonData(mon, MON_DATA_PERSONALITY);
- sub_800ECC4(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[(a0 * 2) + 1], species, pid);
- LoadCompressedObjectPalette(GetMonSpritePalStruct(mon));
+ HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[(a0 * 2) + 1], species, pid);
+ LoadCompressedSpritePalette(GetMonSpritePalStruct(mon));
*speciesLoc = species;
}
break;
@@ -1824,7 +1824,7 @@ static void CB2_EggHatch_0(void)
SetVBlankCallback(VBlankCB_EggHatch);
gSpecialVar_0x8005 = GetCurrentMapMusic();
- reset_temp_tile_data_buffers();
+ ResetTempTileDataBuffers();
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, sBgTemplates_EggHatch, ARRAY_COUNT(sBgTemplates_EggHatch));
@@ -2205,5 +2205,5 @@ static void EggHatchPrintMessage(u8 windowId, u8* string, u8 x, u8 y, u8 speed)
sEggHatchData->textColor.fgColor = 0;
sEggHatchData->textColor.bgColor = 5;
sEggHatchData->textColor.shadowColor = 6;
- AddTextPrinterParametrized2(windowId, 3, x, y, 1, 1, &sEggHatchData->textColor, speed, string);
+ AddTextPrinterParameterized4(windowId, 3, x, y, 1, 1, &sEggHatchData->textColor, speed, string);
}
diff --git a/src/decompress.c b/src/decompress.c
new file mode 100644
index 000000000..caeda738a
--- /dev/null
+++ b/src/decompress.c
@@ -0,0 +1,662 @@
+#include "global.h"
+#include "malloc.h"
+#include "decompress.h"
+#include "pokemon.h"
+#include "text.h"
+#include "constants/species.h"
+
+extern const struct CompressedSpriteSheet gMonFrontPicTable[];
+extern const struct CompressedSpriteSheet gMonBackPicTable[];
+
+static void DuplicateDeoxysTiles(void *pointer, s32 species);
+
+void LZDecompressWram(const void *src, void *dest)
+{
+ LZ77UnCompWram(src, dest);
+}
+
+void LZDecompressVram(const void *src, void *dest)
+{
+ LZ77UnCompVram(src, dest);
+}
+
+u16 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src)
+{
+ struct SpriteSheet dest;
+
+ LZ77UnCompWram(src->data, gDecompressionBuffer);
+ dest.data = gDecompressionBuffer;
+ dest.size = src->size;
+ dest.tag = src->tag;
+ return LoadSpriteSheet(&dest);
+}
+
+void LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer)
+{
+ struct SpriteSheet dest;
+
+ LZ77UnCompWram(src->data, buffer);
+ dest.data = buffer;
+ dest.size = src->size;
+ dest.tag = src->tag;
+ LoadSpriteSheet(&dest);
+}
+
+void LoadCompressedSpritePalette(const struct CompressedSpritePalette *src)
+{
+ struct SpritePalette dest;
+
+ LZ77UnCompWram(src->data, gDecompressionBuffer);
+ dest.data = (void*) gDecompressionBuffer;
+ dest.tag = src->tag;
+ LoadSpritePalette(&dest);
+}
+
+void LoadCompressedSpritePaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer)
+{
+ struct SpritePalette dest;
+
+ LZ77UnCompWram(a->data, buffer);
+ dest.data = buffer;
+ dest.tag = a->tag;
+ LoadSpritePalette(&dest);
+}
+
+void DecompressPicFromTable(const struct CompressedSpriteSheet *src, void* buffer, s32 species)
+{
+ if (species > NUM_SPECIES)
+ LZ77UnCompWram(gMonFrontPicTable[0].data, buffer);
+ else
+ LZ77UnCompWram(src->data, buffer);
+ DuplicateDeoxysTiles(buffer, species);
+}
+
+void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality)
+{
+ bool8 isFrontPic;
+
+ if (src == &gMonFrontPicTable[species])
+ isFrontPic = TRUE; // frontPic
+ else
+ isFrontPic = FALSE; // backPic
+ LoadSpecialPokePic(src, dest, species, personality, isFrontPic);
+}
+
+void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic)
+{
+ if (species == SPECIES_UNOWN)
+ {
+ u16 i = (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 3)) % 0x1C;
+
+ // The other Unowns are separate from Unown A.
+ if (i == 0)
+ i = SPECIES_UNOWN;
+ else
+ i += SPECIES_UNOWN_B - 1;
+ if (!isFrontPic)
+ LZ77UnCompWram(gMonBackPicTable[i].data, dest);
+ else
+ LZ77UnCompWram(gMonFrontPicTable[i].data, dest);
+ }
+ else if (species > NUM_SPECIES) // is species unknown? draw the ? icon
+ LZ77UnCompWram(gMonFrontPicTable[0].data, dest);
+ else
+ LZ77UnCompWram(src->data, dest);
+
+ DuplicateDeoxysTiles(dest, species);
+ DrawSpindaSpots(species, personality, dest, isFrontPic);
+}
+
+static void DuplicateDeoxysTiles(void *pointer, s32 species)
+{
+ if (species == SPECIES_DEOXYS)
+ CpuCopy32(pointer + 0x800, pointer, 0x800);
+}
+
+static void Unused_LZDecompressWramIndirect(const void **src, void *dest)
+{
+ LZ77UnCompWram(*src, dest);
+}
+
+#ifdef NONMATCHING
+static void sub_800EDDC(s32 a0, s32 a1, const u8 *a2, u8 *a3)
+{
+ u8 *v1, *v2;
+ int i, j, k, l;
+
+ if (a0 & 1)
+ {
+ u8 v40 = ((a0 >> 1) + 4);
+ for (i = 0; i < a1; ++i)
+ {
+ // this nested loop failed to match
+ for (j = 0; j < 8 - a0; ++j)
+ {
+ for (k = 0; k < 8; ++k)
+ {
+
+ v1 = a3 + 0x100 * v40 + 0x100 * (j >> 1) + 0x20 * k;
+ v2 = a3 + 0x20 * k + 0x100 * (j >> 1);
+ for (l = 0; l < 0x10; ++l)
+ {
+ if (!(j & 1))
+ {
+ v2[0] = j & 1;
+ v1[16] = 0;
+// a3[0x100 * (j / 2) + 0x20 * k + l] = 0;
+// a3[0x100 * v40 + 0x100 * (j / 2) + 0x20 * k + l + 0x10] = 0;
+ }
+ else
+ {
+ v2[16] = 0;
+ v1[0x100] = 0;
+// a3[0x100 * (j / 2) + 0x20 * k + l + 0x10] = 0;
+// a3[0x100 * v40 + 0x100 * (j / 2) + 0x20 * k + l + 0x100] = 0;
+ }
+ ++v1;
+ ++v2; // this should be generated if you write stuff inside operator [] instead of declaring v1/v2
+ }
+ }
+ }
+ for (j = 0; j < 2; ++j)
+ {
+ for (k = 0; k < 8; ++k)
+ {
+ for (l = 0; l < 0x20; ++l)
+ {
+ a3[0x100 * k + 0x20 * j + l] = 0;
+ a3[0x100 * k + 0xC0 + 0x20 * j + l] = 0;
+ }
+ }
+ }
+ if (a0 == 5)
+ a3 += 0x120;
+ for (j = 0; j < a0; ++j)
+ {
+ for (k = 0; k < a0; ++k)
+ {
+ for (l = 0; l < 4; ++l)
+ {
+ a3[0x12 + 4 * l] = a2[0 + 4 * l];
+ a3[0x13 + 4 * l] = a2[1 + 4 * l];
+ a3[0x12 + 0x1E + 4 * l] = a2[2 + 4 * l];
+ a3[0x12 + 0x1F + 4 * l] = a2[3 + 4 * l];
+ a3[0x102 + 4 * l] = a2[0x10 + 4 * l];
+ a3[0x103 + 4 * l] = a2[0x11 + 4 * l];
+ a3[0x120 + 4 * l] = a2[0x12 + 4 * l];
+ a3[0x121 + 4 * l] = a2[0x13 + 4 * l];
+ }
+ a2 += 0x20;
+ a3 += 0x20;
+ }
+ if (a0 == 7)
+ a3 += 0x20;
+ else if (a0 == 5)
+ a3 += 0x60;
+ }
+ if (a0 == 7)
+ a3 += 0x100;
+ else if (a0 == 5)
+ a3 += 0x1E0;
+ }
+ }
+ else
+ {
+ for (i = 0; i < a1; ++i)
+ {
+ if (a0 == 6)
+ for (j = 0; j < 0x100; ++j)
+ *a3++ = 0;
+ for (j = 0; j < a0; ++j)
+ {
+ if (a0 == 6)
+ for (k = 0; k < 0x20; ++k)
+ *a3++ = 0;
+ for (k = 0; k < 0x20 * a0; ++k)
+ *a3++ = *a2++;
+ if (a0 == 6)
+ for (k = 0; k < 0x20; ++k)
+ *a3++ = 0;
+ }
+ if (a0 == 6)
+ for (j = 0; j < 0x100; ++j)
+ *a3++ = 0;
+ }
+ }
+}
+#else
+NAKED
+static void sub_800EDDC(s32 a0, s32 a1, const u8 *a2, u8 *a3)
+{
+ asm_unified("\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x24\n\
+ mov r9, r0\n\
+ str r1, [sp]\n\
+ str r2, [sp, 0x4]\n\
+ adds r5, r3, 0\n\
+ movs r0, 0x1\n\
+ mov r1, r9\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0800EDFC\n\
+ b _0800EF94\n\
+ _0800EDFC:\n\
+ asrs r0, r1, 1\n\
+ adds r0, 0x4\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ str r0, [sp, 0x8]\n\
+ movs r0, 0\n\
+ ldr r2, [sp]\n\
+ cmp r0, r2\n\
+ blt _0800EE10\n\
+ b _0800F024\n\
+ _0800EE10:\n\
+ movs r4, 0x8\n\
+ subs r1, r4, r1\n\
+ str r1, [sp, 0x10]\n\
+ _0800EE16:\n\
+ movs r7, 0\n\
+ adds r0, 0x1\n\
+ str r0, [sp, 0x14]\n\
+ ldr r0, [sp, 0x10]\n\
+ cmp r7, r0\n\
+ bge _0800EE92\n\
+ ldr r1, [sp, 0x8]\n\
+ lsls r1, 8\n\
+ str r1, [sp, 0x18]\n\
+ movs r2, 0\n\
+ mov r10, r2\n\
+ mov r0, r9\n\
+ movs r4, 0x8\n\
+ subs r0, r4, r0\n\
+ str r0, [sp, 0xC]\n\
+ _0800EE34:\n\
+ movs r3, 0\n\
+ asrs r0, r7, 1\n\
+ adds r1, r7, 0\n\
+ movs r2, 0x1\n\
+ ands r1, r2\n\
+ str r1, [sp, 0x20]\n\
+ lsls r0, 8\n\
+ mov r8, r0\n\
+ mov r12, r5\n\
+ _0800EE46:\n\
+ lsls r1, r3, 5\n\
+ ldr r4, [sp, 0x18]\n\
+ adds r0, r5, r4\n\
+ adds r0, r1\n\
+ mov r1, r8\n\
+ adds r2, r0, r1\n\
+ mov r1, r12\n\
+ add r1, r8\n\
+ movs r6, 0xF\n\
+ _0800EE58:\n\
+ ldr r4, [sp, 0x20]\n\
+ cmp r4, 0\n\
+ bne _0800EE68\n\
+ strb r4, [r1]\n\
+ add r4, sp, 0x20\n\
+ ldrb r4, [r4]\n\
+ strb r4, [r2, 0x10]\n\
+ b _0800EE76\n\
+ _0800EE68:\n\
+ mov r0, r10\n\
+ strb r0, [r1, 0x10]\n\
+ movs r4, 0x80\n\
+ lsls r4, 1\n\
+ adds r4, r2, r4\n\
+ str r4, [sp, 0x1C]\n\
+ strb r0, [r4]\n\
+ _0800EE76:\n\
+ adds r2, 0x1\n\
+ adds r1, 0x1\n\
+ subs r6, 0x1\n\
+ cmp r6, 0\n\
+ bge _0800EE58\n\
+ movs r0, 0x20\n\
+ add r12, r0\n\
+ adds r3, 0x1\n\
+ cmp r3, 0x7\n\
+ ble _0800EE46\n\
+ adds r7, 0x1\n\
+ ldr r1, [sp, 0xC]\n\
+ cmp r7, r1\n\
+ blt _0800EE34\n\
+ _0800EE92:\n\
+ movs r7, 0\n\
+ movs r2, 0\n\
+ _0800EE96:\n\
+ movs r6, 0\n\
+ adds r4, r7, 0x1\n\
+ mov r8, r4\n\
+ lsls r4, r7, 5\n\
+ _0800EE9E:\n\
+ adds r0, r6, 0x1\n\
+ mov r10, r0\n\
+ lsls r1, r6, 8\n\
+ adds r0, r1, 0\n\
+ adds r0, 0xC0\n\
+ adds r0, r5, r0\n\
+ adds r0, r4\n\
+ adds r1, r5, r1\n\
+ adds r1, r4\n\
+ movs r3, 0x1F\n\
+ _0800EEB2:\n\
+ strb r2, [r1]\n\
+ strb r2, [r0]\n\
+ adds r0, 0x1\n\
+ adds r1, 0x1\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bge _0800EEB2\n\
+ mov r6, r10\n\
+ cmp r6, 0x7\n\
+ ble _0800EE9E\n\
+ mov r7, r8\n\
+ cmp r7, 0x1\n\
+ ble _0800EE96\n\
+ mov r1, r9\n\
+ cmp r1, 0x5\n\
+ bne _0800EED8\n\
+ movs r2, 0x90\n\
+ lsls r2, 1\n\
+ adds r5, r2\n\
+ _0800EED8:\n\
+ movs r7, 0\n\
+ cmp r7, r9\n\
+ bge _0800EF6E\n\
+ _0800EEDE:\n\
+ movs r3, 0\n\
+ adds r7, 0x1\n\
+ mov r8, r7\n\
+ cmp r3, r9\n\
+ bge _0800EF4E\n\
+ _0800EEE8:\n\
+ adds r3, 0x1\n\
+ mov r10, r3\n\
+ ldr r4, [sp, 0x4]\n\
+ adds r4, 0x20\n\
+ adds r7, r5, 0\n\
+ adds r7, 0x20\n\
+ movs r0, 0x12\n\
+ adds r0, r5\n\
+ mov r12, r0\n\
+ ldr r2, [sp, 0x4]\n\
+ adds r3, r5, 0\n\
+ movs r6, 0x3\n\
+ _0800EF00:\n\
+ ldrb r0, [r2]\n\
+ mov r1, r12\n\
+ strb r0, [r1]\n\
+ ldrb r0, [r2, 0x1]\n\
+ strb r0, [r1, 0x1]\n\
+ ldrb r0, [r2, 0x2]\n\
+ strb r0, [r1, 0x1E]\n\
+ ldrb r0, [r2, 0x3]\n\
+ strb r0, [r1, 0x1F]\n\
+ movs r0, 0x81\n\
+ lsls r0, 1\n\
+ adds r1, r3, r0\n\
+ ldrb r0, [r2, 0x10]\n\
+ strb r0, [r1]\n\
+ ldr r0, _0800EF58 @ =0x00000103\n\
+ adds r1, r3, r0\n\
+ ldrb r0, [r2, 0x11]\n\
+ strb r0, [r1]\n\
+ movs r0, 0x90\n\
+ lsls r0, 1\n\
+ adds r1, r3, r0\n\
+ ldrb r0, [r2, 0x12]\n\
+ strb r0, [r1]\n\
+ ldr r0, _0800EF5C @ =0x00000121\n\
+ adds r1, r3, r0\n\
+ ldrb r0, [r2, 0x13]\n\
+ strb r0, [r1]\n\
+ movs r1, 0x4\n\
+ add r12, r1\n\
+ adds r2, 0x4\n\
+ adds r3, 0x4\n\
+ subs r6, 0x1\n\
+ cmp r6, 0\n\
+ bge _0800EF00\n\
+ str r4, [sp, 0x4]\n\
+ adds r5, r7, 0\n\
+ mov r3, r10\n\
+ cmp r3, r9\n\
+ blt _0800EEE8\n\
+ _0800EF4E:\n\
+ mov r2, r9\n\
+ cmp r2, 0x7\n\
+ bne _0800EF60\n\
+ adds r5, 0x20\n\
+ b _0800EF68\n\
+ .align 2, 0\n\
+ _0800EF58: .4byte 0x00000103\n\
+ _0800EF5C: .4byte 0x00000121\n\
+ _0800EF60:\n\
+ mov r4, r9\n\
+ cmp r4, 0x5\n\
+ bne _0800EF68\n\
+ adds r5, 0x60\n\
+ _0800EF68:\n\
+ mov r7, r8\n\
+ cmp r7, r9\n\
+ blt _0800EEDE\n\
+ _0800EF6E:\n\
+ mov r0, r9\n\
+ cmp r0, 0x7\n\
+ bne _0800EF7C\n\
+ movs r1, 0x80\n\
+ lsls r1, 1\n\
+ adds r5, r1\n\
+ b _0800EF88\n\
+ _0800EF7C:\n\
+ mov r2, r9\n\
+ cmp r2, 0x5\n\
+ bne _0800EF88\n\
+ movs r4, 0xF0\n\
+ lsls r4, 1\n\
+ adds r5, r4\n\
+ _0800EF88:\n\
+ ldr r0, [sp, 0x14]\n\
+ ldr r1, [sp]\n\
+ cmp r0, r1\n\
+ bge _0800EF92\n\
+ b _0800EE16\n\
+ _0800EF92:\n\
+ b _0800F024\n\
+ _0800EF94:\n\
+ movs r6, 0\n\
+ ldr r2, [sp]\n\
+ cmp r6, r2\n\
+ bge _0800F024\n\
+ _0800EF9C:\n\
+ adds r6, 0x1\n\
+ mov r10, r6\n\
+ mov r4, r9\n\
+ cmp r4, 0x6\n\
+ bne _0800EFB4\n\
+ movs r0, 0\n\
+ movs r3, 0xFF\n\
+ _0800EFAA:\n\
+ strb r0, [r5]\n\
+ adds r5, 0x1\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bge _0800EFAA\n\
+ _0800EFB4:\n\
+ movs r7, 0\n\
+ cmp r7, r9\n\
+ bge _0800F008\n\
+ _0800EFBA:\n\
+ adds r7, 0x1\n\
+ mov r8, r7\n\
+ mov r1, r9\n\
+ lsls r0, r1, 5\n\
+ cmp r1, 0x6\n\
+ bne _0800EFD4\n\
+ movs r1, 0\n\
+ movs r3, 0x1F\n\
+ _0800EFCA:\n\
+ strb r1, [r5]\n\
+ adds r5, 0x1\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bge _0800EFCA\n\
+ _0800EFD4:\n\
+ adds r1, r0, 0\n\
+ cmp r1, 0\n\
+ ble _0800EFEE\n\
+ adds r3, r1, 0\n\
+ _0800EFDC:\n\
+ ldr r2, [sp, 0x4]\n\
+ ldrb r0, [r2]\n\
+ strb r0, [r5]\n\
+ adds r2, 0x1\n\
+ str r2, [sp, 0x4]\n\
+ adds r5, 0x1\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bne _0800EFDC\n\
+ _0800EFEE:\n\
+ mov r4, r9\n\
+ cmp r4, 0x6\n\
+ bne _0800F002\n\
+ movs r0, 0\n\
+ movs r3, 0x1F\n\
+ _0800EFF8:\n\
+ strb r0, [r5]\n\
+ adds r5, 0x1\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bge _0800EFF8\n\
+ _0800F002:\n\
+ mov r7, r8\n\
+ cmp r7, r9\n\
+ blt _0800EFBA\n\
+ _0800F008:\n\
+ mov r0, r9\n\
+ cmp r0, 0x6\n\
+ bne _0800F01C\n\
+ movs r0, 0\n\
+ movs r3, 0xFF\n\
+ _0800F012:\n\
+ strb r0, [r5]\n\
+ adds r5, 0x1\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bge _0800F012\n\
+ _0800F01C:\n\
+ mov r6, r10\n\
+ ldr r1, [sp]\n\
+ cmp r6, r1\n\
+ blt _0800EF9C\n\
+ _0800F024:\n\
+ add sp, 0x24\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ ");
+}
+#endif
+
+bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet* src)
+{
+ struct SpriteSheet dest;
+ void* buffer;
+
+ buffer = AllocZeroed(*((u32*)src->data) >> 8);
+ if (!buffer)
+ return TRUE;
+ LZ77UnCompWram(src->data, buffer);
+ dest.data = buffer;
+ dest.size = src->size;
+ dest.tag = src->tag;
+ LoadSpriteSheet(&dest);
+ Free(buffer);
+ return FALSE;
+}
+
+bool8 LoadCompressedSpritePaletteUsingHeap(const struct CompressedSpritePalette *src)
+{
+ struct SpritePalette dest;
+ void* buffer;
+
+ buffer = AllocZeroed(*((u32*)src->data) >> 8);
+ if (!buffer)
+ return TRUE;
+ LZ77UnCompWram(src->data, buffer);
+ dest.data = buffer;
+ dest.tag = src->tag;
+ LoadSpritePalette(&dest);
+ Free(buffer);
+ return FALSE;
+}
+
+u32 GetDecompressedDataSize(const u8 *ptr)
+{
+ u32 ptr32[1];
+ u8 *ptr8 = (u8 *)ptr32;
+
+ ptr8[0] = ptr[1];
+ ptr8[1] = ptr[2];
+ ptr8[2] = ptr[3];
+ ptr8[3] = 0;
+ return ptr32[0];
+}
+
+void DecompressPicFromTable_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void* buffer, s32 species)
+{
+ if (species > NUM_SPECIES)
+ LZ77UnCompWram(gMonFrontPicTable[0].data, buffer);
+ else
+ LZ77UnCompWram(src->data, buffer);
+}
+
+void HandleLoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality)
+{
+ bool8 isFrontPic;
+
+ if (src == &gMonFrontPicTable[species])
+ isFrontPic = TRUE; // frontPic
+ else
+ isFrontPic = FALSE; // backPic
+ LoadSpecialPokePic_DontHandleDeoxys(src, dest, species, personality, isFrontPic);
+}
+
+void LoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic)
+{
+ if (species == SPECIES_UNOWN)
+ {
+ u16 i = (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 3)) % 0x1C;
+
+ // The other Unowns are separate from Unown A.
+ if (i == 0)
+ i = SPECIES_UNOWN;
+ else
+ i += SPECIES_UNOWN_B - 1;
+ if (!isFrontPic)
+ LZ77UnCompWram(gMonBackPicTable[i].data, dest);
+ else
+ LZ77UnCompWram(gMonFrontPicTable[i].data, dest);
+ }
+ else if (species > NUM_SPECIES) // is species unknown? draw the ? icon
+ {
+ LZ77UnCompWram(gMonFrontPicTable[0].data, dest);
+ }
+ else
+ {
+ LZ77UnCompWram(src->data, dest);
+ }
+ DrawSpindaSpots(species, personality, dest, isFrontPic);
+}
diff --git a/src/diploma.c b/src/diploma.c
new file mode 100644
index 000000000..517ee8aa0
--- /dev/null
+++ b/src/diploma.c
@@ -0,0 +1,285 @@
+#include "global.h"
+#include "bg.h"
+#include "constants/fanfares.h"
+#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"
+#include "new_menu_helpers.h"
+#include "overworld.h"
+#include "palette.h"
+#include "pokedex.h"
+#include "scanline_effect.h"
+#include "sound.h"
+#include "sprite.h"
+#include "strings.h"
+#include "task.h"
+#include "text.h"
+#include "window.h"
+#include "diploma.h"
+
+struct Diploma
+{
+ u8 state;
+ u8 gfxStep;
+ u8 callbackStep;
+ u16 tilemapBuffer[0x800];
+};
+
+static EWRAM_DATA struct Diploma *gDiploma = NULL;
+
+static void DiplomaBgInit(void);
+static void DiplomaPrintText(void);
+static u8 DiplomaLoadGfx(void);
+static void DiplomaVblankHandler(void);
+static void CB2_DiplomaInit(void);
+static void Task_WaitForExit(u8);
+static void Task_DiplomaInit(u8);
+static void Task_DiplomaReturnToOverworld(u8);
+
+static const u32 gUnknown_84147C0[] = INCBIN_U32("graphics/diploma/unk_84147C0.4bpp.lz");
+static const u32 gUnknown_84154E8[] = INCBIN_U32("graphics/diploma/unk_84154E8.bin.lz");
+static const u16 gUnknown_8415954[] = INCBIN_U16("graphics/diploma/unk_8415954.gbapal");
+
+static const u8 gUnknown_8415994[] = _("{HIGHLIGHT TRANSPARENT}プレイヤー");
+static const u8 gUnknown_841599D[] = _("{HIGHLIGHT TRANSPARENT}さま");
+static const u8 gUnknown_84159A3[] = _("{HIGHLIGHT TRANSPARENT}ホウエン");
+static const u8 gUnknown_84159AB[] = _("{HIGHLIGHT TRANSPARENT}ぜんこく");
+static const u8 gUnknown_84159B3[] = _("{HIGHLIGHT TRANSPARENT}     ポケモンずかんを\nみごと かんせい させた\nいだいなこうせきを たたえ\nここに しょうめい します");
+static const u8 gUnknown_84159ED[] = _("{COLOR RED}{HIGHLIGHT TRANSPARENT}ゲームフリーク");
+static const u8 gUnknown_84159FB[] = _("{COLOR RED}{HIGHLIGHT TRANSPARENT}");
+
+static const ALIGNED(4) struct TextColor gUnknown_8415A04 = {0, 2, 3};
+
+static const struct BgTemplate gUnknown_8415A08[] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 1,
+ }, {
+ .bg = 1,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 29,
+ .screenSize = 1,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0,
+ }
+};
+
+static const struct WindowTemplate gUnknown_8415A10[] = {
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 2,
+ .width = 29,
+ .height = 16,
+ .paletteNum = 15,
+ .baseBlock = 0x000
+ }, DUMMY_WIN_TEMPLATE
+};
+
+static void VCBC_DiplomaOam(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void CB2_ShowDiploma(void)
+{
+ gDiploma = AllocZeroed(sizeof(*gDiploma));
+ gDiploma->state = 0;
+ gDiploma->gfxStep = 0;
+ gDiploma->callbackStep = 0;
+ DiplomaBgInit();
+ CreateTask(Task_DiplomaInit, 0);
+ SetMainCallback2(CB2_DiplomaInit);
+}
+
+static void CB2_DiplomaInit(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void Task_DiplomaInit(u8 taskId)
+{
+ switch (gDiploma->callbackStep)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ break;
+ case 1:
+ DiplomaVblankHandler();
+ break;
+ case 2:
+ if (!DiplomaLoadGfx())
+ {
+ return;
+ }
+ break;
+ case 3:
+ CopyToBgTilemapBuffer(1, gUnknown_84154E8, 0, 0);
+ break;
+ case 4:
+ if (HasAllKantoMons())
+ {
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0x80 << 1);
+ }
+ else
+ {
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ }
+ break;
+ case 5:
+ DiplomaPrintText();
+ break;
+ case 6:
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(1);
+ break;
+ case 7:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ break;
+ case 8:
+ SetVBlankCallback(VCBC_DiplomaOam);
+ break;
+ default:
+ if (gPaletteFade.active)
+ {
+ break;
+ }
+ PlayFanfareByFanfareNum(FANFARE_05);
+ gTasks[taskId].func = Task_WaitForExit;
+ }
+ gDiploma->callbackStep++;
+}
+
+static void Task_WaitForExit(u8 taskId)
+{
+ switch (gDiploma->state)
+ {
+ case 0:
+ if (WaitFanfare(0))
+ {
+ gDiploma->state++;
+ }
+ break;
+ case 1:
+ if (JOY_NEW(A_BUTTON))
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gDiploma->state++;
+ }
+ break;
+ case 2:
+ Task_DiplomaReturnToOverworld(taskId);
+ break;
+ }
+}
+
+static void Task_DiplomaReturnToOverworld(u8 taskId)
+{
+ if (gPaletteFade.active)
+ return;
+ DestroyTask(taskId);
+ FreeAllWindowBuffers();
+ FREE_AND_SET_NULL(gDiploma);
+ SetMainCallback2(CB2_Overworld);
+}
+
+static void DiplomaBgInit(void)
+{
+ ResetSpriteData();
+ ResetPaletteFade();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ ScanlineEffect_Stop();
+}
+
+static void DiplomaVblankHandler(void)
+{
+ void *vram = (void *)VRAM;
+ DmaClearLarge16(3, vram, VRAM_SIZE, 0x1000);
+ DmaClear32(3, (void *)OAM, OAM_SIZE);
+ DmaClear16(3, (void *)PLTT, PLTT_SIZE);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_8415A08, 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);
+ InitWindows(gUnknown_8415A10);
+ DeactivateAllTextPrinters();
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ SetBgTilemapBuffer(1, gDiploma->tilemapBuffer);
+ ShowBg(0);
+ ShowBg(1);
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20);
+}
+
+static u8 DiplomaLoadGfx(void)
+{
+ switch (gDiploma->gfxStep)
+ {
+ case 0:
+ ResetTempTileDataBuffers();
+ break;
+ case 1:
+ DecompressAndCopyTileDataToVram(1, gUnknown_84147C0, 0, 0, 0);
+ break;
+ case 2:
+ if (!(FreeTempTileDataBuffersIfPossible() == 1))
+ {
+ break;
+ }
+ return 0;
+ case 3:
+ LoadPalette(gUnknown_8415954, 0, 0x40);
+ default:
+ return 1;
+ }
+ gDiploma->gfxStep++;
+ return 0;
+}
+
+static void DiplomaPrintText(void)
+{
+ u8 arr[160];
+ u32 width;
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName);
+ if (HasAllKantoMons())
+ {
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_841B68F);
+ }
+ else
+ {
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_841B698);
+ }
+ FillWindowPixelBuffer(0, 0);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(arr, gUnknown_841B60E);
+ width = GetStringWidth(2, arr, -1);
+ AddTextPrinterParameterized3(0, 2, 0x78 - (width / 2), 4, &gUnknown_8415A04, -1, arr);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(arr, gUnknown_841B619);
+ width = GetStringWidth(2, arr, -1);
+ AddTextPrinterParameterized3(0, 0x2, 0x78 - (width / 2), 0x1E, &gUnknown_8415A04, -1, arr);
+ AddTextPrinterParameterized3(0, 0x2, 0x78, 0x69, &gUnknown_8415A04, 0, gUnknown_841B684);
+ PutWindowTilemap(0);
+}
diff --git a/src/dma3_manager.c b/src/dma3_manager.c
index 10049a566..ec2cb932f 100644
--- a/src/dma3_manager.c
+++ b/src/dma3_manager.c
@@ -1,6 +1,13 @@
#include "global.h"
#include "dma3.h"
+#define MAX_DMA_REQUESTS 128
+
+#define DMA_REQUEST_COPY32 1
+#define DMA_REQUEST_FILL32 2
+#define DMA_REQUEST_COPY16 3
+#define DMA_REQUEST_FILL16 4
+
static /*IWRAM_DATA*/ struct {
/* 0x00 */ const u8 *src;
/* 0x04 */ u8 *dest;
@@ -9,7 +16,7 @@ static /*IWRAM_DATA*/ struct {
/* 0x0C */ u32 value;
} gDma3Requests[128];
-static bool8 gDma3ManagerLocked;
+static volatile bool8 gDma3ManagerLocked;
static u8 gDma3RequestCursor;
void ClearDma3Requests(void)
@@ -29,78 +36,50 @@ void ClearDma3Requests(void)
gDma3ManagerLocked = FALSE;
}
-#ifdef NONMATCHING
void ProcessDma3Requests(void)
{
- // NOTE: the fillerA member of the DMA struct is actually u32 value;
- u16 total_size;
+ u16 bytesTransferred;
if (gDma3ManagerLocked)
return;
- total_size = 0;
+ bytesTransferred = 0;
// as long as there are DMA requests to process (unless size or vblank is an issue), do not exit
- while (gDma3Requests[gDma3RequestCursor].size)
+ while (gDma3Requests[gDma3RequestCursor].size != 0)
{
- total_size += gDma3Requests[gDma3RequestCursor].size;
+ bytesTransferred += gDma3Requests[gDma3RequestCursor].size;
- if (total_size > 0xA000)
- return; // don't do too much at once
-
- if (REG_VCOUNT > 224)
- return;// we're about to leave vblank, stop
+ if (bytesTransferred > 40 * 1024)
+ return; // don't transfer more than 40 KiB
+ if (*(u8 *)REG_ADDR_VCOUNT > 224)
+ return; // we're about to leave vblank, stop
switch (gDma3Requests[gDma3RequestCursor].mode)
{
- case 1: // regular 32-bit copy
- // _08000C8C
- if(gDma3Requests[gDma3RequestCursor].size <= 0x1000)
- {
- DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
- break;
- }
- while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
- {
- DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
- gDma3Requests[gDma3RequestCursor].src += 0x1000;
- gDma3Requests[gDma3RequestCursor].dest += 0x1000;
- gDma3Requests[gDma3RequestCursor].size -= 0x1000;
- }
- DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
+ case DMA_REQUEST_COPY32: // regular 32-bit copy
+ Dma3CopyLarge32_(gDma3Requests[gDma3RequestCursor].src,
+ gDma3Requests[gDma3RequestCursor].dest,
+ gDma3Requests[gDma3RequestCursor].size);
break;
- case 2: // repeat a single 32-bit value across RAM
- // _08000CD0
- while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
- {
- DmaFill32(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
- gDma3Requests[gDma3RequestCursor].dest += 0x1000;
- gDma3Requests[gDma3RequestCursor].size -= 0x1000;
- }
- DmaFill32(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
+ case DMA_REQUEST_FILL32: // repeat a single 32-bit value across RAM
+ Dma3FillLarge32_(gDma3Requests[gDma3RequestCursor].value,
+ gDma3Requests[gDma3RequestCursor].dest,
+ gDma3Requests[gDma3RequestCursor].size);
break;
- case 3: // regular 16-bit copy
- // _08000D3C
- while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
- {
- DmaCopy16(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
- gDma3Requests[gDma3RequestCursor].src += 0x1000;
- gDma3Requests[gDma3RequestCursor].dest += 0x1000;
- gDma3Requests[gDma3RequestCursor].size -= 0x1000;
- }
- DmaCopy16(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
+ case DMA_REQUEST_COPY16: // regular 16-bit copy
+ Dma3CopyLarge16_(gDma3Requests[gDma3RequestCursor].src,
+ gDma3Requests[gDma3RequestCursor].dest,
+ gDma3Requests[gDma3RequestCursor].size);
break;
- case 4: // repeat a single 16-bit value across RAM
- // _08000D88
- while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
- {
- DmaFill16(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
- gDma3Requests[gDma3RequestCursor].dest += 0x1000;
- gDma3Requests[gDma3RequestCursor].size -= 0x1000;
- }
- DmaFill16(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
+ case DMA_REQUEST_FILL16: // repeat a single 16-bit value across RAM
+ Dma3FillLarge16_(gDma3Requests[gDma3RequestCursor].value,
+ gDma3Requests[gDma3RequestCursor].dest,
+ gDma3Requests[gDma3RequestCursor].size);
break;
}
+
+ // Free the request
gDma3Requests[gDma3RequestCursor].src = NULL;
gDma3Requests[gDma3RequestCursor].dest = NULL;
gDma3Requests[gDma3RequestCursor].size = 0;
@@ -108,328 +87,12 @@ void ProcessDma3Requests(void)
gDma3Requests[gDma3RequestCursor].value = 0;
gDma3RequestCursor++;
- if (gDma3RequestCursor >= 128) // loop back to the first DMA request
+ if (gDma3RequestCursor >= MAX_DMA_REQUESTS) // loop back to the first DMA request
gDma3RequestCursor = 0;
}
}
-#else
-__attribute__((naked))
-void ProcessDma3Requests(void)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- sub sp, 0xC\n\
- ldr r0, =gDma3ManagerLocked\n\
- ldrb r0, [r0]\n\
- cmp r0, 0\n\
- beq _08000C06\n\
- b _08000E46\n\
-_08000C06:\n\
- movs r0, 0\n\
- str r0, [sp, 0x8]\n\
- ldr r1, =gDma3Requests\n\
- ldr r2, =gDma3RequestCursor\n\
- ldrb r0, [r2]\n\
- lsls r0, 4\n\
- adds r0, r1\n\
- ldrh r0, [r0, 0x8]\n\
- mov r12, r2\n\
- cmp r0, 0\n\
- bne _08000C1E\n\
- b _08000E46\n\
-_08000C1E:\n\
- mov r8, r1\n\
- adds r1, 0x4\n\
- mov r10, r1\n\
- movs r6, 0x80\n\
- lsls r6, 5\n\
- ldr r7, =0x040000D4 @REG_DMA3\n\
- movs r2, 0\n\
- mov r9, r2\n\
-_08000C2E:\n\
- mov r3, r12 @ gDma3RequestCursor\n\
- ldrb r0, [r3]\n\
- lsls r5, r0, 4\n\
- mov r0, r8 @ gDma3Requests\n\
- adds r1, r5, r0 @ gDma3Requests[gDma3RequestCursor]\n\
- ldrh r0, [r1, 0x8] @ gDma3Requests[gDma3RequestCursor].size\n\
- ldr r2, [sp, 0x8]\n\
- adds r0, r2, r0\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- str r0, [sp, 0x8]\n\
- movs r0, 0xA0\n\
- lsls r0, 8\n\
- ldr r3, [sp, 0x8]\n\
- cmp r3, r0\n\
- bls _08000C50\n\
- b _08000E46\n\
-_08000C50:\n\
- ldr r0, =0x04000006 @REG_VCOUNT\n\
- ldrb r0, [r0]\n\
- cmp r0, 0xE0\n\
- bls _08000C5A\n\
- b _08000E46\n\
-_08000C5A:\n\
- ldrh r0, [r1, 0xA]\n\
- cmp r0, 0x2\n\
- beq _08000CD0\n\
- cmp r0, 0x2\n\
- bgt _08000C80\n\
- cmp r0, 0x1\n\
- beq _08000C8C\n\
- b _08000DF0\n\
- .pool\n\
-_08000C80:\n\
- cmp r0, 0x3\n\
- beq _08000D3C\n\
- cmp r0, 0x4\n\
- bne _08000C8A\n\
- b _08000D88\n\
-_08000C8A:\n\
- b _08000DF0\n\
-_08000C8C:\n\
- ldr r3, [r1]\n\
- mov r2, r10\n\
- adds r0, r5, r2\n\
- ldr r2, [r0]\n\
- ldrh r1, [r1, 0x8]\n\
- cmp r1, r6\n\
- bhi _08000CA6\n\
- str r3, [r7]\n\
- str r2, [r7, 0x4]\n\
- lsrs r0, r1, 2\n\
- movs r1, 0x84\n\
- lsls r1, 24\n\
- b _08000DAA\n\
-_08000CA6:\n\
- ldr r4, =0x040000D4 @REG_DMA3\n\
- str r3, [r4]\n\
- str r2, [r4, 0x4]\n\
- ldr r0, =0x84000400\n\
- str r0, [r4, 0x8]\n\
- ldr r0, [r4, 0x8]\n\
- adds r3, r6\n\
- adds r2, r6\n\
- subs r1, r6\n\
- cmp r1, r6\n\
- bhi _08000CA6\n\
- str r3, [r4]\n\
- str r2, [r4, 0x4]\n\
- lsrs r0, r1, 2\n\
- movs r1, 0x84\n\
- lsls r1, 24\n\
- b _08000D76\n\
- .pool\n\
-_08000CD0:\n\
- mov r3, r10\n\
- adds r0, r5, r3\n\
- ldr r4, [r0]\n\
- ldrh r1, [r1, 0x8]\n\
- cmp r1, r6\n\
- bhi _08000CF4\n\
- mov r0, r8\n\
- adds r0, 0xC\n\
- adds r0, r5, r0\n\
- ldr r0, [r0]\n\
- str r0, [sp]\n\
- mov r5, sp\n\
- str r5, [r7]\n\
- str r4, [r7, 0x4]\n\
- lsrs r0, r1, 2\n\
- movs r1, 0x85\n\
- lsls r1, 24\n\
- b _08000DAA\n\
-_08000CF4:\n\
- mov r2, r12\n\
- ldrb r0, [r2]\n\
- lsls r0, 4\n\
- mov r5, r8\n\
- adds r5, 0xC\n\
- adds r0, r5\n\
- ldr r0, [r0]\n\
- str r0, [sp]\n\
- ldr r3, =0x040000D4 @REG_DMA3\n\
- mov r0, sp\n\
- str r0, [r3]\n\
- str r4, [r3, 0x4]\n\
- ldr r0, =0x85000400\n\
- str r0, [r3, 0x8]\n\
- ldr r0, [r3, 0x8]\n\
- adds r4, r6\n\
- subs r1, r6\n\
- cmp r1, r6\n\
- bhi _08000CF4\n\
- ldrb r0, [r2]\n\
- lsls r0, 4\n\
- adds r0, r5\n\
- ldr r0, [r0]\n\
- str r0, [sp]\n\
- mov r2, sp\n\
- str r2, [r3]\n\
- str r4, [r3, 0x4]\n\
- lsrs r0, r1, 2\n\
- movs r1, 0x85\n\
- lsls r1, 24\n\
- b _08000DEA\n\
- .pool\n\
-_08000D3C:\n\
- ldr r3, [r1]\n\
- mov r2, r10\n\
- adds r0, r5, r2\n\
- ldr r2, [r0]\n\
- ldrh r1, [r1, 0x8]\n\
- cmp r1, r6\n\
- bhi _08000D56\n\
- str r3, [r7]\n\
- str r2, [r7, 0x4]\n\
- lsrs r0, r1, 1\n\
- movs r1, 0x80\n\
- lsls r1, 24\n\
- b _08000DAA\n\
-_08000D56:\n\
- ldr r4, =0x040000D4 @REG_DMA3\n\
- str r3, [r4]\n\
- str r2, [r4, 0x4]\n\
- ldr r0, =0x80000800\n\
- str r0, [r4, 0x8]\n\
- ldr r0, [r4, 0x8]\n\
- adds r3, r6\n\
- adds r2, r6\n\
- subs r1, r6\n\
- cmp r1, r6\n\
- bhi _08000D56\n\
- str r3, [r4]\n\
- str r2, [r4, 0x4]\n\
- lsrs r0, r1, 1\n\
- movs r1, 0x80\n\
- lsls r1, 24\n\
-_08000D76:\n\
- orrs r0, r1\n\
- str r0, [r4, 0x8]\n\
- ldr r0, [r4, 0x8]\n\
- b _08000DF0\n\
- .pool\n\
-_08000D88:\n\
- mov r3, r10\n\
- adds r0, r5, r3\n\
- ldr r2, [r0]\n\
- ldrh r4, [r1, 0x8]\n\
- add r1, sp, 0x4\n\
- cmp r4, r6\n\
- bhi _08000DB2\n\
- mov r0, r8\n\
- adds r0, 0xC\n\
- adds r0, r5, r0\n\
- ldr r0, [r0]\n\
- strh r0, [r1]\n\
- str r1, [r7]\n\
- str r2, [r7, 0x4]\n\
- lsrs r0, r4, 1\n\
- movs r1, 0x81\n\
- lsls r1, 24\n\
-_08000DAA:\n\
- orrs r0, r1\n\
- str r0, [r7, 0x8]\n\
- ldr r0, [r7, 0x8]\n\
- b _08000DF0\n\
-_08000DB2:\n\
- mov r5, r12\n\
- ldrb r0, [r5]\n\
- lsls r0, 4\n\
- ldr r3, =gDma3Requests + 0x0C\n\
- adds r0, r3\n\
- ldr r0, [r0]\n\
- strh r0, [r1]\n\
- ldr r3, =0x040000D4 @REG_DMA3\n\
- str r1, [r3]\n\
- str r2, [r3, 0x4]\n\
- ldr r0, =0x81000800\n\
- str r0, [r3, 0x8]\n\
- ldr r0, [r3, 0x8]\n\
- adds r2, r6\n\
- subs r4, r6\n\
- cmp r4, r6\n\
- bhi _08000DB2\n\
- ldrb r0, [r5]\n\
- lsls r0, 4\n\
- ldr r5, =gDma3Requests + 0x0C\n\
- adds r0, r5\n\
- ldr r0, [r0]\n\
- strh r0, [r1]\n\
- str r1, [r3]\n\
- str r2, [r3, 0x4]\n\
- lsrs r0, r4, 1\n\
- movs r1, 0x81\n\
- lsls r1, 24\n\
-_08000DEA:\n\
- orrs r0, r1\n\
- str r0, [r3, 0x8]\n\
- ldr r0, [r3, 0x8]\n\
-_08000DF0:\n\
- ldr r1, =gDma3Requests\n\
- mov r3, r12\n\
- ldrb r0, [r3]\n\
- lsls r0, 4\n\
- adds r0, r1\n\
- mov r2, r9\n\
- str r2, [r0]\n\
- ldrb r0, [r3]\n\
- lsls r0, 4\n\
- add r0, r10\n\
- str r2, [r0]\n\
- ldrb r0, [r3]\n\
- lsls r0, 4\n\
- adds r0, r1\n\
- movs r4, 0\n\
- strh r2, [r0, 0x8]\n\
- ldrb r0, [r3]\n\
- lsls r0, 4\n\
- adds r0, r1\n\
- mov r5, r9\n\
- strh r5, [r0, 0xA]\n\
- ldrb r0, [r3]\n\
- lsls r0, 4\n\
- adds r1, 0xC\n\
- adds r0, r1\n\
- mov r1, r9\n\
- str r1, [r0]\n\
- ldrb r0, [r3]\n\
- adds r0, 0x1\n\
- strb r0, [r3]\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bge _08000E34\n\
- strb r4, [r3]\n\
-_08000E34:\n\
- mov r2, r12\n\
- ldrb r0, [r2]\n\
- lsls r0, 4\n\
- ldr r3, =gDma3Requests\n\
- adds r0, r3\n\
- ldrh r0, [r0, 0x8]\n\
- cmp r0, 0\n\
- beq _08000E46\n\
- b _08000C2E\n\
-_08000E46:\n\
- add sp, 0xC\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .pool\n\
- .syntax divided");
-}
-#endif
-int RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode)
+s16 RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode)
{
int cursor;
int var = 0;
@@ -466,7 +129,7 @@ int RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode)
return -1;
}
-int RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode)
+s16 RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode)
{
int cursor;
int var = 0;
@@ -504,7 +167,7 @@ int RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode)
return -1;
}
-int CheckForSpaceForDma3Request(s16 index)
+s16 CheckForSpaceForDma3Request(s16 index)
{
int current = 0;
diff --git a/src/dynamic_placeholder_text_util.c b/src/dynamic_placeholder_text_util.c
new file mode 100644
index 000000000..6909fea30
--- /dev/null
+++ b/src/dynamic_placeholder_text_util.c
@@ -0,0 +1,70 @@
+#include "global.h"
+#include "text.h"
+#include "dynamic_placeholder_text_util.h"
+#include "string_util.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,
+};
+
+void DynamicPlaceholderTextUtil_Reset(void)
+{
+ const u8 **ptr = sStringPointers;
+ u8 *fillval = NULL;
+ const u8 **ptr2 = ptr + (NELEMS(sStringPointers) - 1);
+
+ do
+ {
+ *ptr2-- = fillval;
+ }
+ while ((intptr_t)ptr2 >= (intptr_t)ptr);
+}
+
+void DynamicPlaceholderTextUtil_SetPlaceholderPtr(u8 idx, const u8 *ptr)
+{
+ if (idx < NELEMS(sStringPointers))
+ sStringPointers[idx] = ptr;
+}
+
+u8 *DynamicPlaceholderTextUtil_ExpandPlaceholders(u8 *dest, const u8 *src)
+{
+ while (*src != EOS)
+ {
+ if (*src != CHAR_SPECIAL_F7)
+ {
+ *dest++ = *src++;
+ }
+ else
+ {
+ src++;
+ if (sStringPointers[*src] != NULL)
+ dest = StringCopy(dest, sStringPointers[*src]);
+ src++;
+ }
+ }
+ *dest = EOS;
+ return dest;
+}
+
+const u8 *DynamicPlaceholderTextUtil_GetPlaceholderPtr(u8 idx)
+{
+ return sStringPointers[idx];
+}
+
+u8 GetColorFromTextColorTable(u16 graphicId)
+{
+ u32 test = graphicId >> 1;
+ u32 shift = (graphicId & 1) << 2;
+
+ if (test > 0x4B)
+ return 3;
+ else
+ return (sTextColorTable[graphicId >> 1] >> shift) & 0xF;
+}
diff --git a/src/egg_hatch.c b/src/egg_hatch.c
deleted file mode 100644
index d8e1a4d55..000000000
--- a/src/egg_hatch.c
+++ /dev/null
@@ -1,878 +0,0 @@
-#include "global.h"
-#include "pokemon.h"
-#include "egg_hatch.h"
-#include "pokedex.h"
-#include "constants/items.h"
-#include "script.h"
-#include "decompress.h"
-#include "task.h"
-#include "palette.h"
-#include "main.h"
-#include "event_data.h"
-#include "sound.h"
-#include "constants/songs.h"
-#include "text.h"
-#include "text_window.h"
-#include "string_util.h"
-#include "menu.h"
-#include "trig.h"
-#include "random.h"
-#include "malloc.h"
-#include "dma3.h"
-#include "gpu_regs.h"
-#include "bg.h"
-#include "m4a.h"
-#include "window.h"
-#include "graphics.h"
-#include "constants/abilities.h"
-#include "constants/species.h"
-#include "daycare.h"
-#include "overworld.h"
-#include "scanline_effect.h"
-#include "field_weather.h"
-#include "international_string_util.h"
-#include "naming_screen.h"
-#include "pokemon_storage_system.h"
-#include "field_screen_effect.h"
-#include "battle.h" // to get rid of later
-#include "help_system.h"
-#include "field_fadetransition.h"
-#include "new_menu_helpers.h"
-
-struct EggHatchData
-{
- u8 eggSpriteID;
- u8 pokeSpriteID;
- u8 CB2_state;
- u8 CB2_PalCounter;
- u8 eggPartyID;
- u8 unused_5;
- u8 unused_6;
- u8 eggShardVelocityID;
- u8 windowId;
- u8 unused_9;
- u8 unused_A;
- u16 species;
- struct TextColor textColor;
-};
-
-extern const u32 gUnknown_08331F60[]; // tilemap gameboy circle
-extern const u8 gText_HatchedFromEgg[];
-extern const u8 gText_NickHatchPrompt[];
-
-static void Task_EggHatch(u8 taskID);
-static void CB2_EggHatch_0(void);
-static void CB2_EggHatch_1(void);
-static void SpriteCB_Egg_0(struct Sprite* sprite);
-static void SpriteCB_Egg_1(struct Sprite* sprite);
-static void SpriteCB_Egg_2(struct Sprite* sprite);
-static void SpriteCB_Egg_3(struct Sprite* sprite);
-static void SpriteCB_Egg_4(struct Sprite* sprite);
-static void SpriteCB_Egg_5(struct Sprite* sprite);
-static void SpriteCB_EggShard(struct Sprite* sprite);
-static void EggHatchPrintMessage(u8 windowId, u8* string, u8 x, u8 y, u8 speed);
-static void CreateRandomEggShardSprite(void);
-static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex);
-
-// IWRAM bss
-static IWRAM_DATA struct EggHatchData *sEggHatchData;
-
-// rom data
-static const u16 sEggPalette[] = INCBIN_U16("graphics/pokemon/palettes/egg_palette.gbapal");
-static const u8 sEggHatchTiles[] = INCBIN_U8("graphics/misc/egg_hatch.4bpp");
-static const u8 sEggShardTiles[] = INCBIN_U8("graphics/misc/egg_shard.4bpp");
-
-static const struct OamData sOamData_EggHatch =
- {
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = SPRITE_SHAPE(32x32),
- .x = 0,
- .matrixNum = 0,
- .size = SPRITE_SIZE(32x32),
- .tileNum = 0,
- .priority = 1,
- .paletteNum = 0,
- .affineParam = 0,
- };
-
-static const union AnimCmd sSpriteAnim_EggHatch0[] =
- {
- ANIMCMD_FRAME(0, 5),
- ANIMCMD_END
- };
-
-static const union AnimCmd sSpriteAnim_EggHatch1[] =
- {
- ANIMCMD_FRAME(16, 5),
- ANIMCMD_END
- };
-
-static const union AnimCmd sSpriteAnim_EggHatch2[] =
- {
- ANIMCMD_FRAME(32, 5),
- ANIMCMD_END
- };
-
-static const union AnimCmd sSpriteAnim_EggHatch3[] =
- {
- ANIMCMD_FRAME(48, 5),
- ANIMCMD_END
- };
-
-static const union AnimCmd *const sSpriteAnimTable_EggHatch[] =
- {
- sSpriteAnim_EggHatch0,
- sSpriteAnim_EggHatch1,
- sSpriteAnim_EggHatch2,
- sSpriteAnim_EggHatch3,
- };
-
-static const struct SpriteSheet sEggHatch_Sheet =
- {
- .data = sEggHatchTiles,
- .size = 2048,
- .tag = 12345,
- };
-
-static const struct SpriteSheet sEggShards_Sheet =
- {
- .data = sEggShardTiles,
- .size = 128,
- .tag = 23456,
- };
-
-static const struct SpritePalette sEgg_SpritePalette =
- {
- .data = sEggPalette,
- .tag = 54321
- };
-
-static const struct SpriteTemplate sSpriteTemplate_EggHatch =
- {
- .tileTag = 12345,
- .paletteTag = 54321,
- .oam = &sOamData_EggHatch,
- .anims = sSpriteAnimTable_EggHatch,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy
- };
-
-static const struct OamData sOamData_EggShard =
- {
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = SPRITE_SHAPE(8x8),
- .x = 0,
- .matrixNum = 0,
- .size = SPRITE_SIZE(8x8),
- .tileNum = 0,
- .priority = 2,
- .paletteNum = 0,
- .affineParam = 0,
- };
-
-static const union AnimCmd sSpriteAnim_EggShard0[] =
- {
- ANIMCMD_FRAME(0, 5),
- ANIMCMD_END
- };
-
-static const union AnimCmd sSpriteAnim_EggShard1[] =
- {
- ANIMCMD_FRAME(1, 5),
- ANIMCMD_END
- };
-
-static const union AnimCmd sSpriteAnim_EggShard2[] =
- {
- ANIMCMD_FRAME(2, 5),
- ANIMCMD_END
- };
-
-static const union AnimCmd sSpriteAnim_EggShard3[] =
- {
- ANIMCMD_FRAME(3, 5),
- ANIMCMD_END
- };
-
-static const union AnimCmd *const sSpriteAnimTable_EggShard[] =
- {
- sSpriteAnim_EggShard0,
- sSpriteAnim_EggShard1,
- sSpriteAnim_EggShard2,
- sSpriteAnim_EggShard3,
- };
-
-static const struct SpriteTemplate sSpriteTemplate_EggShard =
- {
- .tileTag = 23456,
- .paletteTag = 54321,
- .oam = &sOamData_EggShard,
- .anims = sSpriteAnimTable_EggShard,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCB_EggShard
- };
-
-static const struct BgTemplate sBgTemplates_EggHatch[2] =
- {
- {
- .bg = 0,
- .charBaseIndex = 2,
- .mapBaseIndex = 24,
- .screenSize = 3,
- .paletteMode = 0,
- .priority = 0,
- .baseTile = 0
- },
-
- {
- .bg = 1,
- .charBaseIndex = 0,
- .mapBaseIndex = 8,
- .screenSize = 1,
- .paletteMode = 0,
- .priority = 2,
- .baseTile = 0
- },
- };
-
-static const struct WindowTemplate sWinTemplates_EggHatch[2] =
- {
- {
- .bg = 0,
- .tilemapLeft = 2,
- .tilemapTop = 15,
- .width = 26,
- .height = 4,
- .paletteNum = 0,
- .baseBlock = 64
- },
- DUMMY_WIN_TEMPLATE
- };
-
-static const struct WindowTemplate sYesNoWinTemplate =
- {
- .bg = 0,
- .tilemapLeft = 21,
- .tilemapTop = 9,
- .width = 5,
- .height = 4,
- .paletteNum = 15,
- .baseBlock = 424
- };
-
-static const s16 sEggShardVelocities[][2] =
- {
- {Q_8_8(-1.5), Q_8_8(-3.75)},
- {Q_8_8(-5), Q_8_8(-3)},
- {Q_8_8(3.5), Q_8_8(-3)},
- {Q_8_8(-4), Q_8_8(-3.75)},
- {Q_8_8(2), Q_8_8(-1.5)},
- {Q_8_8(-0.5), Q_8_8(-6.75)},
- {Q_8_8(5), Q_8_8(-2.25)},
- {Q_8_8(-1.5), Q_8_8(-3.75)},
- {Q_8_8(4.5), Q_8_8(-1.5)},
- {Q_8_8(-1), Q_8_8(-6.75)},
- {Q_8_8(4), Q_8_8(-2.25)},
- {Q_8_8(-3.5), Q_8_8(-3.75)},
- {Q_8_8(1), Q_8_8(-1.5)},
- {Q_8_8(-3.515625), Q_8_8(-6.75)},
- {Q_8_8(4.5), Q_8_8(-2.25)},
- {Q_8_8(-0.5), Q_8_8(-7.5)},
- {Q_8_8(1), Q_8_8(-4.5)},
- {Q_8_8(-2.5), Q_8_8(-2.25)},
- {Q_8_8(2.5), Q_8_8(-7.5)},
- };
-
-// code
-
-static void CreatedHatchedMon(struct Pokemon *egg, struct Pokemon *temp)
-{
- u16 species;
- u32 personality, pokerus;
- u8 i, friendship, language, gameMet, markings, obedience;
- u16 moves[4];
- u32 ivs[NUM_STATS];
-
-
- species = GetMonData(egg, MON_DATA_SPECIES);
-
- for (i = 0; i < 4; i++)
- {
- moves[i] = GetMonData(egg, MON_DATA_MOVE1 + i);
- }
-
- personality = GetMonData(egg, MON_DATA_PERSONALITY);
-
- for (i = 0; i < NUM_STATS; i++)
- {
- ivs[i] = GetMonData(egg, MON_DATA_HP_IV + i);
- }
-
-// language = GetMonData(egg, MON_DATA_LANGUAGE);
- gameMet = GetMonData(egg, MON_DATA_MET_GAME);
- markings = GetMonData(egg, MON_DATA_MARKINGS);
- pokerus = GetMonData(egg, MON_DATA_POKERUS);
- obedience = GetMonData(egg, MON_DATA_OBEDIENCE);
-
- CreateMon(temp, species, EGG_HATCH_LEVEL, 32, TRUE, personality, 0, 0);
-
- for (i = 0; i < 4; i++)
- {
- SetMonData(temp, MON_DATA_MOVE1 + i, &moves[i]);
- }
-
- for (i = 0; i < NUM_STATS; i++)
- {
- SetMonData(temp, MON_DATA_HP_IV + i, &ivs[i]);
- }
-
- language = GAME_LANGUAGE;
- SetMonData(temp, MON_DATA_LANGUAGE, &language);
- SetMonData(temp, MON_DATA_MET_GAME, &gameMet);
- SetMonData(temp, MON_DATA_MARKINGS, &markings);
-
- friendship = 120;
- SetMonData(temp, MON_DATA_FRIENDSHIP, &friendship);
- SetMonData(temp, MON_DATA_POKERUS, &pokerus);
- SetMonData(temp, MON_DATA_OBEDIENCE, &obedience);
-
- *egg = *temp;
-}
-
-static void AddHatchedMonToParty(u8 id)
-{
- u8 isEgg = 0x46; // ?
- u16 pokeNum;
- u8 name[12];
- u16 ball;
- u16 caughtLvl;
- u8 mapNameID;
- struct Pokemon* mon = &gPlayerParty[id];
-
- CreatedHatchedMon(mon, &gEnemyParty[0]);
- SetMonData(mon, MON_DATA_IS_EGG, &isEgg);
-
- pokeNum = GetMonData(mon, MON_DATA_SPECIES);
- GetSpeciesName(name, pokeNum);
- SetMonData(mon, MON_DATA_NICKNAME, name);
-
- pokeNum = SpeciesToNationalPokedexNum(pokeNum);
- GetSetPokedexFlag(pokeNum, FLAG_SET_SEEN);
- GetSetPokedexFlag(pokeNum, FLAG_SET_CAUGHT);
-
- GetMonNick(mon, gStringVar1);
-
- ball = ITEM_POKE_BALL;
- SetMonData(mon, MON_DATA_POKEBALL, &ball);
-
- caughtLvl = 0;
- SetMonData(mon, MON_DATA_MET_LEVEL, &caughtLvl);
-
- mapNameID = GetCurrentRegionMapSectionId();
- SetMonData(mon, MON_DATA_MET_LOCATION, &mapNameID);
-
- MonRestorePP(mon);
- CalculateMonStats(mon);
-}
-
-void ScriptHatchMon(void)
-{
- AddHatchedMonToParty(gSpecialVar_0x8004);
-}
-
-static bool8 sub_8046E34(struct DayCare *daycare, u8 daycareId)
-{
- u8 nick[0x20];
- struct DaycareMon *daycareMon = &daycare->mons[daycareId];
-
- GetBoxMonNick(&daycareMon->mon, nick);
- if (daycareMon->mail.message.itemId != 0
- && (StringCompare(nick, daycareMon->mail.monName) != 0
- || StringCompare(gSaveBlock2Ptr->playerName, daycareMon->mail.OT_name) != 0))
- {
- StringCopy(gStringVar1, nick);
- StringCopy(gStringVar2, daycareMon->mail.OT_name);
- StringCopy(gStringVar3, daycareMon->mail.monName);
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_8046EAC(void)
-{
- return sub_8046E34(&gSaveBlock1Ptr->daycare, gSpecialVar_0x8004);
-}
-
-extern const struct CompressedSpriteSheet gMonFrontPicTable[];
-
-static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID, u16* speciesLoc)
-{
- u8 r4 = 0;
- u8 spriteID = 0; // r7
- struct Pokemon* mon = NULL; // r5
-
- if (a0 == 0)
- {
- mon = &gPlayerParty[pokeID];
- r4 = 1;
- }
- if (a0 == 1)
- {
- mon = &gPlayerParty[pokeID];
- r4 = 3;
- }
- switch (switchID)
- {
- case 0:
- {
- u16 species = GetMonData(mon, MON_DATA_SPECIES);
- u32 pid = GetMonData(mon, MON_DATA_PERSONALITY);
- sub_800ECC4(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[(a0 * 2) + 1], species, pid);
- LoadCompressedObjectPalette(GetMonSpritePalStruct(mon));
- *speciesLoc = species;
- }
- break;
- case 1:
- SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, r4);
- spriteID = CreateSprite(&gMultiuseSpriteTemplate, 120, 70, 6);
- gSprites[spriteID].invisible = TRUE;
- gSprites[spriteID].callback = SpriteCallbackDummy;
- break;
- }
- return spriteID;
-}
-
-static void VBlankCB_EggHatch(void)
-{
- LoadOam();
- ProcessSpriteCopyRequests();
- TransferPlttBuffer();
-}
-
-void EggHatch(void)
-{
- ScriptContext2_Enable();
- CreateTask(Task_EggHatch, 10);
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
- sub_812B478();
-}
-
-static void Task_EggHatch(u8 taskID)
-{
- if (!gPaletteFade.active)
- {
- CleanupOverworldWindowsAndTilemaps();
- SetMainCallback2(CB2_EggHatch_0);
- gFieldCallback = FieldCallback_ReturnToEventScript2;
- DestroyTask(taskID);
- }
-}
-
-static void CB2_EggHatch_0(void)
-{
- switch (gMain.state)
- {
- case 0:
- SetGpuReg(REG_OFFSET_DISPCNT, 0);
-
- sEggHatchData = Alloc(sizeof(struct EggHatchData));
- AllocateMonSpritesGfx();
- sEggHatchData->eggPartyID = gSpecialVar_0x8004;
- sEggHatchData->eggShardVelocityID = 0;
-
- SetVBlankCallback(VBlankCB_EggHatch);
- gSpecialVar_0x8005 = GetCurrentMapMusic();
-
- reset_temp_tile_data_buffers();
- ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, sBgTemplates_EggHatch, ARRAY_COUNT(sBgTemplates_EggHatch));
-
- ChangeBgX(1, 0, 0);
- ChangeBgY(1, 0, 0);
- ChangeBgX(0, 0, 0);
- ChangeBgY(0, 0, 0);
-
- SetBgAttribute(1, 7, 2);
- SetBgTilemapBuffer(1, Alloc(0x1000));
- SetBgTilemapBuffer(0, Alloc(0x2000));
-
- DeactivateAllTextPrinters();
- ResetPaletteFade();
- FreeAllSpritePalettes();
- ResetSpriteData();
- ResetTasks();
- ScanlineEffect_Stop();
- m4aSoundVSyncOn();
- gMain.state++;
- break;
- case 1:
- InitWindows(sWinTemplates_EggHatch);
- sEggHatchData->windowId = 0;
- gMain.state++;
- break;
- case 2:
- DecompressAndLoadBgGfxUsingHeap(0, gBattleTextboxTiles, 0, 0, 0);
- CopyToBgTilemapBuffer(0, gFile_graphics_interface_menu_map_tilemap, 0, 0);
- LoadCompressedPalette(gBattleTextboxPalette, 0, 0x20);
- gMain.state++;
- break;
- case 3:
- LoadSpriteSheet(&sEggHatch_Sheet);
- LoadSpriteSheet(&sEggShards_Sheet);
- LoadSpritePalette(&sEgg_SpritePalette);
- gMain.state++;
- break;
- case 4:
- CopyBgTilemapBufferToVram(0);
- AddHatchedMonToParty(sEggHatchData->eggPartyID);
- gMain.state++;
- break;
- case 5:
- EggHatchCreateMonSprite(0, 0, sEggHatchData->eggPartyID, &sEggHatchData->species);
- gMain.state++;
- break;
- case 6:
- sEggHatchData->pokeSpriteID = EggHatchCreateMonSprite(0, 1, sEggHatchData->eggPartyID, &sEggHatchData->species);
- gMain.state++;
- break;
- case 7:
- SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
- LoadPalette(gTradeGba2_Pal, 0x10, 0xA0);
- LoadBgTiles(1, gTradeGba_Gfx, 0x1420, 0);
- CopyToBgTilemapBuffer(1, gUnknown_08331F60, 0x1000, 0);
- CopyBgTilemapBufferToVram(1);
- gMain.state++;
- break;
- case 8:
- SetMainCallback2(CB2_EggHatch_1);
- sEggHatchData->CB2_state = 0;
- break;
- }
- RunTasks();
- RunTextPrinters();
- AnimateSprites();
- BuildOamBuffer();
- UpdatePaletteFade();
-}
-
-static void EggHatchSetMonNickname(void)
-{
- SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar3);
- FreeMonSpritesGfx();
- Free(sEggHatchData);
- sub_812B484();
- SetMainCallback2(CB2_ReturnToField);
-}
-
-static void Task_EggHatchPlayBGM(u8 taskID)
-{
- if (gTasks[taskID].data[0] == 0)
- {
- StopMapMusic();
- }
- if (gTasks[taskID].data[0] == 1)
- PlayBGM(MUS_ME_SHINKA);
- if (gTasks[taskID].data[0] > 60)
- {
- PlayBGM(MUS_SHINKA);
- DestroyTask(taskID);
- // UB: task is destroyed, yet the value is incremented
- }
- gTasks[taskID].data[0]++;
-}
-
-static void CB2_EggHatch_1(void)
-{
- u16 species;
- u8 gender;
- u32 personality;
-
- switch (sEggHatchData->CB2_state)
- {
- case 0:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
- sEggHatchData->eggSpriteID = CreateSprite(&sSpriteTemplate_EggHatch, 120, 75, 5);
- ShowBg(0);
- ShowBg(1);
- sEggHatchData->CB2_state++;
- CreateTask(Task_EggHatchPlayBGM, 5);
- break;
- case 1:
- if (!gPaletteFade.active)
- {
- FillWindowPixelBuffer(sEggHatchData->windowId, 0x00);
- sEggHatchData->CB2_PalCounter = 0;
- sEggHatchData->CB2_state++;
- }
- break;
- case 2:
- if (++sEggHatchData->CB2_PalCounter > 30)
- {
- sEggHatchData->CB2_state++;
- gSprites[sEggHatchData->eggSpriteID].callback = SpriteCB_Egg_0;
- }
- break;
- case 3:
- if (gSprites[sEggHatchData->eggSpriteID].callback == SpriteCallbackDummy)
- {
- PlayCry1(sEggHatchData->species, 0);
- sEggHatchData->CB2_state++;
- }
- break;
- case 4:
- if (IsCryFinished())
- {
- sEggHatchData->CB2_state++;
- }
- break;
- case 5:
- GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1);
- StringExpandPlaceholders(gStringVar4, gText_HatchedFromEgg);
- EggHatchPrintMessage(sEggHatchData->windowId, gStringVar4, 0, 3, 0xFF);
- PlayFanfare(MUS_FANFA5);
- sEggHatchData->CB2_state++;
- PutWindowTilemap(sEggHatchData->windowId);
- CopyWindowToVram(sEggHatchData->windowId, 3);
- break;
- case 6:
- if (IsFanfareTaskInactive())
- sEggHatchData->CB2_state++;
- break;
- case 7:
- if (IsFanfareTaskInactive())
- sEggHatchData->CB2_state++;
- break;
- case 8:
- GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1);
- StringExpandPlaceholders(gStringVar4, gText_NickHatchPrompt);
- EggHatchPrintMessage(sEggHatchData->windowId, gStringVar4, 0, 2, 1);
- sEggHatchData->CB2_state++;
- break;
- case 9:
- if (!IsTextPrinterActive(sEggHatchData->windowId))
- {
- LoadUserWindowBorderGfx(sEggHatchData->windowId, 0x140, 0xE0);
- CreateYesNoMenu(&sYesNoWinTemplate, 3, 0, 2, 0x140, 0xE, 0);
- sEggHatchData->CB2_state++;
- }
- break;
- case 10:
- switch (Menu_ProcessInputNoWrapClearOnChoose())
- {
- case 0:
- GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar3);
- 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);
- break;
- case 1:
- case -1:
- sEggHatchData->CB2_state++;
- }
- break;
- case 11:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
- sEggHatchData->CB2_state++;
- break;
- case 12:
- if (!gPaletteFade.active)
- {
- RemoveWindow(sEggHatchData->windowId);
- UnsetBgTilemapBuffer(0);
- UnsetBgTilemapBuffer(1);
- Free(sEggHatchData);
- SetMainCallback2(CB2_ReturnToField);
- sub_812B484();
- }
- break;
- }
-
- RunTasks();
- RunTextPrinters();
- AnimateSprites();
- BuildOamBuffer();
- UpdatePaletteFade();
-}
-
-static void SpriteCB_Egg_0(struct Sprite* sprite)
-{
- if (++sprite->data[0] > 20)
- {
- sprite->callback = SpriteCB_Egg_1;
- sprite->data[0] = 0;
- }
- else
- {
- sprite->data[1] = (sprite->data[1] + 20) & 0xFF;
- sprite->pos2.x = Sin(sprite->data[1], 1);
- if (sprite->data[0] == 15)
- {
- PlaySE(SE_BOWA);
- StartSpriteAnim(sprite, 1);
- CreateRandomEggShardSprite();
- }
- }
-}
-
-static void SpriteCB_Egg_1(struct Sprite* sprite)
-{
- if (++sprite->data[2] > 30)
- {
- if (++sprite->data[0] > 20)
- {
- sprite->callback = SpriteCB_Egg_2;
- sprite->data[0] = 0;
- sprite->data[2] = 0;
- }
- else
- {
- sprite->data[1] = (sprite->data[1] + 20) & 0xFF;
- sprite->pos2.x = Sin(sprite->data[1], 2);
- if (sprite->data[0] == 15)
- {
- PlaySE(SE_BOWA);
- StartSpriteAnim(sprite, 2);
- }
- }
- }
-}
-
-struct UnkStruct_82349CC
-{
- u8 field_0;
- u8 field_1;
- u8 field_2;
- u8 field_3;
-};
-
-extern const struct UnkStruct_82349CC gUnknown_82349CC[NUM_SPECIES];
-
-static void SpriteCB_Egg_2(struct Sprite* sprite)
-{
- if (++sprite->data[2] > 30)
- {
- if (++sprite->data[0] > 38)
- {
- u16 species;
-
- sprite->callback = SpriteCB_Egg_3;
- sprite->data[0] = 0;
- species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES);
- gSprites[sEggHatchData->pokeSpriteID].pos2.x = 0;
- gSprites[sEggHatchData->pokeSpriteID].pos2.y = gUnknown_82349CC[species].field_1;
- }
- else
- {
- sprite->data[1] = (sprite->data[1] + 20) & 0xFF;
- sprite->pos2.x = Sin(sprite->data[1], 2);
- if (sprite->data[0] == 15)
- {
- PlaySE(SE_BOWA);
- StartSpriteAnim(sprite, 2);
- CreateRandomEggShardSprite();
- CreateRandomEggShardSprite();
- }
- if (sprite->data[0] == 30)
- PlaySE(SE_BOWA);
- }
- }
-}
-
-static void SpriteCB_Egg_3(struct Sprite* sprite)
-{
- if (++sprite->data[0] > 50)
- {
- sprite->callback = SpriteCB_Egg_4;
- sprite->data[0] = 0;
- }
-}
-
-static void SpriteCB_Egg_4(struct Sprite* sprite)
-{
- s16 i;
- if (sprite->data[0] == 0)
- BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 0x10, 0xFFFF);
- if (sprite->data[0] < 4u)
- {
- for (i = 0; i <= 3; i++)
- CreateRandomEggShardSprite();
- }
- sprite->data[0]++;
- if (!gPaletteFade.active)
- {
- PlaySE(SE_JIHANKI);
- sprite->invisible = TRUE;
- sprite->callback = SpriteCB_Egg_5;
- sprite->data[0] = 0;
- }
-}
-
-static void SpriteCB_Egg_5(struct Sprite* sprite)
-{
- if (sprite->data[0] == 0)
- {
- gSprites[sEggHatchData->pokeSpriteID].invisible = FALSE;
- StartSpriteAffineAnim(&gSprites[sEggHatchData->pokeSpriteID], 1);
- }
- if (sprite->data[0] == 8)
- BeginNormalPaletteFade(0xFFFFFFFF, -1, 0x10, 0, 0xFFFF);
- if (sprite->data[0] <= 9)
- gSprites[sEggHatchData->pokeSpriteID].pos1.y -= 1;
- if (sprite->data[0] > 40)
- sprite->callback = SpriteCallbackDummy;
- sprite->data[0]++;
-}
-
-static void SpriteCB_EggShard(struct Sprite* sprite)
-{
- sprite->data[4] += sprite->data[1];
- sprite->data[5] += sprite->data[2];
-
- sprite->pos2.x = sprite->data[4] / 256;
- sprite->pos2.y = sprite->data[5] / 256;
-
- sprite->data[2] += sprite->data[3];
-
- if (sprite->pos1.y + sprite->pos2.y > sprite->pos1.y + 20 && sprite->data[2] > 0)
- DestroySprite(sprite);
-}
-
-static void CreateRandomEggShardSprite(void)
-{
- u16 spriteAnimIndex;
-
- s16 velocity1 = sEggShardVelocities[sEggHatchData->eggShardVelocityID][0];
- s16 velocity2 = sEggShardVelocities[sEggHatchData->eggShardVelocityID][1];
- sEggHatchData->eggShardVelocityID++;
- spriteAnimIndex = Random() % 4;
- CreateEggShardSprite(120, 60, velocity1, velocity2, 100, spriteAnimIndex);
-}
-
-static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex)
-{
- u8 spriteID = CreateSprite(&sSpriteTemplate_EggShard, x, y, 4);
- gSprites[spriteID].data[1] = data1;
- gSprites[spriteID].data[2] = data2;
- gSprites[spriteID].data[3] = data3;
- StartSpriteAnim(&gSprites[spriteID], spriteAnimIndex);
-}
-
-static void EggHatchPrintMessage(u8 windowId, u8* string, u8 x, u8 y, u8 speed)
-{
- FillWindowPixelBuffer(windowId, 0xFF);
- sEggHatchData->textColor.fgColor = 0;
- sEggHatchData->textColor.bgColor = 5;
- sEggHatchData->textColor.shadowColor = 6;
- AddTextPrinterParametrized2(windowId, 3, x, y, 1, 1, &sEggHatchData->textColor, speed, string);
-}
diff --git a/src/ereader_helpers.c b/src/ereader_helpers.c
new file mode 100644
index 000000000..2a9b9ea71
--- /dev/null
+++ b/src/ereader_helpers.c
@@ -0,0 +1,397 @@
+#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,
+};
+
+struct SendRecvMgr
+{
+ u8 sendOrRecv;
+ u8 state;
+ u8 field_02;
+ u8 field_03;
+ u8 field_04;
+ u32 * dataptr;
+ int cursor;
+ int size;
+ u32 checksum;
+};
+
+static bool16 DetermineSendRecvState(u8);
+static void SetUpTransferManager(size_t, const void *, void *);
+static void StartTm3(void);
+static void EnableSio(void);
+static void DisableTm3(void);
+static void GetKeyInput(void);
+
+static struct SendRecvMgr sSendRecvMgr;
+static u16 sJoyNewOrRepeated;
+static u16 sJoyNew;
+static u16 sSendRecvStatus;
+static u16 sCounter1;
+static u32 sCounter2;
+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 result;
+ EReaderHelper_SaveRegsState();
+
+ while (1)
+ {
+ GetKeyInput();
+ if (TEST_BUTTON(sJoyNew, B_BUTTON))
+ gUnknown_3003F84 = 2;
+
+ sSendRecvStatus = EReaderHandleTransfer(1, r6, r5, NULL);
+ if ((sSendRecvStatus & 0x13) == 0x10)
+ {
+ result = 0;
+ break;
+ }
+ else if (sSendRecvStatus & 8)
+ {
+ result = 1;
+ break;
+ }
+ else if (sSendRecvStatus & 4)
+ {
+ result = 2;
+ break;
+ }
+ else
+ {
+ gUnknown_3003F84 = 0;
+ VBlankIntrWait();
+ }
+ }
+
+ CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));
+ EReaderHelper_RestoreRegsState();
+ return result;
+}
+
+int EReader_Recv(void * r5)
+{
+ int result;
+ EReaderHelper_SaveRegsState();
+
+ while (1)
+ {
+ GetKeyInput();
+ if (TEST_BUTTON(sJoyNew, B_BUTTON))
+ gUnknown_3003F84 = 2;
+
+ sSendRecvStatus = EReaderHandleTransfer(0, 0, NULL, r5);
+ if ((sSendRecvStatus & 0x13) == 0x10)
+ {
+ result = 0;
+ break;
+ }
+ else if (sSendRecvStatus & 8)
+ {
+ result = 1;
+ break;
+ }
+ else if (sSendRecvStatus & 4)
+ {
+ result = 2;
+ break;
+ }
+ else
+ {
+ gUnknown_3003F84 = 0;
+ VBlankIntrWait();
+ }
+ }
+
+ CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));
+ EReaderHelper_RestoreRegsState();
+ return result;
+}
+
+static void CloseSerial(void)
+{
+ REG_IME = 0;
+ REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
+ REG_IME = 1;
+ REG_SIOCNT = 0;
+ REG_TM3CNT_H = 0;
+ REG_IF = INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL;
+}
+
+static void OpenSerialMulti(void)
+{
+ REG_IME = 0;
+ REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
+ REG_IME = 1;
+ REG_RCNT = 0;
+ REG_SIOCNT = SIO_MULTI_MODE;
+ REG_SIOCNT |= SIO_INTR_ENABLE | SIO_115200_BPS;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_SERIAL;
+ REG_IME = 1;
+ if (sSendRecvMgr.state == 0)
+ CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));
+}
+
+static void OpenSerial32(void)
+{
+ REG_RCNT = 0;
+ REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE;
+ REG_SIOCNT |= SIO_MULTI_SD;
+ gUnknown_3003F84 = 0;
+ sCounter1 = 0;
+ sCounter2 = 0;
+}
+
+u16 EReaderHandleTransfer(u8 mode, size_t size, const void * data, void * recvBuffer)
+{
+ switch (sSendRecvMgr.state)
+ {
+ case 0:
+ OpenSerialMulti();
+ sSendRecvMgr.field_02 = 1;
+ sSendRecvMgr.state = 1;
+ break;
+ case 1:
+ if (DetermineSendRecvState(mode))
+ EnableSio();
+ if (gUnknown_3003F84 == 2)
+ {
+ sSendRecvMgr.field_04 = 2;
+ sSendRecvMgr.state = 6;
+ }
+ break;
+ case 2:
+ OpenSerial32();
+ SetUpTransferManager(size, data, recvBuffer);
+ sSendRecvMgr.state = 3;
+ // fallthrough
+ case 3:
+ if (gUnknown_3003F84 == 2)
+ {
+ sSendRecvMgr.field_04 = 2;
+ sSendRecvMgr.state = 6;
+ }
+ else
+ {
+ sCounter1++;
+ sCounter2++;
+ if (sSendRecvMgr.sendOrRecv == 0 && sCounter2 > 60)
+ {
+ sSendRecvMgr.field_04 = 1;
+ sSendRecvMgr.state = 6;
+ }
+ if (sSendRecvMgr.field_02 != 2)
+ {
+ if (sSendRecvMgr.sendOrRecv != 0 && sCounter1 > 2)
+ {
+ EnableSio();
+ sSendRecvMgr.field_02 = 2;
+ }
+ else
+ {
+ EnableSio();
+ sSendRecvMgr.field_02 = 2;
+ }
+ }
+ }
+ break;
+ case 4:
+ OpenSerialMulti();
+ sSendRecvMgr.state = 5;
+ break;
+ case 5:
+ if (sSendRecvMgr.sendOrRecv == 1 && sCounter1 > 2)
+ EnableSio();
+ if (++sCounter1 > 60)
+ {
+ sSendRecvMgr.field_04 = 1;
+ sSendRecvMgr.state = 6;
+ }
+ break;
+ case 6:
+ if (sSendRecvMgr.field_02 != 0)
+ {
+ CloseSerial();
+ sSendRecvMgr.field_02 = 0;
+ }
+ break;
+ }
+ return sSendRecvMgr.field_02 | (sSendRecvMgr.field_04 << 2) | (sSendRecvMgr.field_03 << 4);
+}
+
+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;
+ else
+ resp = sSendRecvMgr.sendOrRecv = FALSE;
+ return resp;
+}
+
+static void SetUpTransferManager(size_t size, const void * data, void * recvBuffer)
+{
+ if (sSendRecvMgr.sendOrRecv)
+ {
+ REG_SIOCNT |= SIO_38400_BPS;
+ sSendRecvMgr.dataptr = (void *)data;
+ REG_SIODATA32 = size;
+ sSendRecvMgr.size = size / 4 + 1;
+ StartTm3();
+ }
+ else
+ {
+ REG_SIOCNT |= SIO_9600_BPS;
+ sSendRecvMgr.dataptr = recvBuffer;
+ }
+}
+
+static void StartTm3(void)
+{
+ REG_TM3CNT_L = -601;
+ REG_TM3CNT_H = TIMER_INTR_ENABLE;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_TIMER3;
+ REG_IME = 1;
+}
+
+void EReaderHelper_Timer3Callback(void)
+{
+ DisableTm3();
+ EnableSio();
+}
+
+void EReaderHelper_SerialCallback(void)
+{
+ u16 recv[4];
+ u16 i;
+ u16 cnt1;
+ u16 cnt2;
+ u32 recv32;
+
+ switch (sSendRecvMgr.state)
+ {
+ case 1:
+ REG_SIOMLT_SEND = 0xCCD0;
+ *(u64 *)recv = REG_SIOMLT_RECV;
+ for (i = 0, cnt1 = 0, cnt2 = 0; i < 4; i++)
+ {
+ if (recv[i] == 0xCCD0)
+ cnt1++;
+ else if (recv[i] != 0xFFFF)
+ cnt2++;
+ }
+ if (cnt1 == 2 && cnt2 == 0)
+ sSendRecvMgr.state = 2;
+ break;
+ case 3:
+ recv32 = REG_SIODATA32;
+ if (sSendRecvMgr.cursor == 0 && sSendRecvMgr.sendOrRecv == 0)
+ sSendRecvMgr.size = recv32 / 4 + 1;
+ if (sSendRecvMgr.sendOrRecv == 1)
+ {
+ if (sSendRecvMgr.cursor < sSendRecvMgr.size)
+ {
+ REG_SIODATA32 = sSendRecvMgr.dataptr[sSendRecvMgr.cursor];
+ sSendRecvMgr.checksum += sSendRecvMgr.dataptr[sSendRecvMgr.cursor];
+ }
+ else
+ REG_SIODATA32 = sSendRecvMgr.checksum;
+ }
+ else
+ {
+ if (sSendRecvMgr.cursor > 0 && sSendRecvMgr.cursor < sSendRecvMgr.size + 1)
+ {
+ sSendRecvMgr.dataptr[sSendRecvMgr.cursor - 1] = recv32;
+ sSendRecvMgr.checksum += recv32;
+ }
+ else if (sSendRecvMgr.cursor != 0)
+ {
+ if (sSendRecvMgr.checksum == recv32)
+ sSendRecvMgr.field_03 = 1;
+ else
+ sSendRecvMgr.field_03 = 2;
+ }
+ sCounter2 = 0;
+ }
+ sSendRecvMgr.cursor++;
+ if (sSendRecvMgr.cursor < sSendRecvMgr.size + 2)
+ {
+ if (sSendRecvMgr.sendOrRecv != 0)
+ REG_TM3CNT_H |= TIMER_ENABLE;
+ else
+ EnableSio();
+ }
+ else
+ {
+ sSendRecvMgr.state = 4;
+ sCounter1 = 0;
+ }
+ break;
+ case 5:
+ if (sSendRecvMgr.sendOrRecv == 0)
+ REG_SIODATA8 = sSendRecvMgr.field_03;
+ *(vu64 *)recv = REG_SIOMLT_RECV;
+ if (recv[1] == 1 || recv[1] == 2)
+ {
+ if (sSendRecvMgr.sendOrRecv == 1)
+ sSendRecvMgr.field_03 = recv[1];
+ sSendRecvMgr.state = 6;
+ }
+ break;
+ }
+}
+
+static void EnableSio(void)
+{
+ REG_SIOCNT |= SIO_ENABLE;
+}
+
+static void DisableTm3(void)
+{
+ REG_TM3CNT_H &= ~TIMER_ENABLE;
+ REG_TM3CNT_L = -601;
+}
+
+static void GetKeyInput(void)
+{
+ u16 rawKeys = REG_KEYINPUT ^ 0x3FF;
+ sJoyNew = rawKeys & ~sJoyNewOrRepeated;
+ sJoyNewOrRepeated = rawKeys;
+}
+
+void EReaderHelper_SaveRegsState(void)
+{
+ sSavedIme = REG_IME;
+ sSavedIe = REG_IE;
+ sSavedTm3Cnt = REG_TM3CNT_H;
+ sSavedSioCnt = REG_SIOCNT;
+ sSavedRCnt = REG_RCNT;
+}
+
+void EReaderHelper_RestoreRegsState(void)
+{
+ REG_IME = sSavedIme;
+ REG_IE = sSavedIe;
+ REG_TM3CNT_H = sSavedTm3Cnt;
+ REG_SIOCNT = sSavedSioCnt;
+ REG_RCNT = sSavedRCnt;
+}
+
+void EReaderHelper_ClearsSendRecvMgr(void)
+{
+ CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));
+}
diff --git a/src/fame_checker.c b/src/fame_checker.c
index 795863aca..aa1684981 100644
--- a/src/fame_checker.c
+++ b/src/fame_checker.c
@@ -127,9 +127,9 @@ extern const u8 gFameCheckerText_Cancel[];
extern const u8 gFameCheckerText_ListMenuCursor[];
extern const u8 gFameCheckerText_FameCheckerWillBeClosed[];
extern const u8 gFameCheckerText_ClearTextbox[];
-extern const u8 gFameCheckerText_MainScreenUI[]; // "{KEYGFX_START_BUTTON}PICK {KEYGFX_DPAD_UP_DOWN}SELECT {KEYGFX_A_BUTTON}OK$"
-extern const u8 gFameCheckerText_PickScreenUI[]; // "{KEYGFX_START_BUTTON}PICK {KEYGFX_DPAD_UP_DOWN}SELECT {KEYGFX_B_BUTTON}CANCEL$"
-extern const u8 gFameCheckerText_FlavorTextUI[]; // "{KEYGFX_DPAD_ANY}PICK {KEYGFX_A_BUTTON}READ {KEYGFX_B_BUTTON}CANCEL$"
+extern const u8 gFameCheckerText_MainScreenUI[]; // "{KEYGFX_DPAD_ANY}PICK {KEYGFX_DPAD_UP_DOWN}SELECT {KEYGFX_A_BUTTON}OK$"
+extern const u8 gFameCheckerText_PickScreenUI[]; // "{KEYGFX_DPAD_ANY}PICK {KEYGFX_DPAD_UP_DOWN}SELECT {KEYGFX_B_BUTTON}CANCEL$"
+extern const u8 gFameCheckerText_FlavorTextUI[]; // "{KEYGFX_START_BUTTON}PICK {KEYGFX_A_BUTTON}READ {KEYGFX_B_BUTTON}CANCEL$"
extern const u8 gFameCheckerOakName[]; // "OAK$"
extern const u8 gFameCheckerDaisyName[]; // "DAISY$"
extern const u8 gFameCheckerBillName[]; // "BILL$"
@@ -552,7 +552,7 @@ static void Task_TopMenuHandleInput(u8 taskId)
if (FindTaskIdByFunc(Task_FCOpenOrCloseInfoBox) == 0xFF)
{
RunTextPrinters();
- if ((JOY_NEW(SELECT_BUTTON)) && !sFameCheckerData->inPickMode && sFameCheckerData->savedCallback != UseFameCheckerFromMenu)
+ if ((JOY_NEW(SELECT_BUTTON)) && !sFameCheckerData->inPickMode && sFameCheckerData->savedCallback != ReturnToBagFromKeyItem)
task->func = Task_StartToCloseFameChecker;
else if (JOY_NEW(START_BUTTON))
{
@@ -580,7 +580,7 @@ static void Task_TopMenuHandleInput(u8 taskId)
}
else if (JOY_NEW(A_BUTTON))
{
- cursorPos = ListMenuHandleInput(0);
+ cursorPos = ListMenu_ProcessInput(0);
if (cursorPos == sFameCheckerData->numUnlockedPersons - 1) // CANCEL
task->func = Task_StartToCloseFameChecker;
else if (sFameCheckerData->inPickMode)
@@ -615,7 +615,7 @@ static void Task_TopMenuHandleInput(u8 taskId)
task->func = Task_StartToCloseFameChecker;
}
else
- ListMenuHandleInput(0);
+ ListMenu_ProcessInput(0);
}
}
@@ -639,7 +639,7 @@ static bool8 TryExitPickMode(u8 taskId)
static void MessageBoxPrintEmptyText(void)
{
- AddTextPrinterParametrized(2, 2, gFameCheckerText_ClearTextbox, 0, NULL, 2, 1, 3);
+ AddTextPrinterParameterized2(2, 2, gFameCheckerText_ClearTextbox, 0, NULL, 2, 1, 3);
}
static void Task_EnterPickMode(u8 taskId)
@@ -779,7 +779,7 @@ static void GetPickModeText(void)
if (HasUnlockedAllFlavorTextsForCurrentPerson() == TRUE)
offset = NUM_FAMECHECKER_PERSONS;
StringExpandPlaceholders(gStringVar4, sFameCheckerNameAndQuotesPointers[sFameCheckerData->unlockedPersons[who] + offset]);
- AddTextPrinterParametrized(FCWINDOWID_MSGBOX, 2, gStringVar4, GetTextSpeedSetting(), NULL, 2, 1, 3);
+ AddTextPrinterParameterized2(FCWINDOWID_MSGBOX, 2, gStringVar4, GetTextSpeedSetting(), NULL, 2, 1, 3);
FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);
}
}
@@ -790,7 +790,7 @@ static void PrintSelectedNameInBrightGreen(u8 taskId)
u16 cursorPos = FameCheckerGetCursorY();
FillWindowPixelRect(FCWINDOWID_MSGBOX, 0x11, 0, 0, 0xd0, 0x20);
StringExpandPlaceholders(gStringVar4, sFameCheckerFlavorTextPointers[sFameCheckerData->unlockedPersons[cursorPos] * 6 + data[1]]);
- AddTextPrinterParametrized(FCWINDOWID_MSGBOX, 2, gStringVar4, GetTextSpeedSetting(), NULL, 2, 1, 3);
+ AddTextPrinterParameterized2(FCWINDOWID_MSGBOX, 2, gStringVar4, GetTextSpeedSetting(), NULL, 2, 1, 3);
FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);
}
@@ -853,7 +853,7 @@ static void Task_DestroyAssetsAndCloseFameChecker(u8 taskId)
FreeQuestionMarkSpriteResources();
FreeListMenuSelectorArrowPairResources();
SetMainCallback2(sFameCheckerData->savedCallback);
- DestroyListMenu(sFameCheckerData->listMenuTaskId, NULL, NULL);
+ DestroyListMenuTask(sFameCheckerData->listMenuTaskId, NULL, NULL);
Free(sBg3TilemapBuffer);
Free(sBg1TilemapBuffer);
Free(sBg2TilemapBuffer);
@@ -900,7 +900,7 @@ static void PrintUIHelp(u8 state)
}
width = GetStringWidth(0, src, 0);
FillWindowPixelRect(FCWINDOWID_UIHELP, 0x00, 0, 0, 0xc0, 0x10);
- AddTextPrinterParametrized2(FCWINDOWID_UIHELP, 0, 188 - width, 0, 0, 2, &sTextColor_White, -1, src);
+ AddTextPrinterParameterized4(FCWINDOWID_UIHELP, 0, 188 - width, 0, 0, 2, &sTextColor_White, -1, src);
FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_UIHELP);
}
@@ -1213,10 +1213,10 @@ static void UpdateIconDescriptionBox(u8 whichText)
gIconDescriptionBoxIsOpen = 1;
FillWindowPixelRect(FCWINDOWID_ICONDESC, 0x00, 0, 0, 0x58, 0x20);
width = (0x54 - GetStringWidth(0, sFlavorTextOriginLocationTexts[idx], 0)) / 2;
- AddTextPrinterParametrized2(FCWINDOWID_ICONDESC, 0, width, 0, 0, 2, &sTextColor_DkGrey, -1, sFlavorTextOriginLocationTexts[idx]);
+ AddTextPrinterParameterized4(FCWINDOWID_ICONDESC, 0, width, 0, 0, 2, &sTextColor_DkGrey, -1, sFlavorTextOriginLocationTexts[idx]);
StringExpandPlaceholders(gStringVar1, sFlavorTextOriginObjectNameTexts[idx]);
width = (0x54 - GetStringWidth(0, gStringVar1, 0)) / 2;
- AddTextPrinterParametrized2(FCWINDOWID_ICONDESC, 0, width, 10, 0, 2, &sTextColor_DkGrey, -1, gStringVar1);
+ AddTextPrinterParameterized4(FCWINDOWID_ICONDESC, 0, width, 10, 0, 2, &sTextColor_DkGrey, -1, gStringVar1);
FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_ICONDESC);
}
@@ -1270,7 +1270,7 @@ static void FC_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list
struct Task *task = &gTasks[taskId];
PlaySE(SE_SELECT);
task->data[1] = 0;
- get_coro_args_x18_x1A(sFameCheckerData->listMenuTaskId, &listMenuTopIdx, NULL);
+ ListMenuGetScrollAndRow(sFameCheckerData->listMenuTaskId, &listMenuTopIdx, NULL);
sFameCheckerData->listMenuTopIdx = listMenuTopIdx;
if (itemIndex != sFameCheckerData->numUnlockedPersons - 1)
{
@@ -1330,7 +1330,7 @@ static void Task_SwitchToPickMode(u8 taskId)
static void PrintCancelDescription(void)
{
FillWindowPixelRect(FCWINDOWID_MSGBOX, 0x11, 0, 0, 0xd0, 0x20);
- AddTextPrinterParametrized(FCWINDOWID_MSGBOX, 2, gFameCheckerText_FameCheckerWillBeClosed, 0, NULL, 2, 1, 3);
+ AddTextPrinterParameterized2(FCWINDOWID_MSGBOX, 2, gFameCheckerText_FameCheckerWillBeClosed, 0, NULL, 2, 1, 3);
FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);
}
@@ -1339,16 +1339,16 @@ static void FC_DoMoveCursor(s32 itemIndex, bool8 onInit)
u16 listY;
u16 cursorY;
u16 who;
- get_coro_args_x18_x1A(sFameCheckerData->listMenuTaskId, &listY, &cursorY);
+ ListMenuGetScrollAndRow(sFameCheckerData->listMenuTaskId, &listY, &cursorY);
who = listY + cursorY;
- AddTextPrinterParametrized2(FCWINDOWID_LIST, 2, 8, 14 * cursorY + 4, 0, 0, &sTextColor_Green, 0, sListMenuItems[itemIndex].unk_00);
+ AddTextPrinterParameterized4(FCWINDOWID_LIST, 2, 8, 14 * cursorY + 4, 0, 0, &sTextColor_Green, 0, sListMenuItems[itemIndex].label);
if (!onInit)
{
if (listY < sFameCheckerData->listMenuTopIdx2)
sFameCheckerData->listMenuDrawnSelIdx++;
else if (listY > sFameCheckerData->listMenuTopIdx2 && who != sFameCheckerData->numUnlockedPersons - 1)
sFameCheckerData->listMenuDrawnSelIdx--;
- AddTextPrinterParametrized2(FCWINDOWID_LIST, 2, 8, 14 * sFameCheckerData->listMenuDrawnSelIdx + 4, 0, 0, &sTextColor_DkGrey, 0, sListMenuItems[sFameCheckerData->listMenuCurIdx].unk_00);
+ AddTextPrinterParameterized4(FCWINDOWID_LIST, 2, 8, 14 * sFameCheckerData->listMenuDrawnSelIdx + 4, 0, 0, &sTextColor_DkGrey, 0, sListMenuItems[sFameCheckerData->listMenuCurIdx].label);
}
sFameCheckerData->listMenuCurIdx = itemIndex;
@@ -1368,20 +1368,20 @@ static u8 FC_PopulateListMenu(void)
{
if (sTrainerIdxs[fameCheckerIdx] < FC_NONTRAINER_START)
{
- sListMenuItems[nitems].unk_00 = gTrainers[sTrainerIdxs[fameCheckerIdx]].trainerName;
- sListMenuItems[nitems].unk_04 = nitems;
+ sListMenuItems[nitems].label = gTrainers[sTrainerIdxs[fameCheckerIdx]].trainerName;
+ sListMenuItems[nitems].index = nitems;
}
else
{
- sListMenuItems[nitems].unk_00 = sNonTrainerNamePointers[sTrainerIdxs[fameCheckerIdx] - FC_NONTRAINER_START];
- sListMenuItems[nitems].unk_04 = nitems;
+ sListMenuItems[nitems].label = sNonTrainerNamePointers[sTrainerIdxs[fameCheckerIdx] - FC_NONTRAINER_START];
+ sListMenuItems[nitems].index = nitems;
}
sFameCheckerData->unlockedPersons[nitems] = fameCheckerIdx;
nitems++;
}
}
- sListMenuItems[nitems].unk_00 = gFameCheckerText_Cancel;
- sListMenuItems[nitems].unk_04 = nitems;
+ sListMenuItems[nitems].label = gFameCheckerText_Cancel;
+ sListMenuItems[nitems].index = nitems;
sFameCheckerData->unlockedPersons[nitems] = 0xFF;
nitems++;
gFameChecker_ListMenuTemplate.totalItems = nitems;
@@ -1400,7 +1400,7 @@ static void FC_PutWindowTilemapAndCopyWindowToVramMode3_2(u8 windowId)
static void FC_CreateScrollIndicatorArrowPair(void)
{
- struct ScrollIndicatorArrowPairTemplate template = {
+ struct ScrollArrowsTemplate template = {
2,
40,
26,
@@ -1412,13 +1412,12 @@ static void FC_CreateScrollIndicatorArrowPair(void)
SPRITETAG_SCROLL_INDICATORS,
0xFFFF,
1,
- 0
};
if (sFameCheckerData->numUnlockedPersons > 5)
{
- template.unk_06 = 0;
- template.unk_08 = sFameCheckerData->numUnlockedPersons - 5;
+ template.fullyUpThreshold = 0;
+ template.fullyDownThreshold = sFameCheckerData->numUnlockedPersons - 5;
sFameCheckerData->scrollIndicatorPairTaskId = AddScrollIndicatorArrowPair(&template, &sFameCheckerData->listMenuTopIdx);
}
}
@@ -1432,7 +1431,7 @@ static void FreeListMenuSelectorArrowPairResources(void)
static u16 FameCheckerGetCursorY(void)
{
u16 listY, cursorY;
- get_coro_args_x18_x1A(sFameCheckerData->listMenuTaskId, &listY, &cursorY);
+ ListMenuGetScrollAndRow(sFameCheckerData->listMenuTaskId, &listY, &cursorY);
return listY + cursorY;
}
@@ -1547,7 +1546,7 @@ static void PlaceListMenuCursor(bool8 isActive)
{
u16 cursorY = ListMenuGetYCoordForPrintingArrowCursor(sFameCheckerData->listMenuTaskId);
if (isActive == TRUE)
- AddTextPrinterParametrized2(FCWINDOWID_LIST, 2, 0, cursorY, 0, 0, &sTextColor_DkGrey, 0, gFameCheckerText_ListMenuCursor);
+ AddTextPrinterParameterized4(FCWINDOWID_LIST, 2, 0, cursorY, 0, 0, &sTextColor_DkGrey, 0, gFameCheckerText_ListMenuCursor);
else
- AddTextPrinterParametrized2(FCWINDOWID_LIST, 2, 0, cursorY, 0, 0, &sTextColor_White, 0, gFameCheckerText_ListMenuCursor);
+ AddTextPrinterParameterized4(FCWINDOWID_LIST, 2, 0, cursorY, 0, 0, &sTextColor_White, 0, gFameCheckerText_ListMenuCursor);
}
diff --git a/src/field_poison.c b/src/field_poison.c
new file mode 100644
index 000000000..474fbcd69
--- /dev/null
+++ b/src/field_poison.c
@@ -0,0 +1,117 @@
+#include "global.h"
+#include "strings.h"
+#include "task.h"
+#include "field_message_box.h"
+#include "script.h"
+#include "string_util.h"
+#include "event_data.h"
+#include "fldeff.h"
+#include "party_menu.h"
+#include "field_poison.h"
+#include "constants/species.h"
+#include "constants/battle.h"
+
+static bool32 IsMonValidSpecies(struct Pokemon *pokemon)
+{
+ u16 species = GetMonData(pokemon, MON_DATA_SPECIES2);
+ if (species == SPECIES_NONE || species == SPECIES_EGG)
+ return FALSE;
+ return TRUE;
+}
+
+static bool32 AllMonsFainted(void)
+{
+ int i;
+
+ struct Pokemon *pokemon = gPlayerParty;
+ for (i = 0; i < PARTY_SIZE; i++, pokemon++)
+ if (IsMonValidSpecies(pokemon) && GetMonData(pokemon, MON_DATA_HP))
+ return FALSE;
+ return TRUE;
+}
+
+static void FaintFromFieldPoison(u8 partyIdx)
+{
+ struct Pokemon *pokemon = gPlayerParty + partyIdx;
+ u32 status = STATUS1_NONE;
+ AdjustFriendship(pokemon, 8);
+ SetMonData(pokemon, MON_DATA_STATUS, &status);
+ GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1);
+ StringGetEnd10(gStringVar1);
+}
+
+static bool32 MonFaintedFromPoison(u8 partyIdx)
+{
+ struct Pokemon *pokemon = gPlayerParty + partyIdx;
+ if (IsMonValidSpecies(pokemon) && !GetMonData(pokemon, MON_DATA_HP) && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN)
+ return TRUE;
+ return FALSE;
+}
+
+static void Task_WhiteOut(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ switch (data[0])
+ {
+ case 0:
+ for (; data[1] < PARTY_SIZE; data[1]++)
+ {
+ if (MonFaintedFromPoison(data[1]))
+ {
+ FaintFromFieldPoison(data[1]);
+ ShowFieldMessage(gText_PkmnFainted3);
+ data[0]++;
+ return;
+ }
+ }
+ data[0] = 2;
+ break;
+ case 1:
+ if (IsFieldMessageBoxHidden())
+ data[0]--;
+ break;
+ case 2:
+ if (AllMonsFainted())
+ gSpecialVar_Result = 1;
+ else
+ gSpecialVar_Result = 0;
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void ExecuteWhiteOut(void)
+{
+ CreateTask(Task_WhiteOut, 80);
+ ScriptContext1_Stop();
+}
+
+s32 DoPoisonFieldEffect(void)
+{
+ int i;
+ u32 hp;
+
+ struct Pokemon *pokemon = gPlayerParty;
+ u32 numPoisoned = 0;
+ u32 numFainted = 0;
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES) && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN)
+ {
+ hp = GetMonData(pokemon, MON_DATA_HP);
+ if (hp == 0 || --hp == 0)
+ numFainted++;
+ SetMonData(pokemon, MON_DATA_HP, &hp);
+ numPoisoned++;
+ }
+ pokemon++;
+ }
+ if (numFainted || numPoisoned)
+ FldEffPoison_Start();
+ if (numFainted)
+ return FLDPSN_FNT;
+ if (numPoisoned)
+ return FLDPSN_PSN;
+ return FLDPSN_NONE;
+}
diff --git a/src/field_special_scene.c b/src/field_special_scene.c
new file mode 100644
index 000000000..4f9446942
--- /dev/null
+++ b/src/field_special_scene.c
@@ -0,0 +1,26 @@
+#include "global.h"
+
+static u32 sub_80A0E78(void)
+{
+ return 0;
+}
+
+static void nullsub_57(void)
+{
+}
+
+static void nullsub_58(void)
+{
+}
+
+static void nullsub_59(void)
+{
+}
+
+void nullsub_60(void)
+{
+}
+
+void nullsub_61(void)
+{
+}
diff --git a/src/fieldmap.c b/src/fieldmap.c
index 5d11c7d99..2683eaf62 100644
--- a/src/fieldmap.c
+++ b/src/fieldmap.c
@@ -897,7 +897,7 @@ void copy_tileset_patterns_to_vram(struct Tileset const *tileset, u16 numTiles,
if (!tileset->isCompressed)
LoadBgTiles(2, tileset->tiles, numTiles * 32, offset);
else
- sub_80F68F0(2, tileset->tiles, numTiles * 32, offset, 0);
+ DecompressAndCopyTileDataToVram2(2, tileset->tiles, numTiles * 32, offset, 0);
}
}
@@ -908,7 +908,7 @@ void copy_tileset_patterns_to_vram2(struct Tileset const *tileset, u16 numTiles,
if (!tileset->isCompressed)
LoadBgTiles(2, tileset->tiles, numTiles * 32, offset);
else
- sub_80F69E8(2, tileset->tiles, numTiles * 32, offset, 0);
+ DecompressAndLoadBgGfxUsingHeap2(2, tileset->tiles, numTiles * 32, offset, 0);
}
}
diff --git a/src/fldeff_dig.c b/src/fldeff_dig.c
new file mode 100644
index 000000000..3a28c1adc
--- /dev/null
+++ b/src/fldeff_dig.c
@@ -0,0 +1,48 @@
+#include "global.h"
+#include "field_effect.h"
+#include "field_player_avatar.h"
+#include "fldeff.h"
+#include "item_use.h"
+#include "overworld.h"
+#include "party_menu.h"
+#include "sprite.h"
+#include "constants/map_objects.h"
+
+static void FieldCallback_Dig(void);
+static void sub_80C9AFC(void);
+
+bool8 SetUpFieldMove_Dig(void)
+{
+ if (CanUseEscapeRopeOnCurrMap() == TRUE)
+ {
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = FieldCallback_Dig;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void FieldCallback_Dig(void)
+{
+ Overworld_ResetStateAfterDigEscRope();
+ FieldEffectStart(FLDEFF_USE_DIG);
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+}
+
+bool8 FldEff_UseDig(void)
+{
+ u8 taskId = oei_task_add();
+
+ FLDEFF_SET_FUNC_TO_DATA(sub_80C9AFC);
+ SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);
+ return FALSE;
+}
+
+static void sub_80C9AFC(void)
+{
+ u8 taskId;
+
+ FieldEffectActiveListRemove(FLDEFF_USE_DIG);
+ taskId = CreateTask(sub_80A1C44, 8);
+ gTasks[taskId].data[0] = 0;
+}
diff --git a/src/fldeff_poison.c b/src/fldeff_poison.c
new file mode 100644
index 000000000..98f54b4d4
--- /dev/null
+++ b/src/fldeff_poison.c
@@ -0,0 +1,39 @@
+#include "global.h"
+#include "task.h"
+#include "bg.h"
+#include "sound.h"
+#include "constants/songs.h"
+
+static void Task_FieldPoisonEffect(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ data[1] += 1;
+ if (data[1] > 4)
+ data[0]++;
+ break;
+ case 1:
+ data[1] -= 1;
+ if (data[1] == 0)
+ data[0]++;
+ break;
+ case 2:
+ DestroyTask(taskId);
+ return;
+ }
+ AdjustBgMosaic((u8)(((u8)data[1] << 4) | (u8)data[1]), BG_MOSAIC_SET);
+}
+
+void FldEffPoison_Start(void)
+{
+ PlaySE(SE_DAUGI);
+ CreateTask(Task_FieldPoisonEffect, 80);
+}
+
+bool32 FldEffPoison_IsActive(void)
+{
+ return FuncIsActiveTask(Task_FieldPoisonEffect);
+}
diff --git a/src/fldeff_rocksmash.c b/src/fldeff_rocksmash.c
new file mode 100644
index 000000000..517f3479a
--- /dev/null
+++ b/src/fldeff_rocksmash.c
@@ -0,0 +1,137 @@
+#include "global.h"
+#include "global.fieldmap.h"
+#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 "field_map_obj.h"
+#include "constants/songs.h"
+#include "constants/map_objects.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 sub_80C9A10(void);
+static void sub_80C9A60(void);
+
+bool8 CheckObjectGraphicsInFrontOfPlayer(u8 graphicsId)
+{
+ u8 mapObjId;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);
+ gPlayerFacingPosition.height = PlayerGetZCoord();
+ mapObjId = GetFieldObjectIdByXYZ(gPlayerFacingPosition.x, gPlayerFacingPosition.y, gPlayerFacingPosition.height);
+ if (gMapObjects[mapObjId].graphicsId != graphicsId)
+ return FALSE;
+ gSpecialVar_LastTalked = gMapObjects[mapObjId].localId;
+ return TRUE;
+}
+
+u8 oei_task_add(void)
+{
+ GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);
+ return CreateTask(task08_080C9820, 8);
+}
+
+static void task08_080C9820(u8 taskId)
+{
+ u8 mapObjId;
+
+ ScriptContext2_Enable();
+ gPlayerAvatar.unk6 = TRUE;
+ mapObjId = gPlayerAvatar.mapObjectId;
+ if (!FieldObjectIsMovementOverridden(&gMapObjects[mapObjId])
+ || FieldObjectClearHeldMovementIfFinished(&gMapObjects[mapObjId]))
+ {
+ if (gMapHeader.mapType == MAP_TYPE_UNDERWATER)
+ {
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
+ gTasks[taskId].func = sub_80C98FC;
+ }
+ else
+ {
+ sub_805CB70();
+ FieldObjectSetHeldMovement(&gMapObjects[mapObjId], 0x45);
+ gTasks[taskId].func = sub_80C98B0;
+ }
+ }
+}
+
+static void sub_80C98B0(u8 taskId)
+{
+ if (FieldObjectCheckHeldMovementStatus(&gMapObjects[gPlayerAvatar.mapObjectId]) == TRUE)
+ {
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
+ gTasks[taskId].func = sub_80C98FC;
+ }
+}
+
+static void sub_80C98FC(u8 taskId)
+{
+ if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
+ {
+ gFieldEffectArguments[1] = GetPlayerFacingDirection();
+ if (gFieldEffectArguments[1] == 1)
+ gFieldEffectArguments[2] = 0;
+ if (gFieldEffectArguments[1] == 2)
+ gFieldEffectArguments[2] = 1;
+ if (gFieldEffectArguments[1] == 3)
+ gFieldEffectArguments[2] = 2;
+ if (gFieldEffectArguments[1] == 4)
+ gFieldEffectArguments[2] = 3;
+ EventObjectSetGraphicsId(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByCurrentState());
+ StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gFieldEffectArguments[2]);
+ FieldEffectActiveListRemove(6);
+ gTasks[taskId].func = sub_80C99A0;
+ }
+}
+
+static void sub_80C99A0(u8 taskId)
+{
+ FLDEFF_CALL_FUNC_IN_DATA();
+ gPlayerAvatar.unk6 = FALSE;
+ DestroyTask(taskId);
+}
+
+bool8 SetUpFieldMove_RockSmash(void)
+{
+ if (CheckObjectGraphicsInFrontOfPlayer(/*MAP_OBJ_GFX_BREAKABLE_ROCK*/0x60) == TRUE)
+ {
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = sub_80C9A10;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_80C9A10(void)
+{
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+ ScriptContext1_SetupScript(EventScript_FldEffRockSmash);
+}
+
+bool8 FldEff_UseRockSmash(void)
+{
+ u8 taskId = oei_task_add();
+
+ FLDEFF_SET_FUNC_TO_DATA(sub_80C9A60);
+ IncrementGameStat(GAME_STAT_USED_ROCK_SMASH);
+ return FALSE;
+}
+
+static void sub_80C9A60(void)
+{
+ PlaySE(SE_W145);
+ FieldEffectActiveListRemove(FLDEFF_USE_ROCK_SMASH);
+ EnableBothScriptContexts();
+}
diff --git a/src/fldeff_softboiled.c b/src/fldeff_softboiled.c
new file mode 100644
index 000000000..400a1d382
--- /dev/null
+++ b/src/fldeff_softboiled.c
@@ -0,0 +1,111 @@
+#include "global.h"
+#include "party_menu.h"
+#include "sound.h"
+#include "string_util.h"
+#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);
+static void sub_80E58A0(u8 taskId);
+static void sub_80E5934(u8 taskId);
+
+extern const u8 gUnknown_84169F8[];
+extern const u8 gUnknown_8416F27[];
+
+bool8 hm_prepare_dive_probably(void)
+{
+ u16 maxHp = GetMonData(&gPlayerParty[GetCursorSelectionMonId()], MON_DATA_MAX_HP);
+ u16 curHp = GetMonData(&gPlayerParty[GetCursorSelectionMonId()], MON_DATA_HP);
+
+ if (curHp > maxHp / 5)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_80E56DC(u8 taskId)
+{
+ gUnknown_203B0A0.unkB = 10;
+ gUnknown_203B0A0.unkA = gUnknown_203B0A0.unk9;
+ sub_811F818(GetCursorSelectionMonId(), 1);
+ sub_8121D0C(5);
+ gTasks[taskId].func = sub_811FB28;
+}
+
+void sub_80E5724(u8 taskId)
+{
+ u8 r8 = gUnknown_203B0A0.unk9;
+ u8 r5 = gUnknown_203B0A0.unkA;
+ u16 curHp;
+ s16 delta;
+
+ if (r5 > 6)
+ {
+ gUnknown_203B0A0.unkB = 0;
+ sub_8121D0C(0);
+ gTasks[taskId].func = sub_811FB28;
+ }
+ else
+ {
+ curHp = GetMonData(&gPlayerParty[r5], MON_DATA_HP);
+ if (curHp == 0 || r8 == r5 || GetMonData(&gPlayerParty[r5], MON_DATA_MAX_HP) == curHp)
+ {
+ sub_80E5934(taskId);
+ }
+ else
+ {
+ PlaySE(SE_KAIFUKU);
+ sub_8120760(taskId, r8, -1, GetMonData(&gPlayerParty[r8], MON_DATA_MAX_HP) / 5, sub_80E57E8);
+ }
+ }
+}
+
+static void sub_80E57E8(u8 taskId)
+{
+ PlaySE(SE_KAIFUKU);
+ sub_8120760(taskId, gUnknown_203B0A0.unkA, 1, GetMonData(&gPlayerParty[gUnknown_203B0A0.unk9], MON_DATA_MAX_HP) / 5, sub_80E583C);
+}
+
+static void sub_80E583C(u8 taskId)
+{
+ GetMonNickname(&gPlayerParty[gUnknown_203B0A0.unkA], gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gUnknown_8416F27);
+ sub_81202F8(gStringVar4, 0);
+ ScheduleBgCopyTilemapToVram(2);
+ gTasks[taskId].func = sub_80E58A0;
+}
+
+static void sub_80E58A0(u8 taskId)
+{
+ if (sub_8120370() != TRUE)
+ {
+ gUnknown_203B0A0.unkB = 0;
+ sub_811F818(gUnknown_203B0A0.unk9, 0);
+ gUnknown_203B0A0.unk9 = gUnknown_203B0A0.unkA;
+ sub_811F818(gUnknown_203B0A0.unkA, 1);
+ ClearStdWindowAndFrameToTransparent(6, 0);
+ ClearWindowTilemap(6);
+ sub_8121D0C(0);
+ gTasks[taskId].func = sub_811FB28;
+ }
+}
+
+static void sub_80E5900(u8 taskId)
+{
+ if (sub_8120370() != TRUE)
+ {
+ sub_8121D0C(5);
+ gTasks[taskId].func = sub_811FB28;
+ }
+}
+
+static void sub_80E5934(u8 taskId)
+{
+ PlaySE(SE_SELECT);
+ sub_81202F8(gUnknown_84169F8, 0);
+ ScheduleBgCopyTilemapToVram(2);
+ gTasks[taskId].func = sub_80E5900;
+}
diff --git a/src/fldeff_strength.c b/src/fldeff_strength.c
new file mode 100644
index 000000000..3f3254ade
--- /dev/null
+++ b/src/fldeff_strength.c
@@ -0,0 +1,47 @@
+#include "global.h"
+#include "field_player_avatar.h"
+#include "field_effect.h"
+#include "party_menu.h"
+#include "event_data.h"
+#include "script.h"
+#include "fldeff.h"
+#include "event_scripts.h"
+#include "constants/songs.h"
+#include "constants/map_objects.h"
+
+static void FldEff_UseStrength(void);
+static void sub_80D08A8(void);
+
+bool8 SetUpFieldMove_Strength(void)
+{
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) || CheckObjectGraphicsInFrontOfPlayer(/*MAP_OBJ_GFX_PUSHABLE_BOULDER*/0x61) != TRUE)
+ {
+ return FALSE;
+ }
+ else
+ {
+ gSpecialVar_Result = GetCursorSelectionMonId();
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = FldEff_UseStrength;
+ return TRUE;
+ }
+}
+static void FldEff_UseStrength(void)
+{
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+ ScriptContext1_SetupScript(EventScript_FldEffStrength);
+}
+
+bool8 sub_80D0860(void)
+{
+ u8 taskId = oei_task_add();
+ FLDEFF_SET_FUNC_TO_DATA(sub_80D08A8);
+ GetMonNickname(&gPlayerParty[gFieldEffectArguments[0]], gStringVar1);
+ return FALSE;
+}
+
+static void sub_80D08A8(void)
+{
+ FieldEffectActiveListRemove(FLDEFF_USE_STRENGTH);
+ EnableBothScriptContexts();
+}
diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c
new file mode 100644
index 000000000..aca56ef4c
--- /dev/null
+++ b/src/fldeff_sweetscent.c
@@ -0,0 +1,101 @@
+#include "global.h"
+#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 "wild_encounter.h"
+#include "constants/songs.h"
+
+static void FieldCallback_SweetScent(void);
+static void StartSweetScentFieldEffect(void);
+static void TrySweetScentEncounter(u8 taskId);
+static void FailSweetScentEncounter(u8 taskId);
+
+static void Unused_StartSweetscentFldeff(void)
+{
+ gUnknown_203B0A0.unk9 = 0;
+ FieldCallback_SweetScent();
+}
+
+bool8 SetUpFieldMove_SweetScent(void)
+{
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = FieldCallback_SweetScent;
+ return TRUE;
+}
+
+static void FieldCallback_SweetScent(void)
+{
+ FieldEffectStart(FLDEFF_SWEET_SCENT);
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+}
+
+bool8 FldEff_SweetScent(void)
+{
+ u8 taskId;
+
+ SetWeatherScreenFadeOut();
+ taskId = oei_task_add();
+ FLDEFF_SET_FUNC_TO_DATA(StartSweetScentFieldEffect);
+ return FALSE;
+}
+
+static void StartSweetScentFieldEffect(void)
+{
+ u8 taskId;
+
+ PlaySE(SE_W260);
+ gUnknown_203AAB0 = (u8 *)Alloc(0x400);
+ CpuFastSet(gPlttBufferUnfaded, gUnknown_203AAB0, 0x100);
+ CpuFastSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x100);
+ BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 0, 8, RGB(31, 0, 0));
+ taskId = CreateTask(TrySweetScentEncounter, 0);
+ gTasks[taskId].data[0] = 0;
+ FieldEffectActiveListRemove(FLDEFF_SWEET_SCENT);
+}
+
+static void TrySweetScentEncounter(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (!gPaletteFade.active)
+ {
+ if (data[0] == 64)
+ {
+ data[0] = 0;
+ if (SweetScentWildEncounter() == TRUE)
+ {
+ Free(gUnknown_203AAB0);
+ DestroyTask(taskId);
+ }
+ else
+ {
+ gTasks[taskId].func = FailSweetScentEncounter;
+ BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 8, 0, RGB(31, 0, 0));
+ }
+ }
+ else
+ {
+ data[0]++;
+ }
+ }
+}
+
+static void FailSweetScentEncounter(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ CpuFastSet(gUnknown_203AAB0, gPlttBufferUnfaded, 0x100);
+ sub_807B070();
+ Free(gUnknown_203AAB0);
+ ScriptContext1_SetupScript(EventScript_FailSweetScent);
+ DestroyTask(taskId);
+ }
+}
diff --git a/src/fldeff_teleport.c b/src/fldeff_teleport.c
index 74fad1110..a66a332bf 100644
--- a/src/fldeff_teleport.c
+++ b/src/fldeff_teleport.c
@@ -29,8 +29,7 @@ static void FieldCallback_Teleport(void)
bool8 FldEff_UseTeleport(void)
{
u8 taskId = oei_task_add();
- gTasks[taskId].data[8] = (u32)StartTeleportFieldEffect >> 16;
- gTasks[taskId].data[9] = (u32)StartTeleportFieldEffect;
+ FLDEFF_SET_FUNC_TO_DATA(StartTeleportFieldEffect);
SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);
return FALSE;
}
diff --git a/src/gpu_regs.c b/src/gpu_regs.c
index a7030732b..c1909ff32 100644
--- a/src/gpu_regs.c
+++ b/src/gpu_regs.c
@@ -10,9 +10,9 @@
static u8 sGpuRegBuffer[GPU_REG_BUF_SIZE];
static u8 sGpuRegWaitingList[GPU_REG_BUF_SIZE];
-static bool8 sGpuRegBufferLocked;
-static bool8 sShouldSyncRegIE;
-static u16 sRegIE;
+static volatile bool8 sGpuRegBufferLocked;
+static volatile bool8 sShouldSyncRegIE;
+static vu16 sRegIE;
static void CopyBufferedValueToGpuReg(u8 regOffset);
static void SyncRegIE(void);
diff --git a/src/help_system.c b/src/help_system.c
new file mode 100644
index 000000000..1fd43fffa
--- /dev/null
+++ b/src/help_system.c
@@ -0,0 +1,1202 @@
+#include "global.h"
+#include "decompress.h"
+#include "gpu_regs.h"
+#include "main.h"
+#include "m4a.h"
+#include "dma3.h"
+#include "help_system.h"
+#include "list_menu.h"
+#include "sound.h"
+#include "strings.h"
+#include "text.h"
+#include "blit.h"
+#include "event_data.h"
+#include "constants/songs.h"
+#include "constants/flags.h"
+
+extern u8 gGlyphInfo[];
+
+struct HelpSystemVideoState
+{
+ /*0x00*/ MainCallback savedVblankCb;
+ /*0x04*/ MainCallback savedHblankCb;
+ /*0x08*/ u16 savedDispCnt;
+ /*0x0a*/ u16 savedBg0Cnt;
+ /*0x0c*/ u16 savedBg0Hofs;
+ /*0x0e*/ u16 savedBg0Vofs;
+ /*0x10*/ u16 savedBldCnt;
+ /*0x12*/ struct TextColor savedTextColor;
+ /*0x15*/ u8 state;
+};
+
+static EWRAM_DATA u8 sMapTilesBackup[BG_CHAR_SIZE] = {0};
+EWRAM_DATA u8 gUnknown_203F174 = 0;
+EWRAM_DATA u8 gUnknown_203F175 = 0;
+static EWRAM_DATA u8 sDelayTimer = 0;
+static EWRAM_DATA u8 sInHelpSystem = 0;
+static EWRAM_DATA struct HelpSystemVideoState sVideoState = {0};
+EWRAM_DATA struct HelpSystemListMenu gHelpSystemListMenu = {0};
+EWRAM_DATA struct ListMenuItem gHelpSystemListMenuItems[52] = {0};
+
+static const u16 sTiles[] = INCBIN_U16("graphics/help_system/unk_8464008.4bpp");
+static const u16 sPals[] = INCBIN_U16("graphics/help_system/unk_8464008.gbapal");
+
+u8 RunHelpSystemCallback(void)
+{
+ s32 i;
+
+ switch (sVideoState.state)
+ {
+ case 0:
+ sInHelpSystem = 0;
+ if (gSaveBlock2Ptr->optionsButtonMode != OPTIONS_BUTTON_MODE_NORMAL)
+ return 0;
+ if (JOY_NEW(R_BUTTON) && gUnknown_203F175 == 1)
+ return 0;
+ if (JOY_NEW(L_BUTTON | R_BUTTON))
+ {
+ if (!sub_812B45C() || !gUnknown_3005ECC)
+ {
+ PlaySE(SE_HELP_PAGE);
+ return 0;
+ }
+ m4aMPlayStop(&gMPlayInfo_SE1);
+ m4aMPlayStop(&gMPlayInfo_SE2);
+ PlaySE(SE_HELP_OPEN);
+ if (!gUnknown_203F174)
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x80);
+ SaveCallbacks();
+ sInHelpSystem = 1;
+ sVideoState.state = 1;
+ }
+ break;
+ case 1:
+ SaveMapTiles();
+ SaveMapGPURegs();
+ SaveMapTextColors();
+ (*(vu16 *)PLTT) = sPals[15];
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ sVideoState.state = 2;
+ break;
+ case 2:
+ RequestDma3Fill(0, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, 0);
+ RequestDma3Copy(sPals, (void *)PLTT, sizeof(sPals), 0);
+ RequestDma3Copy(sTiles, gDecompressionBuffer + 0x3EE0, sizeof(sTiles), 0);
+ sVideoState.state = 3;
+ break;
+ case 3:
+ sub_813BCF4();
+ HelpSystem_FillPanel3();
+ HelpSystem_FillPanel2();
+ HelpSystem_PrintText_Row61(gString_Help);
+ sub_813BD14(1);
+ if (sub_812B40C() == TRUE)
+ sub_812BC54(&gHelpSystemListMenu, gHelpSystemListMenuItems);
+ else
+ sub_812BCA8(&gHelpSystemListMenu, gHelpSystemListMenuItems);
+ sub_813BE78(1);
+ sub_813BF50(1);
+ CommitTilemap();
+ sVideoState.state = 4;
+ break;
+ case 4:
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(3) | BGCNT_16COLOR | BGCNT_SCREENBASE(31));
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON);
+ sVideoState.state = 5;
+ break;
+ case 5:
+ if (!sub_812BB9C(&gHelpSystemListMenu, gHelpSystemListMenuItems))
+ {
+ PlaySE(SE_HELP_CLOSE);
+ sVideoState.state = 6;
+ }
+ break;
+ case 6:
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ RestoreMapTiles();
+ for (i = 0; i < 0x200; i += 2)
+ {
+ *((vu16 *)(PLTT + 0x000 + i)) = sPals[15];
+ *((vu16 *)(PLTT + 0x200 + i)) = sPals[15];
+ }
+ sVideoState.state = 7;
+ break;
+ case 7:
+ if (!gUnknown_203F174)
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
+ RestoreMapTextColors();
+ RestoreGPURegs();
+ sVideoState.state = 8;
+ break;
+ case 8:
+ RestoreCallbacks();
+ sInHelpSystem = 0;
+ sVideoState.state = 0;
+ break;
+ }
+ return sVideoState.state;
+}
+
+void SaveCallbacks(void)
+{
+ vu16 * dma;
+ sVideoState.savedVblankCb = gMain.vblankCallback;
+ sVideoState.savedHblankCb = gMain.hblankCallback;
+ gMain.vblankCallback = NULL;
+ gMain.hblankCallback = NULL;
+
+ dma = (void *)REG_ADDR_DMA0;
+ dma[5] &= ~(DMA_START_MASK | DMA_DREQ_ON | DMA_REPEAT);
+ dma[5] &= ~DMA_ENABLE;
+ dma[5];
+}
+
+void SaveMapGPURegs(void)
+{
+ sVideoState.savedDispCnt = GetGpuReg(REG_OFFSET_DISPCNT);
+ sVideoState.savedBg0Cnt = GetGpuReg(REG_OFFSET_BG0CNT);
+ sVideoState.savedBg0Hofs = GetGpuReg(REG_OFFSET_BG0HOFS);
+ sVideoState.savedBg0Vofs = GetGpuReg(REG_OFFSET_BG0VOFS);
+ sVideoState.savedBldCnt = GetGpuReg(REG_OFFSET_BLDCNT);
+}
+
+void SaveMapTiles(void)
+{
+ RequestDma3Copy((void *)BG_CHAR_ADDR(3), sMapTilesBackup, BG_CHAR_SIZE, 0);
+}
+
+void SaveMapTextColors(void)
+{
+ SaveTextColors(
+ &sVideoState.savedTextColor.fgColor,
+ &sVideoState.savedTextColor.bgColor,
+ &sVideoState.savedTextColor.shadowColor
+ );
+}
+
+void RestoreCallbacks(void)
+{
+ gMain.vblankCallback = sVideoState.savedVblankCb;
+ gMain.hblankCallback = sVideoState.savedHblankCb;
+}
+
+void RestoreGPURegs(void)
+{
+ SetGpuReg(REG_OFFSET_BLDCNT, sVideoState.savedBldCnt);
+ SetGpuReg(REG_OFFSET_BG0HOFS, sVideoState.savedBg0Hofs);
+ SetGpuReg(REG_OFFSET_BG0VOFS, sVideoState.savedBg0Vofs);
+ SetGpuReg(REG_OFFSET_BG0CNT, sVideoState.savedBg0Cnt);
+ SetGpuReg(REG_OFFSET_DISPCNT, sVideoState.savedDispCnt);
+}
+
+void RestoreMapTiles(void)
+{
+ RequestDma3Copy(sMapTilesBackup, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, 0);
+}
+
+void RestoreMapTextColors(void)
+{
+ RestoreTextColors(
+ &sVideoState.savedTextColor.fgColor,
+ &sVideoState.savedTextColor.bgColor,
+ &sVideoState.savedTextColor.shadowColor
+ );
+}
+
+void CommitTilemap(void)
+{
+ RequestDma3Copy(gDecompressionBuffer, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, 0);
+}
+
+void HS_DrawBgTilemapRect(u16 baseTile, u8 left, u8 top, u8 width, u8 height, u16 increment)
+{
+ u16 i, j;
+
+ for (i = top; i < top + height; i++)
+ {
+ for (j = left; j < left + width; j++)
+ {
+ *((u16 *)(gDecompressionBuffer + 0x3800 + 64 * i + 2 * j)) = baseTile;
+ baseTile += increment;
+ }
+ }
+
+ CommitTilemap();
+}
+
+void sub_813BCF4(void)
+{
+ HS_DrawBgTilemapRect(0x1FF, 0, 0, 30, 20, 0);
+}
+
+void sub_813BD14(u8 mode)
+{
+ switch (mode)
+ {
+ case 0:
+ HS_DrawBgTilemapRect(0x1FF, 1, 0, 7, 2, 0);
+ break;
+ case 1:
+ HS_DrawBgTilemapRect(0x1E8, 1, 0, 7, 2, 1);
+ break;
+ }
+}
+
+void sub_813BD5C(u8 mode)
+{
+ switch (mode)
+ {
+ case 0:
+ HS_DrawBgTilemapRect(0x1FF, 13, 0, 16, 2, 0);
+ break;
+ case 1:
+ HS_DrawBgTilemapRect(0x1A0, 13, 0, 16, 2, 1);
+ break;
+ }
+}
+
+void sub_813BDA4(u8 mode)
+{
+ switch (mode)
+ {
+ case 0:
+ HS_DrawBgTilemapRect(0x1FF, 2, 3, 26, 16, 0);
+ break;
+ case 1:
+ HS_DrawBgTilemapRect(0x000, 2, 3, 26, 16, 1);
+ break;
+ }
+}
+
+void sub_813BDE8(u8 mode)
+{
+ switch (mode)
+ {
+ case 0:
+ HS_DrawBgTilemapRect(0x1FF, 1, 3, 28, 16, 0);
+ break;
+ case 1:
+ HS_DrawBgTilemapRect(0x1FA, 1, 3, 28, 17, 0);
+ break;
+ }
+}
+
+void sub_813BE30(u8 mode)
+{
+ switch (mode)
+ {
+ case 0:
+ HS_DrawBgTilemapRect(0x1FF, 2, 14, 26, 5, 0);
+ break;
+ case 1:
+ HS_DrawBgTilemapRect(0x11E, 2, 14, 26, 5, 1);
+ break;
+ }
+}
+
+void sub_813BE78(u8 mode)
+{
+ switch (mode)
+ {
+ case 0:
+ HS_DrawBgTilemapRect(0x1FF, 1, 2, 28, 1, 0);
+ HS_DrawBgTilemapRect(0x1FF, 1, 19, 28, 1, 0);
+ break;
+ case 1:
+ HS_DrawBgTilemapRect(0x1F7, 1, 2, 28, 1, 0);
+ HS_DrawBgTilemapRect(0x1F8, 1, 19, 28, 1, 0);
+ break;
+ }
+}
+
+void sub_813BEE4(u8 mode)
+{
+ switch (mode)
+ {
+ case 0:
+ HS_DrawBgTilemapRect(0x1FF, 1, 2, 28, 1, 0);
+ HS_DrawBgTilemapRect(0x1FF, 1, 19, 28, 1, 0);
+ break;
+ case 1:
+ HS_DrawBgTilemapRect(0x1FB, 1, 2, 28, 1, 0);
+ HS_DrawBgTilemapRect(0x1FC, 1, 19, 28, 1, 0);
+ break;
+ }
+}
+
+void sub_813BF50(u8 mode)
+{
+ switch (mode)
+ {
+ case 0:
+ HS_DrawBgTilemapRect(0x1FF, 0, 0, 1, 20, 0);
+ HS_DrawBgTilemapRect(0x1FF, 29, 0, 1, 20, 0);
+ break;
+ case 1:
+ HS_DrawBgTilemapRect(0x1F9, 0, 0, 1, 20, 0);
+ HS_DrawBgTilemapRect(0x1F9, 29, 0, 1, 20, 0);
+ break;
+ }
+}
+
+void sub_813BFC0(u8 mode)
+{
+ switch (mode)
+ {
+ case 0:
+ HS_DrawBgTilemapRect(0x1FF, 1, 5, 28, 1, 0);
+ break;
+ case 1:
+ HS_DrawBgTilemapRect(0x1FC, 1, 5, 28, 1, 0);
+ break;
+ }
+}
+
+void sub_813C004(u8 a0, u8 mode)
+{
+ switch (mode)
+ {
+ case 0:
+ HS_DrawBgTilemapRect(0x1FF, 28, 3, 1, 1, 0);
+ HS_DrawBgTilemapRect(0x1FF, 28, 18, 1, 1, 0);
+ break;
+ case 1:
+ if (a0 == 0)
+ HS_DrawBgTilemapRect(0x1FE, 28, 3, 1, 1, 0);
+ else
+ HS_DrawBgTilemapRect(0x1FD, 28, 18, 1, 1, 0);
+ break;
+ }
+}
+
+#define HelpSystemHandleRenderGlyph(character) ({\
+ do {DecompressAndRenderGlyph(font, character, &srcBlit, &destBlit, dest, x, y, width, height);} while (0); font;\
+})
+
+#ifdef NONMATCHING
+void HelpSystemRenderText(u8 font, u8 * dest, const u8 * src, u8 x, u8 y, u8 width, u8 height)
+{
+ // font -> sp+24
+ // dest -> sp+28
+ // src -> r9
+ // x -> sp+34
+ // y -> r10
+ // width -> sp+2C
+ // height -> sp+30
+ struct Bitmap srcBlit;
+ struct Bitmap destBlit;
+ u8 i;
+ u8 orig_x = x;
+ s32 clearPixels;
+
+ while (1)
+ {
+ u16 curChar = *src++;
+ switch (curChar)
+ {
+ case EOS:
+ return;
+ case PLACEHOLDER_BEGIN:
+ curChar = *src++;
+ if (curChar == 1) {
+ for (i = 0; i < 10; i++)
+ {
+ if (gSaveBlock2Ptr->playerName[i] == EOS)
+ break;
+ HelpSystemHandleRenderGlyph(gSaveBlock2Ptr->playerName[i]);
+ x += gGlyphInfo[0x80];
+ }
+ }
+ else if (curChar == 2)
+ {
+ for (i = 0; ; i++)
+ {
+ if (FlagGet(FLAG_SYS_NOT_SOMEONES_PC) == TRUE)
+ {
+ if (gString_Bill[i] == EOS)
+ break;
+ HelpSystemHandleRenderGlyph(gString_Bill[i]);
+ }
+ else
+ {
+ if (gString_Someone[i] == EOS)
+ break;
+ HelpSystemHandleRenderGlyph(gString_Someone[i]);
+ }
+ x += gGlyphInfo[0x80];
+ }
+ }
+ break;
+ case CHAR_PROMPT_SCROLL:
+ case CHAR_PROMPT_CLEAR:
+ case CHAR_NEWLINE:
+ x = orig_x;
+ y += gGlyphInfo[0x81] + 1;
+ break;
+ case EXT_CTRL_CODE_BEGIN:
+ curChar = *src++;
+ switch (curChar)
+ {
+ case 4:
+ src++;
+ //fallthrough
+ case 11:
+ case 16:
+ src++;
+ //fallthrough
+ case 1:
+ case 2:
+ case 3:
+ case 5:
+ case 6:
+ case 8:
+ case 12:
+ case 13:
+ case 14:
+ src++;
+ break;
+ case 19:
+ clearPixels = *src + orig_x - x;
+ if (clearPixels > 0)
+ {
+ destBlit.pixels = dest;
+ destBlit.width = width * 8;
+ destBlit.height = height * 8;
+ FillBitmapRect4Bit(&destBlit, x, y, clearPixels, GetFontAttribute(font, 1), 0);
+ x += clearPixels;
+ }
+ src++;
+ break;
+ case 17:
+ case 18:
+ case 20:
+ src++;
+ break;
+ case 7:
+ case 9:
+ case 10:
+ case 15:
+ case 21:
+ case 22:
+ break;
+ }
+ break;
+ case CHAR_KEYPAD_ICON:
+ curChar = *src++;
+ srcBlit.pixels = (u8 *)gKeypadIconTiles + 0x20 * GetKeypadIconTileOffset(curChar);
+ srcBlit.width = 0x80;
+ srcBlit.height = 0x80;
+ destBlit.pixels = dest;
+ destBlit.width = width * 8;
+ destBlit.height = height * 8;
+ BlitBitmapRect4Bit(&srcBlit, &destBlit, 0, 0, x, y, GetKeypadIconWidth(curChar), GetKeypadIconHeight(curChar), 0);
+ x += GetKeypadIconWidth(curChar);
+ break;
+ case CHAR_EXTRA_EMOJI:
+ curChar = 0x100 | *src++;
+ //fallthrough
+ default:
+ if (curChar == CHAR_SPACE)
+ {
+ if (font == 0)
+ x += 5;
+ else
+ x += 4;
+ }
+ else
+ {
+ HelpSystemHandleRenderGlyph(curChar);
+ x += gGlyphInfo[0x80];
+ }
+ break;
+ }
+ }
+}
+#else
+NAKED
+void HelpSystemRenderText(u8 font, u8 * dest, const u8 * src, u8 x, u8 y, u8 width, u8 height)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r10\n"
+ "\tmov r6, r9\n"
+ "\tmov r5, r8\n"
+ "\tpush {r5-r7}\n"
+ "\tsub sp, 0x38\n"
+ "\tstr r1, [sp, 0x28]\n"
+ "\tmov r9, r2\n"
+ "\tldr r1, [sp, 0x58]\n"
+ "\tldr r2, [sp, 0x5C]\n"
+ "\tldr r4, [sp, 0x60]\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tstr r0, [sp, 0x24]\n"
+ "\tlsls r3, 24\n"
+ "\tlsrs r7, r3, 24\n"
+ "\tlsls r1, 24\n"
+ "\tlsrs r1, 24\n"
+ "\tmov r10, r1\n"
+ "\tlsls r2, 24\n"
+ "\tlsrs r2, 24\n"
+ "\tstr r2, [sp, 0x2C]\n"
+ "\tlsls r4, 24\n"
+ "\tlsrs r4, 24\n"
+ "\tstr r4, [sp, 0x30]\n"
+ "\tstr r7, [sp, 0x34]\n"
+ "_0813C0AC_masterLoop:\n"
+ "\tmov r0, r9\n"
+ "\tldrb r1, [r0]\n"
+ "\tmovs r2, 0x1\n"
+ "\tadd r9, r2\n"
+ "\tadds r0, r1, 0\n"
+ "\tsubs r0, 0xF8\n"
+ "\tcmp r0, 0x7\n"
+ "\tbls _0813C0BE\n"
+ "\tb _0813C358\n"
+ "_0813C0BE:\n"
+ "\tlsls r0, 2\n"
+ "\tldr r1, _0813C0C8 @ =_0813C0CC\n"
+ "\tadds r0, r1\n"
+ "\tldr r0, [r0]\n"
+ "\tmov pc, r0\n"
+ "\t.align 2, 0\n"
+ "_0813C0C8: .4byte _0813C0CC\n"
+ "\t.align 2, 0\n"
+ "_0813C0CC:\n"
+ "\t.4byte _0813C2D4\n"
+ "\t.4byte _0813C348\n"
+ "\t.4byte _0813C1E4\n"
+ "\t.4byte _0813C1E4\n"
+ "\t.4byte _0813C200\n"
+ "\t.4byte _0813C0EC\n"
+ "\t.4byte _0813C1E4\n"
+ "\t.4byte _0813C39C\n"
+ "_0813C0EC:\n"
+ "\tmov r0, r9\n"
+ "\tldrb r1, [r0]\n"
+ "\tmovs r2, 0x1\n"
+ "\tadd r9, r2\n"
+ "\tcmp r1, 0x1\n"
+ "\tbne _0813C154\n"
+ "\tmovs r4, 0\n"
+ "\tldr r0, _0813C14C @ =gSaveBlock2Ptr\n"
+ "\tldr r1, [r0]\n"
+ "\tldrb r1, [r1]\n"
+ "\tcmp r1, 0xFF\n"
+ "\tbeq _0813C0AC_masterLoop\n"
+ "\tldr r5, _0813C150 @ =gGlyphInfo + 0x80\n"
+ "_0813C106:\n"
+ "\tldr r0, [r0]\n"
+ "\tadds r0, r4\n"
+ "\tldrb r1, [r0]\n"
+ "\tldr r0, [sp, 0x28]\n"
+ "\tstr r0, [sp]\n"
+ "\tstr r7, [sp, 0x4]\n"
+ "\tmov r2, r10\n"
+ "\tstr r2, [sp, 0x8]\n"
+ "\tldr r0, [sp, 0x2C]\n"
+ "\tstr r0, [sp, 0xC]\n"
+ "\tldr r2, [sp, 0x30]\n"
+ "\tstr r2, [sp, 0x10]\n"
+ "\tldr r0, [sp, 0x24]\n"
+ "\tadd r2, sp, 0x14\n"
+ "\tadd r3, sp, 0x1C\n"
+ "\tbl DecompressAndRenderGlyph\n"
+ "\tldr r0, [sp, 0x24]\n"
+ "\tldrb r0, [r5]\n"
+ "\tadds r0, r7, r0\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r7, r0, 24\n"
+ "\tadds r0, r4, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r4, r0, 24\n"
+ "\tcmp r4, 0x9\n"
+ "\tbhi _0813C0AC_masterLoop\n"
+ "\tldr r0, _0813C14C @ =gSaveBlock2Ptr\n"
+ "\tldr r1, [r0]\n"
+ "\tadds r1, r4\n"
+ "\tldrb r1, [r1]\n"
+ "\tcmp r1, 0xFF\n"
+ "\tbne _0813C106\n"
+ "\tb _0813C0AC_masterLoop\n"
+ "\t.align 2, 0\n"
+ "_0813C14C: .4byte gSaveBlock2Ptr\n"
+ "_0813C150: .4byte gGlyphInfo + 0x80\n"
+ "_0813C154:\n"
+ "\tcmp r1, 0x2\n"
+ "\tbne _0813C0AC_masterLoop\n"
+ "\tmovs r4, 0\n"
+ "\tldr r5, _0813C160 @ =gGlyphInfo + 0x80\n"
+ "\tb _0813C1BC\n"
+ "\t.align 2, 0\n"
+ "_0813C160: .4byte gGlyphInfo + 0x80\n"
+ "_0813C164:\n"
+ "\tldrb r1, [r1]\n"
+ "\tldr r2, [sp, 0x28]\n"
+ "\tstr r2, [sp]\n"
+ "\tstr r7, [sp, 0x4]\n"
+ "\tmov r0, r10\n"
+ "\tstr r0, [sp, 0x8]\n"
+ "\tldr r2, [sp, 0x2C]\n"
+ "\tstr r2, [sp, 0xC]\n"
+ "\tldr r0, [sp, 0x30]\n"
+ "\tstr r0, [sp, 0x10]\n"
+ "\tldr r0, [sp, 0x24]\n"
+ "\tadd r2, sp, 0x14\n"
+ "\tadd r3, sp, 0x1C\n"
+ "\tbl DecompressAndRenderGlyph\n"
+ "\tb _0813C1AC\n"
+ "_0813C184:\n"
+ "\tldr r0, _0813C1D8 @ =gString_Someone\n"
+ "\tadds r1, r4, r0\n"
+ "\tldrb r0, [r1]\n"
+ "\tcmp r0, 0xFF\n"
+ "\tbeq _0813C0AC_masterLoop\n"
+ "\tadds r1, r0, 0\n"
+ "\tldr r2, [sp, 0x28]\n"
+ "\tstr r2, [sp]\n"
+ "\tstr r7, [sp, 0x4]\n"
+ "\tmov r0, r10\n"
+ "\tstr r0, [sp, 0x8]\n"
+ "\tldr r2, [sp, 0x2C]\n"
+ "\tstr r2, [sp, 0xC]\n"
+ "\tldr r0, [sp, 0x30]\n"
+ "\tstr r0, [sp, 0x10]\n"
+ "\tldr r0, [sp, 0x24]\n"
+ "\tadd r2, sp, 0x14\n"
+ "\tadd r3, sp, 0x1C\n"
+ "\tbl DecompressAndRenderGlyph\n"
+ "_0813C1AC:\n"
+ "\tldr r1, [sp, 0x24]\n"
+ "\tldrb r0, [r5]\n"
+ "\tadds r0, r7, r0\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r7, r0, 24\n"
+ "\tadds r0, r4, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r4, r0, 24\n"
+ "_0813C1BC:\n"
+ "\tldr r0, _0813C1DC @ =0x00000834\n"
+ "\tbl FlagGet\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _0813C184\n"
+ "\tldr r0, _0813C1E0 @ =gString_Bill\n"
+ "\tadds r1, r4, r0\n"
+ "\tldrb r0, [r1]\n"
+ "\tcmp r0, 0xFF\n"
+ "\tbne _0813C164\n"
+ "\tb _0813C0AC_masterLoop\n"
+ "\t.align 2, 0\n"
+ "_0813C1D8: .4byte gString_Someone\n"
+ "_0813C1DC: .4byte 0x00000834\n"
+ "_0813C1E0: .4byte gString_Bill\n"
+ "_0813C1E4:\n"
+ "\tldr r7, [sp, 0x34]\n"
+ "\tldr r1, _0813C1FC @ =gGlyphInfo\n"
+ "\tadds r1, 0x81\n"
+ "\tmov r0, r10\n"
+ "\tadds r0, 0x1\n"
+ "\tldrb r1, [r1]\n"
+ "\tadds r0, r1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tmov r10, r0\n"
+ "\tb _0813C0AC_masterLoop\n"
+ "\t.align 2, 0\n"
+ "_0813C1FC: .4byte gGlyphInfo\n"
+ "_0813C200:\n"
+ "\tmov r2, r9\n"
+ "\tldrb r1, [r2]\n"
+ "\tmovs r0, 0x1\n"
+ "\tadd r9, r0\n"
+ "\tsubs r0, r1, 0x1\n"
+ "\tcmp r0, 0x15\n"
+ "\tbls _0813C210\n"
+ "\tb _0813C0AC_masterLoop\n"
+ "_0813C210:\n"
+ "\tlsls r0, 2\n"
+ "\tldr r1, _0813C21C @ =_0813C220\n"
+ "\tadds r0, r1\n"
+ "\tldr r0, [r0]\n"
+ "\tmov pc, r0\n"
+ "\t.align 2, 0\n"
+ "_0813C21C: .4byte _0813C220\n"
+ "\t.align 2, 0\n"
+ "_0813C220:\n"
+ "\t.4byte _0813C2C8\n"
+ "\t.4byte _0813C2C8\n"
+ "\t.4byte _0813C2C8\n"
+ "\t.4byte _0813C278\n"
+ "\t.4byte _0813C2C8\n"
+ "\t.4byte _0813C2C8\n"
+ "\t.4byte _0813C0AC_masterLoop\n"
+ "\t.4byte _0813C2C8\n"
+ "\t.4byte _0813C0AC_masterLoop\n"
+ "\t.4byte _0813C0AC_masterLoop\n"
+ "\t.4byte _0813C27C\n"
+ "\t.4byte _0813C2C8\n"
+ "\t.4byte _0813C2C8\n"
+ "\t.4byte _0813C2C8\n"
+ "\t.4byte _0813C0AC_masterLoop\n"
+ "\t.4byte _0813C27C\n"
+ "\t.4byte _0813C2CE\n"
+ "\t.4byte _0813C2CE\n"
+ "\t.4byte _0813C282\n"
+ "\t.4byte _0813C2CE\n"
+ "\t.4byte _0813C0AC_masterLoop\n"
+ "\t.4byte _0813C0AC_masterLoop\n"
+ "_0813C278:\n"
+ "\tmovs r1, 0x1\n"
+ "\tadd r9, r1\n"
+ "_0813C27C:\n"
+ "\tmovs r2, 0x1\n"
+ "\tadd r9, r2\n"
+ "\tb _0813C2C8\n"
+ "_0813C282:\n"
+ "\tmov r2, r9\n"
+ "\tldrb r0, [r2]\n"
+ "\tldr r1, [sp, 0x34]\n"
+ "\tadds r0, r1\n"
+ "\tsubs r6, r0, r7\n"
+ "\tcmp r6, 0\n"
+ "\tble _0813C2C8\n"
+ "\tldr r2, [sp, 0x28]\n"
+ "\tstr r2, [sp, 0x1C]\n"
+ "\tldr r1, [sp, 0x2C]\n"
+ "\tlsls r0, r1, 3\n"
+ "\tadd r4, sp, 0x1C\n"
+ "\tmovs r5, 0\n"
+ "\tstrh r0, [r4, 0x4]\n"
+ "\tldr r2, [sp, 0x30]\n"
+ "\tlsls r0, r2, 3\n"
+ "\tstrh r0, [r4, 0x6]\n"
+ "\tldr r0, [sp, 0x24]\n"
+ "\tmovs r1, 0x1\n"
+ "\tbl GetFontAttribute\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tlsls r3, r6, 16\n"
+ "\tlsrs r3, 16\n"
+ "\tstr r0, [sp]\n"
+ "\tstr r5, [sp, 0x4]\n"
+ "\tadds r0, r4, 0\n"
+ "\tadds r1, r7, 0\n"
+ "\tmov r2, r10\n"
+ "\tbl FillBitmapRect4Bit\n"
+ "\tadds r0, r7, r6\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r7, r0, 24\n"
+ "_0813C2C8:\n"
+ "\tmovs r0, 0x1\n"
+ "\tadd r9, r0\n"
+ "\tb _0813C0AC_masterLoop\n"
+ "_0813C2CE:\n"
+ "\tmovs r1, 0x1\n"
+ "\tadd r9, r1\n"
+ "\tb _0813C0AC_masterLoop\n"
+ "_0813C2D4:\n"
+ "\tmov r2, r9\n"
+ "\tldrb r1, [r2]\n"
+ "\tmovs r0, 0x1\n"
+ "\tadd r9, r0\n"
+ "\tadds r6, r1, 0\n"
+ "\tadds r0, r6, 0\n"
+ "\tbl GetKeypadIconTileOffset\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 19\n"
+ "\tldr r1, _0813C344 @ =gKeypadIconTiles\n"
+ "\tadds r0, r1\n"
+ "\tstr r0, [sp, 0x14]\n"
+ "\tadd r1, sp, 0x14\n"
+ "\tmovs r2, 0\n"
+ "\tmov r8, r2\n"
+ "\tmovs r0, 0x80\n"
+ "\tstrh r0, [r1, 0x4]\n"
+ "\tstrh r0, [r1, 0x6]\n"
+ "\tldr r0, [sp, 0x28]\n"
+ "\tstr r0, [sp, 0x1C]\n"
+ "\tldr r1, [sp, 0x2C]\n"
+ "\tlsls r0, r1, 3\n"
+ "\tadd r5, sp, 0x1C\n"
+ "\tstrh r0, [r5, 0x4]\n"
+ "\tldr r2, [sp, 0x30]\n"
+ "\tlsls r0, r2, 3\n"
+ "\tstrh r0, [r5, 0x6]\n"
+ "\tadds r0, r6, 0\n"
+ "\tbl GetKeypadIconWidth\n"
+ "\tadds r4, r0, 0\n"
+ "\tlsls r4, 24\n"
+ "\tlsrs r4, 24\n"
+ "\tadds r0, r6, 0\n"
+ "\tbl GetKeypadIconHeight\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tstr r7, [sp]\n"
+ "\tmov r1, r10\n"
+ "\tstr r1, [sp, 0x4]\n"
+ "\tstr r4, [sp, 0x8]\n"
+ "\tstr r0, [sp, 0xC]\n"
+ "\tmov r2, r8\n"
+ "\tstr r2, [sp, 0x10]\n"
+ "\tadd r0, sp, 0x14\n"
+ "\tadds r1, r5, 0\n"
+ "\tmovs r2, 0\n"
+ "\tmovs r3, 0\n"
+ "\tbl BlitBitmapRect4Bit\n"
+ "\tadds r0, r6, 0\n"
+ "\tbl GetKeypadIconWidth\n"
+ "\tb _0813C38E\n"
+ "\t.align 2, 0\n"
+ "_0813C344: .4byte gKeypadIconTiles\n"
+ "_0813C348:\n"
+ "\tmov r0, r9\n"
+ "\tldrb r1, [r0]\n"
+ "\tmovs r2, 0x80\n"
+ "\tlsls r2, 1\n"
+ "\tadds r0, r2, 0\n"
+ "\torrs r1, r0\n"
+ "\tmovs r0, 0x1\n"
+ "\tadd r9, r0\n"
+ "_0813C358:\n"
+ "\tcmp r1, 0\n"
+ "\tbne _0813C36A\n"
+ "\tldr r1, [sp, 0x24]\n"
+ "\tcmp r1, 0\n"
+ "\tbne _0813C366\n"
+ "\tadds r0, r7, 0x5\n"
+ "\tb _0813C390\n"
+ "_0813C366:\n"
+ "\tadds r0, r7, 0x4\n"
+ "\tb _0813C390\n"
+ "_0813C36A:\n"
+ "\tadd r3, sp, 0x1C\n"
+ "\tldr r2, [sp, 0x28]\n"
+ "\tstr r2, [sp]\n"
+ "\tstr r7, [sp, 0x4]\n"
+ "\tmov r0, r10\n"
+ "\tstr r0, [sp, 0x8]\n"
+ "\tldr r2, [sp, 0x2C]\n"
+ "\tstr r2, [sp, 0xC]\n"
+ "\tldr r0, [sp, 0x30]\n"
+ "\tstr r0, [sp, 0x10]\n"
+ "\tldr r0, [sp, 0x24]\n"
+ "\tadd r2, sp, 0x14\n"
+ "\tbl DecompressAndRenderGlyph\n"
+ "\tldr r1, [sp, 0x24]\n"
+ "\tldr r0, _0813C398 @ =gGlyphInfo\n"
+ "\tadds r0, 0x80\n"
+ "\tldrb r0, [r0]\n"
+ "_0813C38E:\n"
+ "\tadds r0, r7, r0\n"
+ "_0813C390:\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r7, r0, 24\n"
+ "\tb _0813C0AC_masterLoop\n"
+ "\t.align 2, 0\n"
+ "_0813C398: .4byte gGlyphInfo\n"
+ "_0813C39C:\n"
+ "\tadd sp, 0x38\n"
+ "\tpop {r3-r5}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tmov r10, r5\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0");
+}
+#endif //NONMATCHING
+
+void DecompressAndRenderGlyph(u8 font, u16 glyph, struct Bitmap *srcBlit, struct Bitmap *destBlit, u8 *destBuffer, u8 x, u8 y, u8 width, u8 height)
+{
+ if (font == 0)
+ DecompressGlyphFont0(glyph, FALSE);
+ else if (font == 5)
+ DecompressGlyphFont5(glyph, FALSE);
+ else
+ DecompressGlyphFont2(glyph, FALSE);
+ srcBlit->pixels = gGlyphInfo;
+ srcBlit->width = 16;
+ srcBlit->height = 16;
+ destBlit->pixels = destBuffer;
+ destBlit->width = width * 8;
+ destBlit->height = height * 8;
+ BlitBitmapRect4Bit(srcBlit, destBlit, 0, 0, x, y, gGlyphInfo[0x80], gGlyphInfo[0x81], 0);
+}
+
+void HelpSystem_PrintText_Row61(const u8 * str)
+{
+ GenerateFontHalfRowLookupTable(1, 15, 2);
+ HelpSystemRenderText(5, gDecompressionBuffer + 0x3D00, str, 6, 2, 7, 2);
+}
+
+void HelpSystem_PrintTextRightAlign_Row52(const u8 * str)
+{
+ s32 left = 0x7C - GetStringWidth(0, str, 0);
+ GenerateFontHalfRowLookupTable(1, 15, 2);
+ HelpSystemRenderText(0, gDecompressionBuffer + 0x3400, str, left, 2, 16, 2);
+}
+
+void HelpSystem_PrintTextAt(const u8 * str, u8 x, u8 y)
+{
+ GenerateFontHalfRowLookupTable(1, 15, 2);
+ HelpSystemRenderText(2, gDecompressionBuffer + 0x0000, str, x, y, 26, 16);
+}
+
+void HelpSystem_PrintTwoStrings(const u8 * str1, const u8 * str2)
+{
+ CpuFill16(0xEEEE, gDecompressionBuffer + 0x0000, 0x3400);
+ GenerateFontHalfRowLookupTable(1, 14, 2);
+ HelpSystemRenderText(2, gDecompressionBuffer + 0x0000, str1, 0, 0, 26, 16);
+ HelpSystemRenderText(2, gDecompressionBuffer + 0x09C0, str2, 0, 0, 26, 13);
+}
+
+void HelpSystem_PrintText_813C584(const u8 * str)
+{
+ CpuFill16(0x1111, gDecompressionBuffer + 0x23C0, 0x1040);
+ GenerateFontHalfRowLookupTable(2, 1, 3);
+ HelpSystemRenderText(2, gDecompressionBuffer + 0x23C0, str, 2, 6, 26, 5);
+}
+
+void HelpSystem_FillPanel3(void)
+{
+ CpuFill16(0xFFFF, gDecompressionBuffer + 0x3D00, 0x1C0);
+}
+
+void HelpSystem_FillPanel2(void)
+{
+ CpuFill16(0xFFFF, gDecompressionBuffer + 0x3400, 0x400);
+}
+
+void HelpSystem_FillPanel1(void)
+{
+ CpuFill16(0xFFFF, gDecompressionBuffer + 0x0000, 0x3400);
+}
+
+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;
+ if (gHelpSystemListMenu.sub.totalItems < gHelpSystemListMenu.sub.maxShowed)
+ gHelpSystemListMenu.sub.maxShowed = gHelpSystemListMenu.sub.totalItems;
+ sub_813BDA4(0);
+ HelpSystem_FillPanel1();
+ PrintListMenuItems();
+ PlaceListMenuCursor();
+}
+
+void HelpSystem_SetInputDelay(u8 a0)
+{
+ sDelayTimer = a0;
+}
+
+s32 HelpSystem_GetMenuInput(void)
+{
+ if (sDelayTimer != 0)
+ {
+ sDelayTimer--;
+ return -1;
+ }
+ else if (JOY_NEW(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ return gHelpSystemListMenu.sub.items[gHelpSystemListMenu.field_0C + gHelpSystemListMenu.field_0D].index;
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ return -2;
+ }
+ else if (JOY_NEW(L_BUTTON | R_BUTTON))
+ {
+ return -6;
+ }
+ else if (JOY_REPT(DPAD_UP))
+ {
+ if (!MoveCursor(1, 0))
+ PlaySE(SE_SELECT);
+ return -4;
+ }
+ else if (JOY_REPT(DPAD_DOWN))
+ {
+ if (!MoveCursor(1, 1))
+ PlaySE(SE_SELECT);
+ return -5;
+ }
+ else if (JOY_REPT(DPAD_LEFT))
+ {
+ if (!MoveCursor(7, 0))
+ PlaySE(SE_SELECT);
+ return -4;
+ }
+ else if (JOY_REPT(DPAD_RIGHT))
+ {
+ if (!MoveCursor(7, 1))
+ PlaySE(SE_SELECT);
+ return -5;
+ }
+ else
+ return -1;
+}
+
+void sub_813C75C(void)
+{
+ u8 r6 = gHelpSystemListMenu.sub.totalItems - 7;
+ if (gHelpSystemListMenu.sub.totalItems > 7)
+ {
+ s32 r4 = gHelpSystemListMenu.field_0C + gHelpSystemListMenu.field_0D;
+ sub_813C004(0, 0);
+ if (r4 == 0)
+ sub_813C004(1, 1);
+ else if (gHelpSystemListMenu.field_0C == 0 && gHelpSystemListMenu.field_0D != 0)
+ sub_813C004(1, 1);
+ else if (gHelpSystemListMenu.field_0C == r6)
+ sub_813C004(0, 1);
+ else if (gHelpSystemListMenu.field_0C != 0)
+ {
+ sub_813C004(0, 1);
+ sub_813C004(1, 1);
+ }
+ }
+}
+
+void PrintListMenuItems(void)
+{
+ u8 glyphHeight = GetFontAttribute(2, 1) + 1;
+ s32 i;
+ s32 r5 = gHelpSystemListMenu.field_0C;
+
+ for (i = 0; i < gHelpSystemListMenu.sub.maxShowed; i++)
+ {
+ u8 x = gHelpSystemListMenu.sub.left + 8;
+ u8 y = gHelpSystemListMenu.sub.top + glyphHeight * i;
+ HelpSystem_PrintTextAt(gHelpSystemListMenu.sub.items[r5].label, x, y);
+ r5++;
+ }
+}
+
+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);
+}
+
+void sub_813C860(u8 i)
+{
+ u8 glyphHeight = GetFontAttribute(2, 1) + 1;
+ u8 x = gHelpSystemListMenu.sub.left;
+ u8 y = gHelpSystemListMenu.sub.top + i * glyphHeight;
+ HelpSystem_PrintTextAt(gString_HelpSystem_ClearTo8, x, y);
+}
+
+u8 TryMoveCursor1(u8 dirn)
+{
+ u16 r4;
+ if (dirn == 0)
+ {
+ if (gHelpSystemListMenu.sub.maxShowed == 1)
+ r4 = 0;
+ else
+ r4 = gHelpSystemListMenu.sub.maxShowed - (gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1)) - 1;
+ if (gHelpSystemListMenu.field_0C == 0)
+ {
+ if (gHelpSystemListMenu.field_0D != 0)
+ {
+ gHelpSystemListMenu.field_0D--;
+ return 1;
+ }
+ else
+ return 0;
+ }
+ if (gHelpSystemListMenu.field_0D > r4)
+ {
+ gHelpSystemListMenu.field_0D--;
+ return 1;
+ }
+ else
+ {
+ gHelpSystemListMenu.field_0C--;
+ return 2;
+ }
+ }
+ else
+ {
+ if (gHelpSystemListMenu.sub.maxShowed == 1)
+ r4 = 0;
+ else
+ r4 = gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1);
+ if (gHelpSystemListMenu.field_0C == gHelpSystemListMenu.sub.totalItems - gHelpSystemListMenu.sub.maxShowed)
+ {
+ if (gHelpSystemListMenu.field_0D < gHelpSystemListMenu.sub.maxShowed - 1)
+ {
+ gHelpSystemListMenu.field_0D++;
+ return 1;
+ }
+ else
+ return 0;
+ }
+ else if (gHelpSystemListMenu.field_0D < r4)
+ {
+ gHelpSystemListMenu.field_0D++;
+ return 1;
+ }
+ else
+ {
+ gHelpSystemListMenu.field_0C++;
+ return 2;
+ }
+ }
+}
+
+bool8 MoveCursor(u8 by, u8 dirn)
+{
+ u8 r7 = gHelpSystemListMenu.field_0D;
+ u8 flags = 0;
+ s32 i;
+ for (i = 0; i < by; i++)
+ flags |= TryMoveCursor1(dirn);
+
+ switch (flags)
+ {
+ case 0:
+ default:
+ // neither changed
+ return TRUE;
+ case 1:
+ // changed field_0D only
+ sub_813C860(r7);
+ PlaceListMenuCursor();
+ CommitTilemap();
+ break;
+ case 2:
+ case 3:
+ // changed field_0C
+ if (sub_812BF88() == TRUE)
+ {
+ HelpSystem_SetInputDelay(2);
+ HelpSystem_FillPanel1();
+ PrintListMenuItems();
+ PlaceListMenuCursor();
+ sub_812BDEC();
+ sub_813C75C();
+ }
+ else
+ {
+ sub_813BDA4(0);
+ HelpSystem_FillPanel1();
+ PrintListMenuItems();
+ PlaceListMenuCursor();
+ sub_813BDA4(1);
+ }
+ CommitTilemap();
+ break;
+ }
+ return FALSE;
+}
diff --git a/src/help_system_812B1E0.c b/src/help_system_812B1E0.c
new file mode 100644
index 000000000..98d6ce8be
--- /dev/null
+++ b/src/help_system_812B1E0.c
@@ -0,0 +1,1580 @@
+#include "global.h"
+#include "event_data.h"
+#include "event_scripts.h"
+#include "field_player_avatar.h"
+#include "help_system.h"
+#include "item.h"
+#include "link.h"
+#include "overworld.h"
+#include "pokedex.h"
+#include "quest_log.h"
+#include "save.h"
+#include "save_location.h"
+#include "sound.h"
+#include "strings.h"
+#include "constants/items.h"
+#include "constants/maps.h"
+#include "constants/songs.h"
+
+static EWRAM_DATA u16 gUnknown_203B0EC = 0;
+static EWRAM_DATA u8 gUnknown_203B0EE = 0;
+
+u8 gUnknown_3005E9C[4];
+u16 gUnknown_3005EA0;
+
+static bool32 sub_812B27C(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 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 u16 gUnknown_845C594[] = {
+ MAP_VIRIDIAN_CITY_MART,
+ MAP_PEWTER_CITY_MART,
+ MAP_CERULEAN_CITY_MART,
+ MAP_LAVENDER_TOWN_MART,
+ MAP_VERMILION_CITY_MART,
+ MAP_CELADON_CITY_DEPARTMENT_STORE_1F,
+ MAP_CELADON_CITY_DEPARTMENT_STORE_2F,
+ MAP_CELADON_CITY_DEPARTMENT_STORE_3F,
+ MAP_CELADON_CITY_DEPARTMENT_STORE_4F,
+ MAP_CELADON_CITY_DEPARTMENT_STORE_5F,
+ MAP_CELADON_CITY_DEPARTMENT_STORE_ROOF,
+ MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR,
+ MAP_FUCHSIA_CITY_MART,
+ MAP_CINNABAR_ISLAND_MART,
+ MAP_SAFFRON_CITY_MART,
+ MAP_THREE_ISLAND_MART,
+ MAP_FOUR_ISLAND_MART,
+ MAP_SEVEN_ISLAND_MART,
+ MAP_SIX_ISLAND_MART,
+ MAP_UNDEFINED
+};
+
+static const u16 gUnknown_845C5BC[] = {
+ MAP_PEWTER_CITY_GYM,
+ MAP_CERULEAN_CITY_GYM,
+ MAP_VERMILION_CITY_GYM,
+ MAP_CELADON_CITY_GYM,
+ MAP_FUCHSIA_CITY_GYM,
+ MAP_SAFFRON_CITY_GYM,
+ MAP_CINNABAR_ISLAND_GYM,
+ MAP_VIRIDIAN_CITY_GYM,
+ MAP_UNDEFINED
+};
+
+static const u8 gUnknown_845C5CE[][3] = {
+ { MAP_GROUP(VIRIDIAN_FOREST), MAP_NUM(VIRIDIAN_FOREST), 1 },
+ { MAP_GROUP(MT_MOON_1F), MAP_NUM(MT_MOON_1F), 3 },
+ { MAP_GROUP(ROCK_TUNNEL_1F), MAP_NUM(ROCK_TUNNEL_1F), 2 },
+ { MAP_GROUP(DIGLETTS_CAVE_NORTH_ENTRANCE), MAP_NUM(DIGLETTS_CAVE_NORTH_ENTRANCE), 3 },
+ { MAP_GROUP(SEAFOAM_ISLANDS_1F), MAP_NUM(SEAFOAM_ISLANDS_1F), 5 },
+ { MAP_GROUP(VICTORY_ROAD_1F), MAP_NUM(VICTORY_ROAD_1F), 3 },
+ { MAP_GROUP(CERULEAN_CAVE_1F), MAP_NUM(CERULEAN_CAVE_1F), 3 },
+ { MAP_GROUP(MT_EMBER_RUBY_PATH_B4F), MAP_NUM(MT_EMBER_RUBY_PATH_B4F), 1 },
+ { MAP_GROUP(MT_EMBER_SUMMIT_PATH_1F), MAP_NUM(MT_EMBER_SUMMIT_PATH_1F), 3 },
+ { MAP_GROUP(MT_EMBER_RUBY_PATH_B5F), MAP_NUM(MT_EMBER_RUBY_PATH_B5F), 7 },
+ { MAP_GROUP(THREE_ISLAND_BERRY_FOREST), MAP_NUM(THREE_ISLAND_BERRY_FOREST), 1 },
+ { MAP_GROUP(SIX_ISLAND_PATTERN_BUSH), MAP_NUM(SIX_ISLAND_PATTERN_BUSH), 1 },
+ { MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ENTRANCE), MAP_NUM(FIVE_ISLAND_LOST_CAVE_ENTRANCE), 15 },
+ { MAP_GROUP(FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE), MAP_NUM(FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE), 4 },
+ { MAP_GROUP(SIX_ISLAND_ALTERING_CAVE), MAP_NUM(SIX_ISLAND_ALTERING_CAVE), 1 },
+ { MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), 7 }
+};
+
+void sub_812B1E0(u8 a0)
+{
+ gUnknown_203B0EC = a0;
+}
+
+void HelpSystem_SetSomeVariable2(u8 a0)
+{
+ switch (gUnknown_203B0EC)
+ {
+ case 23:
+ case 24:
+ case 25:
+ case 26:
+ if (a0 == 9 || a0 == 5 || a0 == 6 || a0 == 7 || a0 == 8)
+ break;
+ // fallthrough
+ default:
+ gUnknown_203B0EC = a0;
+ break;
+ }
+}
+
+void sub_812B220(void)
+{
+ gUnknown_203B0EC = gSpecialVar_0x8004;
+}
+
+void sub_812B234(void)
+{
+ gUnknown_3005EA0 = gUnknown_203B0EC;
+}
+
+void sub_812B248(void)
+{
+ gUnknown_203B0EC = gUnknown_3005EA0;
+}
+
+static bool32 sub_812B25C(void)
+{
+ return sub_812B27C(gUnknown_845C594);
+}
+
+static bool32 sub_812B26C(void)
+{
+ return sub_812B27C(gUnknown_845C5BC);
+}
+
+static bool32 sub_812B27C(const u16 * mapIdxs)
+{
+ u16 mapIdx = (gSaveBlock1Ptr->location.mapGroup << 8) + gSaveBlock1Ptr->location.mapNum;
+ s32 i;
+
+ for (i = 0; mapIdxs[i] != MAP_UNDEFINED; i++)
+ {
+ if (mapIdxs[i] == mapIdx)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 sub_812B2C4(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < 16; i++)
+ {
+ for (j = 0; j < gUnknown_845C5CE[i][2]; j++)
+ {
+ if (
+ gUnknown_845C5CE[i][0] == gSaveBlock1Ptr->location.mapGroup
+ && gUnknown_845C5CE[i][1] + j == gSaveBlock1Ptr->location.mapNum
+ && (i != 15 || FlagGet(FLAG_0x849) == TRUE)
+ )
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+void sub_812B35C(void)
+{
+ sub_812B4B8();
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
+ HelpSystem_SetSomeVariable2(0x16);
+ else if (sub_812B2C4())
+ HelpSystem_SetSomeVariable2(0x15);
+ else if (is_light_level_8_or_9(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);
+ else if (IsCurMapPokeCenter() == TRUE)
+ HelpSystem_SetSomeVariable2(0x10);
+ else if (sub_812B25C() == TRUE)
+ HelpSystem_SetSomeVariable2(0x11);
+ else if (sub_812B26C() == TRUE)
+ HelpSystem_SetSomeVariable2(0x12);
+ else
+ HelpSystem_SetSomeVariable2(0x13);
+ }
+ else
+ HelpSystem_SetSomeVariable2(0x14);
+}
+
+bool8 sub_812B40C(void)
+{
+ if (gUnknown_203B0EE == 1)
+ return FALSE;
+
+ if (gSaveFileStatus != SAVE_STATUS_EMPTY && gSaveFileStatus != SAVE_STATUS_INVALID && FlagGet(FLAG_0x83C))
+ return FALSE;
+
+ FlagSet(FLAG_0x83C);
+ gUnknown_203B0EE = 1;
+ return TRUE;
+}
+
+bool8 sub_812B45C(void)
+{
+ if (gReceivedRemoteLinkPlayers == 1)
+ return FALSE;
+ return TRUE;
+}
+
+void sub_812B478(void)
+{
+ gUnknown_3005ECC = 0;
+}
+
+void sub_812B484(void)
+{
+ if (gUnknown_203ADFA != 2 && gUnknown_203ADFA != 3)
+ {
+ gUnknown_3005ECC = 1;
+ sub_812B4B8();
+ }
+}
+
+void sub_812B4AC(void)
+{
+ gUnknown_203F175 = 1;
+}
+
+void sub_812B4B8(void)
+{
+ gUnknown_203F175 = 0;
+}
+
+static void sub_812B4C4(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+{
+ a0->sub.items = a1;
+ a0->sub.totalItems = 1;
+ a0->sub.maxShowed = 1;
+ a0->sub.left = 1;
+ a0->sub.top = 4;
+}
+
+static void sub_812B4D8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+{
+ sub_812B4C4(a0, a1);
+ sub_812B520(a0, a1);
+ sub_812BF74(gUnknown_841DFAC);
+ HelpSystem_InitListMenuController(a0, 0, gUnknown_3005E9C[2]);
+ sub_812BF9C(a0, a1);
+ sub_813BDA4(1);
+ sub_813BD5C(1);
+}
+
+static void sub_812B520(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+{
+ u8 i;
+ u8 r4 = 0;
+ for (i = 0; i < 6; i++)
+ {
+ if (gUnknown_845C4B6[gUnknown_203B0EC][gUnknown_845C4B0[i]] == 1)
+ {
+ a1[r4].label = gUnknown_845B080[gUnknown_845C4B0[i]];
+ a1[r4].index = gUnknown_845C4B0[i];
+ r4++;
+ }
+ }
+ a1[r4 - 1].index = -2;
+ a0->sub.totalItems = r4;
+ a0->sub.maxShowed = r4;
+ a0->sub.left = 0;
+}
+
+static void sub_812B5A8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+{
+ 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);
+ sub_813BDA4(1);
+ sub_813BD5C(1);
+}
+
+static void sub_812B614(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+{
+ u8 r6 = 0;
+ const u8 * r3 = gUnknown_845B9E0[gUnknown_203B0EC * 5 + gUnknown_3005E9C[1]];
+ u8 i;
+ for (i = 0; r3[i] != 0xFF; i++)
+ {
+ if (sub_812B780(r3[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 (sub_812B754() == TRUE)
+ {
+ for (i = 0, r3 = gUnknown_845B9BE; r3[i] != 0xFF; i++)
+ {
+ a1[r6].label = gUnknown_845B3A0[r3[i]];
+ a1[r6].index = r3[i];
+ r6++;
+ }
+ }
+ 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;
+}
+
+static bool8 sub_812B754(void)
+{
+ if (FlagGet(FLAG_0x4B0) == TRUE && gUnknown_3005E9C[1] == 2)
+ return TRUE;
+ return FALSE;
+}
+
+static bool8 sub_812B780(u8 id)
+{
+ u8 i = 0;
+
+ if (gUnknown_3005E9C[1] == 0)
+ {
+ switch (id)
+ {
+ case 1:
+ case 2:
+ case 3:
+ case 5:
+ case 8:
+ case 34:
+ case 38:
+ case 41:
+ case 42:
+ case 43:
+ return TRUE;
+ case 4:
+ return FlagGet(FLAG_0x2CF);
+ case 6:
+ case 10:
+ case 16:
+ case 19:
+ case 22:
+ case 35:
+ case 36:
+ return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_CITY);
+ case 7:
+ return FlagGet(FLAG_WORLD_MAP_VERMILION_CITY);
+ case 11:
+ case 24:
+ return FlagGet(FLAG_0x8A4);
+ case 9:
+ case 13:
+ case 14:
+ case 15:
+ case 17:
+ case 18:
+ case 20:
+ case 26:
+ case 29:
+ case 31:
+ case 37:
+ return FlagGet(FLAG_0x828);
+ case 21:
+ case 23:
+ return FlagGet(FLAG_0x829);
+ case 12:
+ case 25:
+ case 27:
+ case 30:
+ case 32:
+ case 33:
+ return FlagGet(FLAG_UNK820);
+ case 28:
+ case 40:
+ return sub_812BB10();
+ case 39:
+ return FlagGet(FLAG_0x29B);
+ case 44:
+ return FlagGet(FLAG_WORLD_MAP_PEWTER_CITY);
+ }
+ return FALSE;
+ }
+ if (gUnknown_3005E9C[1] == 1)
+ {
+ 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:
+ return TRUE;
+ case 1:
+ case 30:
+ case 37:
+ return FlagGet(FLAG_0x829);
+ case 14:
+ 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:
+ return FlagGet(FLAG_0x828);
+ case 4:
+ case 34:
+ if (sub_8088EDC(1) > 1)
+ return TRUE;
+ return FALSE;
+ case 15:
+ return FlagGet(FLAG_UNK820);
+ case 16:
+ case 17:
+ return sub_812BB10();
+ case 18:
+ return FlagGet(FLAG_0x271);
+ case 48:
+ return FlagGet(FLAG_0x82C);
+ }
+ return FALSE;
+ }
+ if (gUnknown_3005E9C[1] == 2)
+ {
+ if (sub_812B754() == TRUE)
+ {
+ for (i = 0; gUnknown_845B9BE[i] != 0xFF; i++)
+ {
+ if (gUnknown_845B9BE[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:
+ 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:
+ return FlagGet(FLAG_0x828);
+ case 36:
+ case 37:
+ return sub_812BB10();
+ case 3:
+ case 15:
+ case 18:
+ case 39:
+ return FlagGet(FLAG_0x8A4);
+ }
+ return TRUE;
+ }
+ if (gUnknown_3005E9C[1] == 3)
+ {
+ switch (id)
+ {
+ case 5:
+ return FlagGet(FLAG_UNK820);
+ case 6:
+ return FlagGet(FLAG_0x821);
+ }
+ return TRUE;
+ }
+ if (gUnknown_3005E9C[1] == 4)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 sub_812BB10(void)
+{
+ if (FlagGet(FLAG_0x237) == TRUE)
+ return TRUE;
+ if (FlagGet(FLAG_0x238) == TRUE)
+ return TRUE;
+ if (FlagGet(FLAG_0x239) == TRUE)
+ return TRUE;
+ if (FlagGet(FLAG_0x23A) == TRUE)
+ return TRUE;
+ if (FlagGet(FLAG_0x23B) == TRUE)
+ return TRUE;
+ if (FlagGet(FLAG_0x2EF) == TRUE)
+ return TRUE;
+ if (FlagGet(FLAG_0x1F1) == TRUE)
+ return TRUE;
+ return FALSE;
+}
+
+bool8 sub_812BB9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+{
+ switch (a0->field_0E)
+ {
+ case 8:
+ return sub_812BC54(a0, a1);
+ case 9:
+ return sub_812BC80(a0, a1);
+ case 10:
+ return sub_812BCA8(a0, a1);
+ case 0:
+ return sub_812BCD0(a0, a1);
+ case 1:
+ return sub_812BD2C(a0, a1);
+ case 2:
+ return sub_812BD64(a0, a1);
+ case 3:
+ return sub_812BD98(a0, a1);
+ case 4:
+ return sub_812BE10(a0, a1);
+ case 5:
+ return sub_812BEEC(a0, a1);
+ case 6:
+ return sub_812BF18(a0, a1);
+ }
+ return FALSE;
+}
+
+bool8 sub_812BC54(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+{
+ sub_812BF74(gUnknown_841DFA5);
+ sub_812BF5C();
+ sub_813BDA4(1);
+ sub_813BD5C(1);
+ a0->field_0E = 9;
+ return TRUE;
+}
+
+bool8 sub_812BC80(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+{
+ if (JOY_NEW(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ a0->field_0E = 10;
+ }
+ return TRUE;
+}
+
+bool8 sub_812BCA8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+{
+ gUnknown_3005E9C[2] = 0;
+ sub_812BF94(a0);
+ sub_812B4D8(a0, a1);
+ a0->field_0E = 0;
+ return TRUE;
+}
+
+bool8 sub_812BCD0(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+{
+ s32 v0 = HelpSystem_GetMenuInput();
+ switch (v0)
+ {
+ case -6:
+ case -2:
+ return FALSE;
+ case -5:
+ case -4:
+ sub_812BF9C(a0, a1);
+ break;
+ case -3:
+ case -1:
+ break;
+ default:
+ gUnknown_3005E9C[1] = v0;
+ a0->field_0E = 1;
+ break;
+ }
+ return TRUE;
+}
+
+bool8 sub_812BD2C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+{
+ gUnknown_3005E9C[0] = 1;
+ gUnknown_3005E9C[2] = a0->field_0D;
+ sub_812BF94(a0);
+ sub_812B5A8(a0, a1);
+ sub_813C75C();
+ HelpSystem_SetInputDelay(2);
+ a0->field_0E = 3;
+ return TRUE;
+}
+
+bool8 sub_812BD64(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+{
+ sub_813C004(0, 0);
+ sub_813C004(1, 0);
+ gUnknown_3005E9C[0] = 0;
+ sub_812B4D8(a0, a1);
+ a0->field_0E = 0;
+ return TRUE;
+}
+
+bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+{
+ s32 v0 = HelpSystem_GetMenuInput();
+ switch (v0)
+ {
+ case -6:
+ return FALSE;
+ case -2:
+ a0->field_0E = 2;
+ break;
+ case -5:
+ case -4:
+ case -3:
+ case -1:
+ break;
+ default:
+ gUnknown_3005E9C[3] = v0;
+ a0->field_0E = 4;
+ break;
+ }
+ return TRUE;
+}
+
+void sub_812BDEC(void)
+{
+ HelpSystem_PrintTextAt(gUnknown_845B080[gUnknown_3005E9C[1]], 0, 0);
+}
+
+bool8 sub_812BE10(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+{
+ gUnknown_3005E9C[0] = 2;
+ sub_813BDA4(0);
+ HelpSystem_FillPanel1();
+ sub_812BF74(gUnknown_841DFBE);
+ sub_813BDE8(1);
+ sub_813BEE4(1);
+
+ if (gUnknown_3005E9C[1] == 0)
+ {
+ HelpSystem_PrintTwoStrings(gUnknown_845B0B0[gUnknown_3005E9C[3]], gUnknown_845B164[gUnknown_3005E9C[3]]);
+ }
+ else if (gUnknown_3005E9C[1] == 1)
+ {
+ HelpSystem_PrintTwoStrings(gUnknown_845B218[gUnknown_3005E9C[3]], gUnknown_845B2DC[gUnknown_3005E9C[3]]);
+ }
+ else if (gUnknown_3005E9C[1] == 2)
+ {
+ HelpSystem_PrintTwoStrings(gUnknown_845B3A0[gUnknown_3005E9C[3]], gUnknown_845B450[gUnknown_3005E9C[3]]);
+ }
+ else if (gUnknown_3005E9C[1] == 3)
+ {
+ HelpSystem_PrintTwoStrings(gUnknown_845B500[gUnknown_3005E9C[3]], gUnknown_845B520[gUnknown_3005E9C[3]]);
+ }
+ else
+ {
+ HelpSystem_PrintTwoStrings(gUnknown_845B540[gUnknown_3005E9C[3]], gUnknown_845B5D0[gUnknown_3005E9C[3]]);
+ }
+ sub_813BDA4(1);
+ sub_813BD5C(1);
+ a0->field_0E = 6;
+ return TRUE;
+}
+
+bool8 sub_812BEEC(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+{
+ gUnknown_3005E9C[0] = 1;
+ sub_812B5A8(a0, a1);
+ sub_813C75C();
+ HelpSystem_SetInputDelay(2);
+ a0->field_0E = 3;
+ return TRUE;
+}
+
+bool8 sub_812BF18(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+{
+ if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ a0->field_0E = 5;
+ return TRUE;
+ }
+ if (JOY_NEW(L_BUTTON | R_BUTTON))
+ return FALSE;
+ return TRUE;
+}
+
+static void sub_812BF5C(void)
+{
+ HelpSystem_FillPanel1();
+ HelpSystem_PrintTextAt(gUnknown_81B2FC9, 0, 0);
+}
+
+static void sub_812BF74(const u8 * str)
+{
+ HelpSystem_FillPanel2();
+ HelpSystem_PrintTextRightAlign_Row52(str);
+}
+
+u8 sub_812BF88(void)
+{
+ return gUnknown_3005E9C[0];
+}
+
+static void sub_812BF94(struct HelpSystemListMenu * a0)
+{
+ a0->field_0C = 0;
+ a0->field_0D = 0;
+}
+
+static void sub_812BF9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
+{
+ s32 index = a1[a0->field_0C + a0->field_0D].index;
+ if (index == -2)
+ HelpSystem_PrintText_813C584(gUnknown_845B098[5]);
+ else
+ HelpSystem_PrintText_813C584(gUnknown_845B098[index]);
+ sub_813BE30(1);
+}
diff --git a/src/hof_pc.c b/src/hof_pc.c
new file mode 100644
index 000000000..241fbc4f3
--- /dev/null
+++ b/src/hof_pc.c
@@ -0,0 +1,53 @@
+#include "global.h"
+#include "hall_of_fame.h"
+#include "palette.h"
+#include "overworld.h"
+#include "script.h"
+#include "script_menu.h"
+#include "task.h"
+#include "hall_of_fame.h"
+#include "bg.h"
+#include "window.h"
+
+static void ReshowPCMenuAfterHallOfFamePC(void);
+static void Task_WaitForPaletteFade(u8 taskId);
+
+static void Task_WaitFadeAndSetCallback(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ FreeAllWindowBuffers();
+ ResetBgsAndClearDma3BusyFlags(0);
+ DestroyTask(taskId);
+ SetMainCallback2(sub_80F2978);
+ }
+}
+
+void HallOfFamePCBeginFade(void)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
+ ScriptContext2_Enable();
+ CreateTask(Task_WaitFadeAndSetCallback, 0);
+}
+
+void ReturnFromHallOfFamePC(void)
+{
+ SetMainCallback2(CB2_ReturnToField);
+ gFieldCallback = ReshowPCMenuAfterHallOfFamePC;
+}
+
+static void ReshowPCMenuAfterHallOfFamePC(void)
+{
+ ScriptContext2_Enable();
+ Overworld_PlaySpecialMapMusic();
+ ScrSpecial_CreatePCMenu();
+ ScriptMenu_DisplayPCStartupPrompt();
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
+ CreateTask(Task_WaitForPaletteFade, 10);
+}
+
+static void Task_WaitForPaletteFade(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ DestroyTask(taskId);
+}
diff --git a/src/intro.c b/src/intro.c
new file mode 100644
index 000000000..bb7242f2f
--- /dev/null
+++ b/src/intro.c
@@ -0,0 +1,2175 @@
+#include "global.h"
+#include "m4a.h"
+#include "malloc.h"
+#include "bg.h"
+#include "palette.h"
+#include "main.h"
+#include "gpu_regs.h"
+#include "task.h"
+#include "scanline_effect.h"
+#include "libgcnmultiboot.h"
+#include "new_menu_helpers.h"
+#include "link.h"
+#include "menu.h"
+#include "save.h"
+#include "sound.h"
+#include "new_game.h"
+#include "title_screen.h"
+#include "decompress.h"
+#include "util.h"
+#include "trig.h"
+#include "constants/songs.h"
+#include "constants/species.h"
+
+struct IntroSequenceData
+{
+ void (*field_0000)(struct IntroSequenceData *);
+ u8 field_0004;
+ u8 field_0005;
+ u8 field_0006;
+ u16 field_0008;
+ u16 field_000A;
+ u8 filler_000C[6];
+ u16 field_0012;
+ struct Sprite * field_0014;
+ struct Sprite * field_0018;
+ struct Sprite * field_001C;
+ struct Sprite * field_0020;
+ struct Sprite * field_0024;
+ struct Sprite * field_0028[4];
+ u8 filler_0038[0x4];
+ u8 field_003C[0x400];
+ u8 field_043C[0x400];
+ u8 filler_083C[0x2080];
+}; // size: 0x28BC
+
+static EWRAM_DATA struct GcmbStruct gUnknown_203AAD4 = {0};
+static EWRAM_DATA u16 gUnknown_203AB00 = 0;
+static EWRAM_DATA u16 gUnknown_203AB02 = 0;
+static EWRAM_DATA u16 gUnknown_203AB04 = 0;
+static EWRAM_DATA u16 gUnknown_203AB06 = 0;
+static EWRAM_DATA u16 gUnknown_203AB08 = 0;
+static EWRAM_DATA u16 gUnknown_203AB0A = 0;
+static EWRAM_DATA u16 gUnknown_203AB0C = 0;
+static EWRAM_DATA u16 gUnknown_203AB0E = 0;
+static EWRAM_DATA u16 gUnknown_203AB10 = 0;
+static EWRAM_DATA u16 gUnknown_203AB12 = 0;
+static EWRAM_DATA u16 gUnknown_203AB14 = 0;
+static EWRAM_DATA u16 gUnknown_203AB16 = 0;
+static EWRAM_DATA u16 gUnknown_203AB18 = 0;
+static EWRAM_DATA u16 gUnknown_203AB1A = 0;
+static EWRAM_DATA u16 gUnknown_203AB1C = 0;
+static EWRAM_DATA u16 gUnknown_203AB1E = 0;
+static EWRAM_DATA u16 gUnknown_203AB20 = 0;
+static EWRAM_DATA u16 gUnknown_203AB22 = 0;
+static EWRAM_DATA u16 gUnknown_203AB24 = 0;
+static EWRAM_DATA u16 gUnknown_203AB26 = 0;
+static EWRAM_DATA u32 gUnknown_203AB28 = 0;
+static EWRAM_DATA s16 gUnknown_203AB2C = 0;
+static EWRAM_DATA u16 gUnknown_203AB2E = 0;
+static EWRAM_DATA u32 gUnknown_203AB30 = 0;
+
+static void sub_80EC870(void);
+static void sub_80EC9D4(void);
+static void sub_80EC9EC(void);
+static void sub_80ECA00(void);
+static void sub_80ECA70(void);
+static void sub_80ECAB0(u8 taskId);
+static void sub_80ECAA8(struct IntroSequenceData * ptr, void (*cb)(struct IntroSequenceData *));
+static void sub_80ECAF0(struct IntroSequenceData * ptr);
+static void sub_80ECB98(struct IntroSequenceData * ptr);
+static void sub_80ECC3C(struct IntroSequenceData * ptr);
+static void sub_80ECCA8(struct IntroSequenceData * ptr);
+static void sub_80ECD60(struct IntroSequenceData * ptr);
+static void sub_80ECEA4(struct IntroSequenceData * ptr);
+static void sub_80ED0AC(u8 taskId);
+static void sub_80ED118(void);
+static void sub_80ED140(u8 taskId);
+static void sub_80ED188(struct IntroSequenceData * ptr);
+static void sub_80ED40C(u8 taskId);
+static void sub_80ED428(u8 taskId);
+static void sub_80ED444(struct IntroSequenceData * ptr);
+static void sub_80ED4A0(struct IntroSequenceData * ptr);
+static void sub_80ED4C0(struct IntroSequenceData * ptr);
+static void sub_80ED6D8(void);
+static void sub_80ED714(u8 taskId);
+static void sub_80ED7D4(struct IntroSequenceData * ptr);
+static void sub_80ED818(struct Sprite * sprite);
+static void sub_80ED898(struct IntroSequenceData * ptr);
+static void sub_80EDAF0(struct IntroSequenceData * ptr);
+static void sub_80EDB70(struct IntroSequenceData * ptr);
+static void sub_80EDBAC(struct IntroSequenceData * ptr);
+static void sub_80EDBE8(struct IntroSequenceData * ptr);
+static void sub_80EDC40(void);
+static void sub_80EDDF0(void);
+static void sub_80EDE04(u8 taskId);
+static void sub_80EDED8(void);
+static void sub_80EDEEC(u8 taskId);
+static struct Sprite * sub_80EDF68(void);
+static void sub_80EDF94(struct IntroSequenceData * ptr);
+static void sub_80EE024(u8 taskId);
+static void sub_80EE160(void);
+static void sub_80EE1C4(struct Sprite * sprite);
+static void sub_80EE200(u8 taskId);
+static void sub_80EE29C(struct Sprite * sprite);
+static void sub_80EE350(struct Sprite * sprite);
+static void sub_80EE40C(struct Sprite * sprite);
+static void sub_80EE4DC(struct Sprite * sprite);
+static void sub_80EE4F8(struct IntroSequenceData * ptr);
+static void sub_80EE528(struct Sprite * sprite, s16 a1, s16 a2, u16 a3);
+static void sub_80EE580(struct Sprite * sprite);
+static bool32 sub_80EE5C8(struct IntroSequenceData * ptr);
+static void sub_80EE5E4(struct IntroSequenceData * ptr);
+static void sub_80EE610(struct Sprite * sprite);
+static void sub_80EE6A4(struct IntroSequenceData * ptr);
+static void sub_80EE704(struct Sprite * sprite);
+static bool8 sub_80EE850(struct IntroSequenceData * ptr);
+static void sub_80EE864(s16 a1, s16 a2, s16 a3);
+static void sub_80EE8E4(struct Sprite * sprite);
+static void sub_80EE970(struct Sprite * sprite, u16 a1, s16 a2, u8 a3);
+static void sub_80EE9D4(struct Sprite * sprite);
+static void sub_80EEA94(struct IntroSequenceData * ptr);
+static void sub_80EEB08(struct Sprite * sprite);
+static void sub_80EEBE4(void);
+
+extern const u32 gMultiBootProgram_PokemonColosseum_Start[];
+
+static const u16 gUnknown_8402260[] = INCBIN_U16("graphics/intro/unk_8402260.gbapal");
+static const u8 gUnknown_8402280[] = INCBIN_U8("graphics/intro/unk_8402280.4bpp.lz");
+static const u8 gUnknown_84024E4[] = INCBIN_U8("graphics/intro/unk_84024E4.bin.lz");
+static const u16 gUnknown_8402630[] = INCBIN_U16("graphics/intro/unk_8402630.gbapal");
+static const u8 gUnknown_8402650[] = INCBIN_U8("graphics/intro/unk_8402650.4bpp.lz");
+static const u8 gUnknown_8402668[] = INCBIN_U8("graphics/intro/unk_8402668.bin.lz");
+static const u16 gUnknown_840270C[] = INCBIN_U16("graphics/intro/unk_840270C.gbapal");
+static const u8 gUnknown_840272C[] = INCBIN_U8("graphics/intro/unk_840272C.4bpp.lz");
+static const u32 gUnknown_84028F8[] = INCBIN_U32("graphics/intro/unk_84028F8.bin.lz");
+static const u16 gUnknown_8402A44[] = INCBIN_U16("graphics/intro/unk_8402A64.gbapal");
+static const u32 gUnknown_8402A64[] = INCBIN_U32("graphics/intro/unk_8402A64.4bpp.lz");
+static const u16 gUnknown_8402ABC[] = INCBIN_U16("graphics/intro/unk_8402ADC.gbapal");
+static const u32 gUnknown_8402ADC[] = INCBIN_U32("graphics/intro/unk_8402ADC.4bpp.lz");
+static const u32 gUnknown_8402B2C[] = INCBIN_U32("graphics/intro/unk_8402B2C.4bpp.lz");
+static const u32 gUnknown_8402CD4[] = INCBIN_U32("graphics/intro/unk_8402CD4.4bpp.lz");
+static const u16 gUnknown_8402D34[] = INCBIN_U16("graphics/intro/unk_8402D34.gbapal");
+static const u8 gUnknown_8402D54[] = INCBIN_U8("graphics/intro/unk_8402D54.4bpp.lz");
+static const u8 gUnknown_8403FE8[] = INCBIN_U8("graphics/intro/unk_8403FE8.bin.lz");
+static const u16 gUnknown_84048CC[] = INCBIN_U16("graphics/intro/unk_84048CC.gbapal");
+static const u8 gUnknown_84048EC[] = INCBIN_U8("graphics/intro/unk_84048EC.4bpp.lz");
+static const u8 gUnknown_8404F7C[] = INCBIN_U8("graphics/intro/unk_8404F7C.bin.lz");
+static const u16 gUnknown_84053B4[] = INCBIN_U16("graphics/intro/unk_84053B4.gbapal");
+static const u8 gUnknown_8405414[] = INCBIN_U8("graphics/intro/unk_8405414.4bpp.lz");
+static const u8 gUnknown_8405890[] = INCBIN_U8("graphics/intro/unk_8405890.bin.lz");
+static const u16 gUnknown_8405B08[] = INCBIN_U16("graphics/intro/unk_8405B08.gbapal");
+static const u8 gUnknown_8405B28[] = INCBIN_U8("graphics/intro/unk_8405B28.4bpp.lz");
+static const u8 gUnknown_8405CDC[] = INCBIN_U8("graphics/intro/unk_8405CDC.bin.lz");
+static const u16 gUnknown_8405DA4[] = INCBIN_U16("graphics/intro/unk_8405DA4.gbapal");
+static const u8 gUnknown_8405DC4[] = INCBIN_U8("graphics/intro/unk_8405DC4.4bpp.lz");
+static const u8 gUnknown_840644C[] = INCBIN_U8("graphics/intro/unk_840644C.bin.lz");
+static const u16 gUnknown_8406634[] = INCBIN_U16("graphics/intro/unk_8406634.gbapal");
+static const u8 gUnknown_8406654[] = INCBIN_U8("graphics/intro/unk_8406654.4bpp.lz");
+static const u8 gUnknown_84071D0[] = INCBIN_U8("graphics/intro/unk_84071D0.bin.lz");
+static const u16 gUnknown_8407430[] = INCBIN_U16("graphics/intro/unk_8407430.gbapal");
+static const u8 gUnknown_8407470[] = INCBIN_U8("graphics/intro/unk_8407470.4bpp.lz");
+static const u8 gUnknown_8407A50[] = INCBIN_U8("graphics/intro/unk_8407A50.bin.lz");
+static const u8 gUnknown_8407B9C[] = INCBIN_U8("graphics/intro/unk_8407B9C.4bpp.lz");
+static const u8 gUnknown_8408D98[] = INCBIN_U8("graphics/intro/unk_8408D98.bin.lz");
+static const u32 gUnknown_840926C[] = INCBIN_U32("graphics/intro/unk_840926C.4bpp.lz");
+static const u16 gUnknown_84096AC[] = INCBIN_U16("graphics/intro/unk_84096AC.gbapal");
+static const u32 gUnknown_84096CC[] = INCBIN_U32("graphics/intro/unk_84096CC.4bpp.lz");
+static const u16 gUnknown_8409A1C[] = INCBIN_U16("graphics/intro/unk_8409A1C.gbapal");
+static const u32 gUnknown_8409A3C[] = INCBIN_U32("graphics/intro/unk_8409A3C.4bpp.lz");
+static const u32 gUnknown_8409D20[] = INCBIN_U32("graphics/intro/unk_8409D20.4bpp.lz");
+static const u32 gUnknown_840A3E4[] = INCBIN_U32("graphics/intro/unk_840A3E4.4bpp.lz");
+static const u16 gUnknown_840B834[] = INCBIN_U16("graphics/intro/unk_840B834.gbapal");
+static const u16 gUnknown_840B854[] = INCBIN_U16("graphics/intro/unk_840B854.gbapal");
+static const u32 gUnknown_840B874[] = INCBIN_U32("graphics/intro/unk_840B874.4bpp.lz");
+static const u32 gUnknown_840BAE0[] = INCBIN_U32("graphics/intro/unk_840BAE0.4bpp.lz");
+
+static const struct BgTemplate gUnknown_840BB80[] = {
+ { 3, 3, 31, 0, 0, 3, 0x000 },
+ { 2, 3, 30, 0, 0, 2, 0x010 }
+};
+
+static const struct BgTemplate gUnknown_840BB88[] = {
+ { 0, 0, 28, 2, 0, 0, 0x000 },
+ { 1, 1, 30, 2, 0, 0, 0x000 }
+};
+
+static const struct BgTemplate gUnknown_840BB90[] = {
+ { 3, 1, 30, 2, 0, 3, 0x000 },
+ { 0, 0, 29, 0, 0, 0, 0x000 },
+ { 2, 3, 27, 0, 0, 2, 0x000 },
+ { 1, 2, 28, 0, 0, 1, 0x000 }
+};
+
+static const struct BgTemplate gUnknown_840BBA0[] = {
+ { 1, 0, 29, 0, 0, 1, 0x000 },
+ { 0, 1, 30, 2, 0, 0, 0x000 }
+};
+
+static const struct WindowTemplate gUnknown_840BBA8[] = {
+ { 2, 6, 4, 18, 9, 0xD, 0x000 },
+ DUMMY_WIN_TEMPLATE
+};
+
+static const u8 gUnknown_840BBB8[][2] = {
+ {0x3f, 0x3f},
+ {0x00, 0x3f},
+ {0x3f, 0x00},
+ {0x00, 0x00}
+};
+
+static const struct CompressedSpriteSheet gUnknown_840BBC0[] = {
+ {gUnknown_8402A64, 0x0080, 0},
+ {gUnknown_8402ADC, 0x0080, 1},
+ {gUnknown_8402B2C, 0x0800, 2},
+ {gUnknown_84028F8, 0x0400, 3},
+ {gUnknown_8402CD4, 0x0100, 4}
+};
+
+static const struct SpritePalette gUnknown_840BBE8[] = {
+ {gUnknown_8402A44, 0},
+ {gUnknown_8402ABC, 1},
+ {gUnknown_840270C, 3},
+ {0}
+};
+
+static const struct Coords16 gUnknown_840BC08[] = {
+ {0x0048, 0x0050},
+ {0x0088, 0x004a},
+ {0x00a8, 0x0050},
+ {0x0078, 0x0050},
+ {0x0068, 0x0056},
+ {0x0058, 0x004a},
+ {0x00b8, 0x004a},
+ {0x0038, 0x0056},
+ {0x0098, 0x0056}
+};
+
+static const struct OamData gOamData_840BC2C = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = ST_OAM_SQUARE, .matrixNum = 0, .size = ST_OAM_SIZE_1, .tileNum = 0x000, .priority = 2, .paletteNum = 0 };
+
+static const struct OamData gOamData_840BC34 = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = ST_OAM_SQUARE, .matrixNum = 0, .size = ST_OAM_SIZE_0, .tileNum = 0x000, .priority = 2, .paletteNum = 0 };
+
+static const union AnimCmd gAnimCmd_840BC3C[] = {
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_FRAME(3, 4),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gAnimCmd_840BC50[] = {
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_FRAME(3, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gAnimCmdTable_840BC64[] = {
+ gAnimCmd_840BC3C,
+ gAnimCmd_840BC50
+};
+
+static const struct SpriteTemplate gUnknown_840BC6C = {0, 0, &gOamData_840BC2C, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_80EE29C};
+
+static const struct SpriteTemplate gUnknown_840BC84 = {1, 1, &gOamData_840BC34, gAnimCmdTable_840BC64, NULL, gDummySpriteAffineAnimTable, sub_80EE350};
+
+static const struct OamData gOamData_840BC9C = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = ST_OAM_SQUARE, .matrixNum = 0, .size = ST_OAM_SIZE_2, .tileNum = 0x000, .priority = 2, .paletteNum = 0 };
+
+static const union AnimCmd gAnimCmd_840BCA4[] = {
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_FRAME(32, 8),
+ ANIMCMD_FRAME(48, 8),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gAnimCmdTable_840BCB8[] = {
+ gAnimCmd_840BCA4
+};
+
+static const struct SpriteTemplate gUnknown_840BCBC = {2, 1, &gOamData_840BC9C, gAnimCmdTable_840BCB8, NULL, gDummySpriteAffineAnimTable, sub_80EE4DC};
+
+static const struct OamData gOamData_840BCD4 = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = ST_OAM_V_RECTANGLE, .matrixNum = 0, .size = ST_OAM_SIZE_3, .tileNum = 0x000, .priority = 3, .paletteNum = 0 };
+
+static const struct SpriteTemplate gUnknown_840BCDC = {3, 3, &gOamData_840BCD4, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy};
+
+static const struct OamData gOamData_840BCF4 = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = ST_OAM_H_RECTANGLE, .matrixNum = 0, .size = ST_OAM_SIZE_1, .tileNum = 0x000, .priority = 3, .paletteNum = 0 };
+
+static const struct SpriteTemplate gUnknown_840BCFC = {4, 3, &gOamData_840BCF4, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy};
+
+static const struct OamData gOamData_840BD14 = { .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = ST_OAM_SQUARE, .matrixNum = 0, .size = ST_OAM_SIZE_3, .tileNum = 0x000, .priority = 1, .paletteNum = 0 };
+
+static const union AnimCmd gAnimCmd_840BD1C[] = {
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gAnimCmd_840BD24[] = {
+ ANIMCMD_FRAME(64, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gAnimCmd_840BD2C[] = {
+ ANIMCMD_FRAME(128, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gAnimCmd_840BD34[] = {
+ ANIMCMD_FRAME(192, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gAnimCmd_840BD3C[] = {
+ ANIMCMD_FRAME(256, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gAnimCmdTable_840BD44[] = {
+ gAnimCmd_840BD1C,
+ gAnimCmd_840BD24,
+ gAnimCmd_840BD2C,
+ gAnimCmd_840BD34,
+ gAnimCmd_840BD3C
+};
+
+static const union AffineAnimCmd gAffineAnimCmd_840BD58[] = {
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd gAffineAnimCmd_840BD68[] = {
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_FRAME(32, 32, 0, 8),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const gAffineAnimCmdTable_840BD80[] = {
+ gAffineAnimCmd_840BD58,
+ gAffineAnimCmd_840BD68
+};
+
+static const struct SpriteTemplate gUnknown_840BD88 = {5, 7, &gOamData_840BD14, gAnimCmdTable_840BD44, NULL, gAffineAnimCmdTable_840BD80, SpriteCallbackDummy};
+
+static const struct OamData gOamData_840BDA0 = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = ST_OAM_SQUARE, .matrixNum = 0, .size = ST_OAM_SIZE_3, .tileNum = 0x000, .priority = 1, .paletteNum = 0 };
+
+static const struct SpriteTemplate gUnknown_840BDA8 = {7, 7, &gOamData_840BDA0, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy};
+
+static const struct SpriteTemplate gUnknown_840BDC0 = {6, 6, &gOamData_840BDA0, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy};
+
+static const struct OamData gOamData_840BDD8 = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = ST_OAM_H_RECTANGLE, .matrixNum = 0, .size = ST_OAM_SIZE_3, .tileNum = 0x000, .priority = 0, .paletteNum = 0 };
+
+static const union AnimCmd gAnimCmds_840BDE0[] = {
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gAnimCmds_840BDE8[] = {
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gAnimCmdTable_840BDF4[] = {
+ gAnimCmds_840BDE0,
+ gAnimCmds_840BDE8
+};
+
+static const struct SpriteTemplate gUnknown_840BDFC = {8, 8, &gOamData_840BDD8, gAnimCmdTable_840BDF4, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy};
+
+static const struct OamData gOamData_840BE14 = { .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = ST_OAM_SQUARE, .matrixNum = 0, .size = ST_OAM_SIZE_3, .tileNum = 0x000, .priority = 1, .paletteNum = 0 };
+
+static const union AnimCmd gAnimCmd_840BE1C[] = {
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gAnimCmd_840BE24[] = {
+ ANIMCMD_FRAME(64, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gAnimCmd_840BE2C[] = {
+ ANIMCMD_FRAME(96, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gAnimCmd_840BE34[] = {
+ ANIMCMD_FRAME(160, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gAnimCmdTable_840BE3C[] = {
+ gAnimCmd_840BE1C,
+ gAnimCmd_840BE24,
+ gAnimCmd_840BE2C,
+ gAnimCmd_840BE34
+};
+
+static const struct SpriteTemplate gUnknown_840BE4C = {9, 6, &gOamData_840BE14, gAnimCmdTable_840BE3C, NULL, gAffineAnimCmdTable_840BD80, SpriteCallbackDummy};
+
+static const struct OamData gOamData_840BE64 = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = ST_OAM_V_RECTANGLE, .matrixNum = 0, .size = ST_OAM_SIZE_3, .tileNum = 0x000, .priority = 1, .paletteNum = 0 };
+
+static const union AnimCmd gAnimCmd_840BE6C[] = {
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gAnimCmd_840BE78[] = {
+ ANIMCMD_FRAME(64, 8),
+ ANIMCMD_FRAME(72, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gAnimCmdTable_840BE84[] = {
+ gAnimCmd_840BE6C,
+ gAnimCmd_840BE78
+};
+
+static const struct SpriteTemplate gUnknown_840BE8C = {10, 10, &gOamData_840BE64, gAnimCmdTable_840BE84, NULL, gDummySpriteAffineAnimTable, sub_80EE1C4};
+
+static const struct OamData gOamData_840BEA4 = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = ST_OAM_SQUARE, .matrixNum = 0, .size = ST_OAM_SIZE_1, .tileNum = 0x000, .priority = 1, .paletteNum = 0 };
+
+static const union AnimCmd gAnimCmd_840BEAC[] = {
+ ANIMCMD_FRAME(0, 10),
+ ANIMCMD_FRAME(4, 10),
+ ANIMCMD_FRAME(8, 10),
+ ANIMCMD_FRAME(12, 8),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gAnimCmdTable_840BEC0[] = {
+ gAnimCmd_840BEAC
+};
+
+static const struct SpriteTemplate gUnknown_840BEC4 = {11, 11, &gOamData_840BEA4, gAnimCmdTable_840BEC0, NULL, gDummySpriteAffineAnimTable, sub_80EE8E4};
+
+static const struct CompressedSpriteSheet gUnknown_840BEDC[] = {
+ {gUnknown_840926C, 0x0800, 6},
+ {gUnknown_84096CC, 0x0800, 7},
+ {gUnknown_840A3E4, 0x2800, 5},
+ {gUnknown_8409A3C, 0x0800, 8},
+ {gUnknown_8409D20, 0x1800, 9},
+ {gUnknown_840B874, 0x0a00, 10},
+ {gUnknown_840BAE0, 0x0200, 11}
+};
+
+// POTENTIAL UB
+// This array is passed to LoadSpritePalettes in sub_80EEBE4.
+// LoadSpritePalettes uses a {0} entry to signal end of array.
+// Because such an entry is absent in this case, the function
+// continues reading into the next .rodata section.
+static const struct SpritePalette gUnknown_840BF14[] = {
+ {gUnknown_8405DA4, 6},
+ {gUnknown_84096AC, 7},
+ {gUnknown_8409A1C, 8},
+ {gUnknown_840B834, 10},
+ {gUnknown_840B854, 11},
+ // {0}
+};
+
+static void sub_80EC5A4(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void sub_80EC5B8(void)
+{
+ if (!UpdatePaletteFade())
+ SetMainCallback2(sub_80EC870);
+}
+
+static void load_copyright_graphics(u16 a, u16 b, u16 c)
+{
+ LZ77UnCompVram(gUnknown_8402280, (void *)BG_VRAM + a);
+ LZ77UnCompVram(gUnknown_84024E4, (void *)BG_VRAM + b);
+ LoadPalette(gUnknown_8402260, c, 0x20);
+}
+
+static void SerialCb_CopyrightScreen(void)
+{
+ GameCubeMultiBoot_HandleSerialInterrupt(&gUnknown_203AAD4);
+}
+
+static bool8 sub_80EC62C(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ ((vu16*)PLTT)[0] = RGB_WHITE;
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ DmaFill16(3, 0, VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, OAM, OAM_SIZE);
+ DmaFill16(3, 0, PLTT + sizeof(vu16), PLTT_SIZE - sizeof(vu16));
+ ResetPaletteFade();
+ load_copyright_graphics(0, 0x3800, 0);
+ ScanlineEffect_Stop();
+ ResetTasks();
+ ResetSpriteData();
+ FreeAllSpritePalettes();BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0xFFFF);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0x700);
+ EnableInterrupts(INTR_FLAG_VBLANK);
+ SetVBlankCallback(sub_80EC5A4);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON);
+ SetSerialCallback(SerialCb_CopyrightScreen);
+ GameCubeMultiBoot_Init(&gUnknown_203AAD4);
+ // fallthrough
+ default:
+ UpdatePaletteFade();
+ gMain.state++;
+ GameCubeMultiBoot_Main(&gUnknown_203AAD4);
+ break;
+ case 140:
+ GameCubeMultiBoot_Main(&gUnknown_203AAD4);
+ if (gUnknown_203AAD4.gcmb_field_2 != 1)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gMain.state++;
+ }
+ break;
+ case 141:
+ if (!UpdatePaletteFade())
+ {
+ gMain.state++;
+ if (gUnknown_203AAD4.gcmb_field_2 != 0)
+ {
+ if (gUnknown_203AAD4.gcmb_field_2 == 2)
+ {
+ if (*((u32 *)0x020000AC) == 0x65366347)
+ {
+ CpuCopy16(gMultiBootProgram_PokemonColosseum_Start, (void *)EWRAM_START, 0x28000);
+ *((u32 *)0x020000AC) = 0x65366347;
+ }
+ GameCubeMultiBoot_ExecuteProgram(&gUnknown_203AAD4);
+ }
+ }
+ else
+ {
+ GameCubeMultiBoot_Quit();
+ SetSerialCallback(SerialCB);
+ }
+ return FALSE;
+ }
+ break;
+ case 142:
+ sub_800B388();
+ SetMainCallback2(sub_80EC5B8);
+ break;
+ }
+ return TRUE;
+}
+
+void c2_copyright_1(void)
+{
+ if (!sub_80EC62C())
+ {
+ ResetMenuAndMonGlobals();
+ Save_ResetSaveCounters();
+ Save_LoadGameData(0);
+ if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_INVALID)
+ Sav2_ClearSetDefault();
+ SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound);
+ }
+}
+
+void sub_80EC864(void)
+{
+ sub_80EC62C();
+}
+
+static void sub_80EC870(void)
+{
+ switch (gMain.state)
+ {
+ default:
+ gMain.state = 0;
+ // fallthrough
+ case 0:
+ SetVBlankCallback(NULL);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ InitHeap(gHeap, HEAP_SIZE);
+ ResetTasks();
+ ResetSpriteData();
+ ResetPaletteFade();
+ ResetTempTileDataBuffers();
+ sub_80ECA00();
+ DmaFill16(3, 0, VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, OAM, OAM_SIZE);
+ DmaFill16(3, 0, PLTT, PLTT_SIZE);
+ FillPalette(0, 0, 0x400);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_840BB80, NELEMS(gUnknown_840BB80));
+ break;
+ case 1:
+ LoadPalette(gUnknown_8402630, 0x00, 0x20);
+ DecompressAndCopyTileDataToVram(3, gUnknown_8402650, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(3, gUnknown_8402668, 0, 0, 1);
+ LoadPalette(gUnknown_840270C, 0xD0, 0x20);
+ break;
+ case 2:
+ if (!FreeTempTileDataBuffersIfPossible())
+ {
+ sub_80ECA70();
+ BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK);
+ SetMainCallback2(sub_80EC9D4);
+ SetVBlankCallback(sub_80EC9EC);
+ }
+ return;
+ }
+ gMain.state++;
+}
+
+static void sub_80EC9D4(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void sub_80EC9EC(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void sub_80ECA00(void)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+}
+
+static void sub_80ECA70(void)
+{
+ struct IntroSequenceData * ptr = Alloc(sizeof(struct IntroSequenceData));
+ sub_80ECAA8(ptr, sub_80ECAF0);
+ ptr->field_0005 = CreateTask(sub_80ECAB0, 3);
+ SetWordTaskArg(ptr->field_0005, 0, (uintptr_t)ptr);
+}
+
+static void sub_80ECAA8(struct IntroSequenceData * ptr, void (*cb)(struct IntroSequenceData *))
+{
+ ptr->field_0000 = cb;
+ ptr->field_0004 = 0;
+}
+
+static void sub_80ECAB0(u8 taskId)
+{
+ struct IntroSequenceData * ptr = (void *)GetWordTaskArg(taskId, 0);
+ if (JOY_NEW(A_BUTTON | START_BUTTON | SELECT_BUTTON) && ptr->field_0000 != sub_80EDBE8)
+ sub_80ECAA8(ptr, sub_80EDBE8);
+ ptr->field_0000(ptr);
+}
+
+static void sub_80ECAF0(struct IntroSequenceData * this)
+{
+ switch (this->field_0004)
+ {
+ case 0:
+ InitWindows(gUnknown_840BBA8);
+ LZ77UnCompWram(gUnknown_840272C, this->field_043C);
+ LZ77UnCompWram(gUnknown_84028F8, this->field_003C);
+ FillBgTilemapBufferRect(2, 0x000, 0, 0, 32, 32, 0x11);
+ FillWindowPixelBuffer(0, 0x00);
+ BlitBitmapToWindow(0, this->field_043C, 0, 40, 144, 16);
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 3);
+ this->field_0004++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ sub_80ECAA8(this, sub_80ECB98);
+ break;
+ }
+}
+
+static void sub_80ECB98(struct IntroSequenceData * this)
+{
+ switch (this->field_0004)
+ {
+ case 0:
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON);
+ SetGpuReg(REG_OFFSET_WININ, 0x3F00);
+ SetGpuReg(REG_OFFSET_WINOUT, 0x0000);
+ SetGpuReg(REG_OFFSET_WIN1H, 0x00F0);
+ SetGpuReg(REG_OFFSET_WIN1V, 0x0000);
+ this->field_0012 = 0;
+ this->field_0004++;
+ break;
+ case 1:
+ ShowBg(3);
+ BlendPalettes(0xFFFFFFFF, 0x00, RGB_BLACK);
+ this->field_0004++;
+ break;
+ case 2:
+ this->field_0012 += 8;
+ if (this->field_0012 >= 0x30)
+ this->field_0012 = 0x30;
+ SetGpuReg(REG_OFFSET_WIN1V, ((0x50 - this->field_0012) << 8) | (0x50 + this->field_0012));
+ if (this->field_0012 == 0x30)
+ sub_80ECAA8(this, sub_80ECC3C);
+ break;
+ }
+}
+
+static void sub_80ECC3C(struct IntroSequenceData * this)
+{
+ switch (this->field_0004)
+ {
+ case 0:
+ PlaySE(BGM_FRLG_GAMEFREAK_LOGO);
+ sub_80EDC40();
+ this->field_0012 = 0;
+ this->field_0004++;
+ break;
+ case 1:
+ this->field_0012++;
+ if (this->field_0012 == 30)
+ {
+ sub_80EDDF0();
+ this->field_0012 = 0;
+ this->field_0004++;
+ }
+ break;
+ case 2:
+ this->field_0012++;
+ if (this->field_0012 == 90)
+ sub_80ECAA8(this, sub_80ECCA8);
+ break;
+ }
+}
+
+static void sub_80ECCA8(struct IntroSequenceData * this)
+{
+ switch (this->field_0004)
+ {
+ case 0:
+ sub_80EDED8();
+ this->field_0012 = 0;
+ this->field_0004++;
+ break;
+ case 1:
+ this->field_0012++;
+ if (this->field_0012 >= 40)
+ this->field_0004++;
+ break;
+ case 2:
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD);
+ StartBlendTask(0, 16, 16, 0, 48, 0);
+ this->field_0004++;
+ break;
+ case 3:
+ ShowBg(2);
+ this->field_0004++;
+ break;
+ case 4:
+ if (!IsBlendTaskActive())
+ {
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ this->field_0012 = 0;
+ this->field_0004++;
+ }
+ break;
+ case 5:
+ this->field_0012++;
+ if (this->field_0012 > 50)
+ sub_80ECAA8(this, sub_80ECD60);
+ break;
+ }
+}
+
+static void sub_80ECD60(struct IntroSequenceData * this)
+{
+ switch (this->field_0004)
+ {
+ case 0:
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD);
+ StartBlendTask(0, 16, 16, 0, 16, 0);
+ this->field_0008 = 0;
+ this->field_000A = 16;
+ this->field_0012 = 0;
+ this->field_0004++;
+ break;
+ case 1:
+ this->field_0014 = sub_80EDF68();
+ this->field_0004++;
+ break;
+ case 2:
+ if (!IsBlendTaskActive())
+ {
+ BlitBitmapToWindow(0, this->field_003C, 0x38, 0x06, 0x20, 0x40);
+ BlitBitmapToWindow(0, this->field_043C, 0x00, 0x28, 0x90, 0x10);
+ CopyWindowToVram(0, 2);
+ this->field_0004++;
+ }
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ DestroySprite(this->field_0014);
+ this->field_0012 = 0;
+ this->field_0004++;
+ }
+ break;
+ case 4:
+ this->field_0012++;
+ if (this->field_0012 > 90)
+ {
+ SetGpuRegBits(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2);
+ StartBlendTask(16, 0, 0, 16, 20, 0);
+ this->field_0004++;
+ }
+ break;
+ case 5:
+ if (!IsBlendTaskActive())
+ {
+ HideBg(2);
+ this->field_0004++;
+ }
+ break;
+ case 6:
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ this->field_0012 = 0;
+ this->field_0004++;
+ break;
+ case 7:
+ this->field_0012++;
+ if (this->field_0012 > 20)
+ {
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ sub_80ECAA8(this, sub_80ECEA4);
+ }
+ break;
+ }
+}
+
+static void sub_80ECEA4(struct IntroSequenceData * this)
+{
+ switch (this->field_0004)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ LoadPalette(gUnknown_8402D34, 0x10, 0x20);
+ LoadPalette(gUnknown_84048CC, 0x20, 0x20);
+ BlendPalettes(0x06, 0x10, RGB_WHITE);
+ InitBgsFromTemplates(0, gUnknown_840BB88, NELEMS(gUnknown_840BB88));
+ DecompressAndCopyTileDataToVram(1, gUnknown_84048EC, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(1, gUnknown_8404F7C, 0, 0, 1);
+ ShowBg(1);
+ HideBg(0);
+ HideBg(2);
+ HideBg(3);
+ sub_80EEBE4();
+ SetVBlankCallback(sub_80EC9EC);
+ this->field_0004++;
+ break;
+ case 1:
+ if (!FreeTempTileDataBuffersIfPossible())
+ {
+ DecompressAndCopyTileDataToVram(0, gUnknown_8402D54, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(0, gUnknown_8403FE8, 0, 0, 1);
+ ResetBgPositions();
+ ShowBg(1);
+ this->field_0004++;
+ }
+ break;
+ case 2:
+ if (!FreeTempTileDataBuffersIfPossible())
+ {
+ ShowBg(0);
+ CreateTask(sub_80ED0AC, 0);
+ BeginNormalPaletteFade(0x00000006, -2, 16, 0, RGB_WHITE);
+ this->field_0004++;
+ }
+ break;
+ case 3:
+ if (!gPaletteFade.active)
+ {
+ m4aSongNumStart(BGM_FRLG_OPENING);
+ this->field_0012 = 0;
+ this->field_0004++;
+ }
+ break;
+ case 4:
+ this->field_0012++;
+ if (this->field_0012 == 20)
+ {
+ CreateTask(sub_80ED140, 0);
+ sub_80ED118();
+ }
+ if (this->field_0012 >= 30)
+ {
+ BlendPalettes(-2, 16, RGB_WHITE);
+ DestroyTask(FindTaskIdByFunc(sub_80ED0AC));
+ DestroyTask(FindTaskIdByFunc(sub_80ED140));
+ sub_80ECAA8(this, sub_80ED188);
+ }
+ break;
+ case 5:
+ if (!gPaletteFade.active)
+ {
+ DestroyTask(FindTaskIdByFunc(sub_80ED0AC));
+ DestroyTask(FindTaskIdByFunc(sub_80ED140));
+ sub_80ECAA8(this, sub_80ED188);
+ }
+ break;
+ }
+}
+
+static void sub_80ED0AC(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ data[0]++;
+ if (data[0] > 5)
+ {
+ data[0] = 0;
+ data[1]++;
+ if (data[1] > 2)
+ data[1] = 0;
+ ChangeBgY(0, data[1] << 15, 0);
+ }
+ if (data[2])
+ {
+ data[3] += 0x120;
+ ChangeBgY(0, data[3], 2);
+ }
+}
+
+static void sub_80ED118(void)
+{
+ u8 taskId = FindTaskIdByFunc(sub_80ED0AC);
+ gTasks[taskId].data[2] = TRUE;
+}
+
+static void sub_80ED140(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ data[0]++;
+ if (data[0] > 3)
+ {
+ data[0] = 0;
+ if (data[1] < 2)
+ data[1]++;
+ ChangeBgY(1, data[1] << 15, 0);
+ }
+}
+
+static void sub_80ED188(struct IntroSequenceData * this)
+{
+ switch (this->field_0004)
+ {
+ case 0:
+ BlendPalettes(0xFFFFFFFE, 16, RGB_WHITE);
+ InitBgsFromTemplates(0, gUnknown_840BB90, NELEMS(gUnknown_840BB90));
+ DecompressAndCopyTileDataToVram(3, gUnknown_8405414, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(3, gUnknown_8405890, 0, 0, 1);
+ ShowBg(3);
+ this->field_0004++;
+ break;
+ case 1:
+ if (!FreeTempTileDataBuffersIfPossible())
+ {
+ SetVBlankCallback(NULL);
+ LoadPalette(gUnknown_84053B4, 0x10, 0x60);
+ LoadPalette(gUnknown_8405DA4, 0x50, 0x20);
+ LoadPalette(gUnknown_8406634, 0x60, 0x20);
+ BlendPalettes(0xFFFFFFFE, 16, RGB_WHITE);
+ DecompressAndCopyTileDataToVram(0, gUnknown_8405B28, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(0, gUnknown_8405CDC, 0, 0, 1);
+ DecompressAndCopyTileDataToVram(1, gUnknown_8406654, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(1, gUnknown_84071D0, 0, 0, 1);
+ DecompressAndCopyTileDataToVram(2, gUnknown_8405DC4, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(2, gUnknown_840644C, 0, 0, 1);
+ ResetBgPositions();
+ ShowBg(0);
+ HideBg(1);
+ HideBg(2);
+ ChangeBgY(2, 0x0001CE00, 0);
+ ChangeBgY(1, 0x00002800, 0);
+ CreateTask(sub_80ED40C, 0);
+ sub_80ED444(this);
+ BlendPalettes(0xFFFFFFFE, 16, RGB_WHITE);
+ SetVBlankCallback(sub_80EC9EC);
+ this->field_0004++;
+ }
+ break;
+ case 2:
+ if (!FreeTempTileDataBuffersIfPossible())
+ {
+ BeginNormalPaletteFade(0xFFFFFFFE, -2, 16, 0, RGB_WHITE);
+ this->field_0004++;
+ }
+ break;
+ case 3:
+ if (!gPaletteFade.active)
+ {
+ this->field_0012 = 0;
+ this->field_0004++;
+ }
+ break;
+ case 4:
+ this->field_0012++;
+ if (this->field_0012 >= 60)
+ {
+ this->field_0012 = 0;
+ DestroyTask(FindTaskIdByFunc(sub_80ED40C));
+ sub_80ED4A0(this);
+ CreateTask(sub_80ED428, 0);
+ ChangeBgY(3, 0x00010000, 0);
+ HideBg(0);
+ ShowBg(3);
+ ShowBg(1);
+ ShowBg(2);
+ this->field_0004++;
+ }
+ break;
+ case 5:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ this->field_0012 = 0;
+ this->field_0004++;
+ }
+ break;
+ case 6:
+ this->field_0012++;
+ if (this->field_0012 >= 60)
+ {
+ DestroyTask(FindTaskIdByFunc(sub_80ED428));
+ sub_80ECAA8(this, sub_80ED4C0);
+ }
+ break;
+ }
+}
+
+static void sub_80ED40C(u8 taskId)
+{
+ ChangeBgX(3, 0x0E0, 2);
+ ChangeBgX(0, 0x110, 1);
+}
+
+static void sub_80ED428(u8 taskId)
+{
+ ChangeBgY(2, 0x020, 1);
+ ChangeBgY(1, 0x024, 2);
+}
+
+static void sub_80ED444(struct IntroSequenceData * this)
+{
+ u8 spriteId;
+
+ this->field_001C = NULL;
+ this->field_0020 = NULL;
+
+ spriteId = CreateSprite(&gUnknown_840BDA8, 168, 80, 11);
+ if (spriteId != MAX_SPRITES)
+ this->field_0020 = &gSprites[spriteId];
+
+ spriteId = CreateSprite(&gUnknown_840BDC0, 72, 80, 12);
+ if (spriteId != MAX_SPRITES)
+ this->field_001C = &gSprites[spriteId];
+}
+
+static void sub_80ED4A0(struct IntroSequenceData * this)
+{
+ if (this->field_001C != NULL)
+ DestroySprite(this->field_001C);
+ if (this->field_0020 != NULL)
+ DestroySprite(this->field_0020);
+}
+
+static void sub_80ED4C0(struct IntroSequenceData * this)
+{
+ switch (this->field_0004)
+ {
+ case 0:
+ LoadPalette(gUnknown_8407430, 0x10, 0x40);
+ LoadPalette(gUnknown_8405DA4, 0x50, 0x20);
+ BlendPalettes(0xFFFFFFFE, 16, RGB_WHITE);
+ InitBgsFromTemplates(0, gUnknown_840BBA0, NELEMS(gUnknown_840BBA0));
+ DecompressAndCopyTileDataToVram(1, gUnknown_8407470, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(1, gUnknown_8407A50, 0, 0, 1);
+ ShowBg(1);
+ HideBg(0);
+ HideBg(2);
+ HideBg(3);
+ ResetBgPositions();
+ this->field_0004++;
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuRegBits(REG_OFFSET_WININ, 0x12);
+ ClearGpuRegBits(REG_OFFSET_WININ, 0x01);
+ SetGpuRegBits(REG_OFFSET_WINOUT, 0x00);
+ SetGpuReg(REG_OFFSET_WIN0V, 0x2080);
+ SetGpuReg(REG_OFFSET_WIN0H, 0x0078);
+ break;
+ case 1:
+ if (!FreeTempTileDataBuffersIfPossible())
+ {
+ DecompressAndCopyTileDataToVram(0, gUnknown_8407B9C, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(0, gUnknown_8408D98, 0, 0, 1);
+ gUnknown_203AB00 = 4;
+ gUnknown_203AB02 = 52;
+ ChangeBgX(0, 0x00001800, 0);
+ ChangeBgY(0, 0x0001F000, 0);
+ this->field_0004++;
+ }
+ break;
+ case 2:
+ if (!FreeTempTileDataBuffersIfPossible())
+ {
+ BlendPalettes(0xFFFFFFFE, 0, RGB_WHITE);
+ ShowBg(0);
+ CreateTask(sub_80ED714, 0);
+ sub_80EE4F8(this);
+ sub_80EE528(this->field_0018, 0, 0xB4, 0x34);
+ CreateTask(sub_80EE200, 0);
+ sub_80ED6D8();
+ this->field_0012 = 0;
+ this->field_0004++;
+ }
+ break;
+ case 3:
+ this->field_0012++;
+ if (this->field_0012 == 16)
+ sub_80ED7D4(this);
+ if (!sub_80EE5C8(this) && !FuncIsActiveTask(sub_80EE200))
+ sub_80ECAA8(this, sub_80ED898);
+ break;
+ }
+}
+
+static void sub_80ED69C(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ ChangeBgX(1, 0x400, 2);
+ else
+ ChangeBgX(1, 0x020, 2);
+}
+
+static void sub_80ED6D8(void)
+{
+ CreateTask(sub_80ED69C, 0);
+}
+
+static void sub_80ED6EC(void)
+{
+ u8 taskId = FindTaskIdByFunc(sub_80ED69C);
+ gTasks[taskId].data[0] = 1;
+}
+
+static void sub_80ED714(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+ if (data[0] == 0)
+ {
+ data[1]++;
+ if (data[1] >= 30)
+ {
+ data[1] = 0;
+ data[2] ^= 1;
+ ChangeBgY(0, (data[2] << 15) + 0x1F000, 0);
+ }
+ }
+}
+
+static void sub_80ED760(void)
+{
+ u8 taskId = FindTaskIdByFunc(sub_80ED714);
+ gTasks[taskId].data[0] = 1;
+}
+
+static void sub_80ED788(void)
+{
+ u8 taskId = FindTaskIdByFunc(sub_80ED714);
+ gTasks[taskId].data[0] = 0;
+}
+
+static u8 sub_80ED7B0(void)
+{
+ u8 taskId = FindTaskIdByFunc(sub_80ED714);
+ return gTasks[taskId].data[2];
+}
+
+static void sub_80ED7D4(struct IntroSequenceData * this)
+{
+ u8 spriteId = CreateSprite(&gUnknown_840BDFC, 296, 112, 7);
+ if (spriteId != MAX_SPRITES)
+ {
+ this->field_0024 = &gSprites[spriteId];
+ this->field_0024->callback = sub_80ED818;
+ }
+ else
+ this->field_0024 = NULL;
+}
+
+static void sub_80ED818(struct Sprite * sprite)
+{
+ s16 * data = sprite->data;
+
+ switch (data[0])
+ {
+ case 0:
+ data[1] = sprite->pos1.x << 5;
+ data[2] = 160;
+ data[0]++;
+ // fallthrough
+ case 1:
+ data[1] -= data[2];
+ sprite->pos1.x = data[1] >> 5;
+ if (sprite->pos1.x <= 52)
+ {
+ sub_80ED6EC();
+ data[0]++;
+ }
+ break;
+ case 2:
+ data[1] -= 32;
+ sprite->pos1.x = data[1] >> 5;
+ if (sprite->pos1.x <= -32)
+ {
+ sprite->invisible = TRUE;
+ sprite->data[0]++;
+ DestroySprite(sprite);
+ }
+ break;
+ }
+}
+
+static void sub_80ED898(struct IntroSequenceData * this)
+{
+ switch (this->field_0004)
+ {
+ case 0:
+ this->field_0012 = 0;
+ this->field_0004++;
+ break;
+ case 1:
+ this->field_0012++;
+ if (this->field_0012 > 30)
+ {
+ sub_80EE5E4(this);
+ this->field_0004++;
+ }
+ break;
+ case 2:
+ if (!sub_80EE850(this))
+ {
+ this->field_0012 = 0;
+ this->field_0004++;
+ }
+ break;
+ case 3:
+ this->field_0012++;
+ if (this->field_0012 > 30)
+ {
+ sub_80ED760();
+ sub_80EDF94(this);
+ this->field_0012 = 0;
+ this->field_0004++;
+ }
+ break;
+ case 4:
+ if (this->field_0006)
+ {
+ sub_80EE6A4(this);
+ this->field_0004++;
+ }
+ break;
+ case 5:
+ if (!sub_80EE850(this))
+ {
+ sub_80ED788();
+ this->field_0012 = 0;
+ this->field_0004++;
+ }
+ break;
+ case 6:
+ this->field_0012++;
+ if (this->field_0012 > 16)
+ {
+ sub_80EE970(this->field_0018, 8, 12, 5);
+ this->field_0004++;
+ }
+ break;
+ case 7:
+ if (!sub_80EE850(this))
+ {
+ sub_80EE970(this->field_0018, 8, 12, 5);
+ this->field_0004++;
+ }
+ break;
+ case 8:
+ if (!sub_80EE850(this))
+ {
+ this->field_0012 = 0;
+ this->field_0004++;
+ }
+ break;
+ case 9:
+ this->field_0012++;
+ if (this->field_0012 > 20)
+ {
+ sub_80EEA94(this);
+ this->field_0012 = 0;
+ this->field_0004++;
+ }
+ break;
+ case 10:
+ if (!sub_80ED7B0())
+ {
+ sub_80ED760();
+ sub_80EDAF0(this);
+ this->field_0004++;
+ }
+ break;
+ case 11:
+ HideBg(0);
+ this->field_0012 = 0;
+ this->field_0004++;
+ break;
+ case 12:
+ this->field_0012++;
+ if (this->field_0012 == 48)
+ BeginNormalPaletteFade(0x00000006, 2, 0, 16, RGB_WHITE);
+ if (this->field_0012 > 120)
+ {
+ sub_80EDB70(this);
+ sub_80EDBAC(this);
+ this->field_0004++;
+ this->field_0012 = 0;
+ }
+ break;
+ case 13:
+ this->field_0012++;
+ if (this->field_0012 > 8)
+ {
+ CpuFill16(RGB_WHITE, gPlttBufferUnfaded + 16, 64);
+ BeginNormalPaletteFade(0xFFFFFFFE, -2, 0, 16, RGB_BLACK);
+ this->field_0004++;
+ }
+ break;
+ case 14:
+ if (!gPaletteFade.active)
+ {
+ this->field_0012 = 0;
+ this->field_0004++;
+ }
+ break;
+ case 15:
+ this->field_0012++;
+ if (this->field_0012 > 60)
+ sub_80ECAA8(this, sub_80EDBE8);
+ break;
+ default:
+ if (JOY_NEW(R_BUTTON))
+ {
+ BlendPalettes(0xFFFF0064, 0, RGB_WHITE);
+ this->field_0018->pos2.x = 0;
+ this->field_0018->pos1.x = 0xB4;
+ this->field_0004 = 1;
+ this->field_0012 = 30;
+ }
+ break;
+ }
+}
+
+static void sub_80EDAD8(struct Sprite * sprite)
+{
+ CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode);
+}
+
+static void sub_80EDAF0(struct IntroSequenceData * this)
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ int x = (i & 1) * 48 + 49;
+ int y = (i / 2) * 64 + 72;
+ u8 spriteId = CreateSprite(&gUnknown_840BE4C, x, y, 8);
+ if (spriteId != MAX_SPRITES)
+ {
+ StartSpriteAnim(&gSprites[spriteId], i);
+ this->field_0028[i] = &gSprites[spriteId];
+ if (i & 1)
+ this->field_0028[i]->oam.shape = ST_OAM_V_RECTANGLE;
+ sub_80EDAD8(this->field_0028[i]);
+ }
+ }
+}
+
+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);
+ this->field_0018->callback = SpriteCallbackDummy;
+ StartSpriteAffineAnim(this->field_0018, 1);
+}
+
+static void nullsub_83(struct Sprite * sprite)
+{
+}
+
+static void sub_80EDBAC(struct IntroSequenceData * this)
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ 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]);
+ }
+}
+
+static void sub_80EDBE8(struct IntroSequenceData * this)
+{
+ switch (this->field_0004)
+ {
+ case 0:
+ FillPalette(RGB_BLACK, 0, 0x400);
+ this->field_0004++;
+ break;
+ case 1:
+ if (!FreeTempTileDataBuffersIfPossible())
+ {
+ DestroyTask(this->field_0005);
+ Free(this);
+ DisableInterrupts(INTR_FLAG_HBLANK);
+ SetHBlankCallback(NULL);
+ SetMainCallback2(CB2_InitTitleScreen);
+ }
+ break;
+ }
+}
+
+static void sub_80EDC40(void)
+{
+ int i;
+ u8 spriteId;
+
+ for (i = 0; i < NELEMS(gUnknown_840BBC0); i++)
+ {
+ LoadCompressedSpriteSheet(&gUnknown_840BBC0[i]);
+ }
+ LoadSpritePalettes(gUnknown_840BBE8);
+ gUnknown_203AB0E = 0x60;
+ gUnknown_203AB10 = 0x10;
+ gUnknown_203AB12 = 0x07;
+ gUnknown_203AB14 = 0x05;
+ gUnknown_203AB16 = 0x08;
+ gUnknown_203AB18 = 0x5A;
+ gUnknown_203AB1A = 0x78;
+ gUnknown_203AB1E = 0x01;
+ gUnknown_203AB20 = 0x01;
+ gUnknown_203AB22 = 0x05;
+ gUnknown_203AB24 = 0x05;
+ if (gUnknown_203AB28 == 0)
+ gUnknown_203AB28 = 354128453;
+ spriteId = CreateSprite(&gUnknown_840BC6C, 0xF8, 0x37, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].data[0] = 0xF80;
+ gSprites[spriteId].data[1] = 0x370;
+ gSprites[spriteId].data[2] = gUnknown_203AB0E;
+ gSprites[spriteId].data[3] = gUnknown_203AB10;
+ StoreWordInTwoHalfwords(&gSprites[spriteId].data[6], gUnknown_203AB28);
+ }
+}
+
+static void sub_80EDD28(s16 x, s16 y, u16 a2)
+{
+ u8 spriteId;
+ s16 r4 = (a2 & gUnknown_203AB12) + 2;
+ s16 r2 = gUnknown_203AB2C;
+ gUnknown_203AB2C++;
+ if (gUnknown_203AB2C > 3)
+ gUnknown_203AB2C = -3;
+ x += r4;
+ y += r2;
+ if (x >= 1 && x <= 0xEF)
+ {
+ spriteId = CreateSprite(&gUnknown_840BC84, x, y, 1);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].data[0] = x << gUnknown_203AB22;
+ gSprites[spriteId].data[1] = y << gUnknown_203AB24;
+ gSprites[spriteId].data[2] = gUnknown_203AB1E * r4;
+ gSprites[spriteId].data[3] = gUnknown_203AB20 * r2;
+ }
+ }
+}
+
+static void sub_80EDDF0(void)
+{
+ CreateTask(sub_80EDE04, 1);
+}
+
+static void sub_80EDE04(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+ u8 r6;
+ u8 spriteId;
+
+ data[2]++, data[3]++;
+ if (data[2] > 6)
+ {
+ data[2] = 0;
+ r6 = data[0];
+ spriteId = CreateSprite(&gUnknown_840BC84, gUnknown_840BC08[r6].x, gUnknown_840BC08[r6].y, 2);
+ StartSpriteAnim(&gSprites[spriteId], 1);
+ gSprites[spriteId].callback = sub_80EE40C;
+ gSprites[spriteId].data[1] = gUnknown_840BC08[r6].y << 4;
+ gSprites[spriteId].data[2] = 120;
+ gSprites[spriteId].data[3] = data[1];
+ if (gSprites[spriteId].data[3] < 0)
+ gSprites[spriteId].data[3] = 1;
+ data[0]++;
+ if (data[0] < 0 || data[0] > 8)
+ {
+ data[1]++;
+ if (data[1] > 1)
+ DestroyTask(taskId);
+ else
+ data[0] = 0;
+ }
+ }
+}
+
+static void sub_80EDED8(void)
+{
+ CreateTask(sub_80EDEEC, 2);
+}
+
+static void sub_80EDEEC(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+ u8 r2;
+
+ if (data[0] == 0)
+ {
+ r2 = data[1];
+ data[1] += 4;
+ if (data[1] < 0 || data[1] > 8)
+ data[1] -= 9;
+ CreateSprite(&gUnknown_840BCBC, gUnknown_840BC08[r2].x, gUnknown_840BC08[r2].y, 3);
+ data[2]++;
+ if (data[2] > 8)
+ DestroyTask(taskId);
+ }
+ data[0]++;
+ if (data[0] > 9)
+ data[0] = 0;
+}
+
+static struct Sprite * sub_80EDF68(void)
+{
+ u8 spriteId = CreateSprite(&gUnknown_840BCDC, 120, 70, 4);
+ return &gSprites[spriteId];
+}
+
+static void sub_80EDF94(struct IntroSequenceData * this)
+{
+ u8 taskId;
+ this->field_0006 = 0;
+ taskId = CreateTask(sub_80EE024, 4);
+ SetWordTaskArg(taskId, 5, (uintptr_t)this);
+ gTasks[taskId].data[3] = 64;
+ gTasks[taskId].data[4] = GetBgX(0);
+}
+
+static void sub_80EDFD8(int a, int b, int c, int d)
+{
+ ChangeBgY(0, (a << 15) + 0x1F000, 0);
+ ChangeBgX(0, d, 0);
+ ChangeBgX(0, b << 8, 2);
+ ChangeBgY(0, c << 8, 2);
+}
+
+static void sub_80EE024(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+ int b, c;
+ int angle;
+ switch (data[0])
+ {
+ case 0:
+ data[7] = 2;
+ data[1] = 0;
+ data[8] = 6;
+ data[9] = 32;
+ data[0]++;
+ break;
+ case 1:
+ data[3] -= 2;
+ data[1]++;
+ if (data[1] > 15)
+ {
+ data[1] = 0;
+ data[0]++;
+ }
+ break;
+ case 2:
+ data[1]++;
+ if (data[1] == 14)
+ ((struct IntroSequenceData *)GetWordTaskArg(taskId, 5))->field_0006 = 1;
+ if (data[1] > 15)
+ {
+ data[1] = 0;
+ data[0]++;
+ }
+ break;
+ case 3:
+ data[3] += 8;
+ data[1]++;
+ if (data[1] == 4)
+ {
+ sub_80EE160();
+ data[8] = 32;
+ data[9] = 48;
+ data[7] = 3;
+ }
+ if (data[1] > 7)
+ {
+ data[1] = 0;
+ data[0]++;
+ }
+ break;
+ case 4:
+ data[3] -= 8;
+ data[1]++;
+ if (data[1] > 3)
+ {
+ data[7] = 0;
+ data[3] = 64;
+ data[1] = 0;
+ data[0]++;
+ }
+ break;
+ case 5:
+ DestroyTask(taskId);
+ return;
+ }
+ angle = data[3];
+ b = -((gSineTable[angle + 0x40] * data[9]) >> 8);
+ c = data[8] - ((gSineTable[angle] * data[8]) >> 8);
+ sub_80EDFD8(data[7], b, c, data[4]);
+}
+
+static void sub_80EE160(void)
+{
+ u8 spriteId;
+
+ spriteId = CreateSprite(&gUnknown_840BE8C, 132, 78, 6);
+ spriteId = CreateSprite(&gUnknown_840BE8C, 132, 118, 6);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].oam.shape = ST_OAM_H_RECTANGLE;
+ gSprites[spriteId].oam.size = ST_OAM_SIZE_2;
+ sub_80EDAD8(&gSprites[spriteId]);
+ StartSpriteAnim(&gSprites[spriteId], 1);
+ }
+}
+
+static void sub_80EE1C4(struct Sprite * sprite)
+{
+ sprite->invisible ^= TRUE;
+ if (sprite->animEnded)
+ DestroySprite(sprite);
+}
+
+static void sub_80EE200(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ data[1] = 0x400;
+ data[0]++;
+ // fallthrough
+ case 1:
+ data[2]++;
+ if (data[2] > 39 && data[1] > 16)
+ data[1] -= 16;
+ gUnknown_203AB30 = ChangeBgX(0, data[1], 1);
+ if (gUnknown_203AB30 >= 0x8000)
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ if (gUnknown_203AB30 >= 0xEF00)
+ {
+ ChangeBgX(0, 0xEF00, 0);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void sub_80EE29C(struct Sprite * sprite)
+{
+ u32 v;
+ sprite->data[0] -= sprite->data[2];
+ sprite->data[1] += sprite->data[3];
+ sprite->data[4] += 48;
+ sprite->pos1.x = sprite->data[0] >> 4;
+ sprite->pos1.y = sprite->data[1] >> 4;
+ sprite->pos2.y = gSineTable[(sprite->data[4] >> 4) + 0x40] >> 5;
+ sprite->data[5]++;
+ if (sprite->data[5] % gUnknown_203AB16)
+ {
+ LoadWordFromTwoHalfwords(&sprite->data[6], &v);
+ v = v * 1103515245 + 24691;
+ StoreWordInTwoHalfwords(&sprite->data[6], v);
+ v >>= 16;
+ sub_80EDD28(sprite->pos1.x, sprite->pos1.y + sprite->pos2.y, v);
+ }
+ if (sprite->pos1.x < -8)
+ DestroySprite(sprite);
+}
+
+static void sub_80EE350(struct Sprite * sprite)
+{
+ u32 v;
+
+ sprite->data[0] += sprite->data[2];
+ sprite->data[1] += sprite->data[3];
+ sprite->data[4]++;
+ sprite->data[5] += sprite->data[4];
+ sprite->data[7]++;
+ sprite->pos1.x = (u16)sprite->data[0] >> gUnknown_203AB22;
+ sprite->pos1.y = sprite->data[1] >> gUnknown_203AB24;
+ if (gUnknown_203AB1C && sprite->data[3] < 0)
+ sprite->pos2.y = sprite->data[5] >> gUnknown_203AB1C;
+ if (sprite->data[7] > gUnknown_203AB18)
+ {
+ sprite->invisible = !sprite->invisible;
+ if (sprite->data[7] > gUnknown_203AB1A)
+ DestroySprite(sprite);
+ }
+ if (sprite->pos1.y + sprite->pos2.y < 0 || sprite->pos1.y + sprite->pos2.y > 160)
+ DestroySprite(sprite);
+}
+
+static void sub_80EE40C(struct Sprite * sprite)
+{
+ if (sprite->data[2])
+ {
+ sprite->data[2]--;
+ sprite->data[1]++;
+ sprite->pos1.y = sprite->data[1] >> 4;
+ if (sprite->pos1.y > 0x56)
+ {
+ sprite->pos1.y = 0x4A;
+ sprite->data[1] = 0x4A0;
+ }
+ if (sprite->animEnded)
+ {
+ if (sprite->data[0] == 0)
+ {
+ sprite->pos1.x += 26;
+ if (sprite->pos1.x > 188)
+ {
+ sprite->pos1.x = 376 - sprite->pos1.x;
+ sprite->data[0] = 1;
+ }
+ }
+ else
+ {
+ sprite->pos1.x -= 26;
+ if (sprite->pos1.x < 52)
+ {
+ sprite->pos1.x = 104 - sprite->pos1.x;
+ sprite->data[0] = 0;
+ }
+ }
+ StartSpriteAnim(sprite, 1);
+ }
+ }
+ else
+ {
+ if (sprite->data[3])
+ DestroySprite(sprite);
+ if (sprite->animEnded)
+ StartSpriteAnim(sprite, 0);
+ sprite->data[1] += 4;
+ sprite->pos1.y = sprite->data[1] >> 4;
+ sprite->data[4]++;
+ if (sprite->data[4] > 50)
+ DestroySprite(sprite);
+ }
+}
+
+static void sub_80EE4DC(struct Sprite * sprite)
+{
+ if (sprite->animEnded)
+ DestroySprite(sprite);
+}
+
+static void sub_80EE4F8(struct IntroSequenceData * this)
+{
+ u8 spriteId = CreateSprite(&gUnknown_840BD88, 0, 0, 9);
+ this->field_0018 = &gSprites[spriteId];
+}
+
+static void sub_80EE528(struct Sprite * sprite, s16 a1, s16 a2, u16 a3)
+{
+ sprite->data[0] = a1 << 4;
+ sprite->data[1] = ((a2 - a1) << 4) / a3;
+ sprite->data[2] = a3;
+ sprite->data[3] = a2;
+ sprite->data[4] = 0;
+ sprite->pos1.x = a1;
+ sprite->pos1.y = 100;
+ sprite->callback = sub_80EE580;
+}
+
+static void sub_80EE580(struct Sprite * sprite)
+{
+ sprite->data[4]++;
+ if (sprite->data[4] >= 40)
+ {
+ if (sprite->data[1] > 1)
+ sprite->data[1]--;
+ }
+ sprite->data[0] += sprite->data[1];
+ sprite->pos1.x = sprite->data[0] >> 4;
+ if (sprite->pos1.x >= sprite->data[3])
+ {
+ sprite->pos1.x = sprite->data[3];
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+static bool32 sub_80EE5C8(struct IntroSequenceData * ptr)
+{
+ return ptr->field_0018->callback == sub_80EE580 ? TRUE : FALSE;
+}
+
+static void sub_80EE5E4(struct IntroSequenceData * ptr)
+{
+ StartSpriteAnim(ptr->field_0018, 2);
+ ptr->field_0018->data[0] = 0;
+ ptr->field_0018->data[1] = 0;
+ ptr->field_0018->pos2.y = 3;
+ ptr->field_0018->callback = sub_80EE610;
+}
+
+static void sub_80EE610(struct Sprite * sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[1]++;
+ if (sprite->data[1] > 8)
+ {
+ StartSpriteAnim(sprite, 1);
+ sprite->pos2.y = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ PlayCry3(SPECIES_NIDORINO, 0x3F, 1);
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ break;
+ case 2:
+ sprite->data[2]++;
+ if (sprite->data[2] > 1)
+ {
+ sprite->data[2] = 0;
+ sprite->pos2.y = sprite->pos2.y == 0 ? 1 : 0;
+ }
+ sprite->data[1]++;
+ if (sprite->data[1] > 48)
+ {
+ StartSpriteAnim(sprite, 0);
+ sprite->pos2.y = 0;
+ sprite->callback = SpriteCallbackDummy;
+ }
+ break;
+ }
+}
+
+static void sub_80EE6A4(struct IntroSequenceData * ptr)
+{
+ gUnknown_203AB0A = 16;
+ gUnknown_203AB04 = 3;
+ gUnknown_203AB08 = 5;
+ gUnknown_203AB06 = 0;
+ StartSpriteAnim(ptr->field_0018, 2);
+ ptr->field_0018->data[0] = 0;
+ ptr->field_0018->data[1] = 0;
+ ptr->field_0018->data[2] = 0;
+ ptr->field_0018->data[3] = 0;
+ ptr->field_0018->data[4] = 0;
+ ptr->field_0018->data[7] = 40;
+ ptr->field_0018->callback = sub_80EE704;
+}
+
+static void sub_80EE704(struct Sprite * sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[1]++;
+ if (sprite->data[1] > 4)
+ {
+ StartSpriteAnim(sprite, 3);
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ sprite->data[2] += sprite->data[7];
+ sprite->data[3] += 8;
+ sprite->pos2.x = sprite->data[2] >> 4;
+ sprite->pos2.y = -((gSineTable[sprite->data[3]] * gUnknown_203AB04) >> gUnknown_203AB08);
+ sprite->data[5]++;
+ if (sprite->data[5] > gUnknown_203AB06)
+ {
+ sprite->data[5] = 0;
+ sprite->data[7]--;
+ }
+ sprite->data[4]++;
+ if (sprite->data[4] > 15)
+ {
+ StartSpriteAnim(sprite, 2);
+ sprite->data[1] = 0;
+ sprite->data[6] = 0x4757;
+ sprite->data[7] = 28;
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sprite->data[2] += sprite->data[7];
+ sprite->pos2.x = sprite->data[2] >> 4;
+ sprite->data[1]++;
+ if (sprite->data[1] > 6)
+ {
+ sub_80EE864(sprite->pos1.x + sprite->pos2.x, sprite->pos1.y + sprite->pos2.y, sprite->data[6]);
+ sprite->data[6] *= 1103515245;
+ }
+ if (sprite->data[1] > 12)
+ {
+ StartSpriteAnim(sprite, 0);
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 3:
+ sprite->data[1]++;
+ if (sprite->data[1] > 16)
+ {
+ sub_80EE970(sprite, gUnknown_203AB0A, -sprite->pos2.x, 4);
+ }
+ break;
+ }
+}
+
+static bool8 sub_80EE850(struct IntroSequenceData * ptr)
+{
+ return ptr->field_0018->callback == SpriteCallbackDummy ? FALSE : TRUE;
+}
+
+static void sub_80EE864(s16 a1, s16 a2, s16 a3)
+{
+ int i;
+ u8 spriteId;
+
+ for (i = 0; i < 2; i++)
+ {
+ spriteId = CreateSprite(&gUnknown_840BEC4, a1 - 22, a2 + 24, 10);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].data[3] = (a3 % 13) + 8;
+ gSprites[spriteId].data[4] = a3 % 3;
+ gSprites[spriteId].data[7] = i;
+ a3 *= 1103515245;
+ }
+ }
+}
+
+static void sub_80EE8E4(struct Sprite * sprite)
+{
+ s16 * data = sprite->data;
+
+ switch (sprite->data[0])
+ {
+ case 0:
+ data[1] = sprite->pos1.x << 4;
+ data[2] = sprite->pos1.y << 4;
+ sprite->data[0]++;
+ // fallthrough
+ case 1:
+ data[1] -= data[3];
+ data[2] += data[4];
+ sprite->pos1.x = data[1] >> 4;
+ sprite->pos1.y = data[2] >> 4;
+ if (sprite->animEnded)
+ DestroySprite(sprite);
+ break;
+ }
+ data[7]++;
+ if (data[7] > 1)
+ {
+ data[7] = 0;
+ sprite->invisible ^= TRUE;
+ }
+}
+
+static void sub_80EE970(struct Sprite * sprite, u16 a1, s16 a2, u8 a3)
+{
+ sprite->data[0] = 0;
+ sprite->data[1] = a1;
+ sprite->data[2] = sprite->pos2.x << 4;
+ sprite->data[3] = (a2 << 4) / a1;
+ sprite->data[4] = 0;
+ sprite->data[5] = 0x800 / a1;
+ sprite->data[6] = 0;
+ sprite->data[7] = a3;
+ StartSpriteAnim(sprite, 2);
+ sprite->callback = sub_80EE9D4;
+}
+
+static void sub_80EE9D4(struct Sprite * sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[6]++;
+ if (sprite->data[6] > 4)
+ {
+ StartSpriteAnim(sprite, 3);
+ sprite->data[6] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ sprite->data[1]--;
+ if (sprite->data[1])
+ {
+ sprite->data[2] += sprite->data[3];
+ sprite->data[4] += sprite->data[5];
+ sprite->pos2.x = sprite->data[2] >> 4;
+ sprite->pos2.y = -(gSineTable[sprite->data[4] >> 4] >> sprite->data[7]);
+ }
+ else
+ {
+ sprite->pos2.x = (u16)sprite->data[2] >> 4;
+ sprite->pos2.y = 0;
+ StartSpriteAnim(sprite, 2);
+ if (sprite->data[7] == 5)
+ sprite->callback = SpriteCallbackDummy;
+ else
+ {
+ sprite->data[6] = 0;
+ sprite->data[0]++;
+ }
+ }
+ break;
+ case 2:
+ sprite->data[6]++;
+ if (sprite->data[6] > 4)
+ {
+ StartSpriteAnim(sprite, 0);
+ sprite->callback = SpriteCallbackDummy;
+ }
+ break;
+ }
+}
+
+static void sub_80EEA94(struct IntroSequenceData * ptr)
+{
+ ptr->field_0018->data[0] = 0;
+ ptr->field_0018->data[1] = 0;
+ ptr->field_0018->data[2] = 0;
+ ptr->field_0018->data[3] = 0;
+ ptr->field_0018->data[4] = 0;
+ ptr->field_0018->data[5] = 0;
+ ptr->field_0018->pos1.x += ptr->field_0018->pos2.x;
+ ptr->field_0018->pos2.x = 0;
+ gUnknown_203AB0C = 0x24;
+ gUnknown_203AB06 = 0x28;
+ gUnknown_203AB04 = 0x03;
+ gUnknown_203AB08 = 0x04;
+ ptr->field_0018->data[7] = 36;
+ StartSpriteAnim(ptr->field_0018, 2);
+ ptr->field_0018->callback = sub_80EEB08;
+}
+
+static void sub_80EEB08(struct Sprite * sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[1]++;
+ if (sprite->data[1] & 1)
+ {
+ sprite->data[2]++;
+ if (sprite->data[2] & 1)
+ sprite->pos2.x++;
+ else
+ sprite->pos2.x--;
+ }
+ if (sprite->data[1] > 17)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (++sprite->data[1] >= gUnknown_203AB06)
+ {
+ StartSpriteAnim(sprite, 4);
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sprite->data[1] += sprite->data[7];
+ sprite->pos2.x = -(sprite->data[1] >> 4);
+ sprite->pos2.y = -((gSineTable[sprite->data[1] >> 4] * gUnknown_203AB04) >> gUnknown_203AB08);
+ sprite->data[2]++;
+ if (sprite->data[7] > 12)
+ sprite->data[7]--;
+ if ((sprite->data[1] >> 4) > 0x3F)
+ sprite->callback = SpriteCallbackDummy;
+ break;
+ }
+}
+
+static void sub_80EEBE4(void)
+{
+ int i;
+
+ for (i = 0; i < NELEMS(gUnknown_840BEDC); i++)
+ {
+ LoadCompressedSpriteSheet(&gUnknown_840BEDC[i]);
+ }
+ // gUnknown_840BF14 is not properly terminated, so this
+ // call exhibits undefined behavior.
+ LoadSpritePalettes(gUnknown_840BF14);
+}
diff --git a/src/item.c b/src/item.c
new file mode 100644
index 000000000..3f33f464d
--- /dev/null
+++ b/src/item.c
@@ -0,0 +1,684 @@
+#include "global.h"
+#include "berry.h"
+#include "event_data.h"
+#include "item.h"
+#include "item_use.h"
+#include "load_save.h"
+#include "malloc.h"
+#include "quest_log.h"
+#include "string_util.h"
+#include "strings.h"
+#include "constants/hold_effects.h"
+#include "constants/items.h"
+#include "constants/maps.h"
+
+void SortAndCompactBagPocket(struct BagPocket * pocket);
+
+// Item descriptions and data
+#include "data/items.h"
+
+u16 GetBagItemQuantity(u16 * ptr)
+{
+ return gSaveBlock2Ptr->encryptionKey ^ *ptr;
+}
+
+void SetBagItemQuantity(u16 * ptr, u16 value)
+{
+ *ptr = value ^ gSaveBlock2Ptr->encryptionKey;
+}
+
+u16 GetPcItemQuantity(u16 * ptr)
+{
+ return 0 ^ *ptr;
+}
+
+void SetPcItemQuantity(u16 * ptr, u16 value)
+{
+ *ptr = value ^ 0;
+}
+
+void ApplyNewEncryptionKeyToBagItems(u32 key)
+{
+ u32 i, j;
+
+ for (i = 0; i < NUM_BAG_POCKETS; i++)
+ {
+ for (j = 0; j < gBagPockets[i].capacity; j++)
+ {
+ ApplyNewEncryptionKeyToHword(&gBagPockets[i].itemSlots[j].quantity, key);
+ }
+ }
+}
+
+void ApplyNewEncryptionKeyToBagItems_(u32 key)
+{
+ ApplyNewEncryptionKeyToBagItems(key);
+}
+
+void SetBagPocketsPointers(void)
+{
+ gBagPockets[POCKET_ITEMS - 1].itemSlots = gSaveBlock1Ptr->bagPocket_Items;
+ gBagPockets[POCKET_ITEMS - 1].capacity = BAG_ITEMS_COUNT;
+ gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots = gSaveBlock1Ptr->bagPocket_KeyItems;
+ gBagPockets[POCKET_KEY_ITEMS - 1].capacity = BAG_KEYITEMS_COUNT;
+ gBagPockets[POCKET_POKE_BALLS - 1].itemSlots = gSaveBlock1Ptr->bagPocket_PokeBalls;
+ gBagPockets[POCKET_POKE_BALLS - 1].capacity = BAG_POKEBALLS_COUNT;
+ gBagPockets[POCKET_TM_CASE - 1].itemSlots = gSaveBlock1Ptr->bagPocket_TMHM;
+ gBagPockets[POCKET_TM_CASE - 1].capacity = BAG_TMHM_COUNT;
+ gBagPockets[POCKET_BERRY_POUCH - 1].itemSlots = gSaveBlock1Ptr->bagPocket_Berries;
+ gBagPockets[POCKET_BERRY_POUCH - 1].capacity = BAG_BERRIES_COUNT;
+}
+
+void CopyItemName(u16 itemId, u8 * dest)
+{
+ if (itemId == ITEM_ENIGMA_BERRY)
+ {
+ StringCopy(dest, sub_809C8A0(43)->name);
+ StringAppend(dest, gUnknown_84162BD);
+ }
+ else
+ {
+ StringCopy(dest, ItemId_GetName(itemId));
+ }
+}
+
+s8 BagPocketGetFirstEmptySlot(u8 pocketId)
+{
+ u16 i;
+
+ for (i = 0; i < gBagPockets[pocketId].capacity; i++)
+ {
+ if (gBagPockets[pocketId].itemSlots[i].itemId == ITEM_NONE)
+ return i;
+ }
+
+ return -1;
+}
+
+bool8 IsPocketNotEmpty(u8 pocketId)
+{
+ u8 i;
+
+ for (i = 0; i < gBagPockets[pocketId - 1].capacity; i++)
+ {
+ if (gBagPockets[pocketId - 1].itemSlots[i].itemId != ITEM_NONE)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+bool8 CheckBagHasItem(u16 itemId, u16 count)
+{
+ u8 i;
+ u8 pocket;
+
+ if (ItemId_GetPocket(itemId) == 0)
+ return FALSE;
+
+ pocket = ItemId_GetPocket(itemId) - 1;
+ // Check for item slots that contain the item
+ for (i = 0; i < gBagPockets[pocket].capacity; i++)
+ {
+ if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
+ {
+ u16 quantity;
+ // Does this item slot contain enough of the item?
+ quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity);
+ if (quantity >= count)
+ return TRUE;
+ // RS and Emerald check whether there is enough of the
+ // item across all stacks.
+ // For whatever reason, FR/LG assume there's only one
+ // stack of the item.
+ else
+ return FALSE;
+ }
+ }
+ return FALSE;
+}
+
+bool8 CheckHasAtLeastOneBerry(void)
+{
+ u8 itemId;
+ bool8 exists;
+
+ exists = CheckBagHasItem(ITEM_BERRY_POUCH, 1);
+ if (!exists)
+ {
+ gSpecialVar_Result = FALSE;
+ return FALSE;
+ }
+ for (itemId = FIRST_BERRY_INDEX; itemId <= LAST_BERRY_INDEX; itemId++)
+ {
+ exists = CheckBagHasItem(itemId, 1);
+ if (exists)
+ {
+ gSpecialVar_Result = TRUE;
+ return TRUE;
+ }
+ }
+
+ gSpecialVar_Result = FALSE;
+ return FALSE;
+}
+
+bool8 CheckBagHasSpace(u16 itemId, u16 count)
+{
+ u8 i;
+ u8 pocket;
+
+ if (ItemId_GetPocket(itemId) == 0)
+ return FALSE;
+
+ pocket = ItemId_GetPocket(itemId) - 1;
+ // Check for item slots that contain the item
+ for (i = 0; i < gBagPockets[pocket].capacity; i++)
+ {
+ if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
+ {
+ u16 quantity;
+ // Does this stack have room for more??
+ quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity);
+ if (quantity + count <= 999)
+ return TRUE;
+ // RS and Emerald check whether there is enough of the
+ // item across all stacks.
+ // For whatever reason, FR/LG assume there's only one
+ // stack of the item.
+ else
+ return FALSE;
+ }
+ }
+
+ if (BagPocketGetFirstEmptySlot(pocket) != -1)
+ return TRUE;
+
+ return FALSE;
+}
+
+bool8 AddBagItem(u16 itemId, u16 count)
+{
+ u8 i;
+ u8 pocket;
+ s8 idx;
+
+ if (ItemId_GetPocket(itemId) == 0)
+ return FALSE;
+
+ pocket = ItemId_GetPocket(itemId) - 1;
+ for (i = 0; i < gBagPockets[pocket].capacity; i++)
+ {
+ if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
+ {
+ u16 quantity;
+ // Does this stack have room for more??
+ quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity);
+ if (quantity + count <= 999)
+ {
+ quantity += count;
+ SetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity, quantity);
+ return TRUE;
+ }
+ // RS and Emerald check whether there is enough of the
+ // item across all stacks.
+ // For whatever reason, FR/LG assume there's only one
+ // stack of the item.
+ else
+ return FALSE;
+ }
+ }
+
+ if (pocket == POCKET_TM_CASE - 1 && !CheckBagHasItem(ITEM_TM_CASE, 1))
+ {
+ idx = BagPocketGetFirstEmptySlot(POCKET_KEY_ITEMS - 1);
+ if (idx == -1)
+ return FALSE;
+ gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].itemId = ITEM_TM_CASE;
+ SetBagItemQuantity(&gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].quantity, 1);
+ }
+
+ if (pocket == POCKET_BERRY_POUCH - 1 && !CheckBagHasItem(ITEM_BERRY_POUCH, 1))
+ {
+ idx = BagPocketGetFirstEmptySlot(POCKET_KEY_ITEMS - 1);
+ if (idx == -1)
+ return FALSE;
+ gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].itemId = ITEM_BERRY_POUCH;
+ SetBagItemQuantity(&gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].quantity, 1);
+ FlagSet(FLAG_0x847);
+ }
+
+ if (itemId == ITEM_BERRY_POUCH)
+ FlagSet(FLAG_0x847);
+
+ idx = BagPocketGetFirstEmptySlot(pocket);
+ if (idx == -1)
+ return FALSE;
+
+ gBagPockets[pocket].itemSlots[idx].itemId = itemId;
+ SetBagItemQuantity(&gBagPockets[pocket].itemSlots[idx].quantity, count);
+ return TRUE;
+}
+
+bool8 RemoveBagItem(u16 itemId, u16 count)
+{
+ u8 i;
+ u8 pocket;
+
+ if (ItemId_GetPocket(itemId) == 0)
+ return FALSE;
+
+ if (itemId == ITEM_NONE)
+ return FALSE;
+
+ pocket = ItemId_GetPocket(itemId) - 1;
+ // Check for item slots that contain the item
+ for (i = 0; i < gBagPockets[pocket].capacity; i++)
+ {
+ if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
+ {
+ u16 quantity;
+ // Does this item slot contain enough of the item?
+ quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity);
+ if (quantity >= count)
+ {
+ quantity -= count;
+ SetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity, quantity);
+ if (quantity == 0)
+ gBagPockets[pocket].itemSlots[i].itemId = ITEM_NONE;
+ return TRUE;
+ }
+ // RS and Emerald check whether there is enough of the
+ // item across all stacks.
+ // For whatever reason, FR/LG assume there's only one
+ // stack of the item.
+ else
+ return FALSE;
+ }
+ }
+ return FALSE;
+}
+
+u8 GetPocketByItemId(u16 itemId)
+{
+ return ItemId_GetPocket(itemId); // wow such important
+}
+
+void ClearItemSlots(struct ItemSlot * slots, u8 capacity)
+{
+ u16 i;
+
+ for (i = 0; i < capacity; i++)
+ {
+ slots[i].itemId = ITEM_NONE;
+ SetBagItemQuantity(&slots[i].quantity, 0);
+ }
+}
+
+void ClearPCItemSlots(void)
+{
+ u16 i;
+
+ for (i = 0; i < PC_ITEMS_COUNT; i++)
+ {
+ gSaveBlock1Ptr->pcItems[i].itemId = ITEM_NONE;
+ SetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity, 0);
+ }
+}
+
+void ClearItemSlotsInAllBagPockets(void)
+{
+ u16 i;
+
+ for (i = 0; i < 5; i++)
+ {
+ ClearItemSlots(gBagPockets[i].itemSlots, gBagPockets[i].capacity);
+ }
+}
+
+s8 PCItemsGetFirstEmptySlot(void)
+{
+ s8 i;
+
+ for (i = 0; i < PC_ITEMS_COUNT; i++)
+ {
+ if (gSaveBlock1Ptr->pcItems[i].itemId == ITEM_NONE)
+ return i;
+ }
+
+ return -1;
+}
+
+u8 CountItemsInPC(void)
+{
+ u8 count = 0;
+ u8 i;
+
+ for (i = 0; i < PC_ITEMS_COUNT; i++)
+ {
+ if (gSaveBlock1Ptr->pcItems[i].itemId != ITEM_NONE)
+ count++;
+ }
+
+ return count;
+}
+
+bool8 CheckPCHasItem(u16 itemId, u16 count)
+{
+ u8 i;
+ u16 quantity;
+
+ for (i = 0; i < PC_ITEMS_COUNT; i++)
+ {
+ if (gSaveBlock1Ptr->pcItems[i].itemId == itemId)
+ {
+ quantity = GetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity);
+ if (quantity >= count)
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+bool8 AddPCItem(u16 itemId, u16 count)
+{
+ u8 i;
+ u16 quantity;
+ s8 idx;
+
+ for (i = 0; i < PC_ITEMS_COUNT; i++)
+ {
+ if (gSaveBlock1Ptr->pcItems[i].itemId == itemId)
+ {
+ quantity = GetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity);
+ if (quantity + count <= 999)
+ {
+ quantity += count;
+ SetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity, quantity);
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+ }
+
+ idx = PCItemsGetFirstEmptySlot();
+ if (idx == -1)
+ return FALSE;
+
+ gSaveBlock1Ptr->pcItems[idx].itemId = itemId;
+ SetPcItemQuantity(&gSaveBlock1Ptr->pcItems[idx].quantity, count);
+ return TRUE;
+}
+
+void RemoveItemFromPC(u16 itemId, u16 count)
+{
+ u32 i;
+ u16 quantity;
+
+ if (itemId == ITEM_NONE)
+ return;
+
+ for (i = 0; i < PC_ITEMS_COUNT; i++)
+ {
+ if (gSaveBlock1Ptr->pcItems[i].itemId == itemId)
+ break;
+ }
+
+ if (i != PC_ITEMS_COUNT)
+ {
+ quantity = GetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity) - count;
+ SetPcItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity, quantity);
+ if (quantity == 0)
+ gSaveBlock1Ptr->pcItems[i].itemId = ITEM_NONE;
+ }
+}
+
+void ItemPcCompaction(void)
+{
+ u16 i, j;
+ struct ItemSlot tmp;
+
+ for (i = 0; i < PC_ITEMS_COUNT - 1; i++)
+ {
+ for (j = i + 1; j < PC_ITEMS_COUNT; j++)
+ {
+ if (gSaveBlock1Ptr->pcItems[i].itemId == ITEM_NONE)
+ {
+ tmp = gSaveBlock1Ptr->pcItems[i];
+ gSaveBlock1Ptr->pcItems[i] = gSaveBlock1Ptr->pcItems[j];
+ gSaveBlock1Ptr->pcItems[j] = tmp;
+ }
+ }
+ }
+}
+
+void RegisteredItemHandleBikeSwap(void)
+{
+ switch (gSaveBlock1Ptr->registeredItem)
+ {
+ case ITEM_MACH_BIKE:
+ gSaveBlock1Ptr->registeredItem = ITEM_ACRO_BIKE;
+ break;
+ case ITEM_ACRO_BIKE:
+ gSaveBlock1Ptr->registeredItem = ITEM_MACH_BIKE;
+ break;
+ }
+}
+
+void SwapItemSlots(struct ItemSlot * a, struct ItemSlot * b)
+{
+ struct ItemSlot c;
+ c = *a;
+ *a = *b;
+ *b = c;
+}
+
+void BagPocketCompaction(struct ItemSlot * slots, u8 capacity)
+{
+ u16 i, j;
+
+ for (i = 0; i < capacity - 1; i++)
+ {
+ for (j = i + 1; j < capacity; j++)
+ {
+ if (GetBagItemQuantity(&slots[i].quantity) == 0)
+ {
+ SwapItemSlots(&slots[i], &slots[j]);
+ }
+ }
+ }
+}
+
+void SortPocketAndPlaceHMsFirst(struct BagPocket * pocket)
+{
+ u16 i;
+ u16 j = 0;
+ u16 k;
+ struct ItemSlot * buff;
+
+ SortAndCompactBagPocket(pocket);
+
+ for (i = 0; i < pocket->capacity; i++)
+ {
+ if (pocket->itemSlots[i].itemId == ITEM_NONE && GetBagItemQuantity(&pocket->itemSlots[i].quantity) == 0)
+ return;
+ if (pocket->itemSlots[i].itemId >= ITEM_HM01 && GetBagItemQuantity(&pocket->itemSlots[i].quantity) != 0)
+ {
+ for (j = i + 1; j < pocket->capacity; j++)
+ {
+ if (pocket->itemSlots[j].itemId == ITEM_NONE && GetBagItemQuantity(&pocket->itemSlots[j].quantity) == 0)
+ break;
+ }
+ break;
+ }
+ }
+
+ for (k = 0; k < pocket->capacity; k++)
+ pocket->itemSlots[k].quantity = GetBagItemQuantity(&pocket->itemSlots[k].quantity);
+ buff = AllocZeroed(pocket->capacity * sizeof(struct ItemSlot));
+ CpuCopy16(pocket->itemSlots + i, buff, (j - i) * sizeof(struct ItemSlot));
+ CpuCopy16(pocket->itemSlots, buff + (j - i), i * sizeof(struct ItemSlot));
+ CpuCopy16(buff, pocket->itemSlots, pocket->capacity * sizeof(struct ItemSlot));
+ for (k = 0; k < pocket->capacity; k++)
+ SetBagItemQuantity(&pocket->itemSlots[k].quantity, pocket->itemSlots[k].quantity);
+ Free(buff);
+}
+
+void SortAndCompactBagPocket(struct BagPocket * pocket)
+{
+ u16 i, j;
+
+ for (i = 0; i < pocket->capacity; i++)
+ {
+ for (j = i + 1; j < pocket->capacity; j++)
+ {
+ if (GetBagItemQuantity(&pocket->itemSlots[i].quantity) == 0 || (GetBagItemQuantity(&pocket->itemSlots[j].quantity) != 0 && pocket->itemSlots[i].itemId > pocket->itemSlots[j].itemId))
+ SwapItemSlots(&pocket->itemSlots[i], &pocket->itemSlots[j]);
+ }
+ }
+}
+
+u16 BagGetItemIdByPocketPosition(u8 pocketId, u16 slotId)
+{
+ return gBagPockets[pocketId - 1].itemSlots[slotId].itemId;
+}
+
+u16 BagGetQuantityByPocketPosition(u8 pocketId, u16 slotId)
+{
+ return GetBagItemQuantity(&gBagPockets[pocketId - 1].itemSlots[slotId].quantity);
+}
+
+u16 BagGetQuantityByItemId(u16 itemId)
+{
+ u16 i;
+ struct BagPocket * pocket = &gBagPockets[ItemId_GetPocket(itemId) - 1];
+
+ for (i = 0; i < pocket->capacity; i++)
+ {
+ if (pocket->itemSlots[i].itemId == itemId)
+ return GetBagItemQuantity(&pocket->itemSlots[i].quantity);
+ }
+
+ return 0;
+}
+
+void sub_809A824(u16 itemId)
+{
+ struct QuestLogStruct_809A824
+ {
+ u16 itemId;
+ u8 mapSectionId;
+ } * ptr;
+ if
+ (
+ itemId == ITEM_OAKS_PARCEL
+ || itemId == ITEM_POKE_FLUTE
+ || itemId == ITEM_SECRET_KEY
+ || itemId == ITEM_BIKE_VOUCHER
+ || itemId == ITEM_GOLD_TEETH
+ || itemId == ITEM_OLD_AMBER
+ || itemId == ITEM_CARD_KEY
+ || itemId == ITEM_LIFT_KEY
+ || itemId == ITEM_HELIX_FOSSIL
+ || itemId == ITEM_DOME_FOSSIL
+ || itemId == ITEM_SILPH_SCOPE
+ || itemId == ITEM_BICYCLE
+ || itemId == ITEM_TOWN_MAP
+ || itemId == ITEM_VS_SEEKER
+ || itemId == ITEM_TEACHY_TV
+ || itemId == ITEM_RAINBOW_PASS
+ || itemId == ITEM_TEA
+ || itemId == ITEM_POWDER_JAR
+ || itemId == ITEM_RUBY
+ || itemId == ITEM_SAPPHIRE
+ )
+ {
+ if (itemId != ITEM_TOWN_MAP || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_GARYS_HOUSE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_GARYS_HOUSE)))
+ {
+ ptr = malloc(sizeof(*ptr));
+ ptr->itemId = itemId;
+ ptr->mapSectionId = gMapHeader.regionMapSectionId;
+ sub_8113550(40, (void *)ptr);
+ free(ptr);
+ }
+ }
+}
+
+u16 SanitizeItemId(u16 itemId)
+{
+ if (itemId >= ITEM_N_A)
+ return ITEM_NONE;
+ return itemId;
+}
+
+const u8 * ItemId_GetName(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].name;
+}
+
+u16 itemid_get_number(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].itemId;
+}
+
+u16 itemid_get_market_price(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].price;
+}
+
+u8 ItemId_GetHoldEffect(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].holdEffect;
+}
+
+u8 ItemId_GetHoldEffectParam(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].holdEffectParam;
+}
+
+const u8 * ItemId_GetDescription(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].description;
+}
+
+bool8 itemid_is_unique(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].importance;
+}
+
+u8 itemid_get_x19(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].exitsBagOnUse;
+}
+
+u8 ItemId_GetPocket(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].pocket;
+}
+
+u8 ItemId_GetType(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].type;
+}
+
+ItemUseFunc ItemId_GetFieldFunc(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].fieldUseFunc;
+}
+
+bool8 ItemId_GetBattleUsage(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].battleUsage;
+}
+
+ItemUseFunc ItemId_GetBattleFunc(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].battleUseFunc;
+}
+
+u8 ItemId_GetSecondaryId(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].secondaryId;
+}
diff --git a/src/item_menu_icons.c b/src/item_menu_icons.c
new file mode 100644
index 000000000..0c2c60437
--- /dev/null
+++ b/src/item_menu_icons.c
@@ -0,0 +1,783 @@
+#include "global.h"
+#include "decompress.h"
+#include "graphics.h"
+#include "item_menu_icons.h"
+#include "malloc.h"
+#include "constants/items.h"
+
+static EWRAM_DATA u8 gUnknown_2039878[12] = {0};
+EWRAM_DATA void * gUnknown_2039884 = NULL;
+static EWRAM_DATA void * gUnknown_2039888 = NULL;
+
+static void sub_8098560(struct Sprite * sprite);
+static void sub_80985BC(struct Sprite * sprite);
+
+static const struct OamData gUnknown_83D416C = {
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .shape = ST_OAM_SQUARE,
+ .size = 3,
+ .priority = 1,
+ .paletteNum = 0
+};
+
+static const union AnimCmd gUnknown_83D4174[] = {
+ ANIMCMD_FRAME( 0, 5),
+ ANIMCMD_FRAME(0x40, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_83D4180[] = {
+ ANIMCMD_FRAME( 0, 5),
+ ANIMCMD_FRAME(0x80, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_83D418C[] = {
+ ANIMCMD_FRAME( 0, 5),
+ ANIMCMD_FRAME(0xc0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gUnknown_83D4198[] = {
+ gUnknown_83D4180,
+ gUnknown_83D418C,
+ gUnknown_83D4174
+};
+
+static const union AffineAnimCmd gUnknown_83D41A4[] = {
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd gUnknown_83D41B4[] = {
+ AFFINEANIMCMD_FRAME(0, 0, -2, 2),
+ AFFINEANIMCMD_FRAME(0, 0, 2, 4),
+ AFFINEANIMCMD_FRAME(0, 0, -2, 4),
+ AFFINEANIMCMD_FRAME(0, 0, 2, 2),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const gUnknown_83D41DC[] = {
+ gUnknown_83D41A4,
+ gUnknown_83D41B4
+};
+
+const struct CompressedSpriteSheet gUnknown_83D41E4 = {
+ gUnknown_8E8362C,
+ 0x2000,
+ 100
+};
+
+const struct CompressedSpriteSheet gUnknown_83D41EC = {
+ gUnknown_8E83DBC,
+ 0x2000,
+ 100
+};
+
+const struct CompressedSpritePalette gUnknown_83D41F4 = {
+ gUnknown_8E84560,
+ 100
+};
+
+static const struct SpriteTemplate gUnknown_83D41FC = {
+ 100,
+ 100,
+ &gUnknown_83D416C,
+ gUnknown_83D4198,
+ NULL,
+ gUnknown_83D41DC,
+ SpriteCallbackDummy
+};
+
+static const struct OamData gUnknown_83D4214 = {
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .shape = ST_OAM_SQUARE,
+ .size = 1,
+ .priority = 1,
+ .paletteNum = 1
+};
+
+static const union AnimCmd gUnknown_83D421C[] = {
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_83D4224[] = {
+ ANIMCMD_FRAME(4, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_83D422C[] = {
+ ANIMCMD_FRAME(0, 0, .hFlip = TRUE),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gUnknown_83D4234[] = {
+ gUnknown_83D421C,
+ gUnknown_83D4224,
+ gUnknown_83D422C
+};
+
+const struct CompressedSpriteSheet gBagSwapSpriteSheet = {
+ gFile_graphics_interface_bag_swap_sheet,
+ 0x100,
+ 101
+};
+
+const struct CompressedSpritePalette gBagSwapSpritePalette = {
+ gFile_graphics_interface_bag_swap_palette,
+ 101
+};
+
+static const struct SpriteTemplate gUnknown_83D4250 = {
+ 101,
+ 101,
+ &gUnknown_83D4214,
+ gUnknown_83D4234,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCallbackDummy
+};
+
+static const struct OamData gUnknown_83D4268 = {
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .shape = ST_OAM_SQUARE,
+ .size = 2,
+ .priority = 1,
+ .paletteNum = 2
+};
+
+static const union AnimCmd gUnknown_83D4270[] = {
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gUnknown_83D4278[] = {
+ gUnknown_83D4270
+};
+
+static const struct SpriteTemplate gUnknown_83D427C = {
+ 102,
+ 102,
+ &gUnknown_83D4268,
+ gUnknown_83D4278,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCallbackDummy
+};
+
+static const void *const gUnknown_83D4294[][2] = {
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_master_ball_sheet, gFile_graphics_items_icon_palettes_master_ball_palette},
+ {gFile_graphics_items_icons_ultra_ball_sheet, gFile_graphics_items_icon_palettes_ultra_ball_palette},
+ {gFile_graphics_items_icons_great_ball_sheet, gFile_graphics_items_icon_palettes_great_ball_palette},
+ {gFile_graphics_items_icons_poke_ball_sheet, gFile_graphics_items_icon_palettes_poke_ball_palette},
+ {gFile_graphics_items_icons_safari_ball_sheet, gFile_graphics_items_icon_palettes_safari_ball_palette},
+ {gFile_graphics_items_icons_net_ball_sheet, gFile_graphics_items_icon_palettes_net_ball_palette},
+ {gFile_graphics_items_icons_dive_ball_sheet, gFile_graphics_items_icon_palettes_dive_ball_palette},
+ {gFile_graphics_items_icons_nest_ball_sheet, gFile_graphics_items_icon_palettes_nest_ball_palette},
+ {gFile_graphics_items_icons_repeat_ball_sheet, gFile_graphics_items_icon_palettes_repeat_ball_palette},
+ {gFile_graphics_items_icons_timer_ball_sheet, gFile_graphics_items_icon_palettes_repeat_ball_palette},
+ {gFile_graphics_items_icons_luxury_ball_sheet, gFile_graphics_items_icon_palettes_luxury_ball_palette},
+ {gFile_graphics_items_icons_premier_ball_sheet, gFile_graphics_items_icon_palettes_luxury_ball_palette},
+ {gFile_graphics_items_icons_potion_sheet, gFile_graphics_items_icon_palettes_potion_palette},
+ {gFile_graphics_items_icons_antidote_sheet, gFile_graphics_items_icon_palettes_antidote_palette},
+ {gFile_graphics_items_icons_status_heal_sheet, gFile_graphics_items_icon_palettes_burn_heal_palette},
+ {gFile_graphics_items_icons_status_heal_sheet, gFile_graphics_items_icon_palettes_ice_heal_palette},
+ {gFile_graphics_items_icons_status_heal_sheet, gFile_graphics_items_icon_palettes_awakening_palette},
+ {gFile_graphics_items_icons_status_heal_sheet, gFile_graphics_items_icon_palettes_paralyze_heal_palette},
+ {gFile_graphics_items_icons_large_potion_sheet, gFile_graphics_items_icon_palettes_full_restore_palette},
+ {gFile_graphics_items_icons_large_potion_sheet, gFile_graphics_items_icon_palettes_max_potion_palette},
+ {gFile_graphics_items_icons_potion_sheet, gFile_graphics_items_icon_palettes_hyper_potion_palette},
+ {gFile_graphics_items_icons_potion_sheet, gFile_graphics_items_icon_palettes_super_potion_palette},
+ {gFile_graphics_items_icons_full_heal_sheet, gFile_graphics_items_icon_palettes_full_heal_palette},
+ {gFile_graphics_items_icons_revive_sheet, gFile_graphics_items_icon_palettes_revive_palette},
+ {gFile_graphics_items_icons_max_revive_sheet, gFile_graphics_items_icon_palettes_revive_palette},
+ {gFile_graphics_items_icons_fresh_water_sheet, gFile_graphics_items_icon_palettes_fresh_water_palette},
+ {gFile_graphics_items_icons_soda_pop_sheet, gFile_graphics_items_icon_palettes_soda_pop_palette},
+ {gFile_graphics_items_icons_lemonade_sheet, gFile_graphics_items_icon_palettes_lemonade_palette},
+ {gFile_graphics_items_icons_moomoo_milk_sheet, gFile_graphics_items_icon_palettes_moomoo_milk_palette},
+ {gFile_graphics_items_icons_powder_sheet, gFile_graphics_items_icon_palettes_energy_powder_palette},
+ {gFile_graphics_items_icons_energy_root_sheet, gFile_graphics_items_icon_palettes_energy_root_palette},
+ {gFile_graphics_items_icons_powder_sheet, gFile_graphics_items_icon_palettes_heal_powder_palette},
+ {gFile_graphics_items_icons_revival_herb_sheet, gFile_graphics_items_icon_palettes_revival_herb_palette},
+ {gFile_graphics_items_icons_ether_sheet, gFile_graphics_items_icon_palettes_ether_palette},
+ {gFile_graphics_items_icons_ether_sheet, gFile_graphics_items_icon_palettes_max_ether_palette},
+ {gFile_graphics_items_icons_ether_sheet, gFile_graphics_items_icon_palettes_elixir_palette},
+ {gFile_graphics_items_icons_ether_sheet, gFile_graphics_items_icon_palettes_max_elixir_palette},
+ {gFile_graphics_items_icons_lava_cookie_sheet, gFile_graphics_items_icon_palettes_lava_cookie_and_letter_palette},
+ {gFile_graphics_items_icons_flute_sheet, gFile_graphics_items_icon_palettes_blue_flute_palette},
+ {gFile_graphics_items_icons_flute_sheet, gFile_graphics_items_icon_palettes_yellow_flute_palette},
+ {gFile_graphics_items_icons_flute_sheet, gFile_graphics_items_icon_palettes_red_flute_palette},
+ {gFile_graphics_items_icons_flute_sheet, gFile_graphics_items_icon_palettes_black_flute_palette},
+ {gFile_graphics_items_icons_flute_sheet, gFile_graphics_items_icon_palettes_white_flute_palette},
+ {gFile_graphics_items_icons_berry_juice_sheet, gFile_graphics_items_icon_palettes_berry_juice_palette},
+ {gFile_graphics_items_icons_sacred_ash_sheet, gFile_graphics_items_icon_palettes_sacred_ash_palette},
+ {gFile_graphics_items_icons_powder_sheet, gFile_graphics_items_icon_palettes_shoal_salt_palette},
+ {gFile_graphics_items_icons_shoal_shell_sheet, gFile_graphics_items_icon_palettes_shell_palette},
+ {gFile_graphics_items_icons_shard_sheet, gFile_graphics_items_icon_palettes_red_shard_palette},
+ {gFile_graphics_items_icons_shard_sheet, gFile_graphics_items_icon_palettes_blue_shard_palette},
+ {gFile_graphics_items_icons_shard_sheet, gFile_graphics_items_icon_palettes_yellow_shard_palette},
+ {gFile_graphics_items_icons_shard_sheet, gFile_graphics_items_icon_palettes_green_shard_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_hp_up_sheet, gFile_graphics_items_icon_palettes_hp_up_palette},
+ {gFile_graphics_items_icons_vitamin_sheet, gFile_graphics_items_icon_palettes_protein_palette},
+ {gFile_graphics_items_icons_vitamin_sheet, gFile_graphics_items_icon_palettes_iron_palette},
+ {gFile_graphics_items_icons_vitamin_sheet, gFile_graphics_items_icon_palettes_carbos_palette},
+ {gFile_graphics_items_icons_vitamin_sheet, gFile_graphics_items_icon_palettes_calcium_palette},
+ {gFile_graphics_items_icons_rare_candy_sheet, gFile_graphics_items_icon_palettes_rare_candy_palette},
+ {gFile_graphics_items_icons_pp_up_sheet, gFile_graphics_items_icon_palettes_pp_up_palette},
+ {gFile_graphics_items_icons_vitamin_sheet, gFile_graphics_items_icon_palettes_zinc_palette},
+ {gFile_graphics_items_icons_pp_max_sheet, gFile_graphics_items_icon_palettes_pp_max_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_battle_stat_item_sheet, gFile_graphics_items_icon_palettes_guard_spec_palette},
+ {gFile_graphics_items_icons_battle_stat_item_sheet, gFile_graphics_items_icon_palettes_dire_hit_palette},
+ {gFile_graphics_items_icons_battle_stat_item_sheet, gFile_graphics_items_icon_palettes_x_attack_palette},
+ {gFile_graphics_items_icons_battle_stat_item_sheet, gFile_graphics_items_icon_palettes_x_defend_palette},
+ {gFile_graphics_items_icons_battle_stat_item_sheet, gFile_graphics_items_icon_palettes_x_speed_palette},
+ {gFile_graphics_items_icons_battle_stat_item_sheet, gFile_graphics_items_icon_palettes_x_accuracy_palette},
+ {gFile_graphics_items_icons_battle_stat_item_sheet, gFile_graphics_items_icon_palettes_x_special_palette},
+ {gFile_graphics_items_icons_poke_doll_sheet, gFile_graphics_items_icon_palettes_poke_doll_palette},
+ {gFile_graphics_items_icons_fluffy_tail_sheet, gFile_graphics_items_icon_palettes_fluffy_tail_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_repel_sheet, gFile_graphics_items_icon_palettes_super_repel_palette},
+ {gFile_graphics_items_icons_repel_sheet, gFile_graphics_items_icon_palettes_max_repel_palette},
+ {gFile_graphics_items_icons_escape_rope_sheet, gFile_graphics_items_icon_palettes_escape_rope_palette},
+ {gFile_graphics_items_icons_repel_sheet, gFile_graphics_items_icon_palettes_repel_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_sun_stone_sheet, gFile_graphics_items_icon_palettes_sun_stone_palette},
+ {gFile_graphics_items_icons_moon_stone_sheet, gFile_graphics_items_icon_palettes_moon_stone_palette},
+ {gFile_graphics_items_icons_fire_stone_sheet, gFile_graphics_items_icon_palettes_fire_stone_palette},
+ {gFile_graphics_items_icons_thunder_stone_sheet, gFile_graphics_items_icon_palettes_thunder_stone_palette},
+ {gFile_graphics_items_icons_water_stone_sheet, gFile_graphics_items_icon_palettes_water_stone_palette},
+ {gFile_graphics_items_icons_leaf_stone_sheet, gFile_graphics_items_icon_palettes_leaf_stone_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_tiny_mushroom_sheet, gFile_graphics_items_icon_palettes_mushroom_palette},
+ {gFile_graphics_items_icons_big_mushroom_sheet, gFile_graphics_items_icon_palettes_mushroom_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_pearl_sheet, gFile_graphics_items_icon_palettes_pearl_palette},
+ {gFile_graphics_items_icons_big_pearl_sheet, gFile_graphics_items_icon_palettes_pearl_palette},
+ {gFile_graphics_items_icons_stardust_sheet, gFile_graphics_items_icon_palettes_star_palette},
+ {gFile_graphics_items_icons_star_piece_sheet, gFile_graphics_items_icon_palettes_star_palette},
+ {gFile_graphics_items_icons_nugget_sheet, gFile_graphics_items_icon_palettes_nugget_palette},
+ {gFile_graphics_items_icons_heart_scale_sheet, gFile_graphics_items_icon_palettes_heart_scale_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_orange_mail_sheet, gFile_graphics_items_icon_palettes_orange_mail_palette},
+ {gFile_graphics_items_icons_harbor_mail_sheet, gFile_graphics_items_icon_palettes_harbor_mail_palette},
+ {gFile_graphics_items_icons_glitter_mail_sheet, gFile_graphics_items_icon_palettes_glitter_mail_palette},
+ {gFile_graphics_items_icons_mech_mail_sheet, gFile_graphics_items_icon_palettes_mech_mail_palette},
+ {gFile_graphics_items_icons_wood_mail_sheet, gFile_graphics_items_icon_palettes_wood_mail_palette},
+ {gFile_graphics_items_icons_wave_mail_sheet, gFile_graphics_items_icon_palettes_wave_mail_palette},
+ {gFile_graphics_items_icons_bead_mail_sheet, gFile_graphics_items_icon_palettes_bead_mail_palette},
+ {gFile_graphics_items_icons_shadow_mail_sheet, gFile_graphics_items_icon_palettes_shadow_mail_palette},
+ {gFile_graphics_items_icons_tropic_mail_sheet, gFile_graphics_items_icon_palettes_tropic_mail_palette},
+ {gFile_graphics_items_icons_dream_mail_sheet, gFile_graphics_items_icon_palettes_dream_mail_palette},
+ {gFile_graphics_items_icons_fab_mail_sheet, gFile_graphics_items_icon_palettes_fab_mail_palette},
+ {gFile_graphics_items_icons_retro_mail_sheet, gFile_graphics_items_icon_palettes_retro_mail_palette},
+ {gFile_graphics_items_icons_cheri_berry_sheet, gFile_graphics_items_icon_palettes_cheri_berry_palette},
+ {gFile_graphics_items_icons_chesto_berry_sheet, gFile_graphics_items_icon_palettes_chesto_berry_palette},
+ {gFile_graphics_items_icons_pecha_berry_sheet, gFile_graphics_items_icon_palettes_pecha_berry_palette},
+ {gFile_graphics_items_icons_rawst_berry_sheet, gFile_graphics_items_icon_palettes_rawst_berry_palette},
+ {gFile_graphics_items_icons_aspear_berry_sheet, gFile_graphics_items_icon_palettes_aspear_berry_palette},
+ {gFile_graphics_items_icons_leppa_berry_sheet, gFile_graphics_items_icon_palettes_leppa_berry_palette},
+ {gFile_graphics_items_icons_oran_berry_sheet, gFile_graphics_items_icon_palettes_oran_berry_palette},
+ {gFile_graphics_items_icons_persim_berry_sheet, gFile_graphics_items_icon_palettes_persim_berry_palette},
+ {gFile_graphics_items_icons_lum_berry_sheet, gFile_graphics_items_icon_palettes_lum_berry_palette},
+ {gFile_graphics_items_icons_sitrus_berry_sheet, gFile_graphics_items_icon_palettes_sitrus_berry_palette},
+ {gFile_graphics_items_icons_figy_berry_sheet, gFile_graphics_items_icon_palettes_figy_berry_palette},
+ {gFile_graphics_items_icons_wiki_berry_sheet, gFile_graphics_items_icon_palettes_wiki_berry_palette},
+ {gFile_graphics_items_icons_mago_berry_sheet, gFile_graphics_items_icon_palettes_mago_berry_palette},
+ {gFile_graphics_items_icons_aguav_berry_sheet, gFile_graphics_items_icon_palettes_aguav_berry_palette},
+ {gFile_graphics_items_icons_iapapa_berry_sheet, gFile_graphics_items_icon_palettes_iapapa_berry_palette},
+ {gFile_graphics_items_icons_razz_berry_sheet, gFile_graphics_items_icon_palettes_razz_berry_palette},
+ {gFile_graphics_items_icons_bluk_berry_sheet, gFile_graphics_items_icon_palettes_bluk_berry_palette},
+ {gFile_graphics_items_icons_nanab_berry_sheet, gFile_graphics_items_icon_palettes_nanab_berry_palette},
+ {gFile_graphics_items_icons_wepear_berry_sheet, gFile_graphics_items_icon_palettes_wepear_berry_palette},
+ {gFile_graphics_items_icons_pinap_berry_sheet, gFile_graphics_items_icon_palettes_pinap_berry_palette},
+ {gFile_graphics_items_icons_pomeg_berry_sheet, gFile_graphics_items_icon_palettes_pomeg_berry_palette},
+ {gFile_graphics_items_icons_kelpsy_berry_sheet, gFile_graphics_items_icon_palettes_kelpsy_berry_palette},
+ {gFile_graphics_items_icons_qualot_berry_sheet, gFile_graphics_items_icon_palettes_qualot_berry_palette},
+ {gFile_graphics_items_icons_hondew_berry_sheet, gFile_graphics_items_icon_palettes_hondew_berry_palette},
+ {gFile_graphics_items_icons_grepa_berry_sheet, gFile_graphics_items_icon_palettes_grepa_berry_palette},
+ {gFile_graphics_items_icons_tamato_berry_sheet, gFile_graphics_items_icon_palettes_tamato_berry_palette},
+ {gFile_graphics_items_icons_cornn_berry_sheet, gFile_graphics_items_icon_palettes_cornn_berry_palette},
+ {gFile_graphics_items_icons_magost_berry_sheet, gFile_graphics_items_icon_palettes_magost_berry_palette},
+ {gFile_graphics_items_icons_rabuta_berry_sheet, gFile_graphics_items_icon_palettes_rabuta_berry_palette},
+ {gFile_graphics_items_icons_nomel_berry_sheet, gFile_graphics_items_icon_palettes_nomel_berry_palette},
+ {gFile_graphics_items_icons_spelon_berry_sheet, gFile_graphics_items_icon_palettes_spelon_berry_palette},
+ {gFile_graphics_items_icons_pamtre_berry_sheet, gFile_graphics_items_icon_palettes_pamtre_berry_palette},
+ {gFile_graphics_items_icons_watmel_berry_sheet, gFile_graphics_items_icon_palettes_watmel_berry_palette},
+ {gFile_graphics_items_icons_durin_berry_sheet, gFile_graphics_items_icon_palettes_durin_berry_palette},
+ {gFile_graphics_items_icons_belue_berry_sheet, gFile_graphics_items_icon_palettes_belue_berry_palette},
+ {gFile_graphics_items_icons_liechi_berry_sheet, gFile_graphics_items_icon_palettes_liechi_berry_palette},
+ {gFile_graphics_items_icons_ganlon_berry_sheet, gFile_graphics_items_icon_palettes_ganlon_berry_palette},
+ {gFile_graphics_items_icons_salac_berry_sheet, gFile_graphics_items_icon_palettes_salac_berry_palette},
+ {gFile_graphics_items_icons_petaya_berry_sheet, gFile_graphics_items_icon_palettes_petaya_berry_palette},
+ {gFile_graphics_items_icons_apicot_berry_sheet, gFile_graphics_items_icon_palettes_apicot_berry_palette},
+ {gFile_graphics_items_icons_lansat_berry_sheet, gFile_graphics_items_icon_palettes_lansat_berry_palette},
+ {gFile_graphics_items_icons_starf_berry_sheet, gFile_graphics_items_icon_palettes_starf_berry_palette},
+ {gFile_graphics_items_icons_enigma_berry_sheet, gFile_graphics_items_icon_palettes_enigma_berry_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_bright_powder_sheet, gFile_graphics_items_icon_palettes_bright_powder_palette},
+ {gFile_graphics_items_icons_in_battle_herb_sheet, gFile_graphics_items_icon_palettes_white_herb_palette},
+ {gFile_graphics_items_icons_macho_brace_sheet, gFile_graphics_items_icon_palettes_macho_brace_palette},
+ {gFile_graphics_items_icons_exp_share_sheet, gFile_graphics_items_icon_palettes_exp_share_palette},
+ {gFile_graphics_items_icons_quick_claw_sheet, gFile_graphics_items_icon_palettes_quick_claw_palette},
+ {gFile_graphics_items_icons_soothe_bell_sheet, gFile_graphics_items_icon_palettes_soothe_bell_palette},
+ {gFile_graphics_items_icons_in_battle_herb_sheet, gFile_graphics_items_icon_palettes_mental_herb_palette},
+ {gFile_graphics_items_icons_choice_band_sheet, gFile_graphics_items_icon_palettes_choice_band_palette},
+ {gFile_graphics_items_icons_kings_rock_sheet, gFile_graphics_items_icon_palettes_kings_rock_palette},
+ {gFile_graphics_items_icons_silver_powder_sheet, gFile_graphics_items_icon_palettes_silver_powder_palette},
+ {gFile_graphics_items_icons_amulet_coin_sheet, gFile_graphics_items_icon_palettes_amulet_coin_palette},
+ {gFile_graphics_items_icons_cleanse_tag_sheet, gFile_graphics_items_icon_palettes_cleanse_tag_palette},
+ {gFile_graphics_items_icons_soul_dew_sheet, gFile_graphics_items_icon_palettes_soul_dew_palette},
+ {gFile_graphics_items_icons_deep_sea_tooth_sheet, gFile_graphics_items_icon_palettes_deep_sea_tooth_palette},
+ {gFile_graphics_items_icons_deep_sea_scale_sheet, gFile_graphics_items_icon_palettes_deep_sea_scale_palette},
+ {gFile_graphics_items_icons_smoke_ball_sheet, gFile_graphics_items_icon_palettes_smoke_ball_palette},
+ {gFile_graphics_items_icons_everstone_sheet, gFile_graphics_items_icon_palettes_everstone_palette},
+ {gFile_graphics_items_icons_focus_band_sheet, gFile_graphics_items_icon_palettes_focus_band_palette},
+ {gFile_graphics_items_icons_lucky_egg_sheet, gFile_graphics_items_icon_palettes_lucky_egg_palette},
+ {gFile_graphics_items_icons_scope_lens_sheet, gFile_graphics_items_icon_palettes_scope_lens_palette},
+ {gFile_graphics_items_icons_metal_coat_sheet, gFile_graphics_items_icon_palettes_metal_coat_palette},
+ {gFile_graphics_items_icons_leftovers_sheet, gFile_graphics_items_icon_palettes_leftovers_palette},
+ {gFile_graphics_items_icons_dragon_scale_sheet, gFile_graphics_items_icon_palettes_dragon_scale_palette},
+ {gFile_graphics_items_icons_light_ball_sheet, gFile_graphics_items_icon_palettes_light_ball_palette},
+ {gFile_graphics_items_icons_soft_sand_sheet, gFile_graphics_items_icon_palettes_soft_sand_palette},
+ {gFile_graphics_items_icons_hard_stone_sheet, gFile_graphics_items_icon_palettes_hard_stone_palette},
+ {gFile_graphics_items_icons_miracle_seed_sheet, gFile_graphics_items_icon_palettes_miracle_seed_palette},
+ {gFile_graphics_items_icons_black_glasses_sheet, gFile_graphics_items_icon_palettes_black_type_enhancing_item_palette},
+ {gFile_graphics_items_icons_black_belt_sheet, gFile_graphics_items_icon_palettes_black_type_enhancing_item_palette},
+ {gFile_graphics_items_icons_magnet_sheet, gFile_graphics_items_icon_palettes_magnet_palette},
+ {gFile_graphics_items_icons_mystic_water_sheet, gFile_graphics_items_icon_palettes_mystic_water_palette},
+ {gFile_graphics_items_icons_sharp_beak_sheet, gFile_graphics_items_icon_palettes_sharp_beak_palette},
+ {gFile_graphics_items_icons_poison_barb_sheet, gFile_graphics_items_icon_palettes_poison_barb_palette},
+ {gFile_graphics_items_icons_never_melt_ice_sheet, gFile_graphics_items_icon_palettes_never_melt_ice_palette},
+ {gFile_graphics_items_icons_spell_tag_sheet, gFile_graphics_items_icon_palettes_spell_tag_palette},
+ {gFile_graphics_items_icons_twisted_spoon_sheet, gFile_graphics_items_icon_palettes_twisted_spoon_palette},
+ {gFile_graphics_items_icons_charcoal_sheet, gFile_graphics_items_icon_palettes_charcoal_palette},
+ {gFile_graphics_items_icons_dragon_fang_sheet, gFile_graphics_items_icon_palettes_dragon_fang_palette},
+ {gFile_graphics_items_icons_silk_scarf_sheet, gFile_graphics_items_icon_palettes_silk_scarf_palette},
+ {gFile_graphics_items_icons_up_grade_sheet, gFile_graphics_items_icon_palettes_up_grade_palette},
+ {gFile_graphics_items_icons_shell_bell_sheet, gFile_graphics_items_icon_palettes_shell_palette},
+ {gFile_graphics_items_icons_sea_incense_sheet, gFile_graphics_items_icon_palettes_sea_incense_palette},
+ {gFile_graphics_items_icons_lax_incense_sheet, gFile_graphics_items_icon_palettes_lax_incense_palette},
+ {gFile_graphics_items_icons_lucky_punch_sheet, gFile_graphics_items_icon_palettes_lucky_punch_palette},
+ {gFile_graphics_items_icons_metal_powder_sheet, gFile_graphics_items_icon_palettes_metal_powder_palette},
+ {gFile_graphics_items_icons_thick_club_sheet, gFile_graphics_items_icon_palettes_thick_club_palette},
+ {gFile_graphics_items_icons_stick_sheet, gFile_graphics_items_icon_palettes_stick_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_scarf_sheet, gFile_graphics_items_icon_palettes_red_scarf_palette},
+ {gFile_graphics_items_icons_scarf_sheet, gFile_graphics_items_icon_palettes_blue_scarf_palette},
+ {gFile_graphics_items_icons_scarf_sheet, gFile_graphics_items_icon_palettes_pink_scarf_palette},
+ {gFile_graphics_items_icons_scarf_sheet, gFile_graphics_items_icon_palettes_green_scarf_palette},
+ {gFile_graphics_items_icons_scarf_sheet, gFile_graphics_items_icon_palettes_yellow_scarf_palette},
+ {gFile_graphics_items_icons_mach_bike_sheet, gFile_graphics_items_icon_palettes_mach_bike_palette},
+ {gFile_graphics_items_icons_coin_case_sheet, gFile_graphics_items_icon_palettes_coin_case_palette},
+ {gFile_graphics_items_icons_itemfinder_sheet, gFile_graphics_items_icon_palettes_itemfinder_palette},
+ {gFile_graphics_items_icons_old_rod_sheet, gFile_graphics_items_icon_palettes_old_rod_palette},
+ {gFile_graphics_items_icons_good_rod_sheet, gFile_graphics_items_icon_palettes_good_rod_palette},
+ {gFile_graphics_items_icons_super_rod_sheet, gFile_graphics_items_icon_palettes_super_rod_palette},
+ {gFile_graphics_items_icons_ss_ticket_sheet, gFile_graphics_items_icon_palettes_ss_ticket_palette},
+ {gFile_graphics_items_icons_contest_pass_sheet, gFile_graphics_items_icon_palettes_contest_pass_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_wailmer_pail_sheet, gFile_graphics_items_icon_palettes_wailmer_pail_palette},
+ {gFile_graphics_items_icons_devon_goods_sheet, gFile_graphics_items_icon_palettes_devon_goods_palette},
+ {gFile_graphics_items_icons_soot_sack_sheet, gFile_graphics_items_icon_palettes_soot_sack_palette},
+ {gFile_graphics_items_icons_basement_key_sheet, gFile_graphics_items_icon_palettes_old_key_palette},
+ {gFile_graphics_items_icons_acro_bike_sheet, gFile_graphics_items_icon_palettes_acro_bike_palette},
+ {gFile_graphics_items_icons_pokeblock_case_sheet, gFile_graphics_items_icon_palettes_pokeblock_case_palette},
+ {gFile_graphics_items_icons_letter_sheet, gFile_graphics_items_icon_palettes_lava_cookie_and_letter_palette},
+ {gFile_graphics_items_icons_eon_ticket_sheet, gFile_graphics_items_icon_palettes_eon_ticket_palette},
+ {gFile_graphics_items_icons_orb_sheet, gFile_graphics_items_icon_palettes_red_orb_palette},
+ {gFile_graphics_items_icons_orb_sheet, gFile_graphics_items_icon_palettes_blue_orb_palette},
+ {gFile_graphics_items_icons_scanner_sheet, gFile_graphics_items_icon_palettes_scanner_palette},
+ {gFile_graphics_items_icons_go_goggles_sheet, gFile_graphics_items_icon_palettes_go_goggles_palette},
+ {gFile_graphics_items_icons_meteorite_sheet, gFile_graphics_items_icon_palettes_meteorite_palette},
+ {gFile_graphics_items_icons_room1_key_sheet, gFile_graphics_items_icon_palettes_key_palette},
+ {gFile_graphics_items_icons_room2_key_sheet, gFile_graphics_items_icon_palettes_key_palette},
+ {gFile_graphics_items_icons_room4_key_sheet, gFile_graphics_items_icon_palettes_key_palette},
+ {gFile_graphics_items_icons_room6_key_sheet, gFile_graphics_items_icon_palettes_key_palette},
+ {gFile_graphics_items_icons_storage_key_sheet, gFile_graphics_items_icon_palettes_old_key_palette},
+ {gFile_graphics_items_icons_root_fossil_sheet, gFile_graphics_items_icon_palettes_hoenn_fossil_palette},
+ {gFile_graphics_items_icons_claw_fossil_sheet, gFile_graphics_items_icon_palettes_hoenn_fossil_palette},
+ {gFile_graphics_items_icons_devon_scope_sheet, gFile_graphics_items_icon_palettes_devon_scope_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_fighting_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_dragon_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_water_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_psychic_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_poison_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_ice_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_fighting_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_grass_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_fire_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_dark_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_ice_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_ice_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_psychic_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_water_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_grass_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_grass_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_steel_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_electric_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_electric_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_ground_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_ground_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_psychic_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_ghost_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_fighting_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_psychic_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_electric_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_fire_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_poison_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_rock_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_fire_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_rock_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_flying_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_dark_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_psychic_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_dark_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_steel_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_psychic_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_dark_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_fire_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_flying_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_water_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_normal_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_fighting_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_water_tm_hm_palette},
+ {gFile_graphics_items_icons_tm_sheet, gFile_graphics_items_icon_palettes_water_tm_hm_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_question_mark_sheet, gFile_graphics_items_icon_palettes_question_mark_palette},
+ {gFile_graphics_items_icons_oaks_parcel_sheet, gFile_graphics_items_icon_palettes_oaks_parcel_palette},
+ {gFile_graphics_items_icons_poke_flute_sheet, gFile_graphics_items_icon_palettes_poke_flute_palette},
+ {gFile_graphics_items_icons_secret_key_sheet, gFile_graphics_items_icon_palettes_secret_key_palette},
+ {gFile_graphics_items_icons_bike_voucher_sheet, gFile_graphics_items_icon_palettes_bike_voucher_palette},
+ {gFile_graphics_items_icons_gold_teeth_sheet, gFile_graphics_items_icon_palettes_gold_teeth_palette},
+ {gFile_graphics_items_icons_old_amber_sheet, gFile_graphics_items_icon_palettes_old_amber_palette},
+ {gFile_graphics_items_icons_card_key_sheet, gFile_graphics_items_icon_palettes_card_key_palette},
+ {gFile_graphics_items_icons_lift_key_sheet, gFile_graphics_items_icon_palettes_key_palette},
+ {gFile_graphics_items_icons_helix_fossil_sheet, gFile_graphics_items_icon_palettes_kanto_fossil_palette},
+ {gFile_graphics_items_icons_dome_fossil_sheet, gFile_graphics_items_icon_palettes_kanto_fossil_palette},
+ {gFile_graphics_items_icons_silph_scope_sheet, gFile_graphics_items_icon_palettes_silph_scope_palette},
+ {gFile_graphics_items_icons_bicycle_sheet, gFile_graphics_items_icon_palettes_bicycle_palette},
+ {gFile_graphics_items_icons_town_map_sheet, gFile_graphics_items_icon_palettes_town_map_palette},
+ {gFile_graphics_items_icons_vs_seeker_sheet, gFile_graphics_items_icon_palettes_vs_seeker_palette},
+ {gFile_graphics_items_icons_fame_checker_sheet, gFile_graphics_items_icon_palettes_fame_checker_palette},
+ {gFile_graphics_items_icons_tm_case_sheet, gFile_graphics_items_icon_palettes_tm_case_palette},
+ {gFile_graphics_items_icons_berry_pouch_sheet, gFile_graphics_items_icon_palettes_berry_pouch_palette},
+ {gFile_graphics_items_icons_teachy_tv_sheet, gFile_graphics_items_icon_palettes_teachy_tv_palette},
+ {gFile_graphics_items_icons_tri_pass_sheet, gFile_graphics_items_icon_palettes_tri_pass_palette},
+ {gFile_graphics_items_icons_rainbow_pass_sheet, gFile_graphics_items_icon_palettes_rainbow_pass_palette},
+ {gFile_graphics_items_icons_tea_sheet, gFile_graphics_items_icon_palettes_tea_palette},
+ {gFile_graphics_items_icons_mystic_ticket_sheet, gFile_graphics_items_icon_palettes_mystic_ticket_palette},
+ {gFile_graphics_items_icons_aurora_ticket_sheet, gFile_graphics_items_icon_palettes_aurora_ticket_palette},
+ {gFile_graphics_items_icons_powder_jar_sheet, gFile_graphics_items_icon_palettes_powder_jar_palette},
+ {gFile_graphics_items_icons_gem_sheet, gFile_graphics_items_icon_palettes_ruby_palette},
+ {gFile_graphics_items_icons_gem_sheet, gFile_graphics_items_icon_palettes_sapphire_palette},
+ {gFile_graphics_items_icons_return_to_field_arrow_sheet, gFile_graphics_items_icon_palettes_return_to_field_arrow_palette}
+};
+
+void ResetItemMenuIconState(void)
+{
+ u16 i;
+
+ for (i = 0; i < NELEMS(gUnknown_2039878); i++)
+ gUnknown_2039878[i] = 0xFF;
+}
+
+void sub_80984FC(u8 animNum)
+{
+ gUnknown_2039878[0] = CreateSprite(&gUnknown_83D41FC, 40, 68, 0);
+ sub_8098528(animNum);
+}
+
+void sub_8098528(u8 animNum)
+{
+ struct Sprite * sprite = &gSprites[gUnknown_2039878[0]];
+ sprite->pos2.y = -5;
+ sprite->callback = sub_8098560;
+ StartSpriteAnim(sprite, animNum);
+}
+
+static void sub_8098560(struct Sprite * sprite)
+{
+ if (sprite->pos2.y != 0)
+ sprite->pos2.y++;
+ else
+ sprite->callback = SpriteCallbackDummy;
+}
+
+void sub_8098580(void)
+{
+ struct Sprite * sprite = &gSprites[gUnknown_2039878[0]];
+ if (sprite->affineAnimEnded)
+ {
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->callback = sub_80985BC;
+ }
+}
+
+static void sub_80985BC(struct Sprite * sprite)
+{
+ if (sprite->affineAnimEnded)
+ {
+ StartSpriteAffineAnim(sprite, 0);
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+void sub_80985E4(void)
+{
+ u8 i;
+ u8 * ptr = &gUnknown_2039878[1];
+
+ for (i = 0; i < 9; i++)
+ {
+ ptr[i] = CreateSprite(&gUnknown_83D4250, i * 16 + 0x60, 7, 0);
+ if (i != 0)
+ {
+ if (i == 8)
+ StartSpriteAnim(&gSprites[ptr[i]], 2);
+ else
+ StartSpriteAnim(&gSprites[ptr[i]], 1);
+ }
+ gSprites[ptr[i]].invisible = TRUE;
+ }
+}
+
+void sub_8098660(u8 flag)
+{
+ u8 i;
+ u8 * ptr = &gUnknown_2039878[1];
+
+ for (i = 0; i < 9; i++)
+ {
+ gSprites[ptr[i]].invisible = flag;
+ }
+}
+
+void sub_80986A8(s16 x, u16 y)
+{
+ u8 i;
+ u8 * ptr = &gUnknown_2039878[1];
+
+ for (i = 0; i < 9; i++)
+ {
+ gSprites[ptr[i]].pos2.x = x;
+ gSprites[ptr[i]].pos1.y = y + 7;
+ }
+}
+
+static bool8 sub_80986EC(void)
+{
+ void ** ptr1, ** ptr2;
+
+ ptr1 = &gUnknown_2039884;
+ *ptr1 = Alloc(0x120);
+ if (*ptr1 == NULL)
+ return FALSE;
+ ptr2 = &gUnknown_2039888;
+ *ptr2 = AllocZeroed(0x200);
+ if (*ptr2 == NULL)
+ {
+ Free(*ptr1);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void CopyItemIconPicTo4x4Buffer(const void * src, void * dest)
+{
+ u8 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ CpuCopy16(src + 0x60 * i, dest + 0x80 * i, 0x60);
+ }
+}
+
+u8 AddItemIconObject(u16 tilesTag, u16 paletteTag, u16 itemId)
+{
+ struct SpriteTemplate template;
+ struct SpriteSheet spriteSheet;
+ struct CompressedSpritePalette spritePalette;
+ u8 spriteId;
+
+ if (!sub_80986EC())
+ return MAX_SPRITES;
+
+ LZDecompressWram(sub_8098974(itemId, 0), gUnknown_2039884);
+ CopyItemIconPicTo4x4Buffer(gUnknown_2039884, gUnknown_2039888);
+ spriteSheet.data = gUnknown_2039888;
+ spriteSheet.size = 0x200;
+ spriteSheet.tag = tilesTag;
+ LoadSpriteSheet(&spriteSheet);
+
+ spritePalette.data = sub_8098974(itemId, 1);
+ spritePalette.tag = paletteTag;
+ LoadCompressedSpritePalette(&spritePalette);
+
+ CpuCopy16(&gUnknown_83D427C, &template, sizeof(struct SpriteTemplate));
+ template.tileTag = tilesTag;
+ template.paletteTag = paletteTag;
+ spriteId = CreateSprite(&template, 0, 0, 0);
+
+ Free(gUnknown_2039884);
+ Free(gUnknown_2039888);
+ return spriteId;
+}
+
+u8 AddItemIconObjectWithCustomObjectTemplate(const struct SpriteTemplate * origTemplate, u16 tilesTag, u16 paletteTag, u16 itemId)
+{
+ struct SpriteTemplate template;
+ struct SpriteSheet spriteSheet;
+ struct CompressedSpritePalette spritePalette;
+ u8 spriteId;
+
+ if (!sub_80986EC())
+ return MAX_SPRITES;
+
+ LZDecompressWram(sub_8098974(itemId, 0), gUnknown_2039884);
+ CopyItemIconPicTo4x4Buffer(gUnknown_2039884, gUnknown_2039888);
+ spriteSheet.data = gUnknown_2039888;
+ spriteSheet.size = 0x200;
+ spriteSheet.tag = tilesTag;
+ LoadSpriteSheet(&spriteSheet);
+
+ spritePalette.data = sub_8098974(itemId, 1);
+ spritePalette.tag = paletteTag;
+ LoadCompressedSpritePalette(&spritePalette);
+
+ CpuCopy16(origTemplate, &template, sizeof(struct SpriteTemplate));
+ template.tileTag = tilesTag;
+ template.paletteTag = paletteTag;
+ spriteId = CreateSprite(&template, 0, 0, 0);
+
+ Free(gUnknown_2039884);
+ Free(gUnknown_2039888);
+ return spriteId;
+}
+
+void CreateItemMenuIcon(u16 itemId, u8 idx)
+{
+ u8 * ptr = &gUnknown_2039878[10];
+ u8 spriteId;
+
+ if (ptr[idx] == 0xFF)
+ {
+ FreeSpriteTilesByTag(102 + idx);
+ FreeSpritePaletteByTag(102 + idx);
+ spriteId = AddItemIconObject(102 + idx, 102 + idx, itemId);
+ if (spriteId != MAX_SPRITES)
+ {
+ ptr[idx] = spriteId;
+ gSprites[spriteId].pos2.x = 24;
+ gSprites[spriteId].pos2.y = 140;
+ }
+ }
+}
+
+void DestroyItemMenuIcon(u8 idx)
+{
+ u8 * ptr = &gUnknown_2039878[10];
+
+ if (ptr[idx] != 0xFF)
+ {
+ DestroySpriteAndFreeResources(&gSprites[ptr[idx]]);
+ ptr[idx] = 0xFF;
+ }
+}
+
+const void * sub_8098974(u16 itemId, u8 attrId)
+{
+ if (itemId > ITEM_N_A)
+ itemId = ITEM_NONE;
+ return gUnknown_83D4294[itemId][attrId];
+}
+
+void sub_80989A0(u16 itemId, u8 idx)
+{
+ u8 * ptr = &gUnknown_2039878[10];
+ u8 spriteId;
+
+ if (ptr[idx] == 0xFF)
+ {
+ FreeSpriteTilesByTag(102 + idx);
+ FreeSpritePaletteByTag(102 + idx);
+ spriteId = AddItemIconObject(102 + idx, 102 + idx, itemId);
+ if (spriteId != MAX_SPRITES)
+ {
+ ptr[idx] = spriteId;
+ gSprites[spriteId].pos2.x = 24;
+ gSprites[spriteId].pos2.y = 147;
+ }
+ }
+}
diff --git a/src/item_pc.c b/src/item_pc.c
new file mode 100644
index 000000000..8f1fd1cbf
--- /dev/null
+++ b/src/item_pc.c
@@ -0,0 +1,1150 @@
+#include "global.h"
+#include "bg.h"
+#include "data2.h"
+#include "decompress.h"
+#include "gpu_regs.h"
+#include "graphics.h"
+#include "help_system.h"
+#include "item.h"
+#include "item_menu.h"
+#include "item_menu_icons.h"
+#include "list_menu.h"
+#include "item_pc.h"
+#include "item_use.h"
+#include "main.h"
+#include "malloc.h"
+#include "menu.h"
+#include "menu_helpers.h"
+#include "menu_indicators.h"
+#include "new_menu_helpers.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "pc_screen_effect.h"
+#include "scanline_effect.h"
+#include "sound.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "text_window.h"
+#include "constants/items.h"
+#include "constants/songs.h"
+
+struct ItemPcResources
+{
+ MainCallback savedCallback;
+ u8 moveModeOrigPos;
+ u8 itemMenuIconSlot;
+ u8 maxShowed;
+ u8 nItems;
+ u8 scrollIndicatorArrowPairId;
+ u16 withdrawQuantitySubmenuCursorPos;
+ s16 data[3];
+};
+
+struct ItemPcStaticResources
+{
+ MainCallback savedCallback;
+ u16 scroll;
+ u16 row;
+ u8 initialized;
+};
+
+static EWRAM_DATA struct ItemPcResources * sStateDataPtr = NULL;
+static EWRAM_DATA u8 * sBg1TilemapBuffer = NULL;
+static EWRAM_DATA struct ListMenuItem * sListMenuItems = NULL;
+static EWRAM_DATA u8 * sUnusedStringAllocation = NULL;
+static EWRAM_DATA struct ItemPcStaticResources sListMenuState = {};
+static EWRAM_DATA u8 sSubmenuWindowIds[3] = {};
+
+extern const struct CompressedSpriteSheet gBagSwapSpriteSheet;
+extern const struct CompressedSpritePalette gBagSwapSpritePalette;
+
+static void ItemPc_RunSetup(void);
+static bool8 ItemPc_DoGfxSetup(void);
+static void ItemPc_FadeAndBail(void);
+static void Task_ItemPcWaitFadeAndBail(u8 taskId);
+static bool8 ItemPc_InitBgs(void);
+static bool8 ItemPc_LoadGraphics(void);
+static bool8 ItemPc_AllocateResourcesForListMenu(void);
+static void ItemPc_BuildListMenuTemplate(void);
+static void ItemPc_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu * list);
+static void ItemPc_ItemPrintFunc(u8 windowId, s32 itemId, u8 y);
+static void ItemPc_PrintOrRemoveCursorAt(u8 y, u8 state);
+static void ItemPc_PrintWithdrawItem(void);
+static void ItemPc_PlaceTopMenuScrollIndicatorArrows(void);
+static void ItemPc_SetCursorPosition(void);
+static void ItemPc_FreeResources(void);
+static void Task_ItemPcTurnOff2(u8 taskId);
+static u16 ItemPc_GetItemIdBySlotId(u16 itemIndex);
+static u16 ItemPc_GetItemQuantityBySlotId(u16 itemIndex);
+static void ItemPc_CountPcItems(void);
+static void ItemPc_SetScrollPosition(void);
+static void Task_ItemPcMain(u8 taskId);
+static void ItemPc_MoveItemModeInit(u8 taskId, s16 pos);
+static void Task_ItemPcMoveItemModeRun(u8 taskId);
+static void ItemPc_InsertItemIntoNewSlot(u8 taskId, u32 pos);
+static void ItemPc_MoveItemModeCancel(u8 taskId, u32 pos);
+static void Task_ItemPcSubmenuInit(u8 taskId);
+static void Task_ItemPcSubmenuRun(u8 taskId);
+static void Task_ItemPcWithdraw(u8 taskId);
+static void ItemPc_DoWithdraw(u8 taskId);
+static void Task_ItemPcWaitButtonAndFinishWithdrawMultiple(u8 taskId);
+static void Task_ItemPcWaitButtonWithdrawMultipleFailed(u8 taskId);
+static void Task_ItemPcCleanUpWithdraw(u8 taskId);
+static void ItemPc_WithdrawMultipleInitWindow(u16 slotId);
+static void Task_ItemPcHandleWithdrawMultiple(u8 taskId);
+static void Task_ItemPcGive(u8 taskId);
+static void ItemPc_CB2_SwitchToPartyMenu(void);
+static void ItemPc_CB2_ReturnFromPartyMenu(void);
+static void gTask_ItemPcWaitButtonAndExitSubmenu(u8 taskId);
+static void Task_ItemPcCancel(u8 taskId);
+static void ItemPc_InitWindows(void);
+static void ItemPc_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx);
+static void ItemPc_SetBorderStyleOnWindow(u8 windowId);
+static u8 ItemPc_GetOrCreateSubwindow(u8 idx);
+static void ItemPc_DestroySubwindow(u8 idx);
+static void ItemPc_PrintOnWindow5WithContinueTask(u8 taskId, const u8 * str, TaskFunc taskFunc);
+
+static const struct BgTemplate sBgTemplates[2] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .priority = 0
+ }, {
+ .bg = 1,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 30,
+ .priority = 1
+ }
+};
+
+static const struct MenuAction sItemPcSubmenuOptions[] = {
+ {gText_Withdraw, {.void_u8 = Task_ItemPcWithdraw}},
+ {gOtherText_Give, {.void_u8 = Task_ItemPcGive}},
+ {gFameCheckerText_Cancel, {.void_u8 = Task_ItemPcCancel}}
+};
+
+static const struct TextColor gUnknown_8453F8C[] = {
+ {0, 1, 2},
+ {0, 2, 3},
+ {0, 3, 2},
+ {0, 10, 2}
+};
+
+static const struct WindowTemplate gUnknown_8453F98[] = {
+ {
+ .bg = 0,
+ .tilemapLeft = 0x07,
+ .tilemapTop = 0x01,
+ .width = 0x13,
+ .height = 0x0c,
+ .paletteNum = 0x0f,
+ .baseBlock = 0x02bf
+ }, {
+ .bg = 0,
+ .tilemapLeft = 0x05,
+ .tilemapTop = 0x0e,
+ .width = 0x19,
+ .height = 0x06,
+ .paletteNum = 0x0d,
+ .baseBlock = 0x0229
+ }, {
+ .bg = 0,
+ .tilemapLeft = 0x01,
+ .tilemapTop = 0x01,
+ .width = 0x05,
+ .height = 0x04,
+ .paletteNum = 0x0f,
+ .baseBlock = 0x0215
+ }, {
+ .bg = 0,
+ .tilemapLeft = 0x18,
+ .tilemapTop = 0x0f,
+ .width = 0x05,
+ .height = 0x04,
+ .paletteNum = 0x0f,
+ .baseBlock = 0x0201
+ }, {
+ .bg = 0,
+ .tilemapLeft = 0x16,
+ .tilemapTop = 0x0d,
+ .width = 0x07,
+ .height = 0x06,
+ .paletteNum = 0x0f,
+ .baseBlock = 0x01d7
+ }, {
+ .bg = 0,
+ .tilemapLeft = 0x02,
+ .tilemapTop = 0x0f,
+ .width = 0x1a,
+ .height = 0x04,
+ .paletteNum = 0x0b,
+ .baseBlock = 0x016f
+ }, DUMMY_WIN_TEMPLATE
+};
+
+static const struct WindowTemplate gUnknown_8453FD0[] = {
+ {
+ .bg = 0,
+ .tilemapLeft = 0x06,
+ .tilemapTop = 0x0f,
+ .width = 0x0e,
+ .height = 0x04,
+ .paletteNum = 0x0c,
+ .baseBlock = 0x0137
+ }, {
+ .bg = 0,
+ .tilemapLeft = 0x06,
+ .tilemapTop = 0x0f,
+ .width = 0x10,
+ .height = 0x04,
+ .paletteNum = 0x0c,
+ .baseBlock = 0x0137
+ }, {
+ .bg = 0,
+ .tilemapLeft = 0x06,
+ .tilemapTop = 0x0f,
+ .width = 0x17,
+ .height = 0x04,
+ .paletteNum = 0x0c,
+ .baseBlock = 0x009b
+ }
+};
+
+void ItemPc_Init(u8 a0, MainCallback callback)
+{
+ u8 i;
+
+ if (a0 >= 2)
+ {
+ SetMainCallback2(callback);
+ return;
+ }
+ if ((sStateDataPtr = Alloc(sizeof(struct ItemPcResources))) == NULL)
+ {
+ SetMainCallback2(callback);
+ return;
+ }
+ if (a0 != 1)
+ {
+ sListMenuState.savedCallback = callback;
+ sListMenuState.scroll = sListMenuState.row = 0;
+ }
+ sStateDataPtr->moveModeOrigPos = 0xFF;
+ sStateDataPtr->itemMenuIconSlot = 0;
+ sStateDataPtr->scrollIndicatorArrowPairId = 0xFF;
+ sStateDataPtr->savedCallback = 0;
+ for (i = 0; i < 3; i++)
+ {
+ sStateDataPtr->data[i] = 0;
+ }
+ SetMainCallback2(ItemPc_RunSetup);
+}
+
+static void ItemPc_MainCB(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ DoScheduledBgTilemapCopiesToVram();
+ UpdatePaletteFade();
+}
+
+static void ItemPc_VBlankCB(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void ItemPc_RunSetup(void)
+{
+ while (1)
+ {
+ if (ItemPc_DoGfxSetup() == TRUE)
+ break;
+ if (MenuHelpers_LinkSomething() == TRUE)
+ break;
+ }
+}
+
+static bool8 ItemPc_DoGfxSetup(void)
+{
+ u8 taskId;
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankHBlankCallbacksToNull();
+ ClearScheduledBgCopiesToVram();
+ gMain.state++;
+ break;
+ case 1:
+ ScanlineEffect_Stop();
+ gMain.state++;
+ break;
+ case 2:
+ FreeAllSpritePalettes();
+ gMain.state++;
+ break;
+ case 3:
+ ResetPaletteFade();
+ gMain.state++;
+ break;
+ case 4:
+ ResetSpriteData();
+ gMain.state++;
+ break;
+ case 5:
+ ResetItemMenuIconState();
+ gMain.state++;
+ break;
+ case 6:
+ ResetTasks();
+ gMain.state++;
+ break;
+ case 7:
+ if (ItemPc_InitBgs())
+ {
+ sStateDataPtr->data[0] = 0;
+ gMain.state++;
+ }
+ else
+ {
+ ItemPc_FadeAndBail();
+ return TRUE;
+ }
+ break;
+ case 8:
+ if (ItemPc_LoadGraphics() == TRUE)
+ gMain.state++;
+ break;
+ case 9:
+ ItemPc_InitWindows();
+ gMain.state++;
+ break;
+ case 10:
+ ItemPc_CountPcItems();
+ ItemPc_SetCursorPosition();
+ ItemPc_SetScrollPosition();
+ gMain.state++;
+ break;
+ case 11:
+ if (ItemPc_AllocateResourcesForListMenu())
+ gMain.state++;
+ else
+ {
+ ItemPc_FadeAndBail();
+ return TRUE;
+ }
+ break;
+ case 12:
+ ItemPc_BuildListMenuTemplate();
+ gMain.state++;
+ break;
+ case 13:
+ ItemPc_PrintWithdrawItem();
+ gMain.state++;
+ break;
+ case 14:
+ sub_80985E4();
+ gMain.state++;
+ break;
+ case 15:
+ taskId = CreateTask(Task_ItemPcMain, 0);
+ gTasks[taskId].data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sListMenuState.scroll, sListMenuState.row);
+ gMain.state++;
+ break;
+ case 16:
+ ItemPc_PlaceTopMenuScrollIndicatorArrows();
+ gMain.state++;
+ break;
+ case 17:
+ HelpSystem_SetSomeVariable2(29);
+ gMain.state++;
+ break;
+ case 18:
+ if (sListMenuState.initialized == 1)
+ {
+ BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK);
+ }
+ gMain.state++;
+ break;
+ case 19:
+ if (sListMenuState.initialized == 1)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ }
+ else
+ {
+ sub_80A0A48(0, 0, 0);
+ ItemPc_SetInitializedFlag(1);
+ PlaySE(SE_PC_LOGON);
+ }
+ gMain.state++;
+ break;
+ case 20:
+ if (sub_80BF72C() != TRUE)
+ gMain.state++;
+ break;
+ default:
+ SetVBlankCallback(ItemPc_VBlankCB);
+ SetMainCallback2(ItemPc_MainCB);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void ItemPc_FadeAndBail(void)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ CreateTask(Task_ItemPcWaitFadeAndBail, 0);
+ SetVBlankCallback(ItemPc_VBlankCB);
+ SetMainCallback2(ItemPc_MainCB);
+}
+
+static void Task_ItemPcWaitFadeAndBail(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(sListMenuState.savedCallback);
+ ItemPc_FreeResources();
+ DestroyTask(taskId);
+ }
+}
+
+static bool8 ItemPc_InitBgs(void)
+{
+ ResetAllBgsCoordinatesAndBgCntRegs();
+ sBg1TilemapBuffer = Alloc(0x800);
+ if (sBg1TilemapBuffer == NULL)
+ return FALSE;
+ memset(sBg1TilemapBuffer, 0, 0x800);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));
+ SetBgTilemapBuffer(1, sBg1TilemapBuffer);
+ ScheduleBgCopyTilemapToVram(1);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ SetGpuReg(REG_OFFSET_BLDCNT , 0);
+ ShowBg(0);
+ ShowBg(1);
+ return TRUE;
+}
+
+static bool8 ItemPc_LoadGraphics(void)
+{
+ switch (sStateDataPtr->data[0])
+ {
+ case 0:
+ ResetTempTileDataBuffers();
+ DecompressAndCopyTileDataToVram(1, gItemPcTiles, 0, 0, 0);
+ sStateDataPtr->data[0]++;
+ break;
+ case 1:
+ if (FreeTempTileDataBuffersIfPossible() != TRUE)
+ {
+ LZDecompressWram(gItemPcTilemap, sBg1TilemapBuffer);
+ sStateDataPtr->data[0]++;
+ }
+ break;
+ case 2:
+ LoadCompressedPalette(gItemPcBgPals, 0x00, 0x60);
+ sStateDataPtr->data[0]++;
+ break;
+ case 3:
+ LoadCompressedSpriteSheet(&gBagSwapSpriteSheet);
+ sStateDataPtr->data[0]++;
+ break;
+ default:
+ LoadCompressedSpritePalette(&gBagSwapSpritePalette);
+ sStateDataPtr->data[0] = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+#define try_alloc(ptr__, size) ({ \
+ void ** ptr = (void **)&(ptr__); \
+ *ptr = Alloc(size); \
+ if (*ptr == NULL) \
+ { \
+ ItemPc_FreeResources(); \
+ ItemPc_FadeAndBail(); \
+ return FALSE; \
+ } \
+})
+
+static bool8 ItemPc_AllocateResourcesForListMenu(void)
+{
+ try_alloc(sListMenuItems, sizeof(struct ListMenuItem) * (PC_ITEMS_COUNT + 1));
+ try_alloc(sUnusedStringAllocation, 14 * (PC_ITEMS_COUNT + 1));
+ return TRUE;
+}
+
+static void ItemPc_BuildListMenuTemplate(void)
+{
+ u16 i;
+
+ for (i = 0; i < sStateDataPtr->nItems; i++)
+ {
+ sListMenuItems[i].label = ItemId_GetName(gSaveBlock1Ptr->pcItems[i].itemId);
+ sListMenuItems[i].index = i;
+ }
+ sListMenuItems[i].label = gFameCheckerText_Cancel;
+ sListMenuItems[i].index = -2;
+
+ gMultiuseListMenuTemplate.items = sListMenuItems;
+ gMultiuseListMenuTemplate.totalItems = sStateDataPtr->nItems + 1;
+ gMultiuseListMenuTemplate.windowId = 0;
+ gMultiuseListMenuTemplate.header_X = 0;
+ gMultiuseListMenuTemplate.item_X = 9;
+ gMultiuseListMenuTemplate.cursor_X = 1;
+ gMultiuseListMenuTemplate.lettersSpacing = 1;
+ gMultiuseListMenuTemplate.itemVerticalPadding = 2;
+ gMultiuseListMenuTemplate.upText_Y = 2;
+ gMultiuseListMenuTemplate.maxShowed = sStateDataPtr->maxShowed;
+ gMultiuseListMenuTemplate.fontId = 2;
+ gMultiuseListMenuTemplate.cursorPal = 2;
+ gMultiuseListMenuTemplate.fillValue = 0;
+ gMultiuseListMenuTemplate.cursorShadowPal = 3;
+ gMultiuseListMenuTemplate.moveCursorFunc = ItemPc_MoveCursorFunc;
+ gMultiuseListMenuTemplate.itemPrintFunc = ItemPc_ItemPrintFunc;
+ gMultiuseListMenuTemplate.scrollMultiple = 0;
+ gMultiuseListMenuTemplate.cursorKind = 0;
+}
+
+static void ItemPc_MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu * list)
+{
+ u16 itemId;
+ const u8 * desc;
+ if (onInit != TRUE)
+ PlaySE(SE_SELECT);
+
+ if (sStateDataPtr->moveModeOrigPos == 0xFF)
+ {
+ DestroyItemMenuIcon(sStateDataPtr->itemMenuIconSlot ^ 1);
+ if (itemIndex != -2)
+ {
+ itemId = ItemPc_GetItemIdBySlotId(itemIndex);
+ CreateItemMenuIcon(itemId, sStateDataPtr->itemMenuIconSlot);
+ if (ItemId_GetPocket(itemId) == POCKET_TM_CASE)
+ desc = gMoveNames[ItemIdToBattleMoveId(itemId)];
+ else
+ desc = ItemId_GetDescription(itemId);
+ }
+ else
+ {
+ CreateItemMenuIcon(ITEM_N_A, sStateDataPtr->itemMenuIconSlot);
+ desc = gText_ReturnToPC;
+ }
+ sStateDataPtr->itemMenuIconSlot ^= 1;
+ FillWindowPixelBuffer(1, 0);
+ ItemPc_AddTextPrinterParameterized(1, 2, desc, 0, 3, 2, 0, 0, 3);
+ }
+}
+
+static void ItemPc_ItemPrintFunc(u8 windowId, s32 itemId, u8 y)
+{
+ if (sStateDataPtr->moveModeOrigPos != 0xFF)
+ {
+ if (sStateDataPtr->moveModeOrigPos == (u8)itemId)
+ ItemPc_PrintOrRemoveCursorAt(y, 2);
+ else
+ ItemPc_PrintOrRemoveCursorAt(y, 0xFF);
+ }
+ if (itemId != -2)
+ {
+ u16 quantity = ItemPc_GetItemQuantityBySlotId(itemId);
+ ConvertIntToDecimalStringN(gStringVar1, quantity, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);
+ ItemPc_AddTextPrinterParameterized(windowId, 0, gStringVar4, 110, y, 0, 0, 0xFF, 1);
+ }
+}
+
+static void ItemPc_PrintOrRemoveCursor(u8 listMenuId, u8 colorIdx)
+{
+ ItemPc_PrintOrRemoveCursorAt(ListMenuGetYCoordForPrintingArrowCursor(listMenuId), colorIdx);
+}
+
+static void ItemPc_PrintOrRemoveCursorAt(u8 y, u8 colorIdx)
+{
+ if (colorIdx == 0xFF)
+ {
+ u8 maxWidth = GetFontAttribute(2, FONTATTR_MAX_LETTER_WIDTH);
+ u8 maxHeight = GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT);
+ FillWindowPixelRect(0, 0, 0, y, maxWidth, maxHeight);
+ }
+ else
+ {
+ ItemPc_AddTextPrinterParameterized(0, 2, gFameCheckerText_ListMenuCursor, 0, y, 0, 0, 0, colorIdx);
+ }
+}
+
+static void ItemPc_PrintWithdrawItem(void)
+{
+ ItemPc_AddTextPrinterParameterized(2, 0, gText_WithdrawItem, 0, 1, 0, 1, 0, 0);
+}
+
+static void ItemPc_PlaceTopMenuScrollIndicatorArrows(void)
+{
+ sStateDataPtr->scrollIndicatorArrowPairId = AddScrollIndicatorArrowPairParameterized(2, 128, 8, 104, sStateDataPtr->nItems - sStateDataPtr->maxShowed + 1, 110, 110, &sListMenuState.scroll);
+}
+
+static void ItemPc_PlaceWithdrawQuantityScrollIndicatorArrows(void)
+{
+ sStateDataPtr->withdrawQuantitySubmenuCursorPos = 1;
+ sStateDataPtr->scrollIndicatorArrowPairId = AddScrollIndicatorArrowPairParameterized(2, 212, 120, 152, 2, 110, 110, &sStateDataPtr->withdrawQuantitySubmenuCursorPos);
+}
+
+static void ItemPc_RemoveScrollIndicatorArrowPair(void)
+{
+ if (sStateDataPtr->scrollIndicatorArrowPairId != 0xFF)
+ {
+ RemoveScrollIndicatorArrowPair(sStateDataPtr->scrollIndicatorArrowPairId);
+ sStateDataPtr->scrollIndicatorArrowPairId = 0xFF;
+ }
+}
+
+static void ItemPc_SetCursorPosition(void)
+{
+ if (sListMenuState.scroll != 0 && sListMenuState.scroll + sStateDataPtr->maxShowed > sStateDataPtr->nItems + 1)
+ sListMenuState.scroll = (sStateDataPtr->nItems + 1) - sStateDataPtr->maxShowed;
+ if (sListMenuState.scroll + sListMenuState.row >= sStateDataPtr->nItems + 1)
+ {
+ if (sStateDataPtr->nItems + 1 < 2)
+ sListMenuState.row = 0;
+ else
+ sListMenuState.row = sStateDataPtr->nItems;
+ }
+}
+
+#define try_free(ptr) ({ \
+ void ** ptr__ = (void **)&(ptr); \
+ if (*ptr__ != NULL) \
+ Free(*ptr__); \
+})
+
+static void ItemPc_FreeResources(void)
+{
+ try_free(sStateDataPtr);
+ try_free(sBg1TilemapBuffer);
+ try_free(sListMenuItems);
+ try_free(sUnusedStringAllocation);
+ FreeAllWindowBuffers();
+}
+
+static void Task_ItemPcTurnOff1(u8 taskId)
+{
+ if (sListMenuState.initialized == 1)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ }
+ else
+ {
+ sub_80A0A70(0, 0, 0);
+ PlaySE(SE_PC_OFF);
+ }
+ gTasks[taskId].func = Task_ItemPcTurnOff2;
+}
+
+static void Task_ItemPcTurnOff2(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ if (!gPaletteFade.active && !sub_80A0AAC())
+ {
+ DestroyListMenuTask(data[0], &sListMenuState.scroll, &sListMenuState.row);
+ if (sStateDataPtr->savedCallback != NULL)
+ SetMainCallback2(sStateDataPtr->savedCallback);
+ else
+ SetMainCallback2(sListMenuState.savedCallback);
+ ItemPc_RemoveScrollIndicatorArrowPair();
+ ItemPc_FreeResources();
+ DestroyTask(taskId);
+ }
+}
+
+static u8 ItemPc_GetCursorPosition(void)
+{
+ return sListMenuState.scroll + sListMenuState.row;
+}
+
+static u16 ItemPc_GetItemIdBySlotId(u16 idx)
+{
+ return gSaveBlock1Ptr->pcItems[idx].itemId;
+}
+
+static u16 ItemPc_GetItemQuantityBySlotId(u16 idx)
+{
+ return GetPcItemQuantity(&gSaveBlock1Ptr->pcItems[idx].quantity);
+}
+
+static void ItemPc_CountPcItems(void)
+{
+ u16 i;
+
+ ItemPcCompaction();
+ sStateDataPtr->nItems = 0;
+ for (i = 0; i < PC_ITEMS_COUNT; sStateDataPtr->nItems++, i++)
+ {
+ if (gSaveBlock1Ptr->pcItems[i].itemId == ITEM_NONE)
+ break;
+ }
+ sStateDataPtr->maxShowed = sStateDataPtr->nItems + 1 <= 6 ? sStateDataPtr->nItems + 1 : 6;
+}
+
+static void ItemPc_SetScrollPosition(void)
+{
+ u8 i;
+
+ if (sListMenuState.row > 3)
+ {
+ for (i = 0; i <= sListMenuState.row - 3; sListMenuState.row--, sListMenuState.scroll++, i++)
+ {
+ if (sListMenuState.scroll + sStateDataPtr->maxShowed == sStateDataPtr->nItems + 1)
+ break;
+ }
+ }
+}
+
+static void ItemPc_SetMessageWindowPalette(int a0)
+{
+ SetBgRectPal(1, 0, 14, 30, 6, a0 + 1);
+ ScheduleBgCopyTilemapToVram(1);
+}
+
+void ItemPc_SetInitializedFlag(u8 a0)
+{
+ sListMenuState.initialized = a0;
+}
+
+static void Task_ItemPcMain(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+ u16 scroll;
+ u16 row;
+ s32 input;
+
+ if (!gPaletteFade.active && !sub_80A0A98())
+ {
+ if (JOY_NEW(SELECT_BUTTON))
+ {
+ ListMenuGetScrollAndRow(data[0], &scroll, &row);
+ if (scroll + row != sStateDataPtr->nItems)
+ {
+ PlaySE(SE_SELECT);
+ ItemPc_MoveItemModeInit(taskId, scroll + row);
+ return;
+ }
+ }
+ input = ListMenu_ProcessInput(data[0]);
+ ListMenuGetScrollAndRow(data[0], &sListMenuState.scroll, &sListMenuState.row);
+ switch (input)
+ {
+ case -1:
+ break;
+ case -2:
+ PlaySE(SE_SELECT);
+ ItemPc_SetInitializedFlag(0);
+ gTasks[taskId].func = Task_ItemPcTurnOff1;
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ ItemPc_SetMessageWindowPalette(1);
+ ItemPc_RemoveScrollIndicatorArrowPair();
+ data[1] = input;
+ data[2] = ItemPc_GetItemQuantityBySlotId(input);
+ ItemPc_PrintOrRemoveCursor(data[0], 2);
+ gTasks[taskId].func = Task_ItemPcSubmenuInit;
+ break;
+ }
+ }
+}
+
+static void ItemPc_ReturnFromSubmenu(u8 taskId)
+{
+ ItemPc_SetMessageWindowPalette(0);
+ ItemPc_PlaceTopMenuScrollIndicatorArrows();
+ gTasks[taskId].func = Task_ItemPcMain;
+}
+
+static void ItemPc_MoveItemModeInit(u8 taskId, s16 pos)
+{
+ s16 * data = gTasks[taskId].data;
+
+ ListMenuSetUnkIndicatorsStructField(data[0], 16, 1);
+ data[1] = pos;
+ sStateDataPtr->moveModeOrigPos = pos;
+ StringCopy(gStringVar1, ItemId_GetName(ItemPc_GetItemIdBySlotId(data[1])));
+ StringExpandPlaceholders(gStringVar4, gOtherText_WhereShouldTheStrVar1BePlaced);
+ FillWindowPixelBuffer(1, 0x00);
+ ItemPc_AddTextPrinterParameterized(1, 2, gStringVar4, 0, 3, 2, 3, 0, 0);
+ sub_80986A8(-32, ListMenuGetYCoordForPrintingArrowCursor(data[0]));
+ sub_8098660(0);
+ ItemPc_PrintOrRemoveCursor(data[0], 2);
+ gTasks[taskId].func = Task_ItemPcMoveItemModeRun;
+}
+
+static void Task_ItemPcMoveItemModeRun(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ ListMenu_ProcessInput(data[0]);
+ ListMenuGetScrollAndRow(data[0], &sListMenuState.scroll, &sListMenuState.row);
+ sub_80986A8(-32, ListMenuGetYCoordForPrintingArrowCursor(data[0]));
+ if (JOY_NEW(A_BUTTON | SELECT_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ sStateDataPtr->moveModeOrigPos = 0xFF;
+ ItemPc_InsertItemIntoNewSlot(taskId, sListMenuState.scroll + sListMenuState.row);
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ sStateDataPtr->moveModeOrigPos = 0xFF;
+ ItemPc_MoveItemModeCancel(taskId, sListMenuState.scroll + sListMenuState.row);
+ }
+}
+
+static void ItemPc_InsertItemIntoNewSlot(u8 taskId, u32 pos)
+{
+ s16 * data = gTasks[taskId].data;
+ if (data[1] == pos || data[1] == pos - 1)
+ ItemPc_MoveItemModeCancel(taskId, pos);
+ else
+ {
+ ItemMenu_MoveItemSlotToNewPositionInArray(gSaveBlock1Ptr->pcItems, data[1], pos);
+ DestroyListMenuTask(data[0], &sListMenuState.scroll, &sListMenuState.row);
+ if (data[1] < pos)
+ sListMenuState.row--;
+ ItemPc_BuildListMenuTemplate();
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sListMenuState.scroll, sListMenuState.row);
+ sub_8098660(1);
+ gTasks[taskId].func = Task_ItemPcMain;
+ }
+}
+
+static void ItemPc_MoveItemModeCancel(u8 taskId, u32 pos)
+{
+ s16 * data = gTasks[taskId].data;
+
+ DestroyListMenuTask(data[0], &sListMenuState.scroll, &sListMenuState.row);
+ if (data[1] < pos)
+ sListMenuState.row--;
+ ItemPc_BuildListMenuTemplate();
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sListMenuState.scroll, sListMenuState.row);
+ sub_8098660(1);
+ gTasks[taskId].func = Task_ItemPcMain;
+}
+
+static void Task_ItemPcSubmenuInit(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+ u8 windowId;
+
+ ItemPc_SetBorderStyleOnWindow(4);
+ windowId = ItemPc_GetOrCreateSubwindow(0);
+ 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);
+ ItemPc_AddTextPrinterParameterized(windowId, 2, gStringVar4, 0, 2, 1, 0, 0, 1);
+ ScheduleBgCopyTilemapToVram(0);
+ gTasks[taskId].func = Task_ItemPcSubmenuRun;
+}
+
+static void Task_ItemPcSubmenuRun(u8 taskId)
+{
+ s8 input = Menu_ProcessInputNoWrapAround();
+ switch (input)
+ {
+ case -1:
+ PlaySE(SE_SELECT);
+ Task_ItemPcCancel(taskId);
+ break;
+ case -2:
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ sItemPcSubmenuOptions[input].func.void_u8(taskId);
+ }
+}
+
+static void Task_ItemPcWithdraw(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ ClearStdWindowAndFrameToTransparent(4, FALSE);
+ ItemPc_DestroySubwindow(0);
+ ClearWindowTilemap(4);
+ data[8] = 1;
+ if (ItemPc_GetItemQuantityBySlotId(data[1]) == 1)
+ {
+ PutWindowTilemap(0);
+ ScheduleBgCopyTilemapToVram(0);
+ ItemPc_DoWithdraw(taskId);
+ }
+ else
+ {
+ PutWindowTilemap(0);
+ ItemPc_WithdrawMultipleInitWindow(data[1]);
+ ItemPc_PlaceWithdrawQuantityScrollIndicatorArrows();
+ gTasks[taskId].func = Task_ItemPcHandleWithdrawMultiple;
+ }
+}
+
+static void ItemPc_DoWithdraw(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+ u16 itemId = ItemPc_GetItemIdBySlotId(data[1]);
+ u8 windowId;
+
+ if (AddBagItem(itemId, data[8]) == TRUE)
+ {
+ ItemUse_SetQuestLogEvent(29, NULL, itemId, 0xFFFF);
+ CopyItemName(itemId, gStringVar1);
+ ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringExpandPlaceholders(gStringVar4, gText_WithdrewQuantItem);
+ windowId = ItemPc_GetOrCreateSubwindow(2);
+ AddTextPrinterParameterized(windowId, 2, gStringVar4, 0, 2, 0, NULL);
+ gTasks[taskId].func = Task_ItemPcWaitButtonAndFinishWithdrawMultiple;
+ }
+ else
+ {
+ windowId = ItemPc_GetOrCreateSubwindow(2);
+ AddTextPrinterParameterized(windowId, 2, gText_NoMoreRoomInBag, 0, 2, 0, NULL);
+ gTasks[taskId].func = Task_ItemPcWaitButtonWithdrawMultipleFailed;
+ }
+}
+
+static void Task_ItemPcWaitButtonAndFinishWithdrawMultiple(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+ u16 itemId;
+
+ if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ itemId = ItemPc_GetItemIdBySlotId(data[1]);
+ RemoveItemFromPC(itemId, data[8]);
+ ItemPcCompaction();
+ Task_ItemPcCleanUpWithdraw(taskId);
+ }
+}
+
+static void Task_ItemPcWaitButtonWithdrawMultipleFailed(u8 taskId)
+{
+ if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ Task_ItemPcCleanUpWithdraw(taskId);
+ }
+}
+
+static void Task_ItemPcCleanUpWithdraw(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ ItemPc_DestroySubwindow(2);
+ PutWindowTilemap(1);
+ DestroyListMenuTask(data[0], &sListMenuState.scroll, &sListMenuState.row);
+ ItemPc_CountPcItems();
+ ItemPc_SetCursorPosition();
+ ItemPc_BuildListMenuTemplate();
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sListMenuState.scroll, sListMenuState.row);
+ ScheduleBgCopyTilemapToVram(0);
+ ItemPc_ReturnFromSubmenu(taskId);
+}
+
+static void ItemPc_WithdrawMultipleInitWindow(u16 slotId)
+{
+ u16 itemId = ItemPc_GetItemIdBySlotId(slotId);
+
+ CopyItemName(itemId, gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gText_WithdrawHowMany);
+ AddTextPrinterParameterized(ItemPc_GetOrCreateSubwindow(1), 2, gStringVar4, 0, 2, 0, NULL);
+ ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 3);
+ StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);
+ ItemPc_SetBorderStyleOnWindow(3);
+ ItemPc_AddTextPrinterParameterized(3, 0, gStringVar4, 8, 10, 1, 0, 0, 1);
+ ScheduleBgCopyTilemapToVram(0);
+}
+
+static void sub_810E670(s16 quantity)
+{
+ FillWindowPixelRect(3, 0x11, 10, 10, 28, 12);
+ ConvertIntToDecimalStringN(gStringVar1, quantity, STR_CONV_MODE_LEADING_ZEROS, 3);
+ StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1);
+ ItemPc_AddTextPrinterParameterized(3, 0, gStringVar4, 8, 10, 1, 0, 0, 1);
+}
+
+static void Task_ItemPcHandleWithdrawMultiple(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)
+ sub_810E670(data[8]);
+ else if (JOY_NEW(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ ItemPc_DestroySubwindow(1);
+ ClearWindowTilemap(3);
+ PutWindowTilemap(0);
+ ItemPc_PrintOrRemoveCursor(data[0], 1);
+ ScheduleBgCopyTilemapToVram(0);
+ ItemPc_RemoveScrollIndicatorArrowPair();
+ ItemPc_DoWithdraw(taskId);
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ ClearStdWindowAndFrameToTransparent(3, FALSE);
+ ItemPc_DestroySubwindow(1);
+ ClearWindowTilemap(3);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ ItemPc_PrintOrRemoveCursor(data[0], 1);
+ ScheduleBgCopyTilemapToVram(0);
+ ItemPc_RemoveScrollIndicatorArrowPair();
+ ItemPc_ReturnFromSubmenu(taskId);
+ }
+}
+
+static void Task_ItemPcGive(u8 taskId)
+{
+ if (CalculatePlayerPartyCount() == 0)
+ {
+ ClearStdWindowAndFrameToTransparent(4, FALSE);
+ ItemPc_DestroySubwindow(0);
+ ClearWindowTilemap(4);
+ PutWindowTilemap(0);
+ ItemPc_PrintOnWindow5WithContinueTask(taskId, gText_ThereIsNoPokemon, gTask_ItemPcWaitButtonAndExitSubmenu);
+ }
+ else
+ {
+ sStateDataPtr->savedCallback = ItemPc_CB2_SwitchToPartyMenu;
+ Task_ItemPcTurnOff1(taskId);
+ }
+}
+
+static void ItemPc_CB2_SwitchToPartyMenu(void)
+{
+ PartyMenuInit(0, 0, 6, 0, 6, sub_811FB28, ItemPc_CB2_ReturnFromPartyMenu);
+ gUnknown_203B0A0.unkC = ItemPc_GetItemIdBySlotId(ItemPc_GetCursorPosition());
+}
+
+static void ItemPc_CB2_ReturnFromPartyMenu(void)
+{
+ ItemPc_Init(1, NULL);
+}
+
+static void gTask_ItemPcWaitButtonAndExitSubmenu(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ if (JOY_NEW(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ ClearDialogWindowAndFrameToTransparent(5, 0);
+ ClearWindowTilemap(5);
+ PutWindowTilemap(1);
+ ItemPc_PrintOrRemoveCursor(data[0], 1);
+ ScheduleBgCopyTilemapToVram(0);
+ ItemPc_ReturnFromSubmenu(taskId);
+ }
+}
+
+static void Task_ItemPcCancel(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ ClearStdWindowAndFrameToTransparent(4, FALSE);
+ ItemPc_DestroySubwindow(0);
+ ClearWindowTilemap(4);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ ItemPc_PrintOrRemoveCursor(data[0], 1);
+ ScheduleBgCopyTilemapToVram(0);
+ ItemPc_ReturnFromSubmenu(taskId);
+}
+
+static void ItemPc_InitWindows(void)
+{
+ u8 i;
+
+ InitWindows(gUnknown_8453F98);
+ DeactivateAllTextPrinters();
+ TextWindow_SetUserSelectedFrame(0, 0x3C0, 0xE0);
+ TextWindow_SetStdFrame0_WithPal(0, 0x3A3, 0xC0);
+ TextWindow_LoadResourcesStdFrame0(0, 0x3AC, 0xB0);
+ LoadPalette(stdpal_get(2), 0xD0, 0x20);
+ LoadPalette(gTMCaseMainWindowPalette, 0xF0, 0x20);
+ for (i = 0; i < 3; i++)
+ {
+ FillWindowPixelBuffer(i, 0x00);
+ PutWindowTilemap(i);
+ }
+ ScheduleBgCopyTilemapToVram(0);
+ for (i = 0; i < 3; i++)
+ sSubmenuWindowIds[i] = 0xFF;
+}
+
+static void unused_ItemPc_AddTextPrinterParameterized(u8 windowId, const u8 * string, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed)
+{
+ struct TextPrinterTemplate template;
+
+ template.currentChar = string;
+ template.windowId = windowId;
+ template.fontId = 3;
+ template.x = x;
+ template.y = y;
+ template.currentX = x;
+ template.currentY = y;
+ template.fgColor = 2;
+ template.bgColor = 0;
+ template.shadowColor = 3;
+ template.unk = GetFontAttribute(3, FONTATTR_UNKNOWN);
+ template.letterSpacing = letterSpacing + GetFontAttribute(3, FONTATTR_LETTER_SPACING);
+ template.lineSpacing = lineSpacing + GetFontAttribute(3, FONTATTR_LINE_SPACING);
+ AddTextPrinter(&template, speed, NULL);
+}
+
+static void ItemPc_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx)
+{
+ AddTextPrinterParameterized4(windowId, fontId, x, y, letterSpacing, lineSpacing, &gUnknown_8453F8C[colorIdx], speed, str);
+}
+
+static void ItemPc_SetBorderStyleOnWindow(u8 windowId)
+{
+ DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, 0x3C0, 0x0E);
+}
+
+static u8 ItemPc_GetOrCreateSubwindow(u8 idx)
+{
+ if (sSubmenuWindowIds[idx] == 0xFF)
+ {
+ sSubmenuWindowIds[idx] = AddWindow(&gUnknown_8453FD0[idx]);
+ DrawStdFrameWithCustomTileAndPalette(sSubmenuWindowIds[idx], TRUE, 0x3A3, 0x0C);
+ }
+
+ return sSubmenuWindowIds[idx];
+}
+
+static void ItemPc_DestroySubwindow(u8 idx)
+{
+ ClearStdWindowAndFrameToTransparent(sSubmenuWindowIds[idx], FALSE);
+ ClearWindowTilemap(sSubmenuWindowIds[idx]); // redundant
+ RemoveWindow(sSubmenuWindowIds[idx]);
+ sSubmenuWindowIds[idx] = 0xFF;
+}
+
+static u8 ItemPc_GetSubwindow(u8 idx)
+{
+ return sSubmenuWindowIds[idx];
+}
+
+static void ItemPc_PrintOnWindow5WithContinueTask(u8 taskId, const u8 * str, TaskFunc taskFunc)
+{
+ DisplayMessageAndContinueTask(taskId, 5, 0x3AC, 0x0B, 2, GetTextSpeedSetting(), str, taskFunc);
+ ScheduleBgCopyTilemapToVram(0);
+}
diff --git a/src/item_use.c b/src/item_use.c
new file mode 100644
index 000000000..3653a1699
--- /dev/null
+++ b/src/item_use.c
@@ -0,0 +1,879 @@
+#include "global.h"
+#include "battle.h"
+#include "berry_pouch.h"
+#include "berry_powder.h"
+#include "bike.h"
+#include "coins.h"
+#include "event_data.h"
+#include "field_effect.h"
+#include "field_fadetransition.h"
+#include "field_map_obj_helpers.h"
+#include "field_player_avatar.h"
+#include "field_specials.h"
+#include "field_weather.h"
+#include "fieldmap.h"
+#include "item.h"
+#include "item_menu.h"
+#include "item_use.h"
+#include "itemfinder.h"
+#include "mail.h"
+#include "main.h"
+#include "malloc.h"
+#include "map_obj_80688E4.h"
+#include "map_obj_lock.h"
+#include "metatile_behavior.h"
+#include "new_menu_helpers.h"
+#include "overworld.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "quest_log.h"
+#include "region_map.h"
+#include "script.h"
+#include "sound.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "teachy_tv.h"
+#include "tm_case.h"
+#include "vs_seeker.h"
+#include "constants/fanfares.h"
+#include "constants/flags.h"
+#include "constants/items.h"
+#include "constants/maps.h"
+#include "constants/moves.h"
+#include "constants/songs.h"
+
+EWRAM_DATA void (*sItemUseOnFieldCB)(u8 taskId) = NULL;
+
+void sub_80A1084(void);
+void sub_80A109C(u8 taskId);
+void sub_80A112C(u8 taskId);
+void sub_80A11C0(u8 taskId);
+bool8 sub_80A1194(void);
+void sub_80A1208(void);
+void ItemUseOnFieldCB_Bicycle(u8 taskId);
+bool8 ItemUseCheckFunc_Rod(void);
+void ItemUseOnFieldCB_Rod(u8 taskId);
+void FieldUseFunc_EvoItem(u8 taskId);
+void sub_80A1648(u8 taskId);
+void sub_80A1674(u8 taskId);
+void InitTMCaseFromBag(void);
+void Task_InitTMCaseFromField(u8 taskId);
+void InitBerryPouchFromBag(void);
+void Task_InitBerryPouchFromField(u8 taskId);
+void InitBerryPouchFromBattle(void);
+void InitTeachyTvFromBag(void);
+void Task_InitTeachyTvFromField(u8 taskId);
+void sub_80A19E8(u8 taskId);
+void sub_80A1A44(void);
+void sub_80A1B48(u8 taskId);
+void sub_80A1C08(u8 taskId);
+void sub_80A1CAC(void);
+void sub_80A1CC0(u8 taskId);
+void sub_80A1D58(void);
+void sub_80A1D68(u8 taskId);
+void Task_BattleUse_StatBooster_DelayAndPrint(u8 taskId);
+void Task_BattleUse_StatBooster_WaitButton_ReturnToBattle(u8 taskId);
+
+extern void (*const gUnknown_83E2954[])(void);
+
+void sub_80A0FBC(u8 taskId)
+{
+ u8 itemType;
+ if (gSpecialVar_ItemId == ITEM_ENIGMA_BERRY)
+ itemType = gTasks[taskId].data[4] - 1;
+ else
+ itemType = ItemId_GetType(gSpecialVar_ItemId) - 1;
+ if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH)
+ {
+ BerryPouch_SetExitCallback(gUnknown_83E2954[itemType]);
+ BerryPouch_StartFadeToExitCallback(taskId);
+ }
+ else
+ {
+ ItemMenu_SetExitCallback(gUnknown_83E2954[itemType]);
+ if (itemType == 1)
+ sub_8108CB4();
+ ItemMenu_StartFadeToExitCallback(taskId);
+ }
+}
+
+void sub_80A103C(u8 taskId)
+{
+ if (gTasks[taskId].data[3] != 1)
+ {
+ gFieldCallback = sub_80A1084;
+ sub_80A0FBC(taskId);
+ }
+ else
+ sItemUseOnFieldCB(taskId);
+}
+
+void sub_80A1084(void)
+{
+ sub_807DC00();
+ CreateTask(sub_80A109C, 8);
+}
+
+void sub_80A109C(u8 taskId)
+{
+ if (sub_807AA70() == TRUE)
+ {
+ sItemUseOnFieldCB(taskId);
+ }
+}
+
+void sub_80A10C4(u8 taskId, bool8 a1, u8 a2, const u8 * str)
+{
+ StringExpandPlaceholders(gStringVar4, str);
+ if (a1 == FALSE)
+ DisplayItemMessageInBag(taskId, a2, gStringVar4, sub_810A1F8);
+ else
+ DisplayItemMessageOnField(taskId, a2, gStringVar4, sub_80A112C);
+}
+
+void sub_80A1110(u8 taskId, bool8 a1)
+{
+ sub_80A10C4(taskId, a1, 4, gUnknown_8416425);
+}
+
+void sub_80A112C(u8 taskId)
+{
+ ClearDialogWindowAndFrame(0, 1);
+ DestroyTask(taskId);
+ sub_80696C0();
+ ScriptContext2_Disable();
+}
+
+u8 GetItemCompatibilityRule(u16 itemId)
+{
+ if (ItemId_GetPocket(itemId) == POCKET_TM_CASE)
+ return 1;
+ else if (ItemId_GetFieldFunc(itemId) == FieldUseFunc_EvoItem)
+ return 2;
+ else
+ return 0;
+}
+
+void sub_80A1184(void)
+{
+ gFieldCallback2 = sub_80A1194;
+}
+
+bool8 sub_80A1194(void)
+{
+ player_bitmagic();
+ ScriptContext2_Enable();
+ sub_807DC00();
+ CreateTask(sub_80A11C0, 10);
+ gUnknown_2031DE0 = 0;
+ return TRUE;
+}
+
+void sub_80A11C0(u8 taskId)
+{
+ if (sub_807AA70() == TRUE)
+ {
+ UnfreezeMapObjects();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+ }
+}
+
+void FieldUseFunc_OrangeMail(u8 taskId)
+{
+ ItemMenu_SetExitCallback(sub_80A1208);
+ ItemMenu_StartFadeToExitCallback(taskId);
+}
+
+void sub_80A1208(void)
+{
+ struct MailStruct mail;
+
+ mail.itemId = gSpecialVar_ItemId;
+ sub_80BEBEC(&mail, ReturnToBagFromKeyItem, 0);
+}
+
+void FieldUseFunc_MachBike(u8 taskId)
+{
+ s16 x, y;
+ u8 behavior;
+
+ PlayerGetDestCoords(&x, &y);
+ behavior = MapGridGetMetatileBehaviorAt(x, y);
+
+ if (FlagGet(FLAG_0x830) == TRUE
+ || MetatileBehavior_ReturnFalse_17(behavior) == TRUE
+ || MetatileBehavior_ReturnFalse_18(behavior) == TRUE
+ || MetatileBehavior_ReturnFalse_15(behavior) == TRUE
+ || MetatileBehavior_ReturnFalse_16(behavior) == TRUE)
+ sub_80A10C4(taskId, gTasks[taskId].data[3], 2, gUnknown_8416451);
+ else if (sub_8055C9C() == TRUE && !sub_80BD540())
+ {
+ sItemUseOnFieldCB = ItemUseOnFieldCB_Bicycle;
+ sub_80A103C(taskId);
+ }
+ else
+ sub_80A1110(taskId, gTasks[taskId].data[3]);
+}
+
+void ItemUseOnFieldCB_Bicycle(u8 taskId)
+{
+ if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE))
+ PlaySE(SE_JITENSYA);
+ StartTransitionToFlipBikeState(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE);
+ sub_80696C0();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+}
+
+void FieldUseFunc_OldRod(u8 taskId)
+{
+ if (ItemUseCheckFunc_Rod() == TRUE)
+ {
+ sItemUseOnFieldCB = ItemUseOnFieldCB_Rod;
+ sub_80A103C(taskId);
+ }
+ else
+ sub_80A1110(taskId, gTasks[taskId].data[3]);
+}
+
+bool8 ItemUseCheckFunc_Rod(void)
+{
+ s16 x, y;
+ u16 behavior;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ behavior = MapGridGetMetatileBehaviorAt(x, y);
+
+ if (MetatileBehavior_IsWaterfall(behavior))
+ return FALSE;
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_4))
+ return FALSE;
+ if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
+ {
+ if (IsPlayerFacingSurfableFishableWater())
+ return TRUE;
+ }
+ else
+ {
+ if (MetatileBehavior_IsSurfable(behavior) && !MapGridIsImpassableAt(x, y))
+ return TRUE;
+ if (MetatileBehavior_ReturnFalse_6(behavior) == TRUE)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void ItemUseOnFieldCB_Rod(u8 taskId)
+{
+ sub_805D2C0(ItemId_GetSecondaryId(gSpecialVar_ItemId));
+ DestroyTask(taskId);
+}
+
+void ItemUseOutOfBattle_Itemfinder(u8 taskId)
+{
+ IncrementGameStat(GAME_STAT_USED_ITEMFINDER);
+ sItemUseOnFieldCB = sub_813EC8C;
+ sub_80A103C(taskId);
+}
+
+void FieldUseFunc_CoinCase(u8 taskId)
+{
+ ConvertIntToDecimalStringN(gStringVar1, GetCoins(), STR_CONV_MODE_LEFT_ALIGN, 4);
+ StringExpandPlaceholders(gStringVar4, gUnknown_8416537);
+ ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, 0xFFFF);
+ if (gTasks[taskId].data[3] == 0)
+ DisplayItemMessageInBag(taskId, 2, gStringVar4, sub_810A1F8);
+ else
+ DisplayItemMessageOnField(taskId, 2, gStringVar4, sub_80A112C);
+}
+
+void FieldUseFunc_PowderJar(u8 taskId)
+{
+ ConvertIntToDecimalStringN(gStringVar1, GetBerryPowder(), STR_CONV_MODE_LEFT_ALIGN, 5);
+ StringExpandPlaceholders(gStringVar4, gUnknown_8416644);
+ ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, 0xFFFF);
+ if (gTasks[taskId].data[3] == 0)
+ DisplayItemMessageInBag(taskId, 2, gStringVar4, sub_810A1F8);
+ else
+ DisplayItemMessageOnField(taskId, 2, gStringVar4, sub_80A112C);
+}
+
+void FieldUseFunc_PokeFlute(u8 taskId)
+{
+ bool8 wokeSomeoneUp = FALSE;
+ u8 i;
+
+ for (i = 0; i < CalculatePlayerPartyCount(); i++)
+ {
+ if (!ExecuteTableBasedItemEffect(&gPlayerParty[i], ITEM_AWAKENING, i, MOVE_NONE))
+ wokeSomeoneUp = TRUE;
+ }
+
+ if (wokeSomeoneUp)
+ {
+ ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, 0xFFFF);
+ if (gTasks[taskId].data[3] == 0)
+ DisplayItemMessageInBag(taskId, 2, gUnknown_8416690, sub_80A1648);
+ else
+ DisplayItemMessageOnField(taskId, 2, gUnknown_8416690, sub_80A1648);
+ }
+ else
+ {
+ // Now that's a catchy tune!
+ if (gTasks[taskId].data[3] == 0)
+ DisplayItemMessageInBag(taskId, 2, gUnknown_841665C, sub_810A1F8);
+ else
+ DisplayItemMessageOnField(taskId, 2, gUnknown_841665C, sub_80A112C);
+ }
+}
+
+void sub_80A1648(u8 taskId)
+{
+ PlayFanfareByFanfareNum(FANFARE_POKEFLUTE);
+ gTasks[taskId].func = sub_80A1674;
+}
+
+void sub_80A1674(u8 taskId)
+{
+ if (WaitFanfare(FALSE))
+ {
+ if (gTasks[taskId].data[3] == 0)
+ DisplayItemMessageInBag(taskId, 2, gUnknown_84166A7, sub_810A1F8);
+ else
+ DisplayItemMessageOnField(taskId, 2, gUnknown_84166A7, sub_80A112C);
+ }
+}
+
+void sub_80A16D0(u8 taskId)
+{
+ sub_80A0FBC(taskId);
+}
+
+void FieldUseFunc_Medicine(u8 taskId)
+{
+ gUnknown_3005E98 = sub_81252D0;
+ sub_80A16D0(taskId);
+}
+
+void FieldUseFunc_Ether(u8 taskId)
+{
+ gUnknown_3005E98 = ItemUseCB_PpRestore;
+ sub_80A16D0(taskId);
+}
+
+void FieldUseFunc_PpUp(u8 taskId)
+{
+ gUnknown_3005E98 = dp05_pp_up;
+ sub_80A16D0(taskId);
+}
+
+void FieldUseFunc_RareCandy(u8 taskId)
+{
+ gUnknown_3005E98 = dp05_rare_candy;
+ sub_80A16D0(taskId);
+}
+
+void FieldUseFunc_EvoItem(u8 taskId)
+{
+ gUnknown_3005E98 = sub_8126B60;
+ sub_80A16D0(taskId);
+}
+
+void FieldUseFunc_SacredAsh(u8 taskId)
+{
+ gUnknown_3005E98 = sub_8126894;
+ sub_80A0FBC(taskId);
+}
+
+void FieldUseFunc_TmCase(u8 taskId)
+{
+ if (gTasks[taskId].data[3] == 0)
+ {
+ ItemMenu_SetExitCallback(InitTMCaseFromBag);
+ ItemMenu_StartFadeToExitCallback(taskId);
+ }
+ else
+ {
+ sub_80CCB68();
+ fade_screen(1, 0);
+ gTasks[taskId].func = Task_InitTMCaseFromField;
+ }
+}
+
+void InitTMCaseFromBag(void)
+{
+ InitTMCase(0, ReturnToBagFromKeyItem, 0);
+}
+
+void Task_InitTMCaseFromField(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ CleanupOverworldWindowsAndTilemaps();
+ sub_80A1184();
+ InitTMCase(0, CB2_ReturnToField, 1);
+ DestroyTask(taskId);
+ }
+}
+
+void FieldUseFunc_BerryPouch(u8 taskId)
+{
+ if (gTasks[taskId].data[3] == 0)
+ {
+ ItemMenu_SetExitCallback(InitBerryPouchFromBag);
+ ItemMenu_StartFadeToExitCallback(taskId);
+ }
+ else
+ {
+ sub_80CCB68();
+ fade_screen(1, 0);
+ gTasks[taskId].func = Task_InitBerryPouchFromField;
+ }
+}
+
+void InitBerryPouchFromBag(void)
+{
+ InitBerryPouch(0, ReturnToBagFromKeyItem, 0);
+}
+
+void Task_InitBerryPouchFromField(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ CleanupOverworldWindowsAndTilemaps();
+ sub_80A1184();
+ InitBerryPouch(0, CB2_ReturnToField, 1);
+ DestroyTask(taskId);
+ }
+}
+
+void BattleUseFunc_BerryPouch(u8 taskId)
+{
+ ItemMenu_SetExitCallback(InitBerryPouchFromBattle);
+ ItemMenu_StartFadeToExitCallback(taskId);
+}
+
+void InitBerryPouchFromBattle(void)
+{
+ InitBerryPouch(4, sub_8107ECC, 0);
+}
+
+void FieldUseFunc_TeachyTv(u8 taskId)
+{
+ ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, 0xFFFF);
+ if (gTasks[taskId].data[3] == 0)
+ {
+ ItemMenu_SetExitCallback(InitTeachyTvFromBag);
+ ItemMenu_StartFadeToExitCallback(taskId);
+ }
+ else
+ {
+ sub_80CCB68();
+ fade_screen(1, 0);
+ gTasks[taskId].func = Task_InitTeachyTvFromField;
+ }
+}
+
+void InitTeachyTvFromBag(void)
+{
+ InitTeachyTvController(0, ReturnToBagFromKeyItem);
+}
+
+void Task_InitTeachyTvFromField(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ CleanupOverworldWindowsAndTilemaps();
+ sub_80A1184();
+ InitTeachyTvController(0, CB2_ReturnToField);
+ DestroyTask(taskId);
+ }
+}
+
+void FieldUseFunc_SuperRepel(u8 taskId)
+{
+ if (VarGet(VAR_REPEL_STEP_COUNT) == 0)
+ {
+ PlaySE(SE_RU_GASYAN);
+ gTasks[taskId].func = sub_80A19E8;
+ }
+ else
+ // An earlier repel is still in effect
+ DisplayItemMessageInBag(taskId, 2, gUnknown_841659E, sub_810A1F8);
+}
+
+void sub_80A19E8(u8 taskId)
+{
+ if (!IsSEPlaying())
+ {
+ ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, 0xFFFF);
+ VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_ItemId));
+ sub_80A1A44();
+ DisplayItemMessageInBag(taskId, 2, gStringVar4, sub_810A1F8);
+ }
+}
+
+void sub_80A1A44(void)
+{
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ sub_8108DC8(ItemId_GetPocket(gSpecialVar_ItemId));
+ sub_81089F4(ItemId_GetPocket(gSpecialVar_ItemId));
+ CopyItemName(gSpecialVar_ItemId, gStringVar2);
+ StringExpandPlaceholders(gStringVar4, gUnknown_841658C);
+}
+
+void FieldUseFunc_BlackFlute(u8 taskId)
+{
+ ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, 0xFFFF);
+ if (gSpecialVar_ItemId == ITEM_WHITE_FLUTE)
+ {
+ FlagSet(FLAG_WHITE_FLUTE_ACTIVE);
+ FlagClear(FLAG_BLACK_FLUTE_ACTIVE);
+ CopyItemName(gSpecialVar_ItemId, gStringVar2);
+ StringExpandPlaceholders(gStringVar4, gUnknown_84165D2);
+ gTasks[taskId].func = sub_80A1B48;
+ gTasks[taskId].data[8] = 0;
+ }
+ else if (gSpecialVar_ItemId == ITEM_BLACK_FLUTE)
+ {
+ FlagSet(FLAG_BLACK_FLUTE_ACTIVE);
+ FlagClear(FLAG_WHITE_FLUTE_ACTIVE);
+ CopyItemName(gSpecialVar_ItemId, gStringVar2);
+ StringExpandPlaceholders(gStringVar4, gUnknown_8416600);
+ gTasks[taskId].func = sub_80A1B48;
+ gTasks[taskId].data[8] = 0;
+ }
+}
+
+void sub_80A1B48(u8 taskId)
+{
+ if (++gTasks[taskId].data[8] > 7)
+ {
+ PlaySE(SE_PN_ON);
+ DisplayItemMessageInBag(taskId, 2, gStringVar4, sub_810A1F8);
+ }
+}
+
+bool8 CanUseEscapeRopeOnCurrMap(void)
+{
+ if (gMapHeader.escapeRope & 1)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void ItemUseOutOfBattle_EscapeRope(u8 taskId)
+{
+ if (CanUseEscapeRopeOnCurrMap() == TRUE)
+ {
+ ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, gMapHeader.regionMapSectionId);
+ sItemUseOnFieldCB = sub_80A1C08;
+ sub_80A103C(taskId);
+ }
+ else
+ sub_80A1110(taskId, gTasks[taskId].data[3]);
+}
+
+void sub_80A1C08(u8 taskId)
+{
+ Overworld_ResetStateAfterDigEscRope();
+ sub_80A1A44();
+ gTasks[taskId].data[0] = 0;
+ DisplayItemMessageOnField(taskId, 2, gStringVar4, sub_80A1C44);
+}
+
+void sub_80A1C44(u8 taskId)
+{
+ ResetInitialPlayerAvatarState();
+ sub_8085620();
+ DestroyTask(taskId);
+}
+
+void FieldUseFunc_TownMap(u8 taskId)
+{
+ if (gTasks[taskId].data[3] == 0)
+ {
+ ItemMenu_SetExitCallback(sub_80A1CAC);
+ ItemMenu_StartFadeToExitCallback(taskId);
+ }
+ else
+ {
+ sub_80CCB68();
+ fade_screen(1, 0);
+ gTasks[taskId].func = sub_80A1CC0;
+ }
+}
+
+void sub_80A1CAC(void)
+{
+ sub_80BFF50(0, ReturnToBagFromKeyItem);
+}
+
+void sub_80A1CC0(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ CleanupOverworldWindowsAndTilemaps();
+ sub_80A1184();
+ sub_80BFF50(0, CB2_ReturnToField);
+ DestroyTask(taskId);
+ }
+}
+
+void FieldUseFunc_FameChecker(u8 taskId)
+{
+ ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, 0xFFFF);
+ if (gTasks[taskId].data[3] == 0)
+ {
+ ItemMenu_SetExitCallback(sub_80A1D58);
+ ItemMenu_StartFadeToExitCallback(taskId);
+ }
+ else
+ {
+ sub_80CCB68();
+ fade_screen(1, 0);
+ gTasks[taskId].func = sub_80A1D68;
+ }
+}
+
+void sub_80A1D58(void)
+{
+ UseFameChecker(ReturnToBagFromKeyItem);
+}
+
+void sub_80A1D68(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ CleanupOverworldWindowsAndTilemaps();
+ sub_80A1184();
+ UseFameChecker(CB2_ReturnToField);
+ DestroyTask(taskId);
+ }
+}
+
+void FieldUseFunc_VsSeeker(u8 taskId)
+{
+ if ((gMapHeader.mapType != MAP_TYPE_ROUTE
+ && gMapHeader.mapType != MAP_TYPE_TOWN
+ && gMapHeader.mapType != MAP_TYPE_CITY)
+ || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(VIRIDIAN_FOREST)
+ && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(VIRIDIAN_FOREST)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(MT_EMBER_EXTERIOR)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(THREE_ISLAND_BERRY_FOREST)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SIX_ISLAND_PATTERN_BUSH))))
+ {
+ sub_80A1110(taskId, gTasks[taskId].data[3]);
+ }
+ else
+ {
+ sItemUseOnFieldCB = Task_VsSeeker_0;
+ sub_80A103C(taskId);
+ }
+}
+
+void sub_80A1E0C(u8 taskId)
+{
+ sub_80A112C(taskId);
+}
+
+void BattleUseFunc_PokeBallEtc(u8 taskId)
+{
+ if (!IsPlayerPartyAndPokemonStorageFull())
+ {
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ sub_8108CB4();
+ ItemMenu_StartFadeToExitCallback(taskId);
+ }
+ else
+ {
+ DisplayItemMessageInBag(taskId, 2, gUnknown_8416631, sub_810A1F8);
+ }
+}
+
+void BattleUseFunc_PokeFlute(u8 taskId)
+{
+ sub_8108CB4();
+ ItemMenu_StartFadeToExitCallback(taskId);
+}
+
+void BattleUseFunc_GuardSpec(u8 taskId)
+{
+ if (ExecuteTableBasedItemEffect(&gPlayerParty[gBattlerPartyIndexes[gBattlerInMenuId]], gSpecialVar_ItemId, gBattlerPartyIndexes[gBattlerInMenuId], 0))
+ {
+ DisplayItemMessageInBag(taskId, 2, gUnknown_84169DC, sub_810A1F8);
+ }
+ else
+ {
+ gTasks[taskId].data[8] = 0;
+ gTasks[taskId].func = Task_BattleUse_StatBooster_DelayAndPrint;
+ }
+}
+
+void Task_BattleUse_StatBooster_DelayAndPrint(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ if (++data[8] > 7)
+ {
+ u16 itemId = gSpecialVar_ItemId;
+ PlaySE(SE_KAIFUKU);
+ RemoveBagItem(itemId, 1);
+ DisplayItemMessageInBag(taskId, 2, Battle_PrintStatBoosterEffectMessage(itemId), Task_BattleUse_StatBooster_WaitButton_ReturnToBattle);
+ }
+}
+
+void Task_BattleUse_StatBooster_WaitButton_ReturnToBattle(u8 taskId)
+{
+ if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))
+ {
+ sub_8108CB4();
+ ItemMenu_StartFadeToExitCallback(taskId);
+ }
+}
+
+void ItemUse_SwitchToPartyMenuInBattle(u8 taskId)
+{
+ if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH)
+ {
+ BerryPouch_SetExitCallback(sub_81279E0);
+ BerryPouch_StartFadeToExitCallback(taskId);
+ }
+ else
+ {
+ ItemMenu_SetExitCallback(sub_81279E0);
+ ItemMenu_StartFadeToExitCallback(taskId);
+ }
+}
+
+void BattleUseFunc_Medicine(u8 taskId)
+{
+ gUnknown_3005E98 = ItemUseCB_Medicine;
+ ItemUse_SwitchToPartyMenuInBattle(taskId);
+}
+
+void sub_80A1FD8(u8 taskId)
+{
+ gUnknown_3005E98 = sub_8126894;
+ ItemUse_SwitchToPartyMenuInBattle(taskId);
+}
+
+void BattleUseFunc_Ether(u8 taskId)
+{
+ gUnknown_3005E98 = ItemUseCB_PpRestore;
+ ItemUse_SwitchToPartyMenuInBattle(taskId);
+}
+
+void BattleUseFunc_PokeDoll(u8 taskId)
+{
+ if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER))
+ {
+ sub_80A1A44();
+ ItemUse_SetQuestLogEvent(4, 0, gSpecialVar_ItemId, 0xFFFF);
+ DisplayItemMessageInBag(taskId, 2, gStringVar4, ItemMenu_StartFadeToExitCallback);
+ }
+ else
+ sub_80A1110(taskId, 0);
+}
+
+void ItemUseOutOfBattle_EnigmaBerry(u8 taskId)
+{
+ switch (GetItemEffectType(gSpecialVar_ItemId) - 1)
+ {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ gTasks[taskId].data[4] = 1;
+ FieldUseFunc_Medicine(taskId);
+ break;
+ case 9:
+ gTasks[taskId].data[4] = 1;
+ FieldUseFunc_SacredAsh(taskId);
+ break;
+ case 0:
+ gTasks[taskId].data[4] = 1;
+ FieldUseFunc_RareCandy(taskId);
+ break;
+ case 18:
+ case 19:
+ gTasks[taskId].data[4] = 1;
+ FieldUseFunc_PpUp(taskId);
+ break;
+ case 20:
+ gTasks[taskId].data[4] = 1;
+ FieldUseFunc_Ether(taskId);
+ break;
+ default:
+ gTasks[taskId].data[4] = 4;
+ FieldUseFunc_OakStopsYou(taskId);
+ }
+}
+
+void ItemUseInBattle_EnigmaBerry(u8 taskId)
+{
+ switch (GetItemEffectType(gSpecialVar_ItemId))
+ {
+ case 0:
+ BattleUseFunc_GuardSpec(taskId);
+ break;
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 11:
+ BattleUseFunc_Medicine(taskId);
+ break;
+ case 21:
+ BattleUseFunc_Ether(taskId);
+ break;
+ default:
+ FieldUseFunc_OakStopsYou(taskId);
+ }
+}
+
+void FieldUseFunc_OakStopsYou(u8 taskId)
+{
+ if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH)
+ {
+ StringExpandPlaceholders(gStringVar4, gUnknown_8416425);
+ DisplayItemMessageInBerryPouch(taskId, 4, gStringVar4, sub_813E2B8);
+ }
+ else
+ sub_80A1110(taskId, gTasks[taskId].data[3]);
+}
+
+void ItemUse_SetQuestLogEvent(u8 eventId, struct Pokemon * pokemon, u16 itemId, u16 param)
+{
+ struct UnkStruct_ItemUseQuestLog
+ {
+ u16 itemId;
+ u16 unk2;
+ u16 species;
+ u16 param;
+ } * questLog = Alloc(sizeof(*questLog));
+
+ questLog->itemId = itemId;
+ questLog->param = param;
+ if (pokemon != NULL)
+ questLog->species = GetMonData(pokemon, MON_DATA_SPECIES2);
+ else
+ questLog->species = 0xFFFF;
+ sub_8113550(eventId, (void *)questLog);
+ Free(questLog);
+}
diff --git a/src/list_menu.c b/src/list_menu.c
new file mode 100644
index 000000000..5f2bd02b3
--- /dev/null
+++ b/src/list_menu.c
@@ -0,0 +1,786 @@
+#include "global.h"
+#include "menu.h"
+#include "list_menu.h"
+#include "menu_indicators.h"
+#include "new_menu_helpers.h"
+#include "window.h"
+#include "text_window.h"
+#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"
+#include "constants/songs.h"
+
+struct UnkIndicatorsStruct
+{
+ u8 field_0;
+ u16 *field_4;
+ u16 field_8;
+ u16 field_A;
+ u16 field_C;
+ u16 field_E;
+ u8 field_10;
+ u8 field_11;
+ u8 field_12;
+ u8 field_13;
+ u8 field_14_0:4;
+ u8 field_14_1:4;
+ u8 field_15_0:4;
+ u8 field_15_1:4;
+ u8 field_16_0:3;
+ u8 field_16_1:3;
+ u8 field_16_2:2;
+ u8 field_17_0:6;
+ u8 field_17_1:2;
+};
+
+struct MysteryGiftLinkMenuStruct
+{
+ s32 currItemId;
+ u8 state;
+ u8 windowId;
+ u8 listTaskId;
+};
+
+struct ListMenuOverride
+{
+ u8 cursorPal:4;
+ u8 fillValue:4;
+ u8 cursorShadowPal:4;
+ u8 lettersSpacing:6;
+ u8 field_2_2:6; // unused
+ u8 fontId:7;
+ bool8 enabled:1;
+};
+
+struct MoveMenuInfoIcon
+{
+ u8 width;
+ u8 height;
+ u16 offset;
+};
+
+static EWRAM_DATA struct MysteryGiftLinkMenuStruct sMysteryGiftLinkMenu = {0};
+
+struct ListMenuOverride gListMenuOverride;
+struct ListMenuTemplate gMultiuseListMenuTemplate;
+
+static u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow);
+static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown);
+static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u16 count);
+static void ListMenuDrawCursor(struct ListMenu *list);
+static void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 onInit);
+static u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind);
+
+const struct MoveMenuInfoIcon gMoveMenuInfoIcons[] =
+{
+ { 12, 12, 0x00 }, // Unused
+ { 32, 12, 0x20 }, // Normal icon
+ { 32, 12, 0x64 }, // Fight icon
+ { 32, 12, 0x60 }, // Flying icon
+ { 32, 12, 0x80 }, // Poison icon
+ { 32, 12, 0x48 }, // Ground icon
+ { 32, 12, 0x44 }, // Rock icon
+ { 32, 12, 0x6C }, // Bug icon
+ { 32, 12, 0x68 }, // Ghost icon
+ { 32, 12, 0x88 }, // Steel icon
+ { 32, 12, 0xA4 }, // ??? (Mystery) icon
+ { 32, 12, 0x24 }, // Fire icon
+ { 32, 12, 0x28 }, // Water icon
+ { 32, 12, 0x2C }, // Grass icon
+ { 32, 12, 0x40 }, // Electric icon
+ { 32, 12, 0x84 }, // Psychic icon
+ { 32, 12, 0x4C }, // Ice icon
+ { 32, 12, 0xA0 }, // Dragon icon
+ { 32, 12, 0x8C }, // Dark icon
+ { 40, 12, 0xA8 }, // -Type- icon
+ { 40, 12, 0xC0 }, // -Power- icon
+ { 40, 12, 0xC8 }, // -Accuracy- icon
+ { 40, 12, 0xE0 }, // -PP- icon
+ { 40, 12, 0xE8 }, // -Effect- icon
+};
+
+static void ListMenuDummyTask(u8 taskId)
+{
+}
+
+s32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 arg2, u16 tileNum, u16 palNum)
+{
+ switch (sMysteryGiftLinkMenu.state)
+ {
+ case 0:
+ default:
+ sMysteryGiftLinkMenu.windowId = AddWindow(windowTemplate);
+ switch (arg2)
+ {
+ case 2:
+ TextWindow_SetUserSelectedFrame(sMysteryGiftLinkMenu.windowId, tileNum, palNum);
+ case 1:
+ DrawTextBorderOuter(sMysteryGiftLinkMenu.windowId, tileNum, palNum / 16);
+ break;
+ }
+ gMultiuseListMenuTemplate = *listMenuTemplate;
+ gMultiuseListMenuTemplate.windowId = sMysteryGiftLinkMenu.windowId;
+ sMysteryGiftLinkMenu.listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+ CopyWindowToVram(sMysteryGiftLinkMenu.windowId, 1);
+ sMysteryGiftLinkMenu.state = 1;
+ break;
+ case 1:
+ sMysteryGiftLinkMenu.currItemId = ListMenu_ProcessInput(sMysteryGiftLinkMenu.listTaskId);
+ if (JOY_NEW(A_BUTTON))
+ {
+ sMysteryGiftLinkMenu.state = 2;
+ }
+ if (JOY_NEW(B_BUTTON))
+ {
+ sMysteryGiftLinkMenu.currItemId = LIST_CANCEL;
+ sMysteryGiftLinkMenu.state = 2;
+ }
+ if (sMysteryGiftLinkMenu.state == 2)
+ {
+ if (!arg2)
+ {
+ ClearWindowTilemap(sMysteryGiftLinkMenu.windowId);
+ }
+ else
+ {
+ switch (arg2)
+ {
+ case 0: // can never be reached, because of the if statement above
+ ClearStdWindowAndFrame(sMysteryGiftLinkMenu.windowId, FALSE);
+ break;
+ case 2:
+ case 1:
+ ClearStdWindowAndFrame(sMysteryGiftLinkMenu.windowId, FALSE);
+ break;
+ }
+ }
+ CopyWindowToVram(sMysteryGiftLinkMenu.windowId, 1);
+ }
+ break;
+ case 2:
+ DestroyListMenuTask(sMysteryGiftLinkMenu.listTaskId, NULL, NULL);
+ RemoveWindow(sMysteryGiftLinkMenu.windowId);
+ sMysteryGiftLinkMenu.state = 0;
+ return sMysteryGiftLinkMenu.currItemId;
+ }
+ return LIST_NOTHING_CHOSEN;
+}
+
+u8 ListMenuInit(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow)
+{
+ u8 taskId = ListMenuInitInternal(listMenuTemplate, scrollOffset, selectedRow);
+ PutWindowTilemap(listMenuTemplate->windowId);
+ CopyWindowToVram(listMenuTemplate->windowId, 2);
+ return taskId;
+}
+
+u8 ListMenuInitInRect(struct ListMenuTemplate *listMenuTemplate, struct ListMenuWindowRect *rect, u16 scrollOffset, u16 selectedRow)
+{
+ s32 i;
+ u8 taskId = ListMenuInitInternal(listMenuTemplate, scrollOffset, selectedRow);
+
+ for (i = 0; rect[i].palNum != 0xFF; i++)
+ PutWindowRectTilemapOverridePalette(listMenuTemplate->windowId, rect[i].x, rect[i].y, rect[i].width, rect[i].height, rect[i].palNum);
+ CopyWindowToVram(listMenuTemplate->windowId, 2);
+ return taskId;
+}
+
+s32 ListMenu_ProcessInput(u8 listTaskId)
+{
+ struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
+
+ if (JOY_NEW(A_BUTTON))
+ {
+ return list->template.items[list->scrollOffset + list->selectedRow].index;
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ return LIST_CANCEL;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ ListMenuChangeSelection(list, TRUE, 1, FALSE);
+ return LIST_NOTHING_CHOSEN;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ ListMenuChangeSelection(list, TRUE, 1, TRUE);
+ return LIST_NOTHING_CHOSEN;
+ }
+ else // try to move by one window scroll
+ {
+ bool16 rightButton, leftButton;
+ switch (list->template.scrollMultiple)
+ {
+ case LIST_NO_MULTIPLE_SCROLL:
+ default:
+ leftButton = FALSE;
+ rightButton = FALSE;
+ break;
+ case LIST_MULTIPLE_SCROLL_DPAD:
+ leftButton = gMain.newAndRepeatedKeys & DPAD_LEFT;
+ rightButton = gMain.newAndRepeatedKeys & DPAD_RIGHT;
+ break;
+ case LIST_MULTIPLE_SCROLL_L_R:
+ leftButton = gMain.newAndRepeatedKeys & L_BUTTON;
+ rightButton = gMain.newAndRepeatedKeys & R_BUTTON;
+ break;
+ }
+ if (leftButton)
+ {
+ ListMenuChangeSelection(list, TRUE, list->template.maxShowed, FALSE);
+ return LIST_NOTHING_CHOSEN;
+ }
+ else if (rightButton)
+ {
+ ListMenuChangeSelection(list, TRUE, list->template.maxShowed, TRUE);
+ return LIST_NOTHING_CHOSEN;
+ }
+ else
+ {
+ return LIST_NOTHING_CHOSEN;
+ }
+ }
+}
+
+void DestroyListMenuTask(u8 listTaskId, u16 *scrollOffset, u16 *selectedRow)
+{
+ struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
+
+ if (scrollOffset != NULL)
+ *scrollOffset = list->scrollOffset;
+ if (selectedRow != NULL)
+ *selectedRow = list->selectedRow;
+
+ if (list->taskId != TASK_NONE)
+ ListMenuRemoveCursorObject(list->taskId, list->template.cursorKind - 2);
+
+ DestroyTask(listTaskId);
+}
+
+void RedrawListMenu(u8 listTaskId)
+{
+ struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
+
+ FillWindowPixelBuffer(list->template.windowId, PIXEL_FILL(list->template.fillValue));
+ ListMenuPrintEntries(list, list->scrollOffset, 0, list->template.maxShowed);
+ ListMenuDrawCursor(list);
+ CopyWindowToVram(list->template.windowId, 2);
+}
+
+static void ChangeListMenuPals(u8 listTaskId, u8 cursorPal, u8 fillValue, u8 cursorShadowPal)
+{
+ struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
+
+ list->template.cursorPal = cursorPal;
+ list->template.fillValue = fillValue;
+ list->template.cursorShadowPal = cursorShadowPal;
+}
+
+static void ChangeListMenuCoords(u8 listTaskId, u8 x, u8 y)
+{
+ struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
+
+ SetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT, x);
+ SetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP, y);
+}
+
+static s32 ListMenuTestInput(struct ListMenuTemplate *template, u32 scrollOffset, u32 selectedRow, u16 keys, u16 *newScrollOffset, u16 *newSelectedRow)
+{
+ struct ListMenu list;
+
+ list.template = *template;
+ list.scrollOffset = scrollOffset;
+ list.selectedRow = selectedRow;
+ list.unk_1C = 0;
+ list.unk_1D = 0;
+ if (keys == DPAD_UP)
+ ListMenuChangeSelection(&list, FALSE, 1, FALSE);
+ if (keys == DPAD_DOWN)
+ ListMenuChangeSelection(&list, FALSE, 1, TRUE);
+
+ if (newScrollOffset != NULL)
+ *newScrollOffset = list.scrollOffset;
+ if (newSelectedRow != NULL)
+ *newSelectedRow = list.selectedRow;
+ return LIST_NOTHING_CHOSEN;
+}
+
+static void ListMenuGetCurrentItemArrayId(u8 listTaskId, u16 *arrayId)
+{
+ struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
+
+ if (arrayId != NULL)
+ *arrayId = list->scrollOffset + list->selectedRow;
+}
+
+void ListMenuGetScrollAndRow(u8 listTaskId, u16 *scrollOffset, u16 *selectedRow)
+{
+ struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
+
+ if (scrollOffset != NULL)
+ *scrollOffset = list->scrollOffset;
+ if (selectedRow != NULL)
+ *selectedRow = list->selectedRow;
+}
+
+u16 ListMenuGetYCoordForPrintingArrowCursor(u8 listTaskId)
+{
+ struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
+ u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;
+
+ return list->selectedRow * yMultiplier + list->template.upText_Y;
+}
+
+static u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow)
+{
+ u8 listTaskId = CreateTask(ListMenuDummyTask, 0);
+ struct ListMenu *list = (struct ListMenu *)gTasks[listTaskId].data;
+
+ list->template = *listMenuTemplate;
+ list->scrollOffset = scrollOffset;
+ list->selectedRow = selectedRow;
+ list->unk_1C = 0;
+ list->unk_1D = 0;
+ list->taskId = TASK_NONE;
+ list->unk_1F = 0;
+ gListMenuOverride.cursorPal = list->template.cursorPal;
+ gListMenuOverride.fillValue = list->template.fillValue;
+ gListMenuOverride.cursorShadowPal = list->template.cursorShadowPal;
+ gListMenuOverride.lettersSpacing = list->template.lettersSpacing;
+ gListMenuOverride.fontId = list->template.fontId;
+ gListMenuOverride.enabled = FALSE;
+ if (list->template.totalItems < list->template.maxShowed)
+ list->template.maxShowed = list->template.totalItems;
+ FillWindowPixelBuffer(list->template.windowId, PIXEL_FILL(list->template.fillValue));
+ ListMenuPrintEntries(list, list->scrollOffset, 0, list->template.maxShowed);
+ ListMenuDrawCursor(list);
+ ListMenuCallSelectionChangedCallback(list, TRUE);
+
+ return listTaskId;
+}
+
+static void ListMenuPrint(struct ListMenu *list, const u8 *str, u8 x, u8 y)
+{
+ struct TextColor colors;
+ if (gListMenuOverride.enabled)
+ {
+ colors.fgColor = gListMenuOverride.fillValue;
+ colors.bgColor = gListMenuOverride.cursorPal;
+ colors.shadowColor = gListMenuOverride.cursorShadowPal;
+ AddTextPrinterParameterized4(list->template.windowId, gListMenuOverride.fontId, x, y, gListMenuOverride.lettersSpacing, 0, &colors, TEXT_SPEED_FF, str);
+ gListMenuOverride.enabled = FALSE;
+ }
+ else
+ {
+ colors.fgColor = list->template.fillValue;
+ colors.bgColor = list->template.cursorPal;
+ colors.shadowColor = list->template.cursorShadowPal;
+ AddTextPrinterParameterized4(list->template.windowId, list->template.fontId, x, y, list->template.lettersSpacing, 0, &colors, TEXT_SPEED_FF, str);
+ }
+}
+
+static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u16 count)
+{
+ s32 i;
+ u8 x, y;
+ u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;
+
+ for (i = 0; i < count; i++)
+ {
+ if (list->template.items[startIndex].index != LIST_HEADER)
+ x = list->template.item_X;
+ else
+ x = list->template.header_X;
+ y = (yOffset + i) * yMultiplier + list->template.upText_Y;
+ if (list->template.itemPrintFunc != NULL)
+ list->template.itemPrintFunc(list->template.windowId, list->template.items[startIndex].index, y);
+ ListMenuPrint(list, list->template.items[startIndex].label, x, y);
+ startIndex++;
+ }
+}
+
+static void ListMenuDrawCursor(struct ListMenu *list)
+{
+ u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;
+ u8 x = list->template.cursor_X;
+ u8 y = list->selectedRow * yMultiplier + list->template.upText_Y;
+
+ switch (list->template.cursorKind)
+ {
+ case 0:
+ ListMenuPrint(list, gFameCheckerText_ListMenuCursor, x, y);
+ break;
+ case 1:
+ break;
+ case 2:
+ if (list->taskId == TASK_NONE)
+ 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)
+ 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;
+ }
+}
+
+static u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind)
+{
+ struct CursorStruct cursor;
+
+ cursor.left = 0;
+ cursor.top = 160;
+ cursor.rowWidth = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8 + 2;
+ cursor.rowHeight = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + 2;
+ cursor.tileTag = 0x4000;
+ cursor.palTag = SPRITE_INVALID_TAG;
+ cursor.palNum = 15;
+ return ListMenuAddCursorObjectInternal(&cursor, cursorKind);
+}
+
+static void ListMenuErasePrintedCursor(struct ListMenu *list, u16 selectedRow)
+{
+ u8 cursorKind = list->template.cursorKind;
+ if (cursorKind == 0)
+ {
+ u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;
+ u8 width = GetMenuCursorDimensionByFont(list->template.fontId, 0);
+ u8 height = GetMenuCursorDimensionByFont(list->template.fontId, 1);
+ FillWindowPixelRect(list->template.windowId,
+ PIXEL_FILL(list->template.fillValue),
+ list->template.cursor_X,
+ selectedRow * yMultiplier + list->template.upText_Y,
+ width,
+ height);
+ }
+}
+
+static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, bool8 movingDown)
+{
+ u16 selectedRow = list->selectedRow;
+ u16 scrollOffset = list->scrollOffset;
+ u16 newRow;
+ u32 newScroll;
+
+ if (!movingDown)
+ {
+ if (list->template.maxShowed == 1)
+ newRow = 0;
+ else
+ newRow = list->template.maxShowed - ((list->template.maxShowed / 2) + (list->template.maxShowed % 2)) - 1;
+
+ if (scrollOffset == 0)
+ {
+ while (selectedRow != 0)
+ {
+ selectedRow--;
+ if (list->template.items[scrollOffset + selectedRow].index != LIST_HEADER)
+ {
+ list->selectedRow = selectedRow;
+ return 1;
+ }
+ }
+ return 0;
+ }
+ else
+ {
+ while (selectedRow > newRow)
+ {
+ selectedRow--;
+ if (list->template.items[scrollOffset + selectedRow].index != LIST_HEADER)
+ {
+ list->selectedRow = selectedRow;
+ return 1;
+ }
+ }
+ newScroll = scrollOffset - 1;
+ }
+ }
+ else
+ {
+ if (list->template.maxShowed == 1)
+ newRow = 0;
+ else
+ newRow = ((list->template.maxShowed / 2) + (list->template.maxShowed % 2));
+
+ if (scrollOffset == list->template.totalItems - list->template.maxShowed)
+ {
+ while (selectedRow < list->template.maxShowed - 1)
+ {
+ selectedRow++;
+ if (list->template.items[scrollOffset + selectedRow].index != LIST_HEADER)
+ {
+ list->selectedRow = selectedRow;
+ return 1;
+ }
+ }
+ return 0;
+ }
+ else
+ {
+ while (selectedRow < newRow)
+ {
+ selectedRow++;
+ if (list->template.items[scrollOffset + selectedRow].index != LIST_HEADER)
+ {
+ list->selectedRow = selectedRow;
+ return 1;
+ }
+ }
+ newScroll = scrollOffset + 1;
+ }
+ }
+ list->selectedRow = newRow;
+ list->scrollOffset = newScroll;
+ return 2;
+}
+
+static void ListMenuScroll(struct ListMenu *list, u8 count, bool8 movingDown)
+{
+ if (count >= list->template.maxShowed)
+ {
+ FillWindowPixelBuffer(list->template.windowId, PIXEL_FILL(list->template.fillValue));
+ ListMenuPrintEntries(list, list->scrollOffset, 0, list->template.maxShowed);
+ }
+ else
+ {
+ u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;
+
+ if (!movingDown)
+ {
+ u16 y, width, height;
+
+ ScrollWindow(list->template.windowId, 1, count * yMultiplier, PIXEL_FILL(list->template.fillValue));
+ ListMenuPrintEntries(list, list->scrollOffset, 0, count);
+
+ y = (list->template.maxShowed * yMultiplier) + list->template.upText_Y;
+ width = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8;
+ height = (GetWindowAttribute(list->template.windowId, WINDOW_HEIGHT) * 8) - y;
+ FillWindowPixelRect(list->template.windowId,
+ PIXEL_FILL(list->template.fillValue),
+ 0, y, width, height);
+ }
+ else
+ {
+ u16 width;
+
+ ScrollWindow(list->template.windowId, 0, count * yMultiplier, PIXEL_FILL(list->template.fillValue));
+ ListMenuPrintEntries(list, list->scrollOffset + (list->template.maxShowed - count), list->template.maxShowed - count, count);
+
+ width = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8;
+ FillWindowPixelRect(list->template.windowId,
+ PIXEL_FILL(list->template.fillValue),
+ 0, 0, width, list->template.upText_Y);
+ }
+ }
+}
+
+static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown)
+{
+ u16 oldSelectedRow;
+ u8 selectionChange, i, cursorCount;
+
+ oldSelectedRow = list->selectedRow;
+ cursorCount = 0;
+ selectionChange = 0;
+ for (i = 0; i < count; i++)
+ {
+ do
+ {
+ u8 ret = ListMenuUpdateSelectedRowIndexAndScrollOffset(list, movingDown);
+
+ selectionChange |= ret;
+ if (ret != 2)
+ break;
+ cursorCount++;
+ }
+ while (list->template.items[list->scrollOffset + list->selectedRow].index == LIST_HEADER);
+ }
+
+ if (updateCursorAndCallCallback)
+ {
+ switch (selectionChange)
+ {
+ case 0:
+ default:
+ return TRUE;
+ case 1:
+ ListMenuErasePrintedCursor(list, oldSelectedRow);
+ ListMenuDrawCursor(list);
+ ListMenuCallSelectionChangedCallback(list, FALSE);
+ CopyWindowToVram(list->template.windowId, 2);
+ break;
+ case 2:
+ case 3:
+ ListMenuErasePrintedCursor(list, oldSelectedRow);
+ ListMenuScroll(list, cursorCount, movingDown);
+ ListMenuDrawCursor(list);
+ ListMenuCallSelectionChangedCallback(list, FALSE);
+ CopyWindowToVram(list->template.windowId, 2);
+ break;
+ }
+ }
+ return FALSE;
+}
+
+static void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 onInit)
+{
+ if (list->template.moveCursorFunc != NULL)
+ list->template.moveCursorFunc(list->template.items[list->scrollOffset + list->selectedRow].index, onInit, list);
+}
+
+void ListMenuOverrideSetColors(u8 cursorPal, u8 fillValue, u8 cursorShadowPal)
+{
+ gListMenuOverride.cursorPal = cursorPal;
+ gListMenuOverride.fillValue = fillValue;
+ gListMenuOverride.cursorShadowPal = cursorShadowPal;
+ gListMenuOverride.enabled = TRUE;
+}
+
+void ListMenuDefaultCursorMoveFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list)
+{
+ if (!onInit)
+ PlaySE(SE_SELECT);
+}
+
+static s32 ListMenuGetUnkIndicatorsStructFields(u8 taskId, u8 field)
+{
+ struct UnkIndicatorsStruct *data = (struct UnkIndicatorsStruct *)gTasks[taskId].data;
+
+ switch (field)
+ {
+ case 0:
+ case 1:
+ return (s32)(data->field_4);
+ case 2:
+ return data->field_C;
+ case 3:
+ return data->field_E;
+ case 4:
+ return data->field_10;
+ case 5:
+ return data->field_11;
+ case 6:
+ return data->field_12;
+ case 7:
+ return data->field_13;
+ case 8:
+ return data->field_14_0;
+ case 9:
+ return data->field_14_1;
+ case 10:
+ return data->field_15_0;
+ case 11:
+ return data->field_15_1;
+ case 12:
+ return data->field_16_0;
+ case 13:
+ return data->field_16_1;
+ case 14:
+ return data->field_16_2;
+ case 15:
+ return data->field_17_0;
+ case 16:
+ return data->field_17_1;
+ default:
+ return -1;
+ }
+}
+
+void ListMenuSetUnkIndicatorsStructField(u8 taskId, u8 field, s32 value)
+{
+ struct UnkIndicatorsStruct *data = (struct UnkIndicatorsStruct *)gTasks[taskId].data;
+
+ switch (field)
+ {
+ case 0:
+ case 1:
+ data->field_4 = (void *)value;
+ break;
+ case 2:
+ data->field_C = value;
+ break;
+ case 3:
+ data->field_E = value;
+ break;
+ case 4:
+ data->field_10 = value;
+ break;
+ case 5:
+ data->field_11 = value;
+ break;
+ case 6:
+ data->field_12 = value;
+ break;
+ case 7:
+ data->field_13 = value;
+ break;
+ case 8:
+ data->field_14_0 = value;
+ break;
+ case 9:
+ data->field_14_1 = value;
+ break;
+ case 10:
+ data->field_15_0 = value;
+ break;
+ case 11:
+ data->field_15_1 = value;
+ break;
+ case 12:
+ data->field_16_0 = value;
+ break;
+ case 13:
+ data->field_16_1 = value;
+ break;
+ case 14:
+ data->field_16_2 = value;
+ break;
+ case 15:
+ data->field_17_0 = value;
+ break;
+ case 16:
+ data->field_17_1 = value;
+ break;
+ }
+}
+
+void sub_8107CD8(u8 palOffset, u16 speciesId)
+{
+ LoadPalette(GetValidMonIconPalettePtr(speciesId), palOffset, 0x20);
+}
+
+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)
+{
+ const u16 *palette;
+
+ switch (palId)
+ {
+ case 0:
+ default:
+ palette = gFireRedMenuElements1_Pal;
+ break;
+ case 1:
+ palette = gFireRedMenuElements2_Pal;
+ break;
+ }
+ LoadPalette(palette, palOffset, 0x20);
+}
+
+void BlitMoveInfoIcon(u8 windowId, u8 iconId, u16 x, u16 y)
+{
+ BlitBitmapRectToWindow(windowId, gFireRedMenuElements_Gfx + gMoveMenuInfoIcons[iconId].offset * 32, 0, 0, 128, 128, x, y, gMoveMenuInfoIcons[iconId].width, gMoveMenuInfoIcons[iconId].height);
+}
diff --git a/src/load_save.c b/src/load_save.c
index 6f388e451..0a7bbbfc5 100644
--- a/src/load_save.c
+++ b/src/load_save.c
@@ -6,8 +6,9 @@
#include "random.h"
#include "malloc.h"
#include "item.h"
+#include "save_location.h"
-extern void sub_8099E44(void);
+extern void SetBagPocketsPointers(void);
extern void sub_8110840(void *oldSave);
extern void sub_8055778(int);
extern void sub_8054F38(u32 newKey);
@@ -80,7 +81,7 @@ void SetSaveBlocksPointers(void)
*sav1_LocalVar = (void*)(&gSaveBlock1) + offset;
gPokemonStoragePtr = (void*)(&gPokemonStorage) + offset;
- sub_8099E44();
+ SetBagPocketsPointers();
sub_8110840(oldSave);
}
@@ -132,28 +133,28 @@ void MoveSaveBlocks_ResetHeap(void)
u32 sav2_x1_query_bit1(void)
{
- return gSaveBlock2Ptr->specialSaveWarp & 1;
+ return gSaveBlock2Ptr->specialSaveWarpFlags & CONTINUE_GAME_WARP;
}
void sav2_x9_clear_bit1(void)
{
- gSaveBlock2Ptr->specialSaveWarp &= ~1;
+ gSaveBlock2Ptr->specialSaveWarpFlags &= ~CONTINUE_GAME_WARP;
}
void sub_804C1AC(void)
{
- gSaveBlock2Ptr->specialSaveWarp |= 1;
+ gSaveBlock2Ptr->specialSaveWarpFlags |= CONTINUE_GAME_WARP;
}
void sub_804C1C0(void)
{
sub_8055778(0);
- gSaveBlock2Ptr->specialSaveWarp |= 1;
+ gSaveBlock2Ptr->specialSaveWarpFlags |= CONTINUE_GAME_WARP;
}
void sav2_gender2_inplace_and_xFE(void)
{
- gSaveBlock2Ptr->specialSaveWarp &= ~1;
+ gSaveBlock2Ptr->specialSaveWarpFlags &= ~CONTINUE_GAME_WARP;
}
void SavePlayerParty(void)
diff --git a/src/mail_data.c b/src/mail_data.c
new file mode 100644
index 000000000..d4fa649e1
--- /dev/null
+++ b/src/mail_data.c
@@ -0,0 +1,186 @@
+#include "global.h"
+#include "text.h"
+#include "mail.h"
+#include "mail_data.h"
+#include "constants/species.h"
+#include "constants/items.h"
+#include "pokemon_icon.h"
+
+void ClearMailData(void)
+{
+ u8 i;
+
+ for (i = 0; i < MAIL_COUNT; i++)
+ ClearMailStruct(&gSaveBlock1Ptr->mail[i]);
+}
+
+void ClearMailStruct(struct MailStruct *mail)
+{
+ s32 i;
+
+ for (i = 0; i < MAIL_WORDS_COUNT; i++)
+ mail->words[i] = 0xFFFF;
+ for (i = 0; i < PLAYER_NAME_LENGTH; i++)
+ mail->playerName[i] = EOS;
+ for (i = 0; i < 4; i++)
+ mail->trainerId[i] = 0;
+ mail->species = SPECIES_BULBASAUR;
+ mail->itemId = ITEM_NONE;
+}
+
+bool8 MonHasMail(struct Pokemon *mon)
+{
+ u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM);
+ if (ItemIsMail(heldItem) && GetMonData(mon, MON_DATA_MAIL) != 0xFF)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+u8 GiveMailToMon(struct Pokemon *mon, u16 itemId)
+{
+ u8 heldItem[2];
+ u8 id, i;
+ u16 species;
+ u32 personality;
+
+ heldItem[0] = itemId;
+ heldItem[1] = itemId >> 8;
+ for (id = 0; id < PARTY_SIZE; id++)
+ {
+ if (gSaveBlock1Ptr->mail[id].itemId == 0)
+ {
+ for (i = 0; i < MAIL_WORDS_COUNT; i++)
+ gSaveBlock1Ptr->mail[id].words[i] = 0xFFFF;
+ for (i = 0; i < PLAYER_NAME_LENGTH - 1 && gSaveBlock2Ptr->playerName[i] != EOS; i++)
+ gSaveBlock1Ptr->mail[id].playerName[i] = gSaveBlock2Ptr->playerName[i];
+ for (; i <= 5; i++)
+ gSaveBlock1Ptr->mail[id].playerName[i] = CHAR_SPACE;
+ gSaveBlock1Ptr->mail[id].playerName[i] = EOS;
+ for (i = 0; i < 4; i++)
+ gSaveBlock1Ptr->mail[id].trainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
+ species = GetBoxMonData(&mon->box, MON_DATA_SPECIES);
+ personality = GetBoxMonData(&mon->box, MON_DATA_PERSONALITY);
+ gSaveBlock1Ptr->mail[id].species = SpeciesToMailSpecies(species, personality);
+ gSaveBlock1Ptr->mail[id].itemId = itemId;
+ SetMonData(mon, MON_DATA_MAIL, &id);
+ SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);
+ return id;
+ }
+ }
+ return 0xFF;
+}
+
+u16 SpeciesToMailSpecies(u16 species, u32 personality)
+{
+ if (species == SPECIES_UNOWN) {
+ u32 mailSpecies = GetUnownLetterByPersonality(personality) + 30000;
+ return mailSpecies;
+ }
+ return species;
+}
+
+u16 MailSpeciesToSpecies(u16 mailSpecies, u16 *unownLetter)
+{
+ u16 result;
+
+ if (mailSpecies >= 30000 && mailSpecies < (30000 + UNOWN_FORM_COUNT))
+ {
+ result = SPECIES_UNOWN;
+ *unownLetter = mailSpecies - 30000;
+ }
+ else
+ {
+ result = mailSpecies;
+ }
+ return result;
+}
+
+u8 GiveMailToMon2(struct Pokemon *mon, struct MailStruct *mail)
+{
+ u8 heldItem[2];
+ u16 itemId = mail->itemId;
+ u8 mailId = GiveMailToMon(mon, itemId);
+
+ if (mailId == 0xFF)
+ return 0xFF;
+ gSaveBlock1Ptr->mail[mailId] = *mail;
+ SetMonData(mon, MON_DATA_MAIL, &mailId);
+ heldItem[0] = itemId;
+ heldItem[1] = itemId >> 8;
+
+ SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);
+
+ return mailId;
+}
+
+static bool32 DummyMailFunc(void)
+{
+ return FALSE;
+}
+
+void TakeMailFromMon(struct Pokemon *mon)
+{
+ u8 heldItem[2];
+ u8 mailId;
+
+ if (MonHasMail(mon))
+ {
+ mailId = GetMonData(mon, MON_DATA_MAIL);
+ gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE;
+ mailId = 0xFF;
+ heldItem[0] = ITEM_NONE;
+ heldItem[1] = ITEM_NONE << 8;
+ SetMonData(mon, MON_DATA_MAIL, &mailId);
+ SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);
+ }
+}
+
+void ClearMailItemId(u8 mailId)
+{
+ gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE;
+}
+
+u8 TakeMailFromMon2(struct Pokemon *mon)
+{
+ u8 i, newMailId;
+ u8 newHeldItem[2];
+
+ newHeldItem[0] = ITEM_NONE;
+ newHeldItem[1] = ITEM_NONE << 8;
+ newMailId = 0xFF;
+ for (i = PARTY_SIZE; i < MAIL_COUNT; i++)
+ {
+ if (gSaveBlock1Ptr->mail[i].itemId == ITEM_NONE)
+ {
+ memcpy(&gSaveBlock1Ptr->mail[i], &gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)], sizeof(struct MailStruct));
+ gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)].itemId = ITEM_NONE;
+ SetMonData(mon, MON_DATA_MAIL, &newMailId);
+ SetMonData(mon, MON_DATA_HELD_ITEM, newHeldItem);
+ return i;
+ }
+ }
+ return 0xFF;
+}
+
+bool8 ItemIsMail(u16 itemId)
+{
+ switch (itemId)
+ {
+ case ITEM_ORANGE_MAIL:
+ case ITEM_HARBOR_MAIL:
+ case ITEM_GLITTER_MAIL:
+ case ITEM_MECH_MAIL:
+ case ITEM_WOOD_MAIL:
+ case ITEM_WAVE_MAIL:
+ case ITEM_BEAD_MAIL:
+ case ITEM_SHADOW_MAIL:
+ case ITEM_TROPIC_MAIL:
+ case ITEM_DREAM_MAIL:
+ case ITEM_FAB_MAIL:
+ case ITEM_RETRO_MAIL:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
diff --git a/src/main.c b/src/main.c
index bfab49c49..0d4e2ee1e 100644
--- a/src/main.c
+++ b/src/main.c
@@ -5,6 +5,7 @@
#include "dma3.h"
#include "gba/flash_internal.h"
#include "battle.h"
+#include "help_system.h"
extern u16 GetGpuReg(u8);
extern void SetGpuReg(u8, u16);
@@ -32,7 +33,6 @@ extern u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void));
extern void ScanlineEffect_Stop(void);
extern void sub_80F50F4(void);
extern bool32 sub_80F5118(void);
-extern bool8 sub_813B870(void);
extern struct SoundInfo gSoundInfo;
extern u32 gFlashMemoryPresent;
@@ -55,7 +55,12 @@ static void VCountIntr(void);
static void SerialIntr(void);
static void IntrDummy(void);
-const u8 gGameVersion = VERSION_FIRE_RED;
+#if defined(FIRERED)
+#define GAME_VERSION VERSION_FIRE_RED
+#elif defined(LEAF_GREEN)
+#define GAME_VERSION VERSION_LEAF_GREEN
+#endif
+const u8 gGameVersion = GAME_VERSION;
const u8 gGameLanguage = GAME_LANGUAGE;
@@ -96,13 +101,13 @@ u8 gUnknown_3003D84;
static IntrFunc * const sTimerIntrFunc = gIntrTable + 0x7;
-extern u16 gTrainerId;
+EWRAM_DATA u8 gDecompressionBuffer[0x4000] = {0};
+EWRAM_DATA u16 gTrainerId = 0;
+
extern bool8 gUnknown_3005ECC;
extern bool8 gWirelessCommType;
extern bool8 gUnknown_3005E88;
-EWRAM_DATA void (**gFlashTimerIntrFunc)(void) = NULL;
-
static void UpdateLinkAndCallCallbacks(void);
static void InitMainCallbacks(void);
static void CallCallbacks(void);
@@ -116,7 +121,7 @@ void EnableVCountIntrAtLine150(void);
void AgbMain()
{
RegisterRamReset(RESET_ALL);
- *(vu16 *)BG_PLTT = 0x7FFF;
+ *(vu16 *)BG_PLTT = RGB_WHITE;
InitGpuRegManager();
REG_WAITCNT = WAITCNT_PREFETCH_ENABLE | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3;
InitKeys();
@@ -206,7 +211,7 @@ static void InitMainCallbacks(void)
static void CallCallbacks(void)
{
- if (!sub_80F5118() && !sub_813B870())
+ if (!sub_80F5118() && !RunHelpSystemCallback())
{
if (gMain.callback1)
gMain.callback1();
diff --git a/src/map_obj_lock.c b/src/map_obj_lock.c
index cdd74a5b9..f89819647 100644
--- a/src/map_obj_lock.c
+++ b/src/map_obj_lock.c
@@ -89,7 +89,7 @@ void LockSelectedMapObject(void)
void sub_80696C0(void)
{
u8 fieldObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
- FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[fieldObjectId]);
+ FieldObjectClearHeldMovementIfFinished(&gMapObjects[fieldObjectId]);
sub_80974D8();
UnfreezeMapObjects();
}
@@ -98,9 +98,9 @@ void sub_80696F0(void)
{
u8 fieldObjectId;
if (gMapObjects[gSelectedEventObject].active)
- FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedEventObject]);
+ FieldObjectClearHeldMovementIfFinished(&gMapObjects[gSelectedEventObject]);
fieldObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
- FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[fieldObjectId]);
+ FieldObjectClearHeldMovementIfFinished(&gMapObjects[fieldObjectId]);
sub_80974D8();
UnfreezeMapObjects();
}
diff --git a/src/menu.c b/src/menu.c
new file mode 100644
index 000000000..bef442d84
--- /dev/null
+++ b/src/menu.c
@@ -0,0 +1,878 @@
+#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"
+#include "palette.h"
+#include "constants/songs.h"
+
+struct Menu
+{
+ u8 left;
+ u8 top;
+ s8 cursorPos;
+ s8 minCursorPos;
+ s8 maxCursorPos;
+ u8 windowId;
+ u8 fontId;
+ u8 optionWidth;
+ u8 optionHeight;
+ u8 columns;
+ u8 rows;
+ bool8 APressMuted;
+};
+
+static EWRAM_DATA struct Menu sMenu = {0};
+static EWRAM_DATA u16 sTileNum = 0;
+static EWRAM_DATA u8 sPaletteNum = 0;
+static EWRAM_DATA u8 sYesNoWindowId = 0;
+static EWRAM_DATA u8 sTopBarWindowId = 0;
+
+static void WindowFunc_DrawDialogFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);
+static void WindowFunc_ClearDialogWindowAndFrameNullPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);
+static void WindowFunc_DrawStdFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);
+static void WindowFunc_ClearStdWindowAndFrameToTransparent(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);
+static u8 MultichoiceGrid_MoveCursor(s8 deltaX, s8 deltaY);
+
+static const struct TextColor gUnknown_8456618 =
+{
+ .fgColor = 15,
+ .bgColor = 1,
+ .shadowColor = 2,
+};
+
+void DrawDialogFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 tileNum, u8 paletteNum)
+{
+ sTileNum = tileNum;
+ sPaletteNum = paletteNum;
+ CallWindowFunction(windowId, WindowFunc_DrawDialogFrameWithCustomTileAndPalette);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
+ PutWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+// not used
+static void DrawDialogFrameWithCustomTile(u8 windowId, bool8 copyToVram, u16 tileNum)
+{
+ sTileNum = tileNum;
+ sPaletteNum = GetWindowAttribute(windowId, WINDOW_PALETTE_NUM);
+ CallWindowFunction(windowId, WindowFunc_DrawDialogFrameWithCustomTileAndPalette);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
+ PutWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+static void WindowFunc_DrawDialogFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
+{
+ FillBgTilemapBufferRect(bg, sTileNum, tilemapLeft - 2, tilemapTop - 1, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 1, tilemapLeft - 1, tilemapTop - 1, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 2, tilemapLeft, tilemapTop - 1, width, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 3, tilemapLeft + width, tilemapTop - 1, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 4, tilemapLeft + width + 1, tilemapTop - 1, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 5, tilemapLeft - 2, tilemapTop, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 6, tilemapLeft - 1, tilemapTop, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 8, tilemapLeft + width, tilemapTop, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 9, tilemapLeft + width + 1, tilemapTop, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 10, tilemapLeft - 2, tilemapTop + 1, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 11, tilemapLeft - 1, tilemapTop + 1, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 12, tilemapLeft + width, tilemapTop + 1, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 13, tilemapLeft + width + 1, tilemapTop + 1, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 10), tilemapLeft - 2, tilemapTop + 2, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 11), tilemapLeft - 1, tilemapTop + 2, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 12), tilemapLeft + width, tilemapTop + 2, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 13), tilemapLeft + width + 1, tilemapTop + 2, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 5), tilemapLeft - 2, tilemapTop + 3, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 6), tilemapLeft - 1, tilemapTop + 3, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 8), tilemapLeft + width, tilemapTop + 3, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 9), tilemapLeft + width + 1, tilemapTop + 3, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum), tilemapLeft - 2, tilemapTop + 4, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 1), tilemapLeft - 1, tilemapTop + 4, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 2), tilemapLeft, tilemapTop + 4, width, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 3), tilemapLeft + width, tilemapTop + 4, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(sTileNum + 4), tilemapLeft + width + 1, tilemapTop + 4, 1, 1, sPaletteNum);
+}
+
+void ClearDialogWindowAndFrameToTransparent(u8 windowId, bool8 copyToVram)
+{
+ // The palette slot doesn't matter, since the tiles are transparent.
+ CallWindowFunction(windowId, WindowFunc_ClearDialogWindowAndFrameNullPalette);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(0));
+ ClearWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+static void WindowFunc_ClearDialogWindowAndFrameNullPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
+{
+ FillBgTilemapBufferRect(bg, 0, tilemapLeft - 2, tilemapTop - 1, width + 4, height + 2, 0);
+}
+
+void DrawStdFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 baseTileNum, u8 paletteNum)
+{
+ sTileNum = baseTileNum;
+ sPaletteNum = paletteNum;
+ CallWindowFunction(windowId, WindowFunc_DrawStdFrameWithCustomTileAndPalette);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
+ PutWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+// not used
+static void DrawStdFrameWithCustomTile(u8 windowId, bool8 copyToVram, u16 baseTileNum)
+{
+ sTileNum = baseTileNum;
+ sPaletteNum = GetWindowAttribute(windowId, WINDOW_PALETTE_NUM);
+ CallWindowFunction(windowId, WindowFunc_DrawStdFrameWithCustomTileAndPalette);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
+ PutWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+static void WindowFunc_DrawStdFrameWithCustomTileAndPalette(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
+{
+ FillBgTilemapBufferRect(bg, sTileNum, tilemapLeft - 1, tilemapTop - 1, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 1, tilemapLeft, tilemapTop - 1, width, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 2, tilemapLeft + width, tilemapTop - 1, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 3, tilemapLeft - 1, tilemapTop, 1, height, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 5, tilemapLeft + width, tilemapTop, 1, height, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 6, tilemapLeft - 1, tilemapTop + height, 1, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 7, tilemapLeft, tilemapTop + height, width, 1, sPaletteNum);
+ FillBgTilemapBufferRect(bg, sTileNum + 8, tilemapLeft + width, tilemapTop + height, 1, 1, sPaletteNum);
+}
+
+void ClearStdWindowAndFrameToTransparent(u8 windowId, bool8 copyToVram)
+{
+ CallWindowFunction(windowId, WindowFunc_ClearStdWindowAndFrameToTransparent);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(0));
+ ClearWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+static void WindowFunc_ClearStdWindowAndFrameToTransparent(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
+{
+ FillBgTilemapBufferRect(bg, 0, tilemapLeft - 1, tilemapTop - 1, width + 2, height + 2, 0);
+}
+
+/*
+ The following functions are used for handling top bar window
+ in hall of fame screen and story mode screen before oak intro.
+ However, you can still designate a yPos value to place that bar
+ as well as the bar width.
+ The xPos is simply computed according to width (always right aligned).
+*/
+u8 CreateTopBarWindowLoadPalette(u8 bg, u8 width, u8 yPos, u8 palette, u16 baseTile)
+{
+ struct WindowTemplate window;
+
+ memset(&window, 0, sizeof(window));
+ if (bg > 3)
+ window.bg = 0;
+ else
+ window.bg = bg;
+ window.tilemapTop = yPos;
+ window.height = 2;
+ window.tilemapLeft = 0x1E - width;
+ window.width = width;
+ window.paletteNum = palette;
+ window.baseBlock = baseTile;
+ sTopBarWindowId = AddWindow(&window);
+ if (palette > 15)
+ palette = 15 * 16;
+ else
+ palette *= 16;
+ LoadPalette(stdpal_get(2), palette, 0x20);
+ return sTopBarWindowId;
+}
+
+void TopBarWindowPrintString(const u8 *string, u8 unused, bool8 copyToVram)
+{
+ s32 width;
+
+ if (sTopBarWindowId != 0xFF)
+ {
+ PutWindowTilemap(sTopBarWindowId);
+ FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(15));
+ width = GetStringWidth(0, string, 0);
+ AddTextPrinterParameterized3(sTopBarWindowId, 0, -20 - width, 1, &gUnknown_8456618, 0, string);
+ if (copyToVram)
+ CopyWindowToVram(sTopBarWindowId, 3);
+ }
+}
+
+void TopBarWindowPrintTwoStrings(const u8 *string, const u8 *string2, bool8 fgColorChooser, u8 unused, bool8 copyToVram)
+{
+ struct TextColor color;
+ s32 fgColor, width;
+
+ if ( sTopBarWindowId != 0xFF )
+ {
+ if (fgColorChooser)
+ {
+ color.fgColor = 0;
+ color.bgColor = 1;
+ color.shadowColor = 2;
+ }
+ else
+ {
+ color.fgColor = 15;
+ color.bgColor = 1;
+ color.shadowColor = 2;
+ }
+
+ PutWindowTilemap(sTopBarWindowId);
+ FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(15));
+ if (string2)
+ {
+ width = GetStringWidth(0, string2, 0);
+ AddTextPrinterParameterized3(sTopBarWindowId, 0, -20 - width, 1, &color, 0, string2);
+ }
+ AddTextPrinterParameterized4(sTopBarWindowId, 1, 4, 1, 0, 0, &color, 0, string);
+ if (copyToVram)
+ CopyWindowToVram(sTopBarWindowId, 3);
+ }
+}
+
+// not used
+static void CopyTopBarWindowToVram(void)
+{
+ if (sTopBarWindowId != 0xFF)
+ CopyWindowToVram(sTopBarWindowId, 3);
+}
+
+void ClearTopBarWindow(void)
+{
+ if (sTopBarWindowId != 0xFF)
+ {
+ FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(15));
+ CopyWindowToVram(sTopBarWindowId, 3);
+ }
+}
+
+void DestroyTopBarWindow(void)
+{
+ if (sTopBarWindowId != 0xFF)
+ {
+ FillWindowPixelBuffer(sTopBarWindowId, PIXEL_FILL(0));
+ ClearWindowTilemap(sTopBarWindowId);
+ CopyWindowToVram(sTopBarWindowId, 3);
+ RemoveWindow(sTopBarWindowId);
+ sTopBarWindowId = 0xFF;
+ }
+}
+
+u8 Menu_InitCursorInternal(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numChoices, u8 initialCursorPos, bool8 APressMuted)
+{
+ s32 pos;
+
+ sMenu.left = left;
+ sMenu.top = top;
+ sMenu.minCursorPos = 0;
+ sMenu.maxCursorPos = numChoices - 1;
+ sMenu.windowId = windowId;
+ sMenu.fontId = fontId;
+ sMenu.optionHeight = cursorHeight;
+ sMenu.APressMuted = APressMuted;
+ pos = initialCursorPos;
+ if (pos < 0 || pos > sMenu.maxCursorPos)
+ sMenu.cursorPos = 0;
+ else
+ sMenu.cursorPos = pos;
+
+ Menu_MoveCursor(0);
+ return sMenu.cursorPos;
+}
+
+u8 Menu_InitCursor(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numChoices, u8 initialCursorPos)
+{
+ return Menu_InitCursorInternal(windowId, fontId, left, top, cursorHeight, numChoices, initialCursorPos, 0);
+}
+
+// not used
+static u8 sub_810F818(u8 windowId, u8 fontId, u8 left, u8 top, u8 numChoices, u8 initialCursorPos)
+{
+ return Menu_InitCursor(windowId, fontId, left, top, GetMenuCursorDimensionByFont(fontId, 1), numChoices, initialCursorPos);
+}
+
+static void Menu_RedrawCursor(u8 oldPos, u8 newPos)
+{
+ u8 width, height;
+
+ 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);
+}
+
+u8 Menu_MoveCursor(s8 cursorDelta)
+{
+ u8 oldPos = sMenu.cursorPos;
+ s32 newPos = sMenu.cursorPos + cursorDelta;
+
+ if (newPos < sMenu.minCursorPos)
+ sMenu.cursorPos = sMenu.maxCursorPos;
+ else if (newPos > sMenu.maxCursorPos)
+ sMenu.cursorPos = sMenu.minCursorPos;
+ else
+ sMenu.cursorPos += cursorDelta;
+ Menu_RedrawCursor(oldPos, sMenu.cursorPos);
+ return sMenu.cursorPos;
+}
+
+u8 Menu_MoveCursorNoWrapAround(s8 cursorDelta)
+{
+ u8 oldPos = sMenu.cursorPos;
+ s32 newPos = sMenu.cursorPos + cursorDelta;
+
+ if (newPos < sMenu.minCursorPos)
+ sMenu.cursorPos = sMenu.minCursorPos;
+ else if (newPos > sMenu.maxCursorPos)
+ sMenu.cursorPos = sMenu.maxCursorPos;
+ else
+ sMenu.cursorPos += cursorDelta;
+
+ Menu_RedrawCursor(oldPos, sMenu.cursorPos);
+ return sMenu.cursorPos;
+}
+
+u8 Menu_GetCursorPos(void)
+{
+ return sMenu.cursorPos;
+}
+
+s8 Menu_ProcessInput(void)
+{
+ if (JOY_NEW(A_BUTTON))
+ {
+ if (!sMenu.APressMuted)
+ PlaySE(SE_SELECT);
+ return sMenu.cursorPos;
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ return MENU_B_PRESSED;
+ }
+ else if (JOY_NEW(DPAD_UP))
+ {
+ PlaySE(SE_SELECT);
+ Menu_MoveCursor(-1);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (JOY_NEW(DPAD_DOWN))
+ {
+ PlaySE(SE_SELECT);
+ Menu_MoveCursor(1);
+ return MENU_NOTHING_CHOSEN;
+ }
+ return MENU_NOTHING_CHOSEN;
+}
+
+s8 Menu_ProcessInputNoWrapAround(void)
+{
+ u8 oldPos = sMenu.cursorPos;
+
+ if (JOY_NEW(A_BUTTON))
+ {
+ if (!sMenu.APressMuted)
+ PlaySE(SE_SELECT);
+ return sMenu.cursorPos;
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ return MENU_B_PRESSED;
+ }
+ else if (JOY_NEW(DPAD_UP))
+ {
+ if (oldPos != Menu_MoveCursorNoWrapAround(-1))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (JOY_NEW(DPAD_DOWN))
+ {
+ if (oldPos != Menu_MoveCursorNoWrapAround(1))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ return MENU_NOTHING_CHOSEN;
+}
+
+s8 Menu_ProcessInput_other(void)
+{
+ if (JOY_NEW(A_BUTTON))
+ {
+ if (!sMenu.APressMuted)
+ PlaySE(SE_SELECT);
+ return sMenu.cursorPos;
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ return MENU_B_PRESSED;
+ }
+ else if (JOY_REPT(DPAD_ANY) == DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ Menu_MoveCursor(-1);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (JOY_REPT(DPAD_ANY) == DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ Menu_MoveCursor(1);
+ return MENU_NOTHING_CHOSEN;
+ }
+ return MENU_NOTHING_CHOSEN;
+}
+
+s8 Menu_ProcessInputNoWrapAround_other(void)
+{
+ u8 oldPos = sMenu.cursorPos;
+
+ if (JOY_NEW(A_BUTTON))
+ {
+ if (!sMenu.APressMuted)
+ PlaySE(SE_SELECT);
+ return sMenu.cursorPos;
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ return MENU_B_PRESSED;
+ }
+ else if (JOY_REPT(DPAD_ANY) == DPAD_UP)
+ {
+ if (oldPos != Menu_MoveCursorNoWrapAround(-1))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (JOY_REPT(DPAD_ANY) == DPAD_DOWN)
+ {
+ if (oldPos != Menu_MoveCursorNoWrapAround(1))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ return MENU_NOTHING_CHOSEN;
+}
+
+void PrintTextArray(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs)
+{
+ u8 i;
+
+ for (i = 0; i < itemCount; i++)
+ AddTextPrinterParameterized(windowId, fontId, strs[i].text, left, (lineHeight * i) + top, 0xFF, NULL);
+ CopyWindowToVram(windowId, 2);
+}
+
+void MultichoiceList_PrintItems(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, u8 letterSpacing, u8 lineSpacing)
+{
+ u8 i;
+
+ for (i = 0; i < itemCount; i++)
+ AddTextPrinterParameterized5(windowId, fontId, strs[i].text, left, (lineHeight * i) + top, 0xFF, NULL, letterSpacing, lineSpacing);
+ CopyWindowToVram(windowId, 2);
+}
+
+void UnionRoomAndTradeMenuPrintOptions(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *strs)
+{
+ u8 left = GetMenuCursorDimensionByFont(fontId, 0);
+
+ PrintTextArray(windowId, fontId, left, 0, lineHeight, itemCount, strs);
+}
+
+void AddItemMenuActionTextPrinters(u8 windowId, u8 fontId, u8 left, u8 top, u8 letterSpacing, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, const u8 *orderArray)
+{
+ u8 i;
+ struct TextPrinterTemplate printer;
+
+ printer.windowId = windowId;
+ printer.fontId = fontId;
+ printer.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND);
+ printer.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND);
+ printer.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW);
+ printer.unk = GetFontAttribute(fontId, FONTATTR_UNKNOWN);
+ printer.letterSpacing = letterSpacing;
+ printer.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING);
+ printer.x = left;
+ printer.currentX = left;
+ for (i = 0; i < itemCount; i++)
+ {
+ printer.currentChar = strs[orderArray[i]].text;
+ printer.y = (lineHeight * i) + top;
+ printer.currentY = printer.y;
+ AddTextPrinter(&printer, 0xFF, NULL);
+ }
+ CopyWindowToVram(windowId, 2);
+}
+
+// not used
+static void sub_810FDE4(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, const u8 *orderArray)
+{
+ AddItemMenuActionTextPrinters(windowId, fontId, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH), 0, GetFontAttribute(fontId, FONTATTR_LETTER_SPACING), lineHeight, itemCount, strs, orderArray);
+}
+
+struct WindowTemplate SetWindowTemplateFields(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock)
+{
+ struct WindowTemplate template;
+
+ template.bg = bg;
+ template.tilemapLeft = left;
+ template.tilemapTop = top;
+ template.width = width;
+ template.height = height;
+ template.paletteNum = paletteNum;
+ template.baseBlock = baseBlock;
+ return template;
+}
+
+// not used
+static u16 CreateWindowTemplate(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock)
+{
+ struct WindowTemplate template = SetWindowTemplateFields(bg, left, top, width, height, paletteNum, baseBlock);
+ return AddWindow(&template);
+}
+
+void CreateYesNoMenu(const struct WindowTemplate *window, u8 fontId, u8 left, u8 top, u16 baseTileNum, u8 paletteNum, u8 initialCursorPos)
+{
+ struct TextPrinterTemplate textSubPrinter;
+
+ sYesNoWindowId = AddWindow(window);
+ DrawStdFrameWithCustomTileAndPalette(sYesNoWindowId, 1, baseTileNum, paletteNum);
+ textSubPrinter.currentChar = gUnknown_841623D;
+ textSubPrinter.windowId = sYesNoWindowId;
+ textSubPrinter.fontId = fontId;
+ textSubPrinter.x = GetMenuCursorDimensionByFont(fontId, 0) + left;
+ textSubPrinter.y = top;
+ textSubPrinter.currentX = textSubPrinter.x;
+ textSubPrinter.currentY = textSubPrinter.y;
+ textSubPrinter.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND);
+ textSubPrinter.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND);
+ textSubPrinter.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW);
+ textSubPrinter.unk = GetFontAttribute(fontId, FONTATTR_UNKNOWN);
+ textSubPrinter.letterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING);
+ textSubPrinter.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING);
+ AddTextPrinter(&textSubPrinter, 0xFF, NULL);
+ Menu_InitCursor(sYesNoWindowId, fontId, left, top, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT) + textSubPrinter.lineSpacing, 2, initialCursorPos);
+}
+
+// not used
+static void CreateYesNoMenu2(const struct WindowTemplate *window, u8 paletteNum, u16 baseTileNum, u8 initialCursorPos)
+{
+ CreateYesNoMenu(window, paletteNum, 0, 0, baseTileNum, initialCursorPos, 0);
+}
+
+s8 Menu_ProcessInputNoWrapClearOnChoose(void)
+{
+ s8 result = Menu_ProcessInputNoWrapAround();
+ if (result != MENU_NOTHING_CHOSEN)
+ DestroyYesNoMenu();
+ return result;
+}
+
+void DestroyYesNoMenu(void)
+{
+ ClearStdWindowAndFrameToTransparent(sYesNoWindowId, TRUE);
+ RemoveWindow(sYesNoWindowId);
+}
+
+void MultichoiceGrid_PrintItems(u8 windowId, u8 fontId, u8 itemWidth, u8 itemHeight, u8 cols, u8 rows, const struct MenuAction *strs)
+{
+ u8 width, i, j, yOffset;
+
+ fontId = fontId;
+ itemWidth = itemWidth;
+ itemHeight = itemHeight;
+ width = GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH);
+ yOffset = (16 - GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT)) / 2;
+ for (i = 0; i < rows; ++i)
+ for (j = 0; j < cols; ++j)
+ AddTextPrinterParameterized(windowId, fontId, strs[i * cols + j].text, itemWidth * j + width, yOffset + itemHeight * i, 0xFF, 0);
+ CopyWindowToVram(windowId, 2);
+}
+
+//not used
+static void MultichoiceGrid_PrintItemsCustomOrder(u8 windowId, u8 fontId, u8 itemWidth, u8 itemHeight, u8 cols, u8 rows, const struct MenuAction *strs, const u8 *orderArray)
+{
+ u8 width, i, j;
+
+ fontId = fontId;
+ itemWidth = itemWidth;
+ itemHeight = itemHeight;
+ width = GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH);
+ for (i = 0; i < rows; ++i)
+ for (j = 0; j < cols; ++j)
+ AddTextPrinterParameterized(windowId, fontId, strs[orderArray[i * cols + j]].text, itemWidth * j + width, itemHeight * i, 0xFF, 0);
+ CopyWindowToVram(windowId, 2);
+}
+
+static u8 MultichoiceGrid_InitCursorInternal(u8 windowId, u8 fontId, u8 left, u8 top, u8 optionWidth, u8 cursorHeight, u8 cols, u8 rows, u8 numChoices, u8 cursorPos)
+{
+ s32 pos;
+
+ sMenu.left = left;
+ sMenu.top = top;
+ sMenu.minCursorPos = 0;
+ sMenu.maxCursorPos = numChoices - 1;
+ sMenu.windowId = windowId;
+ sMenu.fontId = fontId;
+ sMenu.optionWidth = optionWidth;
+ sMenu.optionHeight = cursorHeight;
+ sMenu.columns = cols;
+ sMenu.rows = rows;
+ pos = cursorPos;
+ if (pos < 0 || pos > sMenu.maxCursorPos)
+ sMenu.cursorPos = 0;
+ else
+ sMenu.cursorPos = pos;
+ MultichoiceGrid_MoveCursor(0, 0);
+ return sMenu.cursorPos;
+}
+
+u8 MultichoiceGrid_InitCursor(u8 windowId, u8 fontId, u8 left, u8 top, u8 optionWidth, u8 cols, u8 rows, u8 cursorPos)
+{
+ s32 cursorHeight = 16;
+ u8 numChoices = cols * rows;
+
+ return MultichoiceGrid_InitCursorInternal(windowId, fontId, left, top, optionWidth, cursorHeight, cols, rows, numChoices, cursorPos);
+}
+
+static void MultichoiceGrid_RedrawCursor(u8 oldCursorPos, u8 newCursorPos)
+{
+ u8 cursorWidth = GetMenuCursorDimensionByFont(sMenu.fontId, 0);
+ u8 cursorHeight = GetMenuCursorDimensionByFont(sMenu.fontId, 1);
+ u8 xPos = (oldCursorPos % sMenu.columns) * sMenu.optionWidth + sMenu.left;
+ u8 yPos = (oldCursorPos / sMenu.columns) * sMenu.optionHeight + sMenu.top;
+
+ 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);
+}
+
+static u8 MultichoiceGrid_MoveCursor(s8 deltaX, s8 deltaY)
+{
+ u8 oldPos = sMenu.cursorPos;
+
+ if (deltaX)
+ {
+ if ((sMenu.cursorPos % sMenu.columns) + deltaX < 0)
+ sMenu.cursorPos += sMenu.columns - 1;
+ else if ((sMenu.cursorPos % sMenu.columns) + deltaX >= sMenu.columns)
+ sMenu.cursorPos = (sMenu.cursorPos / sMenu.columns) * sMenu.columns;
+ else
+ sMenu.cursorPos += deltaX;
+ }
+ if (deltaY)
+ {
+ if ((sMenu.cursorPos / sMenu.columns) + deltaY < 0)
+ sMenu.cursorPos += sMenu.columns * (sMenu.rows - 1);
+ else if ((sMenu.cursorPos / sMenu.columns) + deltaY >= sMenu.rows)
+ sMenu.cursorPos -= sMenu.columns * (sMenu.rows - 1);
+ else
+ sMenu.cursorPos += (sMenu.columns * deltaY);
+ }
+ if (sMenu.cursorPos > sMenu.maxCursorPos)
+ {
+ sMenu.cursorPos = oldPos;
+ return sMenu.cursorPos;
+ }
+ else
+ {
+ MultichoiceGrid_RedrawCursor(oldPos, sMenu.cursorPos);
+ return sMenu.cursorPos;
+ }
+}
+
+static u8 MultichoiceGrid_MoveCursorIfValid(s8 deltaX, s8 deltaY)
+{
+ u8 oldPos = sMenu.cursorPos;
+
+ if (deltaX)
+ {
+ if (((sMenu.cursorPos % sMenu.columns) + deltaX >= 0) && ((sMenu.cursorPos % sMenu.columns) + deltaX < sMenu.columns))
+ sMenu.cursorPos += deltaX;
+ }
+ if (deltaY)
+ {
+ if (((sMenu.cursorPos / sMenu.columns) + deltaY >= 0) && ((sMenu.cursorPos / sMenu.columns) + deltaY < sMenu.rows))
+ sMenu.cursorPos += (sMenu.columns * deltaY);
+ }
+ if (sMenu.cursorPos > sMenu.maxCursorPos)
+ {
+ sMenu.cursorPos = oldPos;
+ return sMenu.cursorPos;
+ }
+ else
+ {
+ MultichoiceGrid_RedrawCursor(oldPos, sMenu.cursorPos);
+ return sMenu.cursorPos;
+ }
+}
+
+// not used
+static s8 sub_81105A0(void)
+{
+ if (JOY_NEW(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ return sMenu.cursorPos;
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ return MENU_B_PRESSED;
+ }
+ else if (JOY_NEW(DPAD_UP))
+ {
+ PlaySE(SE_SELECT);
+ MultichoiceGrid_MoveCursor(0, -1);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (JOY_NEW(DPAD_DOWN))
+ {
+ PlaySE(SE_SELECT);
+ MultichoiceGrid_MoveCursor(0, 1);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (JOY_NEW(DPAD_LEFT) || GetLRKeysState() == 1)
+ {
+ PlaySE(SE_SELECT);
+ MultichoiceGrid_MoveCursor(-1, 0);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (JOY_NEW(DPAD_RIGHT) || GetLRKeysState() == 2)
+ {
+ PlaySE(SE_SELECT);
+ MultichoiceGrid_MoveCursor(1, 0);
+ return MENU_NOTHING_CHOSEN;
+ }
+ return MENU_NOTHING_CHOSEN;
+}
+
+s8 Menu_ProcessInputGridLayout(void)
+{
+ u8 oldPos = sMenu.cursorPos;
+
+ if (JOY_NEW(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ return sMenu.cursorPos;
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ return MENU_B_PRESSED;
+ }
+ else if (JOY_NEW(DPAD_UP))
+ {
+ if (oldPos != MultichoiceGrid_MoveCursorIfValid(0, -1))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (JOY_NEW(DPAD_DOWN))
+ {
+ if (oldPos != MultichoiceGrid_MoveCursorIfValid(0, 1))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (JOY_NEW(DPAD_LEFT) || GetLRKeysState() == 1)
+ {
+ if (oldPos != MultichoiceGrid_MoveCursorIfValid(-1, 0))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (JOY_NEW(DPAD_RIGHT) || GetLRKeysState() == 2)
+ {
+ if (oldPos != MultichoiceGrid_MoveCursorIfValid(1, 0))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ return MENU_NOTHING_CHOSEN;
+}
+
+// not used
+static s8 sub_81106F4(void)
+{
+ if (JOY_NEW(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ return sMenu.cursorPos;
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ return MENU_B_PRESSED;
+ }
+ else if (JOY_REPT(DPAD_ANY) == DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ MultichoiceGrid_MoveCursor(0, -1);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (JOY_REPT(DPAD_ANY) == DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ MultichoiceGrid_MoveCursor(0, 1);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (JOY_REPT(DPAD_ANY) == DPAD_LEFT || sub_80BF66C() == 1)
+ {
+ PlaySE(SE_SELECT);
+ MultichoiceGrid_MoveCursor(-1, 0);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (JOY_REPT(DPAD_ANY) == DPAD_RIGHT || sub_80BF66C() == 2)
+ {
+ PlaySE(SE_SELECT);
+ MultichoiceGrid_MoveCursor(1, 0);
+ return MENU_NOTHING_CHOSEN;
+ }
+
+ return MENU_NOTHING_CHOSEN;
+}
+
+// not used
+static s8 sub_81107A0(void)
+{
+ u8 oldPos = sMenu.cursorPos;
+
+ if (JOY_NEW(A_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ return sMenu.cursorPos;
+ }
+ else if (JOY_NEW(B_BUTTON))
+ {
+ return MENU_B_PRESSED;
+ }
+ else if (JOY_REPT(DPAD_ANY) == DPAD_UP)
+ {
+ if (oldPos != MultichoiceGrid_MoveCursorIfValid(0, -1))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (JOY_REPT(DPAD_ANY) == DPAD_DOWN)
+ {
+ if (oldPos != MultichoiceGrid_MoveCursorIfValid(0, 1))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (JOY_REPT(DPAD_ANY) == DPAD_LEFT || sub_80BF66C() == 1)
+ {
+ if (oldPos != MultichoiceGrid_MoveCursorIfValid(-1, 0))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (JOY_REPT(DPAD_ANY) == DPAD_RIGHT || sub_80BF66C() == 2)
+ {
+ if (oldPos != MultichoiceGrid_MoveCursorIfValid(1, 0))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ return MENU_NOTHING_CHOSEN;
+}
diff --git a/src/menu2.c b/src/menu2.c
index 0676fc75e..6a3668cfa 100644
--- a/src/menu2.c
+++ b/src/menu2.c
@@ -424,7 +424,7 @@ static const u8 gUnknown_845FD54[][5] = {
[SPECIES_OLD_UNOWN_QMARK - 1] = {0x20, 0x23, 0x08, 0x20, 0x2d}
};
-void box_print(u8 windowId, u8 fontId, u8 x, u8 y, const struct TextColor * color, s8 speed, const u8 * str)
+void AddTextPrinterParameterized3(u8 windowId, u8 fontId, u8 x, u8 y, const struct TextColor * color, s8 speed, const u8 * str)
{
struct TextPrinterTemplate printer;
@@ -444,7 +444,7 @@ void box_print(u8 windowId, u8 fontId, u8 x, u8 y, const struct TextColor * colo
AddTextPrinter(&printer, speed, NULL);
}
-void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, const struct TextColor *color, s8 speed, const u8 *str)
+void AddTextPrinterParameterized4(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, const struct TextColor *color, s8 speed, const u8 *str)
{
struct TextPrinterTemplate printer;
@@ -464,7 +464,7 @@ void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSp
AddTextPrinter(&printer, speed, NULL);
}
-void sub_812E62C(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 letterSpacing, u8 lineSpacing)
+void AddTextPrinterParameterized5(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 letterSpacing, u8 lineSpacing)
{
struct TextPrinterTemplate printer;
@@ -498,13 +498,13 @@ void sub_812E6DC(u8 windowId, const u8 * src, u16 x, u16 y)
}
else
{
- sub_812E62C(windowId, 2, gStringVar4, x, y, 0xFF, NULL, 0, 0);
+ AddTextPrinterParameterized5(windowId, 2, gStringVar4, x, y, 0xFF, NULL, 0, 0);
}
}
// Yeah, no, I'm not bothering with this
NAKED
-void sub_819A080(void * a0, void * a1, u16 a2, u16 a3, u16 a4, u16 a5, u16 a6, u16 a7)
+static void sub_812E768(void * a0, void * a1, u16 a2, u16 a3, u16 a4, u16 a5, u16 a6, u16 a7)
{
asm_unified("\tpush {r4-r7,lr}\n"
"\tmov r7, r10\n"
@@ -820,7 +820,7 @@ u8 sub_812EA78(u16 species, u32 personality, u8 a2)
{
if (species == SPECIES_UNOWN)
{
- u8 unownLetter = GetUnownLetterByPersonality(personality);
+ u8 unownLetter = GetUnownLetterByPersonalityLoByte(personality);
switch (unownLetter)
{
case 0:
diff --git a/src/menu_helpers.c b/src/menu_helpers.c
new file mode 100644
index 000000000..fdcb9a56e
--- /dev/null
+++ b/src/menu_helpers.c
@@ -0,0 +1,251 @@
+#include "global.h"
+#include "task.h"
+#include "bg.h"
+#include "gpu_regs.h"
+#include "window.h"
+#include "menu.h"
+#include "menu_helpers.h"
+#include "new_menu_helpers.h"
+#include "string_util.h"
+#include "text.h"
+#include "sound.h"
+#include "link.h"
+#include "overworld.h"
+#include "mail_data.h"
+#include "field_specials.h"
+#include "constants/songs.h"
+#include "constants/items.h"
+
+static EWRAM_DATA const struct YesNoFuncTable *gUnknown_20399C8 = NULL;
+static EWRAM_DATA TaskFunc gUnknown_20399CC = NULL;
+static EWRAM_DATA u8 gUnknown_20399D0 = {0};
+
+static void Task_ContinueTaskAfterMessagePrints(u8 taskId);
+
+void DisplayMessageAndContinueTask(u8 taskId, u8 windowId, u16 tileNum, u8 paletteNum, u8 fontId, u8 textSpeed, const u8 *string, void *taskFunc)
+{
+ gUnknown_20399D0 = windowId;
+ DrawDialogFrameWithCustomTileAndPalette(windowId, TRUE, tileNum, paletteNum);
+
+ if (string != gStringVar4)
+ StringExpandPlaceholders(gStringVar4, string);
+
+ gTextFlags.canABSpeedUpPrint = 1;
+ AddTextPrinterParameterized2(windowId, fontId, gStringVar4, textSpeed, NULL, 2, 1, 3);
+ gUnknown_20399CC = taskFunc;
+ gTasks[taskId].func = Task_ContinueTaskAfterMessagePrints;
+}
+
+bool16 RunTextPrinters_CheckActive(u8 textPrinterId)
+{
+ RunTextPrinters();
+ return IsTextPrinterActive(textPrinterId);
+}
+
+static void Task_ContinueTaskAfterMessagePrints(u8 taskId)
+{
+ if (!RunTextPrinters_CheckActive(gUnknown_20399D0))
+ gUnknown_20399CC(taskId);
+}
+
+static void Task_CallYesOrNoCallback(u8 taskId)
+{
+ switch (Menu_ProcessInputNoWrapClearOnChoose())
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ gTasks[taskId].func = gUnknown_20399C8->yesFunc;
+ break;
+ case 1:
+ case MENU_B_PRESSED:
+ PlaySE(SE_SELECT);
+ gTasks[taskId].func = gUnknown_20399C8->noFunc;
+ break;
+ }
+}
+
+void CreateYesNoMenuWithCallbacks(u8 taskId, const struct WindowTemplate *template, u8 fontId, u8 left, u8 top, u16 tileStart, u8 palette, const struct YesNoFuncTable *yesNo)
+{
+ CreateYesNoMenu(template, fontId, left, top, tileStart, palette, 0);
+ gUnknown_20399C8 = yesNo;
+ gTasks[taskId].func = Task_CallYesOrNoCallback;
+}
+
+u8 GetLRKeysState(void)
+{
+ if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
+ {
+ if (JOY_NEW(L_BUTTON))
+ return 1;
+ if (JOY_NEW(R_BUTTON))
+ return 2;
+ }
+ return 0;
+}
+
+u8 sub_80BF66C(void)
+{
+ if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
+ {
+ if (JOY_REPT(L_BUTTON))
+ return 1;
+ if (JOY_REPT(R_BUTTON))
+ return 2;
+ }
+ return 0;
+}
+
+bool8 sub_80BF6A8(u16 itemId)
+{
+ if (itemId != ITEM_ENIGMA_BERRY)
+ return TRUE;
+ else if (!gSaveBlock1Ptr->location.mapGroup && gSaveBlock1Ptr->location.mapNum == 1)
+ return FALSE;
+ else if (InUnionRoom() != TRUE)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 itemid_80BF6D8_mail_related(u16 itemId)
+{
+ if (IsUpdateLinkStateCBActive() != TRUE && InUnionRoom() != TRUE)
+ return TRUE;
+ else if (ItemIsMail(itemId) != TRUE)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 MenuHelpers_LinkSomething(void)
+{
+ if (IsUpdateLinkStateCBActive() == TRUE || gReceivedRemoteLinkPlayers == 1)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 sub_80BF72C(void)
+{
+ if (!MenuHelpers_LinkSomething())
+ return FALSE;
+ else
+ return sub_8058244();
+}
+
+bool8 sub_80BF748(void)
+{
+ if (sub_80BF72C() == TRUE)
+ return TRUE;
+ else if (sub_800B270() != TRUE)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void SetVBlankHBlankCallbacksToNull(void)
+{
+ SetVBlankCallback(NULL);
+ SetHBlankCallback(NULL);
+}
+
+void ClearVramOamPltt(void)
+{
+ ResetAllBgsCoordinatesAndBgCntRegs();
+ CpuFill16(0, (void*) VRAM, VRAM_SIZE);
+ CpuFill32(0, (void*) OAM, OAM_SIZE);
+ CpuFill16(0, (void*) PLTT, PLTT_SIZE);
+}
+
+void ResetAllBgsCoordinatesAndBgCntRegs(void)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BG3CNT, 0);
+ SetGpuReg(REG_OFFSET_BG2CNT, 0);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0);
+ 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);
+}
+
+bool8 AdjustQuantityAccordingToDPadInput(s16 *arg0, u16 arg1)
+{
+ s16 valBefore = (*arg0);
+
+ if (JOY_REPT(DPAD_ANY) == DPAD_UP)
+ {
+ (*arg0)++;
+ if ((*arg0) > arg1)
+ (*arg0) = 1;
+
+ if ((*arg0) == valBefore)
+ {
+ return FALSE;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ return TRUE;
+ }
+ }
+ else if (JOY_REPT(DPAD_ANY) == DPAD_DOWN)
+ {
+ (*arg0)--;
+ if ((*arg0) <= 0)
+ (*arg0) = arg1;
+ if ((*arg0) == valBefore)
+ {
+ return FALSE;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ return TRUE;
+ }
+ }
+ else if (JOY_REPT(DPAD_ANY) == DPAD_RIGHT)
+ {
+ (*arg0) += 10;
+ if ((*arg0) > arg1)
+ (*arg0) = arg1;
+ if ((*arg0) == valBefore)
+ {
+ return FALSE;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ return TRUE;
+ }
+ }
+ else if (JOY_REPT(DPAD_ANY) == DPAD_LEFT)
+ {
+ (*arg0) -= 10;
+ if ((*arg0) <= 0)
+ (*arg0) = 1;
+ if ((*arg0) == valBefore)
+ {
+ return FALSE;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+u8 sub_80BF8E4(void)
+{
+ if (!ContextNpcGetTextColor())
+ return 4;
+ else
+ return 5;
+}
diff --git a/src/menu_indicators.c b/src/menu_indicators.c
new file mode 100644
index 000000000..1d6589fb0
--- /dev/null
+++ b/src/menu_indicators.c
@@ -0,0 +1,659 @@
+#include "global.h"
+#include "malloc.h"
+#include "task.h"
+#include "decompress.h"
+#include "palette.h"
+#include "strings.h"
+#include "sprite.h"
+#include "trig.h"
+#include "list_menu.h"
+#include "menu_indicators.h"
+
+struct ScrollIndicatorPair
+{
+ u8 field_0;
+ u16 *scrollOffset;
+ u16 fullyUpThreshold;
+ u16 fullyDownThreshold;
+ u8 topSpriteId;
+ u8 bottomSpriteId;
+ u16 tileTag;
+ u16 palTag;
+};
+
+struct RedOutlineCursor
+{
+ struct SubspriteTable subspriteTable;
+ struct Subsprite *subspritesPtr;
+ u8 spriteId;
+ u16 tileTag;
+ u16 palTag;
+};
+
+struct RedArrowCursor
+{
+ u8 spriteId;
+ u16 tileTag;
+ u16 palTag;
+};
+
+struct ScrollIndicatorTemplate
+{
+ u8 animNum:4;
+ u8 bounceDir:4;
+ u8 multiplier;
+ s16 frequency;
+};
+
+static EWRAM_DATA struct ScrollArrowsTemplate sTempScrollArrowTemplate = {0};
+
+static void SpriteCallback_ScrollIndicatorArrow(struct Sprite *sprite);
+static void SpriteCallback_RedArrowCursor(struct Sprite *sprite);
+static void Task_ScrollIndicatorArrowPair(u8 taskId);
+static u8 ListMenuAddRedArrowCursorObject(struct CursorStruct *cursor);
+static void ListMenuUpdateRedArrowCursorObject(u8 taskId, u16 x, u16 y);
+static void ListMenuRemoveRedArrowCursorObject(u8 taskId);
+
+static const struct ScrollIndicatorTemplate sScrollIndicatorTemplates[] =
+{
+ {
+ .animNum = 0,
+ .bounceDir = 0,
+ .multiplier = 2,
+ .frequency = 8,
+ },
+ {
+ .animNum = 1,
+ .bounceDir = 0,
+ .multiplier = 2,
+ .frequency = -8,
+ },
+ {
+ .animNum = 2,
+ .bounceDir = 1,
+ .multiplier = 2,
+ .frequency = 8,
+ },
+ {
+ .animNum = 3,
+ .bounceDir = 1,
+ .multiplier = 2,
+ .frequency = -8,
+ },
+};
+
+static const struct OamData sOamData_ScrollArrowIndicator =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = SPRITE_SHAPE(16x16),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(16x16),
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd sSpriteAnim_ScrollArrowIndicator0[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_ScrollArrowIndicator1[] =
+{
+ ANIMCMD_FRAME(0, 30, 1, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_ScrollArrowIndicator2[] =
+{
+ ANIMCMD_FRAME(4, 30),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_ScrollArrowIndicator3[] =
+{
+ ANIMCMD_FRAME(4, 30, 0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSpriteAnimTable_ScrollArrowIndicator[] =
+{
+ sSpriteAnim_ScrollArrowIndicator0,
+ sSpriteAnim_ScrollArrowIndicator1,
+ sSpriteAnim_ScrollArrowIndicator2,
+ sSpriteAnim_ScrollArrowIndicator3,
+};
+
+static const struct SpriteTemplate sSpriteTemplate_ScrollArrowIndicator =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &sOamData_ScrollArrowIndicator,
+ .anims = sSpriteAnimTable_ScrollArrowIndicator,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallback_ScrollIndicatorArrow,
+};
+
+static const struct Subsprite sSubsprite_RedOutline1 =
+{
+ .x = 0,
+ .y = 0,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 0,
+ .priority = 0,
+};
+
+static const struct Subsprite sSubsprite_RedOutline2 =
+{
+ .x = 0,
+ .y = 0,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 1,
+ .priority = 0,
+};
+
+static const struct Subsprite sSubsprite_RedOutline3 =
+{
+ .x = 0,
+ .y = 0,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 2,
+ .priority = 0,
+};
+
+static const struct Subsprite sSubsprite_RedOutline4 =
+{
+ .x = 0,
+ .y = 0,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 3,
+ .priority = 0,
+};
+
+static const struct Subsprite sSubsprite_RedOutline5 =
+{
+ .x = 0,
+ .y = 0,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 4,
+ .priority = 0,
+};
+
+static const struct Subsprite sSubsprite_RedOutline6 =
+{
+ .x = 0,
+ .y = 0,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 5,
+ .priority = 0,
+};
+
+static const struct Subsprite sSubsprite_RedOutline7 =
+{
+ .x = 0,
+ .y = 0,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 6,
+ .priority = 0,
+};
+
+static const struct Subsprite sSubsprite_RedOutline8 =
+{
+ .x = 0,
+ .y = 0,
+ .shape = SPRITE_SHAPE(8x8),
+ .size = SPRITE_SIZE(8x8),
+ .tileOffset = 7,
+ .priority = 0,
+};
+
+static const struct OamData sOamData_RedArrowCursor =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = SPRITE_SHAPE(16x16),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(16x16),
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd sSpriteAnim_RedArrowCursor[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSpriteAnimTable_RedArrowCursor[] = { sSpriteAnim_RedArrowCursor };
+
+static const struct SpriteTemplate sSpriteTemplate_RedArrowCursor =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &sOamData_RedArrowCursor,
+ .anims = sSpriteAnimTable_RedArrowCursor,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallback_RedArrowCursor,
+};
+
+static const u16 sRedArrowPal[] = INCBIN_U16("graphics/interface/red_arrow.gbapal");
+static const u32 sRedArrowOtherGfx[] = INCBIN_U32("graphics/interface/red_arrow_other.4bpp.lz");
+static const u32 sSelectorOutlineGfx[] = INCBIN_U32("graphics/interface/selector_outline.4bpp.lz");
+static const u32 sRedArrowGfx[] = INCBIN_U32("graphics/interface/red_arrow.4bpp.lz");
+
+#define tState data[0]
+#define tAnimNum data[1]
+#define tBounceDir data[2]
+#define tMultiplier data[3]
+#define tFrequency data[4]
+#define tSinePos data[5]
+
+static void SpriteCallback_ScrollIndicatorArrow(struct Sprite *sprite)
+{
+ s32 multiplier;
+
+ switch (sprite->tState)
+ {
+ case 0:
+ StartSpriteAnim(sprite, sprite->tAnimNum);
+ sprite->tState++;
+ break;
+ case 1:
+ switch (sprite->tBounceDir)
+ {
+ case 0:
+ multiplier = sprite->tMultiplier;
+ sprite->pos2.x = (gSineTable[(u8)(sprite->tSinePos)] * multiplier) / 256;
+ break;
+ case 1:
+ multiplier = sprite->tMultiplier;
+ sprite->pos2.y = (gSineTable[(u8)(sprite->tSinePos)] * multiplier) / 256;
+ break;
+ }
+ sprite->tSinePos += sprite->tFrequency;
+ break;
+ }
+}
+
+static u8 AddScrollIndicatorArrowObject(u8 arrowDir, u8 x, u8 y, u16 tileTag, u16 palTag)
+{
+ u8 spriteId;
+ struct SpriteTemplate spriteTemplate;
+
+ spriteTemplate = sSpriteTemplate_ScrollArrowIndicator;
+ spriteTemplate.tileTag = tileTag;
+ spriteTemplate.paletteTag = palTag;
+ spriteId = CreateSprite(&spriteTemplate, x, y, 0);
+ gSprites[spriteId].invisible = TRUE;
+ gSprites[spriteId].tState = 0;
+ gSprites[spriteId].tAnimNum = sScrollIndicatorTemplates[arrowDir].animNum;
+ gSprites[spriteId].tBounceDir = sScrollIndicatorTemplates[arrowDir].bounceDir;
+ gSprites[spriteId].tMultiplier = sScrollIndicatorTemplates[arrowDir].multiplier;
+ gSprites[spriteId].tFrequency = sScrollIndicatorTemplates[arrowDir].frequency;
+ gSprites[spriteId].tSinePos = 0;
+ return spriteId;
+}
+
+#undef tState
+#undef tAnimNum
+#undef tBounceDir
+#undef tMultiplier
+#undef tFrequency
+#undef tSinePos
+
+u8 AddScrollIndicatorArrowPair(const struct ScrollArrowsTemplate *arrowInfo, u16 *scrollOffset)
+{
+ struct CompressedSpriteSheet spriteSheet;
+ struct SpritePalette spritePal;
+ struct ScrollIndicatorPair *data;
+ u8 taskId;
+
+ spriteSheet.data = sRedArrowOtherGfx;
+ spriteSheet.size = 0x100;
+ spriteSheet.tag = arrowInfo->tileTag;
+ LoadCompressedSpriteSheet(&spriteSheet);
+ if (arrowInfo->palTag == SPRITE_INVALID_TAG)
+ {
+ LoadPalette(sRedArrowPal, (16 * arrowInfo->palNum) + 0x100, 0x20);
+ }
+ else
+ {
+ spritePal.data = sRedArrowPal;
+ spritePal.tag = arrowInfo->palTag;
+ LoadSpritePalette(&spritePal);
+ }
+ taskId = CreateTask(Task_ScrollIndicatorArrowPair, 0);
+ data = (struct ScrollIndicatorPair *)gTasks[taskId].data;
+
+ data->field_0 = 0;
+ data->scrollOffset = scrollOffset;
+ data->fullyUpThreshold = arrowInfo->fullyUpThreshold;
+ data->fullyDownThreshold = arrowInfo->fullyDownThreshold;
+ data->tileTag = arrowInfo->tileTag;
+ data->palTag = arrowInfo->palTag;
+ data->topSpriteId = AddScrollIndicatorArrowObject(arrowInfo->firstArrowType, arrowInfo->firstX, arrowInfo->firstY, arrowInfo->tileTag, arrowInfo->palTag);
+ data->bottomSpriteId = AddScrollIndicatorArrowObject(arrowInfo->secondArrowType, arrowInfo->secondX, arrowInfo->secondY, arrowInfo->tileTag, arrowInfo->palTag);
+
+ if (arrowInfo->palTag == SPRITE_INVALID_TAG)
+ {
+ gSprites[data->topSpriteId].oam.paletteNum = arrowInfo->palNum;
+ gSprites[data->bottomSpriteId].oam.paletteNum = arrowInfo->palNum;
+ }
+ return taskId;
+}
+
+u8 AddScrollIndicatorArrowPairParameterized(u32 arrowType, s32 commonPos, s32 firstPos, s32 secondPos, s32 fullyDownThreshold, s32 tileTag, s32 palTag, u16 *scrollOffset)
+{
+ if (arrowType == SCROLL_ARROW_UP || arrowType == SCROLL_ARROW_DOWN)
+ {
+ sTempScrollArrowTemplate.firstArrowType = SCROLL_ARROW_UP;
+ sTempScrollArrowTemplate.firstX = commonPos;
+ sTempScrollArrowTemplate.firstY = firstPos;
+ sTempScrollArrowTemplate.secondArrowType = SCROLL_ARROW_DOWN;
+ sTempScrollArrowTemplate.secondX = commonPos;
+ sTempScrollArrowTemplate.secondY = secondPos;
+ }
+ else
+ {
+ sTempScrollArrowTemplate.firstArrowType = SCROLL_ARROW_LEFT;
+ sTempScrollArrowTemplate.firstX = firstPos;
+ sTempScrollArrowTemplate.firstY = commonPos;
+ sTempScrollArrowTemplate.secondArrowType = SCROLL_ARROW_RIGHT;
+ sTempScrollArrowTemplate.secondX = secondPos;
+ sTempScrollArrowTemplate.secondY = commonPos;
+ }
+ sTempScrollArrowTemplate.fullyUpThreshold = 0;
+ sTempScrollArrowTemplate.fullyDownThreshold = fullyDownThreshold;
+ sTempScrollArrowTemplate.tileTag = tileTag;
+ sTempScrollArrowTemplate.palTag = palTag;
+ sTempScrollArrowTemplate.palNum = 0;
+
+ return AddScrollIndicatorArrowPair(&sTempScrollArrowTemplate, scrollOffset);
+}
+
+static void Task_ScrollIndicatorArrowPair(u8 taskId)
+{
+ struct ScrollIndicatorPair *data = (struct ScrollIndicatorPair *)gTasks[taskId].data;
+ u16 currItem = (*data->scrollOffset);
+
+ if (currItem == data->fullyUpThreshold)
+ gSprites[data->topSpriteId].invisible = TRUE;
+ else
+ gSprites[data->topSpriteId].invisible = FALSE;
+
+ if (currItem == data->fullyDownThreshold)
+ gSprites[data->bottomSpriteId].invisible = TRUE;
+ else
+ gSprites[data->bottomSpriteId].invisible = FALSE;
+}
+
+void RemoveScrollIndicatorArrowPair(u8 taskId)
+{
+ struct ScrollIndicatorPair *data = (struct ScrollIndicatorPair *)gTasks[taskId].data;
+
+ if (data->tileTag != SPRITE_INVALID_TAG)
+ FreeSpriteTilesByTag(data->tileTag);
+ if (data->palTag != SPRITE_INVALID_TAG)
+ FreeSpritePaletteByTag(data->palTag);
+ DestroySprite(&gSprites[data->topSpriteId]);
+ DestroySprite(&gSprites[data->bottomSpriteId]);
+ DestroyTask(taskId);
+}
+
+u8 ListMenuAddCursorObjectInternal(struct CursorStruct *cursor, u32 cursorKind)
+{
+ switch (cursorKind)
+ {
+ case 0:
+ default:
+ return ListMenuAddRedOutlineCursorObject(cursor);
+ case 1:
+ return ListMenuAddRedArrowCursorObject(cursor);
+ }
+}
+
+void ListMenuUpdateCursorObject(u8 taskId, u16 x, u16 y, u32 cursorKind)
+{
+ switch (cursorKind)
+ {
+ case 0:
+ ListMenuUpdateRedOutlineCursorObject(taskId, x, y);
+ break;
+ case 1:
+ ListMenuUpdateRedArrowCursorObject(taskId, x, y);
+ break;
+ }
+}
+
+void ListMenuRemoveCursorObject(u8 taskId, u32 cursorKind)
+{
+ switch (cursorKind)
+ {
+ case 0:
+ ListMenuRemoveRedOutlineCursorObject(taskId);
+ break;
+ case 1:
+ ListMenuRemoveRedArrowCursorObject(taskId);
+ break;
+ }
+}
+
+void Task_RedOutlineCursor(u8 taskId)
+{
+}
+
+u8 ListMenuGetRedOutlineCursorSpriteCount(u16 rowWidth, u16 rowHeight)
+{
+ s32 i, count = 4;
+
+ if (rowWidth > 16)
+ for (i = 8; i < (rowWidth - 8); i += 8)
+ count += 2;
+ if (rowHeight > 16)
+ for (i = 8; i < (rowHeight - 8); i += 8)
+ count += 2;
+ return count;
+}
+
+void ListMenuSetUpRedOutlineCursorSpriteOamTable(u16 rowWidth, u16 rowHeight, struct Subsprite *subsprites)
+{
+ s32 i, j, id = 0;
+
+ subsprites[id] = sSubsprite_RedOutline1;
+ subsprites[id].x = 136;
+ subsprites[id].y = 136;
+ id++;
+ subsprites[id] = sSubsprite_RedOutline2;
+ subsprites[id].x = rowWidth + 128;
+ subsprites[id].y = 136;
+ id++;
+ subsprites[id] = sSubsprite_RedOutline7;
+ subsprites[id].x = 136;
+ subsprites[id].y = rowHeight + 128;
+ id++;
+ subsprites[id] = sSubsprite_RedOutline8;
+ subsprites[id].x = rowWidth + 128;
+ subsprites[id].y = rowHeight + 128;
+ id++;
+ if (rowWidth > 16)
+ {
+ for (i = 8; i < rowWidth - 8; i += 8)
+ {
+ subsprites[id] = sSubsprite_RedOutline3;
+ subsprites[id].x = i - 120;
+ subsprites[id].y = 136;
+ id++;
+
+ subsprites[id] = sSubsprite_RedOutline6;
+ subsprites[id].x = i - 120;
+ subsprites[id].y = rowHeight + 128;
+ id++;
+ }
+ }
+ if (rowHeight > 16)
+ {
+ for (j = 8; j < rowHeight - 8; j += 8)
+ {
+ subsprites[id] = sSubsprite_RedOutline4;
+ subsprites[id].x = 136;
+ subsprites[id].y = j - 120;
+ id++;
+ subsprites[id] = sSubsprite_RedOutline5;
+ subsprites[id].x = rowWidth + 128;
+ subsprites[id].y = j - 120;
+ id++;
+ }
+ }
+}
+
+u8 ListMenuAddRedOutlineCursorObject(struct CursorStruct *cursor)
+{
+ struct CompressedSpriteSheet spriteSheet;
+ struct SpritePalette spritePal;
+ struct RedOutlineCursor *data;
+ struct SpriteTemplate spriteTemplate;
+ u8 taskId;
+
+ spriteSheet.data = sSelectorOutlineGfx;
+ spriteSheet.size = 0x100;
+ spriteSheet.tag = cursor->tileTag;
+ LoadCompressedSpriteSheet(&spriteSheet);
+ if (cursor->palTag == SPRITE_INVALID_TAG)
+ {
+ LoadPalette(sRedArrowPal, (16 * cursor->palNum) + 0x100, 0x20);
+ }
+ else
+ {
+ spritePal.data = sRedArrowPal;
+ spritePal.tag = cursor->palTag;
+ LoadSpritePalette(&spritePal);
+ }
+ taskId = CreateTask(Task_RedOutlineCursor, 0);
+ data = (struct RedOutlineCursor *)gTasks[taskId].data;
+ data->tileTag = cursor->tileTag;
+ data->palTag = cursor->palTag;
+ data->subspriteTable.subspriteCount = ListMenuGetRedOutlineCursorSpriteCount(cursor->rowWidth, cursor->rowHeight);
+ data->subspriteTable.subsprites = data->subspritesPtr = Alloc(data->subspriteTable.subspriteCount * 4);
+ ListMenuSetUpRedOutlineCursorSpriteOamTable(cursor->rowWidth, cursor->rowHeight, data->subspritesPtr);
+ spriteTemplate = gDummySpriteTemplate;
+ spriteTemplate.tileTag = cursor->tileTag;
+ spriteTemplate.paletteTag = cursor->palTag;
+ data->spriteId = CreateSprite(&spriteTemplate, cursor->left + 120, cursor->top + 120, 0);
+ SetSubspriteTables(&gSprites[data->spriteId], &data->subspriteTable);
+ gSprites[data->spriteId].oam.priority = 0;
+ gSprites[data->spriteId].subpriority = 0;
+ gSprites[data->spriteId].subspriteTableNum = 0;
+ if (cursor->palTag == SPRITE_INVALID_TAG)
+ gSprites[data->spriteId].oam.paletteNum = cursor->palNum;
+ return taskId;
+}
+
+void ListMenuUpdateRedOutlineCursorObject(u8 taskId, u16 x, u16 y)
+{
+ struct RedOutlineCursor *data = (struct RedOutlineCursor *)gTasks[taskId].data;
+
+ gSprites[data->spriteId].pos1.x = x + 120;
+ gSprites[data->spriteId].pos1.y = y + 120;
+}
+
+void ListMenuRemoveRedOutlineCursorObject(u8 taskId)
+{
+ struct RedOutlineCursor *data = (struct RedOutlineCursor *)gTasks[taskId].data;
+
+ Free(data->subspritesPtr);
+ if (data->tileTag != SPRITE_INVALID_TAG)
+ FreeSpriteTilesByTag(data->tileTag);
+ if (data->palTag != SPRITE_INVALID_TAG)
+ FreeSpritePaletteByTag(data->palTag);
+ DestroySprite(&gSprites[data->spriteId]);
+ DestroyTask(taskId);
+}
+
+static void SpriteCallback_RedArrowCursor(struct Sprite *sprite)
+{
+ sprite->pos2.x = gSineTable[(u8)(sprite->data[0])] / 64;
+ sprite->data[0] += 8;
+}
+
+static void Task_RedArrowCursor(u8 taskId)
+{
+}
+
+static u8 ListMenuAddRedArrowCursorObject(struct CursorStruct *cursor)
+{
+ struct CompressedSpriteSheet spriteSheet;
+ struct SpritePalette spritePal;
+ struct RedArrowCursor *data;
+ struct SpriteTemplate spriteTemplate;
+ u8 taskId;
+
+ spriteSheet.data = sRedArrowGfx;
+ spriteSheet.size = 0x80;
+ spriteSheet.tag = cursor->tileTag;
+ LoadCompressedSpriteSheet(&spriteSheet);
+ if (cursor->palTag == SPRITE_INVALID_TAG)
+ {
+ LoadPalette(sRedArrowPal, (16 * cursor->palNum) + 0x100, 0x20);
+ }
+ else
+ {
+ spritePal.data = sRedArrowPal;
+ spritePal.tag = cursor->palTag;
+ LoadSpritePalette(&spritePal);
+ }
+ taskId = CreateTask(Task_RedArrowCursor, 0);
+ data = (struct RedArrowCursor *)gTasks[taskId].data;
+ data->tileTag = cursor->tileTag;
+ data->palTag = cursor->palTag;
+ spriteTemplate = sSpriteTemplate_RedArrowCursor;
+ spriteTemplate.tileTag = cursor->tileTag;
+ spriteTemplate.paletteTag = cursor->palTag;
+ data->spriteId = CreateSprite(&spriteTemplate, cursor->left, cursor->top, 0);
+ gSprites[data->spriteId].pos2.x = 8;
+ gSprites[data->spriteId].pos2.y = 8;
+ if (cursor->palTag == SPRITE_INVALID_TAG)
+ gSprites[data->spriteId].oam.paletteNum = cursor->palNum;
+ return taskId;
+}
+
+static void ListMenuUpdateRedArrowCursorObject(u8 taskId, u16 x, u16 y)
+{
+ struct RedArrowCursor *data = (struct RedArrowCursor *)gTasks[taskId].data;
+
+ gSprites[data->spriteId].pos1.x = x;
+ gSprites[data->spriteId].pos1.y = y;
+}
+
+static void ListMenuRemoveRedArrowCursorObject(u8 taskId)
+{
+ struct RedArrowCursor *data = (struct RedArrowCursor *)gTasks[taskId].data;
+
+ if (data->tileTag != SPRITE_INVALID_TAG)
+ FreeSpriteTilesByTag(data->tileTag);
+ if (data->palTag != SPRITE_INVALID_TAG)
+ FreeSpritePaletteByTag(data->palTag);
+ DestroySprite(&gSprites[data->spriteId]);
+ DestroyTask(taskId);
+}
diff --git a/src/mevent.c b/src/mevent.c
index 4d625987e..fc0c1f2d4 100644
--- a/src/mevent.c
+++ b/src/mevent.c
@@ -28,7 +28,7 @@ struct MEventTaskData1
u16 t02;
u16 t04;
u16 t06;
- u8 t08;
+ u8 state;
u8 t09;
u8 t0A;
u8 t0B;
@@ -91,46 +91,46 @@ struct MEvent_Str_1 gUnknown_3005ED0;
static EWRAM_DATA bool32 gUnknown_203F3BC = FALSE;
-void sub_81435DC(struct MEvent_Str_1 *a0, size_t a1, const void * a2)
+void sub_81435DC(struct MEvent_Str_1 *mgr, size_t size, const void * data)
{
vu16 imeBak = REG_IME;
REG_IME = 0;
- gIntrTable[1] = sub_815C6D4;
- gIntrTable[2] = sub_815C6C4;
- sub_815C8C8();
- sub_815C960();
+ gIntrTable[1] = EReaderHelper_SerialCallback;
+ gIntrTable[2] = EReaderHelper_Timer3Callback;
+ EReaderHelper_SaveRegsState();
+ EReaderHelper_ClearsSendRecvMgr();
REG_IE |= INTR_FLAG_VCOUNT;
REG_IME = imeBak;
- a0->unk_000 = 0;
- a0->unk_004 = a1;
- a0->unk_008 = a2;
+ mgr->status = 0;
+ mgr->size = size;
+ mgr->data = data;
}
void sub_8143644(struct MEvent_Str_1 *unused)
{
vu16 imeBak = REG_IME;
REG_IME = 0;
- sub_815C960();
- sub_815C91C();
+ EReaderHelper_ClearsSendRecvMgr();
+ EReaderHelper_RestoreRegsState();
RestoreSerialTimer3IntrHandlers();
REG_IME = imeBak;
}
-u8 sub_8143674(struct MEvent_Str_1 *a0)
+u8 sub_8143674(struct MEvent_Str_1 *mgr)
{
u8 resp = 0;
- a0->unk_000 = sub_815C498(1, a0->unk_004, a0->unk_008, 0);
- if ((a0->unk_000 & 0x13) == 0x10)
+ mgr->status = EReaderHandleTransfer(1, mgr->size, mgr->data, 0);
+ if ((mgr->status & 0x13) == 0x10)
resp = 1;
- if (a0->unk_000 & 8)
+ if (mgr->status & 8)
resp = 2;
- if (a0->unk_000 & 4)
+ if (mgr->status & 4)
resp = 3;
gUnknown_3003F84 = 0;
return resp;
}
-void sub_81436BC(void)
+static void ResetTTDataBuffer(void)
{
memset(gDecompressionBuffer, 0, 0x2000);
gLinkType = 0x5502;
@@ -143,7 +143,7 @@ bool32 sub_81436EC(void)
vu16 imeBak = REG_IME;
u16 data[4];
REG_IME = 0;
- *(u64 *)data = gUnknown_3003FB4;
+ *(u64 *)data = gSioMlt_Recv;
REG_IME = imeBak;
if ( data[0] == 0xB9A0
&& data[1] == 0xCCD0
@@ -154,7 +154,7 @@ bool32 sub_81436EC(void)
return FALSE;
}
-bool32 sub_814374C(void)
+static bool32 IsEReaderConnectionSane(void)
{
if (sub_800AA48() && GetLinkPlayerCount_2() == 2)
return TRUE;
@@ -244,7 +244,7 @@ void task_add_00_ereader(void)
{
u8 taskId = CreateTask(sub_8143910, 0);
struct MEventTaskData1 *data = (struct MEventTaskData1 *)gTasks[taskId].data;
- data->t08 = 0;
+ data->state = 0;
data->t09 = 0;
data->t0A = 0;
data->t0B = 0;
@@ -258,12 +258,12 @@ void task_add_00_ereader(void)
data->t10 = AllocZeroed(sizeof(struct MEvent_Str_2));
}
-void sub_81438E8(u16 *a0)
+static void ResetDelayTimer(u16 *a0)
{
*a0 = 0;
}
-bool32 sub_81438F0(u16 * a0, u16 a1)
+static bool32 AdvanceDelayTimerCheckTimeout(u16 * a0, u16 a1)
{
if (++(*a0) > a1)
{
@@ -276,49 +276,49 @@ bool32 sub_81438F0(u16 * a0, u16 a1)
void sub_8143910(u8 taskId)
{
struct MEventTaskData1 *data = (struct MEventTaskData1 *)gTasks[taskId].data;
- switch (data->t08)
+ switch (data->state)
{
case 0:
if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE52))
- data->t08 = 1;
+ data->state = 1;
break;
case 1:
- sub_81436BC();
- sub_81438E8(&data->t00);
- data->t08 = 2;
+ ResetTTDataBuffer();
+ ResetDelayTimer(&data->t00);
+ data->state = 2;
break;
case 2:
- if (sub_81438F0(&data->t00, 10))
- data->t08 = 3;
+ if (AdvanceDelayTimerCheckTimeout(&data->t00, 10))
+ data->state = 3;
break;
case 3:
- if (!sub_814374C())
+ if (!IsEReaderConnectionSane())
{
CloseLink();
- data->t08 = 4;
+ data->state = 4;
}
else
- data->t08 = 13;
+ data->state = 13;
break;
case 4:
if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE53))
{
AddTextPrinterToWindow1(gUnknown_841DE54);
- sub_81438E8(&data->t00);
- data->t08 = 5;
+ ResetDelayTimer(&data->t00);
+ data->state = 5;
}
break;
case 5:
- if (sub_81438F0(&data->t00, 90))
+ if (AdvanceDelayTimerCheckTimeout(&data->t00, 90))
{
- sub_81436BC();
- data->t08 = 6;
+ ResetTTDataBuffer();
+ data->state = 6;
}
else if (JOY_NEW(B_BUTTON))
{
- sub_81438E8(&data->t00);
+ ResetDelayTimer(&data->t00);
PlaySE(SE_SELECT);
- data->t08 = 23;
+ data->state = 23;
}
break;
case 6:
@@ -326,64 +326,64 @@ void sub_8143910(u8 taskId)
{
PlaySE(SE_SELECT);
CloseLink();
- sub_81438E8(&data->t00);
- data->t08 = 23;
+ ResetDelayTimer(&data->t00);
+ data->state = 23;
}
else if (GetLinkPlayerCount_2() > 1)
{
- sub_81438E8(&data->t00);
+ ResetDelayTimer(&data->t00);
CloseLink();
- data->t08 = 7;
+ data->state = 7;
}
else if (sub_81436EC())
{
PlaySE(SE_SELECT);
CloseLink();
- sub_81438E8(&data->t00);
- data->t08 = 8;
+ ResetDelayTimer(&data->t00);
+ data->state = 8;
}
- else if (sub_81438F0(&data->t00, 10))
+ else if (AdvanceDelayTimerCheckTimeout(&data->t00, 10))
{
CloseLink();
- sub_81436BC();
- sub_81438E8(&data->t00);
+ ResetTTDataBuffer();
+ ResetDelayTimer(&data->t00);
}
break;
case 7:
if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE7C))
- data->t08 = 4;
+ data->state = 4;
break;
case 8:
AddTextPrinterToWindow1(gUnknown_841DE95);
sub_81435DC(&gUnknown_3005ED0, gUnknownSerialData_End - gUnknownSerialData_Start, gUnknownSerialData_Start);
- data->t08 = 9;
+ data->state = 9;
break;
case 9:
data->t0E = sub_8143674(&gUnknown_3005ED0);
if (data->t0E != 0)
- data->t08 = 10;
+ data->state = 10;
break;
case 10:
sub_8143644(&gUnknown_3005ED0);
if (data->t0E == 3)
- data->t08 = 20;
+ data->state = 20;
else if (data->t0E == 1)
{
- sub_81438E8(&data->t00);
+ ResetDelayTimer(&data->t00);
AddTextPrinterToWindow1(gUnknown_841DE9B);
- data->t08 = 11;
+ data->state = 11;
}
else
- data->t08 = 0;
+ data->state = 0;
break;
case 11:
- if (sub_81438F0(&data->t00, 840))
- data->t08 = 12;
+ if (AdvanceDelayTimerCheckTimeout(&data->t00, 840))
+ data->state = 12;
break;
case 12:
- sub_81436BC();
+ ResetTTDataBuffer();
AddTextPrinterToWindow1(gUnknown_841DE98);
- data->t08 = 13;
+ data->state = 13;
break;
case 13:
switch (sub_8143770(&data->t09, &data->t00))
@@ -392,21 +392,21 @@ void sub_8143910(u8 taskId)
break;
case 2:
AddTextPrinterToWindow1(gUnknown_841DE95);
- data->t08 = 14;
+ data->state = 14;
break;
case 1:
PlaySE(SE_SELECT);
CloseLink();
- data->t08 = 23;
+ data->state = 23;
break;
case 5:
CloseLink();
- data->t08 = 21;
+ data->state = 21;
break;
case 3:
case 4:
CloseLink();
- data->t08 = 20;
+ data->state = 20;
break;
}
break;
@@ -414,65 +414,65 @@ void sub_8143910(u8 taskId)
if (HasLinkErrorOccurred())
{
CloseLink();
- data->t08 = 20;
+ data->state = 20;
}
else if (GetBlockReceivedStatus())
{
ResetBlockReceivedFlags();
- data->t08 = 15;
+ data->state = 15;
}
break;
case 15:
- data->t0E = sub_815D6B4(gDecompressionBuffer);
+ data->t0E = ValidateTrainerTowerData((struct TrainerTowerData *)gDecompressionBuffer);
sub_800AA80(data->t0E);
- data->t08 = 16;
+ data->state = 16;
break;
case 16:
if (!gReceivedRemoteLinkPlayers)
{
if (data->t0E == 1)
- data->t08 = 17;
+ data->state = 17;
else
- data->t08 = 20;
+ data->state = 20;
}
break;
case 17:
- if (sub_815D794(gDecompressionBuffer))
+ if (CEReaderTool_SaveTrainerTower((struct TrainerTowerData *)gDecompressionBuffer))
{
AddTextPrinterToWindow1(gUnknown_841DE99);
- sub_81438E8(&data->t00);
- data->t08 = 18;
+ ResetDelayTimer(&data->t00);
+ data->state = 18;
}
else
- data->t08 = 22;
+ data->state = 22;
break;
case 18:
- if (sub_81438F0(&data->t00, 120))
+ if (AdvanceDelayTimerCheckTimeout(&data->t00, 120))
{
AddTextPrinterToWindow1(gUnknown_841DE9A);
PlayFanfare(258);
- data->t08 = 19;
+ data->state = 19;
}
break;
case 19:
if (IsFanfareTaskInactive() &&JOY_NEW(A_BUTTON | B_BUTTON))
- data->t08 = 26;
+ data->state = 26;
break;
case 23:
if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE7D))
- data->t08 = 26;
+ data->state = 26;
break;
case 20:
if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE96))
- data->t08 = 0;
+ data->state = 0;
break;
case 21:
if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE97))
- data->t08 = 0;
+ data->state = 0;
break;
case 22:
if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE9C))
- data->t08 = 0;
+ data->state = 0;
break;
case 26:
sub_812B484();
diff --git a/src/mevent_8145654.c b/src/mevent_8145654.c
index af3024bff..c67cd1358 100644
--- a/src/mevent_8145654.c
+++ b/src/mevent_8145654.c
@@ -6,6 +6,7 @@
#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"
@@ -97,7 +98,7 @@ const u16 gUnknown_8467E74[] = INCBIN_U16("data/graphics/mevent/pal_467E74.gbapa
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 u8 gUnknown_8467EF4[] = INCBIN_U8("data/graphics/mevent/gfx_467EF4.4bpp.lz");
+const u32 gUnknown_8467EF4[] = INCBIN_U32("data/graphics/mevent/gfx_467EF4.4bpp.lz");
const struct CompressedSpriteSheet gUnknown_8467F58 = {
gUnknown_8467EF4, 0x100, 0x8000
@@ -175,13 +176,13 @@ s32 FadeToWonderCardMenu(void)
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(2);
- decompress_and_copy_tile_data_to_vram(2, gUnknown_203F3C8->unk_0170->tiles, 0, 0x008, 0);
+ 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 (free_temp_tile_data_buffers_if_possible())
+ if (FreeTempTileDataBuffersIfPossible())
return 0;
gPaletteFade.bufferTransferDisabled = TRUE;
LoadPalette(gUnknown_203F3C8->unk_0170->pal, 0x10, 0x20);
@@ -347,28 +348,28 @@ void sub_8145D18(u8 whichWindow)
case 0:
{
s32 x;
- box_print(windowId, 3, 0, 1, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_018B);
+ 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;
- box_print(windowId, 3, x, 17, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_01B4);
+ 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)
{
- box_print(windowId, 2, 166, 17, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_01DD);
+ AddTextPrinterParameterized3(windowId, 2, 166, 17, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_01DD);
}
break;
}
case 1:
for (; sp0C < 4; sp0C++)
{
- box_print(windowId, 3, 0, 16 * sp0C + 2, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal2], 0, gUnknown_203F3C8->unk_01E4[sp0C]);
+ AddTextPrinterParameterized3(windowId, 3, 0, 16 * sp0C + 2, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal2], 0, gUnknown_203F3C8->unk_01E4[sp0C]);
}
break;
case 2:
- box_print(windowId, 3, 0, gUnknown_8467070[gUnknown_203F3C8->unk_0000.unk_08_0], &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_0288);
+ 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)
{
- box_print(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);
+ 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
{
@@ -377,11 +378,11 @@ void sub_8145D18(u8 whichWindow)
s32 spacing = GetFontAttribute(3, 2);
for (; sp0C < gUnknown_203F3C8->unk_0175; sp0C++)
{
- box_print(windowId, 3, x, y, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02DC[sp0C].unk_01);
+ 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);
- box_print(windowId, 2, x, y, &gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02DC[sp0C].unk_42);
+ 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;
}
}
@@ -402,7 +403,7 @@ void sub_8146060(void)
}
if (gUnknown_203F3C8->unk_0000.unk_09 != 0 && gUnknown_203F3C8->unk_0000.unk_08_0 == 1)
{
- sub_800F034(&gUnknown_8467F58);
+ LoadCompressedSpriteSheetUsingHeap(&gUnknown_8467F58);
LoadSpritePalette(&gUnknown_8467F60[gUnknown_203F3C8->unk_0170->textPal4]);
for (; r7 < gUnknown_203F3C8->unk_0000.unk_09; r7++)
{
@@ -460,7 +461,7 @@ struct UnkStruct_203F3CC
/*01cc*/ u8 filler_01CC[2];
/*01ce*/ u8 unk_01CE[41];
/*01f7*/ u8 unk_01F7[10][41];
- /*0394*/ struct ScrollIndicatorArrowPairTemplate unk_0394;
+ /*0394*/ struct ScrollArrowsTemplate unk_0394;
/*03a4*/ u8 buffer_03A4[0x1000];
};
@@ -478,9 +479,9 @@ const struct WindowTemplate gUnknown_8468040[] = {
{0, 1, 0, 28, 3, 15, 0x000},
{2, 1, 3, 28, 20, 15, 0x000}
};
-const struct ScrollIndicatorArrowPairTemplate gUnknown_8468050 = {
+const struct ScrollArrowsTemplate gUnknown_8468050 = {
0x02, 0xe8, 0x18, 0x03, 0xe8, 0x98,
- 0x0000, 0x0002, 0x1000, 0x1000, 0x0, 0x000
+ 0x0000, 0x0002, 0x1000, 0x1000, 0x0,
};
const u16 gUnknown_8468060[] = INCBIN_U16("data/graphics/mevent/pal_468060.gbapal");
@@ -565,12 +566,12 @@ s32 FadeToWonderNewsMenu(void)
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(2);
CopyBgTilemapBufferToVram(3);
- decompress_and_copy_tile_data_to_vram(3, gUnknown_203F3CC->unk_01BC->tiles, 0, 8, 0);
+ 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 (free_temp_tile_data_buffers_if_possible())
+ if (FreeTempTileDataBuffersIfPossible())
return 0;
gPaletteFade.bufferTransferDisabled = TRUE;
LoadPalette(gUnknown_203F3CC->unk_01BC->pal, 0x10, 0x20);
@@ -743,7 +744,7 @@ void sub_8146980(void)
++gUnknown_203F3CC->unk_01C4;
}
gUnknown_203F3CC->unk_0394 = gUnknown_8468050;
- gUnknown_203F3CC->unk_0394.unk_08 = gUnknown_203F3CC->unk_01C4;
+ gUnknown_203F3CC->unk_0394.fullyDownThreshold = gUnknown_203F3CC->unk_01C4;
}
void sub_8146A30(void)
@@ -757,10 +758,10 @@ void sub_8146A30(void)
x = (0xe0 - GetStringWidth(3, gUnknown_203F3CC->unk_01CE, GetFontAttribute(3, 2))) / 2;
if (x < 0)
x = 0;
- box_print(gUnknown_203F3CC->unk_01C8[0], 3, x, 6, &gUnknown_8468038[gUnknown_203F3CC->unk_01BC->textPal1], 0, gUnknown_203F3CC->unk_01CE);
+ 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)
{
- box_print(gUnknown_203F3CC->unk_01C8[1], 3, 0, 16 * i + 2, &gUnknown_8468038[gUnknown_203F3CC->unk_01BC->textPal2], 0, gUnknown_203F3CC->unk_01F7[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);
diff --git a/src/money.c b/src/money.c
index 6d9a0fce9..39e5aaa32 100644
--- a/src/money.c
+++ b/src/money.c
@@ -109,7 +109,7 @@ void PrintMoneyAmount(u8 windowId, u8 x, u8 y, int amount, u8 speed)
void PrintMoneyAmountInMoneyBoxWithBorder(u8 windowId, u16 tileStart, u8 pallete, int amount)
{
- SetWindowBorderStyle(windowId, FALSE, tileStart, pallete);
+ DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, tileStart, pallete);
AddTextPrinterParameterized(windowId, 2, gUnknown_8419CE7, 0, 0, 0xFF, 0);
PrintMoneyAmountInMoneyBox(windowId, amount, 0);
}
@@ -121,20 +121,19 @@ void ChangeAmountInMoneyBox(int amount)
void DrawMoneyBox(int amount, u8 x, u8 y)
{
- struct WindowTemplate template, template2;
+ struct WindowTemplate template;
- SetWindowTemplateFields(&template, 0, x + 1, y + 1, 8, 3, 15, 8);
- template2 = template;
- sMoneyBoxWindowId = AddWindow(&template2);
+ template = SetWindowTemplateFields(0, x + 1, y + 1, 8, 3, 15, 8);
+ sMoneyBoxWindowId = AddWindow(&template);
FillWindowPixelBuffer(sMoneyBoxWindowId, 0);
PutWindowTilemap(sMoneyBoxWindowId);
- sub_814FF2C(sMoneyBoxWindowId, 0x21D, 0xD0);
+ TextWindow_SetStdFrame0_WithPal(sMoneyBoxWindowId, 0x21D, 0xD0);
PrintMoneyAmountInMoneyBoxWithBorder(sMoneyBoxWindowId, 0x21D, 13, amount);
}
void HideMoneyBox(void)
{
- sub_810F4D8(sMoneyBoxWindowId, FALSE);
+ ClearStdWindowAndFrameToTransparent(sMoneyBoxWindowId, FALSE);
CopyWindowToVram(sMoneyBoxWindowId, 2);
RemoveWindow(sMoneyBoxWindowId);
}
diff --git a/src/multiboot.c b/src/multiboot.c
new file mode 100644
index 000000000..cfc9821d2
--- /dev/null
+++ b/src/multiboot.c
@@ -0,0 +1,416 @@
+#include "global.h"
+#include "multiboot.h"
+
+static IWRAM_DATA u16 MultiBoot_required_data[MULTIBOOT_NCHILD];
+
+static int MultiBootSend(struct MultiBootParam *mp, u16 data);
+static int MultiBootHandShake(struct MultiBootParam *mp);
+static void MultiBootWaitCycles(u32 cycles);
+static void MultiBootWaitSendDone(void);
+
+void MultiBootInit(struct MultiBootParam *mp)
+{
+ mp->client_bit = 0;
+ mp->probe_count = 0;
+ mp->response_bit = 0;
+ mp->check_wait = MULTIBOOT_CONNECTION_CHECK_WAIT;
+ mp->sendflag = 0;
+ mp->handshake_timeout = 0;
+ REG_RCNT = 0;
+ REG_SIOCNT = SIO_MULTI_MODE | SIO_115200_BPS;
+ REG_SIODATA8 = 0;
+}
+
+int MultiBootMain(struct MultiBootParam *mp)
+{
+ int i, j, k;
+
+ if (MultiBootCheckComplete(mp))
+ {
+ return 0;
+ }
+ if (mp->check_wait > MULTIBOOT_CONNECTION_CHECK_WAIT)
+ {
+ mp->check_wait--;
+ return 0;
+ }
+output_burst:
+ if (mp->sendflag)
+ {
+ mp->sendflag = 0;
+
+ i = REG_SIOCNT & (SIO_MULTI_BUSY | SIO_ERROR | SIO_ID | SIO_MULTI_SD | SIO_MULTI_SI);
+ if (i != SIO_MULTI_SD)
+ {
+ MultiBootInit(mp);
+ return i ^ SIO_MULTI_SD;
+ }
+ }
+ if (mp->probe_count >= 0xe0)
+ {
+ i = MultiBootHandShake(mp);
+ if (i)
+ {
+ return i;
+ }
+
+ if (mp->server_type == MULTIBOOT_SERVER_TYPE_QUICK
+ && mp->probe_count > 0xe1
+ && MultiBootCheckComplete(mp) == 0)
+ {
+ MultiBootWaitSendDone();
+ goto output_burst;
+ }
+
+ if (MultiBootCheckComplete(mp) == 0)
+ {
+ if (mp->handshake_timeout == 0)
+ {
+ MultiBootInit(mp);
+ return MULTIBOOT_ERROR_HANDSHAKE_FAILURE;
+ }
+ mp->handshake_timeout--;
+ }
+
+ return 0;
+ }
+ switch (mp->probe_count)
+ {
+ case 0:
+ k = 0x0e;
+ for (i = MULTIBOOT_NCHILD; i != 0; i--)
+ {
+ if (*(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2) != 0xffff)
+ {
+ break;
+ }
+ k >>= 1;
+ }
+ k &= 0x0e;
+ mp->response_bit = k;
+ for (i = MULTIBOOT_NCHILD; i != 0; i--)
+ {
+ j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
+ if (mp->client_bit & (1 << i))
+ {
+ if (j != ((MULTIBOOT_CLIENT_INFO << 8) | (1 << i)))
+ {
+ k = 0;
+ break;
+ }
+ }
+ }
+ mp->client_bit &= k;
+ if (k == 0)
+ {
+ mp->check_wait = MULTIBOOT_CONNECTION_CHECK_WAIT;
+ }
+
+ if (mp->check_wait)
+ {
+ mp->check_wait--;
+ }
+ else
+ {
+ if (mp->response_bit != mp->client_bit)
+ {
+ MultiBootStartProbe(mp);
+ goto case_1;
+ }
+ }
+ output_master_info:
+ return MultiBootSend(mp, (MULTIBOOT_MASTER_INFO << 8) | mp->client_bit);
+ case_1:
+ case 1:
+ mp->probe_target_bit = 0;
+ for (i = MULTIBOOT_NCHILD; i != 0; i--)
+ {
+ j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
+ if ((j >> 8) == MULTIBOOT_CLIENT_INFO)
+ {
+ MultiBoot_required_data[i - 1] = j;
+ j &= 0xff;
+ if (j == (1 << i))
+ {
+ mp->probe_target_bit |= j;
+ }
+ }
+ }
+ if (mp->response_bit != mp->probe_target_bit)
+ {
+ goto output_master_info;
+ }
+ mp->probe_count = 2;
+ return MultiBootSend(mp, (MULTIBOOT_MASTER_START_PROBE << 8) | mp->probe_target_bit);
+ case 2:
+ for (i = MULTIBOOT_NCHILD; i != 0; i--)
+ {
+ if (mp->probe_target_bit & (1 << i))
+ {
+ j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
+ if (j != MultiBoot_required_data[i - 1])
+ {
+ mp->probe_target_bit ^= 1 << i;
+ }
+ }
+ }
+ goto output_header;
+ case 0xd0:
+ k = 1;
+ for (i = MULTIBOOT_NCHILD; i != 0; i--)
+ {
+ j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
+ mp->client_data[i - 1] = j;
+ if (mp->probe_target_bit & (1 << i))
+ {
+ if ((j >> 8) != MULTIBOOT_CLIENT_INFO
+ && (j >> 8) != MULTIBOOT_CLIENT_DLREADY)
+ {
+ MultiBootInit(mp);
+ return MULTIBOOT_ERROR_NO_DLREADY;
+ }
+ if (j == MultiBoot_required_data[i - 1])
+ {
+ k = 0;
+ }
+ }
+ }
+ if (k == 0)
+ {
+ return MultiBootSend(mp, (MULTIBOOT_MASTER_REQUEST_DLREADY << 8) | mp->palette_data);
+ }
+ mp->probe_count = 0xd1;
+ k = 0x11;
+ for (i = MULTIBOOT_NCHILD; i != 0; i--)
+ {
+ k += mp->client_data[i - 1];
+ }
+ mp->handshake_data = k;
+ return MultiBootSend(mp, (MULTIBOOT_MASTER_START_DL << 8) | (k & 0xff));
+ case 0xd1:
+ for (i = MULTIBOOT_NCHILD; i != 0; i--)
+ {
+ j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
+ if (mp->probe_target_bit & (1 << i))
+ {
+ if ((j >> 8) != MULTIBOOT_CLIENT_DLREADY)
+ {
+ MultiBootInit(mp);
+ return MULTIBOOT_ERROR_NO_DLREADY;
+ }
+ }
+ }
+ i = MultiBoot(mp);
+ if (i == 0)
+ {
+ mp->probe_count = 0xe0;
+ mp->handshake_timeout = MULTIBOOT_HANDSHAKE_TIMEOUT;
+ return 0;
+ }
+ MultiBootInit(mp);
+ mp->check_wait = MULTIBOOT_CONNECTION_CHECK_WAIT * 2;
+ return MULTIBOOT_ERROR_BOOT_FAILURE;
+ default:
+ for (i = MULTIBOOT_NCHILD; i != 0; i--)
+ {
+ if (mp->probe_target_bit & (1 << i))
+ {
+ j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
+ if ((j >> 8) != (MULTIBOOT_MASTER_START_PROBE + 1 - (mp->probe_count >> 1))
+ || ((j & 0xff) != (1 << i)))
+ {
+ mp->probe_target_bit ^= 1 << i;
+ }
+ }
+ }
+ if (mp->probe_count == 0xc4)
+ {
+ mp->client_bit = mp->probe_target_bit & 0x0e;
+ mp->probe_count = 0;
+ goto output_master_info;
+ }
+ output_header:
+ if (mp->probe_target_bit == 0)
+ {
+ MultiBootInit(mp);
+ return MULTIBOOT_ERROR_NO_PROBE_TARGET;
+ }
+ mp->probe_count += 2;
+ if (mp->probe_count == 0xc4)
+ {
+ goto output_master_info;
+ }
+ i = MultiBootSend(mp,
+ (mp->masterp[mp->probe_count - 4 + 1] << 8)
+ | mp->masterp[mp->probe_count - 4]);
+ if (i)
+ {
+ return i;
+ }
+ if (mp->server_type == MULTIBOOT_SERVER_TYPE_QUICK)
+ {
+ MultiBootWaitSendDone();
+ goto output_burst;
+ }
+ return 0;
+ }
+}
+
+static int MultiBootSend(struct MultiBootParam *mp, u16 data)
+{
+ int i = REG_SIOCNT & (SIO_MULTI_BUSY | SIO_MULTI_SD | SIO_MULTI_SI);
+ if (i != SIO_MULTI_SD)
+ {
+ MultiBootInit(mp);
+ return i ^ SIO_MULTI_SD;
+ }
+ REG_SIODATA8 = data;
+ REG_SIOCNT = SIO_MULTI_MODE | SIO_START | SIO_115200_BPS;
+ mp->sendflag = 1;
+ return 0;
+}
+
+void MultiBootStartProbe(struct MultiBootParam *mp)
+{
+ if (mp->probe_count != 0)
+ {
+ MultiBootInit(mp);
+ return;
+ }
+ mp->check_wait = 0;
+ mp->client_bit = 0;
+ mp->probe_count = 1;
+}
+
+void MultiBootStartMaster(struct MultiBootParam *mp, const u8 *srcp, int length, u8 palette_color, s8 palette_speed)
+{
+ int i = 0;
+
+ if (mp->probe_count != 0
+ || mp->client_bit == 0
+ || mp->check_wait != 0)
+ {
+ MultiBootInit(mp);
+ return;
+ }
+ mp->boot_srcp = srcp;
+ length = (length + 15) & ~15;
+ if (length < MULTIBOOT_SEND_SIZE_MIN || length > MULTIBOOT_SEND_SIZE_MAX)
+ {
+ MultiBootInit(mp);
+ return;
+ }
+ mp->boot_endp = srcp + length;
+ switch (palette_speed)
+ {
+ case -4:
+ case -3:
+ case -2:
+ case -1:
+ i = (palette_color << 3) | (3 - palette_speed);
+ break;
+ case 0:
+ i = 0x38 | palette_color;
+ break;
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ i = (palette_color << 3) | (palette_speed - 1);
+ break;
+ }
+ mp->palette_data = ((i & 0x3f) << 1) | 0x81;
+ mp->probe_count = 0xd0;
+}
+
+bool32 MultiBootCheckComplete(struct MultiBootParam *mp)
+{
+ if (mp->probe_count == 0xe9)
+ return 1;
+ else
+ return 0;
+}
+
+static int MultiBootHandShake(struct MultiBootParam *mp)
+{
+ int i, j;
+
+#define send_data (mp->system_work[0])
+#define must_data (mp->system_work[1])
+ switch (mp->probe_count)
+ {
+ case_0xe0:
+ case 0xe0:
+ mp->probe_count = 0xe1;
+ must_data = 0x0000;
+ send_data = 0x100000;
+ return MultiBootSend(mp, 0x0000);
+ default:
+ for (i = MULTIBOOT_NCHILD; i != 0; i--)
+ {
+ j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
+ if ((mp->client_bit & (1 << i))
+ && j != must_data)
+ {
+ goto case_0xe0;
+ }
+ }
+ mp->probe_count++;
+ must_data = send_data & 0xffff;
+ if (send_data == 0x0000)
+ {
+ must_data = mp->masterp[0xac] | (mp->masterp[0xad] << 8);
+ send_data = must_data << 5;
+ }
+ send_data >>= 5;
+ output_common:
+ return MultiBootSend(mp, send_data);
+ case 0xe7:
+ case 0xe8:
+ for (i = MULTIBOOT_NCHILD; i != 0; i--)
+ {
+ j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2);
+ if ((mp->client_bit & (1 << i)) && j != must_data)
+ {
+ MultiBootInit(mp);
+ return MULTIBOOT_ERROR_HANDSHAKE_FAILURE;
+ }
+ }
+
+ mp->probe_count++;
+ if (mp->probe_count == 0xe9)
+ {
+ return 0;
+ }
+ send_data = mp->masterp[0xae] | (mp->masterp[0xaf] << 8);
+ must_data = send_data;
+ goto output_common;
+ }
+#undef send_data
+#undef must_data
+}
+
+static void MultiBootWaitCycles(u32 cycles)
+{
+ asm("mov r2, pc");
+ asm("lsr r2, #24");
+ asm("mov r1, #12");
+ asm("cmp r2, #0x02");
+ asm("beq MultiBootWaitCyclesLoop");
+ asm("mov r1, #13");
+ asm("cmp r2, #0x08");
+ asm("beq MultiBootWaitCyclesLoop");
+ asm("mov r1, #4");
+
+ asm("MultiBootWaitCyclesLoop:");
+ asm("sub r0, r1");
+ asm("bgt MultiBootWaitCyclesLoop");
+}
+
+static void MultiBootWaitSendDone(void)
+{
+ int i;
+
+ for (i = 0; (i < 31069) && (REG_SIOCNT & SIO_START); i++);
+ MultiBootWaitCycles(600);
+}
diff --git a/src/mystery_event_script.c b/src/mystery_event_script.c
index c9dc6ae81..70566ca58 100644
--- a/src/mystery_event_script.c
+++ b/src/mystery_event_script.c
@@ -267,7 +267,7 @@ bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx)
}
heldItem = GetMonData(&gPlayerParty[5], MON_DATA_HELD_ITEM);
- if (itemid_is_mail(heldItem))
+ if (ItemIsMail(heldItem))
GiveMailToMon2(&gPlayerParty[5], &mail);
CompactPartySlots();
CalculatePlayerPartyCount();
diff --git a/src/mystery_gift_menu.c b/src/mystery_gift_menu.c
index 1ec4e6157..9ff96eb23 100644
--- a/src/mystery_gift_menu.c
+++ b/src/mystery_gift_menu.c
@@ -538,14 +538,14 @@ void PrintMysteryGiftOrEReaderTopMenu(bool8 mg_or_ereader, bool32 usePickOkCance
if (!mg_or_ereader)
{
src = usePickOkCancel == TRUE ? gText_PickOKExit : gText_PickOKCancel;
- AddTextPrinterParametrized2(0, 2, 2, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gText_MysteryGift);
+ AddTextPrinterParameterized4(0, 2, 2, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gText_MysteryGift);
width = 222 - GetStringWidth(0, src, 0);
- AddTextPrinterParametrized2(0, 0, width, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, src);
+ AddTextPrinterParameterized4(0, 0, width, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, src);
}
else
{
- AddTextPrinterParametrized2(0, 2, 2, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gJPText_MysteryGift);
- AddTextPrinterParametrized2(0, 0, 0x78, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gJPText_DecideStop);
+ AddTextPrinterParameterized4(0, 2, 2, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gJPText_MysteryGift);
+ AddTextPrinterParameterized4(0, 0, 0x78, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gJPText_DecideStop);
}
CopyWindowToVram(0, 2);
PutWindowTilemap(0);
@@ -596,7 +596,7 @@ void AddTextPrinterToWindow1(const u8 *str)
{
StringExpandPlaceholders(gStringVar4, str);
FillWindowPixelBuffer(1, 0x11);
- AddTextPrinterParametrized2(1, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4);
+ AddTextPrinterParameterized4(1, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4);
DrawTextBorderOuter(1, 0x001, 0xF);
PutWindowTilemap(1);
CopyWindowToVram(1, 3);
@@ -703,7 +703,7 @@ u32 MysteryGift_HandleThreeOptionMenu(u8 * unused0, u16 * unused1, u8 whichMenu)
width = 0;
for (i = 0; i < listMenuTemplate.totalItems; i++)
{
- u32 curWidth = GetStringWidth(2, listMenuTemplate.items[i].unk_00, listMenuTemplate.lettersSpacing);
+ u32 curWidth = GetStringWidth(2, listMenuTemplate.items[i].label, listMenuTemplate.lettersSpacing);
if (curWidth > width)
width = curWidth;
}
@@ -737,7 +737,7 @@ s8 mevent_message_print_and_prompt_yes_no(u8 * textState, u16 * windowId, bool8
*windowId = AddWindow(&sWindowTemplate_PromptYesOrNo_Width20);
}
FillWindowPixelBuffer(*windowId, 0x11);
- AddTextPrinterParametrized2(*windowId, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4);
+ AddTextPrinterParameterized4(*windowId, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4);
DrawTextBorderOuter(*windowId, 0x001, 0x0F);
CopyWindowToVram(*windowId, 2);
PutWindowTilemap(*windowId);
@@ -798,7 +798,7 @@ s32 HandleMysteryGiftListMenu(u8 * textState, u16 * windowId, bool32 cannotToss,
}
*windowId = AddWindow(&sMysteryGiftMenuWindowTemplate);
FillWindowPixelBuffer(*windowId, 0x11);
- AddTextPrinterParametrized2(*windowId, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4);
+ AddTextPrinterParameterized4(*windowId, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4);
DrawTextBorderOuter(*windowId, 0x001, 0x0F);
CopyWindowToVram(*windowId, 2);
PutWindowTilemap(*windowId);
diff --git a/src/new_menu_helpers.c b/src/new_menu_helpers.c
new file mode 100644
index 000000000..9d2a5c883
--- /dev/null
+++ b/src/new_menu_helpers.c
@@ -0,0 +1,765 @@
+#include "global.h"
+#include "malloc.h"
+#include "dma3.h"
+#include "task.h"
+#include "bg.h"
+#include "gpu_regs.h"
+#include "window.h"
+#include "menu.h"
+#include "menu_helpers.h"
+#include "new_menu_helpers.h"
+#include "quest_log.h"
+#include "text.h"
+#include "field_specials.h"
+#include "text_window.h"
+#include "script.h"
+#include "graphics.h"
+#include "palette.h"
+
+#define DLG_WINDOW_PALETTE_NUM 15
+#define DLG_WINDOW_BASE_TILE_NUM 0x200
+#define STD_WINDOW_PALETTE_NUM 14
+#define STD_WINDOW_BASE_TILE_NUM 0x214
+
+static EWRAM_DATA bool8 gUnknown_203AB58[4] = {FALSE}; // knizz: bgmaps_that_need_syncing
+static EWRAM_DATA u16 gUnknown_203AB5C = {0};
+static EWRAM_DATA void *gUnknown_203AB60[0x20] = {NULL};
+static EWRAM_DATA u8 sStartMenuWindowId = {0};
+
+static const u8 gUnknown_841F428[] = { 8, 4, 1 };
+
+static const struct WindowTemplate sStandardTextBox_WindowTemplates[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 0x2,
+ .tilemapTop = 0xF,
+ .width = 0x1A,
+ .height = 0x4,
+ .paletteNum = DLG_WINDOW_PALETTE_NUM,
+ .baseBlock = 0x198,
+ },
+ DUMMY_WIN_TEMPLATE
+};
+
+static const struct WindowTemplate sYesNo_WindowTemplate =
+{
+ .bg = 0,
+ .tilemapLeft = 0x15,
+ .tilemapTop = 0x9,
+ .width = 0x6,
+ .height = 0x4,
+ .paletteNum = DLG_WINDOW_PALETTE_NUM,
+ .baseBlock = 0x125,
+};
+
+static const struct FontInfo gFontInfos[] =
+{
+ {
+ .fontFunction = Font0Func,
+ .maxLetterWidth = 0x8,
+ .maxLetterHeight = 0xD,
+ .letterSpacing = 0x0,
+ .lineSpacing = 0x0,
+ .unk = 0x0,
+ .fgColor = 0x2,
+ .bgColor = 0x1,
+ .shadowColor = 0x3,
+ },
+ {
+ .fontFunction = Font1Func,
+ .maxLetterWidth = 0x8,
+ .maxLetterHeight = 0xE,
+ .letterSpacing = 0x0,
+ .lineSpacing = 0x0,
+ .unk = 0x0,
+ .fgColor = 0x2,
+ .bgColor = 0x1,
+ .shadowColor = 0x3,
+ },
+ {
+ .fontFunction = Font2Func,
+ .maxLetterWidth = 0xA,
+ .maxLetterHeight = 0xE,
+ .letterSpacing = 0x1,
+ .lineSpacing = 0x0,
+ .unk = 0x0,
+ .fgColor = 0x2,
+ .bgColor = 0x1,
+ .shadowColor = 0x3,
+ },
+ {
+ .fontFunction = Font3Func,
+ .maxLetterWidth = 0xA,
+ .maxLetterHeight = 0xE,
+ .letterSpacing = 0x1,
+ .lineSpacing = 0x0,
+ .unk = 0x0,
+ .fgColor = 0x2,
+ .bgColor = 0x1,
+ .shadowColor = 0x3,
+ },
+ {
+ .fontFunction = Font4Func,
+ .maxLetterWidth = 0xA,
+ .maxLetterHeight = 0xE,
+ .letterSpacing = 0x0,
+ .lineSpacing = 0x0,
+ .unk = 0x0,
+ .fgColor = 0x2,
+ .bgColor = 0x1,
+ .shadowColor = 0x3,
+ },
+ {
+ .fontFunction = Font5Func,
+ .maxLetterWidth = 0xA,
+ .maxLetterHeight = 0xE,
+ .letterSpacing = 0x0,
+ .lineSpacing = 0x0,
+ .unk = 0x0,
+ .fgColor = 0x2,
+ .bgColor = 0x1,
+ .shadowColor = 0x3,
+ },
+ {
+ .fontFunction = Font6Func,
+ .maxLetterWidth = 0x8,
+ .maxLetterHeight = 0x10,
+ .letterSpacing = 0x0,
+ .lineSpacing = 0x2,
+ .unk = 0x0,
+ .fgColor = 0x2,
+ .bgColor = 0x1,
+ .shadowColor = 0x3,
+ },
+ {
+ .fontFunction = NULL,
+ .maxLetterWidth = 0x8,
+ .maxLetterHeight = 0x8,
+ .letterSpacing = 0x0,
+ .lineSpacing = 0x0,
+ .unk = 0x0,
+ .fgColor = 0x1,
+ .bgColor = 0x2,
+ .shadowColor = 0xF,
+ }
+};
+
+static const u8 gMenuCursorDimensions[][2] =
+{
+ { 0x8, 0xD },
+ { 0x8, 0xE },
+ { 0x8, 0xE },
+ { 0x8, 0xE },
+ { 0x8, 0xE },
+ { 0x8, 0xE },
+ { 0x8, 0x10 },
+ { 0x0, 0x0 }
+};
+
+static u16 CopyDecompressedTileDataToVram(u8 bgId, const void *src, u16 size, u16 offset, u8 mode);
+static void WindowFunc_DrawDialogueFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);
+static void WindowFunc_DrawStandardFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);
+static void WindowFunc_ClearDialogWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);
+static void WindowFunc_ClearStdWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum);
+static void TaskFreeBufAfterCopyingTileDataToVram(u8 taskId);
+
+void ClearScheduledBgCopiesToVram(void)
+{
+ memset(gUnknown_203AB58, 0, sizeof(gUnknown_203AB58));
+}
+
+void ScheduleBgCopyTilemapToVram(u8 bgId)
+{
+ gUnknown_203AB58[bgId] = TRUE;
+}
+
+void DoScheduledBgTilemapCopiesToVram(void)
+{
+ if (gUnknown_203AB58[0] == TRUE)
+ {
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203AB58[0] = FALSE;
+ }
+ if (gUnknown_203AB58[1] == TRUE)
+ {
+ CopyBgTilemapBufferToVram(1);
+ gUnknown_203AB58[1] = FALSE;
+ }
+ if (gUnknown_203AB58[2] == TRUE)
+ {
+ CopyBgTilemapBufferToVram(2);
+ gUnknown_203AB58[2] = FALSE;
+ }
+ if (gUnknown_203AB58[3] == TRUE)
+ {
+ CopyBgTilemapBufferToVram(3);
+ gUnknown_203AB58[3] = FALSE;
+ }
+}
+
+void ResetTempTileDataBuffers(void)
+{
+ int i;
+
+ for (i = 0; i < (s32)NELEMS(gUnknown_203AB60); i++)
+ {
+ gUnknown_203AB60[i] = NULL;
+ }
+ gUnknown_203AB5C = 0;
+}
+
+bool8 FreeTempTileDataBuffersIfPossible(void)
+{
+ int i;
+
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ if (gUnknown_203AB5C)
+ {
+ for (i = 0; i < gUnknown_203AB5C; i++)
+ {
+ FREE_AND_SET_NULL(gUnknown_203AB60[i]);
+ }
+ gUnknown_203AB5C = 0;
+ }
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+}
+
+void *DecompressAndCopyTileDataToVram(u8 bgId, const void *src, u32 size, u16 offset, u8 mode)
+{
+ u32 sizeOut;
+
+ if (gUnknown_203AB5C < NELEMS(gUnknown_203AB60))
+ {
+ void *ptr = MallocAndDecompress(src, &sizeOut);
+ if (!size)
+ size = sizeOut;
+ if (ptr)
+ {
+ CopyDecompressedTileDataToVram(bgId, ptr, size, offset, mode);
+ gUnknown_203AB60[gUnknown_203AB5C++] = ptr;
+ }
+ return ptr;
+ }
+ return NULL;
+}
+
+void *DecompressAndCopyTileDataToVram2(u8 bgId, const void *src, u32 size, u16 offset, u8 mode)
+{
+ u32 sizeOut;
+
+ if (gUnknown_203AB5C < NELEMS(gUnknown_203AB60))
+ {
+ void *ptr = MallocAndDecompress(src, &sizeOut);
+ if (sizeOut > size)
+ sizeOut = size;
+ if (ptr)
+ {
+ CopyDecompressedTileDataToVram(bgId, ptr, sizeOut, offset, mode);
+ gUnknown_203AB60[gUnknown_203AB5C++] = ptr;
+ }
+ return ptr;
+ }
+ return NULL;
+}
+
+void DecompressAndLoadBgGfxUsingHeap(u8 bgId, const void *src, u32 size, u16 offset, u8 mode)
+{
+ u32 sizeOut;
+
+ void *ptr = MallocAndDecompress(src, &sizeOut);
+ if (!size)
+ size = sizeOut;
+ if (ptr)
+ {
+ u8 taskId = CreateTask(TaskFreeBufAfterCopyingTileDataToVram, 0);
+ gTasks[taskId].data[0] = CopyDecompressedTileDataToVram(bgId, ptr, size, offset, mode);
+ SetWordTaskArg(taskId, 1, (u32)ptr);
+ }
+}
+
+void DecompressAndLoadBgGfxUsingHeap2(u8 bgId, const void *src, u32 size, u16 offset, u8 mode)
+{
+ u32 sizeOut;
+
+ void *ptr = MallocAndDecompress(src, &sizeOut);
+ if (sizeOut > size)
+ sizeOut = size;
+ if (ptr)
+ {
+ u8 taskId = CreateTask(TaskFreeBufAfterCopyingTileDataToVram, 0);
+ gTasks[taskId].data[0] = CopyDecompressedTileDataToVram(bgId, ptr, sizeOut, offset, mode);
+ SetWordTaskArg(taskId, 1, (u32)ptr);
+ }
+}
+
+static void TaskFreeBufAfterCopyingTileDataToVram(u8 taskId)
+{
+ if (!CheckForSpaceForDma3Request(gTasks[taskId].data[0]))
+ {
+ Free((void *)GetWordTaskArg(taskId, 1));
+ DestroyTask(taskId);
+ }
+}
+
+void *MallocAndDecompress(const void *src, u32 *size)
+{
+ void *ptr;
+ u8 *sizeAsBytes = (u8 *)size;
+ const u8 *srcAsBytes = src;
+
+ sizeAsBytes[0] = srcAsBytes[1];
+ sizeAsBytes[1] = srcAsBytes[2];
+ sizeAsBytes[2] = srcAsBytes[3];
+ sizeAsBytes[3] = 0;
+
+ ptr = Alloc(*size);
+ if (ptr)
+ LZ77UnCompWram(src, ptr);
+ return ptr;
+}
+
+static u16 CopyDecompressedTileDataToVram(u8 bgId, const void *src, u16 size, u16 offset, u8 mode)
+{
+ switch (mode)
+ {
+ case 1:
+ break;
+ case 0:
+ default:
+ return LoadBgTiles(bgId, src, size, offset);
+ }
+ return LoadBgTilemap(bgId, src, size, offset);
+}
+
+void SetBgRectPal(u8 bgId, u8 left, u8 top, u8 width, u8 height, u8 palette)
+{
+ u8 i, j;
+ u16 *ptr = GetBgTilemapBuffer(bgId);
+
+ for (i = top; i < top + height; i++)
+ {
+ for (j = left; j < left + width; j++)
+ {
+ ptr[(i * 32) + j] = (ptr[(i * 32) + j] & 0xFFF) | (palette << 12);
+ }
+ }
+}
+
+void CopyRectIntoAltRect(u8 bgId, u16 *dest, u8 left, u8 top, u8 width, u8 height)
+{
+ u8 i,j;
+ const u16 *src = GetBgTilemapBuffer(bgId);
+
+ for (i = 0; i < height; i++)
+ {
+ for (j = 0; j < width; j++)
+ {
+ dest[(i * width) + j] = src[(i + top) * 32 + j + left];
+ }
+ }
+}
+
+void ResetBgPositions(void)
+{
+ ChangeBgX(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgY(3, 0, 0);
+}
+
+void InitStandardTextBoxWindows(void)
+{
+ InitWindows(sStandardTextBox_WindowTemplates);
+ sStartMenuWindowId = 0xFF;
+ MapNamePopupWindowIdSetDummy();
+}
+
+void FreeAllOverworldWindowBuffers(void)
+{
+ FreeAllWindowBuffers();
+}
+
+void ResetBg0(void)
+{
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ DeactivateAllTextPrinters();
+ sub_80F6E9C();
+}
+
+u16 RunTextPrinters_CheckPrinter0Active(void)
+{
+ RunTextPrinters();
+ return IsTextPrinterActive(0);
+}
+
+u16 AddTextPrinterParameterized2(u8 windowId, u8 fontId, const u8 *str, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 fgColor, u8 bgColor, u8 shadowColor)
+{
+ struct TextPrinterTemplate printer;
+
+ printer.currentChar = str;
+ printer.windowId = windowId;
+ printer.fontId = fontId;
+ printer.x = 0;
+ printer.y = 1;
+ printer.currentX = 0;
+ printer.currentY = 1;
+ printer.letterSpacing = 1;
+ printer.lineSpacing = 1;
+ printer.unk = 0;
+ printer.fgColor = fgColor;
+ printer.bgColor = bgColor;
+ printer.shadowColor = shadowColor;
+ gTextFlags.useAlternateDownArrow = 0;
+ return AddTextPrinter(&printer, speed, callback);
+}
+
+void AddTextPrinterDiffStyle(bool8 allowSkippingDelayWithButtonPress)
+{
+ u8 result;
+ void *nptr = NULL;
+
+ gTextFlags.canABSpeedUpPrint = allowSkippingDelayWithButtonPress;
+ result = ContextNpcGetTextColor();
+ if (result == 0)
+ AddTextPrinterParameterized2(0, 4, gStringVar4, GetTextSpeedSetting(), nptr, 8, 1, 3);
+ else if (result == 1)
+ AddTextPrinterParameterized2(0, 5, gStringVar4, GetTextSpeedSetting(), nptr, 4, 1, 3);
+ else
+ AddTextPrinterParameterized2(0, 2, gStringVar4, GetTextSpeedSetting(), nptr, 2, 1, 3);
+}
+
+void AddTextPrinterForMessage(bool8 allowSkippingDelayWithButtonPress)
+{
+ gTextFlags.canABSpeedUpPrint = allowSkippingDelayWithButtonPress;
+ AddTextPrinterParameterized2(0, 2, gStringVar4, GetTextSpeedSetting(), NULL, 2, 1, 3);
+}
+
+void AddTextPrinterWithCustomSpeedForMessage(bool8 allowSkippingDelayWithButtonPress, u8 speed)
+{
+ gTextFlags.canABSpeedUpPrint = allowSkippingDelayWithButtonPress;
+ AddTextPrinterParameterized2(0, 2, gStringVar4, speed, NULL, 2, 1, 3);
+}
+
+void sub_80F6E9C(void)
+{
+ if (gUnknown_203ADFA == 2)
+ {
+ gTextFlags.autoScroll = 1;
+ TextWindow_LoadTilesStdFrame1(0, DLG_WINDOW_BASE_TILE_NUM);
+ }
+ else
+ {
+ Menu_LoadStdPal();
+ TextWindow_LoadResourcesStdFrame0(0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM * 0x10);
+ }
+ TextWindow_SetUserSelectedFrame(0, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM * 0x10);
+}
+
+void DrawDialogueFrame(u8 windowId, bool8 copyToVram)
+{
+ CallWindowFunction(windowId, WindowFunc_DrawDialogueFrame);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
+ PutWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+void DrawStdWindowFrame(u8 windowId, bool8 copyToVram)
+{
+ CallWindowFunction(windowId, WindowFunc_DrawStandardFrame);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
+ PutWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+void ClearDialogWindowAndFrame(u8 windowId, bool8 copyToVram)
+{
+ CallWindowFunction(windowId, WindowFunc_ClearDialogWindowAndFrame);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
+ ClearWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+ if (gUnknown_203ADFA == 2)
+ sub_8111134();
+}
+
+void ClearStdWindowAndFrame(u8 windowId, bool8 copyToVram)
+{
+ CallWindowFunction(windowId, WindowFunc_ClearStdWindowAndFrame);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
+ ClearWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+static void WindowFunc_DrawStandardFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
+{
+ int i;
+
+ FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 0, tilemapLeft - 1, tilemapTop - 1, 1, 1, STD_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 1, tilemapLeft, tilemapTop - 1, width, 1, STD_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 2, tilemapLeft + width, tilemapTop - 1, 1, 1, STD_WINDOW_PALETTE_NUM);
+ for (i = tilemapTop; i < tilemapTop + height; i++)
+ {
+ FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 3, tilemapLeft - 1, i, 1, 1, STD_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 5, tilemapLeft + width, i, 1, 1, STD_WINDOW_PALETTE_NUM);
+ }
+ FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 6, tilemapLeft - 1, tilemapTop + height, 1, 1, STD_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 7, tilemapLeft, tilemapTop + height, width, 1, STD_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 8, tilemapLeft + width, tilemapTop + height, 1, 1, STD_WINDOW_PALETTE_NUM);
+}
+
+static void WindowFunc_DrawDialogueFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
+{
+ if (!IsMsgSignPost() || gUnknown_203ADFA == 2)
+ {
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 0, tilemapLeft - 2, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 1, tilemapLeft - 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 2, tilemapLeft, tilemapTop - 1, width, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 3, tilemapLeft + width, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 4, tilemapLeft + width + 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 5, tilemapLeft - 2, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 6, tilemapLeft - 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 8, tilemapLeft + width, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 9, tilemapLeft + width + 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 10, tilemapLeft - 2, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 11, tilemapLeft - 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 12, tilemapLeft + width, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 13, tilemapLeft + width + 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 10), tilemapLeft - 2, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 11), tilemapLeft - 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 12), tilemapLeft + width, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 13), tilemapLeft + width + 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 5), tilemapLeft - 2, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 6), tilemapLeft - 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 8), tilemapLeft + width, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 9), tilemapLeft + width + 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), tilemapLeft - 2, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1), tilemapLeft - 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 2), tilemapLeft, tilemapTop + 4, width, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 3), tilemapLeft + width, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 4), tilemapLeft + width + 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ }
+ else
+ {
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 0, tilemapLeft - 2, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 1, tilemapLeft - 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 2, tilemapLeft, tilemapTop - 1, width, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 3, tilemapLeft + width, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 4, tilemapLeft + width + 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 5, tilemapLeft - 2, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 6, tilemapLeft - 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 8, tilemapLeft + width, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 9, tilemapLeft + width + 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 10, tilemapLeft - 2, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 11, tilemapLeft - 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 12, tilemapLeft + width, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 13, tilemapLeft + width + 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 5), tilemapLeft - 2, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 6), tilemapLeft - 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 8), tilemapLeft + width, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 9), tilemapLeft + width + 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 10), tilemapLeft - 2, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 11), tilemapLeft - 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 12), tilemapLeft + width, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 13), tilemapLeft + width + 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), tilemapLeft - 2, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1), tilemapLeft - 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 2), tilemapLeft, tilemapTop + 4, width, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 3), tilemapLeft + width, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 4), tilemapLeft + width + 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM);
+ }
+}
+
+static void WindowFunc_ClearStdWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
+{
+ FillBgTilemapBufferRect(bg, 0, tilemapLeft - 1, tilemapTop - 1, width + 2, height + 2, STD_WINDOW_PALETTE_NUM);
+}
+
+static void WindowFunc_ClearDialogWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
+{
+ FillBgTilemapBufferRect(bg, 0, tilemapLeft - 2, tilemapTop - 1, width + 4, height + 2, STD_WINDOW_PALETTE_NUM);
+}
+
+void sub_80F771C(bool8 copyToVram)
+{
+ FillBgTilemapBufferRect(0, 0, 0, 0, 0x20, 0x20, 0x11);
+ if (copyToVram == TRUE)
+ CopyBgTilemapBufferToVram(0);
+}
+
+void SetStdWindowBorderStyle(u8 windowId, bool8 copyToVram)
+{
+ DrawStdFrameWithCustomTileAndPalette(windowId, copyToVram, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM);
+}
+
+void sub_80F7768(u8 windowId, bool8 copyToVram)
+{
+ if (gUnknown_203ADFA == 2)
+ {
+ gTextFlags.autoScroll = 1;
+ TextWindow_LoadTilesStdFrame1(0, DLG_WINDOW_BASE_TILE_NUM);
+ }
+ else
+ {
+ TextWindow_LoadResourcesStdFrame0(windowId, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM * 0x10);
+ }
+ DrawDialogFrameWithCustomTileAndPalette(windowId, copyToVram, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM);
+}
+
+void Menu_LoadStdPal(void)
+{
+ LoadPalette(gTMCaseMainWindowPalette, STD_WINDOW_PALETTE_NUM * 0x10, 0x14);
+}
+
+void Menu_LoadStdPalAt(u16 offset)
+{
+ LoadPalette(gTMCaseMainWindowPalette, offset, 0x14);
+}
+
+static const u16 *GetTmCaseMainWindowPalette(void)
+{
+ return gTMCaseMainWindowPalette;
+}
+
+static u16 GetStdPalColor(u8 colorNum)
+{
+ if (colorNum > 0xF)
+ colorNum = 0;
+ return gTMCaseMainWindowPalette[colorNum];
+}
+
+void DisplayItemMessageOnField(u8 taskId, u8 bgId, const u8 *string, TaskFunc callback)
+{
+ sub_80F6E9C();
+ DisplayMessageAndContinueTask(taskId, 0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM, bgId, GetTextSpeedSetting(), string, callback);
+ CopyWindowToVram(0, 3);
+}
+
+void DisplayYesNoMenuDefaultYes(void)
+{
+ CreateYesNoMenu(&sYesNo_WindowTemplate, 2, 0, 2, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, 0);
+}
+
+void DisplayYesNoMenuDefaultNo(void)
+{
+ CreateYesNoMenu(&sYesNo_WindowTemplate, 2, 0, 2, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, 1);
+}
+
+u8 GetTextSpeedSetting(void)
+{
+ u32 speed;
+ if (gSaveBlock2Ptr->optionsTextSpeed > OPTIONS_TEXT_SPEED_FAST)
+ gSaveBlock2Ptr->optionsTextSpeed = OPTIONS_TEXT_SPEED_MID;
+ return gUnknown_841F428[gSaveBlock2Ptr->optionsTextSpeed];
+}
+
+u8 sub_80F78E0(u8 height)
+{
+ if (sStartMenuWindowId == 0xFF)
+ {
+ struct WindowTemplate template = SetWindowTemplateFields(0, 0x16, 1, 7, height * 2 - 1, DLG_WINDOW_PALETTE_NUM, 0x13D);
+ sStartMenuWindowId = AddWindow(&template);
+ PutWindowTilemap(sStartMenuWindowId);
+ }
+ return sStartMenuWindowId;
+}
+
+u8 GetStartMenuWindowId(void)
+{
+ return sStartMenuWindowId;
+}
+
+void RemoveStartMenuWindow(void)
+{
+ if (sStartMenuWindowId != 0xFF)
+ {
+ RemoveWindow(sStartMenuWindowId);
+ sStartMenuWindowId = 0xFF;
+ }
+}
+
+static u16 GetDlgWindowBaseTileNum(void)
+{
+ return DLG_WINDOW_BASE_TILE_NUM;
+}
+
+u16 GetStdWindowBaseTileNum(void)
+{
+ return STD_WINDOW_BASE_TILE_NUM;
+}
+
+void sub_80F7974(const u8 * text)
+{
+ sub_814FE6C(sub_8112EB4(), DLG_WINDOW_BASE_TILE_NUM, 0x10 * DLG_WINDOW_PALETTE_NUM);
+ sub_8113018(text, 2);
+}
+
+void sub_80F7998(void)
+{
+ sub_8112EDC(2);
+}
+
+void sub_80F79A4(void)
+{
+ Menu_LoadStdPal();
+ sub_814FEEC(0, DLG_WINDOW_BASE_TILE_NUM, 0x10 * DLG_WINDOW_PALETTE_NUM);
+ TextWindow_SetUserSelectedFrame(0, STD_WINDOW_BASE_TILE_NUM, 0x10 * STD_WINDOW_PALETTE_NUM);
+}
+
+void SetDefaultFontsPointer(void)
+{
+ SetFontsPointer(&gFontInfos[0]);
+}
+
+u8 GetFontAttribute(u8 fontId, u8 attributeId)
+{
+ int result = 0;
+
+ switch (attributeId)
+ {
+ case FONTATTR_MAX_LETTER_WIDTH:
+ result = gFontInfos[fontId].maxLetterWidth;
+ break;
+ case FONTATTR_MAX_LETTER_HEIGHT:
+ result = gFontInfos[fontId].maxLetterHeight;
+ break;
+ case FONTATTR_LETTER_SPACING:
+ result = gFontInfos[fontId].letterSpacing;
+ break;
+ case FONTATTR_LINE_SPACING:
+ result = gFontInfos[fontId].lineSpacing;
+ break;
+ case FONTATTR_UNKNOWN:
+ result = gFontInfos[fontId].unk;
+ break;
+ case FONTATTR_COLOR_FOREGROUND:
+ result = gFontInfos[fontId].fgColor;
+ break;
+ case FONTATTR_COLOR_BACKGROUND:
+ result = gFontInfos[fontId].bgColor;
+ break;
+ case FONTATTR_COLOR_SHADOW:
+ result = gFontInfos[fontId].shadowColor;
+ break;
+ }
+ return result;
+}
+
+u8 GetMenuCursorDimensionByFont(u8 fontId, u8 whichDimension)
+{
+ return gMenuCursorDimensions[fontId][whichDimension];
+}
diff --git a/src/oak_speech.c b/src/oak_speech.c
index 75f636041..c00335136 100644
--- a/src/oak_speech.c
+++ b/src/oak_speech.c
@@ -14,7 +14,7 @@
#include "menu.h"
#include "help_system.h"
#include "new_menu_helpers.h"
-#include "pokemon_3.h"
+#include "pokemon.h"
#include "sound.h"
#include "event_scripts.h"
#include "scanline_effect.h"
@@ -37,7 +37,7 @@ struct OakSpeechResources
u16 unk_0010;
u16 unk_0012;
u16 unk_0014[4];
- u8 unk_001C[3];
+ struct TextColor textColor;
u8 textSpeed;
u8 filler_0020[0x1800];
u8 bg2TilemapBuffer[0x400];
@@ -495,12 +495,12 @@ static void Task_OaksSpeech1(u8 taskId)
ScanlineEffect_Stop();
ResetSpriteData();
FreeAllSpritePalettes();
- reset_temp_tile_data_buffers();
+ ResetTempTileDataBuffers();
HelpSystem_SetSomeVariable2(2);
break;
case 1:
sOakSpeechResources = AllocZeroed(sizeof(*sOakSpeechResources));
- SetUpMonSpriteManagerMaybe(1, 1);
+ OakSpeechNidoranFSetup(1, 1);
break;
case 2:
SetGpuReg(REG_OFFSET_WIN0H, 0);
@@ -536,17 +536,17 @@ static void Task_OaksSpeech1(u8 taskId)
case 5:
sOakSpeechResources->textSpeed = GetTextSpeedSetting();
gTextFlags.canABSpeedUpPrint = TRUE;
- decompress_and_copy_tile_data_to_vram(1, sOakSpeechGfx_GameStartHelpUI, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(1, sOakSpeechGfx_GameStartHelpUI, 0, 0, 0);
break;
case 6:
- if (free_temp_tile_data_buffers_if_possible())
+ if (FreeTempTileDataBuffersIfPossible())
return;
ClearDialogWindowAndFrame(0, 1);
FillBgTilemapBufferRect_Palette0(1, 0x0000, 0, 0, 32, 32);
CopyBgTilemapBufferToVram(1);
break;
case 7:
- CreateWindow_SnapRight_StdPal(0, 30, 0, 13, 0x1C4);
+ CreateTopBarWindowLoadPalette(0, 30, 0, 13, 0x1C4);
FillBgTilemapBufferRect_Palette0(1, 0xD00F, 0, 0, 30, 2);
FillBgTilemapBufferRect_Palette0(1, 0xD002, 0, 2, 30, 1);
FillBgTilemapBufferRect_Palette0(1, 0xD00E, 0, 19, 30, 1);
@@ -572,11 +572,11 @@ static void Task_OaksSpeech1(u8 taskId)
static void CreateHelpDocsPage1(void)
{
- Menu_PrintHelpSystemUIHeader(gText_Controls, gText_ABUTTONNext, 0, 0, 1);
+ TopBarWindowPrintTwoStrings(gText_Controls, gText_ABUTTONNext, 0, 0, 1);
sOakSpeechResources->unk_0014[0] = AddWindow(sHelpDocsWindowTemplatePtrs[sOakSpeechResources->unk_0012]);
PutWindowTilemap(sOakSpeechResources->unk_0014[0]);
FillWindowPixelBuffer(sOakSpeechResources->unk_0014[0], 0x00);
- AddTextPrinterParametrized2(sOakSpeechResources->unk_0014[0], 2, 2, 0, 1, 1, &sTextColor_HelpSystem, 0, gNewGame_HelpDocs1);
+ AddTextPrinterParameterized4(sOakSpeechResources->unk_0014[0], 2, 2, 0, 1, 1, &sTextColor_HelpSystem, 0, gNewGame_HelpDocs1);
CopyWindowToVram(sOakSpeechResources->unk_0014[0], 3);
FillBgTilemapBufferRect_Palette0(1, 0x3000, 1, 3, 5, 16);
CopyBgTilemapBufferToVram(1);
@@ -592,13 +592,13 @@ static void Task_OakSpeech4(u8 taskId)
}
else
{
- PrintTextOnRightSnappedWindow(gText_ABUTTONNext_BBUTTONBack, 0, 1);
+ TopBarWindowPrintString(gText_ABUTTONNext_BBUTTONBack, 0, 1);
for (i = 0; i < 3; i++)
{
sOakSpeechResources->unk_0014[i] = AddWindow(&sHelpDocsWindowTemplatePtrs[sOakSpeechResources->unk_0012][i]);
PutWindowTilemap(sOakSpeechResources->unk_0014[i]);
FillWindowPixelBuffer(sOakSpeechResources->unk_0014[i], 0x00);
- AddTextPrinterParametrized2(sOakSpeechResources->unk_0014[i], 2, 6, 0, 1, 1, &sTextColor_HelpSystem, 0, sHelpDocsPtrs[i + r7 * 3]);
+ AddTextPrinterParameterized4(sOakSpeechResources->unk_0014[i], 2, 6, 0, 1, 1, &sTextColor_HelpSystem, 0, sHelpDocsPtrs[i + r7 * 3]);
CopyWindowToVram(sOakSpeechResources->unk_0014[i], 3);
}
@@ -716,9 +716,9 @@ static void Task_OakSpeech6(u8 taskId)
else
{
PlayBGM(BGM_FRLG_GAME_EXPLANATION_MIDDLE);
- sub_810F71C();
- PrintTextOnRightSnappedWindow(gText_ABUTTONNext, 0, 1);
- sOakSpeechResources->unk_0008 = malloc_and_decompress(sNewGameAdventureIntroTilemap, &sp14);
+ ClearTopBarWindow();
+ TopBarWindowPrintString(gText_ABUTTONNext, 0, 1);
+ sOakSpeechResources->unk_0008 = MallocAndDecompress(sNewGameAdventureIntroTilemap, &sp14);
CopyToBgTilemapBufferRect(1, sOakSpeechResources->unk_0008, 0, 2, 30, 19);
CopyBgTilemapBufferToVram(1);
Free(sOakSpeechResources->unk_0008);
@@ -730,7 +730,7 @@ static void Task_OakSpeech6(u8 taskId)
sOakSpeechResources->unk_0012 = 0;
gMain.state = 0;
data[15] = 16;
- AddTextPrinterParametrized2(data[14], 2, 3, 5, 1, 0, &sTextColor_OakSpeech, 0, sNewGameAdventureIntroTextPointers[0]);
+ AddTextPrinterParameterized4(data[14], 2, 3, 5, 1, 0, &sTextColor_OakSpeech, 0, sNewGameAdventureIntroTextPointers[0]);
data[5] = CreateTextCursorSpriteForOakSpeech(0, 0xe2, 0x91, 0, 0);
gSprites[data[5]].oam.objMode = ST_OAM_OBJ_BLEND;
gSprites[data[5]].oam.priority = 0;
@@ -790,16 +790,16 @@ static void Task_OakSpeech7(u8 taskId)
if (data[15] <= 0)
{
FillWindowPixelBuffer(data[14], 0x00);
- AddTextPrinterParametrized2(data[14], 2, 3, 5, 1, 0, &sTextColor_OakSpeech, 0, sNewGameAdventureIntroTextPointers[sOakSpeechResources->unk_0012]);
+ AddTextPrinterParameterized4(data[14], 2, 3, 5, 1, 0, &sTextColor_OakSpeech, 0, sNewGameAdventureIntroTextPointers[sOakSpeechResources->unk_0012]);
if (sOakSpeechResources->unk_0012 == 0)
{
- sub_810F71C();
- PrintTextOnRightSnappedWindow(gText_ABUTTONNext, 0, 1);
+ ClearTopBarWindow();
+ TopBarWindowPrintString(gText_ABUTTONNext, 0, 1);
}
else
{
- sub_810F71C();
- PrintTextOnRightSnappedWindow(gText_ABUTTONNext_BBUTTONBack, 0, 1);
+ ClearTopBarWindow();
+ TopBarWindowPrintString(gText_ABUTTONNext_BBUTTONBack, 0, 1);
}
gMain.state++;
}
@@ -846,7 +846,7 @@ static void Task_OakSpeech8(u8 taskId)
if (!gPaletteFade.active)
{
- sub_810F740();
+ DestroyTopBarWindow();
FillWindowPixelBuffer(data[14], 0x00);
ClearWindowTilemap(data[14]);
CopyWindowToVram(data[14], 3);
@@ -869,7 +869,7 @@ static void Task_OakSpeech9(u8 taskId)
data[3]--;
else
{
- sOakSpeechResources->solidColorsGfx = malloc_and_decompress(sOakSpeechGfx_SolidColors, &size);
+ sOakSpeechResources->solidColorsGfx = MallocAndDecompress(sOakSpeechGfx_SolidColors, &size);
LoadBgTiles(1, sOakSpeechResources->solidColorsGfx, size, 0);
CopyToBgTilemapBuffer(1, sOakSpeech_BackgroundTilemap, 0, 0);
CopyBgTilemapBufferToVram(1);
@@ -889,11 +889,11 @@ static void Task_OakSpeech9(u8 taskId)
if (str != gStringVar4) \
{ \
StringExpandPlaceholders(gStringVar4, str); \
- AddTextPrinterParametrized(0, 4, gStringVar4, speed, NULL, 2, 1, 3); \
+ AddTextPrinterParameterized2(0, 4, gStringVar4, speed, NULL, 2, 1, 3); \
} \
else \
{ \
- AddTextPrinterParametrized(0, 4, str, speed, NULL, 2, 1, 3); \
+ AddTextPrinterParameterized2(0, 4, str, speed, NULL, 2, 1, 3); \
} \
CopyWindowToVram(0, 3); \
})
@@ -1054,17 +1054,17 @@ static void Task_OakSpeech19(u8 taskId)
{
gTasks[taskId].data[13] = AddWindow(&sNewGameAdventureIntroWindowTemplates[1]);
PutWindowTilemap(gTasks[taskId].data[13]);
- SetWindowBorderStyle(gTasks[taskId].data[13], 1, sub_80F796C(), 14);
+ DrawStdFrameWithCustomTileAndPalette(gTasks[taskId].data[13], 1, GetStdWindowBaseTileNum(), 14);
FillWindowPixelBuffer(gTasks[taskId].data[13], 0x11);
- sOakSpeechResources->unk_001C[0] = 1;
- sOakSpeechResources->unk_001C[1] = 2;
- sOakSpeechResources->unk_001C[2] = 3;
- box_print(gTasks[taskId].data[13], 2, 8, 1, sOakSpeechResources->unk_001C, 0, gText_Boy);
- sOakSpeechResources->unk_001C[0] = 1;
- sOakSpeechResources->unk_001C[1] = 2;
- sOakSpeechResources->unk_001C[2] = 3;
- box_print(gTasks[taskId].data[13], 2, 8, 17, sOakSpeechResources->unk_001C, 0, gText_Girl);
- ProgramAndPlaceMenuCursorOnWindow(gTasks[taskId].data[13], 2, 0, 1, GetFontAttribute(2, 1) + 2, 2, 0);
+ sOakSpeechResources->textColor.fgColor = 1;
+ sOakSpeechResources->textColor.bgColor = 2;
+ sOakSpeechResources->textColor.shadowColor = 3;
+ AddTextPrinterParameterized3(gTasks[taskId].data[13], 2, 8, 1, &sOakSpeechResources->textColor, 0, gText_Boy);
+ sOakSpeechResources->textColor.fgColor = 1;
+ sOakSpeechResources->textColor.bgColor = 2;
+ sOakSpeechResources->textColor.shadowColor = 3;
+ AddTextPrinterParameterized3(gTasks[taskId].data[13], 2, 8, 17, &sOakSpeechResources->textColor, 0, gText_Girl);
+ Menu_InitCursor(gTasks[taskId].data[13], 2, 0, 1, GetFontAttribute(2, 1) + 2, 2, 0);
CopyWindowToVram(gTasks[taskId].data[13], 3);
gTasks[taskId].func = Task_OakSpeech20;
}
@@ -1072,7 +1072,7 @@ static void Task_OakSpeech19(u8 taskId)
static void Task_OakSpeech20(u8 taskId)
{
- s8 input = ProcessMenuInputNoWrapAround();
+ s8 input = Menu_ProcessInputNoWrapAround();
switch (input)
{
case 0:
@@ -1092,7 +1092,7 @@ static void Task_OakSpeech20(u8 taskId)
static void Task_OakSpeech21(u8 taskId)
{
s16 * data = gTasks[taskId].data;
- sub_810F4D8(data[13], 1);
+ ClearStdWindowAndFrameToTransparent(data[13], 1);
RemoveWindow(data[13]);
data[13] = 0;
ClearDialogWindowAndFrame(0, 1);
@@ -1176,7 +1176,7 @@ static void Task_OakSpeech28(u8 taskId)
static void Task_OakSpeech29(u8 taskId)
{
s16 * data = gTasks[taskId].data;
- s8 input = ProcessMenuInput();
+ s8 input = Menu_ProcessInput();
switch (input)
{
case 1:
@@ -1184,7 +1184,7 @@ static void Task_OakSpeech29(u8 taskId)
case 3:
case 4:
PlaySE(SE_SELECT);
- sub_810F4D8(data[13], TRUE);
+ ClearStdWindowAndFrameToTransparent(data[13], TRUE);
RemoveWindow(data[13]);
GetDefaultName(sOakSpeechResources->unk_0010, input - 1);
data[15] = 1;
@@ -1211,7 +1211,7 @@ static void Task_OakSpeech25(u8 taskId)
}
else
{
- sub_810F4D8(gTasks[taskId].data[13], 1);
+ ClearStdWindowAndFrameToTransparent(gTasks[taskId].data[13], 1);
RemoveWindow(gTasks[taskId].data[13]);
DoNamingScreen(4, gSaveBlock1Ptr->rivalName, 0, 0, 0, CB2_ReturnFromNamingScreen);
}
@@ -1246,7 +1246,7 @@ static void Task_OakSpeech26(u8 taskId)
data[3]--;
else
{
- CreateYesNoMenu(&sNewGameAdventureIntroWindowTemplates[2], 2, 0, 2, sub_80F796C(), 14, 0);
+ CreateYesNoMenu(&sNewGameAdventureIntroWindowTemplates[2], 2, 0, 2, GetStdWindowBaseTileNum(), 14, 0);
gTasks[taskId].func = Task_OakSpeech27;
}
}
@@ -1513,7 +1513,7 @@ static void Task_OakSpeech41(u8 taskId)
static void Task_OakSpeech42(u8 taskId)
{
FreeAllWindowBuffers();
- sub_8044D80();
+ OakSpeechNidoranFFreeResources();
Free(sOakSpeechResources);
sOakSpeechResources = NULL;
gTextFlags.canABSpeedUpPrint = FALSE;
@@ -1536,7 +1536,7 @@ static void CB2_ReturnFromNamingScreen(void)
ScanlineEffect_Stop();
ResetSpriteData();
FreeAllSpritePalettes();
- reset_temp_tile_data_buffers();
+ ResetTempTileDataBuffers();
break;
case 1:
ResetBgsAndClearDma3BusyFlags(0);
@@ -1564,10 +1564,10 @@ static void CB2_ReturnFromNamingScreen(void)
LoadPalette(sHelpDocsPalette, 0, 0xe0);
break;
case 4:
- decompress_and_copy_tile_data_to_vram(1, sOakSpeechGfx_SolidColors, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(1, sOakSpeechGfx_SolidColors, 0, 0, 0);
break;
case 5:
- if (free_temp_tile_data_buffers_if_possible())
+ if (FreeTempTileDataBuffersIfPossible())
return;
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
CopyToBgTilemapBuffer(1, sOakSpeech_BackgroundTilemap, 0, 0);
@@ -1612,8 +1612,8 @@ static void CreateNidoranFSprite(u8 taskId)
{
u8 spriteId;
- DecompressPicFromTable(gUnknown_8235194, sub_8044E00(0), SPECIES_NIDORAN_F);
- sub_800F078(&gUnknown_82373F4);
+ DecompressPicFromTable(gUnknown_8235194, OakSpeechNidoranFGetBuffer(0), SPECIES_NIDORAN_F);
+ LoadCompressedSpritePaletteUsingHeap(&gUnknown_82373F4);
SetMultiuseSpriteTemplateToPokemon(SPECIES_NIDORAN_F, 0);
spriteId = CreateSprite(&gMultiuseSpriteTemplate, 0x60, 0x60, 1);
gSprites[spriteId].callback = SpriteCallbackDummy;
@@ -1635,9 +1635,9 @@ static void CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(u8 taskId, u8 st
switch (state)
{
case 0:
- LoadCompressedObjectPic(&sOakSpeech_PikaSpriteSheets[0]);
- LoadCompressedObjectPic(&sOakSpeech_PikaSpriteSheets[1]);
- LoadCompressedObjectPic(&sOakSpeech_PikaSpriteSheets[2]);
+ LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[0]);
+ LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[1]);
+ LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[2]);
LoadSpritePalette(&sOakSpeech_PikaSpritePal);
spriteId = CreateSprite(&sOakSpeech_PikaSpriteTemplates[0], 0x10, 0x11, 2);
gSprites[spriteId].oam.priority = 0;
@@ -1654,7 +1654,7 @@ static void CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(u8 taskId, u8 st
gTasks[taskId].data[9] = spriteId;
break;
case 1:
- LoadCompressedObjectPic(&sOakSpeech_GrassPlatformSpriteSheet);
+ LoadCompressedSpriteSheet(&sOakSpeech_GrassPlatformSpriteSheet);
LoadSpritePalette(&sOakSpeech_GrassPlatformSpritePal);
for (i = 0; i < 3; i++)
{
@@ -1850,7 +1850,7 @@ static void PrintNameChoiceOptions(u8 taskId, u8 state)
data[13] = AddWindow(&sNewGameAdventureIntroWindowTemplates[3]);
PutWindowTilemap(data[13]);
- SetWindowBorderStyle(data[13], 1, sub_80F796C(), 14);
+ DrawStdFrameWithCustomTileAndPalette(data[13], 1, GetStdWindowBaseTileNum(), 14);
FillWindowPixelBuffer(gTasks[taskId].data[13], 0x11);
AddTextPrinterParameterized(data[13], 2, gOtherText_NewName, 8, 1, 0, NULL);
if (state == 0)
@@ -1861,7 +1861,7 @@ static void PrintNameChoiceOptions(u8 taskId, u8 state)
{
AddTextPrinterParameterized(data[13], 2, textPtrs[i], 8, 16 * (i + 1) + 1, 0, NULL);
}
- ProgramAndPlaceMenuCursorOnWindow(data[13], 2, 0, 1, 16, 5, 0);
+ Menu_InitCursor(data[13], 2, 0, 1, 16, 5, 0);
CopyWindowToVram(data[13], 3);
}
diff --git a/src/play_time.c b/src/play_time.c
new file mode 100644
index 000000000..04f4b2040
--- /dev/null
+++ b/src/play_time.c
@@ -0,0 +1,65 @@
+#include "play_time.h"
+
+static IWRAM_DATA u8 sPlayTimeCounterState;
+
+enum
+{
+ STOPPED,
+ RUNNING,
+ MAXED_OUT,
+};
+
+void PlayTimeCounter_Reset(void)
+{
+ sPlayTimeCounterState = STOPPED;
+ gSaveBlock2Ptr->playTimeHours = 0;
+ gSaveBlock2Ptr->playTimeMinutes = 0;
+ gSaveBlock2Ptr->playTimeSeconds = 0;
+ gSaveBlock2Ptr->playTimeVBlanks = 0;
+}
+
+void PlayTimeCounter_Start(void)
+{
+ sPlayTimeCounterState = RUNNING;
+ if (gSaveBlock2Ptr->playTimeHours > 999)
+ PlayTimeCounter_SetToMax();
+}
+
+void PlayTimeCounter_Stop(void)
+{
+ sPlayTimeCounterState = STOPPED;
+}
+
+void PlayTimeCounter_Update(void)
+{
+ if (sPlayTimeCounterState == RUNNING)
+ {
+ gSaveBlock2Ptr->playTimeVBlanks++;
+ if (gSaveBlock2Ptr->playTimeVBlanks > 59)
+ {
+ gSaveBlock2Ptr->playTimeVBlanks = 0;
+ gSaveBlock2Ptr->playTimeSeconds++;
+ if (gSaveBlock2Ptr->playTimeSeconds > 59)
+ {
+ gSaveBlock2Ptr->playTimeSeconds = 0;
+ gSaveBlock2Ptr->playTimeMinutes++;
+ if (gSaveBlock2Ptr->playTimeMinutes > 59)
+ {
+ gSaveBlock2Ptr->playTimeMinutes = 0;
+ gSaveBlock2Ptr->playTimeHours++;
+ if (gSaveBlock2Ptr->playTimeHours > 999)
+ PlayTimeCounter_SetToMax();
+ }
+ }
+ }
+ }
+}
+
+void PlayTimeCounter_SetToMax(void)
+{
+ sPlayTimeCounterState = MAXED_OUT;
+ gSaveBlock2Ptr->playTimeHours = 999;
+ gSaveBlock2Ptr->playTimeMinutes = 59;
+ gSaveBlock2Ptr->playTimeSeconds = 59;
+ gSaveBlock2Ptr->playTimeVBlanks = 59;
+}
diff --git a/src/pokemon.c b/src/pokemon.c
index 3a9fdbf04..b948e4033 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -5,8 +5,10 @@
#include "random.h"
#include "main.h"
#include "text.h"
+#include "data2.h"
#include "string_util.h"
#include "battle.h"
+#include "battle_2.h"
#include "item.h"
#include "event_data.h"
#include "util.h"
@@ -16,15 +18,27 @@
#include "battle_controllers.h"
#include "evolution_scene.h"
#include "battle_message.h"
+#include "battle_util.h"
+#include "battle_ai_script_commands.h"
#include "link.h"
#include "m4a.h"
#include "sound.h"
+#include "pokedex.h"
+#include "strings.h"
+#include "malloc.h"
+#include "overworld.h"
+#include "party_menu.h"
+#include "field_specials.h"
#include "constants/items.h"
+#include "constants/item_effects.h"
#include "constants/species.h"
+#include "constants/hoenn_cries.h"
#include "constants/pokemon.h"
#include "constants/abilities.h"
#include "constants/flags.h"
#include "constants/moves.h"
+#include "constants/trainer_classes.h"
+#include "constants/facility_trainer_classes.h"
#include "constants/hold_effects.h"
#include "constants/battle_move_effects.h"
@@ -34,63 +48,1605 @@
// Extracts the lower 16 bits of a 32-bit number
#define LOHALF(n) ((n) & 0xFFFF)
-// TODO: what is this
-struct UnkStruct20244F4
+#define SPECIES_TO_HOENN(name) [SPECIES_##name - 1] = HOENN_DEX_##name
+#define SPECIES_TO_NATIONAL(name) [SPECIES_##name - 1] = NATIONAL_DEX_##name
+#define HOENN_TO_NATIONAL(name) [HOENN_DEX_##name - 1] = NATIONAL_DEX_##name
+
+struct OakSpeechNidoranFStruct
{
- u8 unk0:4;
- u8 unk0_2:4;
- u8 filler1[0xF];
- struct SpriteTemplate *unk10;
+ u8 spriteCount:4;
+ u8 battlePosition:4;
+ u8 frameCount;
+ u8 enable;
+ bool8 enable2;
+ u32 sizePerSprite;
+ u8 *dataBuffer;
+ u8 **bufferPtrs;
+ struct SpriteTemplate *templates;
+ struct SpriteFrameImage *frameImages;
};
-// External symbols
-extern struct UnkStruct20244F4 *gUnknown_20244F4;
-extern struct SpriteTemplate gUnknown_825DEF0[];
-extern struct SpriteTemplate gUnknown_825DF50[];
-extern const union AnimCmd *const *const gTrainerBackAnimsPtrTable[];
-extern struct SpriteTemplate gUnknown_825DEF0[];
-extern const union AnimCmd *const *const gTrainerFrontAnimsPtrTable[];
-extern const union AnimCmd *const gUnknown_82349BC[];
-extern const u8 gUnknown_825DEA1[];
-extern const u8 gPPUpWriteMasks[];
-extern u8 *gUnknown_83FD5D0[];
-extern const u8 gUnknown_825DFF0[];
-extern const u8 gText_EggNickname[];
-extern const u8 gText_BadEgg[];
-extern const u8 BattleText_Rose[];
-extern const u8 BattleText_UnknownString3[];
-extern const u8 BattleText_GetPumped[];
-extern const u8 BattleText_MistShroud[];
-extern const u8 gText_PkmnsXPreventsSwitching[];
-extern const u8 sHoldEffectToType[][2];
+// TODO: move sLearningMoveTableID, gPlayerPartyCount, gEnemyPartyCount,
+// gEnemyParty, gPlayerParty here after resolving symbol ref in between.
extern u8 sLearningMoveTableID;
-extern const u8 sSecretBaseFacilityClasses[2][5];
-extern u16 gUnknown_8251CB8[];
-extern u16 gUnknown_8251FEE[];
-extern u16 gUnknown_8252324[];
-extern u16 gUnknown_82539D4[];
-extern struct SpindaSpot gSpindaSpotGraphics[];
-extern s8 gNatureStatTable[][5];
-extern const s8 sFriendshipEventDeltas[][3];
-extern u32 gTMHMLearnsets[][2];
-extern u8 gBattleMonForms[4];
-extern const struct CompressedSpritePalette gMonPaletteTable[];
-extern const struct CompressedSpritePalette gMonShinyPaletteTable[];
-extern const u16 sHMMoves[];
-extern s8 gPokeblockFlavorCompatibilityTable[];
-
-// External functions
-extern u8 GetCurrentRegionMapSectionId(void); // overworld
-extern const struct BattleMove gBattleMoves[];
-extern u8 sBattler_AI; // battle_ai
-extern void set_unknown_box_id(u8); // field_specials
-extern u8 pokemon_order_func(u8);
-extern u16 get_unknown_box_id(void); // field_specials
-extern u8 StorageGetCurrentBox(void); // pokemon_storage_system
-extern void sub_80174B8(u8 battlerId);
-
-union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType);
-s32 GetDeoxysStat(struct Pokemon *mon, s32 statId);
+EWRAM_DATA struct SpriteTemplate gMultiuseSpriteTemplate = {0};
+static EWRAM_DATA struct OakSpeechNidoranFStruct *sOakSpeechNidoranResources = NULL;
+
+static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType);
+static u16 GetDeoxysStat(struct Pokemon *mon, s32 statId);
+static bool8 IsShinyOtIdPersonality(u32 otId, u32 personality);
+static u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex);
+static u8 GetNatureFromPersonality(u32 personality);
+static bool8 sub_8042BE8(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId);
+static bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId);
+static bool8 IsPokemonStorageFull(void);
+static u8 SendMonToPC(struct Pokemon* mon);
+static void EncryptBoxMon(struct BoxPokemon *boxMon);
+static void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move);
+static void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon);
+static u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move);
+static u8 GetLevelFromMonExp(struct Pokemon *mon);
+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 };
+
+static const u16 sSpeciesToHoennPokedexNum[] = // Assigns all species to the Hoenn Dex Index (Summary No. for Hoenn Dex)
+{
+ SPECIES_TO_HOENN(BULBASAUR),
+ SPECIES_TO_HOENN(IVYSAUR),
+ SPECIES_TO_HOENN(VENUSAUR),
+ SPECIES_TO_HOENN(CHARMANDER),
+ SPECIES_TO_HOENN(CHARMELEON),
+ SPECIES_TO_HOENN(CHARIZARD),
+ SPECIES_TO_HOENN(SQUIRTLE),
+ SPECIES_TO_HOENN(WARTORTLE),
+ SPECIES_TO_HOENN(BLASTOISE),
+ SPECIES_TO_HOENN(CATERPIE),
+ SPECIES_TO_HOENN(METAPOD),
+ SPECIES_TO_HOENN(BUTTERFREE),
+ SPECIES_TO_HOENN(WEEDLE),
+ SPECIES_TO_HOENN(KAKUNA),
+ SPECIES_TO_HOENN(BEEDRILL),
+ SPECIES_TO_HOENN(PIDGEY),
+ SPECIES_TO_HOENN(PIDGEOTTO),
+ SPECIES_TO_HOENN(PIDGEOT),
+ SPECIES_TO_HOENN(RATTATA),
+ SPECIES_TO_HOENN(RATICATE),
+ SPECIES_TO_HOENN(SPEAROW),
+ SPECIES_TO_HOENN(FEAROW),
+ SPECIES_TO_HOENN(EKANS),
+ SPECIES_TO_HOENN(ARBOK),
+ SPECIES_TO_HOENN(PIKACHU),
+ SPECIES_TO_HOENN(RAICHU),
+ SPECIES_TO_HOENN(SANDSHREW),
+ SPECIES_TO_HOENN(SANDSLASH),
+ SPECIES_TO_HOENN(NIDORAN_F),
+ SPECIES_TO_HOENN(NIDORINA),
+ SPECIES_TO_HOENN(NIDOQUEEN),
+ SPECIES_TO_HOENN(NIDORAN_M),
+ SPECIES_TO_HOENN(NIDORINO),
+ SPECIES_TO_HOENN(NIDOKING),
+ SPECIES_TO_HOENN(CLEFAIRY),
+ SPECIES_TO_HOENN(CLEFABLE),
+ SPECIES_TO_HOENN(VULPIX),
+ SPECIES_TO_HOENN(NINETALES),
+ SPECIES_TO_HOENN(JIGGLYPUFF),
+ SPECIES_TO_HOENN(WIGGLYTUFF),
+ SPECIES_TO_HOENN(ZUBAT),
+ SPECIES_TO_HOENN(GOLBAT),
+ SPECIES_TO_HOENN(ODDISH),
+ SPECIES_TO_HOENN(GLOOM),
+ SPECIES_TO_HOENN(VILEPLUME),
+ SPECIES_TO_HOENN(PARAS),
+ SPECIES_TO_HOENN(PARASECT),
+ SPECIES_TO_HOENN(VENONAT),
+ SPECIES_TO_HOENN(VENOMOTH),
+ SPECIES_TO_HOENN(DIGLETT),
+ SPECIES_TO_HOENN(DUGTRIO),
+ SPECIES_TO_HOENN(MEOWTH),
+ SPECIES_TO_HOENN(PERSIAN),
+ SPECIES_TO_HOENN(PSYDUCK),
+ SPECIES_TO_HOENN(GOLDUCK),
+ SPECIES_TO_HOENN(MANKEY),
+ SPECIES_TO_HOENN(PRIMEAPE),
+ SPECIES_TO_HOENN(GROWLITHE),
+ SPECIES_TO_HOENN(ARCANINE),
+ SPECIES_TO_HOENN(POLIWAG),
+ SPECIES_TO_HOENN(POLIWHIRL),
+ SPECIES_TO_HOENN(POLIWRATH),
+ SPECIES_TO_HOENN(ABRA),
+ SPECIES_TO_HOENN(KADABRA),
+ SPECIES_TO_HOENN(ALAKAZAM),
+ SPECIES_TO_HOENN(MACHOP),
+ SPECIES_TO_HOENN(MACHOKE),
+ SPECIES_TO_HOENN(MACHAMP),
+ SPECIES_TO_HOENN(BELLSPROUT),
+ SPECIES_TO_HOENN(WEEPINBELL),
+ SPECIES_TO_HOENN(VICTREEBEL),
+ SPECIES_TO_HOENN(TENTACOOL),
+ SPECIES_TO_HOENN(TENTACRUEL),
+ SPECIES_TO_HOENN(GEODUDE),
+ SPECIES_TO_HOENN(GRAVELER),
+ SPECIES_TO_HOENN(GOLEM),
+ SPECIES_TO_HOENN(PONYTA),
+ SPECIES_TO_HOENN(RAPIDASH),
+ SPECIES_TO_HOENN(SLOWPOKE),
+ SPECIES_TO_HOENN(SLOWBRO),
+ SPECIES_TO_HOENN(MAGNEMITE),
+ SPECIES_TO_HOENN(MAGNETON),
+ SPECIES_TO_HOENN(FARFETCHD),
+ SPECIES_TO_HOENN(DODUO),
+ SPECIES_TO_HOENN(DODRIO),
+ SPECIES_TO_HOENN(SEEL),
+ SPECIES_TO_HOENN(DEWGONG),
+ SPECIES_TO_HOENN(GRIMER),
+ SPECIES_TO_HOENN(MUK),
+ SPECIES_TO_HOENN(SHELLDER),
+ SPECIES_TO_HOENN(CLOYSTER),
+ SPECIES_TO_HOENN(GASTLY),
+ SPECIES_TO_HOENN(HAUNTER),
+ SPECIES_TO_HOENN(GENGAR),
+ SPECIES_TO_HOENN(ONIX),
+ SPECIES_TO_HOENN(DROWZEE),
+ SPECIES_TO_HOENN(HYPNO),
+ SPECIES_TO_HOENN(KRABBY),
+ SPECIES_TO_HOENN(KINGLER),
+ SPECIES_TO_HOENN(VOLTORB),
+ SPECIES_TO_HOENN(ELECTRODE),
+ SPECIES_TO_HOENN(EXEGGCUTE),
+ SPECIES_TO_HOENN(EXEGGUTOR),
+ SPECIES_TO_HOENN(CUBONE),
+ SPECIES_TO_HOENN(MAROWAK),
+ SPECIES_TO_HOENN(HITMONLEE),
+ SPECIES_TO_HOENN(HITMONCHAN),
+ SPECIES_TO_HOENN(LICKITUNG),
+ SPECIES_TO_HOENN(KOFFING),
+ SPECIES_TO_HOENN(WEEZING),
+ SPECIES_TO_HOENN(RHYHORN),
+ SPECIES_TO_HOENN(RHYDON),
+ SPECIES_TO_HOENN(CHANSEY),
+ SPECIES_TO_HOENN(TANGELA),
+ SPECIES_TO_HOENN(KANGASKHAN),
+ SPECIES_TO_HOENN(HORSEA),
+ SPECIES_TO_HOENN(SEADRA),
+ SPECIES_TO_HOENN(GOLDEEN),
+ SPECIES_TO_HOENN(SEAKING),
+ SPECIES_TO_HOENN(STARYU),
+ SPECIES_TO_HOENN(STARMIE),
+ SPECIES_TO_HOENN(MR_MIME),
+ SPECIES_TO_HOENN(SCYTHER),
+ SPECIES_TO_HOENN(JYNX),
+ SPECIES_TO_HOENN(ELECTABUZZ),
+ SPECIES_TO_HOENN(MAGMAR),
+ SPECIES_TO_HOENN(PINSIR),
+ SPECIES_TO_HOENN(TAUROS),
+ SPECIES_TO_HOENN(MAGIKARP),
+ SPECIES_TO_HOENN(GYARADOS),
+ SPECIES_TO_HOENN(LAPRAS),
+ SPECIES_TO_HOENN(DITTO),
+ SPECIES_TO_HOENN(EEVEE),
+ SPECIES_TO_HOENN(VAPOREON),
+ SPECIES_TO_HOENN(JOLTEON),
+ SPECIES_TO_HOENN(FLAREON),
+ SPECIES_TO_HOENN(PORYGON),
+ SPECIES_TO_HOENN(OMANYTE),
+ SPECIES_TO_HOENN(OMASTAR),
+ SPECIES_TO_HOENN(KABUTO),
+ SPECIES_TO_HOENN(KABUTOPS),
+ SPECIES_TO_HOENN(AERODACTYL),
+ SPECIES_TO_HOENN(SNORLAX),
+ SPECIES_TO_HOENN(ARTICUNO),
+ SPECIES_TO_HOENN(ZAPDOS),
+ SPECIES_TO_HOENN(MOLTRES),
+ SPECIES_TO_HOENN(DRATINI),
+ SPECIES_TO_HOENN(DRAGONAIR),
+ SPECIES_TO_HOENN(DRAGONITE),
+ SPECIES_TO_HOENN(MEWTWO),
+ SPECIES_TO_HOENN(MEW),
+ SPECIES_TO_HOENN(CHIKORITA),
+ SPECIES_TO_HOENN(BAYLEEF),
+ SPECIES_TO_HOENN(MEGANIUM),
+ SPECIES_TO_HOENN(CYNDAQUIL),
+ SPECIES_TO_HOENN(QUILAVA),
+ SPECIES_TO_HOENN(TYPHLOSION),
+ SPECIES_TO_HOENN(TOTODILE),
+ SPECIES_TO_HOENN(CROCONAW),
+ SPECIES_TO_HOENN(FERALIGATR),
+ SPECIES_TO_HOENN(SENTRET),
+ SPECIES_TO_HOENN(FURRET),
+ SPECIES_TO_HOENN(HOOTHOOT),
+ SPECIES_TO_HOENN(NOCTOWL),
+ SPECIES_TO_HOENN(LEDYBA),
+ SPECIES_TO_HOENN(LEDIAN),
+ SPECIES_TO_HOENN(SPINARAK),
+ SPECIES_TO_HOENN(ARIADOS),
+ SPECIES_TO_HOENN(CROBAT),
+ SPECIES_TO_HOENN(CHINCHOU),
+ SPECIES_TO_HOENN(LANTURN),
+ SPECIES_TO_HOENN(PICHU),
+ SPECIES_TO_HOENN(CLEFFA),
+ SPECIES_TO_HOENN(IGGLYBUFF),
+ SPECIES_TO_HOENN(TOGEPI),
+ SPECIES_TO_HOENN(TOGETIC),
+ SPECIES_TO_HOENN(NATU),
+ SPECIES_TO_HOENN(XATU),
+ SPECIES_TO_HOENN(MAREEP),
+ SPECIES_TO_HOENN(FLAAFFY),
+ SPECIES_TO_HOENN(AMPHAROS),
+ SPECIES_TO_HOENN(BELLOSSOM),
+ SPECIES_TO_HOENN(MARILL),
+ SPECIES_TO_HOENN(AZUMARILL),
+ SPECIES_TO_HOENN(SUDOWOODO),
+ SPECIES_TO_HOENN(POLITOED),
+ SPECIES_TO_HOENN(HOPPIP),
+ SPECIES_TO_HOENN(SKIPLOOM),
+ SPECIES_TO_HOENN(JUMPLUFF),
+ SPECIES_TO_HOENN(AIPOM),
+ SPECIES_TO_HOENN(SUNKERN),
+ SPECIES_TO_HOENN(SUNFLORA),
+ SPECIES_TO_HOENN(YANMA),
+ SPECIES_TO_HOENN(WOOPER),
+ SPECIES_TO_HOENN(QUAGSIRE),
+ SPECIES_TO_HOENN(ESPEON),
+ SPECIES_TO_HOENN(UMBREON),
+ SPECIES_TO_HOENN(MURKROW),
+ SPECIES_TO_HOENN(SLOWKING),
+ SPECIES_TO_HOENN(MISDREAVUS),
+ SPECIES_TO_HOENN(UNOWN),
+ SPECIES_TO_HOENN(WOBBUFFET),
+ SPECIES_TO_HOENN(GIRAFARIG),
+ SPECIES_TO_HOENN(PINECO),
+ SPECIES_TO_HOENN(FORRETRESS),
+ SPECIES_TO_HOENN(DUNSPARCE),
+ SPECIES_TO_HOENN(GLIGAR),
+ SPECIES_TO_HOENN(STEELIX),
+ SPECIES_TO_HOENN(SNUBBULL),
+ SPECIES_TO_HOENN(GRANBULL),
+ SPECIES_TO_HOENN(QWILFISH),
+ SPECIES_TO_HOENN(SCIZOR),
+ SPECIES_TO_HOENN(SHUCKLE),
+ SPECIES_TO_HOENN(HERACROSS),
+ SPECIES_TO_HOENN(SNEASEL),
+ SPECIES_TO_HOENN(TEDDIURSA),
+ SPECIES_TO_HOENN(URSARING),
+ SPECIES_TO_HOENN(SLUGMA),
+ SPECIES_TO_HOENN(MAGCARGO),
+ SPECIES_TO_HOENN(SWINUB),
+ SPECIES_TO_HOENN(PILOSWINE),
+ SPECIES_TO_HOENN(CORSOLA),
+ SPECIES_TO_HOENN(REMORAID),
+ SPECIES_TO_HOENN(OCTILLERY),
+ SPECIES_TO_HOENN(DELIBIRD),
+ SPECIES_TO_HOENN(MANTINE),
+ SPECIES_TO_HOENN(SKARMORY),
+ SPECIES_TO_HOENN(HOUNDOUR),
+ SPECIES_TO_HOENN(HOUNDOOM),
+ SPECIES_TO_HOENN(KINGDRA),
+ SPECIES_TO_HOENN(PHANPY),
+ SPECIES_TO_HOENN(DONPHAN),
+ SPECIES_TO_HOENN(PORYGON2),
+ SPECIES_TO_HOENN(STANTLER),
+ SPECIES_TO_HOENN(SMEARGLE),
+ SPECIES_TO_HOENN(TYROGUE),
+ SPECIES_TO_HOENN(HITMONTOP),
+ SPECIES_TO_HOENN(SMOOCHUM),
+ SPECIES_TO_HOENN(ELEKID),
+ SPECIES_TO_HOENN(MAGBY),
+ SPECIES_TO_HOENN(MILTANK),
+ SPECIES_TO_HOENN(BLISSEY),
+ SPECIES_TO_HOENN(RAIKOU),
+ SPECIES_TO_HOENN(ENTEI),
+ SPECIES_TO_HOENN(SUICUNE),
+ SPECIES_TO_HOENN(LARVITAR),
+ SPECIES_TO_HOENN(PUPITAR),
+ SPECIES_TO_HOENN(TYRANITAR),
+ SPECIES_TO_HOENN(LUGIA),
+ SPECIES_TO_HOENN(HO_OH),
+ SPECIES_TO_HOENN(CELEBI),
+ SPECIES_TO_HOENN(OLD_UNOWN_B),
+ SPECIES_TO_HOENN(OLD_UNOWN_C),
+ SPECIES_TO_HOENN(OLD_UNOWN_D),
+ SPECIES_TO_HOENN(OLD_UNOWN_E),
+ SPECIES_TO_HOENN(OLD_UNOWN_F),
+ SPECIES_TO_HOENN(OLD_UNOWN_G),
+ SPECIES_TO_HOENN(OLD_UNOWN_H),
+ SPECIES_TO_HOENN(OLD_UNOWN_I),
+ SPECIES_TO_HOENN(OLD_UNOWN_J),
+ SPECIES_TO_HOENN(OLD_UNOWN_K),
+ SPECIES_TO_HOENN(OLD_UNOWN_L),
+ SPECIES_TO_HOENN(OLD_UNOWN_M),
+ SPECIES_TO_HOENN(OLD_UNOWN_N),
+ SPECIES_TO_HOENN(OLD_UNOWN_O),
+ SPECIES_TO_HOENN(OLD_UNOWN_P),
+ SPECIES_TO_HOENN(OLD_UNOWN_Q),
+ SPECIES_TO_HOENN(OLD_UNOWN_R),
+ SPECIES_TO_HOENN(OLD_UNOWN_S),
+ SPECIES_TO_HOENN(OLD_UNOWN_T),
+ SPECIES_TO_HOENN(OLD_UNOWN_U),
+ SPECIES_TO_HOENN(OLD_UNOWN_V),
+ SPECIES_TO_HOENN(OLD_UNOWN_W),
+ SPECIES_TO_HOENN(OLD_UNOWN_X),
+ SPECIES_TO_HOENN(OLD_UNOWN_Y),
+ SPECIES_TO_HOENN(OLD_UNOWN_Z),
+ SPECIES_TO_HOENN(TREECKO),
+ SPECIES_TO_HOENN(GROVYLE),
+ SPECIES_TO_HOENN(SCEPTILE),
+ SPECIES_TO_HOENN(TORCHIC),
+ SPECIES_TO_HOENN(COMBUSKEN),
+ SPECIES_TO_HOENN(BLAZIKEN),
+ SPECIES_TO_HOENN(MUDKIP),
+ SPECIES_TO_HOENN(MARSHTOMP),
+ SPECIES_TO_HOENN(SWAMPERT),
+ SPECIES_TO_HOENN(POOCHYENA),
+ SPECIES_TO_HOENN(MIGHTYENA),
+ SPECIES_TO_HOENN(ZIGZAGOON),
+ SPECIES_TO_HOENN(LINOONE),
+ SPECIES_TO_HOENN(WURMPLE),
+ SPECIES_TO_HOENN(SILCOON),
+ SPECIES_TO_HOENN(BEAUTIFLY),
+ SPECIES_TO_HOENN(CASCOON),
+ SPECIES_TO_HOENN(DUSTOX),
+ SPECIES_TO_HOENN(LOTAD),
+ SPECIES_TO_HOENN(LOMBRE),
+ SPECIES_TO_HOENN(LUDICOLO),
+ SPECIES_TO_HOENN(SEEDOT),
+ SPECIES_TO_HOENN(NUZLEAF),
+ SPECIES_TO_HOENN(SHIFTRY),
+ SPECIES_TO_HOENN(NINCADA),
+ SPECIES_TO_HOENN(NINJASK),
+ SPECIES_TO_HOENN(SHEDINJA),
+ SPECIES_TO_HOENN(TAILLOW),
+ SPECIES_TO_HOENN(SWELLOW),
+ SPECIES_TO_HOENN(SHROOMISH),
+ SPECIES_TO_HOENN(BRELOOM),
+ SPECIES_TO_HOENN(SPINDA),
+ SPECIES_TO_HOENN(WINGULL),
+ SPECIES_TO_HOENN(PELIPPER),
+ SPECIES_TO_HOENN(SURSKIT),
+ SPECIES_TO_HOENN(MASQUERAIN),
+ SPECIES_TO_HOENN(WAILMER),
+ SPECIES_TO_HOENN(WAILORD),
+ SPECIES_TO_HOENN(SKITTY),
+ SPECIES_TO_HOENN(DELCATTY),
+ SPECIES_TO_HOENN(KECLEON),
+ SPECIES_TO_HOENN(BALTOY),
+ SPECIES_TO_HOENN(CLAYDOL),
+ SPECIES_TO_HOENN(NOSEPASS),
+ SPECIES_TO_HOENN(TORKOAL),
+ SPECIES_TO_HOENN(SABLEYE),
+ SPECIES_TO_HOENN(BARBOACH),
+ SPECIES_TO_HOENN(WHISCASH),
+ SPECIES_TO_HOENN(LUVDISC),
+ SPECIES_TO_HOENN(CORPHISH),
+ SPECIES_TO_HOENN(CRAWDAUNT),
+ SPECIES_TO_HOENN(FEEBAS),
+ SPECIES_TO_HOENN(MILOTIC),
+ SPECIES_TO_HOENN(CARVANHA),
+ SPECIES_TO_HOENN(SHARPEDO),
+ SPECIES_TO_HOENN(TRAPINCH),
+ SPECIES_TO_HOENN(VIBRAVA),
+ SPECIES_TO_HOENN(FLYGON),
+ SPECIES_TO_HOENN(MAKUHITA),
+ SPECIES_TO_HOENN(HARIYAMA),
+ SPECIES_TO_HOENN(ELECTRIKE),
+ SPECIES_TO_HOENN(MANECTRIC),
+ SPECIES_TO_HOENN(NUMEL),
+ SPECIES_TO_HOENN(CAMERUPT),
+ SPECIES_TO_HOENN(SPHEAL),
+ SPECIES_TO_HOENN(SEALEO),
+ SPECIES_TO_HOENN(WALREIN),
+ SPECIES_TO_HOENN(CACNEA),
+ SPECIES_TO_HOENN(CACTURNE),
+ SPECIES_TO_HOENN(SNORUNT),
+ SPECIES_TO_HOENN(GLALIE),
+ SPECIES_TO_HOENN(LUNATONE),
+ SPECIES_TO_HOENN(SOLROCK),
+ SPECIES_TO_HOENN(AZURILL),
+ SPECIES_TO_HOENN(SPOINK),
+ SPECIES_TO_HOENN(GRUMPIG),
+ SPECIES_TO_HOENN(PLUSLE),
+ SPECIES_TO_HOENN(MINUN),
+ SPECIES_TO_HOENN(MAWILE),
+ SPECIES_TO_HOENN(MEDITITE),
+ SPECIES_TO_HOENN(MEDICHAM),
+ SPECIES_TO_HOENN(SWABLU),
+ SPECIES_TO_HOENN(ALTARIA),
+ SPECIES_TO_HOENN(WYNAUT),
+ SPECIES_TO_HOENN(DUSKULL),
+ SPECIES_TO_HOENN(DUSCLOPS),
+ SPECIES_TO_HOENN(ROSELIA),
+ SPECIES_TO_HOENN(SLAKOTH),
+ SPECIES_TO_HOENN(VIGOROTH),
+ SPECIES_TO_HOENN(SLAKING),
+ SPECIES_TO_HOENN(GULPIN),
+ SPECIES_TO_HOENN(SWALOT),
+ SPECIES_TO_HOENN(TROPIUS),
+ SPECIES_TO_HOENN(WHISMUR),
+ SPECIES_TO_HOENN(LOUDRED),
+ SPECIES_TO_HOENN(EXPLOUD),
+ SPECIES_TO_HOENN(CLAMPERL),
+ SPECIES_TO_HOENN(HUNTAIL),
+ SPECIES_TO_HOENN(GOREBYSS),
+ SPECIES_TO_HOENN(ABSOL),
+ SPECIES_TO_HOENN(SHUPPET),
+ SPECIES_TO_HOENN(BANETTE),
+ SPECIES_TO_HOENN(SEVIPER),
+ SPECIES_TO_HOENN(ZANGOOSE),
+ SPECIES_TO_HOENN(RELICANTH),
+ SPECIES_TO_HOENN(ARON),
+ SPECIES_TO_HOENN(LAIRON),
+ SPECIES_TO_HOENN(AGGRON),
+ SPECIES_TO_HOENN(CASTFORM),
+ SPECIES_TO_HOENN(VOLBEAT),
+ SPECIES_TO_HOENN(ILLUMISE),
+ SPECIES_TO_HOENN(LILEEP),
+ SPECIES_TO_HOENN(CRADILY),
+ SPECIES_TO_HOENN(ANORITH),
+ SPECIES_TO_HOENN(ARMALDO),
+ SPECIES_TO_HOENN(RALTS),
+ SPECIES_TO_HOENN(KIRLIA),
+ SPECIES_TO_HOENN(GARDEVOIR),
+ SPECIES_TO_HOENN(BAGON),
+ SPECIES_TO_HOENN(SHELGON),
+ SPECIES_TO_HOENN(SALAMENCE),
+ SPECIES_TO_HOENN(BELDUM),
+ SPECIES_TO_HOENN(METANG),
+ SPECIES_TO_HOENN(METAGROSS),
+ SPECIES_TO_HOENN(REGIROCK),
+ SPECIES_TO_HOENN(REGICE),
+ SPECIES_TO_HOENN(REGISTEEL),
+ SPECIES_TO_HOENN(KYOGRE),
+ SPECIES_TO_HOENN(GROUDON),
+ SPECIES_TO_HOENN(RAYQUAZA),
+ SPECIES_TO_HOENN(LATIAS),
+ SPECIES_TO_HOENN(LATIOS),
+ SPECIES_TO_HOENN(JIRACHI),
+ SPECIES_TO_HOENN(DEOXYS),
+ SPECIES_TO_HOENN(CHIMECHO),
+};
+
+static const u16 sSpeciesToNationalPokedexNum[] = // Assigns all species to the National Dex Index (Summary No. for National Dex)
+{
+ SPECIES_TO_NATIONAL(BULBASAUR),
+ SPECIES_TO_NATIONAL(IVYSAUR),
+ SPECIES_TO_NATIONAL(VENUSAUR),
+ SPECIES_TO_NATIONAL(CHARMANDER),
+ SPECIES_TO_NATIONAL(CHARMELEON),
+ SPECIES_TO_NATIONAL(CHARIZARD),
+ SPECIES_TO_NATIONAL(SQUIRTLE),
+ SPECIES_TO_NATIONAL(WARTORTLE),
+ SPECIES_TO_NATIONAL(BLASTOISE),
+ SPECIES_TO_NATIONAL(CATERPIE),
+ SPECIES_TO_NATIONAL(METAPOD),
+ SPECIES_TO_NATIONAL(BUTTERFREE),
+ SPECIES_TO_NATIONAL(WEEDLE),
+ SPECIES_TO_NATIONAL(KAKUNA),
+ SPECIES_TO_NATIONAL(BEEDRILL),
+ SPECIES_TO_NATIONAL(PIDGEY),
+ SPECIES_TO_NATIONAL(PIDGEOTTO),
+ SPECIES_TO_NATIONAL(PIDGEOT),
+ SPECIES_TO_NATIONAL(RATTATA),
+ SPECIES_TO_NATIONAL(RATICATE),
+ SPECIES_TO_NATIONAL(SPEAROW),
+ SPECIES_TO_NATIONAL(FEAROW),
+ SPECIES_TO_NATIONAL(EKANS),
+ SPECIES_TO_NATIONAL(ARBOK),
+ SPECIES_TO_NATIONAL(PIKACHU),
+ SPECIES_TO_NATIONAL(RAICHU),
+ SPECIES_TO_NATIONAL(SANDSHREW),
+ SPECIES_TO_NATIONAL(SANDSLASH),
+ SPECIES_TO_NATIONAL(NIDORAN_F),
+ SPECIES_TO_NATIONAL(NIDORINA),
+ SPECIES_TO_NATIONAL(NIDOQUEEN),
+ SPECIES_TO_NATIONAL(NIDORAN_M),
+ SPECIES_TO_NATIONAL(NIDORINO),
+ SPECIES_TO_NATIONAL(NIDOKING),
+ SPECIES_TO_NATIONAL(CLEFAIRY),
+ SPECIES_TO_NATIONAL(CLEFABLE),
+ SPECIES_TO_NATIONAL(VULPIX),
+ SPECIES_TO_NATIONAL(NINETALES),
+ SPECIES_TO_NATIONAL(JIGGLYPUFF),
+ SPECIES_TO_NATIONAL(WIGGLYTUFF),
+ SPECIES_TO_NATIONAL(ZUBAT),
+ SPECIES_TO_NATIONAL(GOLBAT),
+ SPECIES_TO_NATIONAL(ODDISH),
+ SPECIES_TO_NATIONAL(GLOOM),
+ SPECIES_TO_NATIONAL(VILEPLUME),
+ SPECIES_TO_NATIONAL(PARAS),
+ SPECIES_TO_NATIONAL(PARASECT),
+ SPECIES_TO_NATIONAL(VENONAT),
+ SPECIES_TO_NATIONAL(VENOMOTH),
+ SPECIES_TO_NATIONAL(DIGLETT),
+ SPECIES_TO_NATIONAL(DUGTRIO),
+ SPECIES_TO_NATIONAL(MEOWTH),
+ SPECIES_TO_NATIONAL(PERSIAN),
+ SPECIES_TO_NATIONAL(PSYDUCK),
+ SPECIES_TO_NATIONAL(GOLDUCK),
+ SPECIES_TO_NATIONAL(MANKEY),
+ SPECIES_TO_NATIONAL(PRIMEAPE),
+ SPECIES_TO_NATIONAL(GROWLITHE),
+ SPECIES_TO_NATIONAL(ARCANINE),
+ SPECIES_TO_NATIONAL(POLIWAG),
+ SPECIES_TO_NATIONAL(POLIWHIRL),
+ SPECIES_TO_NATIONAL(POLIWRATH),
+ SPECIES_TO_NATIONAL(ABRA),
+ SPECIES_TO_NATIONAL(KADABRA),
+ SPECIES_TO_NATIONAL(ALAKAZAM),
+ SPECIES_TO_NATIONAL(MACHOP),
+ SPECIES_TO_NATIONAL(MACHOKE),
+ SPECIES_TO_NATIONAL(MACHAMP),
+ SPECIES_TO_NATIONAL(BELLSPROUT),
+ SPECIES_TO_NATIONAL(WEEPINBELL),
+ SPECIES_TO_NATIONAL(VICTREEBEL),
+ SPECIES_TO_NATIONAL(TENTACOOL),
+ SPECIES_TO_NATIONAL(TENTACRUEL),
+ SPECIES_TO_NATIONAL(GEODUDE),
+ SPECIES_TO_NATIONAL(GRAVELER),
+ SPECIES_TO_NATIONAL(GOLEM),
+ SPECIES_TO_NATIONAL(PONYTA),
+ SPECIES_TO_NATIONAL(RAPIDASH),
+ SPECIES_TO_NATIONAL(SLOWPOKE),
+ SPECIES_TO_NATIONAL(SLOWBRO),
+ SPECIES_TO_NATIONAL(MAGNEMITE),
+ SPECIES_TO_NATIONAL(MAGNETON),
+ SPECIES_TO_NATIONAL(FARFETCHD),
+ SPECIES_TO_NATIONAL(DODUO),
+ SPECIES_TO_NATIONAL(DODRIO),
+ SPECIES_TO_NATIONAL(SEEL),
+ SPECIES_TO_NATIONAL(DEWGONG),
+ SPECIES_TO_NATIONAL(GRIMER),
+ SPECIES_TO_NATIONAL(MUK),
+ SPECIES_TO_NATIONAL(SHELLDER),
+ SPECIES_TO_NATIONAL(CLOYSTER),
+ SPECIES_TO_NATIONAL(GASTLY),
+ SPECIES_TO_NATIONAL(HAUNTER),
+ SPECIES_TO_NATIONAL(GENGAR),
+ SPECIES_TO_NATIONAL(ONIX),
+ SPECIES_TO_NATIONAL(DROWZEE),
+ SPECIES_TO_NATIONAL(HYPNO),
+ SPECIES_TO_NATIONAL(KRABBY),
+ SPECIES_TO_NATIONAL(KINGLER),
+ SPECIES_TO_NATIONAL(VOLTORB),
+ SPECIES_TO_NATIONAL(ELECTRODE),
+ SPECIES_TO_NATIONAL(EXEGGCUTE),
+ SPECIES_TO_NATIONAL(EXEGGUTOR),
+ SPECIES_TO_NATIONAL(CUBONE),
+ SPECIES_TO_NATIONAL(MAROWAK),
+ SPECIES_TO_NATIONAL(HITMONLEE),
+ SPECIES_TO_NATIONAL(HITMONCHAN),
+ SPECIES_TO_NATIONAL(LICKITUNG),
+ SPECIES_TO_NATIONAL(KOFFING),
+ SPECIES_TO_NATIONAL(WEEZING),
+ SPECIES_TO_NATIONAL(RHYHORN),
+ SPECIES_TO_NATIONAL(RHYDON),
+ SPECIES_TO_NATIONAL(CHANSEY),
+ SPECIES_TO_NATIONAL(TANGELA),
+ SPECIES_TO_NATIONAL(KANGASKHAN),
+ SPECIES_TO_NATIONAL(HORSEA),
+ SPECIES_TO_NATIONAL(SEADRA),
+ SPECIES_TO_NATIONAL(GOLDEEN),
+ SPECIES_TO_NATIONAL(SEAKING),
+ SPECIES_TO_NATIONAL(STARYU),
+ SPECIES_TO_NATIONAL(STARMIE),
+ SPECIES_TO_NATIONAL(MR_MIME),
+ SPECIES_TO_NATIONAL(SCYTHER),
+ SPECIES_TO_NATIONAL(JYNX),
+ SPECIES_TO_NATIONAL(ELECTABUZZ),
+ SPECIES_TO_NATIONAL(MAGMAR),
+ SPECIES_TO_NATIONAL(PINSIR),
+ SPECIES_TO_NATIONAL(TAUROS),
+ SPECIES_TO_NATIONAL(MAGIKARP),
+ SPECIES_TO_NATIONAL(GYARADOS),
+ SPECIES_TO_NATIONAL(LAPRAS),
+ SPECIES_TO_NATIONAL(DITTO),
+ SPECIES_TO_NATIONAL(EEVEE),
+ SPECIES_TO_NATIONAL(VAPOREON),
+ SPECIES_TO_NATIONAL(JOLTEON),
+ SPECIES_TO_NATIONAL(FLAREON),
+ SPECIES_TO_NATIONAL(PORYGON),
+ SPECIES_TO_NATIONAL(OMANYTE),
+ SPECIES_TO_NATIONAL(OMASTAR),
+ SPECIES_TO_NATIONAL(KABUTO),
+ SPECIES_TO_NATIONAL(KABUTOPS),
+ SPECIES_TO_NATIONAL(AERODACTYL),
+ SPECIES_TO_NATIONAL(SNORLAX),
+ SPECIES_TO_NATIONAL(ARTICUNO),
+ SPECIES_TO_NATIONAL(ZAPDOS),
+ SPECIES_TO_NATIONAL(MOLTRES),
+ SPECIES_TO_NATIONAL(DRATINI),
+ SPECIES_TO_NATIONAL(DRAGONAIR),
+ SPECIES_TO_NATIONAL(DRAGONITE),
+ SPECIES_TO_NATIONAL(MEWTWO),
+ SPECIES_TO_NATIONAL(MEW),
+ SPECIES_TO_NATIONAL(CHIKORITA),
+ SPECIES_TO_NATIONAL(BAYLEEF),
+ SPECIES_TO_NATIONAL(MEGANIUM),
+ SPECIES_TO_NATIONAL(CYNDAQUIL),
+ SPECIES_TO_NATIONAL(QUILAVA),
+ SPECIES_TO_NATIONAL(TYPHLOSION),
+ SPECIES_TO_NATIONAL(TOTODILE),
+ SPECIES_TO_NATIONAL(CROCONAW),
+ SPECIES_TO_NATIONAL(FERALIGATR),
+ SPECIES_TO_NATIONAL(SENTRET),
+ SPECIES_TO_NATIONAL(FURRET),
+ SPECIES_TO_NATIONAL(HOOTHOOT),
+ SPECIES_TO_NATIONAL(NOCTOWL),
+ SPECIES_TO_NATIONAL(LEDYBA),
+ SPECIES_TO_NATIONAL(LEDIAN),
+ SPECIES_TO_NATIONAL(SPINARAK),
+ SPECIES_TO_NATIONAL(ARIADOS),
+ SPECIES_TO_NATIONAL(CROBAT),
+ SPECIES_TO_NATIONAL(CHINCHOU),
+ SPECIES_TO_NATIONAL(LANTURN),
+ SPECIES_TO_NATIONAL(PICHU),
+ SPECIES_TO_NATIONAL(CLEFFA),
+ SPECIES_TO_NATIONAL(IGGLYBUFF),
+ SPECIES_TO_NATIONAL(TOGEPI),
+ SPECIES_TO_NATIONAL(TOGETIC),
+ SPECIES_TO_NATIONAL(NATU),
+ SPECIES_TO_NATIONAL(XATU),
+ SPECIES_TO_NATIONAL(MAREEP),
+ SPECIES_TO_NATIONAL(FLAAFFY),
+ SPECIES_TO_NATIONAL(AMPHAROS),
+ SPECIES_TO_NATIONAL(BELLOSSOM),
+ SPECIES_TO_NATIONAL(MARILL),
+ SPECIES_TO_NATIONAL(AZUMARILL),
+ SPECIES_TO_NATIONAL(SUDOWOODO),
+ SPECIES_TO_NATIONAL(POLITOED),
+ SPECIES_TO_NATIONAL(HOPPIP),
+ SPECIES_TO_NATIONAL(SKIPLOOM),
+ SPECIES_TO_NATIONAL(JUMPLUFF),
+ SPECIES_TO_NATIONAL(AIPOM),
+ SPECIES_TO_NATIONAL(SUNKERN),
+ SPECIES_TO_NATIONAL(SUNFLORA),
+ SPECIES_TO_NATIONAL(YANMA),
+ SPECIES_TO_NATIONAL(WOOPER),
+ SPECIES_TO_NATIONAL(QUAGSIRE),
+ SPECIES_TO_NATIONAL(ESPEON),
+ SPECIES_TO_NATIONAL(UMBREON),
+ SPECIES_TO_NATIONAL(MURKROW),
+ SPECIES_TO_NATIONAL(SLOWKING),
+ SPECIES_TO_NATIONAL(MISDREAVUS),
+ SPECIES_TO_NATIONAL(UNOWN),
+ SPECIES_TO_NATIONAL(WOBBUFFET),
+ SPECIES_TO_NATIONAL(GIRAFARIG),
+ SPECIES_TO_NATIONAL(PINECO),
+ SPECIES_TO_NATIONAL(FORRETRESS),
+ SPECIES_TO_NATIONAL(DUNSPARCE),
+ SPECIES_TO_NATIONAL(GLIGAR),
+ SPECIES_TO_NATIONAL(STEELIX),
+ SPECIES_TO_NATIONAL(SNUBBULL),
+ SPECIES_TO_NATIONAL(GRANBULL),
+ SPECIES_TO_NATIONAL(QWILFISH),
+ SPECIES_TO_NATIONAL(SCIZOR),
+ SPECIES_TO_NATIONAL(SHUCKLE),
+ SPECIES_TO_NATIONAL(HERACROSS),
+ SPECIES_TO_NATIONAL(SNEASEL),
+ SPECIES_TO_NATIONAL(TEDDIURSA),
+ SPECIES_TO_NATIONAL(URSARING),
+ SPECIES_TO_NATIONAL(SLUGMA),
+ SPECIES_TO_NATIONAL(MAGCARGO),
+ SPECIES_TO_NATIONAL(SWINUB),
+ SPECIES_TO_NATIONAL(PILOSWINE),
+ SPECIES_TO_NATIONAL(CORSOLA),
+ SPECIES_TO_NATIONAL(REMORAID),
+ SPECIES_TO_NATIONAL(OCTILLERY),
+ SPECIES_TO_NATIONAL(DELIBIRD),
+ SPECIES_TO_NATIONAL(MANTINE),
+ SPECIES_TO_NATIONAL(SKARMORY),
+ SPECIES_TO_NATIONAL(HOUNDOUR),
+ SPECIES_TO_NATIONAL(HOUNDOOM),
+ SPECIES_TO_NATIONAL(KINGDRA),
+ SPECIES_TO_NATIONAL(PHANPY),
+ SPECIES_TO_NATIONAL(DONPHAN),
+ SPECIES_TO_NATIONAL(PORYGON2),
+ SPECIES_TO_NATIONAL(STANTLER),
+ SPECIES_TO_NATIONAL(SMEARGLE),
+ SPECIES_TO_NATIONAL(TYROGUE),
+ SPECIES_TO_NATIONAL(HITMONTOP),
+ SPECIES_TO_NATIONAL(SMOOCHUM),
+ SPECIES_TO_NATIONAL(ELEKID),
+ SPECIES_TO_NATIONAL(MAGBY),
+ SPECIES_TO_NATIONAL(MILTANK),
+ SPECIES_TO_NATIONAL(BLISSEY),
+ SPECIES_TO_NATIONAL(RAIKOU),
+ SPECIES_TO_NATIONAL(ENTEI),
+ SPECIES_TO_NATIONAL(SUICUNE),
+ SPECIES_TO_NATIONAL(LARVITAR),
+ SPECIES_TO_NATIONAL(PUPITAR),
+ SPECIES_TO_NATIONAL(TYRANITAR),
+ SPECIES_TO_NATIONAL(LUGIA),
+ SPECIES_TO_NATIONAL(HO_OH),
+ SPECIES_TO_NATIONAL(CELEBI),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_B),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_C),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_D),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_E),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_F),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_G),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_H),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_I),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_J),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_K),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_L),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_M),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_N),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_O),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_P),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_Q),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_R),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_S),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_T),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_U),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_V),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_W),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_X),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_Y),
+ SPECIES_TO_NATIONAL(OLD_UNOWN_Z),
+ SPECIES_TO_NATIONAL(TREECKO),
+ SPECIES_TO_NATIONAL(GROVYLE),
+ SPECIES_TO_NATIONAL(SCEPTILE),
+ SPECIES_TO_NATIONAL(TORCHIC),
+ SPECIES_TO_NATIONAL(COMBUSKEN),
+ SPECIES_TO_NATIONAL(BLAZIKEN),
+ SPECIES_TO_NATIONAL(MUDKIP),
+ SPECIES_TO_NATIONAL(MARSHTOMP),
+ SPECIES_TO_NATIONAL(SWAMPERT),
+ SPECIES_TO_NATIONAL(POOCHYENA),
+ SPECIES_TO_NATIONAL(MIGHTYENA),
+ SPECIES_TO_NATIONAL(ZIGZAGOON),
+ SPECIES_TO_NATIONAL(LINOONE),
+ SPECIES_TO_NATIONAL(WURMPLE),
+ SPECIES_TO_NATIONAL(SILCOON),
+ SPECIES_TO_NATIONAL(BEAUTIFLY),
+ SPECIES_TO_NATIONAL(CASCOON),
+ SPECIES_TO_NATIONAL(DUSTOX),
+ SPECIES_TO_NATIONAL(LOTAD),
+ SPECIES_TO_NATIONAL(LOMBRE),
+ SPECIES_TO_NATIONAL(LUDICOLO),
+ SPECIES_TO_NATIONAL(SEEDOT),
+ SPECIES_TO_NATIONAL(NUZLEAF),
+ SPECIES_TO_NATIONAL(SHIFTRY),
+ SPECIES_TO_NATIONAL(NINCADA),
+ SPECIES_TO_NATIONAL(NINJASK),
+ SPECIES_TO_NATIONAL(SHEDINJA),
+ SPECIES_TO_NATIONAL(TAILLOW),
+ SPECIES_TO_NATIONAL(SWELLOW),
+ SPECIES_TO_NATIONAL(SHROOMISH),
+ SPECIES_TO_NATIONAL(BRELOOM),
+ SPECIES_TO_NATIONAL(SPINDA),
+ SPECIES_TO_NATIONAL(WINGULL),
+ SPECIES_TO_NATIONAL(PELIPPER),
+ SPECIES_TO_NATIONAL(SURSKIT),
+ SPECIES_TO_NATIONAL(MASQUERAIN),
+ SPECIES_TO_NATIONAL(WAILMER),
+ SPECIES_TO_NATIONAL(WAILORD),
+ SPECIES_TO_NATIONAL(SKITTY),
+ SPECIES_TO_NATIONAL(DELCATTY),
+ SPECIES_TO_NATIONAL(KECLEON),
+ SPECIES_TO_NATIONAL(BALTOY),
+ SPECIES_TO_NATIONAL(CLAYDOL),
+ SPECIES_TO_NATIONAL(NOSEPASS),
+ SPECIES_TO_NATIONAL(TORKOAL),
+ SPECIES_TO_NATIONAL(SABLEYE),
+ SPECIES_TO_NATIONAL(BARBOACH),
+ SPECIES_TO_NATIONAL(WHISCASH),
+ SPECIES_TO_NATIONAL(LUVDISC),
+ SPECIES_TO_NATIONAL(CORPHISH),
+ SPECIES_TO_NATIONAL(CRAWDAUNT),
+ SPECIES_TO_NATIONAL(FEEBAS),
+ SPECIES_TO_NATIONAL(MILOTIC),
+ SPECIES_TO_NATIONAL(CARVANHA),
+ SPECIES_TO_NATIONAL(SHARPEDO),
+ SPECIES_TO_NATIONAL(TRAPINCH),
+ SPECIES_TO_NATIONAL(VIBRAVA),
+ SPECIES_TO_NATIONAL(FLYGON),
+ SPECIES_TO_NATIONAL(MAKUHITA),
+ SPECIES_TO_NATIONAL(HARIYAMA),
+ SPECIES_TO_NATIONAL(ELECTRIKE),
+ SPECIES_TO_NATIONAL(MANECTRIC),
+ SPECIES_TO_NATIONAL(NUMEL),
+ SPECIES_TO_NATIONAL(CAMERUPT),
+ SPECIES_TO_NATIONAL(SPHEAL),
+ SPECIES_TO_NATIONAL(SEALEO),
+ SPECIES_TO_NATIONAL(WALREIN),
+ SPECIES_TO_NATIONAL(CACNEA),
+ SPECIES_TO_NATIONAL(CACTURNE),
+ SPECIES_TO_NATIONAL(SNORUNT),
+ SPECIES_TO_NATIONAL(GLALIE),
+ SPECIES_TO_NATIONAL(LUNATONE),
+ SPECIES_TO_NATIONAL(SOLROCK),
+ SPECIES_TO_NATIONAL(AZURILL),
+ SPECIES_TO_NATIONAL(SPOINK),
+ SPECIES_TO_NATIONAL(GRUMPIG),
+ SPECIES_TO_NATIONAL(PLUSLE),
+ SPECIES_TO_NATIONAL(MINUN),
+ SPECIES_TO_NATIONAL(MAWILE),
+ SPECIES_TO_NATIONAL(MEDITITE),
+ SPECIES_TO_NATIONAL(MEDICHAM),
+ SPECIES_TO_NATIONAL(SWABLU),
+ SPECIES_TO_NATIONAL(ALTARIA),
+ SPECIES_TO_NATIONAL(WYNAUT),
+ SPECIES_TO_NATIONAL(DUSKULL),
+ SPECIES_TO_NATIONAL(DUSCLOPS),
+ SPECIES_TO_NATIONAL(ROSELIA),
+ SPECIES_TO_NATIONAL(SLAKOTH),
+ SPECIES_TO_NATIONAL(VIGOROTH),
+ SPECIES_TO_NATIONAL(SLAKING),
+ SPECIES_TO_NATIONAL(GULPIN),
+ SPECIES_TO_NATIONAL(SWALOT),
+ SPECIES_TO_NATIONAL(TROPIUS),
+ SPECIES_TO_NATIONAL(WHISMUR),
+ SPECIES_TO_NATIONAL(LOUDRED),
+ SPECIES_TO_NATIONAL(EXPLOUD),
+ SPECIES_TO_NATIONAL(CLAMPERL),
+ SPECIES_TO_NATIONAL(HUNTAIL),
+ SPECIES_TO_NATIONAL(GOREBYSS),
+ SPECIES_TO_NATIONAL(ABSOL),
+ SPECIES_TO_NATIONAL(SHUPPET),
+ SPECIES_TO_NATIONAL(BANETTE),
+ SPECIES_TO_NATIONAL(SEVIPER),
+ SPECIES_TO_NATIONAL(ZANGOOSE),
+ SPECIES_TO_NATIONAL(RELICANTH),
+ SPECIES_TO_NATIONAL(ARON),
+ SPECIES_TO_NATIONAL(LAIRON),
+ SPECIES_TO_NATIONAL(AGGRON),
+ SPECIES_TO_NATIONAL(CASTFORM),
+ SPECIES_TO_NATIONAL(VOLBEAT),
+ SPECIES_TO_NATIONAL(ILLUMISE),
+ SPECIES_TO_NATIONAL(LILEEP),
+ SPECIES_TO_NATIONAL(CRADILY),
+ SPECIES_TO_NATIONAL(ANORITH),
+ SPECIES_TO_NATIONAL(ARMALDO),
+ SPECIES_TO_NATIONAL(RALTS),
+ SPECIES_TO_NATIONAL(KIRLIA),
+ SPECIES_TO_NATIONAL(GARDEVOIR),
+ SPECIES_TO_NATIONAL(BAGON),
+ SPECIES_TO_NATIONAL(SHELGON),
+ SPECIES_TO_NATIONAL(SALAMENCE),
+ SPECIES_TO_NATIONAL(BELDUM),
+ SPECIES_TO_NATIONAL(METANG),
+ SPECIES_TO_NATIONAL(METAGROSS),
+ SPECIES_TO_NATIONAL(REGIROCK),
+ SPECIES_TO_NATIONAL(REGICE),
+ SPECIES_TO_NATIONAL(REGISTEEL),
+ SPECIES_TO_NATIONAL(KYOGRE),
+ SPECIES_TO_NATIONAL(GROUDON),
+ SPECIES_TO_NATIONAL(RAYQUAZA),
+ SPECIES_TO_NATIONAL(LATIAS),
+ SPECIES_TO_NATIONAL(LATIOS),
+ SPECIES_TO_NATIONAL(JIRACHI),
+ SPECIES_TO_NATIONAL(DEOXYS),
+ SPECIES_TO_NATIONAL(CHIMECHO),
+};
+
+static const u16 sHoennToNationalOrder[] = // Assigns Hoenn Dex Pokémon (Using National Dex Index)
+{
+ HOENN_TO_NATIONAL(TREECKO),
+ HOENN_TO_NATIONAL(GROVYLE),
+ HOENN_TO_NATIONAL(SCEPTILE),
+ HOENN_TO_NATIONAL(TORCHIC),
+ HOENN_TO_NATIONAL(COMBUSKEN),
+ HOENN_TO_NATIONAL(BLAZIKEN),
+ HOENN_TO_NATIONAL(MUDKIP),
+ HOENN_TO_NATIONAL(MARSHTOMP),
+ HOENN_TO_NATIONAL(SWAMPERT),
+ HOENN_TO_NATIONAL(POOCHYENA),
+ HOENN_TO_NATIONAL(MIGHTYENA),
+ HOENN_TO_NATIONAL(ZIGZAGOON),
+ HOENN_TO_NATIONAL(LINOONE),
+ HOENN_TO_NATIONAL(WURMPLE),
+ HOENN_TO_NATIONAL(SILCOON),
+ HOENN_TO_NATIONAL(BEAUTIFLY),
+ HOENN_TO_NATIONAL(CASCOON),
+ HOENN_TO_NATIONAL(DUSTOX),
+ HOENN_TO_NATIONAL(LOTAD),
+ HOENN_TO_NATIONAL(LOMBRE),
+ HOENN_TO_NATIONAL(LUDICOLO),
+ HOENN_TO_NATIONAL(SEEDOT),
+ HOENN_TO_NATIONAL(NUZLEAF),
+ HOENN_TO_NATIONAL(SHIFTRY),
+ HOENN_TO_NATIONAL(TAILLOW),
+ HOENN_TO_NATIONAL(SWELLOW),
+ HOENN_TO_NATIONAL(WINGULL),
+ HOENN_TO_NATIONAL(PELIPPER),
+ HOENN_TO_NATIONAL(RALTS),
+ HOENN_TO_NATIONAL(KIRLIA),
+ HOENN_TO_NATIONAL(GARDEVOIR),
+ HOENN_TO_NATIONAL(SURSKIT),
+ HOENN_TO_NATIONAL(MASQUERAIN),
+ HOENN_TO_NATIONAL(SHROOMISH),
+ HOENN_TO_NATIONAL(BRELOOM),
+ HOENN_TO_NATIONAL(SLAKOTH),
+ HOENN_TO_NATIONAL(VIGOROTH),
+ HOENN_TO_NATIONAL(SLAKING),
+ HOENN_TO_NATIONAL(ABRA),
+ HOENN_TO_NATIONAL(KADABRA),
+ HOENN_TO_NATIONAL(ALAKAZAM),
+ HOENN_TO_NATIONAL(NINCADA),
+ HOENN_TO_NATIONAL(NINJASK),
+ HOENN_TO_NATIONAL(SHEDINJA),
+ HOENN_TO_NATIONAL(WHISMUR),
+ HOENN_TO_NATIONAL(LOUDRED),
+ HOENN_TO_NATIONAL(EXPLOUD),
+ HOENN_TO_NATIONAL(MAKUHITA),
+ HOENN_TO_NATIONAL(HARIYAMA),
+ HOENN_TO_NATIONAL(GOLDEEN),
+ HOENN_TO_NATIONAL(SEAKING),
+ HOENN_TO_NATIONAL(MAGIKARP),
+ HOENN_TO_NATIONAL(GYARADOS),
+ HOENN_TO_NATIONAL(AZURILL),
+ HOENN_TO_NATIONAL(MARILL),
+ HOENN_TO_NATIONAL(AZUMARILL),
+ HOENN_TO_NATIONAL(GEODUDE),
+ HOENN_TO_NATIONAL(GRAVELER),
+ HOENN_TO_NATIONAL(GOLEM),
+ HOENN_TO_NATIONAL(NOSEPASS),
+ HOENN_TO_NATIONAL(SKITTY),
+ HOENN_TO_NATIONAL(DELCATTY),
+ HOENN_TO_NATIONAL(ZUBAT),
+ HOENN_TO_NATIONAL(GOLBAT),
+ HOENN_TO_NATIONAL(CROBAT),
+ HOENN_TO_NATIONAL(TENTACOOL),
+ HOENN_TO_NATIONAL(TENTACRUEL),
+ HOENN_TO_NATIONAL(SABLEYE),
+ HOENN_TO_NATIONAL(MAWILE),
+ HOENN_TO_NATIONAL(ARON),
+ HOENN_TO_NATIONAL(LAIRON),
+ HOENN_TO_NATIONAL(AGGRON),
+ HOENN_TO_NATIONAL(MACHOP),
+ HOENN_TO_NATIONAL(MACHOKE),
+ HOENN_TO_NATIONAL(MACHAMP),
+ HOENN_TO_NATIONAL(MEDITITE),
+ HOENN_TO_NATIONAL(MEDICHAM),
+ HOENN_TO_NATIONAL(ELECTRIKE),
+ HOENN_TO_NATIONAL(MANECTRIC),
+ HOENN_TO_NATIONAL(PLUSLE),
+ HOENN_TO_NATIONAL(MINUN),
+ HOENN_TO_NATIONAL(MAGNEMITE),
+ HOENN_TO_NATIONAL(MAGNETON),
+ HOENN_TO_NATIONAL(VOLTORB),
+ HOENN_TO_NATIONAL(ELECTRODE),
+ HOENN_TO_NATIONAL(VOLBEAT),
+ HOENN_TO_NATIONAL(ILLUMISE),
+ HOENN_TO_NATIONAL(ODDISH),
+ HOENN_TO_NATIONAL(GLOOM),
+ HOENN_TO_NATIONAL(VILEPLUME),
+ HOENN_TO_NATIONAL(BELLOSSOM),
+ HOENN_TO_NATIONAL(DODUO),
+ HOENN_TO_NATIONAL(DODRIO),
+ HOENN_TO_NATIONAL(ROSELIA),
+ HOENN_TO_NATIONAL(GULPIN),
+ HOENN_TO_NATIONAL(SWALOT),
+ HOENN_TO_NATIONAL(CARVANHA),
+ HOENN_TO_NATIONAL(SHARPEDO),
+ HOENN_TO_NATIONAL(WAILMER),
+ HOENN_TO_NATIONAL(WAILORD),
+ HOENN_TO_NATIONAL(NUMEL),
+ HOENN_TO_NATIONAL(CAMERUPT),
+ HOENN_TO_NATIONAL(SLUGMA),
+ HOENN_TO_NATIONAL(MAGCARGO),
+ HOENN_TO_NATIONAL(TORKOAL),
+ HOENN_TO_NATIONAL(GRIMER),
+ HOENN_TO_NATIONAL(MUK),
+ HOENN_TO_NATIONAL(KOFFING),
+ HOENN_TO_NATIONAL(WEEZING),
+ HOENN_TO_NATIONAL(SPOINK),
+ HOENN_TO_NATIONAL(GRUMPIG),
+ HOENN_TO_NATIONAL(SANDSHREW),
+ HOENN_TO_NATIONAL(SANDSLASH),
+ HOENN_TO_NATIONAL(SPINDA),
+ HOENN_TO_NATIONAL(SKARMORY),
+ HOENN_TO_NATIONAL(TRAPINCH),
+ HOENN_TO_NATIONAL(VIBRAVA),
+ HOENN_TO_NATIONAL(FLYGON),
+ HOENN_TO_NATIONAL(CACNEA),
+ HOENN_TO_NATIONAL(CACTURNE),
+ HOENN_TO_NATIONAL(SWABLU),
+ HOENN_TO_NATIONAL(ALTARIA),
+ HOENN_TO_NATIONAL(ZANGOOSE),
+ HOENN_TO_NATIONAL(SEVIPER),
+ HOENN_TO_NATIONAL(LUNATONE),
+ HOENN_TO_NATIONAL(SOLROCK),
+ HOENN_TO_NATIONAL(BARBOACH),
+ HOENN_TO_NATIONAL(WHISCASH),
+ HOENN_TO_NATIONAL(CORPHISH),
+ HOENN_TO_NATIONAL(CRAWDAUNT),
+ HOENN_TO_NATIONAL(BALTOY),
+ HOENN_TO_NATIONAL(CLAYDOL),
+ HOENN_TO_NATIONAL(LILEEP),
+ HOENN_TO_NATIONAL(CRADILY),
+ HOENN_TO_NATIONAL(ANORITH),
+ HOENN_TO_NATIONAL(ARMALDO),
+ HOENN_TO_NATIONAL(IGGLYBUFF),
+ HOENN_TO_NATIONAL(JIGGLYPUFF),
+ HOENN_TO_NATIONAL(WIGGLYTUFF),
+ HOENN_TO_NATIONAL(FEEBAS),
+ HOENN_TO_NATIONAL(MILOTIC),
+ HOENN_TO_NATIONAL(CASTFORM),
+ HOENN_TO_NATIONAL(STARYU),
+ HOENN_TO_NATIONAL(STARMIE),
+ HOENN_TO_NATIONAL(KECLEON),
+ HOENN_TO_NATIONAL(SHUPPET),
+ HOENN_TO_NATIONAL(BANETTE),
+ HOENN_TO_NATIONAL(DUSKULL),
+ HOENN_TO_NATIONAL(DUSCLOPS),
+ HOENN_TO_NATIONAL(TROPIUS),
+ HOENN_TO_NATIONAL(CHIMECHO),
+ HOENN_TO_NATIONAL(ABSOL),
+ HOENN_TO_NATIONAL(VULPIX),
+ HOENN_TO_NATIONAL(NINETALES),
+ HOENN_TO_NATIONAL(PICHU),
+ HOENN_TO_NATIONAL(PIKACHU),
+ HOENN_TO_NATIONAL(RAICHU),
+ HOENN_TO_NATIONAL(PSYDUCK),
+ HOENN_TO_NATIONAL(GOLDUCK),
+ HOENN_TO_NATIONAL(WYNAUT),
+ HOENN_TO_NATIONAL(WOBBUFFET),
+ HOENN_TO_NATIONAL(NATU),
+ HOENN_TO_NATIONAL(XATU),
+ HOENN_TO_NATIONAL(GIRAFARIG),
+ HOENN_TO_NATIONAL(PHANPY),
+ HOENN_TO_NATIONAL(DONPHAN),
+ HOENN_TO_NATIONAL(PINSIR),
+ HOENN_TO_NATIONAL(HERACROSS),
+ HOENN_TO_NATIONAL(RHYHORN),
+ HOENN_TO_NATIONAL(RHYDON),
+ HOENN_TO_NATIONAL(SNORUNT),
+ HOENN_TO_NATIONAL(GLALIE),
+ HOENN_TO_NATIONAL(SPHEAL),
+ HOENN_TO_NATIONAL(SEALEO),
+ HOENN_TO_NATIONAL(WALREIN),
+ HOENN_TO_NATIONAL(CLAMPERL),
+ HOENN_TO_NATIONAL(HUNTAIL),
+ HOENN_TO_NATIONAL(GOREBYSS),
+ HOENN_TO_NATIONAL(RELICANTH),
+ HOENN_TO_NATIONAL(CORSOLA),
+ HOENN_TO_NATIONAL(CHINCHOU),
+ HOENN_TO_NATIONAL(LANTURN),
+ HOENN_TO_NATIONAL(LUVDISC),
+ HOENN_TO_NATIONAL(HORSEA),
+ HOENN_TO_NATIONAL(SEADRA),
+ HOENN_TO_NATIONAL(KINGDRA),
+ HOENN_TO_NATIONAL(BAGON),
+ HOENN_TO_NATIONAL(SHELGON),
+ HOENN_TO_NATIONAL(SALAMENCE),
+ HOENN_TO_NATIONAL(BELDUM),
+ HOENN_TO_NATIONAL(METANG),
+ HOENN_TO_NATIONAL(METAGROSS),
+ HOENN_TO_NATIONAL(REGIROCK),
+ HOENN_TO_NATIONAL(REGICE),
+ HOENN_TO_NATIONAL(REGISTEEL),
+ HOENN_TO_NATIONAL(LATIAS),
+ HOENN_TO_NATIONAL(LATIOS),
+ HOENN_TO_NATIONAL(KYOGRE),
+ HOENN_TO_NATIONAL(GROUDON),
+ HOENN_TO_NATIONAL(RAYQUAZA),
+ HOENN_TO_NATIONAL(JIRACHI),
+ HOENN_TO_NATIONAL(DEOXYS),
+ HOENN_TO_NATIONAL(BULBASAUR), // Pokémon from here onwards are UNSEEN in the HoennDex.
+ HOENN_TO_NATIONAL(IVYSAUR),
+ HOENN_TO_NATIONAL(VENUSAUR),
+ HOENN_TO_NATIONAL(CHARMANDER),
+ HOENN_TO_NATIONAL(CHARMELEON),
+ HOENN_TO_NATIONAL(CHARIZARD),
+ HOENN_TO_NATIONAL(SQUIRTLE),
+ HOENN_TO_NATIONAL(WARTORTLE),
+ HOENN_TO_NATIONAL(BLASTOISE),
+ HOENN_TO_NATIONAL(CATERPIE),
+ HOENN_TO_NATIONAL(METAPOD),
+ HOENN_TO_NATIONAL(BUTTERFREE),
+ HOENN_TO_NATIONAL(WEEDLE),
+ HOENN_TO_NATIONAL(KAKUNA),
+ HOENN_TO_NATIONAL(BEEDRILL),
+ HOENN_TO_NATIONAL(PIDGEY),
+ HOENN_TO_NATIONAL(PIDGEOTTO),
+ HOENN_TO_NATIONAL(PIDGEOT),
+ HOENN_TO_NATIONAL(RATTATA),
+ HOENN_TO_NATIONAL(RATICATE),
+ HOENN_TO_NATIONAL(SPEAROW),
+ HOENN_TO_NATIONAL(FEAROW),
+ HOENN_TO_NATIONAL(EKANS),
+ HOENN_TO_NATIONAL(ARBOK),
+ HOENN_TO_NATIONAL(NIDORAN_F),
+ HOENN_TO_NATIONAL(NIDORINA),
+ HOENN_TO_NATIONAL(NIDOQUEEN),
+ HOENN_TO_NATIONAL(NIDORAN_M),
+ HOENN_TO_NATIONAL(NIDORINO),
+ HOENN_TO_NATIONAL(NIDOKING),
+ HOENN_TO_NATIONAL(CLEFAIRY),
+ HOENN_TO_NATIONAL(CLEFABLE),
+ HOENN_TO_NATIONAL(PARAS),
+ HOENN_TO_NATIONAL(PARASECT),
+ HOENN_TO_NATIONAL(VENONAT),
+ HOENN_TO_NATIONAL(VENOMOTH),
+ HOENN_TO_NATIONAL(DIGLETT),
+ HOENN_TO_NATIONAL(DUGTRIO),
+ HOENN_TO_NATIONAL(MEOWTH),
+ HOENN_TO_NATIONAL(PERSIAN),
+ HOENN_TO_NATIONAL(MANKEY),
+ HOENN_TO_NATIONAL(PRIMEAPE),
+ HOENN_TO_NATIONAL(GROWLITHE),
+ HOENN_TO_NATIONAL(ARCANINE),
+ HOENN_TO_NATIONAL(POLIWAG),
+ HOENN_TO_NATIONAL(POLIWHIRL),
+ HOENN_TO_NATIONAL(POLIWRATH),
+ HOENN_TO_NATIONAL(BELLSPROUT),
+ HOENN_TO_NATIONAL(WEEPINBELL),
+ HOENN_TO_NATIONAL(VICTREEBEL),
+ HOENN_TO_NATIONAL(PONYTA),
+ HOENN_TO_NATIONAL(RAPIDASH),
+ HOENN_TO_NATIONAL(SLOWPOKE),
+ HOENN_TO_NATIONAL(SLOWBRO),
+ HOENN_TO_NATIONAL(FARFETCHD),
+ HOENN_TO_NATIONAL(SEEL),
+ HOENN_TO_NATIONAL(DEWGONG),
+ HOENN_TO_NATIONAL(SHELLDER),
+ HOENN_TO_NATIONAL(CLOYSTER),
+ HOENN_TO_NATIONAL(GASTLY),
+ HOENN_TO_NATIONAL(HAUNTER),
+ HOENN_TO_NATIONAL(GENGAR),
+ HOENN_TO_NATIONAL(ONIX),
+ HOENN_TO_NATIONAL(DROWZEE),
+ HOENN_TO_NATIONAL(HYPNO),
+ HOENN_TO_NATIONAL(KRABBY),
+ HOENN_TO_NATIONAL(KINGLER),
+ HOENN_TO_NATIONAL(EXEGGCUTE),
+ HOENN_TO_NATIONAL(EXEGGUTOR),
+ HOENN_TO_NATIONAL(CUBONE),
+ HOENN_TO_NATIONAL(MAROWAK),
+ HOENN_TO_NATIONAL(HITMONLEE),
+ HOENN_TO_NATIONAL(HITMONCHAN),
+ HOENN_TO_NATIONAL(LICKITUNG),
+ HOENN_TO_NATIONAL(CHANSEY),
+ HOENN_TO_NATIONAL(TANGELA),
+ HOENN_TO_NATIONAL(KANGASKHAN),
+ HOENN_TO_NATIONAL(MR_MIME),
+ HOENN_TO_NATIONAL(SCYTHER),
+ HOENN_TO_NATIONAL(JYNX),
+ HOENN_TO_NATIONAL(ELECTABUZZ),
+ HOENN_TO_NATIONAL(MAGMAR),
+ HOENN_TO_NATIONAL(TAUROS),
+ HOENN_TO_NATIONAL(LAPRAS),
+ HOENN_TO_NATIONAL(DITTO),
+ HOENN_TO_NATIONAL(EEVEE),
+ HOENN_TO_NATIONAL(VAPOREON),
+ HOENN_TO_NATIONAL(JOLTEON),
+ HOENN_TO_NATIONAL(FLAREON),
+ HOENN_TO_NATIONAL(PORYGON),
+ HOENN_TO_NATIONAL(OMANYTE),
+ HOENN_TO_NATIONAL(OMASTAR),
+ HOENN_TO_NATIONAL(KABUTO),
+ HOENN_TO_NATIONAL(KABUTOPS),
+ HOENN_TO_NATIONAL(AERODACTYL),
+ HOENN_TO_NATIONAL(SNORLAX),
+ HOENN_TO_NATIONAL(ARTICUNO),
+ HOENN_TO_NATIONAL(ZAPDOS),
+ HOENN_TO_NATIONAL(MOLTRES),
+ HOENN_TO_NATIONAL(DRATINI),
+ HOENN_TO_NATIONAL(DRAGONAIR),
+ HOENN_TO_NATIONAL(DRAGONITE),
+ HOENN_TO_NATIONAL(MEWTWO),
+ HOENN_TO_NATIONAL(MEW),
+ HOENN_TO_NATIONAL(CHIKORITA),
+ HOENN_TO_NATIONAL(BAYLEEF),
+ HOENN_TO_NATIONAL(MEGANIUM),
+ HOENN_TO_NATIONAL(CYNDAQUIL),
+ HOENN_TO_NATIONAL(QUILAVA),
+ HOENN_TO_NATIONAL(TYPHLOSION),
+ HOENN_TO_NATIONAL(TOTODILE),
+ HOENN_TO_NATIONAL(CROCONAW),
+ HOENN_TO_NATIONAL(FERALIGATR),
+ HOENN_TO_NATIONAL(SENTRET),
+ HOENN_TO_NATIONAL(FURRET),
+ HOENN_TO_NATIONAL(HOOTHOOT),
+ HOENN_TO_NATIONAL(NOCTOWL),
+ HOENN_TO_NATIONAL(LEDYBA),
+ HOENN_TO_NATIONAL(LEDIAN),
+ HOENN_TO_NATIONAL(SPINARAK),
+ HOENN_TO_NATIONAL(ARIADOS),
+ HOENN_TO_NATIONAL(CLEFFA),
+ HOENN_TO_NATIONAL(TOGEPI),
+ HOENN_TO_NATIONAL(TOGETIC),
+ HOENN_TO_NATIONAL(MAREEP),
+ HOENN_TO_NATIONAL(FLAAFFY),
+ HOENN_TO_NATIONAL(AMPHAROS),
+ HOENN_TO_NATIONAL(SUDOWOODO),
+ HOENN_TO_NATIONAL(POLITOED),
+ HOENN_TO_NATIONAL(HOPPIP),
+ HOENN_TO_NATIONAL(SKIPLOOM),
+ HOENN_TO_NATIONAL(JUMPLUFF),
+ HOENN_TO_NATIONAL(AIPOM),
+ HOENN_TO_NATIONAL(SUNKERN),
+ HOENN_TO_NATIONAL(SUNFLORA),
+ HOENN_TO_NATIONAL(YANMA),
+ HOENN_TO_NATIONAL(WOOPER),
+ HOENN_TO_NATIONAL(QUAGSIRE),
+ HOENN_TO_NATIONAL(ESPEON),
+ HOENN_TO_NATIONAL(UMBREON),
+ HOENN_TO_NATIONAL(MURKROW),
+ HOENN_TO_NATIONAL(SLOWKING),
+ HOENN_TO_NATIONAL(MISDREAVUS),
+ HOENN_TO_NATIONAL(UNOWN),
+ HOENN_TO_NATIONAL(PINECO),
+ HOENN_TO_NATIONAL(FORRETRESS),
+ HOENN_TO_NATIONAL(DUNSPARCE),
+ HOENN_TO_NATIONAL(GLIGAR),
+ HOENN_TO_NATIONAL(STEELIX),
+ HOENN_TO_NATIONAL(SNUBBULL),
+ HOENN_TO_NATIONAL(GRANBULL),
+ HOENN_TO_NATIONAL(QWILFISH),
+ HOENN_TO_NATIONAL(SCIZOR),
+ HOENN_TO_NATIONAL(SHUCKLE),
+ HOENN_TO_NATIONAL(SNEASEL),
+ HOENN_TO_NATIONAL(TEDDIURSA),
+ HOENN_TO_NATIONAL(URSARING),
+ HOENN_TO_NATIONAL(SWINUB),
+ HOENN_TO_NATIONAL(PILOSWINE),
+ HOENN_TO_NATIONAL(REMORAID),
+ HOENN_TO_NATIONAL(OCTILLERY),
+ HOENN_TO_NATIONAL(DELIBIRD),
+ HOENN_TO_NATIONAL(MANTINE),
+ HOENN_TO_NATIONAL(HOUNDOUR),
+ HOENN_TO_NATIONAL(HOUNDOOM),
+ HOENN_TO_NATIONAL(PORYGON2),
+ HOENN_TO_NATIONAL(STANTLER),
+ HOENN_TO_NATIONAL(SMEARGLE),
+ HOENN_TO_NATIONAL(TYROGUE),
+ HOENN_TO_NATIONAL(HITMONTOP),
+ HOENN_TO_NATIONAL(SMOOCHUM),
+ HOENN_TO_NATIONAL(ELEKID),
+ HOENN_TO_NATIONAL(MAGBY),
+ HOENN_TO_NATIONAL(MILTANK),
+ HOENN_TO_NATIONAL(BLISSEY),
+ HOENN_TO_NATIONAL(RAIKOU),
+ HOENN_TO_NATIONAL(ENTEI),
+ HOENN_TO_NATIONAL(SUICUNE),
+ HOENN_TO_NATIONAL(LARVITAR),
+ HOENN_TO_NATIONAL(PUPITAR),
+ HOENN_TO_NATIONAL(TYRANITAR),
+ HOENN_TO_NATIONAL(LUGIA),
+ HOENN_TO_NATIONAL(HO_OH),
+ HOENN_TO_NATIONAL(CELEBI),
+ HOENN_TO_NATIONAL(OLD_UNOWN_B),
+ HOENN_TO_NATIONAL(OLD_UNOWN_C),
+ HOENN_TO_NATIONAL(OLD_UNOWN_D),
+ HOENN_TO_NATIONAL(OLD_UNOWN_E),
+ HOENN_TO_NATIONAL(OLD_UNOWN_F),
+ HOENN_TO_NATIONAL(OLD_UNOWN_G),
+ HOENN_TO_NATIONAL(OLD_UNOWN_H),
+ HOENN_TO_NATIONAL(OLD_UNOWN_I),
+ HOENN_TO_NATIONAL(OLD_UNOWN_J),
+ HOENN_TO_NATIONAL(OLD_UNOWN_K),
+ HOENN_TO_NATIONAL(OLD_UNOWN_L),
+ HOENN_TO_NATIONAL(OLD_UNOWN_M),
+ HOENN_TO_NATIONAL(OLD_UNOWN_N),
+ HOENN_TO_NATIONAL(OLD_UNOWN_O),
+ HOENN_TO_NATIONAL(OLD_UNOWN_P),
+ HOENN_TO_NATIONAL(OLD_UNOWN_Q),
+ HOENN_TO_NATIONAL(OLD_UNOWN_R),
+ HOENN_TO_NATIONAL(OLD_UNOWN_S),
+ HOENN_TO_NATIONAL(OLD_UNOWN_T),
+ HOENN_TO_NATIONAL(OLD_UNOWN_U),
+ HOENN_TO_NATIONAL(OLD_UNOWN_V),
+ HOENN_TO_NATIONAL(OLD_UNOWN_W),
+ HOENN_TO_NATIONAL(OLD_UNOWN_X),
+ HOENN_TO_NATIONAL(OLD_UNOWN_Y),
+ HOENN_TO_NATIONAL(OLD_UNOWN_Z),
+};
+
+static const struct SpindaSpot sSpindaSpotGraphics[] =
+{
+ {16, 7, INCBIN_U16("graphics/spinda_spots/spot_0.bin")},
+ {40, 8, INCBIN_U16("graphics/spinda_spots/spot_1.bin")},
+ {22, 25, INCBIN_U16("graphics/spinda_spots/spot_2.bin")},
+ {34, 26, INCBIN_U16("graphics/spinda_spots/spot_3.bin")}
+};
+
+#include "data/pokemon/item_effects.h"
+
+static const s8 sNatureStatTable[][5] =
+{
+ // Atk Def Spd Sp.Atk Sp.Def
+ { 0, 0, 0, 0, 0}, // Hardy
+ { +1, -1, 0, 0, 0}, // Lonely
+ { +1, 0, -1, 0, 0}, // Brave
+ { +1, 0, 0, -1, 0}, // Adamant
+ { +1, 0, 0, 0, -1}, // Naughty
+ { -1, +1, 0, 0, 0}, // Bold
+ { 0, 0, 0, 0, 0}, // Docile
+ { 0, +1, -1, 0, 0}, // Relaxed
+ { 0, +1, 0, -1, 0}, // Impish
+ { 0, +1, 0, 0, -1}, // Lax
+ { -1, 0, +1, 0, 0}, // Timid
+ { 0, -1, +1, 0, 0}, // Hasty
+ { 0, 0, 0, 0, 0}, // Serious
+ { 0, 0, +1, -1, 0}, // Jolly
+ { 0, 0, +1, 0, -1}, // Naive
+ { -1, 0, 0, +1, 0}, // Modest
+ { 0, -1, 0, +1, 0}, // Mild
+ { 0, 0, -1, +1, 0}, // Quiet
+ { 0, 0, 0, 0, 0}, // Bashful
+ { 0, 0, 0, +1, -1}, // Rash
+ { -1, 0, 0, 0, +1}, // Calm
+ { 0, -1, 0, 0, +1}, // Gentle
+ { 0, 0, -1, 0, +1}, // Sassy
+ { 0, 0, 0, -1, +1}, // Careful
+ { 0, 0, 0, 0, 0}, // Quirky
+};
+
+#include "data/pokemon/tmhm_learnsets.h"
+#include "data/pokemon/trainer_class_lookups.h"
+#include "data/pokemon/cry_ids.h"
+#include "data/pokemon/experience_tables.h"
+#include "data/pokemon/base_stats.h"
+#include "data/pokemon/level_up_learnsets.h"
+#include "data/pokemon/evolution.h"
+#include "data/pokemon/level_up_learnset_pointers.h"
+
+static const s8 sPokeblockFlavorCompatibilityTable[] =
+{
+ // Cool, Beauty, Cute, Smart, Tough
+ 0, 0, 0, 0, 0, // Hardy
+ 1, 0, 0, 0, -1, // Lonely
+ 1, 0, -1, 0, 0, // Brave
+ 1, -1, 0, 0, 0, // Adamant
+ 1, 0, 0, -1, 0, // Naughty
+ -1, 0, 0, 0, 1, // Bold
+ 0, 0, 0, 0, 0, // Docile
+ 0, 0, -1, 0, 1, // Relaxed
+ 0, -1, 0, 0, 1, // Impish
+ 0, 0, 0, -1, 1, // Lax
+ -1, 0, 1, 0, 0, // Timid
+ 0, 0, 1, 0, -1, // Hasty
+ 0, 0, 0, 0, 0, // Serious
+ 0, -1, 1, 0, 0, // Jolly
+ 0, 0, 1, -1, 0, // Naive
+ -1, 1, 0, 0, 0, // Modest
+ 0, 1, 0, 0, -1, // Mild
+ 0, 1, -1, 0, 0, // Quiet
+ 0, 0, 0, 0, 0, // Bashful
+ 0, 1, 0, -1, 0, // Rash
+ -1, 0, 0, 1, 0, // Calm
+ 0, 0, 0, 1, -1, // Gentle
+ 0, 0, -1, 1, 0, // Sassy
+ 0, -1, 0, 1, 0, // Careful
+ 0, 0, 0, 0, 0 // Quirky
+};
+
+const u8 gPPUpGetMask[] = { 0x03, 0x0c, 0x30, 0xc0 }; // Masks for getting PP Up count, also PP Max values
+
+const u8 gPPUpSetMask[] = { 0xfc, 0xf3, 0xcf, 0x3f }; // Masks for setting PP Up count
+
+const u8 gPPUpAddMask[] = { 0x01, 0x04, 0x10, 0x40 }; // Values added to PP Up count
+
+const u8 gStatStageRatios[][2] =
+{
+ { 10, 40 },
+ { 10, 35 },
+ { 10, 30 },
+ { 10, 25 },
+ { 10, 20 },
+ { 10, 15 },
+ { 10, 10 },
+ { 15, 10 },
+ { 20, 10 },
+ { 25, 10 },
+ { 30, 10 },
+ { 35, 10 },
+ { 40, 10 },
+ { 138, 174 },
+ { 108, 120 },
+};
+
+static const u8 sFiller = _("");
+
+static const u8 sHoldEffectToType[][2] =
+{
+ {HOLD_EFFECT_BUG_POWER, TYPE_BUG},
+ {HOLD_EFFECT_STEEL_POWER, TYPE_STEEL},
+ {HOLD_EFFECT_GROUND_POWER, TYPE_GROUND},
+ {HOLD_EFFECT_ROCK_POWER, TYPE_ROCK},
+ {HOLD_EFFECT_GRASS_POWER, TYPE_GRASS},
+ {HOLD_EFFECT_DARK_POWER, TYPE_DARK},
+ {HOLD_EFFECT_FIGHTING_POWER, TYPE_FIGHTING},
+ {HOLD_EFFECT_ELECTRIC_POWER, TYPE_ELECTRIC},
+ {HOLD_EFFECT_WATER_POWER, TYPE_WATER},
+ {HOLD_EFFECT_FLYING_POWER, TYPE_FLYING},
+ {HOLD_EFFECT_POISON_POWER, TYPE_POISON},
+ {HOLD_EFFECT_ICE_POWER, TYPE_ICE},
+ {HOLD_EFFECT_GHOST_POWER, TYPE_GHOST},
+ {HOLD_EFFECT_PSYCHIC_POWER, TYPE_PSYCHIC},
+ {HOLD_EFFECT_FIRE_POWER, TYPE_FIRE},
+ {HOLD_EFFECT_DRAGON_POWER, TYPE_DRAGON},
+ {HOLD_EFFECT_NORMAL_POWER, TYPE_NORMAL},
+};
+
+const struct SpriteTemplate gUnknown_825DEF0[] =
+{
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_8234698,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F010,
+ .anims = NULL,
+ .images = gUnknown_82346B8,
+ .affineAnims = gUnknown_8234944,
+ .callback = oac_poke_opponent,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_82346D8,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F010,
+ .anims = NULL,
+ .images = gUnknown_82346F8,
+ .affineAnims = gUnknown_8234944,
+ .callback = oac_poke_opponent,
+ },
+};
+
+const struct SpriteTemplate gUnknown_825DF50[] =
+{
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_8234718,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_8234740,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_82347A8,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_82347C8,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_8234768,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_8234788,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+};
+
+static const u8 sSecretBaseFacilityClasses[][5] =
+{
+ { FACILITY_CLASS_YOUNGSTER_2, FACILITY_CLASS_YOUNGSTER_2, FACILITY_CLASS_YOUNGSTER_2, FACILITY_CLASS_YOUNGSTER_2, FACILITY_CLASS_YOUNGSTER_2 },
+ { FACILITY_CLASS_YOUNGSTER_2, FACILITY_CLASS_YOUNGSTER_2, FACILITY_CLASS_YOUNGSTER_2, FACILITY_CLASS_YOUNGSTER_2, FACILITY_CLASS_YOUNGSTER_2 },
+};
+
+static const u8 sGetMonDataEVConstants[] =
+{
+ MON_DATA_HP_EV,
+ MON_DATA_ATK_EV,
+ MON_DATA_DEF_EV,
+ MON_DATA_SPEED_EV,
+ MON_DATA_SPDEF_EV,
+ MON_DATA_SPATK_EV
+};
+
+static const u8 gUnknown_825DFF0[] =
+{
+ STAT_ATK, STAT_ATK, STAT_SPEED, STAT_DEF, STAT_SPATK, STAT_ACC
+};
+
+static const s8 sFriendshipEventDeltas[][3] =
+{
+ { 5, 3, 2 },
+ { 5, 3, 2 },
+ { 1, 1, 0 },
+ { 3, 2, 1 },
+ { 1, 1, 0 },
+ { 1, 1, 1 },
+ { 3, 3, 3 },
+ {-1, -1, -1 },
+ {-5, -5, -10 },
+ {-5, -5, -10 },
+};
+
+static const u16 sHMMoves[] =
+{
+ MOVE_CUT, MOVE_FLY, MOVE_SURF, MOVE_STRENGTH, MOVE_FLASH,
+ MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_DIVE, 0xFFFF
+};
+
+static const u16 sDeoxysBaseStats[] =
+{
+ 50, // Hp
+ 180, // Attack
+ 20, // Defense
+ 150, // Speed
+ 180, // Sp.Attack
+ 20, // Sp.Defense
+};
+
+const u16 gLinkPlayerFacilityClasses[] =
+{
+ 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, FACILITY_CLASS_COOLTRAINER_4, FACILITY_CLASS_CHANNELER,
+ FACILITY_CLASS_PICNICKER_2, FACILITY_CLASS_LASS_2, FACILITY_CLASS_PSYCHIC_4, FACILITY_CLASS_CRUSH_GIRL, FACILITY_CLASS_PKMN_BREEDER_3,
+ FACILITY_CLASS_BEAUTY_2, FACILITY_CLASS_AQUA_LEADER,
+};
+
+const static struct OamData sOakSpeechNidoranFDummyOamData =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+};
+
+const struct SpriteTemplate sOakSpeechNidoranFDummyTemplate =
+{
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = SPRITE_INVALID_TAG,
+ .oam = &sOakSpeechNidoranFDummyOamData,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
// code
void ZeroBoxMonData(struct BoxPokemon *boxMon)
@@ -233,7 +1789,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV,
SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv);
}
- if (gBaseStats[species].ability2)
+ if (gBaseStats[species].abilities[1])
{
value = personality & 1;
SetBoxMonData(boxMon, MON_DATA_ALT_ABILITY, &value);
@@ -307,7 +1863,7 @@ void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32
CalculateMonStats(mon);
}
-void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId)
+static void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId)
{
CreateMon(mon, species, level, 0, 0, 0, OT_ID_PRESET, otId);
SetMonData(mon, MON_DATA_HP_IV, &ivs[0]);
@@ -351,7 +1907,7 @@ void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedI
CalculateMonStats(mon);
}
-void sub_803E0A4(struct Pokemon *mon, struct BattleTowerPokemon *src)
+void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src)
{
s32 i;
u8 value;
@@ -402,7 +1958,7 @@ void sub_803E0A4(struct Pokemon *mon, struct BattleTowerPokemon *src)
CalculateMonStats(mon);
}
-void CreateObedientMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)
+static void CreateObedientMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)
{
bool32 obedient = TRUE;
@@ -447,7 +2003,7 @@ void sub_803E23C(struct Pokemon *mon, struct BattleTowerPokemon *dest)
GetMonData(mon, MON_DATA_NICKNAME, dest->nickname);
}
-u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon)
+static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon)
{
u16 checksum = 0;
union PokemonSubstruct *substruct0 = GetSubstruct(boxMon, boxMon->personality, 0);
@@ -476,7 +2032,7 @@ u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon)
u8 baseStat = gBaseStats[species].base; \
s32 n = (((2 * baseStat + iv + ev / 4) * level) / 100) + 5; \
u8 nature = GetNature(mon); \
- n = nature_stat_mod(nature, n, statIndex); \
+ n = ModifyStatByNature(nature, n, statIndex); \
SetMonData(mon, field, &n); \
}
@@ -556,7 +2112,7 @@ void BoxMonToMon(struct BoxPokemon *src, struct Pokemon *dest)
CalculateMonStats(dest);
}
-u8 GetLevelFromMonExp(struct Pokemon *mon)
+static u8 GetLevelFromMonExp(struct Pokemon *mon)
{
u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
u32 exp = GetMonData(mon, MON_DATA_EXP, NULL);
@@ -585,7 +2141,7 @@ u16 GiveMoveToMon(struct Pokemon *mon, u16 move)
return GiveMoveToBoxMon(&mon->box, move);
}
-u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)
+static u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)
{
s32 i;
for (i = 0; i < 4; i++)
@@ -632,15 +2188,12 @@ void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot)
mon->pp[slot] = gBattleMoves[move].pp;
}
-void GiveMonInitialMoveset(struct Pokemon *mon)
+static void GiveMonInitialMoveset(struct Pokemon *mon)
{
GiveBoxMonInitialMoveset(&mon->box);
}
-// TODO: make level_up_learnsets.h in src/data and move this to there.
-#define LEVEL_UP_END 0xffff
-
-void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon)
+static void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon)
{
u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL);
s32 level = GetLevelFromBoxMonExp(boxMon);
@@ -722,7 +2275,7 @@ void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move)
SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses);
}
-void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)
+static void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)
{
s32 i;
u16 moves[4];
@@ -834,8 +2387,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
spDefense = (110 * spDefense) / 100;
}
- // TODO: Use ARRAY_COUNT(sHoldEffectToType)
- for (i = 0; i < 17; i++)
+ for (i = 0; i < NELEMS(sHoldEffectToType); i++)
{
if (attackerHoldEffect == sHoldEffectToType[i][0]
&& type == sHoldEffectToType[i][1])
@@ -924,13 +2476,13 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
if ((sideStatus & SIDE_STATUS_REFLECT) && gCritMultiplier == 1)
{
- if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMons(2) == 2)
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2)
damage = 2 * (damage / 3);
else
damage /= 2;
}
- if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMons(2) == 2)
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2)
damage /= 2;
// moves always do at least 1 damage.
@@ -971,13 +2523,13 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
if ((sideStatus & SIDE_STATUS_LIGHTSCREEN) && gCritMultiplier == 1)
{
- if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMons(2) == 2)
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2)
damage = 2 * (damage / 3);
else
damage /= 2;
}
- if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMons(2) == 2)
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2)
damage /= 2;
// are effects of weather negated with cloud nine or air lock
@@ -1023,28 +2575,28 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
return damage + 2;
}
-u8 CountAliveMons(u8 a1)
+u8 CountAliveMonsInBattle(u8 caseId)
{
s32 i;
u8 retVal = 0;
- switch (a1)
+ switch (caseId)
{
- case 0:
+ case BATTLE_ALIVE_EXCEPT_ACTIVE:
for (i = 0; i < 4; i++)
{
if (i != gActiveBattler && !(gAbsentBattlerFlags & gBitTable[i]))
retVal++;
}
break;
- case 1:
+ case BATTLE_ALIVE_ATK_SIDE:
for (i = 0; i < 4; i++)
{
if (GetBattlerSide(i) == GetBattlerSide(sBattler_AI) && !(gAbsentBattlerFlags & gBitTable[i]))
retVal++;
}
break;
- case 2:
+ case BATTLE_ALIVE_DEF_SIDE:
for (i = 0; i < 4; i++)
{
if (GetBattlerSide(i) == GetBattlerSide(gBattlerTarget) && !(gAbsentBattlerFlags & gBitTable[i]))
@@ -1056,29 +2608,28 @@ u8 CountAliveMons(u8 a1)
return retVal;
}
-u8 GetDefaultMoveTarget(u8 a1)
+u8 GetDefaultMoveTarget(u8 battlerId)
{
- u8 status = GetBattlerPosition(a1) & 1;
+ u8 opposing = BATTLE_OPPOSITE(GetBattlerPosition(battlerId) & BIT_SIDE);
- status ^= 1;
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
- return GetBattlerAtPosition(status);
- if (CountAliveMons(0) > 1)
+ return GetBattlerAtPosition(opposing);
+ if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) > 1)
{
- u8 val;
+ u8 position;
if ((Random() & 1) == 0)
- val = status ^ 2;
+ position = BATTLE_PARTNER(opposing);
else
- val = status;
- return GetBattlerAtPosition(val);
+ position = opposing;
+ return GetBattlerAtPosition(position);
}
else
{
- if ((gAbsentBattlerFlags & gBitTable[status]))
- return GetBattlerAtPosition(status ^ 2);
+ if ((gAbsentBattlerFlags & gBitTable[opposing]))
+ return GetBattlerAtPosition(BATTLE_PARTNER(opposing));
else
- return GetBattlerAtPosition(status);
+ return GetBattlerAtPosition(opposing);
}
}
@@ -1122,40 +2673,40 @@ u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality)
return MON_MALE;
}
-void SetMultiuseSpriteTemplateToPokemon(u16 trainerSpriteId, u8 battlerPosition)
+void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition)
{
- if(gMonSpritesGfxPtr != NULL)
+ if (gMonSpritesGfxPtr != NULL)
{
- if(battlerPosition >= 4)
+ if (battlerPosition >= 4)
battlerPosition = 0;
gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition];
}
else
{
- if(gUnknown_20244F4)
+ if (sOakSpeechNidoranResources)
{
- if(battlerPosition >= (s8)gUnknown_20244F4->unk0_2) // why a cast?!? changing the unk0_2 type to s8 causes extra shifts, but a cast is the correct fix. why, compiler?
+ if (battlerPosition >= (s8)sOakSpeechNidoranResources->battlePosition) // why a cast?!? changing the unk0_2 type to s8 causes extra shifts, but a cast is the correct fix. why, compiler?
battlerPosition = 0;
- gMultiuseSpriteTemplate = gUnknown_20244F4->unk10[battlerPosition];
+ gMultiuseSpriteTemplate = sOakSpeechNidoranResources->templates[battlerPosition];
}
else
{
- if(battlerPosition >= 4)
+ if (battlerPosition >= 4)
battlerPosition = 0;
gMultiuseSpriteTemplate = gUnknown_825DEF0[battlerPosition];
}
}
- gMultiuseSpriteTemplate.paletteTag = trainerSpriteId;
+ gMultiuseSpriteTemplate.paletteTag = speciesTag;
gMultiuseSpriteTemplate.anims = gUnknown_82349BC;
}
void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosition)
{
gMultiuseSpriteTemplate.paletteTag = trainerSpriteId;
- if(battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT)
+ if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT)
{
gMultiuseSpriteTemplate = gUnknown_825DF50[trainerSpriteId];
gMultiuseSpriteTemplate.anims = gTrainerBackAnimsPtrTable[trainerSpriteId];
@@ -1170,7 +2721,7 @@ void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosit
}
}
-void EncryptBoxMon(struct BoxPokemon *boxMon)
+static void EncryptBoxMon(struct BoxPokemon *boxMon)
{
u32 i;
for (i = 0; i < 12; i++)
@@ -1180,7 +2731,7 @@ void EncryptBoxMon(struct BoxPokemon *boxMon)
}
}
-void DecryptBoxMon(struct BoxPokemon *boxMon)
+static void DecryptBoxMon(struct BoxPokemon *boxMon)
{
u32 i;
for (i = 0; i < 12; i++)
@@ -1236,7 +2787,7 @@ case n: \
break; \
} \
-union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType)
+static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType)
{
union PokemonSubstruct *substruct = NULL;
@@ -1290,27 +2841,27 @@ u32 GetMonData(struct Pokemon *mon, s32 field, u8* data)
ret = mon->maxHP;
break;
case MON_DATA_ATK:
- ret = (u16)GetDeoxysStat(mon, STAT_ATK);
+ ret = GetDeoxysStat(mon, STAT_ATK);
if (!ret)
ret = mon->attack;
break;
case MON_DATA_DEF:
- ret = (u16)GetDeoxysStat(mon, STAT_DEF);
+ ret = GetDeoxysStat(mon, STAT_DEF);
if (!ret)
ret = mon->defense;
break;
case MON_DATA_SPEED:
- ret = (u16)GetDeoxysStat(mon, STAT_SPEED);
+ ret = GetDeoxysStat(mon, STAT_SPEED);
if (!ret)
ret = mon->speed;
break;
case MON_DATA_SPATK:
- ret = (u16)GetDeoxysStat(mon, STAT_SPATK);
+ ret = GetDeoxysStat(mon, STAT_SPATK);
if (!ret)
ret = mon->spAttack;
break;
case MON_DATA_SPDEF:
- ret = (u16)GetDeoxysStat(mon, STAT_SPDEF);
+ ret = GetDeoxysStat(mon, STAT_SPDEF);
if (!ret)
ret = mon->spDefense;
break;
@@ -2065,7 +3616,7 @@ u8 GiveMonToPlayer(struct Pokemon *mon)
return MON_GIVEN_TO_PARTY;
}
-u8 SendMonToPC(struct Pokemon* mon)
+static u8 SendMonToPC(struct Pokemon* mon)
{
s32 boxNo, boxPos;
@@ -2151,9 +3702,9 @@ u8 GetMonsStateToDoubles(void)
u8 GetAbilityBySpecies(u16 species, bool8 altAbility)
{
if (altAbility)
- gLastUsedAbility = gBaseStats[species].ability2;
+ gLastUsedAbility = gBaseStats[species].abilities[1];
else
- gLastUsedAbility = gBaseStats[species].ability1;
+ gLastUsedAbility = gBaseStats[species].abilities[0];
return gLastUsedAbility;
}
@@ -2165,7 +3716,7 @@ u8 GetMonAbility(struct Pokemon *mon)
return GetAbilityBySpecies(species, altAbility);
}
-void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord)
+static void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord)
{
s32 i, j;
@@ -2224,7 +3775,7 @@ bool8 IsPlayerPartyAndPokemonStorageFull(void)
return IsPokemonStorageFull();
}
-bool8 IsPokemonStorageFull(void)
+static bool8 IsPokemonStorageFull(void)
{
s32 i, j;
@@ -2258,22 +3809,22 @@ void GetSpeciesName(u8 *name, u16 species)
u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex)
{
u8 basePP = gBattleMoves[move].pp;
- return basePP + ((basePP * 20 * ((gUnknown_825DEA1[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100);
+ return basePP + ((basePP * 20 * ((gPPUpGetMask[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100);
}
void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex)
{
u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL);
- ppBonuses &= gPPUpWriteMasks[moveIndex];
+ ppBonuses &= gPPUpSetMask[moveIndex];
SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses);
}
void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex)
{
- mon->ppBonuses &= gPPUpWriteMasks[moveIndex];
+ mon->ppBonuses &= gPPUpSetMask[moveIndex];
}
-void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex)
+static void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex)
{
u16* hpSwitchout;
s32 i;
@@ -2333,10 +3884,6 @@ bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex,
return PokemonUseItemEffects(mon, item, partyIndex, moveIndex, 0);
}
-extern const u8 gUnknown_825DEA1[];
-extern const u8 gUnknown_825DEA9[];
-extern const u8 sGetMonDataEVConstants[];
-
bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e)
{
u32 data;
@@ -2512,11 +4059,11 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo
if (r10 & 0x20)
{
r10 &= ~0x20;
- data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2);
+ data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);
sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
if (data < 3 && sp28 > 4)
{
- data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gUnknown_825DEA9[moveIndex];
+ data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gPPUpAddMask[moveIndex];
SetMonData(pkmn, MON_DATA_PP_BONUSES, &data);
data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - sp28;
@@ -2741,13 +4288,13 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo
}
break;
case 4:
- data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2);
+ data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);
if (data < 3)
{
r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL);
- data &= gPPUpWriteMasks[moveIndex];
- data += gUnknown_825DEA9[moveIndex] * 3;
+ data &= gPPUpSetMask[moveIndex];
+ data += gPPUpAddMask[moveIndex] * 3;
SetMonData(pkmn, MON_DATA_PP_BONUSES, &data);
data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - r4;
@@ -2840,7 +4387,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo
return retVal;
}
-bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId)
+static bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId)
{
u32 status = GetMonData(mon, MON_DATA_STATUS, 0);
@@ -2858,8 +4405,6 @@ bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 bat
}
}
-extern bool8 sub_8042BE8(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId);
-
#ifdef NONMATCHING
/*
* This is nonmatching due to the compiler's insistence on avoiding the u8 cast
@@ -3047,11 +4592,11 @@ bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 m
if (r10 & 0x20)
{
r10 &= ~0x20;
- data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2);
+ data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);
sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
if (data < 3 && sp28 > 4)
{
- //data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gUnknown_825DEA9[moveIndex];
+ //data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gPPUpAddMask[moveIndex];
//SetMonData(pkmn, MON_DATA_PP_BONUSES, &data);
//
//data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - sp28;
@@ -3286,17 +4831,17 @@ bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 m
}
break;
case 4:
- data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2);
+ data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);
r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
if (data < 3)
{
- if(r4 <= 4)
+ if (r4 <= 4)
break;
/*
data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL);
- data &= gPPUpWriteMasks[moveIndex];
- data += gUnknown_825DEA9[moveIndex] * 3;
+ data &= gPPUpSetMask[moveIndex];
+ data += gPPUpAddMask[moveIndex] * 3;
SetMonData(pkmn, MON_DATA_PP_BONUSES, &data);
data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - r4;
@@ -3957,7 +5502,7 @@ _08042850:\n\
movs r2, 0\n\
bl GetMonData\n\
adds r5, r0, 0\n\
- ldr r0, _080428DC @ =gUnknown_825DEA1\n\
+ ldr r0, _080428DC @ =gPPUpGetMask\n\
ldr r1, [sp, 0x8]\n\
adds r0, r1, r0\n\
ldrb r0, [r0]\n\
@@ -4013,7 +5558,7 @@ _080428D2:\n\
ldr r0, [r0]\n\
mov pc, r0\n\
.align 2, 0\n\
-_080428DC: .4byte gUnknown_825DEA1\n\
+_080428DC: .4byte gPPUpGetMask\n\
_080428E0: .4byte _080428E4\n\
.align 2, 0\n\
_080428E4:\n\
@@ -4275,7 +5820,7 @@ _08042AF4:\n\
movs r2, 0\n\
bl GetMonData\n\
adds r5, r0, 0\n\
- ldr r0, _08042B48 @ =gUnknown_825DEA1\n\
+ ldr r0, _08042B48 @ =gPPUpGetMask\n\
ldr r1, [sp, 0x8]\n\
adds r0, r1, r0\n\
ldrb r0, [r0]\n\
@@ -4309,7 +5854,7 @@ _08042AF4:\n\
str r2, [sp, 0x10]\n\
b _08042BBE\n\
.align 2, 0\n\
-_08042B48: .4byte gUnknown_825DEA1\n\
+_08042B48: .4byte gPPUpGetMask\n\
_08042B4C:\n\
mov r0, r8\n\
movs r1, 0x20\n\
@@ -4397,9 +5942,9 @@ _08042BD8:\n\
}
#endif
-bool8 sub_8042BE8(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId)
+static bool8 sub_8042BE8(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId)
{
- if((GetMonData(mon, MON_DATA_STATUS, NULL) & healMask) != 0)
+ if ((GetMonData(mon, MON_DATA_STATUS, NULL) & healMask) != 0)
return TRUE;
else
return FALSE;
@@ -4518,7 +6063,7 @@ u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit)
return offset;
}
-void sub_8042D50(int stat)
+static void sub_8042D50(int stat)
{
gBattlerTarget = gBattlerInMenuId;
StringCopy(gBattleTextBuff1, gUnknown_83FD5D0[gUnknown_825DFF0[stat]]);
@@ -4526,7 +6071,7 @@ void sub_8042D50(int stat)
BattleStringExpandPlaceholdersToDisplayedString(BattleText_UnknownString3);
}
-u8 *sub_8042DA4(u16 itemId)
+const u8 *Battle_PrintStatBoosterEffectMessage(u16 itemId)
{
int i;
const u8 *itemEffect;
@@ -4581,13 +6126,11 @@ u8 GetNature(struct Pokemon *mon)
return GetMonData(mon, MON_DATA_PERSONALITY, 0) % 25;
}
-u8 GetNatureFromPersonality(u32 personality)
+static u8 GetNatureFromPersonality(u32 personality)
{
return personality % 25;
}
-extern bool32 sub_806E25C(void);
-
u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
{
int i;
@@ -4716,21 +6259,19 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
return targetSpecies;
}
-// HoennPokedexNumToSpecies, but is it really Hoenn or Kanto its checking
-// TODO: Figure this out
-u16 sub_80431B4(u16 var)
+static u16 HoennPokedexNumToSpecies(u16 var)
{
u16 species;
- if(!var)
+ if (!var)
return 0;
species = 0;
- while(species < POKEMON_SLOTS_NUMBER - 1 && gUnknown_8251CB8[species] != var)
+ while (species < POKEMON_SLOTS_NUMBER - 1 && sSpeciesToHoennPokedexNum[species] != var)
species++;
- if(species == POKEMON_SLOTS_NUMBER - 1)
+ if (species == POKEMON_SLOTS_NUMBER - 1)
return 0;
return species + 1;
@@ -4745,7 +6286,7 @@ u16 NationalPokedexNumToSpecies(u16 nationalNum)
species = 0;
- while (species < POKEMON_SLOTS_NUMBER - 1 && gUnknown_8251FEE[species] != nationalNum)
+ while (species < POKEMON_SLOTS_NUMBER - 1 && sSpeciesToNationalPokedexNum[species] != nationalNum)
species++;
if (species == POKEMON_SLOTS_NUMBER - 1)
@@ -4754,8 +6295,7 @@ u16 NationalPokedexNumToSpecies(u16 nationalNum)
return species + 1;
}
-// NationalToKantoOrder?
-u16 sub_804324C(u16 nationalNum)
+static u16 NationalToHoennOrder(u16 nationalNum)
{
u16 hoennNum;
@@ -4764,7 +6304,7 @@ u16 sub_804324C(u16 nationalNum)
hoennNum = 0;
- while (hoennNum < POKEMON_SLOTS_NUMBER - 1 && gUnknown_8252324[hoennNum] != nationalNum)
+ while (hoennNum < POKEMON_SLOTS_NUMBER - 1 && sHoennToNationalOrder[hoennNum] != nationalNum)
hoennNum++;
if (hoennNum == POKEMON_SLOTS_NUMBER - 1)
@@ -4778,17 +6318,15 @@ u16 SpeciesToNationalPokedexNum(u16 species)
if (!species)
return 0;
- return gUnknown_8251FEE[species - 1];
+ return sSpeciesToNationalPokedexNum[species - 1];
}
-// these 2 functions are probably kanto and not hoenn
-// TODO: figure this out
-u16 SpeciesToHoennPokedexNum(u16 species)
+static u16 SpeciesToHoennPokedexNum(u16 species)
{
if (!species)
return 0;
- return gUnknown_8251CB8[species - 1];
+ return sSpeciesToHoennPokedexNum[species - 1];
}
u16 HoennToNationalOrder(u16 hoennNum)
@@ -4796,7 +6334,7 @@ u16 HoennToNationalOrder(u16 hoennNum)
if (!hoennNum)
return 0;
- return gUnknown_8252324[hoennNum - 1];
+ return sHoennToNationalOrder[hoennNum - 1];
}
u16 SpeciesToCryId(u16 species)
@@ -4807,10 +6345,10 @@ u16 SpeciesToCryId(u16 species)
if (species <= SPECIES_OLD_UNOWN_Z - 1)
return SPECIES_UNOWN - 1;
- return gUnknown_82539D4[species - ((SPECIES_OLD_UNOWN_Z + 1) - 1)];
+ return sHoennSpeciesIdToCryId[species - ((SPECIES_OLD_UNOWN_Z + 1) - 1)];
}
-void sub_8043338(u16 species, u32 personality, u8 *dest)
+static void sub_8043338(u16 species, u32 personality, u8 *dest)
{
if (species == SPECIES_SPINDA
&& dest != gMonSpritesGfxPtr->sprites[0]
@@ -4820,13 +6358,13 @@ void sub_8043338(u16 species, u32 personality, u8 *dest)
for (i = 0; i < 4; i++)
{
int j;
- u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8);
- u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8);
+ u8 x = sSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8);
+ u8 y = sSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8);
for (j = 0; j < 16; j++)
{
int k;
- s32 row = gSpindaSpotGraphics[i].image[j];
+ s32 row = sSpindaSpotGraphics[i].image[j];
for (k = x; k < x + 16; k++)
{
@@ -4865,13 +6403,13 @@ void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, u8 a4)
for (i = 0; i < 4; i++)
{
int j;
- u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8);
- u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8);
+ u8 x = sSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8);
+ u8 y = sSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8);
for (j = 0; j < 16; j++)
{
int k;
- s32 row = gSpindaSpotGraphics[i].image[j];
+ s32 row = sSpindaSpotGraphics[i].image[j];
for (k = x; k < x + 16; k++)
{
@@ -4928,10 +6466,10 @@ bool8 sub_80435E0(void)
return retVal;
}
-bool8 sub_8043620(u8 id)
+bool8 GetLinkTrainerFlankId(u8 linkPlayerId)
{
bool8 retVal = FALSE;
- switch (gLinkPlayers[id].id)
+ switch (gLinkPlayers[linkPlayerId].id)
{
case 0:
case 3:
@@ -4954,12 +6492,12 @@ s32 GetBankMultiplayerId(u16 a1)
return id;
}
-u8 sub_804367C(u16 trainer)
+u8 GetTrainerEncounterMusicId(u16 trainer)
{
return gTrainers[trainer].encounterMusic_gender & 0x7F;
}
-u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex)
+static u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex)
{
if (statIndex < 1 || statIndex > 5)
{
@@ -4970,7 +6508,7 @@ u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex)
return retVal;
}
- switch (gNatureStatTable[nature][statIndex - 1])
+ switch (sNatureStatTable[nature][statIndex - 1])
{
case 1:
return (u16)(n * 110) / 100;
@@ -4986,10 +6524,6 @@ u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex)
#define TRAINER_CLASS_LEADER 0x57
#define TRAINER_CLASS_CHAMPION 0x5A
-// TODO: Move these too
-#define FRIENDSHIP_EVENT_LEAGUE_BATTLE 0x3
-#define FRIENDSHIP_EVENT_WALKING 0x5
-
void AdjustFriendship(struct Pokemon *mon, u8 event)
{
u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0);
@@ -5204,7 +6738,7 @@ u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection)
return retVal;
}
-void sub_8043B38(void)
+static void sub_8043B38(void)
{
u8 foo[4]; // huh?
}
@@ -5214,7 +6748,7 @@ void sub_8043B40(void)
u8 foo[4]; // huh?
}
-void sub_8043B48(struct Pokemon *mon, int species, u8 unused, u32 data)
+static void SetMonExpWithMaxLevelCheck(struct Pokemon *mon, int species, u8 unused, u32 data)
{
if (data > gExperienceTables[gBaseStats[species].growthRate][100])
{
@@ -5230,12 +6764,12 @@ bool8 TryIncrementMonLevel(struct Pokemon *mon)
u8 newLevel = level + 1;
u32 exp = GetMonData(mon, MON_DATA_EXP, NULL);
- if(level < 100)
+ if (level < 100)
{
- if(exp > gExperienceTables[gBaseStats[species].growthRate][newLevel])
+ if (exp > gExperienceTables[gBaseStats[species].growthRate][newLevel])
{
SetMonData(mon, MON_DATA_LEVEL, &newLevel);
- sub_8043B48(mon, species, newLevel, exp);
+ SetMonExpWithMaxLevelCheck(mon, species, newLevel, exp);
return TRUE;
}
else
@@ -5243,7 +6777,7 @@ bool8 TryIncrementMonLevel(struct Pokemon *mon)
}
else
{
- sub_8043B48(mon, species, level, exp);
+ SetMonExpWithMaxLevelCheck(mon, species, level, exp);
return FALSE;
}
}
@@ -5258,12 +6792,12 @@ u32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm)
else if (tm < 32)
{
u32 mask = 1 << tm;
- return gTMHMLearnsets[species][0] & mask;
+ return sTMHMLearnsets[species][0] & mask;
}
else
{
u32 mask = 1 << (tm - 32);
- return gTMHMLearnsets[species][1] & mask;
+ return sTMHMLearnsets[species][1] & mask;
}
}
@@ -5373,19 +6907,19 @@ u16 sub_8043F90(u16 species)
void ClearBattleMonForms(void)
{
int i;
- for(i = 0; i < 4; i++)
+ for (i = 0; i < 4; i++)
gBattleMonForms[i] = 0;
}
-u16 GetMUS_ForBattle(void)
+static u16 GetMUS_ForBattle(void)
{
- if(gBattleTypeFlags & 0x1000)
+ if (gBattleTypeFlags & 0x1000)
return 0x12A;
- if(gBattleTypeFlags & 0x4000)
+ if (gBattleTypeFlags & 0x4000)
return 0x10A;
- if(gBattleTypeFlags & 0x2)
+ if (gBattleTypeFlags & 0x2)
return 0x10A;
- if(gBattleTypeFlags & 0x8)
+ if (gBattleTypeFlags & 0x8)
{
switch (gTrainers[gTrainerBattleOpponent_A].trainerClass)
{
@@ -5423,7 +6957,7 @@ void PlayMapChosenOrBattleBGM(u16 songId)
PlayNewMapMusic(GetMUS_ForBattle());
}
-const u8 *GetMonFrontSpritePal(struct Pokemon *mon)
+const u32 *GetMonFrontSpritePal(struct Pokemon *mon)
{
u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0);
u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0);
@@ -5431,7 +6965,7 @@ const u8 *GetMonFrontSpritePal(struct Pokemon *mon)
return GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality);
}
-const u8 *GetFrontSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality)
+const u32 *GetFrontSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality)
{
u32 shinyValue;
@@ -5480,16 +7014,16 @@ bool8 IsPokeSpriteNotFlipped(u16 species)
return gBaseStats[species].noFlip;
}
-s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor)
+static s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor)
{
u8 nature = GetNature(mon);
- return gPokeblockFlavorCompatibilityTable[nature * 5 + flavor];
+ return sPokeblockFlavorCompatibilityTable[nature * 5 + flavor];
}
s8 GetFlavorRelationByPersonality(u32 personality, u8 flavor)
{
u8 nature = GetNatureFromPersonality(personality);
- return gPokeblockFlavorCompatibilityTable[nature * 5 + flavor];
+ return sPokeblockFlavorCompatibilityTable[nature * 5 + flavor];
}
bool8 IsTradedMon(struct Pokemon *mon)
@@ -5567,8 +7101,7 @@ void sub_8044348(void)
void SetWildMonHeldItem(void)
{
- // TODO: Replace 0x00010000 with the right flag that isnt BATTLE_TYPE_DOME
- if (!(gBattleTypeFlags & (0x00010000 | BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER)))
+ if (!(gBattleTypeFlags & (BATTLE_TYPE_POKEDUDE | BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER)))
{
u16 rnd = Random() % 100;
u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0);
@@ -5595,7 +7128,7 @@ bool8 IsMonShiny(struct Pokemon *mon)
return IsShinyOtIdPersonality(otId, personality);
}
-bool8 IsShinyOtIdPersonality(u32 otId, u32 personality)
+static bool8 IsShinyOtIdPersonality(u32 otId, u32 personality)
{
bool8 retVal = FALSE;
u32 shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality);
@@ -5604,8 +7137,728 @@ bool8 IsShinyOtIdPersonality(u32 otId, u32 personality)
return retVal;
}
-u8 *sub_80444C4(void)
+u8 *GetTrainerPartnerName(void)
{
u8 id = GetMultiplayerId();
return gLinkPlayers[GetBankMultiplayerId(gLinkPlayers[id].id ^ 2)].name;
}
+
+u8 GetPlayerPartyHighestLevel(void)
+{
+ s32 slot;
+ u8 level, monLevel;
+
+ level = 1;
+ for (slot = 0; slot < PARTY_SIZE; ++slot)
+ {
+ if (GetMonData(&gPlayerParty[slot], MON_DATA_SANITY_HAS_SPECIES, NULL) == 1 && !GetMonData(&gPlayerParty[slot], MON_DATA_SANITY_IS_EGG, NULL))
+ {
+ monLevel = GetMonData(&gPlayerParty[slot], MON_DATA_LEVEL, NULL);
+ if (monLevel > level)
+ level = monLevel;
+ }
+ }
+ return level;
+}
+
+u16 FacilityClassToPicIndex(u16 facilityClass)
+{
+ return gFacilityClassToPicIndex[facilityClass];
+}
+
+bool8 sub_804455C(u8 caseId, u8 battlerId)
+{
+ switch (caseId)
+ {
+ case 0:
+ default:
+ return FALSE;
+ case 1:
+ if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
+ return FALSE;
+ if (!gMain.inBattle)
+ return FALSE;
+ if (gLinkPlayers[GetMultiplayerId()].id == battlerId)
+ return FALSE;
+ break;
+ case 2:
+ break;
+ case 3:
+ if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
+ return FALSE;
+ if (!gMain.inBattle)
+ return FALSE;
+ if (battlerId == 1 || battlerId == 4 || battlerId == 5)
+ return TRUE;
+ return FALSE;
+ case 4:
+ break;
+ case 5:
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ if (!gMain.inBattle)
+ return FALSE;
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ if (gLinkPlayers[GetMultiplayerId()].id == battlerId)
+ return FALSE;
+ }
+ else
+ {
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!gMain.inBattle)
+ return FALSE;
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+static u16 GetDeoxysStat(struct Pokemon *mon, s32 statId)
+{
+ s32 ivVal, evVal;
+ u16 statValue;
+ u8 nature;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_20 || GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS)
+ {
+ return statValue = 0;
+ }
+ else
+ {
+ ivVal = GetMonData(mon, MON_DATA_HP_IV + statId, NULL);
+ evVal = GetMonData(mon, MON_DATA_HP_EV + statId, NULL);
+ statValue = ((sDeoxysBaseStats[statId] * 2 + ivVal + evVal / 4) * mon->level) / 100 + 5;
+ nature = GetNature(mon);
+ statValue = ModifyStatByNature(nature, statValue, (u8)statId);
+ }
+ return statValue;
+}
+
+void SetDeoxysStats(void)
+{
+ s32 i, value;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ struct Pokemon *mon = &gPlayerParty[i];
+
+ if (GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS)
+ continue;
+ value = GetMonData(mon, MON_DATA_ATK, NULL);
+ SetMonData(mon, MON_DATA_ATK, &value);
+ value = GetMonData(mon, MON_DATA_DEF, NULL);
+ SetMonData(mon, MON_DATA_DEF, &value);
+ value = GetMonData(mon, MON_DATA_SPEED, NULL);
+ SetMonData(mon, MON_DATA_SPEED, &value);
+ value = GetMonData(mon, MON_DATA_SPATK, NULL);
+ SetMonData(mon, MON_DATA_SPATK, &value);
+ value = GetMonData(mon, MON_DATA_SPDEF, NULL);
+ SetMonData(mon, MON_DATA_SPDEF, &value);
+ }
+}
+
+u16 sub_80447AC(void)
+{
+ u8 linkId = GetMultiplayerId() ^ 1;
+ u32 arrId = gLinkPlayers[linkId].trainerId & 7;
+
+ arrId |= gLinkPlayers[linkId].gender << 3;
+ return FacilityClassToPicIndex(gLinkPlayerFacilityClasses[arrId]);
+}
+
+u16 sub_80447F0(void)
+{
+ u8 linkId = GetMultiplayerId() ^ 1;
+ u32 arrId = gLinkPlayers[linkId].trainerId & 7;
+
+ arrId |= gLinkPlayers[linkId].gender << 3;
+ return gFacilityClassToTrainerClass[gLinkPlayerFacilityClasses[arrId]];
+}
+
+void CreateObedientEnemyMon(void)
+{
+ s32 species = gSpecialVar_0x8004;
+ s32 level = gSpecialVar_0x8005;
+ s32 itemId = gSpecialVar_0x8006;
+
+ ZeroEnemyPartyMons();
+ CreateObedientMon(&gEnemyParty[0], species, level, 32, 0, 0, 0, 0);
+ if (itemId)
+ {
+ u8 heldItem[2];
+
+ heldItem[0] = itemId;
+ heldItem[1] = itemId >> 8;
+ SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem);
+ }
+}
+
+void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality)
+{
+ u8 getFlagCaseId = (caseId == FLAG_SET_SEEN) ? FLAG_GET_SEEN : FLAG_GET_CAUGHT;
+
+ if (!GetSetPokedexFlag(nationalNum, getFlagCaseId))
+ {
+ GetSetPokedexFlag(nationalNum, caseId);
+ if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_UNOWN)
+ gSaveBlock2Ptr->pokedex.unownPersonality = personality;
+ if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_SPINDA)
+ gSaveBlock2Ptr->pokedex.spindaPersonality = personality;
+ }
+}
+
+bool8 CheckBattleTypeGhost(struct Pokemon *mon, u8 bank)
+{
+ u8 buffer[12];
+
+ if (gBattleTypeFlags & BATTLE_TYPE_GHOST && GetBattlerSide(bank))
+ {
+ GetMonData(mon, MON_DATA_NICKNAME, buffer);
+ StringGetEnd10(buffer);
+ if (!StringCompare(buffer, gUnknown_841D148))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void OakSpeechNidoranFSetupTemplate(struct OakSpeechNidoranFStruct *structPtr, u8 battlePosition)
+{
+ u16 i = 0, j = 0;
+
+ if (battlePosition > 3)
+ {
+ for (i = 0; i < (s8)structPtr->spriteCount; ++i)
+ {
+ structPtr->templates[i] = gUnknown_825DEF0[i];
+ for (j = 0; j < structPtr->frameCount; ++j)
+ structPtr->frameImages[i * structPtr->frameCount + j].data = &structPtr->bufferPtrs[i][j * 0x800];
+ structPtr->templates[i].images = &structPtr->frameImages[i * structPtr->frameCount];
+ }
+ }
+ else
+ {
+ const struct SpriteTemplate *template = &gUnknown_825DEF0[battlePosition];
+
+ structPtr->templates[0] = *template;
+ for (j = 0; j < structPtr->frameCount; ++j)
+ structPtr->frameImages[j].data = &structPtr->bufferPtrs[0][j * 0x800];
+ structPtr->templates[0].images = structPtr->frameImages;
+ }
+}
+
+// not used
+static void OakSpeechNidoranFSetupTemplateDummy(struct OakSpeechNidoranFStruct *structPtr)
+{
+ u16 i, j;
+
+ for (i = 0; i < (s8)structPtr->spriteCount; ++i)
+ {
+ structPtr->templates[i] = sOakSpeechNidoranFDummyTemplate;
+ for (j = 0; j < structPtr->frameCount; ++j)
+ structPtr->frameImages[i * structPtr->spriteCount + j].data = &structPtr->bufferPtrs[i][j * 0x800];
+ structPtr->templates[i].images = &structPtr->frameImages[i * structPtr->spriteCount]; // should be frameCount logically
+ structPtr->templates[i].anims = gUnknown_82349BC;
+ structPtr->templates[i].paletteTag = i;
+ }
+}
+
+#ifdef NONMATCHING
+struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 enable)
+{
+ s32 size;
+ u8 i, flags = 0;
+
+ if (sOakSpeechNidoranResources != NULL)
+ {
+ if (sOakSpeechNidoranResources->enable == 0xA3)
+ return NULL;
+ memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct));
+ sOakSpeechNidoranResources = NULL;
+ }
+ sOakSpeechNidoranResources = AllocZeroed(0x18);
+ if (sOakSpeechNidoranResources == NULL)
+ return NULL;
+ switch (enable)
+ {
+ case TRUE:
+ if (battlePosition == 4)
+ {
+ sOakSpeechNidoranResources->spriteCount = 4;
+ sOakSpeechNidoranResources->battlePosition = 4;
+ }
+ else
+ {
+ if (battlePosition > 4)
+ battlePosition = 0;
+ sOakSpeechNidoranResources->spriteCount = 1;
+ sOakSpeechNidoranResources->battlePosition = 1;
+ }
+ sOakSpeechNidoranResources->frameCount = 4;
+ sOakSpeechNidoranResources->enable2 = TRUE;
+ break;
+ case FALSE:
+ default:
+ if (!battlePosition)
+ battlePosition = 1;
+ if (battlePosition > 8)
+ battlePosition = 8;
+ // The following two statements refused to cooperate.
+ sOakSpeechNidoranResources->spriteCount = battlePosition;
+ sOakSpeechNidoranResources->battlePosition = battlePosition;
+ sOakSpeechNidoranResources->frameCount = 4;
+ sOakSpeechNidoranResources->enable2 = FALSE;
+ break;
+ }
+ size = sOakSpeechNidoranResources->frameCount * 0x800;
+ sOakSpeechNidoranResources->sizePerSprite = size;
+ sOakSpeechNidoranResources->dataBuffer = AllocZeroed(sOakSpeechNidoranResources->spriteCount * size);
+ sOakSpeechNidoranResources->bufferPtrs = AllocZeroed(sOakSpeechNidoranResources->spriteCount * 0x20);
+ if (sOakSpeechNidoranResources->dataBuffer == NULL || sOakSpeechNidoranResources->bufferPtrs == NULL)
+ {
+ flags |= 1;
+ }
+ else
+ {
+ for (i = 0; i < (s8)sOakSpeechNidoranResources->spriteCount; ++i)
+ sOakSpeechNidoranResources->bufferPtrs[i] = &sOakSpeechNidoranResources->dataBuffer[sOakSpeechNidoranResources->sizePerSprite * i];
+ }
+ sOakSpeechNidoranResources->templates = AllocZeroed(sizeof(struct SpriteTemplate) * sOakSpeechNidoranResources->spriteCount);
+ sOakSpeechNidoranResources->frameImages = AllocZeroed(sOakSpeechNidoranResources->spriteCount * sizeof(struct SpriteFrameImage) * sOakSpeechNidoranResources->frameCount);
+ if (sOakSpeechNidoranResources->templates == NULL || sOakSpeechNidoranResources->frameImages == NULL)
+ {
+ flags |= 2;
+ }
+ else
+ {
+ for (i = 0; i < sOakSpeechNidoranResources->frameCount * sOakSpeechNidoranResources->spriteCount; ++i)
+ sOakSpeechNidoranResources->frameImages[i].size = 0x800;
+ switch (sOakSpeechNidoranResources->enable2)
+ {
+ case TRUE:
+ OakSpeechNidoranFSetupTemplate(sOakSpeechNidoranResources, battlePosition);
+ break;
+ case FALSE:
+ default:
+ OakSpeechNidoranFSetupTemplateDummy(sOakSpeechNidoranResources);
+ break;
+ }
+ }
+ if (flags & 2)
+ {
+ if (sOakSpeechNidoranResources->frameImages != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->frameImages);
+ if (sOakSpeechNidoranResources->templates != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->templates);
+ }
+ if (flags & 1)
+ {
+ if (sOakSpeechNidoranResources->bufferPtrs != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->bufferPtrs);
+ if (sOakSpeechNidoranResources->dataBuffer != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->dataBuffer);
+ }
+ if (flags)
+ {
+ memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct));
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources);
+ }
+ else
+ {
+ sOakSpeechNidoranResources->enable = 0xA3;
+ }
+ return sOakSpeechNidoranResources;
+}
+#else
+NAKED
+struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 enable)
+{
+ asm_unified("\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ lsls r1, 24\n\
+ lsrs r5, r1, 24\n\
+ movs r0, 0\n\
+ mov r8, r0\n\
+ ldr r4, _08044B34 @ =sOakSpeechNidoranResources\n\
+ ldr r1, [r4]\n\
+ cmp r1, 0\n\
+ beq _08044B1E\n\
+ ldrb r0, [r1, 0x2]\n\
+ cmp r0, 0xA3\n\
+ beq _08044B2E\n\
+ adds r0, r1, 0\n\
+ movs r1, 0\n\
+ movs r2, 0x18\n\
+ bl memset\n\
+ mov r1, r8\n\
+ str r1, [r4]\n\
+ _08044B1E:\n\
+ ldr r4, _08044B34 @ =sOakSpeechNidoranResources\n\
+ movs r0, 0x18\n\
+ bl AllocZeroed\n\
+ adds r2, r0, 0\n\
+ str r2, [r4]\n\
+ cmp r2, 0\n\
+ bne _08044B38\n\
+ _08044B2E:\n\
+ movs r0, 0\n\
+ b _08044D70\n\
+ .align 2, 0\n\
+ _08044B34: .4byte sOakSpeechNidoranResources\n\
+ _08044B38:\n\
+ cmp r5, 0\n\
+ beq _08044B94\n\
+ cmp r5, 0x1\n\
+ bne _08044B94\n\
+ cmp r6, 0x4\n\
+ bne _08044B5E\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0x10\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ movs r1, 0x4\n\
+ orrs r0, r1\n\
+ strb r0, [r2]\n\
+ ldr r2, [r4]\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF\n\
+ ands r0, r1\n\
+ movs r1, 0x40\n\
+ b _08044B7C\n\
+ _08044B5E:\n\
+ cmp r6, 0x4\n\
+ bls _08044B64\n\
+ movs r6, 0\n\
+ _08044B64:\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0x10\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ movs r1, 0x1\n\
+ orrs r0, r1\n\
+ strb r0, [r2]\n\
+ ldr r2, [r4]\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF\n\
+ ands r0, r1\n\
+ movs r1, 0x10\n\
+ _08044B7C:\n\
+ orrs r0, r1\n\
+ strb r0, [r2]\n\
+ ldr r2, _08044B90 @ =sOakSpeechNidoranResources\n\
+ ldr r1, [r2]\n\
+ movs r0, 0x4\n\
+ strb r0, [r1, 0x1]\n\
+ ldr r1, [r2]\n\
+ movs r0, 0x1\n\
+ strb r0, [r1, 0x3]\n\
+ b _08044BD0\n\
+ .align 2, 0\n\
+ _08044B90: .4byte sOakSpeechNidoranResources\n\
+ _08044B94:\n\
+ cmp r6, 0\n\
+ bne _08044B9A\n\
+ movs r6, 0x1\n\
+ _08044B9A:\n\
+ cmp r6, 0x8\n\
+ bls _08044BA0\n\
+ movs r6, 0x8\n\
+ _08044BA0:\n\
+ ldr r4, _08044C10 @ =sOakSpeechNidoranResources\n\
+ ldr r3, [r4]\n\
+ movs r0, 0xF\n\
+ adds r1, r6, 0\n\
+ ands r1, r0\n\
+ ldrb r2, [r3]\n\
+ movs r0, 0x10\n\
+ negs r0, r0\n\
+ ands r0, r2\n\
+ orrs r0, r1\n\
+ strb r0, [r3]\n\
+ ldr r2, [r4]\n\
+ lsls r3, r6, 4\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF\n\
+ ands r0, r1\n\
+ orrs r0, r3\n\
+ strb r0, [r2]\n\
+ ldr r1, [r4]\n\
+ movs r2, 0\n\
+ movs r0, 0x4\n\
+ strb r0, [r1, 0x1]\n\
+ ldr r0, [r4]\n\
+ strb r2, [r0, 0x3]\n\
+ _08044BD0:\n\
+ ldr r5, _08044C10 @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r5]\n\
+ ldrb r1, [r0, 0x1]\n\
+ lsls r1, 11\n\
+ str r1, [r0, 0x4]\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 28\n\
+ lsrs r0, 28\n\
+ muls r0, r1\n\
+ bl AllocZeroed\n\
+ ldr r1, [r5]\n\
+ str r0, [r1, 0x8]\n\
+ ldrb r0, [r1]\n\
+ lsls r0, 28\n\
+ lsrs r0, 23\n\
+ bl AllocZeroed\n\
+ adds r2, r0, 0\n\
+ ldr r1, [r5]\n\
+ str r2, [r1, 0xC]\n\
+ ldr r0, [r1, 0x8]\n\
+ cmp r0, 0\n\
+ beq _08044C04\n\
+ cmp r2, 0\n\
+ bne _08044C14\n\
+ _08044C04:\n\
+ movs r0, 0x1\n\
+ mov r1, r8\n\
+ orrs r1, r0\n\
+ mov r8, r1\n\
+ b _08044C44\n\
+ .align 2, 0\n\
+ _08044C10: .4byte sOakSpeechNidoranResources\n\
+ _08044C14:\n\
+ ldrb r0, [r1]\n\
+ lsls r0, 28\n\
+ movs r4, 0\n\
+ adds r3, r5, 0\n\
+ cmp r0, 0\n\
+ beq _08044C44\n\
+ _08044C20:\n\
+ ldr r3, [r5]\n\
+ ldr r0, [r3, 0xC]\n\
+ lsls r1, r4, 2\n\
+ adds r1, r0\n\
+ ldr r0, [r3, 0x4]\n\
+ adds r2, r0, 0\n\
+ muls r2, r4\n\
+ ldr r0, [r3, 0x8]\n\
+ adds r0, r2\n\
+ str r0, [r1]\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ ldrb r0, [r3]\n\
+ lsls r0, 28\n\
+ lsrs r0, 28\n\
+ cmp r4, r0\n\
+ blt _08044C20\n\
+ _08044C44:\n\
+ ldr r5, _08044C8C @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r5]\n\
+ ldrb r1, [r0]\n\
+ lsls r1, 28\n\
+ lsrs r1, 28\n\
+ lsls r0, r1, 1\n\
+ adds r0, r1\n\
+ lsls r0, 3\n\
+ bl AllocZeroed\n\
+ ldr r2, [r5]\n\
+ str r0, [r2, 0x10]\n\
+ ldrb r1, [r2]\n\
+ lsls r1, 28\n\
+ lsrs r1, 28\n\
+ ldrb r0, [r2, 0x1]\n\
+ lsls r0, 3\n\
+ muls r0, r1\n\
+ bl AllocZeroed\n\
+ adds r2, r0, 0\n\
+ ldr r1, [r5]\n\
+ str r2, [r1, 0x14]\n\
+ ldr r0, [r1, 0x10]\n\
+ cmp r0, 0\n\
+ beq _08044C7C\n\
+ cmp r2, 0\n\
+ bne _08044C90\n\
+ _08044C7C:\n\
+ movs r0, 0x2\n\
+ mov r1, r8\n\
+ orrs r1, r0\n\
+ lsls r0, r1, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ b _08044CE2\n\
+ .align 2, 0\n\
+ _08044C8C: .4byte sOakSpeechNidoranResources\n\
+ _08044C90:\n\
+ movs r4, 0\n\
+ ldrb r0, [r1, 0x1]\n\
+ ldrb r1, [r1]\n\
+ lsls r1, 28\n\
+ lsrs r1, 28\n\
+ muls r0, r1\n\
+ adds r3, r5, 0\n\
+ cmp r4, r0\n\
+ bge _08044CC6\n\
+ adds r7, r3, 0\n\
+ movs r5, 0x80\n\
+ lsls r5, 4\n\
+ _08044CA8:\n\
+ ldr r2, [r7]\n\
+ ldr r1, [r2, 0x14]\n\
+ lsls r0, r4, 3\n\
+ adds r0, r1\n\
+ strh r5, [r0, 0x4]\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ ldrb r1, [r2, 0x1]\n\
+ ldrb r0, [r2]\n\
+ lsls r0, 28\n\
+ lsrs r0, 28\n\
+ muls r0, r1\n\
+ cmp r4, r0\n\
+ blt _08044CA8\n\
+ _08044CC6:\n\
+ ldr r0, [r3]\n\
+ ldrb r4, [r0, 0x3]\n\
+ cmp r4, 0\n\
+ beq _08044CDA\n\
+ cmp r4, 0x1\n\
+ bne _08044CDA\n\
+ adds r1, r6, 0\n\
+ bl OakSpeechNidoranFSetupTemplate\n\
+ b _08044CE2\n\
+ _08044CDA:\n\
+ ldr r0, _08044D60 @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r0]\n\
+ bl OakSpeechNidoranFSetupTemplateDummy\n\
+ _08044CE2:\n\
+ movs r0, 0x2\n\
+ mov r1, r8\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08044D12\n\
+ ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r4]\n\
+ ldr r0, [r0, 0x14]\n\
+ cmp r0, 0\n\
+ beq _08044D00\n\
+ bl Free\n\
+ ldr r1, [r4]\n\
+ movs r0, 0\n\
+ str r0, [r1, 0x14]\n\
+ _08044D00:\n\
+ ldr r0, [r4]\n\
+ ldr r0, [r0, 0x10]\n\
+ cmp r0, 0\n\
+ beq _08044D12\n\
+ bl Free\n\
+ ldr r1, [r4]\n\
+ movs r0, 0\n\
+ str r0, [r1, 0x10]\n\
+ _08044D12:\n\
+ movs r0, 0x1\n\
+ mov r1, r8\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08044D42\n\
+ ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r4]\n\
+ ldr r0, [r0, 0xC]\n\
+ cmp r0, 0\n\
+ beq _08044D30\n\
+ bl Free\n\
+ ldr r1, [r4]\n\
+ movs r0, 0\n\
+ str r0, [r1, 0xC]\n\
+ _08044D30:\n\
+ ldr r0, [r4]\n\
+ ldr r0, [r0, 0x8]\n\
+ cmp r0, 0\n\
+ beq _08044D42\n\
+ bl Free\n\
+ ldr r1, [r4]\n\
+ movs r0, 0\n\
+ str r0, [r1, 0x8]\n\
+ _08044D42:\n\
+ mov r0, r8\n\
+ cmp r0, 0\n\
+ beq _08044D64\n\
+ ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r4]\n\
+ movs r1, 0\n\
+ movs r2, 0x18\n\
+ bl memset\n\
+ ldr r0, [r4]\n\
+ bl Free\n\
+ movs r0, 0\n\
+ str r0, [r4]\n\
+ b _08044D6C\n\
+ .align 2, 0\n\
+ _08044D60: .4byte sOakSpeechNidoranResources\n\
+ _08044D64:\n\
+ ldr r0, _08044D7C @ =sOakSpeechNidoranResources\n\
+ ldr r1, [r0]\n\
+ movs r0, 0xA3\n\
+ strb r0, [r1, 0x2]\n\
+ _08044D6C:\n\
+ ldr r0, _08044D7C @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r0]\n\
+ _08044D70:\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
+ _08044D7C: .4byte sOakSpeechNidoranResources\n\
+ ");
+}
+#endif
+
+void OakSpeechNidoranFFreeResources(void)
+{
+ if (sOakSpeechNidoranResources != NULL)
+ {
+ if (sOakSpeechNidoranResources->enable != 0xA3)
+ {
+ memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct));
+ sOakSpeechNidoranResources = NULL;
+ }
+ else
+ {
+ if (sOakSpeechNidoranResources->frameImages != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->frameImages);
+ if (sOakSpeechNidoranResources->templates != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->templates);
+ if (sOakSpeechNidoranResources->bufferPtrs != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->bufferPtrs);
+ if (sOakSpeechNidoranResources->dataBuffer != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->dataBuffer);
+ memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct));
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources);
+ }
+
+ }
+}
+
+void *OakSpeechNidoranFGetBuffer(u8 bufferId)
+{
+ if (sOakSpeechNidoranResources->enable != 0xA3)
+ {
+ return NULL;
+ }
+ else
+ {
+ if (bufferId >= (s8)sOakSpeechNidoranResources->spriteCount)
+ bufferId = 0;
+ return sOakSpeechNidoranResources->bufferPtrs[bufferId];
+ }
+}
diff --git a/src/quest_log.c b/src/quest_log.c
index b52de727e..0d1cb7984 100644
--- a/src/quest_log.c
+++ b/src/quest_log.c
@@ -11,7 +11,7 @@
#include "menu_helpers.h"
#include "window.h"
#include "text_window.h"
-#include "unk_text_util.h"
+#include "dynamic_placeholder_text_util.h"
#include "event_data.h"
#include "event_scripts.h"
#include "string_util.h"
@@ -37,6 +37,7 @@
#include "link.h"
#include "quest_log_8150454.h"
#include "quest_log.h"
+#include "new_menu_helpers.h"
u8 gUnknown_3005E88;
@@ -859,7 +860,7 @@ void sub_8110F14(u8 taskId)
}
else
{
- SetMainCallback2(sub_8056938);
+ SetMainCallback2(CB2_ContinueSavedGame);
DestroyTask(taskId);
}
}
@@ -922,7 +923,7 @@ void sub_8111070(u8 a0)
StringAppend(gStringVar4, gStringVar1);
}
- AddTextPrinterParametrized2(gUnknown_203ADFE[0], 2, 2, 2, 1, 2, &gUnknown_8456634, 0, gStringVar4);
+ AddTextPrinterParameterized4(gUnknown_203ADFE[0], 2, 2, 2, 1, 2, &gUnknown_8456634, 0, gStringVar4);
PutWindowTilemap(gUnknown_203ADFE[0]);
PutWindowTilemap(gUnknown_203ADFE[1]);
CopyWindowToVram(gUnknown_203ADFE[0], 2);
@@ -985,8 +986,8 @@ void sub_8111368(void)
{
gUnknown_203ADFA = 2;
sub_806E6FC();
- sub_809A2DC();
- sub_809A2A4();
+ ClearItemSlotsInAllBagPockets();
+ ClearPCItemSlots();
if (sub_8110AC8() == 1)
{
sub_8111274(gUnknown_203ADF8, 0);
@@ -996,7 +997,7 @@ void sub_8111368(void)
else
{
sub_8111274(gUnknown_203ADF8, 1);
- warp_in();
+ WarpIntoMap();
gFieldCallback2 = sub_8111000;
SetMainCallback2(sub_805726C);
}
@@ -1417,8 +1418,8 @@ void sub_8111D10(void)
PutWindowTilemap(gUnknown_203ADFE[2]);
sub_8111D90(gUnknown_203ADFE[2]);
- AddTextPrinterParametrized2(gUnknown_203ADFE[2], 2, 2, gUnknown_8456698[count], 1, 0, &gUnknown_8456634, 0, gStringVar4);
- schedule_bg_copy_tilemap_to_vram(0);
+ AddTextPrinterParameterized4(gUnknown_203ADFE[2], 2, 2, gUnknown_8456698[count], 1, 0, &gUnknown_8456634, 0, gStringVar4);
+ ScheduleBgCopyTilemapToVram(0);
}
void sub_8111D90(u8 a0)
@@ -1567,7 +1568,7 @@ void sub_81120AC(u8 taskId)
{
case 0:
gUnknown_2031DD8 = 0;
- sub_8055DC4();
+ Overworld_PlaySpecialMapMusic();
sub_811229C();
FillWindowPixelRect(gUnknown_203ADFE[0], 0xF, 0, 0, gUnknown_845661C[0].width * 8, gUnknown_845661C[0].height * 8);
data[0]++;
@@ -1691,7 +1692,7 @@ void sub_81123BC(void)
void sub_8112450(void)
{
- if (sub_80BF708() != 1)
+ if (MenuHelpers_LinkSomething() != 1)
{
sub_8112364();
sub_81123BC();
@@ -1705,7 +1706,7 @@ void sub_811246C(struct Sprite *sprite)
{
if (gUnknown_203AF9A[0][0] != 0xFF)
{
- sub_8063CA4(mapObject, gUnknown_203AF9A[0][0]);
+ FieldObjectSetHeldMovement(mapObject, gUnknown_203AF9A[0][0]);
gUnknown_203AF9A[0][0] = 0xFF;
}
if (gUnknown_203AF9A[0][1] != 0xFF)
@@ -1719,7 +1720,7 @@ void sub_811246C(struct Sprite *sprite)
{
if (gUnknown_203AF9A[mapObject->localId][0] != 0xFF)
{
- sub_8063CA4(mapObject, gUnknown_203AF9A[mapObject->localId][0]);
+ FieldObjectSetHeldMovement(mapObject, gUnknown_203AF9A[mapObject->localId][0]);
gUnknown_203AF9A[mapObject->localId][0] = 0xFF;
}
sub_8063E28(mapObject, sprite);
@@ -1911,7 +1912,7 @@ void sub_8112940(u8 a0, struct UnkStruct_203AE98 *a1, u16 a2)
gUnknown_3005E94[gUnknown_203AF98].unk_4 = 0;
gUnknown_3005E94[gUnknown_203AF98].unk_6 = 0;
gUnknown_3005E94[gUnknown_203AF98].unk_0 = 0;
- switch (player_get_direction_lower_nybble())
+ switch (GetPlayerFacingDirection())
{
case 0:
case 1:
@@ -2297,7 +2298,7 @@ const struct WindowTemplate gUnknown_8456928 = {
0x00, 0, 15, 30, 5, 15, 0x008F
};
-void sub_8112EA8(void)
+void MapNamePopupWindowIdSetDummy(void)
{
gUnknown_203B020 = 0xFF;
}
@@ -2468,15 +2469,15 @@ const struct TextColor gUnknown_8456930 = {
void sub_8112FE4(const u8 * a0)
{
- AddTextPrinterParametrized2(gUnknown_203B020, 0x02, 2, 5, 1, 1, &gUnknown_8456930, -1, a0);
+ AddTextPrinterParameterized4(gUnknown_203B020, 0x02, 2, 5, 1, 1, &gUnknown_8456930, -1, a0);
}
-void sub_8113018(const u8 * a0, u8 a1)
+void sub_8113018(const u8 * text, u8 mode)
{
sub_8112FD0();
- sub_8112FE4(a0);
- if (a1)
- CopyWindowToVram(gUnknown_203B020, a1);
+ sub_8112FE4(text);
+ if (mode)
+ CopyWindowToVram(gUnknown_203B020, mode);
}
void sub_8113044(void)
@@ -2746,7 +2747,7 @@ void sub_81134CC(struct Var4038Struct * a0)
if (VarGet(VAR_MAP_SCENE_SAFFRON_CITY_POKEMON_TRAINER_FAN_CLUB) == 2)
{
sub_8113078(a0);
- if (gUnknown_2023E8A == 1)
+ if (gBattleOutcome == B_OUTCOME_WON)
sub_8113194(a0);
else
sub_81131FC(a0);
@@ -2842,7 +2843,7 @@ void sub_8113550(u16 a0, const u16 * a1)
if (sub_81138A0(a0, a1) == TRUE)
return;
- if (sub_80BF708() == TRUE)
+ if (MenuHelpers_LinkSomething() == TRUE)
return;
// NONMATCHING: branch logic here
@@ -2954,7 +2955,7 @@ void sub_8113550(u16 a0, const u16 * a1)
"\tbne _081135AA\n"
"\tb ._return\n"
"_081135AA:\n"
- "\tbl sub_80BF708\n"
+ "\tbl MenuHelpers_LinkSomething\n"
"\tlsls r0, 24\n"
"\tlsrs r0, 24\n"
"\tcmp r0, 0x1\n"
@@ -3656,9 +3657,9 @@ void QuestLog_AutoGetSpeciesName(u16 a0, u8 * a1, u8 a2)
else
{
if (a0 != SPECIES_EGG)
- UnkTextUtil_SetPtrI(a2, gSpeciesNames[a0]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(a2, gSpeciesNames[a0]);
else
- UnkTextUtil_SetPtrI(a2, gText_EggNickname);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(a2, gText_EggNickname);
}
}
@@ -3708,7 +3709,7 @@ const u16 * sub_8113FBC(const u16 * a0)
case POCKET_ITEMS:
case POCKET_POKE_BALLS:
case POCKET_BERRY_POUCH:
- StringCopy(gStringVar1, ItemId_GetItem(r5[0])->name);
+ StringCopy(gStringVar1, ItemId_GetName(r5[0]));
if (r5[0] == ITEM_ESCAPE_ROPE)
{
sub_80C4DF8(gStringVar2, r5[2]);
@@ -3725,7 +3726,7 @@ const u16 * sub_8113FBC(const u16 * a0)
}
break;
case POCKET_KEY_ITEMS:
- StringCopy(gStringVar1, ItemId_GetItem(r5[0])->name);
+ StringCopy(gStringVar1, ItemId_GetName(r5[0]));
StringExpandPlaceholders(gStringVar4, gUnknown_841A220);
break;
case POCKET_TM_CASE:
@@ -3771,7 +3772,7 @@ const u16 * sub_8114188(const u16 * a0)
{
const u16 * r4 = sub_8113E88(5, a0);
QuestLog_AutoGetSpeciesName(r4[1], gStringVar1, 0);
- StringCopy(gStringVar2, ItemId_GetItem(r4[0])->name);
+ StringCopy(gStringVar2, ItemId_GetName(r4[0]));
StringExpandPlaceholders(gStringVar4, gUnknown_841AB74);
r4 += 2;
return r4;
@@ -3787,7 +3788,7 @@ const u16 * sub_81141E4(const u16 * a0)
const u16 * r4 = sub_8113E88(6, a0);
QuestLog_AutoGetSpeciesName(r4[1], gStringVar1, 0);
- StringCopy(gStringVar2, ItemId_GetItem(r4[0])->name);
+ StringCopy(gStringVar2, ItemId_GetName(r4[0]));
StringExpandPlaceholders(gStringVar4, gUnknown_841AB8E);
r4 += 2;
return r4;
@@ -3803,7 +3804,7 @@ const u16 * sub_8114240(const u16 * a0)
const u16 * r4 = sub_8113E88(7, a0);
QuestLog_AutoGetSpeciesName(r4[1], gStringVar2, 0);
- StringCopy(gStringVar1, ItemId_GetItem(r4[0])->name);
+ StringCopy(gStringVar1, ItemId_GetName(r4[0]));
StringExpandPlaceholders(gStringVar4, gUnknown_841A6A5);
r4 += 2;
return r4;
@@ -3819,7 +3820,7 @@ const u16 * sub_811429C(const u16 * a0)
const u16 * r4 = sub_8113E88(8, a0);
QuestLog_AutoGetSpeciesName(r4[1], gStringVar1, 0);
- StringCopy(gStringVar2, ItemId_GetItem(r4[0])->name);
+ StringCopy(gStringVar2, ItemId_GetName(r4[0]));
StringExpandPlaceholders(gStringVar4, gUnknown_841A1CD);
r4 += 2;
return r4;
@@ -3846,8 +3847,8 @@ const u16 * sub_8114324(const u16 * a0)
{
const u16 * r4 = sub_8113E88(9, a0);
QuestLog_AutoGetSpeciesName(r4[2], gStringVar1, 0);
- StringCopy(gStringVar2, ItemId_GetItem(r4[0])->name);
- StringCopy(gStringVar3, ItemId_GetItem(r4[1])->name);
+ StringCopy(gStringVar2, ItemId_GetName(r4[0]));
+ StringCopy(gStringVar3, ItemId_GetName(r4[1]));
StringExpandPlaceholders(gStringVar4, gUnknown_841A193);
r4 += 3;
return r4;
@@ -3862,8 +3863,8 @@ const u16 * sub_8114394(const u16 * a0)
{
const u16 * r4 = sub_8113E88(10, a0);
QuestLog_AutoGetSpeciesName(r4[2], gStringVar2, 0);
- StringCopy(gStringVar3, ItemId_GetItem(r4[0])->name);
- StringCopy(gStringVar1, ItemId_GetItem(r4[1])->name);
+ StringCopy(gStringVar3, ItemId_GetName(r4[0]));
+ StringCopy(gStringVar1, ItemId_GetName(r4[1]));
StringExpandPlaceholders(gStringVar4, gUnknown_841A6E1);
r4 += 3;
return r4;
@@ -3949,14 +3950,14 @@ u16 * sub_81144EC(u16 * a0, const u16 * a1)
const u16 * sub_8114518(const u16 * a0)
{
- UnkTextUtil_Reset();
+ DynamicPlaceholderTextUtil_Reset();
memset(gStringVar1, EOS, 8);
memcpy(gStringVar1, (const u8 *)a0 + 5, 7);
sub_8115834(gStringVar1);
- UnkTextUtil_SetPtrI(0, gStringVar1);
- UnkTextUtil_SetPtrI(1, gUnknown_8456AE4[((const u8 *)a0)[4]]);
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A422);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_8456AE4[((const u8 *)a0)[4]]);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A422);
a0 += 6;
return a0;
}
@@ -3973,14 +3974,14 @@ u16 * sub_8114578(u16 * a0, const u16 * a1)
const u16 * sub_81145A4(const u16 * a0)
{
- UnkTextUtil_Reset();
+ DynamicPlaceholderTextUtil_Reset();
memset(gStringVar1, EOS, 8);
memcpy(gStringVar1, (const u8 *)a0 + 5, 7);
sub_8115834(gStringVar1);
- UnkTextUtil_SetPtrI(0, gStringVar1);
- UnkTextUtil_SetPtrI(1, gUnknown_8456AE4[((const u8 *)a0)[4]]);
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A477);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_8456AE4[((const u8 *)a0)[4]]);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A477);
a0 += 6;
return a0;
}
@@ -3999,7 +4000,7 @@ u16 * sub_8114604(u16 * a0, const u16 * a1)
const u16 * sub_811464C(const u16 * a0)
{
- UnkTextUtil_Reset();
+ DynamicPlaceholderTextUtil_Reset();
memset(gStringVar1, EOS, 8);
memset(gStringVar2, EOS, 8);
@@ -4010,12 +4011,12 @@ const u16 * sub_811464C(const u16 * a0)
sub_8115834(gStringVar1);
sub_8115834(gStringVar2);
sub_8115834(gStringVar3);
- UnkTextUtil_SetPtrI(0, gSaveBlock2Ptr->playerName);
- UnkTextUtil_SetPtrI(1, gStringVar1);
- UnkTextUtil_SetPtrI(2, gStringVar2);
- UnkTextUtil_SetPtrI(3, gStringVar3);
- UnkTextUtil_SetPtrI(4, gUnknown_8456AE4[((const u8 *)a0)[4]]);
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A4C6);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gStringVar3);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gUnknown_8456AE4[((const u8 *)a0)[4]]);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A4C6);
a0 += 13;
return a0;
}
@@ -4111,12 +4112,12 @@ const u16 * sub_81148BC(const u16 * a0)
const u8 * boxIdxs;
a0 = sub_8113E88(20, a0);
boxIdxs = (const u8 *)a0 + 4;
- UnkTextUtil_Reset();
- UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));
QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
- UnkTextUtil_SetPtrI(2, GetBoxNamePtr(boxIdxs[1]));
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, GetBoxNamePtr(boxIdxs[1]));
QuestLog_AutoGetSpeciesName(a0[1], NULL, 3);
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A566);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A566);
return a0 + 3;
}
@@ -4136,11 +4137,11 @@ const u16 * sub_8114944(const u16 * a0)
const u8 * boxIdxs;
a0 = sub_8113E88(21, a0);
boxIdxs = (const u8 *)a0 + 4;
- UnkTextUtil_Reset();
- UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));
QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
QuestLog_AutoGetSpeciesName(a0[1], NULL, 2);
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A5D9);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A5D9);
return a0 + 3;
}
@@ -4172,11 +4173,11 @@ const u16 * sub_81149D0(const u16 * a0)
const u8 * boxIdxs;
a0 = sub_8113E88(22, a0);
boxIdxs = (const u8 *)a0 + 4;
- UnkTextUtil_Reset();
- UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));
QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
QuestLog_AutoGetSpeciesName(a0[1], NULL, 2);
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A60A);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A60A);
return a0 + 3;
}
@@ -4199,11 +4200,11 @@ const u16 * sub_8114A4C(const u16 * a0)
const u8 * boxIdxs;
a0 = sub_8113E88(23, a0);
boxIdxs = (const u8 *)a0 + 2;
- UnkTextUtil_Reset();
- UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));
QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
- UnkTextUtil_SetPtrI(2, GetBoxNamePtr(boxIdxs[1]));
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A59C);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, GetBoxNamePtr(boxIdxs[1]));
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A59C);
return (const u16 *)boxIdxs + 1;
}
@@ -4223,10 +4224,10 @@ const u16 * sub_8114AC8(const u16 * a0)
const u8 * boxIdxs;
a0 = sub_8113E88(24, a0);
boxIdxs = (const u8 *)a0 + 2;
- UnkTextUtil_Reset();
- UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));
QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A5FA);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A5FA);
return (const u16 *)boxIdxs + 1;
}
@@ -4246,10 +4247,10 @@ const u16 * sub_8114B34(const u16 * a0)
const u8 * boxIdxs;
a0 = sub_8113E88(25, a0);
boxIdxs = (const u8 *)a0 + 2;
- UnkTextUtil_Reset();
- UnkTextUtil_SetPtrI(0, GetBoxNamePtr(boxIdxs[0]));
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(boxIdxs[0]));
QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A632);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A632);
return (const u16 *)boxIdxs + 1;
}
@@ -4269,10 +4270,10 @@ const u16 * sub_8114BA0(const u16 * a0)
const u8 * boxIdxs;
a0 = sub_8113E88(26, a0);
boxIdxs = (const u8 *)a0 + 2;
- UnkTextUtil_Reset();
+ DynamicPlaceholderTextUtil_Reset();
QuestLog_AutoGetSpeciesName(a0[0], NULL, 0);
- UnkTextUtil_SetPtrI(1, GetBoxNamePtr(boxIdxs[0]));
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A64F);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetBoxNamePtr(boxIdxs[0]));
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A64F);
return (const u16 *)boxIdxs + 1;
}
@@ -4290,13 +4291,13 @@ u16 * sub_8114BE4(u16 * a0, const u16 * a1)
const u16 * sub_8114C0C(const u16 * a0)
{
const u16 *r4 = sub_8113E88(27, a0);
- UnkTextUtil_Reset();
- UnkTextUtil_SetPtrI(0, GetBoxNamePtr(*((const u8 *)r4 + 0)));
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, GetBoxNamePtr(*((const u8 *)r4 + 0)));
if (*((const u8 *)r4 + 0) == *((const u8 *)r4 + 1))
- UnkTextUtil_SetPtrI(1, gUnknown_841A694);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_841A694);
else
- UnkTextUtil_SetPtrI(1, GetBoxNamePtr(*((const u8 *)r4 + 1)));
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A66E);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetBoxNamePtr(*((const u8 *)r4 + 1)));
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A66E);
return r4 + 1;
}
@@ -4358,14 +4359,14 @@ const u16 * sub_8114D68(const u16 * a0)
const u8 * r6;
a0 = sub_8113E88(30, a0);
r6 = (const u8 *)a0 + 6;
- UnkTextUtil_Reset();
+ DynamicPlaceholderTextUtil_Reset();
sub_80C4DF8(gStringVar1, r6[0]);
- UnkTextUtil_SetPtrI(0, gStringVar1);
- UnkTextUtil_SetPtrI(1, gTrainers[a0[2]].trainerName);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gTrainers[a0[2]].trainerName);
QuestLog_AutoGetSpeciesName(a0[0], 0, 2);
QuestLog_AutoGetSpeciesName(a0[1], 0, 3);
- UnkTextUtil_SetPtrI(4, gUnknown_8456ACC[r6[1]]);
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AF0C);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gUnknown_8456ACC[r6[1]]);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AF0C);
return a0 + 4;
}
@@ -4399,43 +4400,43 @@ const u16 * sub_8114E68(const u16 * a0)
return NULL;
r6 = (const u8 *)a0 + 8;
- UnkTextUtil_Reset();
+ DynamicPlaceholderTextUtil_Reset();
sub_80C4DF8(gStringVar1, r6[2]);
- UnkTextUtil_SetPtrI(0, gStringVar1);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
QuestLog_AutoGetSpeciesName(a0[2], NULL, 1);
ConvertIntToDecimalStringN(gStringVar2, r6[0], STR_CONV_MODE_LEFT_ALIGN, 3);
- UnkTextUtil_SetPtrI(2, gStringVar2);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2);
QuestLog_AutoGetSpeciesName(a0[3], NULL, 3);
ConvertIntToDecimalStringN(gStringVar3, r6[1], STR_CONV_MODE_LEFT_ALIGN, 3);
- UnkTextUtil_SetPtrI(4, gStringVar3);
- UnkTextUtil_SetPtrI(5, gSaveBlock2Ptr->playerName);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gStringVar3);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, gSaveBlock2Ptr->playerName);
if (r6[0] == 0)
{
if (r6[1] == 1)
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AA01);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AA01);
else
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AA2B);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AA2B);
}
else if (r6[1] == 0)
{
if (r6[0] == 1)
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A9A9);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A9A9);
else
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A9D4);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A9D4);
}
else if (r6[0] == 1)
{
if (r6[1] == 1)
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AA76);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AA76);
else
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AAAA);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AAAA);
}
else
{
if (r6[1] == 1)
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AAEC);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AAEC);
else
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AB29);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AB29);
}
return (const u16 *)(r6 + 4);
}
@@ -4464,12 +4465,12 @@ const u16 * sub_811500C(const u16 * a0)
const u8 * r5;
a0 = sub_8113E88(32, a0);
r5 = (const u8 *)a0 + 6;
- UnkTextUtil_Reset();
- UnkTextUtil_SetPtrI(0, gTrainers[a0[2]].trainerName);
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gTrainers[a0[2]].trainerName);
QuestLog_AutoGetSpeciesName(a0[0], NULL, 1);
QuestLog_AutoGetSpeciesName(a0[1], NULL, 2);
- UnkTextUtil_SetPtrI(3, gUnknown_8456ACC[r5[1]]);
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AF3E);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gUnknown_8456ACC[r5[1]]);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AF3E);
return a0 + 4;
}
@@ -4493,25 +4494,25 @@ const u16 * sub_81150CC(const u16 * a0)
return NULL;
r5 = (const u8 *)a0 + 8;
- UnkTextUtil_Reset();
+ DynamicPlaceholderTextUtil_Reset();
switch (gUnknown_203B044.unk_2)
{
case 0:
- UnkTextUtil_SetPtrI(0, gSaveBlock2Ptr->playerName);
- UnkTextUtil_SetPtrI(1, gSaveBlock1Ptr->rivalName);
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A2E1);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gSaveBlock1Ptr->rivalName);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A2E1);
break;
case 1:
- UnkTextUtil_SetPtrI(0, gSaveBlock1Ptr->rivalName);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock1Ptr->rivalName);
QuestLog_AutoGetSpeciesName(a0[2], NULL, 1);
- UnkTextUtil_SetPtrI(2, gSaveBlock2Ptr->playerName);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gSaveBlock2Ptr->playerName);
QuestLog_AutoGetSpeciesName(a0[3], NULL, 3);
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A312);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A312);
break;
case 2:
- UnkTextUtil_SetPtrI(0, gUnknown_8456AD8[r5[0]]);
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A349);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_8456AD8[r5[0]]);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A349);
break;
}
return (const u16 *)(r5 + 2);
@@ -4527,21 +4528,21 @@ const u16 * sub_81151DC(const u16 * a0)
{
const u16 * r5 = sub_8113E88(34, a0);
const u8 * r6 = (const u8 *)r5 + 6;
- UnkTextUtil_Reset();
+ DynamicPlaceholderTextUtil_Reset();
sub_80C4DF8(gStringVar1, r6[0]);
- UnkTextUtil_SetPtrI(0, gStringVar1);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
if (
gTrainers[r5[2]].trainerClass == 0x51
|| gTrainers[r5[2]].trainerClass == 0x59
|| gTrainers[r5[2]].trainerClass == 0x5A
)
- UnkTextUtil_SetPtrI(1, GetExpandedPlaceholder(6));
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, GetExpandedPlaceholder(6));
else
- UnkTextUtil_SetPtrI(1, gTrainers[r5[2]].trainerName);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gTrainers[r5[2]].trainerName);
QuestLog_AutoGetSpeciesName(r5[0], NULL, 2);
QuestLog_AutoGetSpeciesName(r5[1], NULL, 3);
- UnkTextUtil_SetPtrI(4, gUnknown_8456ACC[r6[1]]);
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841AF6D);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gUnknown_8456ACC[r6[1]]);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841AF6D);
return (const u16 *)(r6 + 2);
}
@@ -4814,17 +4815,17 @@ const u16 * sub_8115518(const u16 * a0)
const u16 * r4 = sub_8113E88(37, a0);
const u8 * r7 = (const u8 *)r4 + 8;
u32 r6 = (r4[2] << 16) + r4[3];
- UnkTextUtil_Reset();
+ DynamicPlaceholderTextUtil_Reset();
sub_80C4DF8(gStringVar1, r7[0]);
- UnkTextUtil_SetPtrI(0, gStringVar1);
- UnkTextUtil_SetPtrI(1, ItemId_GetItem(r4[0])->name);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, ItemId_GetName(r4[0]));
if (r4[1] < 2)
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A7DD);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A7DD);
else
{
ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6);
- UnkTextUtil_SetPtrI(2, gStringVar2);
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A810);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A810);
}
return (const u16 *)(r7 + 2);
}
@@ -4847,30 +4848,30 @@ const u16 * sub_81155E0(const u16 * a0) {
const u16 *r5 = sub_8113E88(38, a0);
const u8 *r7 = (const u8 *) r5 + 8;
u32 r6 = (r5[2] << 16) + r5[3];
- UnkTextUtil_Reset();
+ DynamicPlaceholderTextUtil_Reset();
sub_80C4DF8(gStringVar1, r7[0]);
if (r7[1] == 0) {
- UnkTextUtil_SetPtrI(0, gSaveBlock2Ptr->playerName);
- UnkTextUtil_SetPtrI(1, gStringVar1);
- UnkTextUtil_SetPtrI(2, ItemId_GetItem(r5[0])->name);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, ItemId_GetName(r5[0]));
if (r5[1] == 1)
- UnkTextUtil_SetPtrI(3, gUnknown_841A8D4);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gUnknown_841A8D4);
else
{
ConvertIntToDecimalStringN(gStringVar2, r5[1], STR_CONV_MODE_LEFT_ALIGN, 3);
- UnkTextUtil_SetPtrI(4, gStringVar2);
- UnkTextUtil_StringExpandPlaceholders(gStringVar3, gUnknown_841A8DD);
- UnkTextUtil_SetPtrI(3, gStringVar3);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, gStringVar2);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar3, gUnknown_841A8DD);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, gStringVar3);
}
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A858);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A858);
}
else
{
- UnkTextUtil_SetPtrI(0, gStringVar1);
- UnkTextUtil_SetPtrI(1, ItemId_GetItem(r5[0])->name);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, ItemId_GetName(r5[0]));
ConvertIntToDecimalStringN(gStringVar2, r6, STR_CONV_MODE_LEFT_ALIGN, 6);
- UnkTextUtil_SetPtrI(2, gStringVar2);
- UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_841A896);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar2);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_841A896);
}
return (const u16 *)(r7 + 2);
}
@@ -4890,7 +4891,7 @@ const u16 * sub_8115700(const u16 * a0)
const u16 * r4 = sub_8113E88(40, a0);
const u8 * r5 = (const u8 *)r4 + 2;
sub_80C4DF8(gStringVar1, r5[0]);
- StringCopy(gStringVar2, ItemId_GetItem(r4[0])->name);
+ StringCopy(gStringVar2, ItemId_GetName(r4[0]));
StringExpandPlaceholders(gStringVar4, gUnknown_841B03F);
return (const u16 *)(r5 + 2);
}
diff --git a/src/quest_log_8150454.c b/src/quest_log_8150454.c
index 8af516e3a..3d61dee72 100644
--- a/src/quest_log_8150454.c
+++ b/src/quest_log_8150454.c
@@ -115,7 +115,7 @@ void sub_81505C4(u8 taskId)
gTasks[taskId].data[0]++;
break;
case 2:
- StartSpriteAnim(sprite, sub_8063500(player_get_direction_lower_nybble()));
+ StartSpriteAnim(sprite, sub_8063500(GetPlayerFacingDirection()));
gTasks[taskId].data[0]++;
break;
case 3:
@@ -173,7 +173,7 @@ void sub_8150794(u8 taskId)
void sub_81507BC(struct MapObject * a0, u8 a1)
{
- sub_805F060(a0, a1);
+ EventObjectSetGraphicsId(a0, a1);
}
void sub_81507CC(void)
diff --git a/src/quest_log_battle.c b/src/quest_log_battle.c
index d4d1245ec..3dfc2eb57 100644
--- a/src/quest_log_battle.c
+++ b/src/quest_log_battle.c
@@ -26,7 +26,7 @@ void sub_812C334(s32 *, s32 *);
void sub_812BFDC(void)
{
- if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_DOME)) && (gUnknown_2023E8A == 1 || gUnknown_2023E8A == 7))
+ if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_POKEDUDE)) && (gBattleOutcome == B_OUTCOME_WON || gBattleOutcome == B_OUTCOME_CAUGHT))
{
struct QuestLogStruct_TrainerBattleRecord * questLogTrainerBattleRecord = Alloc(sizeof(struct QuestLogStruct_TrainerBattleRecord));
struct QuestLogStruct_WildBattleRecord * questLogWildBattleRecord = Alloc(sizeof(struct QuestLogStruct_WildBattleRecord));
@@ -81,7 +81,7 @@ void sub_812BFDC(void)
}
else
{
- if (gUnknown_2023E8A == 1)
+ if (gBattleOutcome == B_OUTCOME_WON)
{
questLogWildBattleRecord->v0 = GetMonData(gEnemyParty + 0, MON_DATA_SPECIES);
questLogWildBattleRecord->v2 = SPECIES_NONE;
@@ -116,7 +116,7 @@ void sub_812C224(void)
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
struct QuestLogStruct_LinkBattleRecord * r5 = Alloc(sizeof(struct QuestLogStruct_LinkBattleRecord));
- r5->v0 = gUnknown_2023E8A - 1;
+ r5->v0 = gBattleOutcome - 1; // 0 = won, 1 = lost, 2 = drew
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
r8 = 15;
diff --git a/src/reset_save_heap.c b/src/reset_save_heap.c
new file mode 100644
index 000000000..428f7b88d
--- /dev/null
+++ b/src/reset_save_heap.c
@@ -0,0 +1,29 @@
+#include "global.h"
+#include "main.h"
+#include "gpu_regs.h"
+#include "m4a.h"
+#include "load_save.h"
+#include "save.h"
+#include "new_game.h"
+#include "overworld.h"
+#include "malloc.h"
+
+void sub_8079B7C(void)
+{
+ u16 imeBackup = REG_IME;
+
+ REG_IME = 0;
+ RegisterRamReset(RESET_EWRAM);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK);
+ REG_IME = imeBackup;
+ gMain.inBattle = FALSE;
+ SetSaveBlocksPointers();
+ ResetMenuAndMonGlobals();
+ Save_ResetSaveCounters();
+ Save_LoadGameData(0);
+ if (gSaveFileStatus == 0 || gSaveFileStatus == 2)
+ Sav2_ClearSetDefault();
+ SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound);
+ InitHeap(gHeap, HEAP_SIZE);
+ SetMainCallback2(CB2_ContinueSavedGame);
+}
diff --git a/src/safari_zone.c b/src/safari_zone.c
new file mode 100644
index 000000000..cb0a58586
--- /dev/null
+++ b/src/safari_zone.c
@@ -0,0 +1,80 @@
+#include "global.h"
+#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"
+
+EWRAM_DATA u8 gNumSafariBalls = 0;
+EWRAM_DATA u16 gSafariZoneStepCounter = 0;
+
+bool32 GetSafariZoneFlag(void)
+{
+ return FlagGet(FLAG_SYS_SAFARI_MODE);
+}
+
+void SetSafariZoneFlag(void)
+{
+ FlagSet(FLAG_SYS_SAFARI_MODE);
+}
+
+void ResetSafariZoneFlag(void)
+{
+ FlagClear(FLAG_SYS_SAFARI_MODE);
+}
+
+void EnterSafariMode(void)
+{
+ IncrementGameStat(GAME_STAT_ENTERED_SAFARI_ZONE);
+ SetSafariZoneFlag();
+ gNumSafariBalls = 30;
+ gSafariZoneStepCounter = 600;
+}
+
+void ExitSafariMode(void)
+{
+ ResetSafariZoneFlag();
+ gNumSafariBalls = 0;
+ gSafariZoneStepCounter = 0;
+}
+
+bool8 SafariZoneTakeStep(void)
+{
+ if (GetSafariZoneFlag() == FALSE)
+ return FALSE;
+ gSafariZoneStepCounter--;
+ if (gSafariZoneStepCounter == 0)
+ {
+ ScriptContext1_SetupScript(EventScript_SafariTimesUp);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void SafariZoneRetirePrompt(void)
+{
+ ScriptContext1_SetupScript(EventScript_SafariRetire);
+}
+
+void CB2_EndSafariBattle(void)
+{
+ if (gNumSafariBalls != 0)
+ {
+ SetMainCallback2(CB2_ReturnToField);
+ }
+ else if (gBattleOutcome == B_OUTCOME_NO_SAFARI_BALLS)
+ {
+ ScriptContext2_RunNewScript(EventScript_SafariWarpOut);
+ WarpIntoMap();
+ gFieldCallback = sub_807E3EC;
+ SetMainCallback2(CB2_LoadMap);
+ }
+ else if (gBattleOutcome == B_OUTCOME_CAUGHT)
+ {
+ ScriptContext1_SetupScript(EventScript_SafariOutOfBalls);
+ ScriptContext1_Stop();
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+ }
+}
diff --git a/src/save.c b/src/save.c
index 761e3c92d..d3d31a22e 100644
--- a/src/save.c
+++ b/src/save.c
@@ -828,7 +828,7 @@ u32 TryCopySpecialSaveSection(u8 sector, u8* dst)
return 1;
}
-u32 sub_80DA5E0(u8 sector, u8* src)
+u32 TryWriteSpecialSaveSection(u8 sector, u8* src)
{
s32 i;
s32 size;
diff --git a/src/save_location.c b/src/save_location.c
new file mode 100644
index 000000000..9b679c7ee
--- /dev/null
+++ b/src/save_location.c
@@ -0,0 +1,108 @@
+#include "global.h"
+#include "save_location.h"
+#include "constants/maps.h"
+
+static bool32 IsCurMapInLocationList(const u16 *list)
+{
+ s32 i;
+ u16 locSum = (gSaveBlock1Ptr->location.mapGroup << 8) + (gSaveBlock1Ptr->location.mapNum);
+
+ for (i = 0; list[i] != 0xFFFF; i++)
+ {
+ if (list[i] == locSum)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static const u16 sSaveLocationPokeCenterList[] =
+{
+ MAP_VIRIDIAN_CITY_POKEMON_CENTER_1F, MAP_VIRIDIAN_CITY_POKEMON_CENTER_2F,
+ MAP_PEWTER_CITY_POKEMON_CENTER_1F, MAP_PEWTER_CITY_POKEMON_CENTER_2F,
+ MAP_CERULEAN_CITY_POKEMON_CENTER_1F, MAP_CERULEAN_CITY_POKEMON_CENTER_2F,
+ MAP_LAVENDER_TOWN_POKEMON_CENTER_1F, MAP_LAVENDER_TOWN_POKEMON_CENTER_2F,
+ MAP_VERMILION_CITY_POKEMON_CENTER_1F, MAP_VERMILION_CITY_POKEMON_CENTER_2F,
+ MAP_CELADON_CITY_POKEMON_CENTER_1F, MAP_CELADON_CITY_POKEMON_CENTER_2F,
+ MAP_FUCHSIA_CITY_POKEMON_CENTER_1F, MAP_FUCHSIA_CITY_POKEMON_CENTER_2F,
+ MAP_CINNABAR_ISLAND_POKEMON_CENTER_1F, MAP_CINNABAR_ISLAND_POKEMON_CENTER_2F,
+ MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F, MAP_INDIGO_PLATEAU_POKEMON_CENTER_2F,
+ MAP_SAFFRON_CITY_POKEMON_CENTER_1F, MAP_SAFFRON_CITY_POKEMON_CENTER_2F,
+ MAP_ROUTE4_POKEMON_CENTER_1F, MAP_ROUTE4_POKEMON_CENTER_2F,
+ MAP_ROUTE10_POKEMON_CENTER_1F, MAP_ROUTE10_POKEMON_CENTER_2F,
+ MAP_ONE_ISLAND_POKEMON_CENTER_1F, MAP_ONE_ISLAND_POKEMON_CENTER_2F,
+ MAP_TWO_ISLAND_POKEMON_CENTER_1F, MAP_TWO_ISLAND_POKEMON_CENTER_2F,
+ MAP_THREE_ISLAND_POKEMON_CENTER_1F, MAP_THREE_ISLAND_POKEMON_CENTER_2F,
+ MAP_FOUR_ISLAND_POKEMON_CENTER_1F, MAP_FOUR_ISLAND_POKEMON_CENTER_2F,
+ MAP_FIVE_ISLAND_POKEMON_CENTER_1F, MAP_FIVE_ISLAND_POKEMON_CENTER_2F,
+ MAP_SEVEN_ISLAND_POKEMON_CENTER_1F, MAP_SEVEN_ISLAND_POKEMON_CENTER_2F,
+ MAP_SIX_ISLAND_POKEMON_CENTER_1F, MAP_SIX_ISLAND_POKEMON_CENTER_2F,
+ MAP_UNKNOWN_MAP_00_00, MAP_UNKNOWN_MAP_00_01,
+ MAP_UNKNOWN_MAP_00_03, MAP_UNKNOWN_MAP_00_04,
+ 0xFFFF,
+};
+
+bool32 IsCurMapPokeCenter(void)
+{
+ return IsCurMapInLocationList(sSaveLocationPokeCenterList);
+}
+
+static const u16 sSaveLocationReloadLocList[] = { 0xFFFF };
+
+static bool32 IsCurMapReloadLocation(void)
+{
+ return IsCurMapInLocationList(sSaveLocationReloadLocList);
+}
+
+static const u16 sUnknown_8453094[] = { 0xFFFF };
+
+static bool32 sub_810B75C(void)
+{
+ return IsCurMapInLocationList(sUnknown_8453094);
+}
+
+static void TrySetPokeCenterWarpStatus(void)
+{
+ if (IsCurMapPokeCenter() == FALSE)
+ gSaveBlock2Ptr->specialSaveWarpFlags &= ~(POKECENTER_SAVEWARP);
+ else
+ gSaveBlock2Ptr->specialSaveWarpFlags |= POKECENTER_SAVEWARP;
+}
+
+static void TrySetReloadWarpStatus(void)
+{
+ if (!IsCurMapReloadLocation())
+ gSaveBlock2Ptr->specialSaveWarpFlags &= ~(LOBBY_SAVEWARP);
+ else
+ gSaveBlock2Ptr->specialSaveWarpFlags |= LOBBY_SAVEWARP;
+}
+
+static void sub_810B7CC(void)
+{
+ if (!sub_810B75C())
+ gSaveBlock2Ptr->specialSaveWarpFlags &= ~(UNK_SPECIAL_SAVE_WARP_FLAG_3);
+ else
+ gSaveBlock2Ptr->specialSaveWarpFlags |= UNK_SPECIAL_SAVE_WARP_FLAG_3;
+}
+
+void TrySetMapSaveWarpStatus(void)
+{
+ TrySetPokeCenterWarpStatus();
+ TrySetReloadWarpStatus();
+ sub_810B7CC();
+}
+
+void sub_810B810(void)
+{
+ gSaveBlock2Ptr->field_A8 |= 0x1;
+ gSaveBlock2Ptr->field_A8 |= 0x10;
+ gSaveBlock2Ptr->field_A8 |= 0x20;
+}
+
+void sub_810B82C(void)
+{
+ gSaveBlock2Ptr->specialSaveWarpFlags |= 0x80;
+ gSaveBlock2Ptr->field_A8 |= 0x2;
+ gSaveBlock2Ptr->field_A8 |= 0x4;
+ gSaveBlock2Ptr->field_A8 |= 0x8;
+ gSaveBlock2Ptr->field_A8 |= 0x8000;
+}
diff --git a/src/scrcmd.c b/src/scrcmd.c
index 7c27293a7..cef1a1eb7 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -807,7 +807,7 @@ bool8 ScrCmd_warpteleport2(struct ScriptContext *ctx)
u16 y = VarGet(ScriptReadHalfword(ctx));
Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
- sub_805DAE4(player_get_direction_lower_nybble());
+ sub_805DAE4(GetPlayerFacingDirection());
sub_807E500();
ResetInitialPlayerAvatarState();
return TRUE;
@@ -1154,7 +1154,7 @@ bool8 ScrCmd_faceplayer(struct ScriptContext *ctx)
if (gMapObjects[gSelectedEventObject].active)
{
FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedEventObject],
- player_get_direction_lower_nybble());
+ GetPlayerFacingDirection());
}
return FALSE;
}
@@ -1201,7 +1201,7 @@ bool8 ScrCmd_turnvobject(struct ScriptContext *ctx)
bool8 ScrCmd_lockall(struct ScriptContext *ctx)
{
- if (is_c1_link_related_active())
+ if (IsUpdateLinkStateCBActive())
{
return FALSE;
}
@@ -1215,7 +1215,7 @@ bool8 ScrCmd_lockall(struct ScriptContext *ctx)
bool8 ScrCmd_lock(struct ScriptContext *ctx)
{
- if (is_c1_link_related_active())
+ if (IsUpdateLinkStateCBActive())
{
return FALSE;
}
@@ -1241,7 +1241,7 @@ bool8 ScrCmd_releaseall(struct ScriptContext *ctx)
HideFieldMessageBox();
playerObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
- FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[playerObjectId]);
+ FieldObjectClearHeldMovementIfFinished(&gMapObjects[playerObjectId]);
sub_80974D8();
UnfreezeMapObjects();
return FALSE;
@@ -1253,9 +1253,9 @@ bool8 ScrCmd_release(struct ScriptContext *ctx)
HideFieldMessageBox();
if (gMapObjects[gSelectedEventObject].active)
- FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedEventObject]);
+ FieldObjectClearHeldMovementIfFinished(&gMapObjects[gSelectedEventObject]);
playerObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
- FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[playerObjectId]);
+ FieldObjectClearHeldMovementIfFinished(&gMapObjects[playerObjectId]);
sub_80974D8();
UnfreezeMapObjects();
return FALSE;
@@ -1984,7 +1984,7 @@ bool8 ScrCmd_playslotmachine(struct ScriptContext *ctx)
{
u8 slotMachineIndex = VarGet(ScriptReadHalfword(ctx));
- PlaySlotMachine(slotMachineIndex, c2_exit_to_overworld_1_continue_scripts_restart_music);
+ PlaySlotMachine(slotMachineIndex, CB2_ReturnToFieldContinueScriptPlayMapMusic);
ScriptContext1_Stop();
return TRUE;
}
diff --git a/src/script.c b/src/script.c
index 608dc6ba0..06418b8d0 100644
--- a/src/script.c
+++ b/src/script.c
@@ -279,7 +279,7 @@ void sub_8069A2C(void)
gUnknown_3000FA1 = 0;
}
-bool8 sub_8069A38(void)
+bool8 IsMsgSignPost(void)
{
if(gUnknown_3000FA1 == TRUE)
return TRUE;
diff --git a/src/seagallop.c b/src/seagallop.c
index ae880b2a3..e3333ef32 100644
--- a/src/seagallop.c
+++ b/src/seagallop.c
@@ -323,8 +323,8 @@ static void Task_SeaGallop_3(void)
PlayRainStoppingSoundEffect();
PlaySE(SE_KAIDAN);
gFieldCallback = sub_807DF64;
- warp_in();
- SetMainCallback2(sub_805671C);
+ WarpIntoMap();
+ SetMainCallback2(CB2_LoadMap);
ResetInitialPlayerAvatarState();
FreeFerrySpriteResources();
Free(sBg3TilemapBuffer);
diff --git a/src/slot_machine.c b/src/slot_machine.c
index bc3baf621..5b4020a5f 100644
--- a/src/slot_machine.c
+++ b/src/slot_machine.c
@@ -1833,7 +1833,7 @@ bool32 sub_8140C0C(void)
s32 i;
for (i = 0; i < NELEMS(gUnknown_84655B0); i++)
- LoadCompressedObjectPic(&gUnknown_84655B0[i]);
+ LoadCompressedSpriteSheet(&gUnknown_84655B0[i]);
LoadSpritePalettes(gUnknown_84655C8);
sSlotMachineGfxManager = Alloc(sizeof(*sSlotMachineGfxManager));
if (sSlotMachineGfxManager == NULL)
@@ -2075,7 +2075,7 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
RequestDma3Fill(0, (void *)VRAM, 0x20, 1);
RequestDma3Fill(0, (void *)(VRAM + 0xC000), 0x20, 1);
SetGpuReg(REG_OFFSET_DISPCNT, 0);
- sub_80F6C14();
+ ResetBgPositions();
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, gUnknown_8466B10, NELEMS(gUnknown_8466B10));
InitWindows(gUnknown_8466B20);
@@ -2084,9 +2084,9 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32);
CopyBgTilemapBufferToVram(3);
- reset_temp_tile_data_buffers();
- decompress_and_copy_tile_data_to_vram(2, gUnknown_84659D0, 0, 0x00, 0);
- decompress_and_copy_tile_data_to_vram(2, gUnknown_846653C, 0, 0xC0, 0);
+ ResetTempTileDataBuffers();
+ DecompressAndCopyTileDataToVram(2, gUnknown_84659D0, 0, 0x00, 0);
+ DecompressAndCopyTileDataToVram(2, gUnknown_846653C, 0, 0xC0, 0);
SetBgTilemapBuffer(2, ptr->field_185C);
CopyToBgTilemapBuffer(2, gUnknown_84661D4, 0, 0x00);
CopyBgTilemapBufferToVram(2);
@@ -2100,8 +2100,8 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
SetBgTilemapBuffer(0, ptr->field_085C);
FillBgTilemapBufferRect_Palette0(0, 0, 0, 2, 32, 30);
- decompress_and_copy_tile_data_to_vram(1, gUnknown_8466620, 0, 0, 0);
- decompress_and_copy_tile_data_to_vram(1, gUnknown_8466998, 0, 0, 1);
+ DecompressAndCopyTileDataToVram(1, gUnknown_8466620, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(1, gUnknown_8466998, 0, 0, 1);
CopyBgTilemapBufferToVram(1);
LoadPalette(stdpal_get(2), 0xE0, 0x20);
@@ -2112,7 +2112,7 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
textColor.fgColor = 15;
textColor.bgColor = 1;
textColor.shadowColor = 2;
- box_print(1, 0, x, 0, &textColor, 0, gUnknown_841B779);
+ AddTextPrinterParameterized3(1, 0, x, 0, &textColor, 0, gUnknown_841B779);
CopyBgTilemapBufferToVram(0);
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | 0x20 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
@@ -2128,7 +2128,7 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
(*state)++;
break;
case 2:
- if (!free_temp_tile_data_buffers_if_possible())
+ if (!FreeTempTileDataBuffersIfPossible())
{
ShowBg(0);
ShowBg(3);
@@ -2210,7 +2210,7 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
"\tmovs r0, 0\n"
"\tmovs r1, 0\n"
"\tbl SetGpuReg\n"
- "\tbl sub_80F6C14\n"
+ "\tbl ResetBgPositions\n"
"\tmovs r0, 0\n"
"\tbl ResetBgsAndClearDma3BusyFlags\n"
"\tldr r1, _081413A0 @ =gUnknown_8466B10\n"
@@ -2233,20 +2233,20 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
"\tbl FillBgTilemapBufferRect_Palette0\n"
"\tmovs r0, 0x3\n"
"\tbl CopyBgTilemapBufferToVram\n"
- "\tbl reset_temp_tile_data_buffers\n"
+ "\tbl ResetTempTileDataBuffers\n"
"\tldr r1, _081413AC @ =gUnknown_84659D0\n"
"\tmovs r5, 0\n"
"\tstr r5, [sp]\n"
"\tmovs r0, 0x2\n"
"\tmovs r2, 0\n"
"\tmovs r3, 0\n"
- "\tbl decompress_and_copy_tile_data_to_vram\n"
+ "\tbl DecompressAndCopyTileDataToVram\n"
"\tldr r1, _081413B0 @ =gUnknown_846653C\n"
"\tstr r5, [sp]\n"
"\tmovs r0, 0x2\n"
"\tmovs r2, 0\n"
"\tmovs r3, 0xC0\n"
- "\tbl decompress_and_copy_tile_data_to_vram\n"
+ "\tbl DecompressAndCopyTileDataToVram\n"
"\tldr r1, _081413B4 @ =0x0000185c\n"
"\tadd r1, r8\n"
"\tmovs r0, 0x2\n"
@@ -2301,13 +2301,13 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
"\tmovs r0, 0x1\n"
"\tmovs r2, 0\n"
"\tmovs r3, 0\n"
- "\tbl decompress_and_copy_tile_data_to_vram\n"
+ "\tbl DecompressAndCopyTileDataToVram\n"
"\tldr r1, _081413D4 @ =gUnknown_8466998\n"
"\tstr r6, [sp]\n"
"\tmovs r0, 0x1\n"
"\tmovs r2, 0\n"
"\tmovs r3, 0\n"
- "\tbl decompress_and_copy_tile_data_to_vram\n"
+ "\tbl DecompressAndCopyTileDataToVram\n"
"\tmovs r0, 0x1\n"
"\tbl CopyBgTilemapBufferToVram\n"
"\tmovs r0, 0x2\n"
@@ -2341,7 +2341,7 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
"\tmovs r0, 0x1\n"
"\tmovs r1, 0\n"
"\tmovs r3, 0\n"
- "\tbl box_print\n"
+ "\tbl AddTextPrinterParameterized3\n"
"\tmovs r0, 0\n"
"\tbl CopyBgTilemapBufferToVram\n"
"\tmovs r1, 0x83\n"
@@ -2386,7 +2386,7 @@ bool8 sub_8141198(u8 * state, struct SlotMachineSetupTaskData * ptr)
"_081413DC: .4byte sub_8141118\n"
"_081413E0: .4byte sub_8140E40\n"
"_081413E4:\n"
- "\tbl free_temp_tile_data_buffers_if_possible\n"
+ "\tbl FreeTempTileDataBuffersIfPossible\n"
"\tlsls r0, 24\n"
"\tlsrs r5, r0, 24\n"
"\tcmp r5, 0\n"
@@ -2678,7 +2678,7 @@ void sub_81417E4(const u8 * str)
FillWindowPixelBuffer(0, 0x11);
PutWindowTilemap(0);
DrawTextBorderOuter(0, 0x001, 15);
- sub_812E62C(0, 2, str, 1, 2, -1, NULL, 1, 2);
+ AddTextPrinterParameterized5(0, 2, str, 1, 2, -1, NULL, 1, 2);
}
void sub_8141828(void)
diff --git a/src/sound.c b/src/sound.c
index ba6511d1c..dc4b9f604 100644
--- a/src/sound.c
+++ b/src/sound.c
@@ -169,7 +169,7 @@ void FadeOutAndFadeInNewMapMusic(u16 songNum, u8 fadeOutSpeed, u8 fadeInSpeed)
sMapMusicFadeInSpeed = fadeInSpeed;
}
-void FadeInNewMapMusic(u16 songNum, u8 speed)
+static void FadeInNewMapMusic(u16 songNum, u8 speed)
{
FadeInNewBGM(songNum, speed);
sCurrentMapMusic = songNum;
diff --git a/src/sprite.c b/src/sprite.c
index 60bcd1da4..c1fc89777 100644
--- a/src/sprite.c
+++ b/src/sprite.c
@@ -250,12 +250,26 @@ static const AffineAnimCmdFunc sAffineAnimCmdFuncs[] =
AffineAnimCmd_frame,
};
-static const s32 gUnknown_082EC6F4[24] =
+static const s32 sUnknown_082EC6F4[3][4][2] =
{
- 8, 8, 0x10, 0x10, 0x20, 0x20,
- 0x40, 0x40, 0x10, 8, 0x20, 8,
- 0x20, 0x10, 0x40, 0x20, 8, 0x10,
- 8, 0x20, 0x10, 0x20, 0x20, 0x40,
+ {
+ {8, 8},
+ {0x10, 0x10},
+ {0x20, 0x20},
+ {0x40, 0x40},
+ },
+ {
+ {0x10, 8},
+ {0x20, 8},
+ {0x20, 0x10},
+ {0x40, 0x20},
+ },
+ {
+ {8, 0x10},
+ {8, 0x20},
+ {0x10, 0x20},
+ {0x20, 0x40},
+ },
};
static const struct OamDimensions sOamDimensions[3][4] =
@@ -1227,106 +1241,26 @@ s32 sub_800800C(s32 a0, s32 a1, s32 a2)
return a2 - ((u32)(a2 * a1) / (u32)(a0) + var1);
}
-#ifdef NONMATCHING
-void obj_update_pos2(struct Sprite* sprite, s32 a1, s32 a2)
+void obj_update_pos2(struct Sprite *sprite, s32 a1, s32 a2)
{
s32 var0, var1, var2;
- u8 matrixNum = sprite->oam.matrixNum;
+
+ u32 matrixNum = sprite->oam.matrixNum;
if (a1 != 0x800)
{
- var0 = gUnknown_082EC6F4[sprite->oam.size * 8 + sprite->oam.shape * 32];
+ 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);
}
if (a2 != 0x800)
{
- var0 = gUnknown_082EC6F4[4 + (sprite->oam.size * 8 + sprite->oam.shape * 32)];
+ 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);
}
}
-#else
-__attribute__((naked))
-void obj_update_pos2(struct Sprite* sprite, s32 a1, s32 a2)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r9\n\
- mov r6, r8\n\
- push {r6,r7}\n\
- adds r5, r0, 0\n\
- adds r6, r1, 0\n\
- mov r8, r2\n\
- ldrb r1, [r5, 0x3]\n\
- lsls r0, r1, 26\n\
- lsrs r7, r0, 27\n\
- movs r0, 0x80\n\
- lsls r0, 4\n\
- mov r9, r0\n\
- cmp r6, r9\n\
- beq _08007EA2\n\
- ldr r2, =gUnknown_082EC6F4\n\
- lsrs r1, 6\n\
- lsls r1, 3\n\
- ldrb r0, [r5, 0x1]\n\
- lsrs r0, 6\n\
- lsls r0, 5\n\
- adds r1, r0\n\
- adds r1, r2\n\
- ldr r0, [r1]\n\
- lsls r4, r0, 8\n\
- lsls r0, 16\n\
- ldr r2, =gOamMatrices\n\
- lsls r1, r7, 3\n\
- adds r1, r2\n\
- movs r2, 0\n\
- ldrsh r1, [r1, r2]\n\
- bl __divsi3\n\
- adds r1, r0, 0\n\
- adds r0, r4, 0\n\
- adds r2, r6, 0\n\
- bl sub_800800C\n\
- strh r0, [r5, 0x24]\n\
-_08007EA2:\n\
- cmp r8, r9\n\
- beq _08007EDA\n\
- ldr r2, =gUnknown_082EC6F4\n\
- ldrb r1, [r5, 0x3]\n\
- lsrs r1, 6\n\
- lsls r1, 3\n\
- ldrb r0, [r5, 0x1]\n\
- lsrs r0, 6\n\
- lsls r0, 5\n\
- adds r1, r0\n\
- adds r2, 0x4\n\
- adds r1, r2\n\
- ldr r0, [r1]\n\
- lsls r4, r0, 8\n\
- lsls r0, 16\n\
- ldr r2, =gOamMatrices\n\
- lsls r1, r7, 3\n\
- adds r1, r2\n\
- movs r2, 0x6\n\
- ldrsh r1, [r1, r2]\n\
- bl __divsi3\n\
- adds r1, r0, 0\n\
- adds r0, r4, 0\n\
- mov r2, r8\n\
- bl sub_800800C\n\
- strh r0, [r5, 0x26]\n\
-_08007EDA:\n\
- pop {r3,r4}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .pool\n\
- .syntax divided");
-}
-#endif // NONMATCHING
void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip)
{
diff --git a/src/ss_anne.c b/src/ss_anne.c
new file mode 100644
index 000000000..f59f17a76
--- /dev/null
+++ b/src/ss_anne.c
@@ -0,0 +1,200 @@
+#include "global.h"
+#include "task.h"
+#include "sound.h"
+#include "field_map_obj.h"
+#include "script.h"
+#include "constants/songs.h"
+
+// Tasks governing the ship's departure after you've gotten HM01 CUT
+
+#define SPRITE_TAG_WAKE 4000
+#define SPRITE_TAG_SMOKE 4001
+
+static void Task_SSAnneInit(u8 taskId);
+static void Task_SSAnneRun(u8 taskId);
+static void Task_SSAnneFinish(u8 taskId);
+static void CreateWakeBehindBoat(void);
+static void WakeSpriteCallback(struct Sprite * sprite);
+static void CreateSmokeSprite(void);
+static void SmokeSpriteCallback(struct Sprite * sprite);
+
+static const u16 sWakeTiles[] = INCBIN_U16("graphics/ss_anne/unk_8479838.4bpp");
+static const u16 sSmokeTiles[] = INCBIN_U16("graphics/ss_anne/unk_8479A38.4bpp");
+
+static const struct SpriteSheet sSpriteSheets[] = {
+ {(const void *)sWakeTiles, sizeof(sWakeTiles), SPRITE_TAG_WAKE},
+ {(const void *)sSmokeTiles, sizeof(sSmokeTiles), SPRITE_TAG_SMOKE},
+ {0}
+};
+
+static const union AnimCmd sWakeAnim[] = {
+ ANIMCMD_FRAME(0, 12),
+ ANIMCMD_FRAME(8, 12),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sWakeAnimTable[] = {
+ sWakeAnim
+};
+
+static const struct OamData sWakeOamData = {
+ .shape = ST_OAM_V_RECTANGLE,
+ .size = 2
+};
+
+static const struct SpriteTemplate sWakeSpriteTemplate = {
+ SPRITE_TAG_WAKE,
+ 0xFFFF,
+ &sWakeOamData,
+ sWakeAnimTable,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ WakeSpriteCallback
+};
+
+static const union AnimCmd sSmokeAnim[] = {
+ ANIMCMD_FRAME( 0, 10),
+ ANIMCMD_FRAME( 4, 20),
+ ANIMCMD_FRAME( 8, 20),
+ ANIMCMD_FRAME(12, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSmokeAnimTable[] = {
+ sSmokeAnim
+};
+
+static const struct OamData sSmokeOamData = {
+ .shape = ST_OAM_SQUARE,
+ .size = 1
+};
+
+static const struct SpriteTemplate sSmokeSpriteTemplate = {
+ SPRITE_TAG_SMOKE,
+ 0xFFFF,
+ &sSmokeOamData,
+ sSmokeAnimTable,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SmokeSpriteCallback
+};
+
+void Special_SSAnneDepartureCutscene(void)
+{
+ u8 taskId;
+
+ PlaySE(SE_SHIP_HORN);
+ taskId = CreateTask(Task_SSAnneInit, 8);
+ gTasks[taskId].data[0] = 50;
+}
+
+static void Task_SSAnneInit(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ if (--data[0] == 0)
+ {
+ LoadSpriteSheets(sSpriteSheets);
+ CreateWakeBehindBoat();
+ gTasks[taskId].func = Task_SSAnneRun;
+ }
+}
+
+static void Task_SSAnneRun(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+ u8 mapObjectId;
+ struct MapObject * boatObject;
+ s16 x;
+
+ data[1]++;
+ data[2]++;
+ if (data[1] == 70)
+ {
+ data[1] = 0;
+ CreateSmokeSprite();
+ }
+ TryGetFieldObjectIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjectId);
+ boatObject = &gMapObjects[mapObjectId];
+ if (gSprites[boatObject->spriteId].pos1.x + gSprites[boatObject->spriteId].pos2.x < -120)
+ {
+ PlaySE(SE_SHIP_HORN);
+ gTasks[taskId].func = Task_SSAnneFinish;
+ }
+ else
+ {
+ x = data[2] / 5;
+ gSprites[boatObject->spriteId].pos2.x = -x;
+ }
+}
+
+static void Task_SSAnneFinish(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ if (++data[3] == 40)
+ {
+ FreeSpriteTilesByTag(SPRITE_TAG_WAKE);
+ FreeSpriteTilesByTag(SPRITE_TAG_SMOKE);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ }
+}
+
+static void CreateWakeBehindBoat(void)
+{
+ u8 mapObjectId;
+ struct MapObject * boatObject;
+ u16 x;
+ u8 spriteId;
+
+ TryGetFieldObjectIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjectId);
+ boatObject = &gMapObjects[mapObjectId];
+ x = gSprites[boatObject->spriteId].pos1.x + gSprites[boatObject->spriteId].pos2.x + 80;
+ spriteId = CreateSprite(&sWakeSpriteTemplate, x, 109, 0xFF);
+ gSprites[spriteId].oam.priority = 2;
+ gSprites[spriteId].oam.paletteNum = 10;
+}
+
+static void WakeSpriteCallback(struct Sprite * sprite)
+{
+ u8 mapObjectId;
+ struct MapObject * boatObject;
+ u16 x;
+
+ TryGetFieldObjectIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjectId);
+ boatObject = &gMapObjects[mapObjectId];
+ x = gSprites[boatObject->spriteId].pos1.x + gSprites[boatObject->spriteId].pos2.x + 80;
+ sprite->pos1.x = x;
+ if (sprite->data[0] / 6 < 22)
+ sprite->data[0]++;
+ sprite->pos2.x = sprite->data[0] / 6;
+ if (sprite->pos1.x + sprite->pos2.x < -18)
+ DestroySprite(sprite);
+}
+
+static void CreateSmokeSprite(void)
+{
+ u8 mapObjectId;
+ struct MapObject * boatObject;
+ u16 x;
+ u8 spriteId;
+
+ TryGetFieldObjectIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjectId);
+ boatObject = &gMapObjects[mapObjectId];
+ x = gSprites[boatObject->spriteId].pos1.x + gSprites[boatObject->spriteId].pos2.x + 49;
+ if ((s16)x >= -32)
+ {
+ spriteId = CreateSprite(&sSmokeSpriteTemplate, x, 78, 8);
+ if (spriteId != MAX_SPRITES)
+ gSprites[spriteId].oam.paletteNum = 10;
+ }
+}
+
+static void SmokeSpriteCallback(struct Sprite * sprite)
+{
+ sprite->data[0]++;
+ sprite->pos2.x = sprite->data[0] / 4;
+ if (sprite->animEnded)
+ DestroySprite(sprite);
+}
diff --git a/src/teachy_tv.c b/src/teachy_tv.c
new file mode 100644
index 000000000..0b0e7b932
--- /dev/null
+++ b/src/teachy_tv.c
@@ -0,0 +1,1416 @@
+#include "task.h"
+#include "menu.h"
+#include "palette.h"
+#include "sprite.h"
+#include "menu_helpers.h"
+#include "new_menu_helpers.h"
+#include "sound.h"
+#include "malloc.h"
+#include "scanline_effect.h"
+#include "bg.h"
+#include "gpu_regs.h"
+#include "decompress.h"
+#include "window.h"
+#include "list_menu.h"
+#include "item_menu.h"
+#include "item.h"
+#include "menu_indicators.h"
+#include "field_map_obj.h"
+#include "random.h"
+#include "text.h"
+#include "constants/songs.h"
+#include "constants/items.h"
+#include "event_data.h"
+#include "load_save.h"
+#include "battle_transition.h"
+#include "battle_2.h"
+#include "battle.h"
+#include "global.fieldmap.h"
+#include "teachy_tv.h"
+#include "help_system.h"
+#include "overworld.h"
+#include "unk_8159F40.h"
+#include "graphics.h"
+#include "fieldmap.h"
+#include "strings.h"
+
+enum TeachyTvScript
+{
+ TTVSCR_BATTLE,
+ TTVSCR_STATUS,
+ TTVSCR_MATCHUPS,
+ TTVSCR_CATCHING,
+ TTVSCR_TMS,
+ TTVSCR_REGISTER
+};
+
+struct TeachyTvCtrlBlk
+{
+ MainCallback callback;
+ u8 mode;
+ u8 whichScript;
+ u16 scrollOffset;
+ u16 selectedRow;
+};
+
+struct TeachyTvBuf
+{
+ MainCallback savedCallback;
+ u16 buffer1[0x800];
+ u16 buffer2[0x800];
+ u16 buffer3[0x800];
+ u16 buffer4[0x800];
+ u8 grassAnimCounterLo;
+ u8 grassAnimCounterHi;
+ u8 grassAnimDisabled;
+ u8 scrollIndicatorArrowPairId;
+};
+
+static EWRAM_DATA struct TeachyTvCtrlBlk sStaticResources = {0};
+static EWRAM_DATA struct TeachyTvBuf * sResources = NULL;
+
+static void TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos(u8 taskId);
+static void TTVcmd_ClearBg2TeachyTvGraphic(u8 taskId);
+static void TTVcmd_NpcMoveAndSetupTextPrinter(u8 taskId);
+static void TTVcmd_IdleIfTextPrinterIsActive(u8 taskId);
+static void TTVcmd_TextPrinterSwitchStringByOptionChosen(u8 taskId);
+static void TTVcmd_TextPrinterSwitchStringByOptionChosen2(u8 taskId);
+static void TTVcmd_IdleIfTextPrinterIsActive2(u8 taskId);
+static void TTVcmd_EraseTextWindowIfKeyPressed(u8 taskId);
+static void TTVcmd_StartAnimNpcWalkIntoGrass(u8 taskId);
+static void TTVcmd_DudeMoveUp(u8 taskId);
+static void TTVcmd_DudeMoveRight(u8 taskId);
+static void TTVcmd_DudeTurnLeft(u8 taskId);
+static void TTVcmd_DudeMoveLeft(u8 taskId);
+static void TTVcmd_RenderAndRemoveBg1EndGraphic(u8 taskId);
+static void TTVcmd_TaskBattleOrFadeByOptionChosen(u8 taskId);
+static void TeachyTvCallback(void);
+static void TeachyTvMainCallback(void);
+static void TeachyTvVblankHandler(void);
+static void TeachyTvCreateAndRenderRbox(void);
+static void TeachyTvInitIo(void);
+static u8 TeachyTvSetupObjEventAndOam(void);
+static void TeachyTvSetupPostBattleWindowAndObj(u8);
+static u8 TeachyTvSetupWindow(void);
+static void TeachyTvSetupScrollIndicatorArrowPair(void);
+static void TeachyTvSetWindowRegs(void);
+static void TeachyTvSetupBg(void);
+static void TeachyTvLoadGraphic(void);
+static void TeachyTvPostBattleFadeControl(u8);
+static void TeachyTvOptionListController(u8);
+static void TeachyTvAudioByInput(s32, bool8, struct ListMenu *);
+static void TeachyTvQuitFadeControlAndTaskDel(u8 taskId);
+static void TeachyTvRenderMsgAndSwitchClusterFuncs(u8 taskId);
+static void TeachyTvClearBg1EndGraphicText(void);
+static void TTVcmd_End(u8 taskId);
+static void TeachyTvSetupBagItemsByOptionChosen(void);
+static void TeachyTvPrepBattle(u8 taskId);
+static void TeachyTvGrassAnimationMain(u8 taskId, s16 x, s16 y, u8 subpriority, bool8 mode);
+static void TeachyTvLoadBg3Map(u16 *);
+static u8 TeachyTvGrassAnimationCheckIfNeedsToGenerateGrassObj(s16 x, s16 y);
+static void TeachyTvGrassAnimationObjCallback(struct Sprite *sprite);
+static void TeachyTvRestorePlayerPartyCallback(void);
+static void TeachyTvPreBattleAnimAndSetBattleCallback(u8 taskId);
+static void TeachyTvLoadMapTilesetToBuffer(struct Tileset *ts, u8 *dstBuffer, u16 size);
+static void TeachyTvPushBackNewMapPalIndexArrayEntry(const struct MapData *mStruct, u16 *buf1, u8 *palIndexArray, u16 mapEntry, u16 offset);
+static void TeachyTvComputeMapTilesFromTilesetAndMetaTiles(u16 *metaTilesArray, u8 *blockBuf, u8 *tileset);
+static void TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(u8 *blockBuf, u8 *tileset, u8 metaTile);
+static u16 TeachyTvComputePalIndexArrayEntryByMetaTile(u8 *palIndexArrayBuf, u16 metaTile);
+static void TeachyTvLoadMapPalette(const struct MapData * mStruct, const u8 *palIndexArray);
+
+static const struct BgTemplate sBgTemplates[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0x000,
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0x000,
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 29,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0x000,
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 28,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0x000,
+ },
+};
+
+static const struct WindowTemplate sWindowTemplates[] =
+{
+ {
+ .bg = 1,
+ .tilemapLeft = 2,
+ .tilemapTop = 15,
+ .width = 26,
+ .height = 4,
+ .paletteNum = 0x3,
+ .baseBlock = 0x0EA,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 4,
+ .tilemapTop = 1,
+ .width = 22,
+ .height = 12,
+ .paletteNum = 0x3,
+ .baseBlock = 0x152,
+ },
+ DUMMY_WIN_TEMPLATE,
+};
+
+static const struct ListMenuItem sListMenuItems[] =
+{
+ {
+ .label = gTeachyTvString_TeachBattle,
+ .index = TTVSCR_BATTLE
+ },
+ {
+ .label = gTeachyTvString_StatusProblems,
+ .index = TTVSCR_STATUS
+ },
+ {
+ .label = gTeachyTvString_TypeMatchups,
+ .index = TTVSCR_MATCHUPS
+ },
+ {
+ .label = gTeachyTvString_CatchPkmn,
+ .index = TTVSCR_CATCHING
+ },
+ {
+ .label = gTeachyTvString_AboutTMs,
+ .index = TTVSCR_TMS
+ },
+ {
+ .label = gTeachyTvString_RegisterItem,
+ .index = TTVSCR_REGISTER
+ },
+
+ {
+ .label = gTeachyTvString_Cancel,
+ .index = -2
+ },
+};
+
+static const struct ListMenuItem sListMenuItems_NoTMCase[] =
+{
+ {
+ .label = gTeachyTvString_TeachBattle,
+ .index = TTVSCR_BATTLE
+ },
+ {
+ .label = gTeachyTvString_StatusProblems,
+ .index = TTVSCR_STATUS
+ },
+ {
+ .label = gTeachyTvString_TypeMatchups,
+ .index = TTVSCR_MATCHUPS
+ },
+ {
+ .label = gTeachyTvString_CatchPkmn,
+ .index = TTVSCR_CATCHING
+ },
+ {
+ .label = gTeachyTvString_Cancel,
+ .index = -2
+ },
+};
+
+static const struct ListMenuTemplate sListMenuTemplate =
+{
+ .items = sListMenuItems,
+ .moveCursorFunc = NULL,
+ .itemPrintFunc = NULL,
+ .totalItems = 7,
+ .maxShowed = 6,
+ .windowId = 0,
+ .header_X = 0,
+ .item_X = 8,
+ .cursor_X = 0,
+ .upText_Y = 6,
+ .cursorPal = 0x1,
+ .fillValue = 0x0,
+ .cursorShadowPal = 0x2,
+ .lettersSpacing = 0x0,
+ .itemVerticalPadding = 0x0,
+ .scrollMultiple = 0x1,
+ .fontId = 0x2,
+ .cursorKind = 0x0,
+};
+
+static const struct ScrollArrowsTemplate sScrollIndicatorArrowPair =
+{
+ .firstArrowType = 0x2,
+ .firstX = 0x78,
+ .firstY = 0xC,
+ .secondArrowType = 0x3,
+ .secondX = 0x78,
+ .secondY = 0x64,
+ .fullyUpThreshold = 0,
+ .fullyDownThreshold = 1,
+ .tileTag = 0x800,
+ .palTag = 0x800,
+ .palNum = 0x0,
+};
+
+static const u8 sWhereToReturnToFromBattle[] =
+{
+ 12,
+ 12,
+ 12,
+ 12,
+ 9,
+ 9
+};
+
+static void (* const sBattleScript[])(u8) =
+{
+ TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos,
+ TTVcmd_ClearBg2TeachyTvGraphic,
+ TTVcmd_NpcMoveAndSetupTextPrinter,
+ TTVcmd_IdleIfTextPrinterIsActive,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_TextPrinterSwitchStringByOptionChosen,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_EraseTextWindowIfKeyPressed,
+ TTVcmd_StartAnimNpcWalkIntoGrass,
+ TTVcmd_DudeMoveUp,
+ TTVcmd_DudeMoveRight,
+ TTVcmd_TaskBattleOrFadeByOptionChosen,
+ TTVcmd_TextPrinterSwitchStringByOptionChosen2,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_EraseTextWindowIfKeyPressed,
+ TTVcmd_DudeTurnLeft,
+ TTVcmd_DudeMoveLeft,
+ TTVcmd_RenderAndRemoveBg1EndGraphic,
+ TTVcmd_End,
+};
+
+static void (* const sStatusScript[])(u8) =
+{
+ TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos,
+ TTVcmd_ClearBg2TeachyTvGraphic,
+ TTVcmd_NpcMoveAndSetupTextPrinter,
+ TTVcmd_IdleIfTextPrinterIsActive,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_TextPrinterSwitchStringByOptionChosen,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_EraseTextWindowIfKeyPressed,
+ TTVcmd_StartAnimNpcWalkIntoGrass,
+ TTVcmd_DudeMoveUp,
+ TTVcmd_DudeMoveRight,
+ TTVcmd_TaskBattleOrFadeByOptionChosen,
+ TTVcmd_TextPrinterSwitchStringByOptionChosen2,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_EraseTextWindowIfKeyPressed,
+ TTVcmd_DudeTurnLeft,
+ TTVcmd_DudeMoveLeft,
+ TTVcmd_RenderAndRemoveBg1EndGraphic,
+ TTVcmd_End,
+};
+
+static void (* const sMatchupsScript[])(u8) =
+{
+ TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos,
+ TTVcmd_ClearBg2TeachyTvGraphic,
+ TTVcmd_NpcMoveAndSetupTextPrinter,
+ TTVcmd_IdleIfTextPrinterIsActive,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_TextPrinterSwitchStringByOptionChosen,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_EraseTextWindowIfKeyPressed,
+ TTVcmd_StartAnimNpcWalkIntoGrass,
+ TTVcmd_DudeMoveUp,
+ TTVcmd_DudeMoveRight,
+ TTVcmd_TaskBattleOrFadeByOptionChosen,
+ TTVcmd_TextPrinterSwitchStringByOptionChosen2,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_EraseTextWindowIfKeyPressed,
+ TTVcmd_DudeTurnLeft,
+ TTVcmd_DudeMoveLeft,
+ TTVcmd_RenderAndRemoveBg1EndGraphic,
+ TTVcmd_End,
+};
+
+static void (* const sCatchingScript[])(u8) =
+{
+ TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos,
+ TTVcmd_ClearBg2TeachyTvGraphic,
+ TTVcmd_NpcMoveAndSetupTextPrinter,
+ TTVcmd_IdleIfTextPrinterIsActive,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_TextPrinterSwitchStringByOptionChosen,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_EraseTextWindowIfKeyPressed,
+ TTVcmd_StartAnimNpcWalkIntoGrass,
+ TTVcmd_DudeMoveUp,
+ TTVcmd_DudeMoveRight,
+ TTVcmd_TaskBattleOrFadeByOptionChosen,
+ TTVcmd_TextPrinterSwitchStringByOptionChosen2,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_EraseTextWindowIfKeyPressed,
+ TTVcmd_DudeTurnLeft,
+ TTVcmd_DudeMoveLeft,
+ TTVcmd_RenderAndRemoveBg1EndGraphic,
+ TTVcmd_End,
+};
+
+static void (* const sTMsScript[])(u8) =
+{
+ TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos,
+ TTVcmd_ClearBg2TeachyTvGraphic,
+ TTVcmd_NpcMoveAndSetupTextPrinter,
+ TTVcmd_IdleIfTextPrinterIsActive,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_TextPrinterSwitchStringByOptionChosen,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_EraseTextWindowIfKeyPressed,
+ TTVcmd_TaskBattleOrFadeByOptionChosen,
+ TTVcmd_TextPrinterSwitchStringByOptionChosen2,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_EraseTextWindowIfKeyPressed,
+ TTVcmd_DudeTurnLeft,
+ TTVcmd_DudeMoveLeft,
+ TTVcmd_RenderAndRemoveBg1EndGraphic,
+ TTVcmd_End,
+};
+
+static void (* const sRegisterKeyItemScript[])(u8) =
+{
+ TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos,
+ TTVcmd_ClearBg2TeachyTvGraphic,
+ TTVcmd_NpcMoveAndSetupTextPrinter,
+ TTVcmd_IdleIfTextPrinterIsActive,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_TextPrinterSwitchStringByOptionChosen,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_EraseTextWindowIfKeyPressed,
+ TTVcmd_TaskBattleOrFadeByOptionChosen,
+ TTVcmd_TextPrinterSwitchStringByOptionChosen2,
+ TTVcmd_IdleIfTextPrinterIsActive2,
+ TTVcmd_EraseTextWindowIfKeyPressed,
+ TTVcmd_DudeTurnLeft,
+ TTVcmd_DudeMoveLeft,
+ TTVcmd_RenderAndRemoveBg1EndGraphic,
+ TTVcmd_End,
+};
+
+static void TeachyTvCallback(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ DoScheduledBgTilemapCopiesToVram();
+ UpdatePaletteFade();
+}
+
+static void TeachyTvVblankHandler(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void InitTeachyTvController(u8 mode, MainCallback cb)
+{
+ sStaticResources.mode = mode;
+ sStaticResources.callback = cb;
+ if (mode == 0)
+ {
+ sStaticResources.scrollOffset = 0;
+ sStaticResources.selectedRow = 0;
+ sStaticResources.whichScript = TTVSCR_BATTLE;
+ }
+ if (mode == 1)
+ {
+ sStaticResources.mode = 0;
+ }
+ SetMainCallback2(TeachyTvMainCallback);
+}
+
+void CB2_ReturnToTeachyTV(void)
+{
+ if (sStaticResources.mode == 1)
+ InitTeachyTvController(1, sStaticResources.callback);
+ else
+ InitTeachyTvController(2, sStaticResources.callback);
+}
+
+void SetTeachyTvControllerModeToResume(void)
+{
+ sStaticResources.mode = 1;
+}
+
+static void TeachyTvMainCallback(void)
+{
+ u8 taskId;
+ struct Task *taskAddr;
+
+ switch (gMain.state)
+ {
+ case 0:
+ sResources = AllocZeroed(sizeof(struct TeachyTvBuf));
+ sResources->savedCallback = NULL;
+ sResources->grassAnimDisabled = 0;
+ sResources->scrollIndicatorArrowPairId = 0xFF;
+ SetVBlankHBlankCallbacksToNull();
+ ClearScheduledBgCopiesToVram();
+ ScanlineEffect_Stop();
+ FreeAllSpritePalettes();
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ TeachyTvSetupBg();
+ TeachyTvLoadGraphic();
+ ++gMain.state;
+ break;
+ case 1:
+ if (FreeTempTileDataBuffersIfPossible() == TRUE)
+ return;
+ TeachyTvCreateAndRenderRbox();
+ TeachyTvInitIo();
+ if (sStaticResources.mode == 2)
+ {
+ taskId = CreateTask(TeachyTvPostBattleFadeControl, 0);
+ gTasks[taskId].data[1] = TeachyTvSetupObjEventAndOam();
+ TeachyTvSetupPostBattleWindowAndObj(taskId);
+ }
+ else
+ {
+ taskId = CreateTask(TeachyTvOptionListController, 0);
+ gTasks[taskId].data[0] = TeachyTvSetupWindow();
+ gTasks[taskId].data[1] = TeachyTvSetupObjEventAndOam();
+ TeachyTvSetupScrollIndicatorArrowPair();
+ PlayNewMapMusic(BGM_FRLG_TEACHY_TV);
+ TeachyTvSetWindowRegs();
+ }
+ ScheduleBgCopyTilemapToVram(0);
+ ScheduleBgCopyTilemapToVram(1);
+ ScheduleBgCopyTilemapToVram(2);
+ ScheduleBgCopyTilemapToVram(3);
+ sub_812B1E0(9); // help system something
+ BlendPalettes(0xFFFFFFFF, 0x10, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ SetVBlankCallback(TeachyTvVblankHandler);
+ SetMainCallback2(TeachyTvCallback);
+ break;
+ }
+}
+
+static void TeachyTvSetupBg(void)
+{
+ ResetAllBgsCoordinatesAndBgCntRegs();
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sBgTemplates, 4);
+ SetBgTilemapBuffer(1, sResources->buffer1);
+ SetBgTilemapBuffer(2, sResources->buffer2);
+ SetBgTilemapBuffer(3, sResources->buffer3);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0x3040);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ ChangeBgX(3, 0x1000, 2);
+ ChangeBgY(3, 0x2800, 1);
+ sResources->grassAnimCounterLo = 0;
+ sResources->grassAnimCounterHi = 3;
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+}
+
+static void TeachyTvLoadGraphic(void)
+{
+ u16 src = RGB_BLACK;
+ ResetTempTileDataBuffers();
+ DecompressAndCopyTileDataToVram(1, gUnknown_8E86240, 0, 0, 0);
+ LZDecompressWram(gUnknown_8E86BE8, sResources->buffer1);
+ LZDecompressWram(gUnknown_8E86D6C, sResources->buffer4);
+ LoadCompressedPalette(gUnknown_8E86F98, 0, 0x80);
+ LoadPalette(&src, 0, sizeof(src));
+ LoadSpritePalette(&gUnknown_83A5348);
+ TeachyTvLoadBg3Map(sResources->buffer3);
+}
+
+static void TeachyTvCreateAndRenderRbox(void)
+{
+ InitWindows(sWindowTemplates);
+ DeactivateAllTextPrinters();
+ FillWindowPixelBuffer(0, 0xCC);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ CopyWindowToVram(0, 2);
+}
+
+static u8 TeachyTvSetupWindow(void)
+{
+ gMultiuseListMenuTemplate = sListMenuTemplate;
+ gMultiuseListMenuTemplate.windowId = 1;
+ gMultiuseListMenuTemplate.moveCursorFunc = TeachyTvAudioByInput;
+ if (!CheckBagHasItem(ITEM_TM_CASE, 1))
+ {
+ gMultiuseListMenuTemplate.items = sListMenuItems_NoTMCase;
+ gMultiuseListMenuTemplate.totalItems = 5;
+ gMultiuseListMenuTemplate.maxShowed = 5;
+ gMultiuseListMenuTemplate.upText_Y = (gMultiuseListMenuTemplate.upText_Y + 8) & 0xF;
+ }
+ return ListMenuInit(
+ &gMultiuseListMenuTemplate,
+ sStaticResources.scrollOffset,
+ sStaticResources.selectedRow
+ );
+}
+
+static void TeachyTvSetupScrollIndicatorArrowPair(void)
+{
+ if (!CheckBagHasItem(ITEM_TM_CASE, 1))
+ {
+ struct TeachyTvBuf * temp = sResources;
+ temp->scrollIndicatorArrowPairId = 0xFF;
+ }
+ else
+ {
+ sResources->scrollIndicatorArrowPairId = AddScrollIndicatorArrowPair(&sScrollIndicatorArrowPair, &(sStaticResources.scrollOffset));
+ }
+}
+
+static void TeachyTvRemoveScrollIndicatorArrowPair(void)
+{
+ if (sResources->scrollIndicatorArrowPairId != 0xFF)
+ {
+ RemoveScrollIndicatorArrowPair(sResources->scrollIndicatorArrowPairId);
+ sResources->scrollIndicatorArrowPairId = 0xFF;
+ }
+}
+
+static void TeachyTvAudioByInput(s32 notUsed, bool8 play, struct ListMenu *notUsedAlt)
+{
+ if (play != TRUE)
+ PlaySE(SE_SELECT);
+}
+
+static void TeachyTvInitIo(void)
+{
+ SetGpuReg(REG_OFFSET_WININ, 0x3F);
+ SetGpuReg(REG_OFFSET_WINOUT, 0x1F);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0xCC);
+ SetGpuReg(REG_OFFSET_BLDY, 0x5);
+}
+
+static u8 TeachyTvSetupObjEventAndOam(void)
+{
+ u8 objId = AddPseudoEventObject(90, SpriteCallbackDummy, 0, 0, 8);
+ gSprites[objId].oam.priority = 2;
+ gSprites[objId].invisible = 1;
+ return objId;
+}
+
+static void TeachyTvSetSpriteCoordsAndSwitchFrame(u8 objId, u16 x, u16 y, u8 frame)
+{
+ gSprites[objId].pos2.x = x;
+ gSprites[objId].pos2.y = y;
+ gSprites[objId].invisible = 0;
+ StartSpriteAnim(&gSprites[objId], frame);
+}
+
+static void TeachyTvSetWindowRegs(void)
+{
+ SetGpuReg(REG_OFFSET_WIN0V, 0xC64);
+ SetGpuReg(REG_OFFSET_WIN0H, 0x1CD4);
+}
+
+static void TeachyTvClearWindowRegs(void)
+{
+ SetGpuReg(REG_OFFSET_WIN0V, 0x0);
+ SetGpuReg(REG_OFFSET_WIN0H, 0x0);
+}
+
+static void TeachyTvBg2AnimController(void)
+{
+ u16 * tilemapBuffer = GetBgTilemapBuffer(2);
+ u8 i, j;
+ for (i = 1; i < 13; i++)
+ {
+ for (j = 2; j < 28; j++)
+ {
+ tilemapBuffer[32 * i + j] = ((Random() & 3) << 10) + 0x301F;
+ }
+ }
+ ScheduleBgCopyTilemapToVram(2);
+}
+
+static void TeachyTvSetupPostBattleWindowAndObj(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ struct Sprite *objAddr = &gSprites[data[1]];
+
+ ClearWindowTilemap(1);
+ TeachyTvClearWindowRegs();
+ switch (sStaticResources.whichScript)
+ {
+ case TTVSCR_BATTLE:
+ case TTVSCR_STATUS:
+ case TTVSCR_MATCHUPS:
+ case TTVSCR_CATCHING:
+ TeachyTvSetSpriteCoordsAndSwitchFrame(data[1], 0x78, 0x38, 0);
+ ChangeBgX(3, 0x3000, 1);
+ ChangeBgY(3, 0x3000, 2);
+ sResources->grassAnimCounterLo += 3;
+ sResources->grassAnimCounterHi -= 3;
+ break;
+ case TTVSCR_TMS:
+ case TTVSCR_REGISTER:
+ TeachyTvSetSpriteCoordsAndSwitchFrame(data[1], 0x78, 0x38, 0);
+ break;
+ }
+
+ data[4] = 0;
+ data[5] = 0;
+ TeachyTvGrassAnimationMain(taskId, objAddr->pos2.x, objAddr->pos2.y, 0, 1);
+}
+
+static void TeachyTvInitTextPrinter(const u8 *text)
+{
+ gTextFlags.autoScroll = 0;
+ AddTextPrinterParameterized2(0, 4, text, GetTextSpeedSetting(), 0, 1, 0xC, 3);
+}
+
+static void TeachyTvFree(void)
+{
+ Free(sResources);
+ sResources = NULL;
+ FreeAllWindowBuffers();
+}
+
+static void TeachyTvQuitBeginFade(u8 taskId)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gTasks[taskId].func = TeachyTvQuitFadeControlAndTaskDel;
+}
+
+static void TeachyTvQuitFadeControlAndTaskDel(u8 taskId)
+{
+ if (!(gPaletteFade.active))
+ {
+ if (sResources->savedCallback != NULL)
+ {
+ SetMainCallback2(sResources->savedCallback);
+ }
+ else
+ {
+ Overworld_PlaySpecialMapMusic();
+ SetMainCallback2(sStaticResources.callback);
+ }
+ TeachyTvFree();
+ DestroyTask(taskId);
+ }
+}
+
+static void TeachyTvOptionListController(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+ s32 input;
+
+ TeachyTvBg2AnimController();
+ if (!gPaletteFade.active)
+ {
+ input = ListMenu_ProcessInput(data[0]);
+ ListMenuGetScrollAndRow(data[0], &sStaticResources.scrollOffset, &sStaticResources.selectedRow);
+ if ((JOY_NEW(SELECT_BUTTON) && sStaticResources.callback != ReturnToBagFromKeyItem))
+ {
+ PlaySE(SE_SELECT);
+ TeachyTvQuitBeginFade(taskId);
+ }
+ else
+ {
+ switch (input)
+ {
+ case -1:
+ break;
+ case -2:
+ PlaySE(SE_SELECT);
+ TeachyTvQuitBeginFade(taskId);
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ sStaticResources.whichScript = input;
+ DestroyListMenuTask(data[0], &sStaticResources.scrollOffset, &sStaticResources.selectedRow);
+ TeachyTvClearWindowRegs();
+ ClearWindowTilemap(1);
+ ScheduleBgCopyTilemapToVram(0);
+ TeachyTvRemoveScrollIndicatorArrowPair();
+ data[3] = 0;
+ data[2] = 0;
+ gTasks[taskId].func = TeachyTvRenderMsgAndSwitchClusterFuncs;
+ break;
+ }
+ }
+ }
+}
+
+static void TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ TeachyTvBg2AnimController();
+ if (++data[2] > 63)
+ {
+ CopyToBgTilemapBufferRect_ChangePalette(2, sResources->buffer4, 0, 0, 0x20, 0x20, 0x11);
+ TeachyTvSetSpriteCoordsAndSwitchFrame(data[1], 8, 0x38, 7);
+ ScheduleBgCopyTilemapToVram(2);
+ data[2] = 0;
+ ++data[3];
+ PlayNewMapMusic(BGM_FRLG_FOLLOW_ME);
+ }
+}
+
+static void TTVcmd_ClearBg2TeachyTvGraphic(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (++data[2] == 134)
+ {
+ FillBgTilemapBufferRect_Palette0(2, 0, 2, 1, 0x1A, 0xC);
+ ScheduleBgCopyTilemapToVram(2);
+ data[2] = 0;
+ ++data[3];
+ }
+}
+
+static void TTVcmd_NpcMoveAndSetupTextPrinter(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+ struct Sprite * spriteAddr = &gSprites[data[1]];
+ if (data[2] != 35)
+ ++data[2];
+ else {
+ if (spriteAddr->pos2.x == 0x78)
+ {
+ StartSpriteAnim(&gSprites[data[1]], 0);
+ TeachyTvInitTextPrinter(gTeachyTvText_PokeDudeSaysHello);
+ data[2] = 0;
+ ++data[3];
+ }
+ else
+ ++spriteAddr->pos2.x;
+ }
+}
+
+static void TTVcmd_IdleIfTextPrinterIsActive(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (!RunTextPrinters_CheckActive(0))
+ ++data[3];
+}
+
+static void TeachyTvRenderMsgAndSwitchClusterFuncs(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (JOY_NEW(B_BUTTON))
+ {
+ sResources->grassAnimDisabled = 1;
+ TeachyTvSetSpriteCoordsAndSwitchFrame(data[1], 0, 0, 0);
+ FillWindowPixelBuffer(0, 0xCC);
+ CopyWindowToVram(0, 2);
+ TeachyTvClearBg1EndGraphicText();
+ data[2] = 0;
+ data[3] = 0;
+ gTasks[taskId].func = TTVcmd_End;
+ }
+ else
+ {
+ static void (* const * const array[])(u8) =
+ {
+ sBattleScript,
+ sStatusScript,
+ sMatchupsScript,
+ sCatchingScript,
+ sTMsScript,
+ sRegisterKeyItemScript,
+ };
+ void (*const *cluster)(u8) = array[sStaticResources.whichScript];
+ cluster[data[3]](taskId);
+ }
+}
+
+static void TTVcmd_TextPrinterSwitchStringByOptionChosen(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ static const u8 *const texts[] = {
+ gTeachyTvText_BattleScript1,
+ gTeachyTvText_StatusScript1,
+ gTeachyTvText_MatchupsScript1,
+ gTeachyTvText_CatchingScript1,
+ gTeachyTvText_TMsScript1,
+ gTeachyTvText_RegisterScript1,
+ };
+ TeachyTvInitTextPrinter(texts[sStaticResources.whichScript]);
+ ++data[3];
+}
+
+static void TTVcmd_TextPrinterSwitchStringByOptionChosen2(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ static const u8 *const texts[] =
+ {
+ gTeachyTvText_BattleScript2,
+ gTeachyTvText_StatusScript2,
+ gTeachyTvText_MatchupsScript2,
+ gTeachyTvText_CatchingScript2,
+ gTeachyTvText_TMsScript2,
+ gTeachyTvText_RegisterScript2,
+ };
+ TeachyTvInitTextPrinter(texts[sStaticResources.whichScript]);
+ ++data[3];
+}
+
+static const u16 sBg1EndGraphic[] =
+{
+ 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8,
+ 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8,
+};
+
+static const struct Subsprite sSubspriteArray[] =
+{
+ {
+ .x = -0x8,
+ .y = -0x8,
+ .shape = 0x1,
+ .size = 0x0,
+ .tileOffset = 0x0,
+ .priority = 0x3,
+ },
+ {
+ .x = -0x8,
+ .y = 0x0,
+ .shape = 0x1,
+ .size = 0x0,
+ .tileOffset = 0x2,
+ .priority = 0x2,
+ },
+};
+
+static const struct SubspriteTable sSubspriteTableArray[] =
+{
+ {
+ .subspriteCount = 0,
+ .subsprites = NULL,
+ },
+ {
+ .subspriteCount = 2,
+ .subsprites = sSubspriteArray,
+ },
+};
+
+static const u8 sGrassAnimArray[] =
+{
+ 0, 0, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 0, 0,
+ 0, 0, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 0, 0,
+ 0, 0, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 0, 0,
+ 0, 0, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 0, 0,
+ 0, 0, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 0, 0,
+};
+
+static void TTVcmd_IdleIfTextPrinterIsActive2(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (!RunTextPrinters_CheckActive(0))
+ ++data[3];
+}
+
+static void TTVcmd_EraseTextWindowIfKeyPressed(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (JOY_NEW(A_BUTTON | B_BUTTON))
+ {
+ FillWindowPixelBuffer(0, 0xCC);
+ CopyWindowToVram(0, 2);
+ ++data[3];
+ }
+}
+
+static void TTVcmd_StartAnimNpcWalkIntoGrass(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ StartSpriteAnim(&gSprites[data[1]], 5);
+ data[2] = 0;
+ data[4] = 0;
+ data[5] = 1;
+ ++data[3];
+}
+
+static void TTVcmd_DudeMoveUp(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ struct Sprite *obj = &gSprites[data[1]];
+ ChangeBgY(3, 0x100, 2);
+ if (!(++data[2] & 0xF))
+ {
+ --sResources->grassAnimCounterHi;
+ TeachyTvGrassAnimationMain(taskId, obj->pos2.x, obj->pos2.y, 0, 0);
+ }
+ if (data[2] == 48)
+ {
+ data[2] = 0;
+ data[4] = -1;
+ data[5] = 0;
+ StartSpriteAnim(obj, 7);
+ ++data[3];
+ }
+}
+
+static void TTVcmd_DudeMoveRight(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ struct Sprite *obj = &gSprites[data[1]];
+ ChangeBgX(3, 0x100, 1);
+ if (!(++data[2] & 0xF))
+ ++sResources->grassAnimCounterLo;
+ if (!((data[2] + 8) & 0xF))
+ TeachyTvGrassAnimationMain(taskId, obj->pos2.x + 8, obj->pos2.y, 0, 0);
+ if (data[2] == 0x30)
+ {
+ data[2] = 0;
+ data[4] = 0;
+ data[5] = 0;
+ StartSpriteAnim(obj, 3);
+ ++data[3];
+ }
+}
+
+static void TTVcmd_DudeTurnLeft(u8 taskId)
+{
+
+ s16 *data = gTasks[taskId].data;
+ struct Sprite *objAddr = &gSprites[data[1]];
+ StartSpriteAnim(objAddr, 6);
+ ++data[3];
+ data[4] = 0;
+ data[5] = 0;
+ TeachyTvGrassAnimationMain(taskId, objAddr->pos2.x, objAddr->pos2.y, 0, 0);
+}
+
+static void TTVcmd_DudeMoveLeft(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ struct Sprite *objAddr = &gSprites[data[1]];
+
+ if (!(objAddr->pos2.x & 0xF))
+ TeachyTvGrassAnimationMain(taskId, objAddr->pos2.x - 8, objAddr->pos2.y, 0, 0);
+ if (objAddr->pos2.x == 8)
+ ++data[3];
+ else
+ --objAddr->pos2.x;
+}
+
+static void TTVcmd_RenderAndRemoveBg1EndGraphic(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (!data[2])
+ {
+ CopyToBgTilemapBufferRect_ChangePalette(1, sBg1EndGraphic, 20, 10, 8, 2, 0x11);
+ ScheduleBgCopyTilemapToVram(1);
+ }
+ if (++data[2] > 126)
+ {
+ TeachyTvClearBg1EndGraphicText();
+ data[2] = 0;
+ ++data[3];
+ }
+}
+
+static void TeachyTvClearBg1EndGraphicText(void)
+{
+ FillBgTilemapBufferRect_Palette0(1, 0, 20, 10, 8, 2);
+ ScheduleBgCopyTilemapToVram(1);
+}
+
+static void TTVcmd_End(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (data[2] == 0)
+ PlayNewMapMusic(BGM_FRLG_TEACHY_TV);
+ TeachyTvBg2AnimController();
+ if (++data[2] > 63)
+ {
+ data[2] = 0;
+ data[3] = 0;
+ data[0] = TeachyTvSetupWindow();
+ gTasks[taskId].func = TeachyTvOptionListController;
+ PutWindowTilemap(0);
+ TeachyTvSetupScrollIndicatorArrowPair();
+ TeachyTvSetWindowRegs();
+ ScheduleBgCopyTilemapToVram(0);
+ ChangeBgX(3, 0x0, 0);
+ ChangeBgY(3, 0x0, 0);
+ ChangeBgX(3, 0x1000, 2);
+ ChangeBgY(3, 0x2800, 1);
+ sResources->grassAnimCounterLo = 0;
+ sResources->grassAnimCounterHi = 3;
+ sResources->grassAnimDisabled = 0;
+ }
+}
+
+static void TTVcmd_TaskBattleOrFadeByOptionChosen(u8 taskId)
+{
+ switch (sStaticResources.whichScript)
+ {
+ case TTVSCR_BATTLE:
+ case TTVSCR_STATUS:
+ case TTVSCR_MATCHUPS:
+ case TTVSCR_CATCHING:
+ TeachyTvPrepBattle(taskId);
+ break;
+ case TTVSCR_TMS:
+ case TTVSCR_REGISTER:
+ sResources->savedCallback = TeachyTvSetupBagItemsByOptionChosen;
+ TeachyTvQuitBeginFade(taskId);
+ break;
+ }
+}
+
+static void TeachyTvSetupBagItemsByOptionChosen(void)
+{
+ if (sStaticResources.whichScript == TTVSCR_TMS)
+ sub_810B108(10);
+ else
+ sub_810B108(9);
+}
+
+static void TeachyTvPostBattleFadeControl(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (!(gPaletteFade.active))
+ {
+ data[3] = sWhereToReturnToFromBattle[sStaticResources.whichScript];
+ gTasks[taskId].func = TeachyTvRenderMsgAndSwitchClusterFuncs;
+ }
+}
+
+static void TeachyTvGrassAnimationMain(u8 taskId, s16 x, s16 y, u8 subpriority, bool8 mode)
+{
+ struct Sprite *obj;
+ u8 spriteId;
+
+ if (sResources->grassAnimDisabled != 1 && TeachyTvGrassAnimationCheckIfNeedsToGenerateGrassObj(x - 0x10, y))
+ {
+ spriteId = CreateSprite(gUnknown_83A0010[4], 0, 0, subpriority);
+ obj = &gSprites[spriteId];
+ obj->pos2.x = x;
+ obj->pos2.y = y + 8;
+ obj->callback = TeachyTvGrassAnimationObjCallback;
+ obj->data[0] = taskId;
+ if (mode == 1)
+ {
+ SeekSpriteAnim(obj, 4);
+ obj->oam.priority = 2;
+ }
+ else
+ {
+ SetSubspriteTables(obj, sSubspriteTableArray);
+ obj->subspriteTableNum = 0;
+ obj->subspriteMode = 1;
+ }
+ }
+}
+
+static void TeachyTvGrassAnimationObjCallback(struct Sprite *sprite)
+{
+ s16 diff1, diff2;
+ s16 *data = gTasks[sprite->data[0]].data;
+ struct Sprite *objAddr = &gSprites[data[1]];
+
+ if (sResources->grassAnimDisabled == 1)
+ DestroySprite(sprite);
+ else
+ {
+ if (sprite->animCmdIndex == 0)
+ sprite->subspriteTableNum = 1;
+ else
+ sprite->subspriteTableNum = 0;
+ sprite->pos2.x += data[4];
+ sprite->pos2.y += data[5];
+ if (sprite->animEnded)
+ {
+ sprite->subpriority = 0;
+ diff1 = sprite->pos2.x - objAddr->pos2.x;
+ diff2 = sprite->pos2.y - objAddr->pos2.y;
+ if (diff1 <= -16 || diff1 >= 16 || diff2 <= -16 || diff2 >= 24)
+ DestroySprite(sprite);
+ }
+ }
+}
+
+static u8 TeachyTvGrassAnimationCheckIfNeedsToGenerateGrassObj(s16 x, s16 y)
+{
+ const u8 * arr;
+ struct TeachyTvBuf *ptr;
+ int high, low;
+ if ((x < 0) || (y < 0))
+ return 0;
+ arr = sGrassAnimArray;
+ high = ((y >> 4) + sResources->grassAnimCounterHi) << 4;
+ low = ((x >> 4) + sResources->grassAnimCounterLo);
+ return arr[high+low];
+}
+
+static void TeachyTvPrepBattle(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ TeachyTvFree();
+ gSpecialVar_0x8004 = sStaticResources.whichScript;
+ gMain.savedCallback = TeachyTvRestorePlayerPartyCallback;
+ SavePlayerParty();
+ sub_8159F40();
+ PlayMapChosenOrBattleBGM(MUS_DUMMY);
+ if (sStaticResources.whichScript == TTVSCR_BATTLE)
+ data[6] = 9;
+ else
+ data[6] = 8;
+ data[7] = 0;
+ gTasks[taskId].func = TeachyTvPreBattleAnimAndSetBattleCallback;
+}
+
+static void TeachyTvPreBattleAnimAndSetBattleCallback(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ switch (data[7])
+ {
+ case 0:
+ sub_80D08B8(data[6]);
+ ++data[7];
+ break;
+ case 1:
+ if (sub_80D08F8())
+ {
+ SetMainCallback2(sub_800FD9C);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void TeachyTvRestorePlayerPartyCallback(void)
+{
+ LoadPlayerParty();
+ if (gBattleOutcome == B_OUTCOME_DREW)
+ SetTeachyTvControllerModeToResume();
+ else
+ PlayNewMapMusic(BGM_FRLG_FOLLOW_ME);
+ CB2_ReturnToTeachyTV();
+}
+
+static void TeachyTvLoadBg3Map(u16 *buffer)
+{
+ u16 * bgTilesBuffer;
+ u8 * mapTilesRowBuffer;
+ u16 i, j, k;
+ u16 currentBlockIdx;
+ void * tilesetsBuffer;
+ void * palIndicesBuffer;
+ u16 numMapTilesRows = 0;
+ const struct MapData *layout = &Route1_Layout;
+ u16 * blockIndicesBuffer = AllocZeroed(0x800);
+ tilesetsBuffer = AllocZeroed(0x8000);
+ palIndicesBuffer = Alloc(16);
+ memset(palIndicesBuffer, 0xFF, 16);
+
+ TeachyTvLoadMapTilesetToBuffer(layout->primaryTileset, tilesetsBuffer, 0x280);
+ TeachyTvLoadMapTilesetToBuffer(layout->secondaryTileset, tilesetsBuffer + 0x5000, 0x180);
+
+ for (i = 0; i < 9; i++)
+ {
+ for (j = 0; j < 16; j++)
+ {
+ currentBlockIdx = layout->map[8 + (i + 6) * layout->width + j] & 0x3FF;
+ for (k = 0; k < (i << 4) + j; k++)
+ {
+ if (blockIndicesBuffer[k] == 0)
+ break;
+ if (blockIndicesBuffer[k] == currentBlockIdx)
+ break;
+ }
+ if (blockIndicesBuffer[k] == 0)
+ {
+ blockIndicesBuffer[k] = currentBlockIdx;
+ numMapTilesRows++;
+ }
+ TeachyTvPushBackNewMapPalIndexArrayEntry(layout, &buffer[64 * i + 2 * j], palIndicesBuffer, currentBlockIdx, k);
+ }
+ }
+
+ bgTilesBuffer = Alloc(numMapTilesRows * 0x80);
+ mapTilesRowBuffer = Alloc(0x80);
+ for (i = 0; i < numMapTilesRows; i++)
+ {
+ memset(mapTilesRowBuffer, 0, 0x80);
+ if (blockIndicesBuffer[i] < 0x280)
+ {
+ TeachyTvComputeMapTilesFromTilesetAndMetaTiles(layout->primaryTileset->metatiles + blockIndicesBuffer[i] * 16, mapTilesRowBuffer, tilesetsBuffer);
+ }
+ else
+ {
+ TeachyTvComputeMapTilesFromTilesetAndMetaTiles(layout->secondaryTileset->metatiles + (blockIndicesBuffer[i] - 0x280) * 16, mapTilesRowBuffer, tilesetsBuffer);
+ }
+ CpuFastCopy(mapTilesRowBuffer, bgTilesBuffer + i * 0x40, 0x80);
+ }
+
+ LoadBgTiles(3, bgTilesBuffer, numMapTilesRows * 0x80, 0);
+ TeachyTvLoadMapPalette(layout, palIndicesBuffer);
+
+ Free(mapTilesRowBuffer);
+ Free(bgTilesBuffer);
+ Free(palIndicesBuffer);
+ Free(tilesetsBuffer);
+ Free(blockIndicesBuffer);
+}
+
+static void TeachyTvLoadMapTilesetToBuffer(struct Tileset *ts, u8 *dstBuffer, u16 size)
+{
+ if (ts)
+ {
+ if (!ts->isCompressed)
+ CpuFastSet(ts->tiles, dstBuffer, 8 * size);
+ else
+ LZDecompressWram(ts->tiles, dstBuffer);
+ }
+}
+
+static void TeachyTvPushBackNewMapPalIndexArrayEntry(const struct MapData *mStruct, u16 *buf1, u8 *palIndexArray, u16 mapEntry, u16 offset)
+{
+ u16 * metaTileEntryAddr = mapEntry <= 0x27F ? &((u16*)(mStruct->primaryTileset->metatiles))[8 * mapEntry] : &((u16*)(mStruct->secondaryTileset->metatiles))[8 * (mapEntry - 0x280)];
+ buf1[0] = (TeachyTvComputePalIndexArrayEntryByMetaTile(palIndexArray, metaTileEntryAddr[0]) << 12) + 4 * offset;
+ buf1[1] = (TeachyTvComputePalIndexArrayEntryByMetaTile(palIndexArray, metaTileEntryAddr[1]) << 12) + 4 * offset + 1;
+ buf1[32] = (TeachyTvComputePalIndexArrayEntryByMetaTile(palIndexArray, metaTileEntryAddr[2]) << 12) + 4 * offset + 2;
+ buf1[33] = (TeachyTvComputePalIndexArrayEntryByMetaTile(palIndexArray, metaTileEntryAddr[3]) << 12) + 4 * offset + 3;
+}
+
+static void TeachyTvComputeMapTilesFromTilesetAndMetaTiles(u16 *metaTilesArray, u8 *blockBuf, u8 *tileset)
+{
+ TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf, &tileset[0x20 * (*metaTilesArray & 0x3FF)], (*metaTilesArray >> 10) & 3);
+ TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf, &tileset[0x20 * (metaTilesArray[4] & 0x3FF)], (metaTilesArray[4] >> 10) & 3);
+ TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf + 0x20, &tileset[0x20 * (metaTilesArray[1] & 0x3FF)], (metaTilesArray[1] >> 10) & 3);
+ TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf + 0x20, &tileset[0x20 * (metaTilesArray[5] & 0x3FF)], (metaTilesArray[5] >> 10) & 3);
+ TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf + 0x40, &tileset[0x20 * (metaTilesArray[2] & 0x3FF)], (metaTilesArray[2] >> 10) & 3);
+ TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf + 0x40, &tileset[0x20 * (metaTilesArray[6] & 0x3FF)], (metaTilesArray[6] >> 10) & 3);
+ blockBuf += 0x60;
+ TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf, &tileset[0x20 * (metaTilesArray[3] & 0x3FF)], (metaTilesArray[3] >> 10) & 3);
+ TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(blockBuf, &tileset[0x20 * (metaTilesArray[7] & 0x3FF)], (metaTilesArray[7] >> 10) & 3);
+}
+
+static void TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(u8 *blockBuf, u8 *tileset, u8 metaTile)
+{
+ u8 i, j;
+ u8 * buffer = AllocZeroed(0x20);
+ u8 * src = AllocZeroed(0x20);
+ CpuFastSet(tileset, buffer, 8);
+ if (metaTile & 1)
+ {
+ for (i = 0; i < 8; ++i)
+ {
+ for (j = 0; j < 4; ++j)
+ {
+ u32 offset = j - 3;
+ u8 value = buffer[(i << 2) - offset];
+ src[(i << 2) + j] = ((value & 0xF) << 4) + ((value & 0xF0) >> 4);
+ }
+ }
+ CpuFastSet(src, buffer, 8);
+ }
+ if (metaTile & 2)
+ {
+ for (i = 0; i < 8; ++i)
+ memcpy(&src[4 * i], &buffer[4 * (7 - i)], 4);
+ CpuFastSet(src, buffer, 8);
+ }
+ for (i = 0; i < 32; ++i)
+ {
+ if (buffer[i] & 0xF0)
+ blockBuf[i] = (blockBuf[i] & 0xF) + (buffer[i] & 0xF0);
+ if (buffer[i] & 0xF)
+ blockBuf[i] = (blockBuf[i] & 0xF0) + (buffer[i] & 0xF);
+ }
+ Free(src);
+ Free(buffer);
+}
+
+static u16 TeachyTvComputePalIndexArrayEntryByMetaTile(u8 *palIndexArrayBuf, u16 metaTile)
+{
+ u16 i;
+ int firstEntry;
+ int temp;
+ u32 pal = metaTile >> 12;
+ i = 0;
+ firstEntry = *palIndexArrayBuf;
+ if (firstEntry != pal)
+ {
+ if (firstEntry == 0xFF)
+ {
+ *palIndexArrayBuf = pal;
+ }
+ else
+ {
+ while (++i < 16)
+ {
+ temp = palIndexArrayBuf[i];
+ if (temp == pal)
+ break;
+ if (temp == 0xFF)
+ {
+ palIndexArrayBuf[i] = pal;
+ break;
+ }
+ }
+ }
+ }
+ return (0xF - i);
+}
+
+static void TeachyTvLoadMapPalette(const struct MapData * mStruct, const u8 * palIndexArray)
+{
+ u8 i;
+ const struct Tileset * ts;
+ u16 * dest;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (palIndexArray[i] == 0xFF)
+ break;
+ if (palIndexArray[i] > 6)
+ dest = (u16 *)mStruct->secondaryTileset->palettes + 0x10 * palIndexArray[i];
+ else
+ dest = (u16 *)mStruct->primaryTileset->palettes + 0x10 * palIndexArray[i];
+ LoadPalette(dest, 0x10 * (15 - i), 0x20);
+ }
+}
diff --git a/src/text.c b/src/text.c
index f84420352..d36a448ad 100644
--- a/src/text.c
+++ b/src/text.c
@@ -16,10 +16,9 @@ extern void FillWindowPixelRect(u8 windowId, u8 fillValue, u16 x, u16 y, u16 wid
extern void BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight);
extern u8 GetKeypadIconWidth(u8 keypadIconId);
extern void CopyWindowToVram(u8 windowId, u8 mode);
-extern u16 Font6Func(struct TextPrinter *textPrinter);
extern s32 GetGlyphWidthFont6(u16 glyphId, bool32 isJapanese);
extern void PlaySE(u16 songNum);
-extern u8* UnkTextUtil_GetPtrI(u8 a1);
+extern u8* DynamicPlaceholderTextUtil_GetPlaceholderPtr(u8 a1);
TextFlags gTextFlags;
@@ -1545,7 +1544,7 @@ s32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
}
case 0xF7:
if (bufferPointer == NULL)
- bufferPointer = UnkTextUtil_GetPtrI(*++str);
+ bufferPointer = DynamicPlaceholderTextUtil_GetPlaceholderPtr(*++str);
while (*bufferPointer != 0xFF)
{
glyphWidth = func(*bufferPointer++, isJapanese);
diff --git a/src/text_window.c b/src/text_window.c
index 90db8f599..98f82e818 100644
--- a/src/text_window.c
+++ b/src/text_window.c
@@ -31,19 +31,19 @@ void sub_814FD6C(u8 bgId, u16 destOffset, u8 palIdx)
void sub_814FDA0(u8 bgId, u16 destOffset, u8 palIdx)
{
- LoadBgTiles(bgId, gUnknown_8471A4C, 0x120, destOffset);
+ LoadBgTiles(bgId, gStdFrame0, 0x120, destOffset);
LoadPalette(stdpal_get(3), palIdx, 32);
}
void sub_814FDD4(u8 bgId, u16 destOffset)
{
- LoadBgTiles(bgId, gUnknown_8471B6C, 0x280, destOffset);
+ LoadBgTiles(bgId, gStdFrame1, 0x280, destOffset);
}
void sub_814FDF4(u8 bgId, u8 frameType, u16 destOffset, u8 palIdx)
{
- LoadBgTiles(bgId, gUnknown_8471E8C[frameType].tiles, 0x120, destOffset);
- LoadPalette(gUnknown_8471E8C[frameType].palette, palIdx, 32);
+ LoadBgTiles(bgId, gUserFrames[frameType].tiles, 0x120, destOffset);
+ LoadPalette(gUserFrames[frameType].palette, palIdx, 32);
}
void LoadUserWindowBorderGfx(u8 windowId, u16 destOffset, u8 palIdx)
@@ -57,7 +57,7 @@ void sub_814FE6C(u8 windowId, u16 destOffset, u8 palIdx)
LoadPalette(stdpal_get(2), palIdx, 32);
}
-void sub_814FEAC(u8 windowId, u16 destOffset, u8 palIdx)
+void TextWindow_LoadResourcesStdFrame0(u8 windowId, u16 destOffset, u8 palIdx)
{
LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gUnknown_841F1C8, 0x280, destOffset);
LoadPalette(stdpal_get(0), palIdx, 32);
@@ -69,29 +69,29 @@ void sub_814FEEC(u8 windowId, u16 destOffset, u8 palIdx)
LoadPalette(stdpal_get(1), palIdx, 32);
}
-void sub_814FF2C(u8 windowId, u16 destOffset, u8 palIdx)
+void TextWindow_SetStdFrame0_WithPal(u8 windowId, u16 destOffset, u8 palIdx)
{
- LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gUnknown_8471A4C, 0x120, destOffset);
+ LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gStdFrame0, 0x120, destOffset);
LoadPalette(stdpal_get(3), palIdx, 32);
}
void sub_814FF6C(u8 windowId, u16 destOffset)
{
- LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gUnknown_8471A4C, 0x120, destOffset);
+ LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gStdFrame0, 0x120, destOffset);
}
-void sub_814FF98(u8 windowId, u16 destOffset)
+void TextWindow_LoadTilesStdFrame1(u8 windowId, u16 destOffset)
{
- LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gUnknown_8471B6C, 0x280, destOffset);
+ LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gStdFrame1, 0x280, destOffset);
}
void sub_814FFC4(u8 windowId, u8 frameType, u16 destOffset, u8 palIdx)
{
- LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gUnknown_8471E8C[frameType].tiles, 0x120, destOffset);
- LoadPalette(gUnknown_8471E8C[frameType].palette, palIdx, 32);
+ LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gUserFrames[frameType].tiles, 0x120, destOffset);
+ LoadPalette(gUserFrames[frameType].palette, palIdx, 32);
}
-void sub_815001C(u8 windowId, u16 destOffset, u8 palIdx)
+void TextWindow_SetUserSelectedFrame(u8 windowId, u16 destOffset, u8 palIdx)
{
sub_814FFC4(windowId, gSaveBlock2Ptr->optionsWindowFrameType, destOffset, palIdx);
}
diff --git a/src/text_window_graphics.c b/src/text_window_graphics.c
index 347de3d65..e16037a34 100644
--- a/src/text_window_graphics.c
+++ b/src/text_window_graphics.c
@@ -27,8 +27,8 @@ static const u16 gUnknown_84719EC[] = INCBIN_U16("graphics/text_window/unk_84715
static const u16 gUnknown_8471A0C[] = INCBIN_U16("graphics/text_window/unk_84716AC.gbapal");
static const u16 gUnknown_8471A2C[] = INCBIN_U16("graphics/text_window/unk_84717CC.gbapal");
-const u16 gUnknown_8471A4C[] = INCBIN_U16("graphics/text_window/unk_8471A4C.4bpp");
-const u16 gUnknown_8471B6C[] = INCBIN_U16("graphics/text_window/unk_8471B6C.4bpp");
+const u16 gStdFrame0[] = INCBIN_U16("graphics/text_window/unk_8471A4C.4bpp");
+const u16 gStdFrame1[] = INCBIN_U16("graphics/text_window/unk_8471B6C.4bpp");
const u16 gUnknown_8471DEC[][16] = {
INCBIN_U16("graphics/text_window/stdpal_0.gbapal"),
@@ -38,7 +38,7 @@ const u16 gUnknown_8471DEC[][16] = {
INCBIN_U16("graphics/text_window/stdpal_4.gbapal")
};
-const struct TextWindowGraphics gUnknown_8471E8C[] = {
+const struct TextWindowGraphics gUserFrames[] = {
{gUnknown_8470D6C, gUnknown_847190C},
{gUnknown_8470E8C, gUnknown_847192C},
{gUnknown_8470FCC, gUnknown_847194C},
@@ -53,8 +53,8 @@ const struct TextWindowGraphics gUnknown_8471E8C[] = {
const struct TextWindowGraphics * sub_8069788(u8 idx)
{
- if (idx >= 20) // if (idx >= NELEMS(gUnknown_8471E8C))
- return &gUnknown_8471E8C[0];
+ if (idx >= 20) // if (idx >= NELEMS(gUserFrames))
+ return &gUserFrames[0];
else
- return &gUnknown_8471E8C[idx];
+ return &gUserFrames[idx];
}
diff --git a/src/tm_case.c b/src/tm_case.c
index 177d3320f..79e10bcfc 100644
--- a/src/tm_case.c
+++ b/src/tm_case.c
@@ -290,7 +290,7 @@ static void CB2_Idle(void)
RunTasks();
AnimateSprites();
BuildOamBuffer();
- do_scheduled_bg_tilemap_copies_to_vram();
+ DoScheduledBgTilemapCopiesToVram();
UpdatePaletteFade();
}
@@ -309,7 +309,7 @@ static void CB2_SetUpTMCaseUI_Blocking(void)
break;
if (DoSetUpTMCaseUI() == TRUE)
break;
- if (sub_80BF708() == TRUE)
+ if (MenuHelpers_LinkSomething() == TRUE)
break;
}
}
@@ -321,8 +321,8 @@ static bool8 DoSetUpTMCaseUI(void)
switch (gMain.state)
{
case 0:
- sub_80BF768();
- clear_scheduled_bg_copies_to_vram();
+ SetVBlankHBlankCallbacksToNull();
+ ClearScheduledBgCopiesToVram();
gMain.state++;
break;
case 1:
@@ -359,7 +359,7 @@ static bool8 DoSetUpTMCaseUI(void)
gMain.state++;
break;
case 9:
- sub_809A5E4(&gBagPockets[POCKET_TM_CASE - 1]);
+ SortPocketAndPlaceHMsFirst(&gBagPockets[POCKET_TM_CASE - 1]);
gMain.state++;
break;
case 10:
@@ -426,14 +426,14 @@ static void ResetBufferPointers_NoFree(void)
static void LoadBGTemplates(void)
{
void ** ptr;
- sub_80BF7C8();
+ ResetAllBgsCoordinatesAndBgCntRegs();
ptr = &sTilemapBuffer;
*ptr = AllocZeroed(0x800);
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, sBGTemplates, NELEMS(sBGTemplates));
SetBgTilemapBuffer(2, *ptr);
- schedule_bg_copy_tilemap_to_vram(1);
- schedule_bg_copy_tilemap_to_vram(2);
+ ScheduleBgCopyTilemapToVram(1);
+ ScheduleBgCopyTilemapToVram(2);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
SetGpuReg(REG_OFFSET_BLDCNT, 0);
ShowBg(0);
@@ -446,12 +446,12 @@ static bool8 HandleLoadTMCaseGraphicsAndPalettes(void)
switch (sTMCaseDynamicResources->seqId)
{
case 0:
- reset_temp_tile_data_buffers();
- decompress_and_copy_tile_data_to_vram(1, gUnknown_8E845D8, 0, 0, 0);
+ ResetTempTileDataBuffers();
+ DecompressAndCopyTileDataToVram(1, gUnknown_8E845D8, 0, 0, 0);
sTMCaseDynamicResources->seqId++;
break;
case 1:
- if (free_temp_tile_data_buffers_if_possible() != TRUE)
+ if (FreeTempTileDataBuffersIfPossible() != TRUE)
{
LZDecompressWram(gUnknown_8E84A24, sTilemapBuffer);
sTMCaseDynamicResources->seqId++;
@@ -469,7 +469,7 @@ static bool8 HandleLoadTMCaseGraphicsAndPalettes(void)
sTMCaseDynamicResources->seqId++;
break;
case 4:
- LoadCompressedObjectPic(&sTMSpriteSheet);
+ LoadCompressedSpriteSheet(&sTMSpriteSheet);
sTMCaseDynamicResources->seqId++;
break;
default:
@@ -496,11 +496,11 @@ static void InitTMCaseListMenuItems(void)
for (i = 0; i < sTMCaseDynamicResources->numTMs; i++)
{
GetTMNumberAndMoveString(sListMenuStringsBuffer[i], pocket->itemSlots[i].itemId);
- sListMenuItemsBuffer[i].unk_00 = sListMenuStringsBuffer[i];
- sListMenuItemsBuffer[i].unk_04 = i;
+ sListMenuItemsBuffer[i].label = sListMenuStringsBuffer[i];
+ sListMenuItemsBuffer[i].index = i;
}
- sListMenuItemsBuffer[i].unk_00 = gText_Close;
- sListMenuItemsBuffer[i].unk_04 = -2;
+ sListMenuItemsBuffer[i].label = gText_Close;
+ sListMenuItemsBuffer[i].index = -2;
gMultiuseListMenuTemplate.items = sListMenuItemsBuffer;
gMultiuseListMenuTemplate.totalItems = sTMCaseDynamicResources->numTMs + 1;
gMultiuseListMenuTemplate.windowId = 0;
@@ -595,8 +595,8 @@ static void TMCase_MoveCursor_UpdatePrintedDescription(s32 itemIndex)
static void FillBG2RowWithPalette_2timesNplus1(s32 a0)
{
- sub_80F6B08(2, 0, 12, 30, 8, 2 * a0 + 1);
- schedule_bg_copy_tilemap_to_vram(2);
+ SetBgRectPal(2, 0, 12, 30, 8, 2 * a0 + 1);
+ ScheduleBgCopyTilemapToVram(2);
}
static void PrintListMenuCursorByID_WithColorIdx(u8 a0, u8 a1)
@@ -619,13 +619,13 @@ static void PrintListMenuCursorAt_WithColorIdx(u8 a0, u8 a1)
static void CreateTMCaseScrollIndicatorArrowPair_Main(void)
{
- sTMCaseDynamicResources->scrollIndicatorArrowPairId = AddScrollIndicatorArrowPairParametrized(2, 0xA0, 0x08, 0x58, sTMCaseDynamicResources->numTMs - sTMCaseDynamicResources->maxTMsShown + 1, 0x6E, 0x6E, &sTMCaseStaticResources.scrollOffset);
+ sTMCaseDynamicResources->scrollIndicatorArrowPairId = AddScrollIndicatorArrowPairParameterized(2, 0xA0, 0x08, 0x58, sTMCaseDynamicResources->numTMs - sTMCaseDynamicResources->maxTMsShown + 1, 0x6E, 0x6E, &sTMCaseStaticResources.scrollOffset);
}
static void CreateTMCaseScrollIndicatorArrowPair_SellQuantitySelect(void)
{
sTMCaseDynamicResources->currItem = 1;
- sTMCaseDynamicResources->scrollIndicatorArrowPairId = AddScrollIndicatorArrowPairParametrized(2, 0x98, 0x48, 0x68, 2, 0x6E, 0x6E, &sTMCaseDynamicResources->currItem);
+ sTMCaseDynamicResources->scrollIndicatorArrowPairId = AddScrollIndicatorArrowPairParameterized(2, 0x98, 0x48, 0x68, 2, 0x6E, 0x6E, &sTMCaseDynamicResources->currItem);
}
static void RemoveTMCaseScrollIndicatorArrowPair(void)
@@ -648,7 +648,7 @@ static void TMCaseSetup_GetTMCount(void)
struct BagPocket * pocket = &gBagPockets[POCKET_TM_CASE - 1];
u16 i;
- sub_809A584(pocket->itemSlots, pocket->capacity);
+ BagPocketCompaction(pocket->itemSlots, pocket->capacity);
sTMCaseDynamicResources->numTMs = 0;
for (i = 0; i < pocket->capacity; i++)
{
@@ -716,7 +716,7 @@ static void Task_FadeOutAndCloseTMCase(u8 taskId)
if (!gPaletteFade.active)
{
- DestroyListMenu(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);
+ DestroyListMenuTask(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);
if (sTMCaseDynamicResources->savedCallback != NULL)
SetMainCallback2(sTMCaseDynamicResources->savedCallback);
else
@@ -736,8 +736,8 @@ static void Task_TMCaseMain(u8 taskId)
{
if (sub_80BF72C() != TRUE)
{
- input = ListMenuHandleInput(data[0]);
- get_coro_args_x18_x1A(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);
+ input = ListMenu_ProcessInput(data[0]);
+ ListMenuGetScrollAndRow(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);
if (JOY_NEW(SELECT_BUTTON) && sTMCaseStaticResources.unk_05 == 1)
{
PlaySE(SE_SELECT);
@@ -782,7 +782,7 @@ static void Task_SelectTMAction_FromFieldBag(u8 taskId)
{
u8 * strbuf;
TMCase_SetWindowBorder2(2);
- if (!sub_80BF708() && InUnionRoom() != TRUE)
+ if (!MenuHelpers_LinkSomething() && InUnionRoom() != TRUE)
{
AddTMContextMenu(&sTMCaseDynamicResources->contextMenuWindowId, 0);
sTMCaseDynamicResources->menuActionIndices = sMenuActionIndices_Field;
@@ -795,7 +795,7 @@ static void Task_SelectTMAction_FromFieldBag(u8 taskId)
sTMCaseDynamicResources->numMenuActions = NELEMS(sMenuActionIndices_UnionRoom);
}
AddItemMenuActionTextPrinters(sTMCaseDynamicResources->contextMenuWindowId, 2, GetMenuCursorDimensionByFont(2, 0), 2, 0, GetFontAttribute(2, 1) + 2, sTMCaseDynamicResources->numMenuActions, sMenuActions_UseGiveExit, sTMCaseDynamicResources->menuActionIndices);
- ProgramAndPlaceMenuCursorOnWindow(sTMCaseDynamicResources->contextMenuWindowId, 2, 0, 2, GetFontAttribute(2, 1) + 2, sTMCaseDynamicResources->numMenuActions, 0);
+ 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);
@@ -806,8 +806,8 @@ static void Task_SelectTMAction_FromFieldBag(u8 taskId)
PlaceHMTileInWindow(2, 0, 2);
CopyWindowToVram(2, 2);
}
- schedule_bg_copy_tilemap_to_vram(0);
- schedule_bg_copy_tilemap_to_vram(1);
+ ScheduleBgCopyTilemapToVram(0);
+ ScheduleBgCopyTilemapToVram(1);
gTasks[taskId].func = Task_TMContextMenu_HandleInput;
}
@@ -817,7 +817,7 @@ static void Task_TMContextMenu_HandleInput(u8 taskId)
if (sub_80BF72C() != TRUE)
{
- input = ProcessMenuInputNoWrapAround();
+ input = Menu_ProcessInputNoWrapAround();
switch (input)
{
case -1:
@@ -837,11 +837,11 @@ static void Task_TMContextMenu_HandleInput(u8 taskId)
static void TMHMContextMenuAction_Use(u8 taskId)
{
RemoveTMContextMenu(&sTMCaseDynamicResources->contextMenuWindowId);
- sub_810F4D8(2, 0);
+ ClearStdWindowAndFrameToTransparent(2, 0);
ClearWindowTilemap(2);
PutWindowTilemap(0);
- schedule_bg_copy_tilemap_to_vram(0);
- schedule_bg_copy_tilemap_to_vram(1);
+ ScheduleBgCopyTilemapToVram(0);
+ ScheduleBgCopyTilemapToVram(1);
if (CalculatePlayerPartyCount() == 0)
{
PrintError_ThereIsNoPokemon(taskId);
@@ -859,13 +859,13 @@ static void TMHMContextMenuAction_Give(u8 taskId)
s16 * data = gTasks[taskId].data;
u16 itemId = BagGetItemIdByPocketPosition(POCKET_TM_CASE, data[1]);
RemoveTMContextMenu(&sTMCaseDynamicResources->contextMenuWindowId);
- sub_810F4D8(2, 0);
+ ClearStdWindowAndFrameToTransparent(2, 0);
ClearWindowTilemap(2);
PutWindowTilemap(1);
PutWindowTilemap(4);
PutWindowTilemap(5);
- schedule_bg_copy_tilemap_to_vram(0);
- schedule_bg_copy_tilemap_to_vram(1);
+ ScheduleBgCopyTilemapToVram(0);
+ ScheduleBgCopyTilemapToVram(1);
if (!itemid_is_unique(itemId))
{
if (CalculatePlayerPartyCount() == 0)
@@ -909,16 +909,16 @@ static void Subtask_CloseContextMenuAndReturnToMain(u8 taskId)
{
s16 * data = gTasks[taskId].data;
- DestroyListMenu(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);
+ DestroyListMenuTask(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);
data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sTMCaseStaticResources.scrollOffset, sTMCaseStaticResources.selectedRow);
PrintListMenuCursorByID_WithColorIdx(data[0], 1);
- sub_810F260(6, 0);
+ ClearDialogWindowAndFrameToTransparent(6, 0);
ClearWindowTilemap(6);
PutWindowTilemap(1);
PutWindowTilemap(4);
PutWindowTilemap(5);
- schedule_bg_copy_tilemap_to_vram(0);
- schedule_bg_copy_tilemap_to_vram(1);
+ ScheduleBgCopyTilemapToVram(0);
+ ScheduleBgCopyTilemapToVram(1);
Subtask_ReturnToTMCaseMain(taskId);
}
@@ -927,15 +927,15 @@ static void TMHMContextMenuAction_Exit(u8 taskId)
s16 * data = gTasks[taskId].data;
RemoveTMContextMenu(&sTMCaseDynamicResources->contextMenuWindowId);
- sub_810F4D8(2, 0);
+ ClearStdWindowAndFrameToTransparent(2, 0);
ClearWindowTilemap(2);
PutWindowTilemap(0);
PrintListMenuCursorByID_WithColorIdx(data[0], 1);
PutWindowTilemap(1);
PutWindowTilemap(4);
PutWindowTilemap(5);
- schedule_bg_copy_tilemap_to_vram(0);
- schedule_bg_copy_tilemap_to_vram(1);
+ ScheduleBgCopyTilemapToVram(0);
+ ScheduleBgCopyTilemapToVram(1);
Subtask_ReturnToTMCaseMain(taskId);
}
@@ -1016,15 +1016,15 @@ static void Task_SaleOfTMsCancelled(u8 taskId)
{
s16 * data = gTasks[taskId].data;
- sub_810F4D8(8, 0);
- sub_810F260(6, 0);
+ ClearStdWindowAndFrameToTransparent(8, 0);
+ ClearDialogWindowAndFrameToTransparent(6, 0);
PutWindowTilemap(0);
PutWindowTilemap(1);
PutWindowTilemap(3);
PutWindowTilemap(4);
PutWindowTilemap(5);
- schedule_bg_copy_tilemap_to_vram(0);
- schedule_bg_copy_tilemap_to_vram(1);
+ ScheduleBgCopyTilemapToVram(0);
+ ScheduleBgCopyTilemapToVram(1);
PrintListMenuCursorByID_WithColorIdx(data[0], 1);
Subtask_ReturnToTMCaseMain(taskId);
}
@@ -1040,8 +1040,8 @@ static void Task_InitQuantitySelectUI(u8 taskId)
SellTM_PrintQuantityAndSalePrice(1, itemid_get_market_price(BagGetItemIdByPocketPosition(POCKET_TM_CASE, data[1])) / 2 * data[8]);
HandlePrintMoneyOnHand();
CreateTMCaseScrollIndicatorArrowPair_SellQuantitySelect();
- schedule_bg_copy_tilemap_to_vram(0);
- schedule_bg_copy_tilemap_to_vram(1);
+ ScheduleBgCopyTilemapToVram(0);
+ ScheduleBgCopyTilemapToVram(1);
gTasks[taskId].func = Task_QuantitySelect_HandleInput;
}
@@ -1058,30 +1058,30 @@ static void Task_QuantitySelect_HandleInput(u8 taskId)
{
s16 * data = gTasks[taskId].data;
- if (sub_80BF848(&data[8], data[2]) == 1)
+ if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == 1)
{
SellTM_PrintQuantityAndSalePrice(data[8], itemid_get_market_price(BagGetItemIdByPocketPosition(POCKET_TM_CASE, data[1])) / 2 * data[8]);
}
else if (JOY_NEW(A_BUTTON))
{
PlaySE(SE_SELECT);
- sub_810F4D8(7, 0);
- schedule_bg_copy_tilemap_to_vram(0);
- schedule_bg_copy_tilemap_to_vram(1);
+ ClearStdWindowAndFrameToTransparent(7, 0);
+ ScheduleBgCopyTilemapToVram(0);
+ ScheduleBgCopyTilemapToVram(1);
RemoveTMCaseScrollIndicatorArrowPair();
Task_AskConfirmSaleWithAmount(taskId);
}
else if (JOY_NEW(B_BUTTON))
{
PlaySE(SE_SELECT);
- sub_810F4D8(7, 0);
- sub_810F4D8(8, 0);
- sub_810F260(6, 0);
+ ClearStdWindowAndFrameToTransparent(7, 0);
+ ClearStdWindowAndFrameToTransparent(8, 0);
+ ClearDialogWindowAndFrameToTransparent(6, 0);
PutWindowTilemap(3);
PutWindowTilemap(0);
PutWindowTilemap(1);
- schedule_bg_copy_tilemap_to_vram(0);
- schedule_bg_copy_tilemap_to_vram(1);
+ ScheduleBgCopyTilemapToVram(0);
+ ScheduleBgCopyTilemapToVram(1);
RemoveTMCaseScrollIndicatorArrowPair();
PrintListMenuCursorByID_WithColorIdx(data[0], 1);
Subtask_ReturnToTMCaseMain(taskId);
@@ -1093,7 +1093,7 @@ static void Task_PrintSaleConfirmedText(u8 taskId)
s16 * data = gTasks[taskId].data;
PutWindowTilemap(0);
- schedule_bg_copy_tilemap_to_vram(0);
+ ScheduleBgCopyTilemapToVram(0);
CopyItemName(gSpecialVar_ItemId, gStringVar1);
ConvertIntToDecimalStringN(gStringVar3, itemid_get_market_price(BagGetItemIdByPocketPosition(POCKET_TM_CASE, data[1])) / 2 * data[8], STR_CONV_MODE_LEFT_ALIGN, 6);
StringExpandPlaceholders(gStringVar4, gText_TurnedOverItemsWorthYen);
@@ -1108,7 +1108,7 @@ static void Task_DoSaleOfTMs(u8 taskId)
RemoveBagItem(gSpecialVar_ItemId, data[8]);
AddMoney(&gSaveBlock1Ptr->money, itemid_get_market_price(gSpecialVar_ItemId) / 2 * data[8]);
sub_809C09C(gSpecialVar_ItemId, data[8], 2);
- DestroyListMenu(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);
+ DestroyListMenuTask(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow);
TMCaseSetup_GetTMCount();
TMCaseSetup_InitListMenuPositions();
InitTMCaseListMenuItems();
@@ -1123,8 +1123,8 @@ static void Task_AfterSale_ReturnToList(u8 taskId)
if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))
{
PlaySE(SE_SELECT);
- sub_810F4D8(8, 0);
- sub_810F260(6, 0);
+ ClearStdWindowAndFrameToTransparent(8, 0);
+ ClearDialogWindowAndFrameToTransparent(6, 0);
PutWindowTilemap(1);
PutWindowTilemap(3);
PutWindowTilemap(4);
@@ -1171,7 +1171,7 @@ static void Task_TMCaseDude_Playback(u8 taskId)
if (data[8] < 21)
{
data[8] = 21;
- sub_815AC20();
+ SetTeachyTvControllerModeToResume();
}
}
@@ -1204,7 +1204,7 @@ static void Task_TMCaseDude_Playback(u8 taskId)
{
gMain.newKeys = 0;
gMain.newAndRepeatedKeys = DPAD_DOWN;
- ListMenuHandleInput(data[0]);
+ ListMenu_ProcessInput(data[0]);
}
data[9]++;
if (data[9] > 0x65)
@@ -1223,7 +1223,7 @@ static void Task_TMCaseDude_Playback(u8 taskId)
{
gMain.newKeys = 0;
gMain.newAndRepeatedKeys = DPAD_UP;
- ListMenuHandleInput(data[0]);
+ ListMenu_ProcessInput(data[0]);
}
data[9]++;
if (data[9] > 0x65)
@@ -1249,8 +1249,8 @@ static void Task_TMCaseDude_Playback(u8 taskId)
{
FillBG2RowWithPalette_2timesNplus1(0);
BeginNormalPaletteFade(0x00000400, 0, 6, 0, 0);
- sub_810F260(6, 0);
- schedule_bg_copy_tilemap_to_vram(1);
+ ClearDialogWindowAndFrameToTransparent(6, 0);
+ ScheduleBgCopyTilemapToVram(1);
data[8]++;
}
break;
@@ -1269,7 +1269,7 @@ static void Task_TMCaseDude_Playback(u8 taskId)
{
memcpy(gSaveBlock1Ptr->bagPocket_TMHM, sPokeDudePackBackup->bagPocket_TMHM, sizeof(gSaveBlock1Ptr->bagPocket_TMHM));
memcpy(gSaveBlock1Ptr->bagPocket_KeyItems, sPokeDudePackBackup->bagPocket_KeyItems, sizeof(gSaveBlock1Ptr->bagPocket_KeyItems));
- DestroyListMenu(data[0], NULL, NULL);
+ DestroyListMenuTask(data[0], NULL, NULL);
sTMCaseStaticResources.selectedRow = sPokeDudePackBackup->unk_160;
sTMCaseStaticResources.scrollOffset = sPokeDudePackBackup->unk_162;
Free(sPokeDudePackBackup);
@@ -1297,9 +1297,9 @@ static void InitWindowTemplatesAndPals(void)
InitWindows(sWindowTemplates);
DeactivateAllTextPrinters();
- sub_815001C(0, 0x5B, 0xE0);
- sub_814FEAC(0, 0x64, 0xB0);
- sub_814FF2C(0, 0x78, 0xD0);
+ TextWindow_SetUserSelectedFrame(0, 0x5B, 0xE0);
+ TextWindow_LoadResourcesStdFrame0(0, 0x64, 0xB0);
+ TextWindow_SetStdFrame0_WithPal(0, 0x78, 0xD0);
LoadPalette(gTMCaseMainWindowPalette, 0xF0, 0x20);
LoadPalette(gTMCaseMainWindowPalette, 0xA0, 0x20);
LoadPalette(sPal3Override, 0xF6, 0x04);
@@ -1312,42 +1312,42 @@ static void InitWindowTemplatesAndPals(void)
PutWindowTilemap(3);
PutWindowTilemap(4);
PutWindowTilemap(5);
- schedule_bg_copy_tilemap_to_vram(0);
+ ScheduleBgCopyTilemapToVram(0);
}
static void AddTextPrinterParameterized_ColorByIndex(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx)
{
- AddTextPrinterParametrized2(windowId, fontId, x, y, letterSpacing, lineSpacing, &sTextColors[colorIdx], speed, str);
+ AddTextPrinterParameterized4(windowId, fontId, x, y, letterSpacing, lineSpacing, &sTextColors[colorIdx], speed, str);
}
static void TMCase_SetWindowBorder1(u8 windowId)
{
- SetWindowBorderStyle(windowId, FALSE, 0x5B, 0x0E);
+ DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, 0x5B, 0x0E);
}
static void TMCase_SetWindowBorder2(u8 windowId)
{
- SetWindowBorderStyle(windowId, FALSE, 0x78, 0x0D);
+ DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, 0x78, 0x0D);
}
static void TMCase_PrintMessageWithFollowupTask(u8 taskId, u8 windowId, const u8 * str, TaskFunc func)
{
DisplayMessageAndContinueTask(taskId, 6, 0x64, 0x0B, windowId, GetTextSpeedSetting(), str, func);
- schedule_bg_copy_tilemap_to_vram(1);
+ ScheduleBgCopyTilemapToVram(1);
}
static void PrintStringTMCaseOnWindow3(void)
{
u32 distance = 72 - GetStringWidth(1, gText_TMCase, 0);
- box_print(3, 1, distance / 2, 1, &sTextColors[0], 0, gText_TMCase);
+ AddTextPrinterParameterized3(3, 1, distance / 2, 1, &sTextColors[0], 0, gText_TMCase);
}
static void DrawMoveInfoUIMarkers(void)
{
- blit_move_info_icon(4, 19, 0, 0);
- blit_move_info_icon(4, 20, 0, 12);
- blit_move_info_icon(4, 21, 0, 24);
- blit_move_info_icon(4, 22, 0, 36);
+ BlitMoveInfoIcon(4, 19, 0, 0);
+ BlitMoveInfoIcon(4, 20, 0, 12);
+ BlitMoveInfoIcon(4, 21, 0, 24);
+ BlitMoveInfoIcon(4, 22, 0, 36);
CopyWindowToVram(4, 2);
}
@@ -1369,7 +1369,7 @@ static void TMCase_MoveCursor_UpdatePrintedTMInfo(u16 itemId)
else
{
move = ItemIdToBattleMoveId(itemId);
- blit_move_info_icon(5, gBattleMoves[move].type + 1, 0, 0);
+ BlitMoveInfoIcon(5, gBattleMoves[move].type + 1, 0, 0);
if (gBattleMoves[move].power < 2)
str = gText_ThreeHyphens;
else
@@ -1413,17 +1413,17 @@ static u8 AddTMContextMenu(u8 * a0, u8 a1)
{
*a0 = AddWindow(&sTMContextWindowTemplates[a1]);
TMCase_SetWindowBorder1(*a0);
- schedule_bg_copy_tilemap_to_vram(0);
+ ScheduleBgCopyTilemapToVram(0);
}
return *a0;
}
static void RemoveTMContextMenu(u8 * a0)
{
- sub_810F4D8(*a0, FALSE);
+ ClearStdWindowAndFrameToTransparent(*a0, FALSE);
ClearWindowTilemap(*a0);
RemoveWindow(*a0);
- schedule_bg_copy_tilemap_to_vram(0);
+ ScheduleBgCopyTilemapToVram(0);
*a0 = 0xFF;
}
diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c
index ecd889d80..25a8d4515 100644
--- a/src/trainer_pokemon_sprites.c
+++ b/src/trainer_pokemon_sprites.c
@@ -109,7 +109,7 @@ void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8 palett
else
{
sCreatingSpriteTemplate.paletteTag = paletteTag;
- LoadCompressedObjectPalette(GetMonSpritePalStructFromOtIdPersonality(species, otId, personality));
+ LoadCompressedSpritePalette(GetMonSpritePalStructFromOtIdPersonality(species, otId, personality));
}
}
else
@@ -122,7 +122,7 @@ void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8 palett
else
{
sCreatingSpriteTemplate.paletteTag = paletteTag;
- LoadCompressedObjectPalette(&gTrainerFrontPicPaletteTable[species]);
+ LoadCompressedSpritePalette(&gTrainerFrontPicPaletteTable[species]);
}
}
}
diff --git a/src/trainer_tower.c b/src/trainer_tower.c
index d2f7c92a9..f1ae2d4e5 100644
--- a/src/trainer_tower.c
+++ b/src/trainer_tower.c
@@ -35,45 +35,10 @@ struct UnkStruct_8479D34
u8 flags3[8];
};
-struct UnkSubstruct_203F458_000C_004
-{
- /* 0x000 */ u8 unk_000[11];
- /* 0x00B */ u8 unk_00B;
- /* 0x00C */ u8 unk_00C;
- /* 0x00E */ u16 unk_00E[6];
- /* 0x01A */ u16 unk_01A[6];
- /* 0x026 */ u16 unk_026[6];
- /* 0x032 */ u16 unk_032[6];
- /* 0x040 */ struct BattleTowerPokemon unk_040[PARTY_SIZE];
-}; // size: 328
-
-struct UnkSubstruct_203F458_000C
-{
- /* 0x000 */ u8 unk_000;
- /* 0x000 */ u8 unk_001;
- /* 0x002 */ u8 unk_002;
- /* 0x003 */ u8 unk_003;
- /* 0x004 */ struct UnkSubstruct_203F458_000C_004 unk_004[3];
- /* 0x3DC */ u8 filler_3DC[4];
-};
-
-struct Unk_203F458_Header
-{
- u8 unk0;
- u8 unk1;
- u32 unk4;
-};
-
-struct UnkStruct_203F458_SaveBlock
-{
- struct Unk_203F458_Header unk_0000;
- struct UnkSubstruct_203F458_000C unk_0008[8];
-};
-
struct UnkStruct_203F458
{
/* 0x0000 */ u8 unk_0000;
- /* 0x0004 */ struct UnkStruct_203F458_SaveBlock unk_0004;
+ /* 0x0004 */ struct TrainerTowerData unk_0004;
};
struct UnkStruct_203F45C
@@ -112,6 +77,7 @@ struct UnkStruct_847A074
EWRAM_DATA struct UnkStruct_203F458 * gUnknown_203F458 = NULL;
EWRAM_DATA struct UnkStruct_203F45C * gUnknown_203F45C = NULL;
+EWRAM_DATA u8 unused_variable = 0;
void sub_815D96C(void);
void sub_815DC8C(void); // setup
@@ -563,30 +529,7 @@ const u8 gUnknown_847A30E[][3] = {
};
extern const struct Unk_203F458_Header gUnknown_84827AC;
-extern const struct UnkSubstruct_203F458_000C *const gUnknown_84827B4[][8];
-
-bool32 sub_815D7BC(void * dest, void * buffer)
-{
- if (TryCopySpecialSaveSection(30, buffer) != 1)
- return FALSE;
- memcpy(dest + 0x000, buffer, 0xF88);
-
- if (TryCopySpecialSaveSection(31, buffer) != 1)
- return FALSE;
- memcpy(dest + 0xF88, buffer, 0xF80);
-
- if (!sub_815D6B4(dest))
- return FALSE;
- return TRUE;
-}
-
-bool32 sub_815D80C(void * dest)
-{
- void * buffer = AllocZeroed(0x1000);
- bool32 success = sub_815D7BC(dest, buffer);
- Free(buffer);
- return success;
-}
+extern const struct TrainerTowerTrainer *const gUnknown_84827B4[][8];
bool32 sub_815D834(void)
{
@@ -623,10 +566,10 @@ void sub_815D8C8(void)
}
}
-void sub_815D8F8(void) // fakematching
+void sub_815D8F8(void)
{
u8 i;
- register u32 found_map asm("r4") = 0xFF;
+ u8 found_map = 0xFF;
for (i = 0; i < 15; i++)
{
if (gUnknown_8479D34[i].mapGroup == gSaveBlock1Ptr->location.mapGroup && gUnknown_8479D34[i].mapNum == gSaveBlock1Ptr->location.mapNum)
@@ -696,23 +639,23 @@ void sub_815DA54(void)
sub_815DC8C();
gUnknown_203F45C = AllocZeroed(sizeof(*gUnknown_203F45C));
r10 = VarGet(VAR_0x4001);
- StringCopyN(gUnknown_203F45C->unk_00, gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r10].unk_000, 11);
+ StringCopyN(gUnknown_203F45C->unk_00, gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r10].unk_000, 11);
for (r9 = 0; r9 < 6; r9++)
{
- gUnknown_203F45C->unk_0C[r9] = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r10].unk_01A[r9];
- gUnknown_203F45C->unk_18[r9] = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r10].unk_026[r9];
+ gUnknown_203F45C->unk_0C[r9] = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r10].unk_01A[r9];
+ gUnknown_203F45C->unk_18[r9] = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r10].unk_026[r9];
- if (gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_002 == 1)
+ if (gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_002 == 1)
{
- gUnknown_203F45C->unk_24[r9] = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r10 + 1].unk_01A[r9];
- gUnknown_203F45C->unk_30[r9] = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r10 + 1].unk_026[r9];
+ gUnknown_203F45C->unk_24[r9] = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r10 + 1].unk_01A[r9];
+ gUnknown_203F45C->unk_30[r9] = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r10 + 1].unk_026[r9];
}
}
- gUnknown_203F45C->unk_3C = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_002;
- gUnknown_203F45C->unk_3D = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r10].unk_00B;
- gUnknown_203F45C->unk_3E = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r10].unk_00C;
+ gUnknown_203F45C->unk_3C = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_002;
+ gUnknown_203F45C->unk_3D = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r10].unk_00B;
+ gUnknown_203F45C->unk_3E = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r10].unk_00C;
SetVBlankCounter1Ptr(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0);
sub_815DD2C();
}
@@ -750,12 +693,12 @@ void sub_815DC8C(void) // fakematching
{
u32 whichTimer = gSaveBlock1Ptr->unkArrayIdx;
s32 r4;
- const struct UnkSubstruct_203F458_000C *const * r7;
+ const struct TrainerTowerTrainer *const * r7;
gUnknown_203F458 = AllocZeroed(sizeof(*gUnknown_203F458));
gUnknown_203F458->unk_0000 = gMapHeader.mapDataId - 0x2A;
if (sub_815D834() == TRUE)
- sub_815D80C(&gUnknown_203F458->unk_0004);
+ CEReaderTool_LoadTrainerTower(&gUnknown_203F458->unk_0004);
else
{
struct UnkStruct_203F458 * r0_ = gUnknown_203F458;
@@ -767,12 +710,12 @@ void sub_815DC8C(void) // fakematching
for (r4 = 0; r4 < 8; r4++)
{
void * r0 = gUnknown_203F458;
- r0 = r4 * sizeof(struct UnkSubstruct_203F458_000C) + r0;
- r0 += offsetof(struct UnkStruct_203F458, unk_0004.unk_0008);
- memcpy(r0, r7[r4], sizeof(struct UnkSubstruct_203F458_000C));
+ r0 = r4 * sizeof(struct TrainerTowerTrainer) + r0;
+ r0 += offsetof(struct UnkStruct_203F458, unk_0004.trainers);
+ memcpy(r0, r7[r4], sizeof(struct TrainerTowerTrainer));
// r0[r4] = *r7[r4];
}
- gUnknown_203F458->unk_0004.unk_0000.unk4 = CalcByteArraySum((void *)gUnknown_203F458->unk_0004.unk_0008, sizeof(gUnknown_203F458->unk_0004.unk_0008));
+ gUnknown_203F458->unk_0004.unk4 = CalcByteArraySum((void *)gUnknown_203F458->unk_0004.trainers, sizeof(gUnknown_203F458->unk_0004.trainers));
sub_815EC0C();
}
}
@@ -799,7 +742,7 @@ void sub_815DC8C(void)
"\tbne _0815DCD0\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0x4\n"
- "\tbl sub_815D80C\n"
+ "\tbl CEReaderTool_LoadTrainerTower\n"
"\tb _0815DD18\n"
"\t.align 2, 0\n"
"_0815DCBC: .4byte gSaveBlock1Ptr\n"
@@ -860,14 +803,14 @@ void sub_815DD2C(void)
void sub_815DD44(void)
{
- if (gMapHeader.mapDataId - 0x129 > gUnknown_203F458->unk_0004.unk_0000.unk0)
+ if (gMapHeader.mapDataId - 0x129 > gUnknown_203F458->unk_0004.count)
{
gSpecialVar_Result = 3;
SetCurrentMapLayout(0x132);
}
else
{
- gSpecialVar_Result = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_002;
+ gSpecialVar_Result = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_002;
SetCurrentMapLayout(gUnknown_847A284[gUnknown_203F458->unk_0000][gSpecialVar_Result]);
sub_815DDB0();
}
@@ -877,10 +820,10 @@ void sub_815DDB0(void)
{
s32 r3, r4;
u8 r1, r2, r4_;
- switch (gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_002)
+ switch (gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_002)
{
case 0:
- r2 = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[0].unk_00B;
+ r2 = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[0].unk_00B;
for (r3 = 0; r3 < NELEMS(gUnknown_8479ED8); r3++)
{
if (gUnknown_8479ED8[r3].unk1 == r2)
@@ -893,7 +836,7 @@ void sub_815DDB0(void)
VarSet(VAR_0x4011, r1);
break;
case 1:
- r2 = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[0].unk_00B;
+ r2 = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[0].unk_00B;
for (r3 = 0; r3 < NELEMS(gUnknown_847A024); r3++)
{
if (gUnknown_847A024[r3].unk2 == r2)
@@ -915,7 +858,7 @@ void sub_815DDB0(void)
case 2:
for (r4 = 0; r4 < 3; r4++)
{
- r2 = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_00B;
+ r2 = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_00B;
for (r3 = 0; r3 < NELEMS(gUnknown_8479ED8); r3++)
{
if (gUnknown_8479ED8[r3].unk1 == r2)
@@ -962,25 +905,25 @@ void sub_815DF54(void)
{
u16 r4 = gSpecialVar_0x8006;
u8 r1;
- u8 r5 = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_002;
+ u8 r5 = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_002;
// HOW DO I MATCH THIS CONTROL FLOW?!?!
- r1 = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r5 == 1 ? 0 : r4].unk_00B;
+ r1 = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r5 == 1 ? 0 : r4].unk_00B;
switch (gSpecialVar_0x8005)
{
case 2:
sub_815E068(r5, r1);
- sub_815DEFC(gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_00E, gStringVar4);
+ sub_815DEFC(gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_00E, gStringVar4);
break;
case 3:
sub_815E068(r5, r1);
- sub_815DEFC(gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_01A, gStringVar4);
+ sub_815DEFC(gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_01A, gStringVar4);
break;
case 4:
sub_815E068(r5, r1);
- sub_815DEFC(gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_026, gStringVar4);
+ sub_815DEFC(gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_026, gStringVar4);
break;
case 5:
- sub_815DEFC(gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_032, gStringVar4);
+ sub_815DEFC(gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_032, gStringVar4);
break;
}
}
@@ -1163,7 +1106,7 @@ void sub_815E068(u8 battleType, u8 facilityClass)
void sub_815E114(void)
{
- SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
void sub_815E124(u8 taskId)
@@ -1180,7 +1123,7 @@ void sub_815E124(u8 taskId)
void sub_815E160(void)
{
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_FACTORY;
- if (gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_002 == 1)
+ if (gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_002 == 1)
gBattleTypeFlags |= BATTLE_TYPE_DOUBLE;
gTrainerBattleOpponent_A = 0;
sub_815E9FC();
@@ -1192,7 +1135,7 @@ void sub_815E160(void)
void sub_815E1C0(void)
{
if (!gSpecialVar_0x8005)
- gSpecialVar_Result = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_002;
+ gSpecialVar_Result = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_002;
}
void sub_815E1F0(void)
@@ -1203,7 +1146,7 @@ void sub_815E1F0(void)
void sub_815E218(void)
{
u16 mapDataId = gMapHeader.mapDataId;
- if (mapDataId - 0x12A == gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk8 && mapDataId - 0x129 <= gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_001)
+ if (mapDataId - 0x12A == gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk8 && mapDataId - 0x129 <= gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_001)
gSpecialVar_Result = FALSE;
else
gSpecialVar_Result = TRUE;
@@ -1239,7 +1182,7 @@ void sub_815E394(void)
void sub_815E408(void)
{
- u16 itemId = gUnknown_847A2B4[gUnknown_203F458->unk_0004.unk_0008->unk_003];
+ u16 itemId = gUnknown_847A2B4[gUnknown_203F458->unk_0004.trainers->unk_003];
if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_0)
gSpecialVar_Result = 2;
else if (AddBagItem(itemId, 1) == 1)
@@ -1356,7 +1299,7 @@ void sub_815E720(void)
void sub_815E88C(void)
{
u8 windowId = VarGet(VAR_0x4001);
- sub_810F4D8(windowId, TRUE);
+ ClearStdWindowAndFrameToTransparent(windowId, TRUE);
RemoveWindow(windowId);
}
@@ -1367,9 +1310,9 @@ void sub_815E8B4(void)
void sub_815E8CC(void)
{
- if (gUnknown_203F458->unk_0004.unk_0000.unk0 != gUnknown_203F458->unk_0004.unk_0008[0].unk_001)
+ if (gUnknown_203F458->unk_0004.count != gUnknown_203F458->unk_0004.trainers[0].unk_001)
{
- ConvertIntToDecimalStringN(gStringVar1, gUnknown_203F458->unk_0004.unk_0000.unk0, STR_CONV_MODE_LEFT_ALIGN, 1);
+ ConvertIntToDecimalStringN(gStringVar1, gUnknown_203F458->unk_0004.count, STR_CONV_MODE_LEFT_ALIGN, 1);
gSpecialVar_Result = TRUE;
}
else
@@ -1394,7 +1337,7 @@ void sub_815E948(void)
{
s32 i;
u16 var_4001 = VarGet(VAR_0x4001);
- u8 r1 = gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[var_4001].unk_00B;
+ u8 r1 = gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[var_4001].unk_00B;
for (i = 0; i < NELEMS(gUnknown_847A074); i++)
{
@@ -1427,29 +1370,29 @@ void sub_815E9FC(void)
ZeroEnemyPartyMons();
- switch (gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_002)
+ switch (gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_002)
{
case 0:
default:
for (r6 = 0; r6 < 2; r6++)
{
r2 = gUnknown_847A2EE[r5][r6];
- gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2].level = r9;
- sub_803E0A4(&gEnemyParty[r6], &gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2]);
+ gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2].level = r9;
+ CreateBattleTowerMon(&gEnemyParty[r6], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2]);
}
break;
case 1:
r2 = gUnknown_847A2FE[r5][0];
- gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[0].unk_040[r2].level = r9;
- sub_803E0A4(&gEnemyParty[0], &gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[0].unk_040[r2]);
+ gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[0].unk_040[r2].level = r9;
+ CreateBattleTowerMon(&gEnemyParty[0], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[0].unk_040[r2]);
r2 = gUnknown_847A2FE[r5][1];
- gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[1].unk_040[r2].level = r9;
- sub_803E0A4(&gEnemyParty[1], &gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[1].unk_040[r2]);
+ gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[1].unk_040[r2].level = r9;
+ CreateBattleTowerMon(&gEnemyParty[1], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[1].unk_040[r2]);
break;
case 2:
r2 = gUnknown_847A30E[r5][r4];
- gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2].level = r9;
- sub_803E0A4(&gEnemyParty[0], &gUnknown_203F458->unk_0004.unk_0008[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2]);
+ gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2].level = r9;
+ CreateBattleTowerMon(&gEnemyParty[0], &gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_004[r4].unk_040[r2]);
break;
}
}
@@ -1474,15 +1417,15 @@ static s32 GetPartyMaxLevel(void)
void sub_815EC0C(void)
{
- if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk9 != gUnknown_203F458->unk_0004.unk_0000.unk1)
+ if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk9 != gUnknown_203F458->unk_0004.id)
{
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk9 = gUnknown_203F458->unk_0004.unk_0000.unk1;
+ gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk9 = gUnknown_203F458->unk_0004.id;
sub_815EDF4(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk4, 215999);
gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_0 = FALSE;
}
}
-void sub_815EC8C(void)
+void PrintTrainerTowerRecords(void)
{
s32 i;
u8 windowId = 0;
@@ -1490,14 +1433,14 @@ void sub_815EC8C(void)
sub_815DC8C();
FillWindowPixelRect(0, 0, 0, 0, 0xd8, 0x90);
sub_815EC0C();
- box_print(0, 2, 0x4a, 0, &gUnknown_847A22C, 0, gUnknown_83FE982);
+ AddTextPrinterParameterized3(0, 2, 0x4a, 0, &gUnknown_847A22C, 0, gUnknown_83FE982);
for (i = 0; i < 4; i++)
{
PRINT_TOWER_TIME(sub_815EDDC(&gSaveBlock1Ptr->unkArray[i].unk4));
StringExpandPlaceholders(gStringVar4, gUnknown_83FE998);
- box_print(windowId, 2, 0x18, 0x24 + 0x14 * i, &gUnknown_847A22C, 0, gUnknown_83FE9C4[i]);
- box_print(windowId, 2, 0x60, 0x24 + 0x14 * i, &gUnknown_847A22C, 0, gStringVar4);
+ AddTextPrinterParameterized3(windowId, 2, 0x18, 0x24 + 0x14 * i, &gUnknown_847A22C, 0, gUnknown_83FE9C4[i]);
+ AddTextPrinterParameterized3(windowId, 2, 0x60, 0x24 + 0x14 * i, &gUnknown_847A22C, 0, gStringVar4);
}
PutWindowTilemap(windowId);
diff --git a/src/unk_8159F40.c b/src/unk_8159F40.c
index a6f6e67fc..ab27cea63 100644
--- a/src/unk_8159F40.c
+++ b/src/unk_8159F40.c
@@ -28,7 +28,7 @@ void sub_8159F40(void)
s32 opIdx = 0;
const struct UnkStruct_84792D0 * data;
- gBattleTypeFlags = BATTLE_TYPE_DOME;
+ gBattleTypeFlags = BATTLE_TYPE_POKEDUDE;
ZeroPlayerPartyMons();
ZeroEnemyPartyMons();
data = gUnknown_84792D0[gSpecialVar_0x8004];
@@ -612,7 +612,7 @@ void sub_815A540(void)
s16 x, y;
PlayerGetDestCoords(&x, &y);
- if (!MetatileBehavior_IsSurfable(MapGridGetMetatileBehaviorAt(x, y)) && TestPlayerAvatarFlags(0x08))
+ if (!MetatileBehavior_IsSurfable(MapGridGetMetatileBehaviorAt(x, y)) && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
{
struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
SetPlayerAvatarTransitionFlags(0x01);
diff --git a/src/unk_815C980.c b/src/unk_815C980.c
index 9d0dd3341..09b92c834 100644
--- a/src/unk_815C980.c
+++ b/src/unk_815C980.c
@@ -41,6 +41,7 @@ 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};
@@ -127,7 +128,7 @@ bool32 sub_815CA40(u32 id, s32 arg1, const struct UnkStruct3 *arg2)
compObjectPic = *(struct CompressedSpriteSheet*)(arg2->spriteSheet);
compObjectPic.size = GetDecompressedDataSize(arg2->spriteSheet->data);
- gUnknown_203F454->array[id].tileStart = LoadCompressedObjectPic(&compObjectPic);
+ gUnknown_203F454->array[id].tileStart = LoadCompressedSpriteSheet(&compObjectPic);
}
if (gUnknown_203F454->array[id].tileStart == 0xFFFF)
@@ -430,7 +431,7 @@ static bool32 SharesPalWithAnyActive(u32 id)
return FALSE;
}
-u8 sub_815D324(u32 shape, u32 size)
+static u8 sub_815D324(u32 shape, u32 size)
{
return gUnknown_8479658[shape][size];
}
diff --git a/src/unk_815F138.c b/src/unk_815F138.c
new file mode 100644
index 000000000..96005a07b
--- /dev/null
+++ b/src/unk_815F138.c
@@ -0,0 +1,322 @@
+#include "global.h"
+#include "decompress.h"
+#include "sound.h"
+#include "task.h"
+#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);
+
+void sub_815F138(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;
+}
+
+bool8 sub_815F198(void)
+{
+ return FuncIsActiveTask(sub_815F1AC);
+}
+
+void sub_815F1AC(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ 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]++;
+ break;
+ case 1:
+ if (!sub_815F2AC(data[7]))
+ {
+ sub_815F3E0(data[7], data[8], data[9]);
+ FreeSpriteOamMatrix(&gSprites[data[7]]);
+ DestroySprite(&gSprites[data[7]]);
+ data[0]++;
+ }
+ break;
+ case 2:
+ if (!sub_815F444(data[8]))
+ {
+ DestroySprite(&gSprites[data[8]]);
+ DestroySprite(&gSprites[data[9]]);
+ FreeSpriteTilesByTag(data[2]);
+ FreeSpritePaletteByTag(data[3]);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+bool32 sub_815F2AC(u8 spriteId)
+{
+ struct Sprite * sprite = &gSprites[spriteId];
+
+ switch (sprite->data[0])
+ {
+ case 0:
+ sub_8007FFC(sprite, 0x800, 0x1A);
+ sprite->data[0]++;
+ // fallthrough
+ case 1:
+ if (sprite->data[2] == 0)
+ PlaySE(SE_TRACK_STOP);
+ if (++sprite->data[2] >= 20)
+ {
+ sprite->data[2] = 0;
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ if (sprite->affineAnimEnded)
+ sprite->data[0]++;
+ break;
+ case 3:
+ if (++sprite->data[2] >= 4)
+ {
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ StartSpriteAffineAnim(sprite, 2);
+ }
+ break;
+ case 4:
+ sprite->pos1.y -= 4;
+ if (++sprite->data[2] >= 8)
+ {
+ if (sprite->data[4] < 2)
+ {
+ StartSpriteAnim(sprite, sprite->data[4] + 1);
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+ else
+ {
+ sprite->data[0] = 7;
+ return FALSE;
+ }
+ }
+ break;
+ case 5:
+ sprite->pos1.y += 4;
+ if (++sprite->data[2] >= 8)
+ {
+ sprite->data[2] = 0;
+ StartSpriteAffineAnim(sprite, 3);
+ sprite->data[0]++;
+ }
+ break;
+ case 6:
+ if (sprite->affineAnimEnded)
+ {
+ sprite->data[4]++;
+ sprite->data[0] = 1;
+ }
+ break;
+ case 7:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void sub_815F3E0(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;
+}
+
+bool32 sub_815F444(u8 spriteId)
+{
+ return gSprites[spriteId].callback == sub_815F470;
+}
+
+void sub_815F470(struct Sprite * sprite)
+{
+ s16 * data = sprite->data;
+ s32 y;
+
+ switch (sprite->data[0])
+ {
+ case 0:
+ data[4] = 64;
+ data[5] = sprite->pos2.y << 4;
+ data[0]++;
+ //fallthrough
+ case 1:
+ data[5] += data[4];
+ data[4]++;
+ sprite->pos2.y = data[5] >> 4;
+ if (sprite->pos2.y >= 0)
+ {
+ PlaySE(SE_TRACK_STOP);
+ sprite->pos2.y = 0;
+ data[0]++;
+ }
+ break;
+ case 2:
+ data[1] += 12;
+ if (data[1] >= 128)
+ {
+ PlaySE(SE_TRACK_STOP);
+ data[1] = 0;
+ data[0]++;
+ }
+ y = gSineTable[data[1]];
+ sprite->pos2.y = -(y >> 4);
+ break;
+ case 3:
+ data[1] += 16;
+ if (data[1] >= 128)
+ {
+ PlaySE(SE_TRACK_STOP);
+ data[1] = 0;
+ data[0]++;
+ }
+ sprite->pos2.y = -(gSineTable[data[1]] >> 5);
+ break;
+ case 4:
+ if (++data[1] > 40)
+ sprite->callback = SpriteCallbackDummy;
+ break;
+ }
+}
+
+const u16 gUnknown_847A328[] = INCBIN_U16("data/graphics/unk_847a348.gbapal");
+const u16 gUnknown_847A348[] = INCBIN_U16("data/graphics/unk_847a348.4bpp.lz");
+
+void sub_815F564(u16 tilesTag, u16 palTag)
+{
+ struct CompressedSpriteSheet spriteSheet = {(const void *)gUnknown_847A348, 0xE00};
+ struct SpritePalette spritePalette = {gUnknown_847A328};
+ spriteSheet.tag = tilesTag;
+ spritePalette.tag = palTag;
+ LoadCompressedSpriteSheet(&spriteSheet);
+ LoadSpritePalette(&spritePalette);
+}
+
+const struct OamData gOamData_847A7AC = {
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .shape = ST_OAM_SQUARE,
+ .size = 2
+};
+
+const struct OamData gOamData_847A7B4 = {
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .shape = ST_OAM_H_RECTANGLE,
+ .size = 3
+};
+
+const union AnimCmd gUnknown_847A7BC[] = {
+ ANIMCMD_FRAME( 0, 1),
+ ANIMCMD_END
+};
+
+const union AnimCmd gUnknown_847A7C4[] = {
+ ANIMCMD_FRAME(16, 1),
+ ANIMCMD_END
+};
+
+const union AnimCmd gUnknown_847A7CC[] = {
+ ANIMCMD_FRAME(32, 1),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gUnknown_847A7D4[] = {
+ gUnknown_847A7BC,
+ gUnknown_847A7C4,
+ gUnknown_847A7CC
+};
+
+const union AnimCmd gUnknown_847A7E0[] = {
+ ANIMCMD_FRAME(48, 1),
+ ANIMCMD_END
+};
+
+const union AnimCmd gUnknown_847A7E8[] = {
+ ANIMCMD_FRAME(80, 1),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gUnknown_847A7F0[] = {
+ gUnknown_847A7E0,
+ gUnknown_847A7E8
+};
+
+const union AffineAnimCmd gUnknown_847A7F8[] = {
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd gUnknown_847A808[] = {
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME( 0x10, -0x10, 0, 8),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd gUnknown_847A820[] = {
+ AFFINEANIMCMD_FRAME(-0x12, 0x12, 0, 8),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd gUnknown_847A830[] = {
+ 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
+};
+
+u8 sub_815F5BC(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
+{
+ struct SpriteTemplate spriteTemplate = {
+ .oam = &gOamData_847A7AC,
+ .anims = gUnknown_847A7D4,
+ .affineAnims = gUnknown_847A850,
+ .callback = SpriteCallbackDummy
+ };
+ spriteTemplate.tileTag = tilesTag;
+ spriteTemplate.paletteTag = palTag;
+ 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)
+{
+ struct SpriteTemplate spriteTemplate = {
+ .oam = &gOamData_847A7B4,
+ .anims = gUnknown_847A7F0,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+ };
+ spriteTemplate.tileTag = tilesTag;
+ spriteTemplate.paletteTag = palTag;
+ *spriteId2_p = CreateSprite(&spriteTemplate, x - 32, y, subpriority);
+ *spriteId3_p = CreateSprite(&spriteTemplate, x + 32, y, subpriority);
+ gSprites[*spriteId2_p].invisible = TRUE;
+ gSprites[*spriteId3_p].invisible = TRUE;
+ StartSpriteAnim(&gSprites[*spriteId3_p], 1);
+}
diff --git a/src/vs_seeker.c b/src/vs_seeker.c
index 6c6daf803..f7b29292a 100644
--- a/src/vs_seeker.c
+++ b/src/vs_seeker.c
@@ -814,7 +814,7 @@ void Task_VsSeeker_0(u8 taskId)
}
else if (respval == 2)
{
- sub_80A2294(4, 0, gSpecialVar_ItemId, 0xffff);
+ ItemUse_SetQuestLogEvent(4, 0, gSpecialVar_ItemId, 0xffff);
FieldEffectStart(FLDEFF_UNK_41); // TODO: name this enum
gTasks[taskId].func = Task_VsSeeker_1;
gTasks[taskId].data[0] = 15;
diff --git a/src/window.c b/src/window.c
index 9d38ba2c3..5ccd05f35 100644
--- a/src/window.c
+++ b/src/window.c
@@ -378,698 +378,76 @@ void FillWindowPixelBuffer(u8 windowId, u8 fillValue)
CpuFastFill8(fillValue, gWindows[windowId].tileData, 0x20 * fillSize);
}
-// functionally equivalent, its fucking hard to match
-#ifdef NONMATCHING
+#define MOVE_TILES_DOWN(a) \
+{ \
+ destOffset = i + (a); \
+ srcOffset = i + (((width * (distanceLoop & ~7)) | (distanceLoop & 7)) * 4); \
+ if (srcOffset < size) \
+ *(u32*)(tileData + destOffset) = *(u32*)(tileData + srcOffset); \
+ else \
+ *(u32*)(tileData + destOffset) = fillValue32; \
+ distanceLoop++; \
+}
+
+#define MOVE_TILES_UP(a) \
+{ \
+ destOffset = i + (a); \
+ srcOffset = i + (((width * (distanceLoop & ~7)) | (distanceLoop & 7)) * 4); \
+ if (srcOffset < size) \
+ *(u32*)(tileData - destOffset) = *(u32*)(tileData - srcOffset); \
+ else \
+ *(u32*)(tileData - destOffset) = fillValue32; \
+ distanceLoop++; \
+}
+
void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue)
{
- s32 i, id1, id2, size;
- u32 distanceLoop, toFill, width;
- u8 *tileData;
- struct WindowTemplate window;
-
- tileData = gWindows[windowId].tileData;
- toFill = (fillValue << 0x18) | (fillValue << 0x10) | (fillValue << 8) | fillValue;
- window = gWindows[windowId].window;
- size = 0x20 * (window.height * window.width);
- width = window.width;
- if (direction != 1)
+ struct WindowTemplate window = gWindows[windowId].window;
+ u8 *tileData = gWindows[windowId].tileData;
+ u32 fillValue32 = (fillValue << 24) | (fillValue << 16) | (fillValue << 8) | fillValue;
+ s32 size = window.height * window.width * 32;
+ u32 width = window.width;
+ s32 i;
+ s32 srcOffset, destOffset;
+ u32 distanceLoop;
+
+ switch (direction)
{
- s32 signedDirection = direction;
- if (signedDirection <= 1)
+ case 0:
+ for (i = 0; i < size; i += 32)
{
- if (signedDirection == 0)
- {
- for (i = 0; i < size; i += 0x20)
- {
- distanceLoop = distance;
- id1 = i + 0;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData + id1) = *(u32*)(tileData + id2);
- else
- *(u32*)(tileData + id1) = toFill;
-
- distanceLoop++;
- id1 = i + 4;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData + id1) = *(u32*)(tileData + id2);
- else
- *(u32*)(tileData + id1) = toFill;
-
- distanceLoop++;
- id1 = i + 8;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData + id1) = *(u32*)(tileData + id2);
- else
- *(u32*)(tileData + id1) = toFill;
-
- distanceLoop++;
- id1 = i + 12;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData + id1) = *(u32*)(tileData + id2);
- else
- *(u32*)(tileData + id1) = toFill;
-
- distanceLoop++;
- id1 = i + 16;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData + id1) = *(u32*)(tileData + id2);
- else
- *(u32*)(tileData + id1) = toFill;
-
- distanceLoop++;
- id1 = i + 20;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData + id1) = *(u32*)(tileData + id2);
- else
- *(u32*)(tileData + id1) = toFill;
-
- distanceLoop++;
- id1 = i + 24;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData + id1) = *(u32*)(tileData + id2);
- else
- *(u32*)(tileData + id1) = toFill;
-
- distanceLoop++;
- id1 = i + 28;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData + id1) = *(u32*)(tileData + id2);
- else
- *(u32*)(tileData + id1) = toFill;
- }
- }
+ distanceLoop = distance;
+ MOVE_TILES_DOWN(0)
+ MOVE_TILES_DOWN(4)
+ MOVE_TILES_DOWN(8)
+ MOVE_TILES_DOWN(12)
+ MOVE_TILES_DOWN(16)
+ MOVE_TILES_DOWN(20)
+ MOVE_TILES_DOWN(24)
+ MOVE_TILES_DOWN(28)
}
- }
- else
- {
+ break;
+ case 1:
tileData += size - 4;
- for (i = 0; i < size; i += 0x20)
+ for (i = 0; i < size; i += 32)
{
distanceLoop = distance;
- id1 = i + 0;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData - id1) = *(u32*)(tileData - id2);
- else
- *(u32*)(tileData - id1) = toFill;
-
- distanceLoop++;
- id1 = i + 4;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData - id1) = *(u32*)(tileData - id2);
- else
- *(u32*)(tileData - id1) = toFill;
-
- distanceLoop++;
- id1 = i + 8;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData - id1) = *(u32*)(tileData - id2);
- else
- *(u32*)(tileData - id1) = toFill;
-
- distanceLoop++;
- id1 = i + 12;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData - id1) = *(u32*)(tileData - id2);
- else
- *(u32*)(tileData - id1) = toFill;
-
- distanceLoop++;
- id1 = i + 16;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData - id1) = *(u32*)(tileData - id2);
- else
- *(u32*)(tileData - id1) = toFill;
-
- distanceLoop++;
- id1 = i + 20;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData - id1) = *(u32*)(tileData - id2);
- else
- *(u32*)(tileData - id1) = toFill;
-
- distanceLoop++;
- id1 = i + 24;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData - id1) = *(u32*)(tileData - id2);
- else
- *(u32*)(tileData - id1) = toFill;
-
- distanceLoop++;
- id1 = i + 28;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData - id1) = *(u32*)(tileData - id2);
- else
- *(u32*)(tileData - id1) = toFill;
+ MOVE_TILES_UP(0)
+ MOVE_TILES_UP(4)
+ MOVE_TILES_UP(8)
+ MOVE_TILES_UP(12)
+ MOVE_TILES_UP(16)
+ MOVE_TILES_UP(20)
+ MOVE_TILES_UP(24)
+ MOVE_TILES_UP(28)
}
+ break;
+ case 2:
+ break;
}
}
-#else
-__attribute__((naked))
-void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- sub sp, 0x8\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- lsls r1, 24\n\
- lsrs r1, 24\n\
- mov r8, r1\n\
- lsls r2, 24\n\
- lsrs r2, 24\n\
- str r2, [sp]\n\
- lsls r3, 24\n\
- lsrs r3, 24\n\
- ldr r2, =gWindows\n\
- lsls r1, r0, 1\n\
- adds r1, r0\n\
- lsls r1, 2\n\
- adds r4, r1, r2\n\
- adds r2, 0x8\n\
- adds r1, r2\n\
- ldr r5, [r1]\n\
- lsls r7, r3, 24\n\
- lsls r0, r3, 16\n\
- orrs r7, r0\n\
- lsls r0, r3, 8\n\
- orrs r7, r0\n\
- orrs r7, r3\n\
- ldr r1, [r4]\n\
- ldr r2, [r4, 0x4]\n\
- ldrb r3, [r4, 0x4]\n\
- lsrs r0, r1, 24\n\
- muls r0, r3\n\
- lsls r6, r0, 5\n\
- lsrs r1, 24\n\
- mov r12, r1\n\
- mov r0, r8\n\
- cmp r0, 0x1\n\
- bne _08003CE8\n\
- b _08003E9E\n\
-_08003CE8:\n\
- cmp r0, 0x1\n\
- ble _08003CEE\n\
- b _08004046\n\
-_08003CEE:\n\
- cmp r0, 0\n\
- beq _08003CF4\n\
- b _08004046\n\
-_08003CF4:\n\
- movs r4, 0\n\
- cmp r4, r6\n\
- blt _08003CFC\n\
- b _08004046\n\
-_08003CFC:\n\
- movs r1, 0x8\n\
- negs r1, r1\n\
- mov r9, r1\n\
- movs r2, 0x7\n\
- mov r8, r2\n\
- mov r10, r5\n\
-_08003D08:\n\
- ldr r3, [sp]\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- adds r0, r3, 0\n\
- mov r2, r8\n\
- ands r0, r2\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003D34\n\
- adds r0, r5, r1\n\
- ldr r0, [r0]\n\
- mov r1, r10\n\
- str r0, [r1]\n\
- b _08003D38\n\
- .pool\n\
-_08003D34:\n\
- mov r2, r10\n\
- str r7, [r2]\n\
-_08003D38:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0x4\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003D64\n\
- adds r0, r5, r2\n\
- adds r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003D68\n\
-_08003D64:\n\
- adds r0, r5, r2\n\
- str r7, [r0]\n\
-_08003D68:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x8\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003D96\n\
- adds r0, r5, r2\n\
- adds r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003D9A\n\
-_08003D96:\n\
- adds r0, r5, r2\n\
- str r7, [r0]\n\
-_08003D9A:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0xC\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003DC8\n\
- adds r0, r5, r2\n\
- adds r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003DCC\n\
-_08003DC8:\n\
- adds r0, r5, r2\n\
- str r7, [r0]\n\
-_08003DCC:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x10\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003DFA\n\
- adds r0, r5, r2\n\
- adds r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003DFE\n\
-_08003DFA:\n\
- adds r0, r5, r2\n\
- str r7, [r0]\n\
-_08003DFE:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x14\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003E2C\n\
- adds r0, r5, r2\n\
- adds r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003E30\n\
-_08003E2C:\n\
- adds r0, r5, r2\n\
- str r7, [r0]\n\
-_08003E30:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x18\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003E5E\n\
- adds r0, r5, r2\n\
- adds r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003E62\n\
-_08003E5E:\n\
- adds r0, r5, r2\n\
- str r7, [r0]\n\
-_08003E62:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x1C\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- adds r0, r1, 0\n\
- mov r1, r8\n\
- ands r3, r1\n\
- orrs r0, r3\n\
- lsls r0, 2\n\
- adds r1, r4, r0\n\
- cmp r1, r6\n\
- bge _08003E8C\n\
- adds r0, r5, r2\n\
- adds r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003E90\n\
-_08003E8C:\n\
- adds r0, r5, r2\n\
- str r7, [r0]\n\
-_08003E90:\n\
- movs r2, 0x20\n\
- add r10, r2\n\
- adds r4, 0x20\n\
- cmp r4, r6\n\
- bge _08003E9C\n\
- b _08003D08\n\
-_08003E9C:\n\
- b _08004046\n\
-_08003E9E:\n\
- subs r0, r6, 0x4\n\
- adds r5, r0\n\
- movs r4, 0\n\
- cmp r4, r6\n\
- blt _08003EAA\n\
- b _08004046\n\
-_08003EAA:\n\
- movs r0, 0x8\n\
- negs r0, r0\n\
- mov r9, r0\n\
- movs r1, 0x7\n\
- mov r8, r1\n\
- mov r10, r5\n\
-_08003EB6:\n\
- ldr r3, [sp]\n\
- adds r0, r3, 0\n\
- mov r2, r9\n\
- ands r0, r2\n\
- mov r1, r12\n\
- muls r1, r0\n\
- adds r0, r3, 0\n\
- mov r2, r8\n\
- ands r0, r2\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003EDC\n\
- subs r0, r5, r1\n\
- ldr r0, [r0]\n\
- mov r1, r10\n\
- str r0, [r1]\n\
- b _08003EE0\n\
-_08003EDC:\n\
- mov r2, r10\n\
- str r7, [r2]\n\
-_08003EE0:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0x4\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003F0C\n\
- subs r0, r5, r2\n\
- subs r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003F10\n\
-_08003F0C:\n\
- subs r0, r5, r2\n\
- str r7, [r0]\n\
-_08003F10:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x8\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003F3E\n\
- subs r0, r5, r2\n\
- subs r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003F42\n\
-_08003F3E:\n\
- subs r0, r5, r2\n\
- str r7, [r0]\n\
-_08003F42:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0xC\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003F70\n\
- subs r0, r5, r2\n\
- subs r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003F74\n\
-_08003F70:\n\
- subs r0, r5, r2\n\
- str r7, [r0]\n\
-_08003F74:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x10\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003FA2\n\
- subs r0, r5, r2\n\
- subs r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003FA6\n\
-_08003FA2:\n\
- subs r0, r5, r2\n\
- str r7, [r0]\n\
-_08003FA6:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x14\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003FD4\n\
- subs r0, r5, r2\n\
- subs r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003FD8\n\
-_08003FD4:\n\
- subs r0, r5, r2\n\
- str r7, [r0]\n\
-_08003FD8:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x18\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08004006\n\
- subs r0, r5, r2\n\
- subs r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _0800400A\n\
-_08004006:\n\
- subs r0, r5, r2\n\
- str r7, [r0]\n\
-_0800400A:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x1C\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- adds r0, r1, 0\n\
- mov r1, r8\n\
- ands r3, r1\n\
- orrs r0, r3\n\
- lsls r0, 2\n\
- adds r1, r4, r0\n\
- cmp r1, r6\n\
- bge _08004034\n\
- subs r0, r5, r2\n\
- subs r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08004038\n\
-_08004034:\n\
- subs r0, r5, r2\n\
- str r7, [r0]\n\
-_08004038:\n\
- movs r2, 0x20\n\
- negs r2, r2\n\
- add r10, r2\n\
- adds r4, 0x20\n\
- cmp r4, r6\n\
- bge _08004046\n\
- b _08003EB6\n\
-_08004046:\n\
- add sp, 0x8\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .syntax divided");
-}
-#endif // NONMATCHING
-void CallWindowFunction(u8 windowId, void ( *func)(u8, u8, u8, u8, u8, u8))
+void CallWindowFunction(u8 windowId, WindowFunc func)
{
struct WindowTemplate window = gWindows[windowId].window;
func(window.bg, window.tilemapLeft, window.tilemapTop, window.width, window.height, window.paletteNum);
diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c
index baf44cafc..cc80d37b6 100644
--- a/src/wireless_communication_status_screen.c
+++ b/src/wireless_communication_status_screen.c
@@ -10,7 +10,7 @@
#include "scanline_effect.h"
#include "m4a.h"
#include "string_util.h"
-#include "unk_text_util.h"
+#include "dynamic_placeholder_text_util.h"
#include "overworld.h"
#include "sound.h"
#include "menu.h"
@@ -208,7 +208,7 @@ void sub_814F1E4(void)
ChangeBgY(1, 0, 0);
LoadPalette(gUnknown_846F4D0, 0, 0x20);
Menu_LoadStdPalAt(0xf0);
- UnkTextUtil_Reset();
+ DynamicPlaceholderTextUtil_Reset();
FillBgTilemapBufferRect(0, 0x000, 0, 0, 32, 32, 0xF);
CopyBgTilemapBufferToVram(1);
SetMainCallback2(sub_814F19C);
@@ -229,7 +229,7 @@ void sub_814F32C(void)
Free(GetBgTilemapBuffer(i));
}
Free(gUnknown_3002040);
- SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
void sub_814F364(s16 * unk0, s16 * unk1)
@@ -359,7 +359,7 @@ void sub_814F65C(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 palIdx)
break;
// default: UB
}
- AddTextPrinterParametrized2(windowId, fontId,x, y, fontId == 0 ? 0 : 1, 0, &textColor, -1, str);
+ AddTextPrinterParameterized4(windowId, fontId,x, y, fontId == 0 ? 0 : 1, 0, &textColor, -1, str);
}
u32 sub_814F714(struct UnkStruct_x20 * unk20, u32 * arg1)