summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/MPlayDef.s430
-rw-r--r--include/battle.h189
-rw-r--r--include/battle_ai.h9
-rw-r--r--include/battle_anim.h4
-rw-r--r--include/battle_anim_80CA710.h2
-rw-r--r--include/battle_message.h137
-rw-r--r--include/battle_script_commands.h65
-rw-r--r--include/battle_string_ids.h387
-rw-r--r--include/battle_util.h29
-rw-r--r--include/cable_car_util.h13
-rw-r--r--include/cable_club.h3
-rw-r--r--include/clock.h1
-rw-r--r--include/config.h22
-rw-r--r--include/constants/battle_constants.h74
-rw-r--r--include/constants/decorations.h2
-rw-r--r--include/constants/easy_chat.h4
-rw-r--r--include/constants/items.h133
-rw-r--r--include/constants/songs.h708
-rw-r--r--include/constants/weather.h4
-rw-r--r--include/contest.h196
-rw-r--r--include/contest_ai.h16
-rw-r--r--include/credits.h11
-rw-r--r--include/data2.h7
-rw-r--r--include/debug.h10
-rw-r--r--include/decoration.h7
-rw-r--r--include/dewford_trend.h1
-rw-r--r--include/easy_chat.h120
-rw-r--r--[-rwxr-xr-x]include/ewram.h43
-rw-r--r--include/field_control_avatar.h1
-rw-r--r--include/field_effect.h2
-rw-r--r--include/field_fadetransition.h1
-rw-r--r--include/field_map_obj.h2
-rw-r--r--include/field_weather.h103
-rw-r--r--include/fldeff_poison.h4
-rw-r--r--include/gba/gba.h1
-rw-r--r--include/gba/isagbprint.h50
-rw-r--r--include/gba/macro.h89
-rw-r--r--include/global.fieldmap.h3
-rw-r--r--include/global.h23
-rw-r--r--include/graphics.h699
-rw-r--r--include/hof_pc.h12
-rw-r--r--include/item_menu.h2
-rw-r--r--include/link.h6
-rw-r--r--include/m4a.h1
-rw-r--r--include/macros.inc149
-rw-r--r--include/macros/asm.inc17
-rw-r--r--include/macros/battle_ai_script.inc554
-rw-r--r--include/macros/battle_anim.inc266
-rw-r--r--include/macros/battle_script.inc1414
-rw-r--r--include/macros/contest_ai_script.inc506
-rw-r--r--include/macros/ec.inc8
-rw-r--r--include/macros/event.inc1481
-rw-r--r--include/macros/field_effect_script.inc42
-rw-r--r--include/macros/function.inc29
-rw-r--r--include/macros/m4a.inc13
-rw-r--r--include/macros/map.inc96
-rw-r--r--include/macros/movement.inc116
-rw-r--r--include/macros/music_voice.inc125
-rw-r--r--include/macros/pokemon_data.inc57
-rw-r--r--include/main.h2
-rw-r--r--include/matsuda_debug_menu.h1
-rw-r--r--include/menu.h63
-rw-r--r--include/menu_cursor.h8
-rw-r--r--include/menu_helpers.h27
-rw-r--r--include/mon_markings.h31
-rw-r--r--include/money.h2
-rw-r--r--include/mystery_event_menu.h1
-rw-r--r--include/overworld.h2
-rw-r--r--include/pc_screen_effect.h21
-rw-r--r--include/pokeblock.h14
-rw-r--r--include/pokedex.h2
-rw-r--r--include/pokemon.h34
-rw-r--r--include/pokemon_icon.h4
-rw-r--r--include/pokemon_item_effect.h2
-rw-r--r--include/pokemon_storage_system.h298
-rw-r--r--include/region_map.h1
-rw-r--r--[-rwxr-xr-x]include/region_map_sections.h0
-rw-r--r--include/reset_rtc_screen.h1
-rw-r--r--include/roamer.h2
-rw-r--r--include/rom_8077ABC.h12
-rw-r--r--include/roulette.h38
-rw-r--r--include/roulette_util.h14
-rw-r--r--include/save.h83
-rw-r--r--include/scanline_effect.h48
-rw-r--r--include/shop.h27
-rw-r--r--include/slot_machine.h76
-rw-r--r--include/sprite.h11
-rw-r--r--include/strings.h2
-rw-r--r--include/text.h184
-rw-r--r--include/text_window.h22
-rw-r--r--include/trade.h1
-rw-r--r--include/trainer.h270
-rw-r--r--include/trainer_card.h8
-rw-r--r--include/tv.h1
-rw-r--r--include/unknown_task.h42
95 files changed, 8854 insertions, 1000 deletions
diff --git a/include/MPlayDef.s b/include/MPlayDef.s
new file mode 100644
index 000000000..f5dd6484d
--- /dev/null
+++ b/include/MPlayDef.s
@@ -0,0 +1,430 @@
+ .equ W00, 0x80 @ WAIT
+ .equ W01, W00+1 @
+ .equ W02, W00+2 @
+ .equ W03, W00+3 @
+ .equ W04, W00+4 @
+ .equ W05, W00+5 @
+ .equ W06, W00+6 @
+ .equ W07, W00+7 @
+ .equ W08, W00+8 @
+ .equ W09, W00+9 @
+ .equ W10, W00+10 @
+ .equ W11, W00+11 @
+ .equ W12, W00+12 @
+ .equ W13, W00+13 @
+ .equ W14, W00+14 @
+ .equ W15, W00+15 @
+ .equ W16, W00+16 @
+ .equ W17, W00+17 @
+ .equ W18, W00+18 @
+ .equ W19, W00+19 @
+ .equ W20, W00+20 @
+ .equ W21, W00+21 @
+ .equ W22, W00+22 @
+ .equ W23, W00+23 @
+ .equ W24, W00+24 @
+ .equ W28, W00+25 @
+ .equ W30, W00+26 @
+ .equ W32, W00+27 @
+ .equ W36, W00+28 @
+ .equ W40, W00+29 @
+ .equ W42, W00+30 @
+ .equ W44, W00+31 @
+ .equ W48, W00+32 @
+ .equ W52, W00+33 @
+ .equ W54, W00+34 @
+ .equ W56, W00+35 @
+ .equ W60, W00+36 @
+ .equ W64, W00+37 @
+ .equ W66, W00+38 @
+ .equ W68, W00+39 @
+ .equ W72, W00+40 @
+ .equ W76, W00+41 @
+ .equ W78, W00+42 @
+ .equ W80, W00+43 @
+ .equ W84, W00+44 @
+ .equ W88, W00+45 @
+ .equ W90, W00+46 @
+ .equ W92, W00+47 @
+ .equ W96, W00+48 @
+
+ .equ FINE, 0xb1 @ fine
+ .equ GOTO, 0xb2 @ goto
+ .equ PATT, 0xb3 @ pattern play
+ .equ PEND, 0xb4 @ pattern end
+ .equ REPT, 0xb5 @ repeat
+ .equ MEMACC, 0xb9 @ memacc op adr dat ***lib
+ .equ PRIO, 0xba @ priority
+ .equ TEMPO, 0xbb @ tempo (BPM/2)
+ .equ KEYSH, 0xbc @ key shift
+ .equ VOICE, 0xbd @ voice #
+ .equ VOL, 0xbe @ volume
+ .equ PAN, 0xbf @ panpot (c_v+??)
+ .equ BEND, 0xc0 @ pitch bend (c_v+??)
+ .equ BENDR, 0xc1 @ bend range
+ .equ LFOS, 0xc2 @ LFO speed
+ .equ LFODL, 0xc3 @ LFO delay
+ .equ MOD, 0xc4 @ modulation depth
+ .equ MODT, 0xc5 @ modulation type
+ .equ TUNE, 0xc8 @ micro tuning (c_v+??)
+
+ .equ XCMD, 0xcd @ extend command ***lib
+ .equ xIECV, 0x08 @ imi.echo vol ***lib
+ .equ xIECL, 0x09 @ imi.echo len ***lib
+
+ .equ EOT, 0xce @ End of Tie
+ .equ TIE, 0xcf @
+ .equ N01, TIE+1 @ NOTE
+ .equ N02, N01+1 @
+ .equ N03, N01+2 @
+ .equ N04, N01+3 @
+ .equ N05, N01+4 @
+ .equ N06, N01+5 @
+ .equ N07, N01+6 @
+ .equ N08, N01+7 @
+ .equ N09, N01+8 @
+ .equ N10, N01+9 @
+ .equ N11, N01+10 @
+ .equ N12, N01+11 @
+ .equ N13, N01+12 @
+ .equ N14, N01+13 @
+ .equ N15, N01+14 @
+ .equ N16, N01+15 @
+ .equ N17, N01+16 @
+ .equ N18, N01+17 @
+ .equ N19, N01+18 @
+ .equ N20, N01+19 @
+ .equ N21, N01+20 @
+ .equ N22, N01+21 @
+ .equ N23, N01+22 @
+ .equ N24, N01+23 @
+ .equ N28, N01+24 @
+ .equ N30, N01+25 @
+ .equ N32, N01+26 @
+ .equ N36, N01+27 @
+ .equ N40, N01+28 @
+ .equ N42, N01+29 @
+ .equ N44, N01+30 @
+ .equ N48, N01+31 @
+ .equ N52, N01+32 @
+ .equ N54, N01+33 @
+ .equ N56, N01+34 @
+ .equ N60, N01+35 @
+ .equ N64, N01+36 @
+ .equ N66, N01+37 @
+ .equ N68, N01+38 @
+ .equ N72, N01+39 @
+ .equ N76, N01+40 @
+ .equ N78, N01+41 @
+ .equ N80, N01+42 @
+ .equ N84, N01+43 @
+ .equ N88, N01+44 @
+ .equ N90, N01+45 @
+ .equ N92, N01+46 @
+ .equ N96, N01+47 @
+
+@ maximum value for volume
+
+ .equ mxv, 0x7F @
+
+@ center value of PAN, BEND, TUNE
+
+ .equ c_v, 0x40 @ -64 ~ +63
+
+@ note for N??, TIE, EOT
+
+ .equ CnM2, 0 @
+ .equ CsM2, 1 @
+ .equ DnM2, 2 @
+ .equ DsM2, 3 @
+ .equ EnM2, 4 @
+ .equ FnM2, 5 @
+ .equ FsM2, 6 @
+ .equ GnM2, 7 @
+ .equ GsM2, 8 @
+ .equ AnM2, 9 @
+ .equ AsM2, 10 @
+ .equ BnM2, 11 @
+ .equ CnM1, 12 @
+ .equ CsM1, 13 @
+ .equ DnM1, 14 @
+ .equ DsM1, 15 @
+ .equ EnM1, 16 @
+ .equ FnM1, 17 @
+ .equ FsM1, 18 @
+ .equ GnM1, 19 @
+ .equ GsM1, 20 @
+ .equ AnM1, 21 @
+ .equ AsM1, 22 @
+ .equ BnM1, 23 @
+ .equ Cn0, 24 @
+ .equ Cs0, 25 @
+ .equ Dn0, 26 @
+ .equ Ds0, 27 @
+ .equ En0, 28 @
+ .equ Fn0, 29 @
+ .equ Fs0, 30 @
+ .equ Gn0, 31 @
+ .equ Gs0, 32 @
+ .equ An0, 33 @
+ .equ As0, 34 @
+ .equ Bn0, 35 @
+ .equ Cn1, 36 @
+ .equ Cs1, 37 @
+ .equ Dn1, 38 @
+ .equ Ds1, 39 @
+ .equ En1, 40 @
+ .equ Fn1, 41 @
+ .equ Fs1, 42 @
+ .equ Gn1, 43 @
+ .equ Gs1, 44 @
+ .equ An1, 45 @
+ .equ As1, 46 @
+ .equ Bn1, 47 @
+ .equ Cn2, 48 @
+ .equ Cs2, 49 @
+ .equ Dn2, 50 @
+ .equ Ds2, 51 @
+ .equ En2, 52 @
+ .equ Fn2, 53 @
+ .equ Fs2, 54 @
+ .equ Gn2, 55 @
+ .equ Gs2, 56 @
+ .equ An2, 57 @
+ .equ As2, 58 @
+ .equ Bn2, 59 @
+ .equ Cn3, 60 @
+ .equ Cs3, 61 @
+ .equ Dn3, 62 @
+ .equ Ds3, 63 @
+ .equ En3, 64 @
+ .equ Fn3, 65 @
+ .equ Fs3, 66 @
+ .equ Gn3, 67 @
+ .equ Gs3, 68 @
+ .equ An3, 69 @ 440Hz
+ .equ As3, 70 @
+ .equ Bn3, 71 @
+ .equ Cn4, 72 @
+ .equ Cs4, 73 @
+ .equ Dn4, 74 @
+ .equ Ds4, 75 @
+ .equ En4, 76 @
+ .equ Fn4, 77 @
+ .equ Fs4, 78 @
+ .equ Gn4, 79 @
+ .equ Gs4, 80 @
+ .equ An4, 81 @
+ .equ As4, 82 @
+ .equ Bn4, 83 @
+ .equ Cn5, 84 @
+ .equ Cs5, 85 @
+ .equ Dn5, 86 @
+ .equ Ds5, 87 @
+ .equ En5, 88 @
+ .equ Fn5, 89 @
+ .equ Fs5, 90 @
+ .equ Gn5, 91 @
+ .equ Gs5, 92 @
+ .equ An5, 93 @
+ .equ As5, 94 @
+ .equ Bn5, 95 @
+ .equ Cn6, 96 @
+ .equ Cs6, 97 @
+ .equ Dn6, 98 @
+ .equ Ds6, 99 @
+ .equ En6, 100 @
+ .equ Fn6, 101 @
+ .equ Fs6, 102 @
+ .equ Gn6, 103 @
+ .equ Gs6, 104 @
+ .equ An6, 105 @
+ .equ As6, 106 @
+ .equ Bn6, 107 @
+ .equ Cn7, 108 @
+ .equ Cs7, 109 @
+ .equ Dn7, 110 @
+ .equ Ds7, 111 @
+ .equ En7, 112 @
+ .equ Fn7, 113 @
+ .equ Fs7, 114 @
+ .equ Gn7, 115 @
+ .equ Gs7, 116 @
+ .equ An7, 117 @
+ .equ As7, 118 @
+ .equ Bn7, 119 @
+ .equ Cn8, 120 @
+ .equ Cs8, 121 @
+ .equ Dn8, 122 @
+ .equ Ds8, 123 @
+ .equ En8, 124 @
+ .equ Fn8, 125 @
+ .equ Fs8, 126 @
+ .equ Gn8, 127 @
+
+@ velocity
+
+ .equ v000, 0 @
+ .equ v001, 1 @
+ .equ v002, 2 @
+ .equ v003, 3 @
+ .equ v004, 4 @
+ .equ v005, 5 @
+ .equ v006, 6 @
+ .equ v007, 7 @
+ .equ v008, 8 @
+ .equ v009, 9 @
+ .equ v010, 10 @
+ .equ v011, 11 @
+ .equ v012, 12 @
+ .equ v013, 13 @
+ .equ v014, 14 @
+ .equ v015, 15 @
+ .equ v016, 16 @
+ .equ v017, 17 @
+ .equ v018, 18 @
+ .equ v019, 19 @
+ .equ v020, 20 @
+ .equ v021, 21 @
+ .equ v022, 22 @
+ .equ v023, 23 @
+ .equ v024, 24 @
+ .equ v025, 25 @
+ .equ v026, 26 @
+ .equ v027, 27 @
+ .equ v028, 28 @
+ .equ v029, 29 @
+ .equ v030, 30 @
+ .equ v031, 31 @
+ .equ v032, 32 @
+ .equ v033, 33 @
+ .equ v034, 34 @
+ .equ v035, 35 @
+ .equ v036, 36 @
+ .equ v037, 37 @
+ .equ v038, 38 @
+ .equ v039, 39 @
+ .equ v040, 40 @
+ .equ v041, 41 @
+ .equ v042, 42 @
+ .equ v043, 43 @
+ .equ v044, 44 @
+ .equ v045, 45 @
+ .equ v046, 46 @
+ .equ v047, 47 @
+ .equ v048, 48 @
+ .equ v049, 49 @
+ .equ v050, 50 @
+ .equ v051, 51 @
+ .equ v052, 52 @
+ .equ v053, 53 @
+ .equ v054, 54 @
+ .equ v055, 55 @
+ .equ v056, 56 @
+ .equ v057, 57 @
+ .equ v058, 58 @
+ .equ v059, 59 @
+ .equ v060, 60 @
+ .equ v061, 61 @
+ .equ v062, 62 @
+ .equ v063, 63 @
+ .equ v064, 64 @
+ .equ v065, 65 @
+ .equ v066, 66 @
+ .equ v067, 67 @
+ .equ v068, 68 @
+ .equ v069, 79 @
+ .equ v070, 70 @
+ .equ v071, 71 @
+ .equ v072, 72 @
+ .equ v073, 73 @
+ .equ v074, 74 @
+ .equ v075, 75 @
+ .equ v076, 76 @
+ .equ v077, 77 @
+ .equ v078, 78 @
+ .equ v079, 79 @
+ .equ v080, 80 @
+ .equ v081, 81 @
+ .equ v082, 82 @
+ .equ v083, 83 @
+ .equ v084, 84 @
+ .equ v085, 85 @
+ .equ v086, 86 @
+ .equ v087, 87 @
+ .equ v088, 88 @
+ .equ v089, 89 @
+ .equ v090, 90 @
+ .equ v091, 91 @
+ .equ v092, 92 @
+ .equ v093, 93 @
+ .equ v094, 94 @
+ .equ v095, 95 @
+ .equ v096, 96 @
+ .equ v097, 97 @
+ .equ v098, 98 @
+ .equ v099, 99 @
+ .equ v100, 100 @
+ .equ v101, 101 @
+ .equ v102, 102 @
+ .equ v103, 103 @
+ .equ v104, 104 @
+ .equ v105, 105 @
+ .equ v106, 106 @
+ .equ v107, 107 @
+ .equ v108, 108 @
+ .equ v109, 109 @
+ .equ v110, 110 @
+ .equ v111, 111 @
+ .equ v112, 112 @
+ .equ v113, 113 @
+ .equ v114, 114 @
+ .equ v115, 115 @
+ .equ v116, 116 @
+ .equ v117, 117 @
+ .equ v118, 118 @
+ .equ v119, 119 @
+ .equ v120, 120 @
+ .equ v121, 121 @
+ .equ v122, 122 @
+ .equ v123, 123 @
+ .equ v124, 124 @
+ .equ v125, 125 @
+ .equ v126, 126 @
+ .equ v127, 127 @
+
+@ exact gate time parameter for N??
+
+ .equ gtp1, 1 @
+ .equ gtp2, 2 @
+ .equ gtp3, 3 @
+
+@ parameter of MODT
+
+ .equ mod_vib,0 @ vibrate
+ .equ mod_tre,1 @ tremolo
+ .equ mod_pan,2 @ auto-panpot
+
+@ parameter of MEMACC
+
+ .equ mem_set,0 @
+ .equ mem_add,1 @
+ .equ mem_sub,2 @
+ .equ mem_mem_set,3 @
+ .equ mem_mem_add,4 @
+ .equ mem_mem_sub,5 @
+ .equ mem_beq,6 @
+ .equ mem_bne,7 @
+ .equ mem_bhi,8 @
+ .equ mem_bhs,9 @
+ .equ mem_bls,10 @
+ .equ mem_blo,11 @
+ .equ mem_mem_beq,12 @
+ .equ mem_mem_bne,13 @
+ .equ mem_mem_bhi,14 @
+ .equ mem_mem_bhs,15 @
+ .equ mem_mem_bls,16 @
+ .equ mem_mem_blo,17 @
+
+ .equ reverb_set,0x80 @ SOUND_MODE_REVERB_SET
+ .equ PAM, PAN @
diff --git a/include/battle.h b/include/battle.h
index 0881cf82c..544e65b80 100644
--- a/include/battle.h
+++ b/include/battle.h
@@ -4,6 +4,30 @@
#include "sprite.h"
#include "constants/battle_constants.h"
+/*
+ Banks are a name given to what could be called a 'battlerId' or 'monControllerId'.
+ Each bank has a value consisting of two bits.
+ 0x1 bit is responsible for the side, 0 = player's side, 1 = opponent's side.
+ 0x2 bit is responsible for the id of sent out pokemon. 0 means it's the first sent out pokemon, 1 it's the second one. (Triple battle didn't exist at the time yet.)
+*/
+
+#define BATTLE_BANKS_COUNT 4
+
+#define IDENTITY_PLAYER_MON1 0
+#define IDENTITY_OPPONENT_MON1 1
+#define IDENTITY_PLAYER_MON2 2
+#define IDENTITY_OPPONENT_MON2 3
+
+#define SIDE_PLAYER 0x0
+#define SIDE_OPPONENT 0x1
+
+#define BIT_SIDE 0x1
+#define BIT_MON 0x2
+
+#define GET_BANK_IDENTITY(bank)((gBanksByIdentity[bank]))
+#define GET_BANK_SIDE(bank)((GetBankIdentity(bank) & BIT_SIDE))
+#define GET_BANK_SIDE2(bank)((GET_BANK_IDENTITY(bank) & BIT_SIDE))
+
enum
{
BATTLE_TERRAIN_GRASS,
@@ -49,16 +73,16 @@ struct AI_Stack
struct AI_ThinkingStruct /* 0x2016800 */
{
-/* 0x00 */ u8 aiState;
-/* 0x01 */ u8 movesetIndex;
-/* 0x02 */ u16 moveConsidered;
-/* 0x04 */ s8 score[4]; // score?
-/* 0x08 */ u32 funcResult;
-/* 0x0C */ u32 aiFlags;
-/* 0x10 */ u8 aiAction;
-/* 0x11 */ u8 aiLogicId;
-/* 0x12 */ u8 filler12[6];
-/* 0x18 */ u8 simulatedRNG[4];
+ /*0x00*/ u8 aiState;
+ /*0x01*/ u8 movesetIndex;
+ /*0x02*/ u16 moveConsidered;
+ /*0x04*/ s8 score[4]; // score?
+ /*0x08*/ u32 funcResult;
+ /*0x0C*/ u32 aiFlags;
+ /*0x10*/ u8 aiAction;
+ /*0x11*/ u8 aiLogicId;
+ /*0x12*/ u8 filler12[6];
+ /*0x18*/ u8 simulatedRNG[4];
};
struct BattleStruct /* 0x2000000 */
@@ -227,10 +251,8 @@ struct BattleStruct /* 0x2000000 */
/*0x160D5*/ u8 unk160D5;
/*0x160D6*/ u8 unk160D6;
/*0x160D7*/ u8 unk160D7;
- /*0x160D8*/ u8 unk160D8;
- /*0x160D9*/ u8 unk160D9;
- /*0x160DA*/ u8 unk160DA;
- /*0x160DB*/ u8 unk160DB;
+ /*0x160D8*/ u8 unk160D8[2];
+ /*0x160DA*/ u8 unk160DA[2];
/*0x160DC*/ u8 unk160DC;
/*0x160DD*/ u8 intimidateBank;
/*0x160DE*/ u8 unk160DE;
@@ -304,6 +326,18 @@ struct BattleStruct /* 0x2000000 */
/* 0x16A00 */ struct UnkBattleStruct1 unk_2016A00_2;
};
+struct StatsArray
+{
+ u16 hp;
+ u16 atk;
+ u16 def;
+ u16 spd;
+ u16 spAtk;
+ u16 spDef;
+};
+
+#define gBattleResources_statsBeforeLvlUp ((struct StatsArray *)(gSharedMem + 0x17180))
+
struct DisableStruct
{
/*0x00*/ u32 transformedMonPersonality;
@@ -368,16 +402,6 @@ struct Struct2017100
u32 arr[4];
};
-struct Struct2019348
-{
- u16 unk0;
- u16 unk2;
- u8 unk4;
- u32 unk8;
- u32 unkC;
- u32 unk10;
-};
-
struct Struct2017800
{
u8 invisible:1;
@@ -485,7 +509,7 @@ struct sideTimer
u8 lightscreenTimer; //0x1
u8 mistTimer; //0x2
u8 field3; //0x3
- u16 field4; //0x4
+ u16 field4; //0x4
u8 spikesAmount; //0x6
u8 safeguardTimer; //0x7
u8 followmeTimer; //0x8
@@ -503,7 +527,7 @@ struct WishFutureKnock
u8 wishCounter[MAX_BANKS_BATTLE];
u8 wishUserID[MAX_BANKS_BATTLE];
u8 weatherDuration;
- u16 knockedOffPokes;
+ u8 knockedOffPokes[2];
};
extern struct UnkBattleStruct1 unk_2016A00;
@@ -511,11 +535,93 @@ extern struct DisableStruct gDisableStructs[MAX_BANKS_BATTLE];
extern struct BattleResults gBattleResults;
extern struct ProtectStruct gProtectStructs[MAX_BANKS_BATTLE];
extern struct SpecialStatus gSpecialStatuses[MAX_BANKS_BATTLE];
-extern struct sideTimer gSideTimer[2];
+extern struct sideTimer gSideTimers[2];
extern struct WishFutureKnock gWishFutureKnock;
extern struct AI_ThinkingStruct gAIThinkingSpace;
extern struct Struct20238C8 gUnknown_020238C8;
+#define GET_MOVE_TYPE(move, typeArg) \
+{ \
+ if (gBattleStruct->dynamicMoveType) \
+ typeArg = gBattleStruct->dynamicMoveType & 0x3F; \
+ else \
+ typeArg = gBattleMoves[move].type; \
+}
+
+#define MOVE_EFFECT_SLEEP 0x1
+#define MOVE_EFFECT_POISON 0x2
+#define MOVE_EFFECT_BURN 0x3
+#define MOVE_EFFECT_FREEZE 0x4
+#define MOVE_EFFECT_PARALYSIS 0x5
+#define MOVE_EFFECT_TOXIC 0x6
+#define MOVE_EFFECT_CONFUSION 0x7
+#define MOVE_EFFECT_FLINCH 0x8
+#define MOVE_EFFECT_TRI_ATTACK 0x9
+#define MOVE_EFFECT_UPROAR 0xA
+#define MOVE_EFFECT_PAYDAY 0xB
+#define MOVE_EFFECT_CHARGING 0xC
+#define MOVE_EFFECT_WRAP 0xD
+#define MOVE_EFFECT_RECOIL_25 0xE
+#define MOVE_EFFECT_ATK_PLUS_1 0xF
+#define MOVE_EFFECT_DEF_PLUS_1 0x10
+#define MOVE_EFFECT_SPD_PLUS_1 0x11
+#define MOVE_EFFECT_SP_ATK_PLUS_1 0x12
+#define MOVE_EFFECT_SP_DEF_PLUS_1 0x13
+#define MOVE_EFFECT_ACC_PLUS_1 0x14
+#define MOVE_EFFECT_EVS_PLUS_1 0x15
+#define MOVE_EFFECT_ATK_MINUS_1 0x16
+#define MOVE_EFFECT_DEF_MINUS_1 0x17
+#define MOVE_EFFECT_SPD_MINUS_1 0x18
+#define MOVE_EFFECT_SP_ATK_MINUS_1 0x19
+#define MOVE_EFFECT_SP_DEF_MINUS_1 0x1A
+#define MOVE_EFFECT_ACC_MINUS_1 0x1B
+#define MOVE_EFFECT_EVS_MINUS_1 0x1C
+#define MOVE_EFFECT_RECHARGE 0x1D
+#define MOVE_EFFECT_RAGE 0x1E
+#define MOVE_EFFECT_STEAL_ITEM 0x1F
+#define MOVE_EFFECT_PREVENT_ESCAPE 0x20
+#define MOVE_EFFECT_NIGHTMARE 0x21
+#define MOVE_EFFECT_ALL_STATS_UP 0x22
+#define MOVE_EFFECT_RAPIDSPIN 0x23
+#define MOVE_EFFECT_REMOVE_PARALYSIS 0x24
+#define MOVE_EFFECT_ATK_DEF_DOWN 0x25
+#define MOVE_EFFECT_RECOIL_33_PARALYSIS 0x26
+#define MOVE_EFFECT_ATK_PLUS_2 0x27
+#define MOVE_EFFECT_DEF_PLUS_2 0x28
+#define MOVE_EFFECT_SPD_PLUS_2 0x29
+#define MOVE_EFFECT_SP_ATK_PLUS_2 0x2A
+#define MOVE_EFFECT_SP_DEF_PLUS_2 0x2B
+#define MOVE_EFFECT_ACC_PLUS_2 0x2C
+#define MOVE_EFFECT_EVS_PLUS_2 0x2D
+#define MOVE_EFFECT_ATK_MINUS_2 0x2E
+#define MOVE_EFFECT_DEF_MINUS_2 0x2F
+#define MOVE_EFFECT_SPD_MINUS_2 0x30
+#define MOVE_EFFECT_SP_ATK_MINUS_2 0x31
+#define MOVE_EFFECT_SP_DEF_MINUS_2 0x32
+#define MOVE_EFFECT_ACC_MINUS_2 0x33
+#define MOVE_EFFECT_EVS_MINUS_2 0x34
+#define MOVE_EFFECT_THRASH 0x35
+#define MOVE_EFFECT_KNOCK_OFF 0x36
+#define MOVE_EFFECT_NOTHING_37 0x37
+#define MOVE_EFFECT_NOTHING_38 0x38
+#define MOVE_EFFECT_NOTHING_39 0x39
+#define MOVE_EFFECT_NOTHING_3A 0x3A
+#define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x3B
+#define MOVE_EFFECT_NOTHING_3C 0x3C
+#define MOVE_EFFECT_NOTHING_3D 0x3D
+#define MOVE_EFFECT_NOTHING_3E 0x3E
+#define MOVE_EFFECT_NOTHING_3F 0x3F
+#define MOVE_EFFECT_AFFECTS_USER 0x40
+#define MOVE_EFFECT_CERTAIN 0x80
+
+#define GET_STAT_BUFF_ID(n)((n & 0xF)) // first four bits 0x1, 0x2, 0x4, 0x8
+#define GET_STAT_BUFF_VALUE(n)(((n >> 4) & 7)) // 0x10, 0x20, 0x40
+#define STAT_BUFF_NEGATIVE 0x80 // 0x80, the sign bit
+
+#define SET_STAT_BUFF_VALUE(n)(((s8)(((s8)(n) << 4)) & 0xF0))
+
+#define SET_STATCHANGER(statId, stage, goesDown)(gBattleScripting.statChanger = (statId) + (stage << 4) + (goesDown << 7))
+
// used in many battle files, it seems as though Hisashi Sogabe wrote
// some sort of macro to replace the use of actually calling memset.
// Perhaps it was thought calling memset was much slower?
@@ -552,7 +658,7 @@ struct funcStack
struct scriptsStack
{
- u8* ptr[8];
+ const u8 *ptr[8];
u8 size;
};
@@ -561,7 +667,7 @@ extern u8 gBattleTextBuff1[];
//function declarations of buffer emits
void EmitGetAttributes(u8 buffID, u8 request, u8 c); //0x0
void Emitcmd1(u8 a, u8 b, u8 c); //0x1
-void EmitSetAttributes(u8 a, u8 request, u8 c, u8 bytes, void *data); //0x2
+void EmitSetMonData(u8 a, u8 request, u8 c, u8 bytes, void *data); //0x2
void EmitSendOutPoke(u8 a, u8 b, u8 c); //0x5
void EmitReturnPokeToBall(u8 a, u8 b); //0x6
void EmitTrainerSlide(u8 a); //0x8
@@ -616,7 +722,7 @@ void InitBattle(void);
void sub_800EC9C(void);
void sub_800F104(void);
void sub_800F298(void);
-void sub_800F808(void);
+void BattleMainCB2(void);
void sub_800F838(struct Sprite *);
u8 CreateNPCTrainerParty(struct Pokemon *, u16);
void sub_800FCFC(void);
@@ -648,32 +754,30 @@ void sub_8011970(void);
void sub_80119B4(void);
void BattleBeginFirstTurn(void);
void BattleTurnPassed(void);
+void RunBattleScriptCommands_PopCallbacksStack(void);
+void RunBattleScriptCommands(void);
+bool8 TryRunFromBattle(u8 bank);
// asm/battle_2.o
void sub_8012324(void);
-void sub_8012FBC(u8, u8);
+void SwapTurnOrder(u8, u8);
u8 GetWhoStrikesFirst(u8, u8, u8);
-void TurnValuesCleanUp(u8);
-void SpecialStatusesClear(void);
-void sub_80138F0(void);
-void sub_80155A4();
-void CancelMultiTurnMoves(u8 bank);
-void PrepareStringBattle();
-void sub_80156DC();
-void sub_80157C4(u8 index);
+
+void debug_sub_8010800(void);
// asm/battle_3.o
u8 CheckMoveLimitations(u8 bank, u8 unusableMoves, u8 check);
u8 UpdateTurnCounters(void);
u8 TurnBasedEffects(void);
-u8 sub_80170DC();
-u8 sub_80173A4();
+u8 HandleFaintedMonActions();
u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 move);
u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn);
+u8 GetMoveTarget(u16 move, u8 useMoveTarget);
// asm/battle_4.o
void AI_CalcDmg(u8, u8);
u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def);
+u8 BankGetTurnOrder(u8 bank);
// asm/battle_5.o
void nullsub_91(void);
@@ -692,10 +796,11 @@ void nullsub_10(int);
void load_gfxc_health_bar();
u8 battle_load_something();
void sub_8031F88(u8);
-void sub_80324F8(struct Pokemon *, u8);
+void HandleLowHpMusicChange(struct Pokemon *, u8);
void sub_8032638();
void sub_8032AA8(u8, u8);
void SetBankFuncToOpponentBufferRunCommand(void);
+void BattleStopLowHpSound(void);
// asm/battle_9.o
void SetBankFuncToLinkOpponentBufferRunCommand(void);
diff --git a/include/battle_ai.h b/include/battle_ai.h
index 60ca5d000..fdad0c7e9 100644
--- a/include/battle_ai.h
+++ b/include/battle_ai.h
@@ -10,10 +10,10 @@ enum
// AI states
enum
{
- AIState_SettingUp,
- AIState_Processing,
- AIState_FinishedProcessing,
- AIState_DoNotProcess
+ BATTLEAI_SETTING_UP,
+ BATTLEAI_PROCESSING,
+ BATTLEAI_FINISHED,
+ BATTLEAI_DO_NOT_PROCESS
};
// battle_ai
@@ -24,5 +24,6 @@ void sub_810745C(void);
void AIStackPushVar(u8 *);
u8 AIStackPop(void);
void BattleAI_HandleItemUseBeforeAISetup(void);
+void RecordAbilityBattle(u8 a, u8 b);
#endif
diff --git a/include/battle_anim.h b/include/battle_anim.h
index d456950f6..fd1becf39 100644
--- a/include/battle_anim.h
+++ b/include/battle_anim.h
@@ -60,5 +60,9 @@ void DestroyAnimVisualTask(u8 task);
bool8 IsAnimBankSpriteVisible(u8);
s8 BattleAnimAdjustPanning(s8 a);
void sub_80763FC(u16 a, u16 *b, u32 c, u8 d);
+s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan);
+s16 sub_8077104(s16 newPan, int oldPan);
+void DestroyAnimSoundTask(u8 taskId);
+void sub_8076464(u8 a);
#endif
diff --git a/include/battle_anim_80CA710.h b/include/battle_anim_80CA710.h
index 14a6ca898..58521bfae 100644
--- a/include/battle_anim_80CA710.h
+++ b/include/battle_anim_80CA710.h
@@ -1,7 +1,7 @@
#ifndef GUARD_BATTLE_ANIM_80CA710_H
#define GUARD_BATTLE_ANIM_80CA710_H
-void sub_80E4EF8(int, int, int, int, u16, u8, int);
+void sub_80E4EF8(u8, u8, u8, u8, u16, u8, u8);
s16 sub_81174E0(s16 a);
s16 sub_81174C4(s16 a, s16 b);
diff --git a/include/battle_message.h b/include/battle_message.h
index 3e37a1ccd..9c27994ee 100644
--- a/include/battle_message.h
+++ b/include/battle_message.h
@@ -16,6 +16,143 @@ struct StringInfoBattle
u8 textBuffs[3][0x10];
};
+// for B_TXT_BUFF1, B_TXT_BUFF2 and B_TXT_BUFF3
+
+#define B_BUFF_STRING 0
+#define B_BUFF_NUMBER 1
+#define B_BUFF_MOVE 2
+#define B_BUFF_TYPE 3
+#define B_BUFF_MON_NICK_WITH_PREFIX 4
+#define B_BUFF_STAT 5
+#define B_BUFF_SPECIES 6
+#define B_BUFF_MON_NICK 7
+#define B_BUFF_NEGATIVE_FLAVOR 8
+#define B_BUFF_ABILITY 9
+#define B_BUFF_ITEM 10
+
+#define B_BUFF_PLACEHOLDER_BEGIN 0xFD
+#define B_BUFF_EOS 0xFF
+
+#define PREPARE_FLAVOR_BUFFER(textVar, flavorId) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_NEGATIVE_FLAVOR; \
+ textVar[2] = flavorId; \
+ textVar[3] = B_BUFF_EOS; \
+}
+
+#define PREPARE_STAT_BUFFER(textVar, statId) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_STAT; \
+ textVar[2] = statId; \
+ textVar[3] = B_BUFF_EOS; \
+}
+
+#define PREPARE_ABILITY_BUFFER(textVar, abilityId) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_ABILITY; \
+ textVar[2] = abilityId; \
+ textVar[3] = B_BUFF_EOS; \
+}
+
+#define PREPARE_TYPE_BUFFER(textVar, typeId) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_TYPE; \
+ textVar[2] = typeId; \
+ textVar[3] = B_BUFF_EOS; \
+}
+
+#define PREPARE_BYTE_NUMBER_BUFFER(textVar, maxDigits, number) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_NUMBER; \
+ textVar[2] = 1; \
+ textVar[3] = maxDigits; \
+ textVar[4] = (number); \
+ textVar[5] = B_BUFF_EOS; \
+}
+
+#define PREPARE_HWORD_NUMBER_BUFFER(textVar, maxDigits, number) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_NUMBER; \
+ textVar[2] = 2; \
+ textVar[3] = maxDigits; \
+ textVar[4] = (number); \
+ textVar[5] = (number & 0x0000FF00) >> 8; \
+ textVar[6] = B_BUFF_EOS; \
+}
+
+#define PREPARE_WORD_NUMBER_BUFFER(textVar, maxDigits, number) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_NUMBER; \
+ textVar[2] = 4; \
+ textVar[3] = maxDigits; \
+ textVar[4] = (number); \
+ textVar[5] = (number & 0x0000FF00) >> 8; \
+ textVar[6] = (number & 0x00FF0000) >> 16; \
+ textVar[7] = (number & 0xFF000000) >> 24; \
+ textVar[8] = B_BUFF_EOS; \
+}
+
+#define PREPARE_STRING_BUFFER(textVar, stringId) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_STRING; \
+ textVar[2] = stringId; \
+ textVar[3] = (stringId & 0xFF00) >> 8; \
+ textVar[4] = B_BUFF_EOS; \
+}
+
+#define PREPARE_MOVE_BUFFER(textVar, move) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_MOVE; \
+ textVar[2] = move; \
+ textVar[3] = (move & 0xFF00) >> 8; \
+ textVar[4] = B_BUFF_EOS; \
+}
+
+#define PREPARE_ITEM_BUFFER(textVar, item) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_ITEM; \
+ textVar[2] = item; \
+ textVar[3] = (item & 0xFF00) >> 8; \
+ textVar[4] = B_BUFF_EOS; \
+}
+
+#define PREPARE_SPECIES_BUFFER(textVar, species) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_SPECIES; \
+ textVar[2] = species; \
+ textVar[3] = (species & 0xFF00) >> 8; \
+ textVar[4] = B_BUFF_EOS; \
+}
+
+#define PREPARE_MON_NICK_WITH_PREFIX_BUFFER(textVar, bank, partyId) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_MON_NICK_WITH_PREFIX; \
+ textVar[2] = bank; \
+ textVar[3] = partyId; \
+ textVar[4] = B_BUFF_EOS; \
+}
+
+#define PREPARE_MON_NICK_BUFFER(textVar, bank, partyId) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_MON_NICK; \
+ textVar[2] = bank; \
+ textVar[3] = partyId; \
+ textVar[4] = B_BUFF_EOS; \
+}
+
void BufferStringBattle(u16 stringID);
u32 StrCpyDecodeToDisplayedStringBattle(const u8* src);
u32 StrCpyDecodeBattle(const u8* src, u8* dst);
diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h
new file mode 100644
index 000000000..030844ec3
--- /dev/null
+++ b/include/battle_script_commands.h
@@ -0,0 +1,65 @@
+#ifndef GUARD_BATTLE_SCRIPT_COMMANDS_H
+#define GUARD_BATTLE_SCRIPT_COMMANDS_H
+
+#define NO_ACC_CALC 0xFFFE
+#define NO_ACC_CALC_CHECK_LOCK_ON 0xFFFF
+#define ACC_CURR_MOVE 0
+
+#define CMP_EQUAL 0x0
+#define CMP_NOT_EQUAL 0x1
+#define CMP_GREATER_THAN 0x2
+#define CMP_LESS_THAN 0x3
+#define CMP_COMMON_BITS 0x4
+#define CMP_NO_COMMON_BITS 0x5
+
+#define BS_ATTACKER_WITH_PARTNER 4 // for atk98_status_icon_update
+#define BS_GET_ATTACKER_SIDE 8 // for atk1E_jumpifability
+#define BS_GET_NOT_ATTACKER_SIDE 9 // for atk1E_jumpifability
+
+#define ATK48_STAT_NEGATIVE 0x1
+#define ATK48_STAT_BY_TWO 0x2
+#define ATK48_BIT_x4 0x4
+#define ATK48_LOWER_FAIL_CHECK 0x8
+
+#define ATK4F_DONT_CHECK_STATUSES 0x80
+
+#define VARIOUS_CANCEL_MULTI_TURN_MOVES 0
+#define VARIOUS_SET_MAGIC_COAT_TARGET 1
+#define VARIOUS_IS_RUNNING_IMPOSSIBLE 2
+#define VARIOUS_GET_MOVE_TARGET 3
+#define VARIOUS_RESET_INTIMIDATE_TRACE_BITS 5
+#define VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP 6
+#define VARIOUS_EMIT_YESNOBOX 13
+#define VARIOUS_WAIT_CRY 18
+#define VARIOUS_RETURN_OPPONENT_MON1 19
+#define VARIOUS_RETURN_OPPONENT_MON2 20
+#define VARIOUS_SET_TELEPORT_OUTCOME 25
+#define VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC 26
+
+#define ATK80_DMG_CHANGE_SIGN 0
+#define ATK80_DMG_HALF_BY_TWO_NOT_MORE_THAN_HALF_MAX_HP 1
+#define ATK80_DMG_DOUBLED 2
+
+#define STAT_CHANGE_BS_PTR 0x1
+#define STAT_CHANGE_NOT_PROTECT_AFFECTED 0x20
+
+#define STAT_CHANGE_WORKED 0
+#define STAT_CHANGE_DIDNT_WORK 1
+
+#define WINDOW_CLEAR 0x1
+#define WINDOW_x80 0x80
+
+void AI_CalcDmg(u8 bankAtk, u8 bankDef);
+u8 TypeCalc(u16 move, u8 bankAtk, u8 bankDef);
+u8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility);
+u8 BankGetTurnOrder(u8 bank);
+void SetMoveEffect(bool8 primary, u8 certain);
+void BattleDestroyYesNoCursorAt(u8 cursorPosition);
+void BattleCreateYesNoCursorAt(u8 cursorPosition);
+void BufferMoveToLearnIntoBattleTextBuff2(void);
+void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags);
+bool8 UproarWakeUpCheck(u8 bank);
+
+extern void (* const gBattleScriptingCommandsTable[])(void);
+
+#endif // GUARD_BATTLE_SCRIPT_COMMANDS_H
diff --git a/include/battle_string_ids.h b/include/battle_string_ids.h
new file mode 100644
index 000000000..f242284b0
--- /dev/null
+++ b/include/battle_string_ids.h
@@ -0,0 +1,387 @@
+#ifndef GUARD_BATTLE_STRING_IDS_H
+#define GUARD_BATTLE_STRING_IDS_H
+
+#define BATTLESTRINGS_COUNT 369
+
+#define BATTLESTRINGS_ID_ADDER 12 // all battlestrings have its ID + 12, because first 5 are reserved
+
+#define STRINGID_INTROMSG 0
+#define STRINGID_INTROSENDOUT 1
+#define STRINGID_RETURNMON 2
+#define STRINGID_SWITCHINMON 3
+#define STRINGID_USEDMOVE 4
+#define STRINGID_BATTLEEND 5
+
+
+// todo: make some of those names less vague: attacker/target vs pkmn, etc.
+#define STRINGID_TRAINER1LOSETEXT 12
+#define STRINGID_PKMNGAINEDEXP 13
+#define STRINGID_PKMNGREWTOLV 14
+#define STRINGID_PKMNLEARNEDMOVE 15
+#define STRINGID_TRYTOLEARNMOVE1 16
+#define STRINGID_TRYTOLEARNMOVE2 17
+#define STRINGID_TRYTOLEARNMOVE3 18
+#define STRINGID_PKMNFORGOTMOVE 19
+#define STRINGID_STOPLEARNINGMOVE 20
+#define STRINGID_DIDNOTLEARNMOVE 21
+#define STRINGID_PKMNLEARNEDMOVE2 22
+#define STRINGID_ATTACKMISSED 23
+#define STRINGID_PKMNPROTECTEDITSELF 24
+#define STRINGID_STATSWONTINCREASE2 25
+#define STRINGID_AVOIDEDDAMAGE 26
+#define STRINGID_ITDOESNTAFFECT 27
+#define STRINGID_ATTACKERFAINTED 28
+#define STRINGID_TARGETFAINTED 29
+#define STRINGID_PLAYERGOTMONEY 30
+#define STRINGID_PLAYERWHITEOUT 31
+#define STRINGID_PLAYERWHITEOUT2 32
+#define STRINGID_PREVENTSESCAPE 33
+#define STRINGID_HITXTIMES 34
+#define STRINGID_PKMNFELLASLEEP 35
+#define STRINGID_PKMNMADESLEEP 36
+#define STRINGID_PKMNALREADYASLEEP 37
+#define STRINGID_PKMNALREADYASLEEP2 38
+#define STRINGID_PKMNWASNTAFFECTED 39
+#define STRINGID_PKMNWASPOISONED 40
+#define STRINGID_PKMNPOISONEDBY 41
+#define STRINGID_PKMNHURTBYPOISON 42
+#define STRINGID_PKMNALREADYPOISONED 43
+#define STRINGID_PKMNBADLYPOISONED 44
+#define STRINGID_PKMNENERGYDRAINED 45
+#define STRINGID_PKMNWASBURNED 46
+#define STRINGID_PKMNBURNEDBY 47
+#define STRINGID_PKMNHURTBYBURN 48
+#define STRINGID_PKMNWASFROZEN 49
+#define STRINGID_PKMNFROZENBY 50
+#define STRINGID_PKMNISFROZEN 51
+#define STRINGID_PKMNWASDEFROSTED 52
+#define STRINGID_PKMNWASDEFROSTED2 53
+#define STRINGID_PKMNWASDEFROSTEDBY 54
+#define STRINGID_PKMNWASPARALYZED 55
+#define STRINGID_PKMNWASPARALYZEDBY 56
+#define STRINGID_PKMNISPARALYZED 57
+#define STRINGID_PKMNISALREADYPARALYZED 58
+#define STRINGID_PKMNHEALEDPARALYSIS 59
+#define STRINGID_PKMNDREAMEATEN 60
+#define STRINGID_STATSWONTINCREASE 61
+#define STRINGID_STATSWONTDECREASE 62
+#define STRINGID_TEAMSTOPPEDWORKING 63
+#define STRINGID_FOESTOPPEDWORKING 64
+#define STRINGID_PKMNISCONFUSED 65
+#define STRINGID_PKMNHEALEDCONFUSION 66
+#define STRINGID_PKMNWASCONFUSED 67
+#define STRINGID_PKMNALREADYCONFUSED 68
+#define STRINGID_PKMNFELLINLOVE 69
+#define STRINGID_PKMNINLOVE 70
+#define STRINGID_PKMNIMMOBILIZEDBYLOVE 71
+#define STRINGID_PKMNBLOWNAWAY 72
+#define STRINGID_PKMNCHANGEDTYPE 73
+#define STRINGID_PKMNFLINCHED 74
+#define STRINGID_PKMNREGAINEDHEALTH 75
+#define STRINGID_PKMNHPFULL 76
+#define STRINGID_PKMNRAISEDSPDEF 77
+#define STRINGID_PKMNRAISEDDEF 78
+#define STRINGID_PKMNCOVEREDBYVEIL 79
+#define STRINGID_PKMNUSEDSAFEGUARD 80
+#define STRINGID_PKMNSAFEGUARDEXPIRED 81
+#define STRINGID_PKMNWENTTOSLEEP 82
+#define STRINGID_PKMNSLEPTHEALTHY 83
+#define STRINGID_PKMNWHIPPEDWHIRLWIND 84
+#define STRINGID_PKMNTOOKSUNLIGHT 85
+#define STRINGID_PKMNLOWEREDHEAD 86
+#define STRINGID_PKMNISGLOWING 87
+#define STRINGID_PKMNFLEWHIGH 88
+#define STRINGID_PKMNDUGHOLE 89
+#define STRINGID_PKMNSQUEEZEDBYBIND 90
+#define STRINGID_PKMNTRAPPEDINVORTEX 91
+#define STRINGID_PKMNWRAPPEDBY 92
+#define STRINGID_PKMNCLAMPED 93
+#define STRINGID_PKMNHURTBY 94
+#define STRINGID_PKMNFREEDFROM 95
+#define STRINGID_PKMNCRASHED 96
+#define STRINGID_PKMNSHROUDEDINMIST 97
+#define STRINGID_PKMNPROTECTEDBYMIST 98
+#define STRINGID_PKMNGETTINGPUMPED 99
+#define STRINGID_PKMNHITWITHRECOIL 100
+#define STRINGID_PKMNPROTECTEDITSELF2 101
+#define STRINGID_PKMNBUFFETEDBYSANDSTORM 102
+#define STRINGID_PKMNPELTEDBYHAIL 103
+#define STRINGID_PKMNSEEDED 104
+#define STRINGID_PKMNEVADEDATTACK 105
+#define STRINGID_PKMNSAPPEDBYLEECHSEED 106
+#define STRINGID_PKMNFASTASLEEP 107
+#define STRINGID_PKMNWOKEUP 108
+#define STRINGID_PKMNUPROARKEPTAWAKE 109
+#define STRINGID_PKMNWOKEUPINUPROAR 110
+#define STRINGID_PKMNCAUSEDUPROAR 111
+#define STRINGID_PKMNMAKINGUPROAR 112
+#define STRINGID_PKMNCALMEDDOWN 113
+#define STRINGID_PKMNCANTSLEEPINUPROAR 114
+#define STRINGID_PKMNSTOCKPILED 115
+#define STRINGID_PKMNCANTSTOCKPILE 116
+#define STRINGID_PKMNCANTSLEEPINUPROAR2 117
+#define STRINGID_UPROARKEPTPKMNAWAKE 118
+#define STRINGID_PKMNSTAYEDAWAKEUSING 119
+#define STRINGID_PKMNSTORINGENERGY 120
+#define STRINGID_PKMNUNLEASHEDENERGY 121
+#define STRINGID_PKMNFATIGUECONFUSION 122
+#define STRINGID_PKMNPICKEDUPITEM 123
+#define STRINGID_PKMNUNAFFECTED 124
+#define STRINGID_PKMNTRANSFORMEDINTO 125
+#define STRINGID_PKMNMADESUBSTITUTE 126
+#define STRINGID_PKMNHASSUBSTITUTE 127
+#define STRINGID_SUBSTITUTEDAMAGED 128
+#define STRINGID_PKMNSUBSTITUTEFADED 129
+#define STRINGID_PKMNMUSTRECHARGE 130
+#define STRINGID_PKMNRAGEBUILDING 131
+#define STRINGID_PKMNMOVEWASDISABLED 132
+#define STRINGID_PKMNMOVEISDISABLED 133
+#define STRINGID_PKMNMOVEDISABLEDNOMORE 134
+#define STRINGID_PKMNGOTENCORE 135
+#define STRINGID_PKMNENCOREENDED 136
+#define STRINGID_PKMNTOOKAIM 137
+#define STRINGID_PKMNSKETCHEDMOVE 138
+#define STRINGID_PKMNTRYINGTOTAKEFOE 139
+#define STRINGID_PKMNTOOKFOE 140
+#define STRINGID_PKMNREDUCEDPP 141
+#define STRINGID_PKMNSTOLEITEM 142
+#define STRINGID_TARGETCANTESCAPENOW 143
+#define STRINGID_PKMNFELLINTONIGHTMARE 144
+#define STRINGID_PKMNLOCKEDINNIGHTMARE 145
+#define STRINGID_PKMNLAIDCURSE 146
+#define STRINGID_PKMNAFFLICTEDBYCURSE 147
+#define STRINGID_SPIKESSCATTERED 148
+#define STRINGID_PKMNHURTBYSPIKES 149
+#define STRINGID_PKMNIDENTIFIED 150
+#define STRINGID_PKMNPERISHCOUNTFELL 151
+#define STRINGID_PKMNBRACEDITSELF 152
+#define STRINGID_PKMNENDUREDHIT 153
+#define STRINGID_MAGNITUDESTRENGTH 154
+#define STRINGID_PKMNCUTHPMAXEDATTACK 155
+#define STRINGID_PKMNCOPIEDSTATCHANGES 156
+#define STRINGID_PKMNGOTFREE 157
+#define STRINGID_PKMNSHEDLEECHSEED 158
+#define STRINGID_PKMNBLEWAWAYSPIKES 159
+#define STRINGID_PKMNFLEDFROMBATTLE 160
+#define STRINGID_PKMNFORESAWATTACK 161
+#define STRINGID_PKMNTOOKATTACK 162
+#define STRINGID_PKMNATTACK 163
+#define STRINGID_PKMNCENTERATTENTION 164
+#define STRINGID_PKMNCHARGINGPOWER 165
+#define STRINGID_NATUREPOWERTURNEDINTO 166
+#define STRINGID_PKMNSTATUSNORMAL 167
+#define STRINGID_PKMNHASNOMOVESLEFT 168
+#define STRINGID_PKMNSUBJECTEDTOTORMENT 169
+#define STRINGID_PKMNCANTUSEMOVETORMENT 170
+#define STRINGID_PKMNTIGHTENINGFOCUS 171
+#define STRINGID_PKMNFELLFORTAUNT 172
+#define STRINGID_PKMNCANTUSEMOVETAUNT 173
+#define STRINGID_PKMNREADYTOHELP 174
+#define STRINGID_PKMNSWITCHEDITEMS 175
+#define STRINGID_PKMNCOPIEDFOE 176
+#define STRINGID_PKMNMADEWISH 177
+#define STRINGID_PKMNWISHCAMETRUE 178
+#define STRINGID_PKMNPLANTEDROOTS 179
+#define STRINGID_PKMNABSORBEDNUTRIENTS 180
+#define STRINGID_PKMNANCHOREDITSELF 181
+#define STRINGID_PKMNWASMADEDROWSY 182
+#define STRINGID_PKMNKNOCKEDOFF 183
+#define STRINGID_PKMNSWAPPEDABILITIES 184
+#define STRINGID_PKMNSEALEDOPPONENTMOVE 185
+#define STRINGID_PKMNCANTUSEMOVESEALED 186
+#define STRINGID_PKMNWANTSGRUDGE 187
+#define STRINGID_PKMNLOSTPPGRUDGE 188
+#define STRINGID_PKMNSHROUDEDITSELF 189
+#define STRINGID_PKMNMOVEBOUNCED 190
+#define STRINGID_PKMNWAITSFORTARGET 191
+#define STRINGID_PKMNSNATCHEDMOVE 192
+#define STRINGID_PKMNMADEITRAIN 193
+#define STRINGID_PKMNRAISEDSPEED 194
+#define STRINGID_PKMNPROTECTEDBY 195
+#define STRINGID_PKMNPREVENTSUSAGE 196
+#define STRINGID_PKMNRESTOREDHPUSING 197
+#define STRINGID_PKMNCHANGEDTYPEWITH 198
+#define STRINGID_PKMNPREVENTSPARALYSISWITH 199
+#define STRINGID_PKMNPREVENTSROMANCEWITH 200
+#define STRINGID_PKMNPREVENTSPOISONINGWITH 201
+#define STRINGID_PKMNPREVENTSCONFUSIONWITH 202
+#define STRINGID_PKMNRAISEDFIREPOWERWITH 203
+#define STRINGID_PKMNANCHORSITSELFWITH 204
+#define STRINGID_PKMNCUTSATTACKWITH 205
+#define STRINGID_PKMNPREVENTSSTATLOSSWITH 206
+#define STRINGID_PKMNHURTSWITH 207
+#define STRINGID_PKMNTRACED 208
+#define STRINGID_STATSHARPLY 209
+#define STRINGID_STATROSE 210
+#define STRINGID_STATHARSHLY 211
+#define STRINGID_STATFELL 212
+#define STRINGID_PKMNSSTATCHANGED 213
+#define STRINGID_PKMNSSTATCHANGED2 214
+#define STRINGID_PKMNSSTATCHANGED3 215
+#define STRINGID_PKMNSSTATCHANGED4 216
+#define STRINGID_CRITICALHIT 217
+#define STRINGID_ONEHITKO 218
+#define STRINGID_123POOF 219
+#define STRINGID_ANDELLIPSIS 220
+#define STRINGID_NOTVERYEFFECTIVE 221
+#define STRINGID_SUPEREFFECTIVE 222
+#define STRINGID_GOTAWAYSAFELY 223
+#define STRINGID_WILDPKMNFLED 224
+#define STRINGID_NORUNNINGFROMTRAINERS 225
+#define STRINGID_CANTESCAPE 226
+#define STRINGID_DONTLEAVEBIRCH 227
+#define STRINGID_BUTNOTHINGHAPPENED 228
+#define STRINGID_BUTITFAILED 229
+#define STRINGID_ITHURTCONFUSION 230
+#define STRINGID_MIRRORMOVEFAILED 231
+#define STRINGID_STARTEDTORAIN 232
+#define STRINGID_DOWNPOURSTARTED 233
+#define STRINGID_RAINCONTINUES 234
+#define STRINGID_DOWNPOURCONTINUES 235
+#define STRINGID_RAINSTOPPED 236
+#define STRINGID_SANDSTORMBREWED 237
+#define STRINGID_SANDSTORMRAGES 238
+#define STRINGID_SANDSTORMSUBSIDED 239
+#define STRINGID_SUNLIGHTGOTBRIGHT 240
+#define STRINGID_SUNLIGHTSTRONG 241
+#define STRINGID_SUNLIGHTFADED 242
+#define STRINGID_STARTEDHAIL 243
+#define STRINGID_HAILCONTINUES 244
+#define STRINGID_HAILSTOPPED 245
+#define STRINGID_FAILEDTOSPITUP 246
+#define STRINGID_FAILEDTOSWALLOW 247
+#define STRINGID_WINDBECAMEHEATWAVE 248
+#define STRINGID_STATCHANGESGONE 249
+#define STRINGID_COINSSCATTERED 250
+#define STRINGID_TOOWEAKFORSUBSTITUTE 251
+#define STRINGID_SHAREDPAIN 252
+#define STRINGID_BELLCHIMED 253
+#define STRINGID_FAINTINTHREE 254
+#define STRINGID_NOPPLEFT 255
+#define STRINGID_BUTNOPPLEFT 256
+#define STRINGID_PLAYERUSEDITEM 257
+#define STRINGID_WALLYUSEDITEM 258
+#define STRINGID_TRAINERBLOCKEDBALL 259
+#define STRINGID_DONTBEATHIEF 260
+#define STRINGID_ITDODGEDBALL 261
+#define STRINGID_YOUMISSEDPKMN 262
+#define STRINGID_PKMNBROKEFREE 263
+#define STRINGID_ITAPPEAREDCAUGHT 264
+#define STRINGID_AARGHALMOSTHADIT 265
+#define STRINGID_SHOOTSOCLOSE 266
+#define STRINGID_GOTCHAPKMNCAUGHT 267
+#define STRINGID_GOTCHAPKMNCAUGHT2 268
+#define STRINGID_GIVENICKNAMECAPTURED 269
+#define STRINGID_PKMNSENTTOPC 270
+#define STRINGID_PKMNDATAADDEDTODEX 271
+#define STRINGID_ITISRAINING 272
+#define STRINGID_SANDSTORMISRAGING 273
+#define STRINGID_CANTESCAPE2 274
+#define STRINGID_PKMNIGNORESASLEEP 275
+#define STRINGID_PKMNIGNOREDORDERS 276
+#define STRINGID_PKMNBEGANTONAP 277
+#define STRINGID_PKMNLOAFING 278
+#define STRINGID_PKMNWONTOBEY 279
+#define STRINGID_PKMNTURNEDAWAY 280
+#define STRINGID_PKMNPRETENDNOTNOTICE 281
+#define STRINGID_ENEMYABOUTTOSWITCHPKMN 282
+#define STRINGID_CREPTCLOSER 283
+#define STRINGID_CANTGETCLOSER 284
+#define STRINGID_PKMNWATCHINGCAREFULLY 285
+#define STRINGID_PKMNCURIOUSABOUTX 286
+#define STRINGID_PKMNENTHRALLEDBYX 287
+#define STRINGID_PKMNIGNOREDX 288
+#define STRINGID_THREWPOKEBLOCKATPKMN 289
+#define STRINGID_OUTOFSAFARIBALLS 290
+#define STRINGID_PKMNSITEMCUREDPARALYSIS 291
+#define STRINGID_PKMNSITEMCUREDPOISON 292
+#define STRINGID_PKMNSITEMHEALEDBURN 293
+#define STRINGID_PKMNSITEMDEFROSTEDIT 294
+#define STRINGID_PKMNSITEMWOKEIT 295
+#define STRINGID_PKMNSITEMSNAPPEDOUT 296
+#define STRINGID_PKMNSITEMCUREDPROBLEM 297
+#define STRINGID_PKMNSITEMRESTOREDHEALTH 298
+#define STRINGID_PKMNSITEMRESTOREDPP 299
+#define STRINGID_PKMNSITEMRESTOREDSTATUS 300
+#define STRINGID_PKMNSITEMRESTOREDHPALITTLE 301
+#define STRINGID_ITEMALLOWSONLYYMOVE 302
+#define STRINGID_PKMNHUNGONWITHX 303
+#define STRINGID_EMPTYSTRING3 304
+#define STRINGID_PKMNSXPREVENTSBURNS 305
+#define STRINGID_PKMNSXBLOCKSY 306
+#define STRINGID_PKMNSXRESTOREDHPALITTLE2 307
+#define STRINGID_PKMNSXWHIPPEDUPSANDSTORM 308
+#define STRINGID_PKMNSXPREVENTSYLOSS 309
+#define STRINGID_PKMNSXINFATUATEDY 310
+#define STRINGID_PKMNSXMADEYINEFFECTIVE 311
+#define STRINGID_PKMNSXCUREDYPROBLEM 312
+#define STRINGID_ITSUCKEDLIQUIDOOZE 313
+#define STRINGID_PKMNTRANSFORMED 314
+#define STRINGID_ELECTRICITYWEAKENED 315
+#define STRINGID_FIREWEAKENED 316
+#define STRINGID_PKMNHIDUNDERWATER 317
+#define STRINGID_PKMNSPRANGUP 318
+#define STRINGID_HMMOVESCANTBEFORGOTTEN 319
+#define STRINGID_XFOUNDONEY 320
+#define STRINGID_PLAYERDEFEATEDTRAINER1 321
+#define STRINGID_SOOTHINGAROMA 322
+#define STRINGID_ITEMSCANTBEUSEDNOW 323
+#define STRINGID_FORXCOMMAYZ 324
+#define STRINGID_USINGXTHEYOFZN 325
+#define STRINGID_PKMNUSEDXTOGETPUMPED 326
+#define STRINGID_PKMNSXMADEYUSELESS 327
+#define STRINGID_PKMNTRAPPEDBYSANDTOMB 328
+#define STRINGID_EMPTYSTRING4 329
+#define STRINGID_ABOOSTED 330
+#define STRINGID_PKMNSXINTENSIFIEDSUN 331
+#define STRINGID_PKMNMAKESGROUNDMISS 332
+#define STRINGID_YOUTHROWABALLNOWRIGHT 333
+#define STRINGID_PKMNSXTOOKATTACK 334
+#define STRINGID_PKMNCHOSEXASDESTINY 335
+#define STRINGID_PKMNLOSTFOCUS 336
+#define STRINGID_USENEXTPKMN 337
+#define STRINGID_PKMNFLEDUSINGITS 338
+#define STRINGID_PKMNFLEDUSING 339
+#define STRINGID_PKMNWASDRAGGEDOUT 340
+#define STRINGID_PREVENTEDFROMWORKING 341
+#define STRINGID_PKMNSITEMNORMALIZEDSTATUS 342
+#define STRINGID_TRAINER1USEDITEM 343
+#define STRINGID_BOXISFULL 344
+#define STRINGID_PKMNAVOIDEDATTACK 345
+#define STRINGID_PKMNSXMADEITINEFFECTIVE 346
+#define STRINGID_PKMNSXPREVENTSFLINCHING 347
+#define STRINGID_PKMNALREADYHASBURN 348
+#define STRINGID_STATSWONTDECREASE2 349
+#define STRINGID_PKMNSXBLOCKSY2 350
+#define STRINGID_PKMNSXWOREOFF 351
+#define STRINGID_PKMNRAISEDDEFALITTLE 352
+#define STRINGID_PKMNRAISEDSPDEFALITTLE 353
+#define STRINGID_THEWALLSHATTERED 354
+#define STRINGID_PKMNSXPREVENTSYSZ 355
+#define STRINGID_PKMNSXCUREDITSYPROBLEM 356
+#define STRINGID_ATTACKERCANTESCAPE 357
+#define STRINGID_PKMNOBTAINEDX 358
+#define STRINGID_PKMNOBTAINEDX2 359
+#define STRINGID_PKMNOBTAINEDXYOBTAINEDZ 360
+#define STRINGID_BUTNOEFFECT 361
+#define STRINGID_PKMNSXHADNOEFFECTONY 362
+#define STRINGID_TWOENEMIESDEFEATED 363
+#define STRINGID_TRAINER2LOSETEXT 364
+#define STRINGID_PKMNINCAPABLEOFPOWER 365
+#define STRINGID_GLINTAPPEARSINEYE 366
+#define STRINGID_PKMNGETTINGINTOPOSITION 367
+#define STRINGID_PKMNBEGANGROWLINGDEEPLY 368
+#define STRINGID_PKMNEAGERFORMORE 369
+#define STRINGID_DEFEATEDOPPONENTBYREFEREE 370
+#define STRINGID_LOSTTOOPPONENTBYREFEREE 371
+#define STRINGID_TIEDOPPONENTBYREFEREE 372
+#define STRINGID_QUESTIONFORFEITMATCH 373
+#define STRINGID_FORFEITEDMATCH 374
+#define STRINGID_PKMNTRANSFERREDSOMEONESPC 375
+#define STRINGID_PKMNTRANSFERREDLANETTESPC 376
+#define STRINGID_PKMNBOXSOMEONESPCFULL 377
+#define STRINGID_PKMNBOXLANETTESPCFULL 378
+#define STRINGID_TRAINER1WINTEXT 379
+#define STRINGID_TRAINER2WINTEXT 380
+
+#endif // GUARD_BATTLE_STRING_IDS_H
diff --git a/include/battle_util.h b/include/battle_util.h
new file mode 100644
index 000000000..15fa39d1a
--- /dev/null
+++ b/include/battle_util.h
@@ -0,0 +1,29 @@
+#ifndef GUARD_BATTLE_UTIL_H
+#define GUARD_BATTLE_UTIL_H
+
+#define BS_GET_TARGET 0
+#define BS_GET_ATTACKER 1
+#define BS_GET_EFFECT_BANK 2
+#define BS_GET_SCRIPTING_BANK 10
+#define BS_GET_PLAYER1 11
+#define BS_GET_OPPONENT1 12
+#define BS_GET_PLAYER2 13
+#define BS_GET_OPPONENT2 14
+
+void TryClearRageStatuses(void);
+void BattleScriptPush(const u8* BS_ptr);
+void PressurePPLoseOnUsingImprision(u8 bankAtk);
+void PressurePPLoseOnUsingPerishSong(u8 bankAtk);
+void sub_80155A4(u8);
+void CancelMultiTurnMoves(u8 bank);
+bool8 WasUnableToUseMove(u8 bank);
+void PrepareStringBattle(u16 stringId, u8 bank);
+void ResetSentPokesToOpponentValue(void);
+void sub_8015740(u8 bank);
+void sub_80157C4(u8 bank);
+bool8 HandleWishPerishSongOnTurnEnd(void);
+void BattleScriptExecute(const u8* BS_ptr);
+void BattleScriptPushCursorAndCallback(u8* BS_ptr);
+u8 IsMonDisobedient(void);
+
+#endif // GUARD_BATTLE_UTIL_H
diff --git a/include/cable_car_util.h b/include/cable_car_util.h
new file mode 100644
index 000000000..7126331a1
--- /dev/null
+++ b/include/cable_car_util.h
@@ -0,0 +1,13 @@
+#ifndef GUARD_CABLE_CAR_UTIL_H
+#define GUARD_CABLE_CAR_UTIL_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+
+void CableCarUtil_FillWrapped(void *dest, u16 value, u8 x, u8 y, u8 width, u8 height);
+void CableCarUtil_CopyWrapped(void *dest, const u16 *src, u8 x, u8 y, u8 width, u8 height);
+
+#endif //GUARD_CABLE_CAR_UTIL_H
diff --git a/include/cable_club.h b/include/cable_club.h
index a2fe46b30..2f509c9fc 100644
--- a/include/cable_club.h
+++ b/include/cable_club.h
@@ -20,5 +20,8 @@ void sub_8083B90(void);
void sub_8083BDC(void);
bool32 sub_8083BF4(u8 linkPlayerIndex);
void sub_8083C50(u8 taskId);
+#if DEBUG
+void debug_sub_808B838(u8);
+#endif
#endif // GUARD_CABLE_CLUB_H
diff --git a/include/clock.h b/include/clock.h
index 4e6560c91..5772145d3 100644
--- a/include/clock.h
+++ b/include/clock.h
@@ -3,6 +3,7 @@
// TODO: time of day and seconds in a day defines
+void InitTimeBasedEvents(void);
void DoTimeBasedEvents(void);
#endif
diff --git a/include/config.h b/include/config.h
index 6a77c4c74..796da359c 100644
--- a/include/config.h
+++ b/include/config.h
@@ -1,6 +1,28 @@
#ifndef GUARD_CONFIG_H
#define GUARD_CONFIG_H
+// In the Generation 3 games, Asserts were used in various debug builds.
+// Ruby/Sapphire and Emerald do not have these asserts while Fire Red
+// still has them in the ROM. This is because the developers forgot
+// to define NDEBUG before release, however this has been changed as
+// Ruby's actual debug build does not use the AGBPrint features.
+
+// To note, Ruby/Sapphire likely did not use AGBPrint. This is because
+// the german debug ROM of Ruby did not have any uses of AGBPrint and
+// the assert commands but instead a "crash" screen. This config exists
+// for convenience for the user of pokeruby and NOT because it is
+// authoritative. These additions are for user convenience based on
+// officially recommended SDK practices for debugging and is therefore
+// still in part authoritative.
+#define NDEBUG
+
+// To enable print debugging, comment out "#define NDEBUG". This allows
+// the various AGBPrint functions to be used. (See include/gba/isagbprint.h).
+// Some emulators support a debug console window: uncomment NoCashGBAPrint()
+// and NoCashGBAPrintf() in libisagbprn.c to use no$gba's own proprietary
+// printing system. Use NoCashGBAPrint() and NoCashGBAPrintf() like you
+// would normally use AGBPrint() and AGBPrintf().
+
#ifndef REVISION
#define REVISION 0
#endif
diff --git a/include/constants/battle_constants.h b/include/constants/battle_constants.h
index f7efb0dfd..49768f33e 100644
--- a/include/constants/battle_constants.h
+++ b/include/constants/battle_constants.h
@@ -1,6 +1,13 @@
#ifndef GUARD_CONSTANTS_BATTLE_CONSTANTS_H
#define GUARD_CONSTANTS_BATTLE_CONSTANTS_H
+// Bank sides
+#define SIDE_PLAYER 0x0
+#define SIDE_OPPONENT 0x1
+
+#define BIT_SIDE 0x1
+#define BIT_MON 0x2
+
#define STATUS_SLEEP 0x7
#define STATUS_POISON 0x8
#define STATUS_BURN 0x10
@@ -65,6 +72,7 @@
#define HITMARKER_PURSUIT_TRAP 0x00001000
#define HITMARKER_IGNORE_SAFEGUARD 0x00002000
#define HITMARKER_SYNCHRONISE_EFFECT 0x00004000
+#define HITMARKER_RUN 0x00008000
#define HITMARKER_IGNORE_ON_AIR 0x00010000
#define HITMARKER_IGNORE_UNDERGROUND 0x00020000
#define HITMARKER_IGNORE_UNDERWATER 0x00040000
@@ -75,6 +83,7 @@
#define HITMARKER_x800000 0x00800000
#define HITMARKER_GRUDGE 0x01000000
#define HITMARKER_OBEYS 0x02000000
+#define HITMARKER_x4000000 0x04000000
#define HITMARKER_x8000000 0x08000000
#define HITMARKER_FAINTED(bank) ((gBitTable[bank] << 0x1C))
#define HITMARKER_UNK(bank) ((0x10000000 << bank))
@@ -88,6 +97,11 @@
#define MOVESTATUS_ENDURED (1 << 6)
#define MOVESTATUS_HUNGON (1 << 7)
+#define IDENTITY_PLAYER_MON1 0
+#define IDENTITY_OPPONENT_MON1 1
+#define IDENTITY_PLAYER_MON2 2
+#define IDENTITY_OPPONENT_MON2 3
+
#define BATTLE_TYPE_DOUBLE 0x0001
#define BATTLE_TYPE_LINK 0x0002
#define BATTLE_TYPE_WILD 0x0004
@@ -117,6 +131,8 @@
#define BATTLE_OUT_OF_BALLS 0x8
#define BATTLE_OPPONENT_TELEPORTED 0xA
+#define OUTCOME_LINK_BATTLE_RUN 0x80
+
#define SIDE_STATUS_REFLECT (1 << 0)
#define SIDE_STATUS_LIGHTSCREEN (1 << 1)
#define SIDE_STATUS_X4 (1 << 2)
@@ -126,6 +142,22 @@
#define SIDE_STATUS_MIST (1 << 8)
#define SIDE_STATUS_SPIKES_DAMAGED (1 << 9)
+#define ACTION_USE_MOVE 0
+#define ACTION_USE_ITEM 1
+#define ACTION_SWITCH 2
+#define ACTION_RUN 3
+#define ACTION_WATCHES_CAREFULLY 4
+#define ACTION_SAFARI_ZONE_BALL 5
+#define ACTION_POKEBLOCK_CASE 6
+#define ACTION_GO_NEAR 7
+#define ACTION_SAFARI_ZONE_RUN 8
+#define ACTION_9 9
+#define ACTION_RUN_BATTLESCRIPT 10 // when executing an action
+#define ACTION_CANCEL_PARTNER 12 // when choosing an action
+#define ACTION_FINISHED 12 // when executing an action
+#define ACTION_NOTHING_FAINTED 13 // when choosing an action
+#define ACTION_INIT_VALUE 0xFF
+
#define TARGET_SELECTED_POKEMON 0
#define TARGET_SPECIAL (1 << 0)
#define TARGET_UNK2 (1 << 1)
@@ -192,6 +224,40 @@
#define WEATHER_SUN_ANY ((WEATHER_SUN_TEMPORARY | WEATHER_SUN_PERMANENT))
#define WEATHER_HAIL (1 << 7)
+#define MOVE_TARGET_SELECTED 0x0
+#define MOVE_TARGET_DEPENDS 0x1
+#define MOVE_TARGET_USER 0x2
+#define MOVE_TARGET_RANDOM 0x4
+#define MOVE_TARGET_x10 0x10
+#define MOVE_TARGET_BOTH 0x8
+#define MOVE_TARGET_FOES_AND_ALLY 0x20
+#define MOVE_TARGET_OPPONENTS_FIELD 0x40
+
+// array entries for battle communication
+#define MULTIUSE_STATE 0x0
+#define CURSOR_POSITION 0x1
+#define TASK_ID 0x1 // task Id and cursor position share the same field
+#define SPRITES_INIT_STATE1 0x1 // shares the Id as well
+#define SPRITES_INIT_STATE2 0x2
+#define MOVE_EFFECT_BYTE 0x3
+#define ACTIONS_CONFIRMED_COUNT 0x4
+#define MULTISTRING_CHOOSER 0x5
+#define MSG_DISPLAY 0x7
+#define BATTLE_COMMUNICATION_ENTRIES_COUNT 0x8
+
+#define BS_GET_TARGET 0
+#define BS_GET_ATTACKER 1
+#define BS_GET_EFFECT_BANK 2
+#define BS_GET_gBank1 3
+#define BS_GET_BANK_0 7
+#define BS_ATTACKER_WITH_PARTNER 4 // for atk98_status_icon_update
+#define BS_GET_ATTACKER_SIDE 8 // for atk1E_jumpifability
+#define BS_GET_NOT_ATTACKER_SIDE 9 // for atk1E_jumpifability
+#define BS_GET_SCRIPTING_BANK 10
+#define BS_GET_OPPONENT1 12
+#define BS_GET_PLAYER2 13
+#define BS_GET_OPPONENT2 14
+
// status animation table
#define B_ANIM_STATUS_PSN 0x0
#define B_ANIM_STATUS_CONFUSION 0x1
@@ -238,4 +304,12 @@
#define B_ANIM_SUBSTITUTE_TO_MON 0x5
#define B_ANIM_MON_TO_SUBSTITUTE 0x6
+// AI switch items
+#define AI_ITEM_FULL_RESTORE 1
+#define AI_ITEM_HEAL_HP 2
+#define AI_ITEM_CURE_CONDITION 3
+#define AI_ITEM_X_STAT 4
+#define AI_ITEM_GUARD_SPECS 5
+#define AI_ITEM_NOT_RECOGNIZABLE 6
+
#endif // GUARD_CONSTANTS_BATTLE_CONSTANTS_H
diff --git a/include/constants/decorations.h b/include/constants/decorations.h
index 2e3558721..c361ccdf1 100644
--- a/include/constants/decorations.h
+++ b/include/constants/decorations.h
@@ -123,4 +123,6 @@
#define DECOR_REGICE_DOLL 119
#define DECOR_REGISTEEL_DOLL 120
+#define DECOR_COUNT 121
+
#endif // GUARD_CONSTANTS_DECORATIONS_H
diff --git a/include/constants/easy_chat.h b/include/constants/easy_chat.h
index 12350aebe..215dac48c 100644
--- a/include/constants/easy_chat.h
+++ b/include/constants/easy_chat.h
@@ -1,7 +1,7 @@
#ifndef GUARD_CONSTANTS_EASY_CHAT_H
#define GUARD_CONSTANTS_EASY_CHAT_H
-#define EC_GROUP_POKEMON 0x0
+#define EC_GROUP_POKEMON_1 0x0
#define EC_GROUP_TRAINER 0x1
#define EC_GROUP_STATUS 0x2
#define EC_GROUP_BATTLE 0x3
@@ -1053,7 +1053,7 @@
#define EC_WORD_YOUNG (EC_GROUP_TRENDY_SAYING << 9) | 0x1f
#define EC_WORD_UGLY (EC_GROUP_TRENDY_SAYING << 9) | 0x20
-#define EC_POKEMON(mon) ((EC_GROUP_POKEMON << 9) | SPECIES_##mon)
+#define EC_POKEMON(mon) ((EC_GROUP_POKEMON_1 << 9) | SPECIES_##mon)
#define EC_POKEMON2(mon) ((EC_GROUP_POKEMON_2 << 9) | SPECIES_##mon)
#define EC_MOVE(move) ((EC_GROUP_MOVE_1 << 9) | MOVE_##move)
#define EC_MOVE2(move) ((EC_GROUP_MOVE_2 << 9) | MOVE_##move)
diff --git a/include/constants/items.h b/include/constants/items.h
index 48fba1427..6f54e6ee4 100644
--- a/include/constants/items.h
+++ b/include/constants/items.h
@@ -2,6 +2,8 @@
#define GUARD_CONSTANTS_ITEMS_H
#define ITEM_NONE 0
+
+// Balls
#define ITEM_MASTER_BALL 1
#define ITEM_ULTRA_BALL 2
#define ITEM_GREAT_BALL 3
@@ -14,6 +16,8 @@
#define ITEM_TIMER_BALL 10
#define ITEM_LUXURY_BALL 11
#define ITEM_PREMIER_BALL 12
+
+// Pokemon Items
#define ITEM_POTION 13
#define ITEM_ANTIDOTE 14
#define ITEM_BURN_HEAL 15
@@ -180,6 +184,8 @@
#define ITEM_0B0 176
#define ITEM_0B1 177
#define ITEM_0B2 178
+
+// hold items
#define ITEM_BRIGHT_POWDER 179
#define ITEM_WHITE_HERB 180
#define ITEM_MACHO_BRACE 181
@@ -260,6 +266,8 @@
#define ITEM_PINK_SCARF 256
#define ITEM_GREEN_SCARF 257
#define ITEM_YELLOW_SCARF 258
+
+// Key Items
#define ITEM_MACH_BIKE 259
#define ITEM_COIN_CASE 260
#define ITEM_ITEMFINDER 261
@@ -290,64 +298,68 @@
#define ITEM_ROOT_FOSSIL 286
#define ITEM_CLAW_FOSSIL 287
#define ITEM_DEVON_SCOPE 288
-#define ITEM_TM01 289
-#define ITEM_TM02 290
-#define ITEM_TM03 291
-#define ITEM_TM04 292
-#define ITEM_TM05 293
-#define ITEM_TM06 294
-#define ITEM_TM07 295
-#define ITEM_TM08 296
-#define ITEM_TM09 297
-#define ITEM_TM10 298
-#define ITEM_TM11 299
-#define ITEM_TM12 300
-#define ITEM_TM13 301
-#define ITEM_TM14 302
-#define ITEM_TM15 303
-#define ITEM_TM16 304
-#define ITEM_TM17 305
-#define ITEM_TM18 306
-#define ITEM_TM19 307
-#define ITEM_TM20 308
-#define ITEM_TM21 309
-#define ITEM_TM22 310
-#define ITEM_TM23 311
-#define ITEM_TM24 312
-#define ITEM_TM25 313
-#define ITEM_TM26 314
-#define ITEM_TM27 315
-#define ITEM_TM28 316
-#define ITEM_TM29 317
-#define ITEM_TM30 318
-#define ITEM_TM31 319
-#define ITEM_TM32 320
-#define ITEM_TM33 321
-#define ITEM_TM34 322
-#define ITEM_TM35 323
-#define ITEM_TM36 324
-#define ITEM_TM37 325
-#define ITEM_TM38 326
-#define ITEM_TM39 327
-#define ITEM_TM40 328
-#define ITEM_TM41 329
-#define ITEM_TM42 330
-#define ITEM_TM43 331
-#define ITEM_TM44 332
-#define ITEM_TM45 333
-#define ITEM_TM46 334
-#define ITEM_TM47 335
-#define ITEM_TM48 336
-#define ITEM_TM49 337
-#define ITEM_TM50 338
-#define ITEM_HM01 339
-#define ITEM_HM02 340
-#define ITEM_HM03 341
-#define ITEM_HM04 342
-#define ITEM_HM05 343
-#define ITEM_HM06 344
-#define ITEM_HM07 345
-#define ITEM_HM08 346
+
+// TMs/HMs
+#define ITEM_TM01_FOCUS_PUNCH 289
+#define ITEM_TM02_DRAGON_CLAW 290
+#define ITEM_TM03_WATER_PULSE 291
+#define ITEM_TM04_CALM_MIND 292
+#define ITEM_TM05_ROAR 293
+#define ITEM_TM06_TOXIC 294
+#define ITEM_TM07_HAIL 295
+#define ITEM_TM08_BULK_UP 296
+#define ITEM_TM09_BULLET_SEED 297
+#define ITEM_TM10_HIDDEN_POWER 298
+#define ITEM_TM11_SUNNY_DAY 299
+#define ITEM_TM12_TAUNT 300
+#define ITEM_TM13_ICE_BEAM 301
+#define ITEM_TM14_BLIZZARD 302
+#define ITEM_TM15_HYPER_BEAM 303
+#define ITEM_TM16_LIGHT_SCREEN 304
+#define ITEM_TM17_PROTECT 305
+#define ITEM_TM18_RAIN_DANCE 306
+#define ITEM_TM19_GIGA_DRAIN 307
+#define ITEM_TM20_SAFEGUARD 308
+#define ITEM_TM21_FRUSTRATION 309
+#define ITEM_TM22_SOLARBEAM 310
+#define ITEM_TM23_IRON_TAIL 311
+#define ITEM_TM24_THUNDERBOLT 312
+#define ITEM_TM25_THUNDER 313
+#define ITEM_TM26_EARTHQUAKE 314
+#define ITEM_TM27_RETURN 315
+#define ITEM_TM28_DIG 316
+#define ITEM_TM29_PSYCHIC 317
+#define ITEM_TM30_SHADOW_BALL 318
+#define ITEM_TM31_BRICK_BREAK 319
+#define ITEM_TM32_DOUBLE_TEAM 320
+#define ITEM_TM33_REFLECT 321
+#define ITEM_TM34_SHOCK_WAVE 322
+#define ITEM_TM35_FLAMETHROWER 323
+#define ITEM_TM36_SLUDGE_BOMB 324
+#define ITEM_TM37_SANDSTORM 325
+#define ITEM_TM38_FIRE_BLAST 326
+#define ITEM_TM39_ROCK_TOMB 327
+#define ITEM_TM40_AERIAL_ACE 328
+#define ITEM_TM41_TORMENT 329
+#define ITEM_TM42_FACADE 330
+#define ITEM_TM43_SECRET_POWER 331
+#define ITEM_TM44_REST 332
+#define ITEM_TM45_ATTRACT 333
+#define ITEM_TM46_THIEF 334
+#define ITEM_TM47_STEEL_WING 335
+#define ITEM_TM48_SKILL_SWAP 336
+#define ITEM_TM49_SNATCH 337
+#define ITEM_TM50_OVERHEAT 338
+#define ITEM_HM01_CUT 339
+#define ITEM_HM02_FLY 340
+#define ITEM_HM03_SURF 341
+#define ITEM_HM04_STRENGTH 342
+#define ITEM_HM05_FLASH 343
+#define ITEM_HM06_ROCK_SMASH 344
+#define ITEM_HM07_WATERFALL 345
+#define ITEM_HM08_DIVE 346
+
+// Unknown
#define ITEM_15B 347
#define ITEM_15C 348
@@ -386,4 +398,9 @@
#define NUM_TECHNICAL_MACHINES 50
#define NUM_HIDDEN_MACHINES 8
+// Check if the item is one that can be used on a Pokemon.
+#define IS_POKEMON_ITEM(item) ((item) >= ITEM_POTION && (item) <= ITEM_0B2)
+
+#define IS_ITEM_MAIL(item) ((item) >= ITEM_ORANGE_MAIL && (item) <= ITEM_RETRO_MAIL)
+
#endif // GUARD_CONSTANTS_ITEMS_H
diff --git a/include/constants/songs.h b/include/constants/songs.h
index 5225f5899..920873a7c 100644
--- a/include/constants/songs.h
+++ b/include/constants/songs.h
@@ -2,371 +2,371 @@
#define GUARD_CONSTANTS_SONGS_H
#define SE_STOP 0
-#define SE_KAIFUKU 1
-#define SE_PC_LOGON 2
-#define SE_PC_OFF 3
-#define SE_PC_ON 4
-#define SE_SELECT 5
-#define SE_WIN_OPEN 6
-#define SE_WALL_HIT 7
-#define SE_DOOR 8
-#define SE_KAIDAN 9
-#define SE_DANSA 10
-#define SE_JITENSYA 11
-#define SE_KOUKA_L 12
-#define SE_KOUKA_M 13
-#define SE_KOUKA_H 14
-#define SE_BOWA2 15
-#define SE_POKE_DEAD 16
-#define SE_NIGERU 17
-#define SE_JIDO_DOA 18
-#define SE_NAMINORI 19
-#define SE_BAN 20
-#define SE_PIN 21
-#define SE_BOO 22
-#define SE_BOWA 23
-#define SE_JYUNI 24
-#define SE_A 25
-#define SE_I 26
-#define SE_U 27
-#define SE_E 28
-#define SE_O 29
-#define SE_N 30
-#define SE_SEIKAI 31
-#define SE_HAZURE 32
-#define SE_EXP 33
-#define SE_JITE_PYOKO 34
+#define SE_KAIFUKU 1 // Healing Item
+#define SE_PC_LOGON 2 // PC Logon
+#define SE_PC_OFF 3 // PC Shutdown
+#define SE_PC_ON 4 // PC Startup
+#define SE_SELECT 5 // Cursor Selection
+#define SE_WIN_OPEN 6 // Start Menu
+#define SE_WALL_HIT 7 // Wall Bump
+#define SE_DOOR 8 // Opening Door
+#define SE_KAIDAN 9 // Stairs
+#define SE_DANSA 10 // Ledge
+#define SE_JITENSYA 11 // Bicycle Bell
+#define SE_KOUKA_L 12 // Not Very Effective
+#define SE_KOUKA_M 13 // Normal Effectiveness
+#define SE_KOUKA_H 14 // Super Effective
+#define SE_BOWA2 15 // Pokémon Withdrawl
+#define SE_POKE_DEAD 16 // Pokémon Fainted
+#define SE_NIGERU 17 // Flee from Wild Battle
+#define SE_JIDO_DOA 18 // Pokémon Center Door
+#define SE_NAMINORI 19 // Briney's Ship
+#define SE_BAN 20 // Bang
+#define SE_PIN 21 // Exclamation Bubble
+#define SE_BOO 22 // Contest Jam
+#define SE_BOWA 23 // Giving Poké Ball to Nurse, Poké Ball Wiggle
+#define SE_JYUNI 24 // Places in Contest Appearing
+#define SE_A 25 // Bard A
+#define SE_I 26 // Bard I
+#define SE_U 27 // Bard U
+#define SE_E 28 // Bard E
+#define SE_O 29 // Bard O
+#define SE_N 30 // Bard N
+#define SE_SEIKAI 31 // Success
+#define SE_HAZURE 32 // Failure
+#define SE_EXP 33 // Exp. Bar
+#define SE_JITE_PYOKO 34 // Bunny Hop
#define SE_MU_PACHI 35
-#define SE_TK_KASYA 36
+#define SE_TK_KASYA 36 // Mossdeep Gym/Trick House Switch
#define SE_FU_ZAKU 37
#define SE_FU_ZAKU2 38
-#define SE_FU_ZUZUZU 39
-#define SE_RU_GASHIN 40
-#define SE_RU_GASYAN 41
-#define SE_RU_BARI 42
-#define SE_RU_HYUU 43
+#define SE_FU_ZUZUZU 39 // Lavaridge Gym Warp
+#define SE_RU_GASHIN 40 // Sootopolis Gym - Stairs Appear
+#define SE_RU_GASYAN 41 // Sootopolis Gym - Ice Breaking
+#define SE_RU_BARI 42 // Sootopolis Gym - Stepping on Ice
+#define SE_RU_HYUU 43 // Falling Down
#define SE_KI_GASYAN 44
-#define SE_TK_WARPIN 45
-#define SE_TK_WARPOUT 46
-#define SE_TU_SAA 47
-#define SE_HI_TURUN 48
-#define SE_TRACK_MOVE 49
-#define SE_TRACK_STOP 50
-#define SE_TRACK_HAIK 51
-#define SE_TRACK_DOOR 52
+#define SE_TK_WARPIN 45 // Warp In
+#define SE_TK_WARPOUT 46 // Warp Out
+#define SE_TU_SAA 47 // Repel
+#define SE_HI_TURUN 48 // Moving Obstacle in Fortree Gym
+#define SE_TRACK_MOVE 49 // Moving Truck
+#define SE_TRACK_STOP 50 // Moving Truck Stop
+#define SE_TRACK_HAIK 51 // Moving Truck Unload
+#define SE_TRACK_DOOR 52 // Moving Truck Door
#define SE_MOTER 53
#define SE_CARD 54
-#define SE_SAVE 55
-#define SE_KON 56
-#define SE_KON2 57
-#define SE_KON3 58
-#define SE_KON4 59
-#define SE_SUIKOMU 60
-#define SE_NAGERU 61
-#define SE_TOY_C 62
-#define SE_TOY_D 63
-#define SE_TOY_E 64
-#define SE_TOY_F 65
-#define SE_TOY_G 66
-#define SE_TOY_A 67
-#define SE_TOY_B 68
-#define SE_TOY_C1 69
-#define SE_MIZU 70
-#define SE_HASHI 71
-#define SE_DAUGI 72
-#define SE_PINPON 73
-#define SE_FUUSEN1 74
-#define SE_FUUSEN2 75
-#define SE_FUUSEN3 76
-#define SE_TOY_KABE 77
-#define SE_TOY_DANGO 78
-#define SE_DOKU 79
-#define SE_ESUKA 80
-#define SE_T_AME 81
-#define SE_T_AME_E 82
-#define SE_T_OOAME 83
-#define SE_T_OOAME_E 84
-#define SE_T_KOAME 85
-#define SE_T_KOAME_E 86
-#define SE_T_KAMI 87
-#define SE_T_KAMI2 88
-#define SE_ELEBETA 89
-#define SE_HINSI 90
-#define SE_EXPMAX 91
-#define SE_TAMAKORO 92
-#define SE_TAMAKORO_E 93
+#define SE_SAVE 55 // Save
+#define SE_KON 56 // Poké Ball Bounce 1
+#define SE_KON2 57 // Poké Ball Bounce 2
+#define SE_KON3 58 // Poké Ball Bounce 3
+#define SE_KON4 59 // Poké Ball Bounce 4
+#define SE_SUIKOMU 60 // Poké Ball Trade
+#define SE_NAGERU 61 // Poké Ball Throw
+#define SE_TOY_C 62 // Note C
+#define SE_TOY_D 63 // Note D
+#define SE_TOY_E 64 // Note E
+#define SE_TOY_F 65 // Note F
+#define SE_TOY_G 66 // Note G
+#define SE_TOY_A 67 // Note A
+#define SE_TOY_B 68 // Note B
+#define SE_TOY_C1 69 // Note High C
+#define SE_MIZU 70 // Puddle
+#define SE_HASHI 71 // Boardwalk
+#define SE_DAUGI 72 // Slots Credits
+#define SE_PINPON 73 // Ding-dong!
+#define SE_FUUSEN1 74 // Red Balloon
+#define SE_FUUSEN2 75 // Blue Balloon
+#define SE_FUUSEN3 76 // Yellow Balloon
+#define SE_TOY_KABE 77 // Breakable Door
+#define SE_TOY_DANGO 78 // Mud Ball
+#define SE_DOKU 79 // Overworld Poison Damage
+#define SE_ESUKA 80 // Escalator
+#define SE_T_AME 81 // Rain
+#define SE_T_AME_E 82 // Rain stop
+#define SE_T_OOAME 83 // Heavy Rain
+#define SE_T_OOAME_E 84 // Heavy Rain Stop
+#define SE_T_KOAME 85 // Light Rain
+#define SE_T_KOAME_E 86 // Light Rain Stop
+#define SE_T_KAMI 87 // Thunder
+#define SE_T_KAMI2 88 // Thunder 2
+#define SE_ELEBETA 89 // Elevator
+#define SE_HINSI 90 // Low Health
+#define SE_EXPMAX 91 // Exp. Max
+#define SE_TAMAKORO 92 // Roulette Ball
+#define SE_TAMAKORO_E 93 // Roulette Ball 2
#define SE_BASABASA 94
-#define SE_REGI 95
-#define SE_C_GAJI 96
-#define SE_C_MAKU_U 97
-#define SE_C_MAKU_D 98
+#define SE_REGI 95 // Cash Register
+#define SE_C_GAJI 96 // Contest Hearts
+#define SE_C_MAKU_U 97 // Contest Curtain rise
+#define SE_C_MAKU_D 98 // Contest Curtain fall
#define SE_C_PASI 99
#define SE_C_SYU 100
-#define SE_C_PIKON 101
-#define SE_REAPOKE 102
-#define SE_OP_BASYU 103
-#define SE_BT_START 104
-#define SE_DENDOU 105
-#define SE_JIHANKI 106
-#define SE_TAMA 107
-#define SE_Z_SCROLL 108
-#define SE_Z_PAGE 109
-#define SE_PN_ON 110
-#define SE_PN_OFF 111
-#define SE_Z_SEARCH 112
-#define SE_TAMAGO 113
-#define SE_TB_START 114
-#define SE_TB_KON 115
-#define SE_TB_KARA 116
+#define SE_C_PIKON 101 // Pokémon Appears in Contest
+#define SE_REAPOKE 102 // Shiny Pokémon
+#define SE_OP_BASYU 103 // Opening Movie -> Title Screen whoosh
+#define SE_BT_START 104 // Battle Mugshot whoosh
+#define SE_DENDOU 105 // Audience Cheering
+#define SE_JIHANKI 106 // Vending Machine
+#define SE_TAMA 107 // Orb Used
+#define SE_Z_SCROLL 108 // Pokédex Scrolling
+#define SE_Z_PAGE 109 // Pokédex Page
+#define SE_PN_ON 110 // PokéNav On
+#define SE_PN_OFF 111 // PokéNav Off
+#define SE_Z_SEARCH 112 // Pokédex Search
+#define SE_TAMAGO 113 // Egg hatch
+#define SE_TB_START 114 // Battle - Poké Ball Tray slide in
+#define SE_TB_KON 115 // Battle - Poké Ball Tray ball sound
+#define SE_TB_KARA 116 // Battle - Poké Ball Tray slide out
#define SE_BIDORO 117
-#define SE_W085 118
-#define SE_W085B 119
-#define SE_W231 120
-#define SE_W171 121
-#define SE_W233 122
-#define SE_W233B 123
-#define SE_W145 124
-#define SE_W145B 125
-#define SE_W145C 126
-#define SE_W240 127
-#define SE_W015 128
-#define SE_W081 129
-#define SE_W081B 130
-#define SE_W088 131
-#define SE_W016 132
-#define SE_W016B 133
-#define SE_W003 134
-#define SE_W104 135
-#define SE_W013 136
-#define SE_W196 137
-#define SE_W086 138
-#define SE_W004 139
-#define SE_W025 140
-#define SE_W025B 141
-#define SE_W152 142
-#define SE_W026 143
-#define SE_W172 144
-#define SE_W172B 145
-#define SE_W053 146
-#define SE_W007 147
-#define SE_W092 148
-#define SE_W221 149
-#define SE_W221B 150
-#define SE_W052 151
-#define SE_W036 152
-#define SE_W059 153
-#define SE_W059B 154
-#define SE_W010 155
-#define SE_W011 156
-#define SE_W017 157
-#define SE_W019 158
-#define SE_W028 159
-#define SE_W013B 160
-#define SE_W044 161
-#define SE_W029 162
-#define SE_W057 163
-#define SE_W056 164
-#define SE_W250 165
-#define SE_W030 166
-#define SE_W039 167
-#define SE_W054 168
-#define SE_W077 169
-#define SE_W020 170
-#define SE_W082 171
-#define SE_W047 172
-#define SE_W195 173
-#define SE_W006 174
-#define SE_W091 175
-#define SE_W146 176
-#define SE_W120 177
-#define SE_W153 178
-#define SE_W071B 179
-#define SE_W071 180
-#define SE_W103 181
-#define SE_W062 182
-#define SE_W062B 183
-#define SE_W048 184
-#define SE_W187 185
-#define SE_W118 186
-#define SE_W155 187
-#define SE_W122 188
-#define SE_W060 189
-#define SE_W185 190
-#define SE_W014 191
-#define SE_W043 192
-#define SE_W207 193
-#define SE_W207B 194
-#define SE_W215 195
-#define SE_W109 196
-#define SE_W173 197
-#define SE_W280 198
-#define SE_W202 199
-#define SE_W060B 200
-#define SE_W076 201
-#define SE_W080 202
-#define SE_W100 203
-#define SE_W107 204
-#define SE_W166 205
-#define SE_W129 206
-#define SE_W115 207
-#define SE_W112 208
-#define SE_W197 209
-#define SE_W199 210
-#define SE_W236 211
-#define SE_W204 212
-#define SE_W268 213
-#define SE_W070 214
-#define SE_W063 215
-#define SE_W127 216
-#define SE_W179 217
-#define SE_W151 218
-#define SE_W201 219
-#define SE_W161 220
-#define SE_W161B 221
-#define SE_W227 222
-#define SE_W227B 223
-#define SE_W226 224
-#define SE_W208 225
-#define SE_W213 226
-#define SE_W213B 227
-#define SE_W234 228
-#define SE_W260 229
-#define SE_W328 230
-#define SE_W320 231
-#define SE_W255 232
-#define SE_W291 233
-#define SE_W089 234
-#define SE_W239 235
-#define SE_W230 236
-#define SE_W281 237
-#define SE_W327 238
-#define SE_W287 239
-#define SE_W257 240
-#define SE_W253 241
-#define SE_W258 242
-#define SE_W322 243
-#define SE_W298 244
-#define SE_W287B 245
-#define SE_W114 246
-#define SE_W063B 247
+#define SE_W085 118 // Thunderbolt
+#define SE_W085B 119 // Thunderbolt 2
+#define SE_W231 120 // Harden
+#define SE_W171 121 // Nightmare
+#define SE_W233 122 // Vital Throw
+#define SE_W233B 123 // Vital Throw 2
+#define SE_W145 124 // Bubble
+#define SE_W145B 125 // Bubble 2
+#define SE_W145C 126 // Bubble 3
+#define SE_W240 127 // Rain Dance
+#define SE_W015 128 // Cut
+#define SE_W081 129 // String Shot
+#define SE_W081B 130 // String Shot 2
+#define SE_W088 131 // Rock Throw
+#define SE_W016 132 // Gust
+#define SE_W016B 133 // Gust 2
+#define SE_W003 134 // DoubleSlap
+#define SE_W104 135 // Double Team
+#define SE_W013 136 // Razor Wind
+#define SE_W196 137 // Icy Wind
+#define SE_W086 138 // Thunder Wave
+#define SE_W004 139 // Comet Punch
+#define SE_W025 140 // Mega Kick
+#define SE_W025B 141 // Mega Kick 2
+#define SE_W152 142 // Crabhammer
+#define SE_W026 143 // Jump Kick
+#define SE_W172 144 // Flame Wheel
+#define SE_W172B 145 // Flame Wheel 2
+#define SE_W053 146 // Flamethrower
+#define SE_W007 147 // Fire Punch
+#define SE_W092 148 // Toxic
+#define SE_W221 149 // Sacred Fire
+#define SE_W221B 150 // Sacred Fire 2
+#define SE_W052 151 // Ember
+#define SE_W036 152 // Take Down
+#define SE_W059 153 // Blizzard
+#define SE_W059B 154 // Blizzard 2
+#define SE_W010 155 // Scratch
+#define SE_W011 156 // Vicegrip
+#define SE_W017 157 // Wing Attack
+#define SE_W019 158 // Fly
+#define SE_W028 159 // Sand-Attack
+#define SE_W013B 160 // Razor Wind 2
+#define SE_W044 161 // Bite
+#define SE_W029 162 // Headbutt
+#define SE_W057 163 // Surf
+#define SE_W056 164 // Hydro Pump
+#define SE_W250 165 // Whirlpool
+#define SE_W030 166 // Horn Attack
+#define SE_W039 167 // Tail Whip
+#define SE_W054 168 // Mist
+#define SE_W077 169 // PoisonPowder
+#define SE_W020 170 // Bind
+#define SE_W082 171 // Dragon Rage
+#define SE_W047 172 // Sing
+#define SE_W195 173 // Perish Song
+#define SE_W006 174 // Pay Day
+#define SE_W091 175 // Dig
+#define SE_W146 176 // Dizzy Punch
+#define SE_W120 177 // Self-Destruct
+#define SE_W153 178 // Explosion
+#define SE_W071B 179 // Absorb 2
+#define SE_W071 180 // Absorb
+#define SE_W103 181 // Screech
+#define SE_W062 182 // BubbleBeam
+#define SE_W062B 183 // BubbleBeam 2
+#define SE_W048 184 // Supersonic
+#define SE_W187 185 // Belly Drum
+#define SE_W118 186 // Metronome
+#define SE_W155 187 // Bonemerang
+#define SE_W122 188 // Lick
+#define SE_W060 189 // Psybeam
+#define SE_W185 190 // Faint Attack
+#define SE_W014 191 // Swords Dance
+#define SE_W043 192 // Leer
+#define SE_W207 193 // Swagger
+#define SE_W207B 194 // Swagger 2
+#define SE_W215 195 // Heal Bell
+#define SE_W109 196 // Confuse Ray
+#define SE_W173 197 // Snore
+#define SE_W280 198 // Brick Break
+#define SE_W202 199 // Giga Drain
+#define SE_W060B 200 // Psybeam 2
+#define SE_W076 201 // SolarBeam
+#define SE_W080 202 // Petal Dance
+#define SE_W100 203 // Teleport
+#define SE_W107 204 // Minimize
+#define SE_W166 205 // Sketch
+#define SE_W129 206 // Swift
+#define SE_W115 207 // Reflect
+#define SE_W112 208 // Barrier
+#define SE_W197 209 // Detect
+#define SE_W199 210 // Lock-On
+#define SE_W236 211 // Moonlight
+#define SE_W204 212 // Charm
+#define SE_W268 213 // Charge
+#define SE_W070 214 // Strength
+#define SE_W063 215 // Hyper Beam
+#define SE_W127 216 // Waterfall
+#define SE_W179 217 // Reversal
+#define SE_W151 218 // Acid Armor
+#define SE_W201 219 // Sandstorm
+#define SE_W161 220 // Tri-Attack
+#define SE_W161B 221 // Tri-Attack 2
+#define SE_W227 222 // Encore
+#define SE_W227B 223 // Encore 2
+#define SE_W226 224 // Baton Pass
+#define SE_W208 225 // Milk Drink
+#define SE_W213 226 // Attract
+#define SE_W213B 227 // Attract 2
+#define SE_W234 228 // Morning Sun
+#define SE_W260 229 // Flatter
+#define SE_W328 230 // Sand Tomb
+#define SE_W320 231 // GrassWhistle
+#define SE_W255 232 // Spit Up
+#define SE_W291 233 // Dive
+#define SE_W089 234 // Earthquake
+#define SE_W239 235 // Twister
+#define SE_W230 236 // Sweet Scent
+#define SE_W281 237 // Yawn
+#define SE_W327 238 // Sky Uppercut
+#define SE_W287 239 // Stat Increased
+#define SE_W257 240 // Heat Wave
+#define SE_W253 241 // Uproar
+#define SE_W258 242 // Hail
+#define SE_W322 243 // Cosmic Power
+#define SE_W298 244 // Teeter Dance
+#define SE_W287B 245 // Stat Decreased
+#define SE_W114 246 // Haze
+#define SE_W063B 247 // Hyper Beam 2
#define BGM_STOP 349
-#define BGM_TETSUJI 350
-#define BGM_FIELD13 351
-#define BGM_KACHI22 352
-#define BGM_KACHI2 353
-#define BGM_KACHI3 354
-#define BGM_KACHI5 355
-#define BGM_PCC 356
-#define BGM_NIBI 357
-#define BGM_SUIKUN 358
-#define BGM_DOORO1 359
-#define BGM_DOORO_X1 360
-#define BGM_DOORO_X3 361
-#define BGM_MACHI_S2 362
-#define BGM_MACHI_S4 363
-#define BGM_GIM 364
-#define BGM_NAMINORI 365
-#define BGM_DAN01 366
-#define BGM_FANFA1 367
-#define BGM_ME_ASA 368
-#define BGM_ME_BACHI 369
-#define BGM_FANFA4 370
-#define BGM_FANFA5 371
-#define BGM_ME_WAZA 372
-#define BGM_BIJYUTU 373
-#define BGM_DOORO_X4 374
-#define BGM_FUNE_KAN 375
-#define BGM_ME_SHINKA 376
-#define BGM_SHINKA 377
-#define BGM_ME_WASURE 378
-#define BGM_SYOUJOEYE 379
-#define BGM_BOYEYE 380
-#define BGM_DAN02 381
-#define BGM_MACHI_S3 382
-#define BGM_ODAMAKI 383
-#define BGM_B_TOWER 384
-#define BGM_SWIMEYE 385
-#define BGM_DAN03 386
-#define BGM_ME_KINOMI 387
-#define BGM_ME_TAMA 388
-#define BGM_ME_B_BIG 389
-#define BGM_ME_B_SMALL 390
-#define BGM_ME_ZANNEN 391
-#define BGM_BD_TIME 392
-#define BGM_TEST1 393
-#define BGM_TEST2 394
-#define BGM_TEST3 395
-#define BGM_TEST4 396
-#define BGM_TEST 397
-#define BGM_GOMACHI0 398
-#define BGM_GOTOWN 399
-#define BGM_POKECEN 400
-#define BGM_NEXTROAD 401
-#define BGM_GRANROAD 402
-#define BGM_CYCLING 403
-#define BGM_FRIENDLY 404
-#define BGM_MISHIRO 405
-#define BGM_TOZAN 406
-#define BGM_GIRLEYE 407
-#define BGM_MINAMO 408
-#define BGM_ASHROAD 409
-#define BGM_EVENT0 410
-#define BGM_DEEPDEEP 411
-#define BGM_KACHI1 412
-#define BGM_TITLE3 413
-#define BGM_DEMO1 414
-#define BGM_GIRL_SUP 415
-#define BGM_HAGESHII 416
-#define BGM_KAKKOII 417
-#define BGM_KAZANBAI 418
-#define BGM_AQA_0 419
-#define BGM_TSURETEK 420
-#define BGM_BOY_SUP 421
-#define BGM_RAINBOW 422
-#define BGM_AYASII 423
-#define BGM_KACHI4 424
-#define BGM_ROPEWAY 425
-#define BGM_CASINO 426
-#define BGM_HIGHTOWN 427
-#define BGM_SAFARI 428
-#define BGM_C_ROAD 429
-#define BGM_AJITO 430
-#define BGM_M_BOAT 431
-#define BGM_M_DUNGON 432
-#define BGM_FINECITY 433
-#define BGM_MACHUPI 434
-#define BGM_P_SCHOOL 435
-#define BGM_DENDOU 436
-#define BGM_TONEKUSA 437
-#define BGM_MABOROSI 438
-#define BGM_CON_FAN 439
-#define BGM_CONTEST0 440
-#define BGM_MGM0 441
-#define BGM_T_BATTLE 442
-#define BGM_OOAME 443
-#define BGM_HIDERI 444
-#define BGM_RUNECITY 445
-#define BGM_CON_K 446
-#define BGM_EIKOU_R 447
-#define BGM_KARAKURI 448
-#define BGM_HUTAGO 449
-#define BGM_SITENNOU 450
-#define BGM_YAMA_EYE 451
-#define BGM_CONLOBBY 452
-#define BGM_INTER_V 453
-#define BGM_DAIGO 454
-#define BGM_THANKFOR 455
-#define BGM_END 456
-#define BGM_BATTLE27 457
-#define BGM_BATTLE31 458
-#define BGM_BATTLE20 459
-#define BGM_BATTLE32 460
-#define BGM_BATTLE33 461
-#define BGM_BATTLE36 462
-#define BGM_BATTLE34 463
-#define BGM_BATTLE35 464
-#define BGM_BATTLE38 465
-#define BGM_BATTLE30 466
+#define BGM_TETSUJI 350 // Littleroot Town Test 'TETSUJI'
+#define BGM_FIELD13 351 // GSC - Route 38
+#define BGM_KACHI22 352 // Wild Pokémon Defeated
+#define BGM_KACHI2 353 // Wild Pokémon Defeated with Intro
+#define BGM_KACHI3 354 // Gym Leader Defeated
+#define BGM_KACHI5 355 // Victory! Elite Four
+#define BGM_PCC 356 // Crystal - Pokémon Communication Center
+#define BGM_NIBI 357 // GSC - Viridian/Saffron/Pewter/etc
+#define BGM_SUIKUN 358 // Crystal - Battle! Legendary Beasts
+#define BGM_DOORO1 359 // Route 101
+#define BGM_DOORO_X1 360 // Route 110
+#define BGM_DOORO_X3 361 // Route 120
+#define BGM_MACHI_S2 362 // Petalburg City
+#define BGM_MACHI_S4 363 // Oldale Town
+#define BGM_GIM 364 // Gym
+#define BGM_NAMINORI 365 // Surfing
+#define BGM_DAN01 366 // Caves and Darkness
+#define BGM_FANFA1 367 // Level Up!
+#define BGM_ME_ASA 368 // Pokémon Healed
+#define BGM_ME_BACHI 369 // Obtained a Badge!
+#define BGM_FANFA4 370 // Obtained an Item!
+#define BGM_FANFA5 371 // Your Pokémon Just Evolved!
+#define BGM_ME_WAZA 372 // Obtained a TM/HM!
+#define BGM_BIJYUTU 373 // Lilycove Musseum
+#define BGM_DOORO_X4 374 // Route 122/Intro
+#define BGM_FUNE_KAN 375 // Slateport Museum
+#define BGM_ME_SHINKA 376 // Evolution Intro
+#define BGM_SHINKA 377 // Evolution
+#define BGM_ME_WASURE 378 // Move Deleted
+#define BGM_SYOUJOEYE 379 // Encounter! Tuber
+#define BGM_BOYEYE 380 // Encounter! Boy
+#define BGM_DAN02 381 // Abandoned Ship
+#define BGM_MACHI_S3 382 // Fortree City
+#define BGM_ODAMAKI 383 // Professor Birch's Lab
+#define BGM_B_TOWER 384 // Battle Tower (RS)
+#define BGM_SWIMEYE 385 // Encounter! Swimmer
+#define BGM_DAN03 386 // Meteor Falls
+#define BGM_ME_KINOMI 387 // Obtained a Berry!
+#define BGM_ME_TAMA 388 // Awakening the Super-Ancient Pokémon
+#define BGM_ME_B_BIG 389 // Slots Jackpot!
+#define BGM_ME_B_SMALL 390 // Slots Victory!
+#define BGM_ME_ZANNEN 391 // Too bad!
+#define BGM_BD_TIME 392 // Roulette!
+#define BGM_TEST1 393 // Contest Test 1
+#define BGM_TEST2 394 // Contest Test 2
+#define BGM_TEST3 395 // Contest Test 3
+#define BGM_TEST4 396 // Contest Test 4
+#define BGM_TEST 397 // Encounter! Gentleman (Test?)
+#define BGM_GOMACHI0 398 // Verdanturf Town
+#define BGM_GOTOWN 399 // Rustboro City
+#define BGM_POKECEN 400 // Pokémon Center
+#define BGM_NEXTROAD 401 // Route 104
+#define BGM_GRANROAD 402 // Route 119
+#define BGM_CYCLING 403 // Cycling
+#define BGM_FRIENDLY 404 // Pokémart
+#define BGM_MISHIRO 405 // Littleroot Town
+#define BGM_TOZAN 406 // Sky Pillar
+#define BGM_GIRLEYE 407 // Encounter! Girl
+#define BGM_MINAMO 408 // Lilycove City
+#define BGM_ASHROAD 409 // Route 111
+#define BGM_EVENT0 410 // Help me!
+#define BGM_DEEPDEEP 411 // Underwater
+#define BGM_KACHI1 412 // Victory! Trainer
+#define BGM_TITLE3 413 // Title Screen
+#define BGM_DEMO1 414 // Opening Movie
+#define BGM_GIRL_SUP 415 // Encounter! May
+#define BGM_HAGESHII 416 // Encounter! Biker
+#define BGM_KAKKOII 417 // Encounter! Electric Trainer
+#define BGM_KAZANBAI 418 // Route 113
+#define BGM_AQA_0 419 // Encounter! Team Aqua
+#define BGM_TSURETEK 420 // Follow Me!
+#define BGM_BOY_SUP 421 // Encounter! Brendan
+#define BGM_RAINBOW 422 // Ever Grande City
+#define BGM_AYASII 423 // Encounter! Psychic
+#define BGM_KACHI4 424 // Victory! Aqua/Magma Grunt
+#define BGM_ROPEWAY 425 // Cable Car
+#define BGM_CASINO 426 // Game Corner
+#define BGM_HIGHTOWN 427 // Dewford Town
+#define BGM_SAFARI 428 // Safari Zone
+#define BGM_C_ROAD 429 // Victory Toad
+#define BGM_AJITO 430 // Aqua/Magma Hideout
+#define BGM_M_BOAT 431 // Sailing
+#define BGM_M_DUNGON 432 // Mt. Pyre (Inside)
+#define BGM_FINECITY 433 // Slateport City
+#define BGM_MACHUPI 434 // Mt. Pyre (Outside)
+#define BGM_P_SCHOOL 435 // Pokémon Trainer's School
+#define BGM_DENDOU 436 // Hall of Fame
+#define BGM_TONEKUSA 437 // Lavaridge Town
+#define BGM_MABOROSI 438 // Sealed Chamber
+#define BGM_CON_FAN 439 // You are the Champion!
+#define BGM_CONTEST0 440 // Pokémon Contest
+#define BGM_MGM0 441 // Encounter! Team Magma
+#define BGM_T_BATTLE 442 // Opening Battle
+#define BGM_OOAME 443 // The Flood
+#define BGM_HIDERI 444 // The Drought
+#define BGM_RUNECITY 445 // Sootopolis City
+#define BGM_CON_K 446 // Berry Blending Results
+#define BGM_EIKOU_R 447 // Hall of Fame
+#define BGM_KARAKURI 448 // Trick House
+#define BGM_HUTAGO 449 // Encounter! Kid
+#define BGM_SITENNOU 450 // Encounter! Elite Four
+#define BGM_YAMA_EYE 451 // Encounter! Hiker
+#define BGM_CONLOBBY 452 // Contest Lobby
+#define BGM_INTER_V 453 // Encounter! Gabby and Ty
+#define BGM_DAIGO 454 // Encounter! Wallace
+#define BGM_THANKFOR 455 // Credits
+#define BGM_END 456 // The End
+#define BGM_BATTLE27 457 // Battle! Wild Pokémon
+#define BGM_BATTLE31 458 // Battle! Team Aqua/Magma
+#define BGM_BATTLE20 459 // Battle! Trainer
+#define BGM_BATTLE32 460 // Battle! Gym Leader
+#define BGM_BATTLE33 461 // Battle! Champion
+#define BGM_BATTLE36 462 // Battle! Regi Trio
+#define BGM_BATTLE34 463 // Battle! Legendary Pokémon
+#define BGM_BATTLE35 464 // Battle! Rival
+#define BGM_BATTLE38 465 // Battle! Elite Four
+#define BGM_BATTLE30 466 // Battle! Archie/Maxie
#define BGM_ROUTE_118 0x7FFF // What is this for?
diff --git a/include/constants/weather.h b/include/constants/weather.h
index 946316984..1110be7a2 100644
--- a/include/constants/weather.h
+++ b/include/constants/weather.h
@@ -12,7 +12,7 @@
#define WEATHER_SANDSTORM 8
#define WEATHER_FOG_2 9
#define WEATHER_FOG_3 10
-#define WEATHER_DARK 11
+#define WEATHER_SHADE 11
#define WEATHER_DROUGHT 12
#define WEATHER_RAIN_HEAVY 13
#define WEATHER_BUBBLES 14
@@ -31,7 +31,7 @@
#define COORD_EVENT_WEATHER_FOG_2 7
#define COORD_EVENT_WEATHER_ASH 8
#define COORD_EVENT_WEATHER_SANDSTORM 9
-#define COORD_EVENT_WEATHER_DARK 10
+#define COORD_EVENT_WEATHER_SHADE 10
#define COORD_EVENT_WEATHER_DROUGHT 11
#define COORD_EVENT_WEATHER_ROUTE119_CYCLE 20
#define COORD_EVENT_WEATHER_ROUTE123_CYCLE 21
diff --git a/include/contest.h b/include/contest.h
index 10392c00e..b0bdd7f61 100644
--- a/include/contest.h
+++ b/include/contest.h
@@ -67,6 +67,22 @@ struct ContestPokemon
/*0x3C*/ u32 otId; // otId
}; // wow
+struct ContestAIInfo {
+ /*0x00*/ u8 aiState;
+ /*0x02*/ u16 unk2;
+ /*0x04*/ u8 unk4;
+ /*0x05*/ u8 unk5[4];
+ /*0x09*/ u8 aiAction;
+ /*0x0A*/ u8 fillerA[0x6]; // TODO: don't know what's here
+ /*0x10*/ u8 unk10;
+ /*0x14*/ u32 flags;
+ /*0x18*/ s16 scriptResult;
+ /*0x1A*/ s16 scriptArr[3];
+ /*0x20*/ u32 stack[8];
+ /*0x40*/ u8 unk40;
+ /*0x41*/ u8 unk41;
+};
+
extern struct ContestPokemon gContestMons[];
extern const struct ContestMove gContestMoves[];
extern const struct ContestEffect gContestEffects[];
@@ -86,5 +102,185 @@ void sub_80B0F28(u8);
bool8 Contest_SaveWinner(u8);
u8 sub_80B2C4C(u8, u8);
void Contest_ResetWinners(void);
+s8 Contest_GetMoveExcitement(u16);
+
+// Contest Shared EWRAM
+
+struct Shared18000
+{
+ /*0x18000*/ u8 unk18000;
+ /*0x18001*/ u8 filler18001[3];
+ /*0x18004*/ u16 unk18004[16][16];
+ /*0x18204*/ u16 unk18204[0x200];
+ /*0x18604*/ u16 unk18604[0x200];
+ /*0x18A04*/ u8 unk18A04[0x800];
+};
+
+struct Contest
+{
+ /*0x19204*/ u8 playerMoveChoice;
+ /*0x19205*/ u8 turnNumber;
+ /*0x19206*/ u8 unk19206[4]; // seems to only be used by an unref function
+ /*0x1920A*/ u16 unk1920A_0:1; // Task active flags?
+ u16 unk1920A_1:1;
+ u16 unk1920A_2:1;
+ u16 unk1920A_3:1;
+ u16 unk1920A_4:1;
+ u16 unk1920A_5:1;
+ u16 unk1920A_6:1;
+ u16 unk1920A_7:1;
+ /*0x1920B*/ u16 unk1920B_0:1;
+ u16 unk1920B_1:1;
+ u16 unk1920B_2:1;
+ /*0x1920C*/ u8 mainTaskId;
+ /*0x1920D*/ u8 unk1920D[4];
+ /*0x19211*/ u8 unk19211;
+ /*0x19212*/ u8 unk19212;
+ /*0x19213*/ u8 filler19213;
+ /*0x19214*/ u8 unk19214;
+ /*0x19215*/ u8 unk19215;
+ /*0x19216*/ u8 unk19216; // sprite ID
+ /*0x19217*/ s8 applauseLevel;
+ /*0x19218*/ u8 unk19218[4];
+ /*0x1921C*/ u32 unk1921C; // saved RNG value?
+ u16 unk19220[5][4]; // move history?
+ u8 unk19248[5][4]; // excitement history
+ u8 applauseMeterSpriteId; // sprite ID
+ /*0x1925D*/ u8 unk1925D;
+ /*0x1925E*/ u8 unk1925E;
+};
+
+struct ContestantStatus
+{
+ /*0x00*/ s16 appeal1; // move appeal?
+ /*0x02*/ s16 appeal2; // final appeal after end of turn, maybe?
+ /*0x04*/ s16 unk4;
+ /*0x06*/ u16 currMove;
+ /*0x08*/ u16 prevMove;
+ /*0x0A*/ u8 moveCategory;
+ /*0x0B*/ u8 unkB_0:2;
+ u8 unkB_2:2;
+ u8 moveRepeatCount:3;
+ u8 unkB_7:1; // used a one-time move?
+ /*0x0C*/ u8 unkC_0:1;
+ u8 unkC_1:2;
+ /*0x0D*/ s8 unkD;
+ /*0x0E*/ u8 unkE;
+ /*0x0F*/ u8 unkF;
+ /*0x10*/ u8 unk10_0:1;
+ u8 unk10_1:1;
+ u8 unk10_2:1;
+ u8 unk10_3:1;
+ u8 unk10_4:2;
+ u8 unk10_6:2;
+ /*0x11*/ u8 unk11_0:2;
+ u8 unk11_2:1;
+ u8 unk11_3:1;
+ u8 unk11_4:1;
+ u8 unk11_5:1;
+ /*0x12*/ u8 unk12;
+ /*0x13*/ u8 unk13; // status action?
+ /*0x14*/ u8 unk14;
+ /*0x15*/ u8 disappointedRepeat:1;
+ u8 unk15_1:1;
+ u8 unk15_2:1;
+ u8 unk15_3:1;
+ u8 unk15_4:1;
+ u8 unk15_5:1;
+ u8 unk15_6:1;
+ /*0x16*/ u8 unk16;
+ /*0x17*/ u8 unk17;
+ /*0x18*/ u8 unk18;
+ /*0x19*/ u8 unk19; // turn position
+ /*0x1A*/ u8 attentionLevel; // How much the Pokemon "stood out"
+ /*0x1B*/ u8 unk1B;
+};
+
+struct UnknownContestStruct3
+{
+ u8 unk0;
+ u8 unk1;
+ //u8 unk2_0:1;
+ //u8 unk2_1:1;
+ u8 unk2; // maybe a bitfield
+ u8 filler3;
+};
+
+// possibly the same as UnknownContestStruct3?
+struct UnknownContestStruct4
+{
+ u8 unk0; // sprite ID
+ u8 unk1; // sprite ID
+ u8 unk2_0:1;
+ u8 unk2_1:1;
+ u8 unk2_2:1;
+ u8 filler3;
+};
+
+struct UnknownContestStruct5
+{
+ s8 bits_0; // current move excitement?
+ u8 bits_8:1;
+ u8 bits_9:3;
+ u8 bits_C:4;
+ s8 unk2;
+ u8 filler3;
+};
+
+struct UnknownContestStruct7
+{
+ u8 unk0[4];
+ u16 unk4;
+ u16 unk6;
+ u8 filler8[0xD-8];
+ u8 unkD[4];
+ u8 unk11;
+ u8 filler12[2];
+};
+
+struct UnknownContestStruct8
+{
+ u16 unk0;
+ u16 unk2;
+ u8 unk4_0:1;
+ u8 unk5;
+ u8 filler6[2];
+ u32 unk8;
+ u32 unkC;
+ u32 unk10;
+};
+
+struct UnknownContestStruct6
+{
+ s32 unk0;
+ s32 unk4;
+ s32 unk8;
+ s32 unkC;
+};
+
+// TODO: Please move these to ewram.h once the defines are settled down and figured out completely.
+#define shared15800 (gSharedMem + 0x15800)
+#define shared15DE0 (*(struct ContestWinner *)(gSharedMem + 0x15DE0))
+#define shared16800 (gSharedMem + 0x16800)
+#define shared18000 (*(struct Shared18000 *)(gSharedMem + 0x18000))
+#define shared18004 ((u16 *)(gSharedMem + 0x18004))
+#define sContest (*(struct Contest *)(gSharedMem + 0x19204))
+#define sContestantStatus ((struct ContestantStatus *)(gSharedMem + 0x19260))
+#define shared192E4 (gSharedMem + 0x192E4)
+#define shared19328 (*(struct UnknownContestStruct5 *)(gSharedMem + 0x19328))
+#define shared19338 ((struct UnknownContestStruct4 *)(gSharedMem + 0x19338))
+#define shared19348 (*(struct UnknownContestStruct8 *)(gSharedMem + 0x19348))
+
+extern u8 gContestPlayerMonIndex;
+extern u8 gIsLinkContest;
+extern u32 gContestRngValue;
+extern u8 gUnknown_02038696[4];
+extern s16 gUnknown_02038670[4];
+extern s16 gUnknown_02038678[4];
+extern s16 gUnknown_02038680[4];
+extern u16 gUnknown_02038688[4];
+extern u8 gContestFinalStandings[4];
+extern u8 gUnknown_02038696[4];
+extern u8 gUnknown_0203869B;
#endif // GUARD_CONTEST_H
diff --git a/include/contest_ai.h b/include/contest_ai.h
new file mode 100644
index 000000000..da143b541
--- /dev/null
+++ b/include/contest_ai.h
@@ -0,0 +1,16 @@
+#ifndef GUARD_CONTESTAI_H
+#define GUARD_CONTESTAI_H
+
+// AI states
+enum
+{
+ CONTESTAI_SETTING_UP,
+ CONTESTAI_PROCESSING,
+ CONTESTAI_FINISHED,
+ CONTESTAI_DO_NOT_PROCESS
+};
+
+void ContestAI_ResetAI(u8);
+u8 ContestAI_GetActionToUse(void);
+
+#endif
diff --git a/include/credits.h b/include/credits.h
new file mode 100644
index 000000000..dabe24048
--- /dev/null
+++ b/include/credits.h
@@ -0,0 +1,11 @@
+#ifndef GUARD_credits_H
+#define GUARD_credits_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+void sub_81439D0(void);
+
+#endif //GUARD_credits_H
diff --git a/include/data2.h b/include/data2.h
index 97cb4fd7a..2fe8d39f8 100644
--- a/include/data2.h
+++ b/include/data2.h
@@ -3,7 +3,7 @@
#include "sprite.h"
-struct UnknownTaskStruct;
+struct ScanlineEffectParams;
struct MonCoords
{
@@ -42,12 +42,13 @@ extern u8 gSpeciesNames[][11];
extern const u8 gMoveNames[][13];
extern const u8 gAbilityNames[][13];
extern const u8 gTypeNames[][7];
-extern const struct UnknownTaskStruct gUnknown_081F9674;
+extern const struct ScanlineEffectParams gUnknown_081F9674;
extern const u8 gUnknown_081F96C8[];
extern struct CompressedSpriteSheet gUnknown_081FAEA4;
extern struct CompressedSpritePalette gUnknown_081FAEAC;
extern const struct SpriteTemplate gSpriteTemplate_81FAF0C;
-extern void *const gUnknown_081FAF4C[];
+extern u8 *const gUnknown_081FAF4C[];
+//extern u8 (*const gUnknown_081FAF4C[])[0x800];
extern struct BattleMove gBattleMoves[];
// data/graphics/trainers/front_pic_coords.inc
diff --git a/include/debug.h b/include/debug.h
index f3ad8c401..2136dbfb8 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -1,7 +1,17 @@
#ifndef GUARD_DEBUG_H
#define GUARD_DEBUG_H
+// start_menu_debug
+void DebugMenu_8077048(void);
+
// matsuda_debug_menu
void sub_80AAF30(void);
+void Crash(const u8 *text);
+
+// tomomichi_debug_menu
+void debug_nullsub_66(void);
+
+// sound_check_menu
+void CB2_StartSoundCheckMenu(void);
#endif // GUARD_DEBUG_H
diff --git a/include/decoration.h b/include/decoration.h
index 972e82faf..d7f26bd05 100644
--- a/include/decoration.h
+++ b/include/decoration.h
@@ -127,17 +127,12 @@ extern u8 gUnknown_020388F5;
extern u8 gUnknown_020388F6;
extern u8 gUnknown_020388D6[16];
extern u8 gUnknown_020388E6[12];
-extern u16 gSpecialVar_0x8004;
-extern u16 gSpecialVar_0x8005;
-extern u16 gSpecialVar_0x8006;
-extern u16 gSpecialVar_0x8007;
extern u16 gUnknown_020391A4;
extern u16 gUnknown_020391A6;
extern u8 gUnknown_020391A8;
extern u8 gUnknown_020391A9;
extern u8 gUnknown_020391AA;
extern u8 gUnknown_02039234;
-extern void (*gFieldCallback)(void);
extern const struct YesNoFuncTable gUnknown_083EC96C[];
extern struct UnkStruct_020391B4 gUnknown_020391B4[16];
@@ -151,7 +146,6 @@ extern const struct YesNoFuncTable gUnknown_083EC634[];
extern const u8 gUnknown_083EC65A[];
extern const u8 gUnknown_083EC97C[];
extern const u8 gUnknown_083EC984[];
-extern void sub_80B3068(u8); // src/shop
extern const struct YesNoFuncTable gUnknown_083EC95C;
extern const struct YesNoFuncTable gUnknown_083EC964;
extern const struct YesNoFuncTable gUnknown_083EC9CC;
@@ -161,7 +155,6 @@ extern const struct YesNoFuncTable gUnknown_083ECAA0;
extern u8 sub_8134194(u8); // src/decoration_inventory
extern bool8 sub_81341D4(void); // src/decoration_inventory
extern void sub_8134104(u8); // src/decoration_inventory
-extern bool8 sub_807D770(void);
extern void sub_8109DAC(u8); // src/trader
extern void ReshowPlayerPC(u8); // src/player_pc
void Task_SecretBasePC_Decoration(u8);
diff --git a/include/dewford_trend.h b/include/dewford_trend.h
index c12d0d740..16b2bdd75 100644
--- a/include/dewford_trend.h
+++ b/include/dewford_trend.h
@@ -2,6 +2,7 @@
#define GUARD_DEWFORDTREND_H
void InitDewfordTrend(void);
+bool8 sub_80FA364(u16 *a);
void sub_80FA4E4(void *, u32, u8);
void UpdateDewfordTrendPerDay(u16);
diff --git a/include/easy_chat.h b/include/easy_chat.h
index a6277fba8..b86b166aa 100644
--- a/include/easy_chat.h
+++ b/include/easy_chat.h
@@ -1,8 +1,124 @@
#ifndef GUARD_EASYCHAT_H
#define GUARD_EASYCHAT_H
-extern u8 gUnknown_020388AC;
+struct Sprite;
+struct UnknownEasyChatStruct1
+{
+ u16 unk0;
+ u16 unk2;
+ u16 unk4;
+ u16 unk6;
+ void *unk8;
+};
+
+struct Shared1000
+{
+ void (*unk0)(void); // main cb 2
+ u16 *unk4;
+ u8 unk8;
+ u8 unk9;
+ u8 unkA; // length of unkC array
+ u8 unkB; // reporter talked to (Gabby or Ty)
+ u16 unkC[9];
+ void (*unk20)(void);
+ u16 unk24;
+ u8 unk26;
+ u8 unk27;
+ u16 unk28;
+ u8 unk2A[11][2];
+ u8 unk40[4][14];
+ u8 unk78[5];
+ u8 unk7D;
+ u8 unk7E[5];
+ s8 unk83;
+ s8 unk84;
+ s8 unk85;
+ s8 unk86;
+ bool8 unk87;
+ u16 unk88;
+ u16 unk8A;
+ u8 unk8C[(0x96-0x8C)/2][2];
+ u8 unk96;
+ u8 filler97;
+ struct Sprite *unk98;
+ struct Sprite *unk9C;
+ struct Sprite *unkA0;
+ struct Sprite *unkA4;
+ struct Sprite *unkA8;
+ struct Sprite *unkAC[2];
+ struct Sprite *unkB4[2];
+ u8 unkBC;
+ u8 fillerBD;
+ u16 unkBE;
+ u8 fillerC0[2];
+ u16 unkC2; // length of unkC8 and unk148 arrays
+ u16 unkC4;
+ u8 fillerC6[2];
+ u16 unkC8[(0x148-0xC8)/16][8];
+ struct UnknownEasyChatStruct1 unk148[(0x1A8-0x148)/12];
+ s8 unk1A8;
+ s8 unk1A9;
+ s8 unk1AA[0xB5-0xAA];
+ s8 unk1B5;
+ s8 unk1B6;
+ s8 unk1B7;
+ u8 unk1B8;
+ u8 unk1B9;
+ u16 unk1BA;
+ u16 unk1BC;
+ u8 unk1BE;
+ s8 unk1BF;
+ s8 unk1C0;
+ u8 filler1C1[3];
+ void (*unk1C4)(void);
+ u8 unk1C8[0x500];
+ u8 unk6C8[0xB78-0x6C8];
+#if GERMAN
+ u16 unkB78[27][270];
+#else
+ u16 unkB78[27][255];
+#endif
+ u16 unk4142[(0x78-0x42)/2]; //0x446C
+ u16 unk4178[(0x41A4-0x4178)/2]; // unknown length
+ const u8 *ecWordStrings[0x16][0x100]; //0x44CE in german
+ s8 unk99A4;
+ s8 unk99A5;
+ s8 unk99A6[130];
+ s8 unk9A28;
+ s8 unk9A29;
+ u16 unk9A2A[(0x9C32-0x9A2A)/4][2]; // unknown length
+ u8 unk9C32;
+ u8 filler9C33;
+ u16 unk9C34[3][9];
+ u8 filler9C6A[2];
+ s8 *unk9C6C;
+ u8 unk9C70;
+ s8 unk9C71;
+ u8 filler9C72[2];
+ struct Sprite *unk9C74;
+ u8 filler9C78[4];
+ u16 unk9C7C; // this is at 0x9FA8 in German
+ s16 unk9C7E;
+ u8 unk9C80[0xC9-0x80];
+ u8 unk9CC9[0xD12-0xCC9];
+ u8 unk9D12[0x5B-0x12];
+ u8 unk9D5B[0xA4-0x5B];
+ u8 unk9DA4[0xC9-0xA4];
+ u8 unk9DC9[0xE14 - 0xDC9];
+ u8 unk9E14[0xE41 - 0xE14];
+ u8 unk9E41[0x6E - 0x41];
+ u8 unk9E6E[0xEE - 0x6E];
+ u8 unk9EEE[0xF6E - 0xEEE];
+ u8 unk9F6E[0x8E - 0x6E]; // unknown length
+ u8 unk9F8E[7]; // unknown length
+};
+
+// const pointer to shared1000. easy_chat might be two separate files.
+extern struct Shared1000 *const gEasyChatStruct;
+
+void sub_80E60D8(void);
+void sub_80E62A0(u8 arg0, u16 *arg1, void (*arg2)(void), u8 arg3);
u16 sub_80EB72C(u16 group);
void sub_80EB6FC(u16 *, u16);
void InitEasyChatPhrases(void);
@@ -19,7 +135,7 @@ u16 sub_80EB8EC(void);
u8 *sub_80EB544(u8 *dst, u16 *words, u16 arg2, u16 arg3);
#if GERMAN
-u32 de_sub_80EB748(u32, u32);
+u32 de_sub_80EB748(s32, s32);
#endif
#endif // GUARD_EASYCHAT_H
diff --git a/include/ewram.h b/include/ewram.h
index eacc02cab..cafb418fb 100755..100644
--- a/include/ewram.h
+++ b/include/ewram.h
@@ -8,8 +8,8 @@ extern u8 gSharedMem[];
// regions overlap others but have different definitions. Until some
// dupes can be determined to be the same, they will be deliberate
// seperated.
-#define eWeatherPaletteData (*(struct WeatherPaletteData *)gSharedMem)
-#define BATTLE_STRUCT ((struct BattleStruct *) (gSharedMem + 0x0))
+#define eDroughtPaletteData (*(struct WeatherPaletteData *)gSharedMem)
+#define gBattleStruct ((struct BattleStruct *) (gSharedMem + 0x0))
#define ewram0_2 (*(struct Struct2000000 *)(gSharedMem + 0x0))
#define namingScreenData (*(struct NamingScreenData *)(gSharedMem + 0x0))
#define ewramBerryPic (gSharedMem + 0x0)
@@ -20,14 +20,15 @@ extern u8 gSharedMem[];
#define eBrendanSprite (gSharedMem + 0x0)
#define ewram0_6 (u32)(&gSharedMem[0])
#define ewram0_7 (&gSharedMem[0])
-#define eSaveSection (struct SaveSection *)(gSharedMem + 0x0)
+#define eSaveSection (struct SaveSector *)(gSharedMem + 0x0)
#define ewram0arr ((u8 (*)[32])gSharedMem)
#define eVoidSharedArr (void *)(ewram_addr + 0x0)
#define eVoidSharedArr2 (u32)(ewram_addr) // ew(ram)
-#define ewram0_8 ((struct UnkStruct2000000 *)(gSharedMem + 0x0))
+#define eSlotMachine ((struct SlotMachineEwramStruct *)(gSharedMem + 0x0))
#define ewram0_9(i) (u8 *)(ewram_addr + (i * 0x20))
#define ewram0_10 (*(struct UnknownPokenav0*)(gSharedMem + 0))
#define ewram0_11 (*(struct UnknownPokenav0_1*)(gSharedMem + 0))
+#define ePokemonStorageSystem (*(struct PokemonStorageSystemData *)(gSharedMem + 0))
#define ewram4 (*(struct UnknownStruct8 *)(gSharedMem + 0x4))
#define ewram520 ((struct UnknownStruct7 *)(gSharedMem + 0x00520))
#define ewram520_2 (u8 *)(ewram_addr + 0x520)
@@ -38,10 +39,6 @@ extern u8 gSharedMem[];
#define ewram01000 (*(struct Unk2001000 *)(gSharedMem + 0x1000))
#define ewramBerryPicTemp (gSharedMem + 0x1000)
#define EWRAM_1000 (*(struct Struct2001000 *)(gSharedMem + 0x1000))
-#define gUnk20011fa (u8 *)(&gSharedMem[0x11FA])
-#define gUnk2002694 (u8 *)(&gSharedMem[0x2694])
-#define gUnk20026A6 (u8 *)(&gSharedMem[0x26A6])
-#define gUnk20026e4 (u8 *)(&gSharedMem[0x26E4])
#define ewram4000 (gSharedMem + 0x4000)
#define gUnknown_02007000 (*(ewramStruct_02007000 *)(gSharedMem + 0x7000))
#define ARRAY_2007800 ((struct EasyChatPair *)(gSharedMem + 0x7800))
@@ -70,7 +67,7 @@ extern u8 gSharedMem[];
#define ewramF800 (&gSharedMem[0xF800])
#define ewram_2010000 (*(struct TradeEwramStruct *)(gSharedMem + 0x10000))
#define ewram10000 (&gSharedMem[0x10000])
-#define ewram10000_2 (void *)(gSharedMem + 0x10000) // slot machine
+#define eSlotMachineGfxBuffer (void *)(gSharedMem + 0x10000) // slot machine
#define ePokedexPalAddr3 (void *)(gSharedMem + 0x10000)
#define ewram10800 (&gSharedMem[0x10800])
#define ewram11000 (&gSharedMem[0x11000])
@@ -78,6 +75,7 @@ extern u8 gSharedMem[];
#define ewram12000 (&gSharedMem[0x12000])
#define ewram12800 (&gSharedMem[0x12800])
#define ewram13000 (&gSharedMem[0x13000])
+#define eSlotMachineReelTimeGfxBuffer (&gSharedMem[0x13200])
#define ewram13800 (&gSharedMem[0x13800])
#define EWRAM_14000 ((u8 *)(gSharedMem + 0x14000))
#define ewram14000 (&gSharedMem[0x14000])
@@ -107,6 +105,7 @@ extern u8 gSharedMem[];
#define ewram16010arr(bank) (gSharedMem[0x16010 + bank])
#define ewram1601B (gSharedMem[0x1601B])
#define eDynamicMoveType (gSharedMem[0x1601C])
+#define eFocusPunchBank (gSharedMem[0x1601D])
#define eDmgMultiplier (gSharedMem[0x1601F])
#define ewram16020 ((u8 *)(gSharedMem + 0x16020))
#define ewram16020arr(i) (gSharedMem[0x16020 + i])
@@ -129,9 +128,16 @@ extern u8 gSharedMem[];
#define ewram16088_2 (*(u8 *)(gSharedMem + 0x16088))
#define ewram16089 (gSharedMem[0x16089])
#define ewram16089_2 (*(u8 *)(gSharedMem + 0x16089))
+
+// src/battle/anim/battle_intro.c
+#define ewram1608A gSharedMem[0x1608A]
+#define ewram1608B gSharedMem[0x1608B]
+
#define ewram1608Carr(bank) (gSharedMem[0x1608C + bank])
#define EWRAM_1609D (gSharedMem[0x1609D])
#define ewram160A1 (gSharedMem[0x160A1])
+#define ewram160A4 (gSharedMem[0x160A4])
+#define ewram160A5 (gSharedMem[0x160A5])
#define ewram160A6 (gSharedMem[0x160A6])
#define ewram160A8 (gSharedMem[0x160A8])
#define ewram160A9 (gSharedMem[0x160A9])
@@ -154,9 +160,12 @@ extern u8 gSharedMem[];
#define USED_HELD_ITEM(bank) ((((u16*)(&gSharedMem[0x160CC + bank * 2]))))
#define USED_HELD_ITEMS(bank) (*(u16 *)&gSharedMem[0x160CC + 2 * (bank)])
#define ewram160D4(bank) (gSharedMem[0x160D4 + (bank / 2) * 2])
+#define ewram160D8(bank) (gSharedMem[0x160D8 + (bank / 2)])
+#define ewram160DA(bank) (gSharedMem[0x160DA + (bank / 2)])
#define ewram160DD (gSharedMem[0x160DD])
#define ewram160E0(i) (gSharedMem[0x160E0 + i])
#define ewram160E6 (gSharedMem[0x160E6])
+#define ewram160E7 (gSharedMem[0x160E7])
#define CHOICED_MOVE(bank) (((u16*)(&gSharedMem[0x160E8 + bank * 2])))
#define ewram160E8 ((u8 *)(gSharedMem + 0x160E8))
#define ewram160E8arr(i) (gSharedMem[0x160E8 + i])
@@ -174,6 +183,7 @@ extern u8 gSharedMem[];
#define ewram16108arr(i) (gSharedMem[0x16108 + i])
#define ewram16110 (gSharedMem[0x16110])
#define ewram16111 (gSharedMem[0x16111])
+#define eMultihitMoveEffect (gSharedMem[0x16112])
#define ewram16113 (gSharedMem[0x16113])
#define ewram16400 (gSharedMem + 0x16400)
#define AI_THINKING_STRUCT ((struct AI_ThinkingStruct *)(gSharedMem + 0x16800))
@@ -184,6 +194,7 @@ extern u8 gSharedMem[];
#define ewram17000 (&gSharedMem[0x17000])
#define eLearnMoveStruct (struct LearnMoveStruct *)(gSharedMem + 0x17000)
#define eSecretBaseRecord ((struct SecretBaseRecord *)(gSharedMem + 0x17000))
+#define eCableCar1 ((struct CableCarEwramStruct1 *)(gSharedMem + 0x17000))
#define ewram17002 (&gSharedMem[0x17002])
#define eFlashFireArr (*(struct Struct2017100 *)(gSharedMem + 0x17100))
#define B_BATTLESCRIPTS_STACK ((struct scriptsStack *) (gSharedMem + 0x17110))
@@ -191,13 +202,14 @@ extern u8 gSharedMem[];
#define B_FUNCTION_STACK ((struct funcStack *) (gSharedMem + 0x17140))
#define ewram17160 (gSharedMem[0x17160])
#define ewram17800 ((struct Struct2017800 *) (gSharedMem + 0x17800))
+#define ewram17800_2 (&gSharedMem[0x17800])
#define EWRAM_17800 ((struct UnknownStruct1 *)(gSharedMem + 0x17800))
#define eTransformStatuses ((struct TransformStatus *)(gSharedMem + 0x17800))
-#define ewram17800_2 (&gSharedMem[0x17800])
#define ewram17810 ((struct Struct2017810 *) (gSharedMem + 0x17810))
#define EWRAM_17810 ((struct UnknownStruct3 *)(gSharedMem + 0x17810))
#define ewram17840 (*(struct Struct2017840 *) (gSharedMem + 0x17840))
#define ewram17850 ((struct UnknownStruct5 *)(gSharedMem + 0x17850))
+#define ewram17E00 ((u16 *)(gSharedMem + 0x17E00))
#define ewram_2018000 (*(struct PlayerRecords *)(gSharedMem + 0x18000))
#define EWRAM_18000 ((u16 *)(gSharedMem + 0x18000))
#define ewram18000 ((u16 *)(gSharedMem + 0x18000))
@@ -211,10 +223,17 @@ extern u8 gSharedMem[];
#define ewram18300 ((u16 *)(gSharedMem + 0x18300))
#define ewram18800 (&gSharedMem[0x18800])
#define ePokedexView2 (struct PokedexView *)(gSharedMem + 0x18800)
+#define ewram189a0 ((u16 *)(gSharedMem + 0x189A0))
+#define ewram18a20 ((u16 *)(gSharedMem + 0x18A20))
+#define ewram18a32 ((u16 *)(gSharedMem + 0x18A32))
+#define ewram18a80 ((u16 *)(gSharedMem + 0x18a80))
#define ewram19000 (&gSharedMem[0x19000])
+#define eCableCar2 ((struct CableCarEwramStruct2 *)(gSharedMem + 0x19000))
#define ePokedexView3 (struct PokedexView *)(gSharedMem + 0x19000)
+#define eRoulette ((struct Roulette *)(gSharedMem + 0x19000))
+#define shared192D0 (*(struct UnknownContestStruct7 *)(gSharedMem + 0x192D0))
+#define eContestAI ((struct ContestAIInfo *)(gSharedMem + 0x192E4))
#define EWRAM_19348 (*(u16 *)(gSharedMem + 0x19348))
-#define ewram19348 (*(struct Struct2019348 *)(gSharedMem + 0x19348))
#define ewram19800 (&gSharedMem[0x19800])
#define ePokedexView4 (struct PokedexView *)(gSharedMem + 0x19800)
#define ewram1A000 (&gSharedMem[0x1A000])
@@ -229,6 +248,7 @@ extern u8 gSharedMem[];
#define ewram1C000 (*(struct Unk201C000 *)(gSharedMem + 0x1C000))
#define ewram1c000 (*(struct Unk201C000 *)(gSharedMem + 0x1C000)) // FIXME, names too similar
#define eHallOfFameMons1 (struct HallofFameMons*)(&gSharedMem[0x1C000])
+#define eHOFPCScreenEffect (*(struct PCScreenEffectStruct *)(gSharedMem + 0x1c000))
#define EWRAM_1C800 (*(struct Unk201C800 *)(gSharedMem + 0x1C800))
#define ewram1D000 ((struct Pokemon *)(gSharedMem + 0x1D000))
#define ewram1D000_2 ((u16 *)(gSharedMem + 0x1D000))
@@ -239,6 +259,7 @@ extern u8 gSharedMem[];
#define eHallOfFame (struct HallOfFame *)(gSharedMem + 0x1E000)
#define HALL_OF_FAME_SHEET_0 ((u8 *)(gSharedMem + 0x1E000))
#define ewram1E000_2 (const u8 *)(gSharedMem + 0x1E000)
+#define eContestLinkSendBuffer gSharedMem + 0x1E000
#define HALL_OF_FAME_SHEET_1 ((u8 *)(gSharedMem + 0x1E800))
#define ewram_1f000 (*(struct DecoPCPointers *)(gSharedMem + 0x1f000))
#define ewramSavedPokeballsPocket ((struct ItemSlot *)(gSharedMem + 0x1F000)) // saved Pokeballs pocket (for Wally battle)
diff --git a/include/field_control_avatar.h b/include/field_control_avatar.h
index 2d5693e40..49e9f23e3 100644
--- a/include/field_control_avatar.h
+++ b/include/field_control_avatar.h
@@ -36,5 +36,6 @@ bool8 sub_8068870(u16 a);
bool8 sub_8068894(void);
bool8 sub_8068A64(struct MapPosition *, u16);
u8 sub_8068F18(void);
+bool8 dive_warp(struct MapPosition *position, u16 b);
#endif
diff --git a/include/field_effect.h b/include/field_effect.h
index 9f71efba1..4d0e90767 100644
--- a/include/field_effect.h
+++ b/include/field_effect.h
@@ -103,7 +103,6 @@ void FieldEffectActiveListClear(void);
void FieldEffectActiveListAdd(u8 id);
void FieldEffectActiveListRemove(u8 id);
bool8 FieldEffectActiveListContains(u8 id);
-void sub_807DE38(u8 index);
void SpriteCB_PokeballGlow(struct Sprite *);
void SpriteCB_PokecenterMonitor(struct Sprite *);
@@ -252,6 +251,7 @@ void FreeResourcesAndDestroySprite(struct Sprite *sprite);
void MultiplyInvertedPaletteRGBComponents(u16, u8, u8, u8);
void sub_80878A8(void);
void sub_8087BA8(void);
+void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b);
extern s32 gFieldEffectArguments[8];
diff --git a/include/field_fadetransition.h b/include/field_fadetransition.h
index 4377367f7..cd0cb6eab 100644
--- a/include/field_fadetransition.h
+++ b/include/field_fadetransition.h
@@ -27,5 +27,6 @@ void sub_8080F48(void);
void sub_8080F58(void);
void sub_8080F68(void);
void sub_8080F9C(void);
+void debug_sub_80888D8(void);
#endif // GUARD_FIELD_FADETRANSITION_H
diff --git a/include/field_map_obj.h b/include/field_map_obj.h
index f0b0bb5ab..cf3be36b2 100644
--- a/include/field_map_obj.h
+++ b/include/field_map_obj.h
@@ -337,7 +337,7 @@ void RemoveFieldObjectInternal(struct MapObject *);
u8 SpawnSpecialFieldObject(struct MapObjectTemplate *);
u8 show_sprite(u8, u8, u8);
void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables);
-u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 c, s16 d, u8 subpriority);
+u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority);
u8 sub_805B410(u8, u8, s16, s16, u8, u8);
void sub_805B55C(s16 a, s16 b);
void sub_805B710(u16 i, u16 i1);
diff --git a/include/field_weather.h b/include/field_weather.h
index c96d4055e..0bdebf747 100644
--- a/include/field_weather.h
+++ b/include/field_weather.h
@@ -1,7 +1,15 @@
#ifndef GUARD_WEATHER_H
#define GUARD_WEATHER_H
-struct Sprite;
+#include "sprite.h"
+
+// Controls how the weather should be changing the screen palettes.
+enum {
+ WEATHER_PAL_STATE_CHANGING_WEATHER,
+ WEATHER_PAL_STATE_SCREEN_FADING_IN,
+ WEATHER_PAL_STATE_SCREEN_FADING_OUT,
+ WEATHER_PAL_STATE_IDLE,
+};
struct Weather
{
@@ -23,21 +31,17 @@ struct Weather
struct Sprite *sandstormSprites2[5];
} s2;
} sprites;
- u8 unknown_200[2][32];
- u8 filler_240[0x460-0x240];
- u8 unk460[2][32];
- u8 filler4A0[0x6B6-0x4A0];
- s8 unknown_6B6;
- u8 filler_6B7[0xC0-0xB7];
- s8 unknown_6C0;
- s8 unknown_6C1;
- u8 unknown_6C2;
- u8 unknown_6C3;
- u16 unknown_6C4;
- u8 unknown_6C6;
- u8 unknown_6C7;
- u8 unknown_6C8;
- u8 unknown_6C9;
+ u8 gammaShifts[19][32];
+ u8 altGammaShifts[19][32];
+ s8 gammaIndex;
+ s8 gammaTargetIndex;
+ u8 gammaStepDelay;
+ u8 gammaStepFrameCounter;
+ u16 fadeDestColor;
+ u8 palProcessingState;
+ u8 fadeScreenCounter;
+ bool8 readyForInit;
+ u8 taskId;
u8 unknown_6CA;
u8 unknown_6CB;
u16 initStep;
@@ -45,9 +49,9 @@ struct Weather
u8 currWeather;
u8 nextWeather;
u8 weatherGfxLoaded;
- u8 unknown_6D3;
- u8 unknown_6D4;
- u8 unknown_6D5;
+ bool8 weatherChangeComplete;
+ u8 weatherPicSpritePalIndex;
+ u8 altGammaSpritePalIndex;
u16 unknown_6D6;
u8 unknown_6D8;
u8 unknown_6D9;
@@ -70,8 +74,8 @@ struct Weather
u16 fog1ScrollPosX;
u16 unknown_6F0;
u16 unknown_6F2;
- u8 unknown_6F4[6];
- u8 unknown_6FA;
+ u8 lightenedFogSpritePals[6];
+ u8 lightenedFogSpritePalsCount;
u8 fog1SpritesCreated;
u16 unknown_6FC;
u16 unknown_6FE;
@@ -104,8 +108,8 @@ struct Weather
u16 currBlendEVB;
u16 targetBlendEVA;
u16 targetBlendEVB;
- u8 unknown_738;
- u8 unknown_739;
+ u8 blendUpdateCounter;
+ u8 blendFrameCounter;
u8 blendDelay;
u8 filler_73B[0x3C-0x3B];
s16 unknown_73C;
@@ -113,42 +117,35 @@ struct Weather
s16 unknown_740;
s16 unknown_742;
u8 filler_744[0xD-4];
- s8 unknown_74D;
- u8 unknown_74E;
+ s8 loadDroughtPalsIndex;
+ u8 loadDroughtPalsOffset;
};
void StartWeather(void);
-void DoWeatherEffect(u8 effect);
+void ChangeWeather(u8 weather);
void sub_807C988(u8 effect);
void sub_807C9B4(u8 effect);
void Task_WeatherInit(u8);
void Task_WeatherMain(u8);
void sub_807CAE8(void);
void nullsub_38(void);
-void sub_807CB10(void);
-void sub_807CC24(void);
-void sub_807CCAC(void);
-u8 sub_807CDC4(void);
-u8 sub_807CE24(void);
-u8 sub_807CE7C(void);
-void nullsub_39(void);
+void SetWeatherScreenFadeOut(void);
-// ASM
-void sub_807CEBC(u8, u8, s8);
-//void sub_807D1BC(u8, u8, u8, u8, u16);
-void sub_807D1BC(u8 a, u8 a2, s8 c, u8 d, u16 e);
-void sub_807D304(s8 a, u8 arg2, u16 c);
-void sub_807D424(u8, u16);
-// ...
-void fade_screen(u8, u8);
+enum
+{
+ FADE_FROM_BLACK,
+ FADE_TO_BLACK,
+ FADE_FROM_WHITE,
+ FADE_TO_WHITE,
+};
+
+void FadeScreen(u8, u8);
// ...
-void sub_807D78C(u8 tag);
-void sub_807D874(u8);
+void UpdateSpritePaletteWithWeather(u8 tag);
+void ApplyWeatherGammaShiftToPal(u8);
// ...
void Weather_SetBlendCoeffs(u8, u8);
// ...
-void sub_807DE68(void);
-// ...
void PlayRainSoundEffect(void);
// ...
void SetSav1Weather(u32);
@@ -158,9 +155,21 @@ void SetSav1WeatherFromCurrMapHeader(void);
void DoCurrentWeather(void);
void sub_8080750();
-bool8 sub_807D770(void);
-bool8 sub_807DDFC(void);
+bool8 IsWeatherNotFadingIn(void);
+bool8 IsWeatherChangeComplete(void);
void SetWeather(u32);
void UpdateWeatherPerDay(u16);
+void PreservePaletteInWeather(u8 index);
+void ResetPreservedPalettesInWeather(void);
+extern void ResetDroughtWeatherPaletteLoading(void);
+void ResetDroughtWeatherPaletteLoading(void);
+bool8 LoadDroughtWeatherPalettes(void);
+u8 GetCurrentWeather(void);
+void LoadCustomWeatherSpritePalette(const u16 *palette);
+
+
+extern struct Weather gWeather;
+
+extern struct Weather *const gWeatherPtr;
#endif // GUARD_WEATHER_H
diff --git a/include/fldeff_poison.h b/include/fldeff_poison.h
index fe3308ba9..abcacbd03 100644
--- a/include/fldeff_poison.h
+++ b/include/fldeff_poison.h
@@ -1,7 +1,7 @@
#ifndef GUARD_FLDEFF_POISON_H
#define GUARD_FLDEFF_POISON_H
-void DoFieldPoisonEffect(void);
-bool32 FieldPoisonEffectIsRunning(void);
+void FldeffPoison_Start(void);
+bool32 FldeffPoison_IsActive(void);
#endif // GUARD_FLDEFF_POISON_H
diff --git a/include/gba/gba.h b/include/gba/gba.h
index 42ae3cdde..349344031 100644
--- a/include/gba/gba.h
+++ b/include/gba/gba.h
@@ -7,5 +7,6 @@
#include "gba/multiboot.h"
#include "gba/syscall.h"
#include "gba/macro.h"
+#include "gba/isagbprint.h"
#endif // GUARD_GBA_GBA_H
diff --git a/include/gba/isagbprint.h b/include/gba/isagbprint.h
new file mode 100644
index 000000000..c5eb456c3
--- /dev/null
+++ b/include/gba/isagbprint.h
@@ -0,0 +1,50 @@
+#ifndef GUARD_GBA_ISAGBPRINT_H
+#define GUARD_GBA_ISAGBPRINT_H
+
+#ifdef NDEBUG
+#define AGBPrintInit()
+#define AGBPutc(cChr)
+#define AGBPrint(pBuf)
+#define AGBPrintf(pBuf, ...)
+#define AGBPrintFlush1Block()
+#define AGBPrintFlush()
+#define AGBAssert(pFile, nLine, pExpression, nStopProgram)
+#else
+void AGBPrintInit(void);
+void AGBPutc(const char cChr);
+void AGBPrint(const char *pBuf);
+void AGBPrintf(const char *pBuf, ...);
+void AGBPrintFlush1Block(void);
+void AGBPrintFlush(void);
+void AGBAssert(const char *pFile, int nLine, const char *pExpression, int nStopProgram);
+#endif
+
+#undef AGB_ASSERT
+#ifdef NDEBUG
+#define AGB_ASSERT(exp)
+#else
+#define AGB_ASSERT(exp) (exp) ? ((void*)0) : AGBAssert(__FILE__, __LINE__, #exp, 1);
+#endif
+
+#undef AGB_WARNING
+#ifdef NDEBUG
+#define AGB_WARNING(exp)
+#else
+#define AGB_WARNING(exp) (exp) ? ((void*)0) : AGBAssert(__FILE__, __LINE__, #exp, 0);
+#endif
+
+// for matching purposes
+
+#ifdef NDEBUG
+#define AGB_ASSERT_EX(exp, file, line)
+#else
+#define AGB_ASSERT_EX(exp, file, line) (exp) ? ((void*)0) : AGBAssert(file, line, #exp, 1);
+#endif
+
+#ifdef NDEBUG
+#define AGB_WARNING_EX(exp, file, line)
+#else
+#define AGB_WARNING_EX(exp, file, line) (exp) ? ((void*)0) : AGBAssert(file, line, #exp, 0);
+#endif
+
+#endif // GUARD_GBA_ISAGBPRINT_H
diff --git a/include/gba/macro.h b/include/gba/macro.h
index d9e6739b3..ab42c9da3 100644
--- a/include/gba/macro.h
+++ b/include/gba/macro.h
@@ -87,7 +87,7 @@
#define DmaCopyLarge(dmaNum, src, dest, size, block, bit) \
{ \
const void *_src = src; \
- void *_dest = dest; \
+ void *_dest = (void *)(dest); \
u32 _size = size; \
while (1) \
{ \
@@ -105,7 +105,7 @@
#define DmaClearLarge(dmaNum, dest, size, block, bit) \
{ \
- const void *_dest = dest; \
+ void *_dest = dest; \
u32 _size = size; \
while (1) \
{ \
@@ -129,7 +129,7 @@
#define DmaCopyDefvars(dmaNum, src, dest, size, bit) \
{ \
const void *_src = src; \
- void *_dest = dest; \
+ void *_dest = (void *)(dest); \
u32 _size = size; \
DmaCopy##bit(dmaNum, _src, _dest, _size); \
}
@@ -137,4 +137,87 @@
#define DmaCopy16Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 16)
#define DmaCopy32Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 32)
+#define DmaFillLarge(dmaNum, fillval, dest, size, block, bit) \
+{ \
+ void *_dest = (void *)(dest); \
+ u32 _size = (u32)(size); \
+ while (1) \
+ { \
+ DmaFill##bit(dmaNum, fillval, _dest, (block)); \
+ _dest += (block); \
+ _size -= (block); \
+ if (_size <= (block)) \
+ { \
+ DmaFill##bit(dmaNum, fillval, _dest, _size); \
+ break; \
+ } \
+ } \
+}
+
+#define DmaFill16Large(dmaNum, fillval, dest, size, block) DmaFillLarge(dmaNum, fillval, dest, size, block, 16)
+#define DmaFill32Large(dmaNum, fillval, dest, size, block) DmaFillLarge(dmaNum, fillval, dest, size, block, 32)
+
+#define DmaFillDefvars(dmaNum, fillval, dest, size, bit) \
+{ \
+ void *_dest = (void *)(dest); \
+ u32 _size = (u##bit)(size); \
+ DmaFill##bit(dmaNum, fillval, _dest, _size); \
+}
+
+#define DmaFill16Defvars(dmaNum, fillval, dest, size) DmaFillDefvars(dmaNum, fillval, dest, size, 16)
+#define DmaFill32Defvars(dmaNum, fillval, dest, size) DmaFillDefvars(dmaNum, fillval, dest, size, 32)
+
+// from pokeemerald
+// Maximum amount of data we will transfer in one operation
+#define MAX_DMA_BLOCK_SIZE 0x1000
+
+#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
+
+#define Dma3CopyLarge_(src, dest, size, bit) \
+{ \
+ const void *_src = src; \
+ void *_dest = dest; \
+ u32 _size = size; \
+ while (1) \
+ { \
+ if (_size <= MAX_DMA_BLOCK_SIZE) \
+ { \
+ DmaCopy##bit(3, _src, _dest, _size); \
+ break; \
+ } \
+ DmaCopy##bit(3, _src, _dest, MAX_DMA_BLOCK_SIZE); \
+ _src += MAX_DMA_BLOCK_SIZE; \
+ _dest += MAX_DMA_BLOCK_SIZE; \
+ _size -= MAX_DMA_BLOCK_SIZE; \
+ } \
+}
+
+#define Dma3CopyLarge16_(src, dest, size) Dma3CopyLarge_(src, dest, size, 16)
+#define Dma3CopyLarge32_(src, dest, size) Dma3CopyLarge_(src, dest, size, 32)
+
+#define Dma3FillLarge_(value, dest, size, bit) \
+{ \
+ void *_dest = dest; \
+ u32 _size = size; \
+ while (1) \
+ { \
+ if (_size <= MAX_DMA_BLOCK_SIZE) \
+ { \
+ DmaFill##bit(3, value, _dest, _size); \
+ break; \
+ } \
+ DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \
+ _dest += MAX_DMA_BLOCK_SIZE; \
+ _size -= MAX_DMA_BLOCK_SIZE; \
+ } \
+}
+
+#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16)
+#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32)
+
#endif // GUARD_GBA_MACRO_H
diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h
index a828cf131..30047c677 100644
--- a/include/global.fieldmap.h
+++ b/include/global.fieldmap.h
@@ -101,8 +101,7 @@ struct WarpEvent
struct CoordEvent
{
s16 x, y;
- u8 unk4;
- u8 filler_5;
+ u8 elevation;
u16 trigger;
u16 index;
u8 filler_A[0x2];
diff --git a/include/global.h b/include/global.h
index 4ae5de873..d0af4a4d1 100644
--- a/include/global.h
+++ b/include/global.h
@@ -1,11 +1,11 @@
#ifndef GUARD_GLOBAL_H
#define GUARD_GLOBAL_H
+#include "config.h" // we need to define config before gba headers as print stuff needs the functions nulled before defines.
#include "gba/gba.h"
-#include "config.h"
// IDE support
-#ifdef __APPLE__
+#if defined(__APPLE__) || defined(__CYGWIN__)
#define _(x) x
#define __(x) x
#define INCBIN_U8 {0}
@@ -14,9 +14,9 @@
#define INCBIN_S8 {0}
#define INCBIN_S16 {0}
#define INCBIN_S32 {0}
-void * memcpy (void *, const void *, size_t);
-void * memset (void *, int, size_t);
-int strcmp (const char *, const char *);
+void *memcpy (void *, const void *, size_t);
+void *memset (void *, int, size_t);
+int strcmp (const char *, const char *);
#endif
// Prevent cross-jump optimization.
@@ -27,21 +27,13 @@ int strcmp (const char *, const char *);
#define asm_unified(x) asm(".syntax unified\n" x "\n.syntax divided\n")
-#define nonmatching(fndec, x) {\
-__attribute__((naked))\
-fndec\
-{\
- asm_unified(x);\
-}\
-}
-
#define ARRAY_COUNT(array) (sizeof(array) / sizeof((array)[0]))
#define POKEMON_SLOTS_NUMBER 412
#define POKEMON_NAME_LENGTH 10
#define OT_NAME_LENGTH 7
-#define min(a, b) ((a) <= (b) ? (a) : (b))
+#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) >= (b) ? (a) : (b))
// why does GF hate 2d arrays
@@ -690,7 +682,7 @@ struct SaveBlock1 /* 0x02025734 */
/*0x2B40*/ u16 unk2B40[6];
} easyChats;
/*0x2B4C*/ struct MailStruct mail[16];
- /*0x2D8C*/ u8 unk2D8C[4];
+ /*0x2D8C*/ u8 unk2D8C[4]; // What is this? Apparently it's supposed to be 64 bytes in size.
/*0x2D90*/ u8 filler_2D90[0x4];
/*0x2D94*/ union MauvilleMan mauvilleMan;
/*0x2DD4*/ struct EasyChatPair easyChatPairs[5]; //Dewford trend [0] and some other stuff
@@ -851,5 +843,6 @@ struct HallOfFame
extern struct HallOfFame gHallOfFame;
extern struct SaveBlock2 gSaveBlock2;
+extern u8 ewram[];
#endif // GUARD_GLOBAL_H
diff --git a/include/graphics.h b/include/graphics.h
index 488de07c0..889dc3916 100644
--- a/include/graphics.h
+++ b/include/graphics.h
@@ -51,11 +51,7 @@ extern const u8 gMonFootprint_QuestionMark[];
extern const u8 gContestNextTurnGfx[];
extern const u8 gContestNextTurnNumbersGfx[];
extern const u8 gContestNextTurnRandomGfx[];
-extern const u8 gBattleAnimSpriteSheet_264[];
-extern const u8 gBattleAnimSpritePalette_264[];
-extern const u8 gBattleAnimSpritePalette_265[];
-extern const u8 gBattleAnimSpritePalette_067[];
-extern const u8 gBattleAnimSpritePalette_068[];
+// extern const u8 gBattleAnimSpriteSheet_264[];
extern const u8 gContestApplauseGfx[];
extern const u8 gContestApplauseMeterGfx[];
extern const u16 gContestPal[];
@@ -2656,4 +2652,697 @@ extern const u8 gNamingScreenRightPointingTriangleTiles[];
extern const u8 gNamingScreenUnderscoreTiles[];
extern const u16 gNamingScreenPalettes[][16];
+extern const u8 gMenuWordGroupIndicator_Gfx[];
+extern const u8 gMenuWordGroupFrame_Gfx[];
+extern const u16 gMenuWordGroupIndicator_Pal[];
+extern const u16 gMenuWordGroupFrame1_Pal[];
+extern const u16 gMenuWordGroupFrame2_Pal[];
+
+extern const u8 gUnknown_08E94510[];
+extern const u8 gUnknown_08E94550[];
+extern const u8 gUnknown_08E94590[];
+extern const u8 gUnknown_08E945D0[];
+extern const u8 gUnknown_08E94AD0[];
+extern const u8 gUnknown_08E953D0[];
+extern const u8 gUnknown_08E954B0[];
+extern const u8 gUnknown_08E95774[];
+extern const u16 gUnknown_08E95A18[];
+extern const u16 gUnknown_08E95AB8[];
+extern const u16 gUnknown_08E95FB8[];
+
+extern const u16 gSlotMachineSpritePalette0[];
+extern const u16 gSlotMachineSpritePalette1[];
+extern const u16 gSlotMachineSpritePalette2[];
+extern const u16 gSlotMachineSpritePalette3[];
+extern const u16 gSlotMachineSpritePalette4[];
+extern const u16 gSlotMachineSpritePalette5[];
+extern const u16 gSlotMachineSpritePalette6[];
+extern const u8 gSlotMachine_Gfx[];
+
+extern const u8 gSlotMachineReelSymbol1Tiles[];
+extern const u8 gSlotMachineReelSymbol2Tiles[];
+extern const u8 gSlotMachineReelSymbol3Tiles[];
+extern const u8 gSlotMachineReelSymbol4Tiles[];
+extern const u8 gSlotMachineReelSymbol5Tiles[];
+extern const u8 gSlotMachineReelSymbol6Tiles[];
+extern const u8 gSlotMachineReelSymbol7Tiles[];
+extern const u8 gSlotMachineNumber0Tiles[];
+extern const u8 gSlotMachineNumber1Tiles[];
+extern const u8 gSlotMachineNumber2Tiles[];
+extern const u8 gSlotMachineNumber3Tiles[];
+extern const u8 gSlotMachineNumber4Tiles[];
+extern const u8 gSlotMachineNumber5Tiles[];
+extern const u8 gSlotMachineNumber6Tiles[];
+extern const u8 gSlotMachineNumber7Tiles[];
+extern const u8 gSlotMachineNumber8Tiles[];
+extern const u8 gSlotMachineNumber9Tiles[];
+extern const u8 gSpriteImage_8E98828[];
+extern const u8 gSpriteImage_8E98848[];
+extern const u8 gSpriteImage_8E98868[];
+extern const u8 gSpriteImage_8E988E8[];
+extern const u8 gSpriteImage_8E98968[];
+extern const u8 gSpriteImage_8E989E8[];
+extern const u8 gSpriteImage_8E98A68[];
+extern const u8 gSpriteImage_8E98AE8[];
+extern const u8 gSpriteImage_8E98B68[];
+extern const u8 gSpriteImage_8E98BE8[];
+extern const u8 gSpriteImage_8E98CE8[];
+extern const u8 gSpriteImage_8E98DE8[];
+extern const u8 gSpriteImage_8E98FE8[];
+extern const u8 gSpriteImage_8E991E8[];
+extern const u8 gSpriteImage_8E993E8[];
+extern const u8 gUnknownPalette_08E997E8[];
+extern const u8 gSpriteImage_8E99808[];
+extern const u8 gSlotMachineReelTimeLights_Gfx[];
+extern const u8 gUnknown_08E99FB0[];
+extern const u8 gUnknown_08E9A100[];
+extern const u8 gUnknown_08E9A300[];
+extern const u8 gUnknown_08E9AB00[];
+extern const u8 gUnknown_08E9AB40[];
+extern const u8 gUnknown_08E9AB60[];
+extern const u8 gUnknown_08E9ABB4[];
+extern const u8 gUnknown_08E9AC2C[];
+extern const u8 gUnknown_08E9AC4C[];
+
+extern const u8 gInterviewOutlineCursorTiles[];
+extern const u8 gTitleScreenPressStart_Gfx[];
+extern const u16 gTitleScreenLogoShinePalette[];
+extern const u8 gUnknown_08E9D8CC[];
+extern const u8 gVersionTiles[];
+extern const u16 gUnknown_08E9F624[];
+extern const u8 gUnknown_08E9F7E4[];
+
+extern const u8 gCableCar_Gfx[];
+extern const u8 gCableCarDoor_Gfx[];
+extern const u8 gCableCarCord_Gfx[];
+extern const u16 gCableCar_Pal[];
+extern const u16 gCableCarBG_Pal[];
+extern const u8 gCableCarBG_Gfx[];
+
+extern const u8 gPSSMenuHeader_Gfx[];
+extern const u8 gPSSMenuHeader_Tilemap[];
+extern const u16 gPSSMenu1_Pal[];
+extern const u16 gPSSMenu2_Pal[];
+extern const u8 gPSSMenuMisc_Gfx[];
+extern const u8 gPSSMenuMisc_Tilemap[];
+extern const u16 gPSSMenu3_Pal[];
+extern const u16 gPSSMenu4_Pal[];
+
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_000;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_001;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_002;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_003;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_004;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_005;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_006;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_007;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_008;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_009;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_010;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_011;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_012;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_013;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_014;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_015;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_016;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_017;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_018;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_019;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_020;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_021;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_021;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_023;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_024;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_025;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_026;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_027;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_028;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_029;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_030;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_031;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_032;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_033;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_034;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_035;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_036;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_037;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_038;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_039;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_040;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_041;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_042;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_043;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_044;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_045;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_046;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_046;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_048;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_048;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_050;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_051;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_052;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_053;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_054;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_055;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_056;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_057;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_058;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_059;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_060;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_061;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_062;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_063;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_064;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_065;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_066;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_070;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_071;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_072;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_073;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_074;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_075;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_076;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_077;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_078;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_079;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_080;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_081;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_082;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_083;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_084;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_085;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_086;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_087;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_088;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_089;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_090;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_091;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_092;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_093;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_094;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_095;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_096;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_097;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_098;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_099;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_100;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_101;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_102;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_103;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_104;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_105;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_106;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_107;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_108;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_109;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_110;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_111;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_112;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_113;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_114;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_115;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_116;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_117;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_118;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_119;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_120;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_121;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_122;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_123;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_124;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_125;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_126;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_127;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_128;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_129;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_130;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_131;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_132;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_133;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_134;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_135;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_136;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_137;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_138;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_139;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_140;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_141;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_142;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_143;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_144;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_145;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_146;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_147;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_148;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_149;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_150;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_151;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_152;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_153;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_154;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_155;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_156;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_157;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_158;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_159;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_160;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_161;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_162;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_163;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_166;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_171;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_173;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_174;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_175;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_176;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_177;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_178;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_179;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_180;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_181;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_182;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_183;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_184;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_185;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_186;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_187;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_188;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_189;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_190;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_191;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_192;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_193;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_194;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_195;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_196;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_197;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_198;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_199;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_200;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_201;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_202;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_203;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_204;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_205;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_206;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_207;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_208;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_209;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_210;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_211;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_212;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_213;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_214;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_215;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_210;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_217;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_218;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_210;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_220;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_221;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_222;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_223;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_224;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_225;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_226;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_227;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_228;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_229;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_230;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_231;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_232;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_233;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_234;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_235;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_235;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_235;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_238;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_239;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_240;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_241;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_242;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_243;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_244;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_245;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_246;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_247;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_248;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_249;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_250;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_251;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_252;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_253;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_254;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_255;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_256;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_257;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_258;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_260;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_261;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_262;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_263;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_264;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_266;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_269;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_270;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_271;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_272;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_273;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_274;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_275;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_276;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_277;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_278;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_279;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_280;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_281;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_282;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_283;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_284;
+extern struct CompressedSpriteSheet gBattleAnimSpriteSheet_285;
+
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_000;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_001;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_002;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_003;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_004;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_005;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_006;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_007;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_008;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_009;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_010;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_011;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_012;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_013;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_014;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_015;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_016;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_016;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_018;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_019;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_020;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_021;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_022;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_023;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_024;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_025;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_026;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_027;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_028;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_029;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_030;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_031;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_032;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_033;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_033;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_033;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_036;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_036;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_038;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_039;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_038;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_038;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_042;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_043;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_044;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_045;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_046;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_047;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_048;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_049;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_050;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_050;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_050;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_026;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_054;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_050;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_056;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_057;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_058;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_059;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_060;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_061;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_062;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_063;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_064;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_065;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_066;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_067;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_068;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_065;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_070;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_070;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_072;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_073;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_074;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_075;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_076;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_076;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_078;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_078;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_080;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_081;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_082;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_083;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_084;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_085;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_086;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_087;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_088;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_089;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_090;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_091;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_092;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_093;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_094;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_095;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_096;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_097;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_094;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_099;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_100;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_101;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_101;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_103;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_104;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_105;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_105;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_107;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_107;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_109;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_109;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_111;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_112;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_113;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_114;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_115;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_116;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_117;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_118;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_119;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_120;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_121;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_122;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_122;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_124;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_125;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_126;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_127;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_128;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_128;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_130;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_130;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_132;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_133;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_133;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_135;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_136;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_135;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_135;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_139;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_140;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_141;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_141;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_143;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_144;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_139;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_115;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_147;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_148;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_148;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_150;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_150;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_152;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_153;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_154;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_155;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_156;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_157;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_158;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_159;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_160;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_161;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_162;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_163;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_164;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_165;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_166;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_167;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_168;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_169;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_170;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_171;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_172;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_174;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_175;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_176;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_177;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_178;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_179;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_182;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_183;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_184;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_185;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_186;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_187;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_188;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_189;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_190;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_191;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_192;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_193;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_194;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_195;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_196;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_197;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_198;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_199;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_200;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_201;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_202;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_203;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_204;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_205;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_206;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_207;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_209;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_210;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_211;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_215;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_216;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_217;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_218;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_219;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_220;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_221;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_222;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_223;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_224;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_225;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_226;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_228;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_229;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_230;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_231;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_233;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_234;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_235;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_236;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_237;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_238;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_239;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_240;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_241;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_242;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_243;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_244;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_245;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_248;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_249;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_251;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_252;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_253;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_254;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_255;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_256;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_257;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_258;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_259;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_260;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_261;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_262;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_263;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_264;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_265;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_266;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_267;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_268;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_269;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_270;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_271;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_272;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_274;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_277;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_278;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_279;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_280;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_281;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_282;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_283;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_284;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_285;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_286;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_287;
+extern struct CompressedSpritePalette gBattleAnimSpritePalette_288;
+
+extern struct BattleAnimBackground gBattleAnimBackgroundImage_00;
+extern struct BattleAnimBackground gBattleAnimBackgroundImage_02;
+extern struct BattleAnimBackground gBattleAnimBackgroundImage_03;
+extern struct BattleAnimBackground gBattleAnimBackgroundImage_04;
+extern struct BattleAnimBackground gBattleAnimBackgroundImage_07;
+extern struct BattleAnimBackground gBattleAnimBackgroundImage_09;
+extern struct BattleAnimBackground gBattleAnimBackgroundImage_11;
+extern struct BattleAnimBackground gBattleAnimBackgroundImage_12;
+extern struct BattleAnimBackground gBattleAnimBackgroundImage_15;
+extern struct BattleAnimBackground gBattleAnimBackgroundImage_16;
+extern struct BattleAnimBackground gBattleAnimBackgroundImage_17;
+extern struct BattleAnimBackground gBattleAnimBackgroundImage_20;
+extern struct BattleAnimBackground gBattleAnimBackgroundImage_21;
+extern struct BattleAnimBackground gBattleAnimBackgroundPalette_00;
+extern struct BattleAnimBackground gBattleAnimBackgroundPalette_02;
+extern struct BattleAnimBackground gBattleAnimBackgroundPalette_03;
+extern struct BattleAnimBackground gBattleAnimBackgroundPalette_04;
+extern struct BattleAnimBackground gBattleAnimBackgroundPalette_07;
+extern struct BattleAnimBackground gBattleAnimBackgroundPalette_09;
+extern struct BattleAnimBackground gBattleAnimBackgroundPalette_11;
+extern struct BattleAnimBackground gBattleAnimBackgroundPalette_12;
+extern struct BattleAnimBackground gBattleAnimBackgroundPalette_15;
+extern struct BattleAnimBackground gBattleAnimBackgroundPalette_16;
+extern struct BattleAnimBackground gBattleAnimBackgroundPalette_17;
+extern struct BattleAnimBackground gBattleAnimBackgroundPalette_18;
+extern struct BattleAnimBackground gBattleAnimBackgroundPalette_20;
+extern struct BattleAnimBackground gBattleAnimBackgroundPalette_21;
+extern struct BattleAnimBackground gBattleAnimBackgroundPalette_22;
+extern struct BattleAnimBackground gBattleAnimBackgroundPalette_24;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_00;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_02;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_03;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_04;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_05;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_06;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_07;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_08;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_09;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_10;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_11;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_12;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_13;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_14;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_15;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_16;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_17;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_20;
+extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_21;
+
#endif // GUARD_GRAPHICS_H
diff --git a/include/hof_pc.h b/include/hof_pc.h
new file mode 100644
index 000000000..c6df4e9a1
--- /dev/null
+++ b/include/hof_pc.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_hof_pc_H
+#define GUARD_hof_pc_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+
+void ReturnFromHallOfFamePC(void);
+
+#endif //GUARD_hof_pc_H
diff --git a/include/item_menu.h b/include/item_menu.h
index 29618f347..726d36789 100644
--- a/include/item_menu.h
+++ b/include/item_menu.h
@@ -27,7 +27,7 @@ void CleanUpItemMenuMessage(u8);
void CleanUpOverworldMessage(u8);
void ExecuteItemUseFromBlackPalette(void);
void sub_80A5D04(void);
-void sub_80A6300(void);
+void ItemMenu_LoadSellMenu(void);
void sub_80A68CC();
void sub_80A6A30(void);
bool32 sub_80A6D1C(void);
diff --git a/include/link.h b/include/link.h
index 367add625..6a7212645 100644
--- a/include/link.h
+++ b/include/link.h
@@ -167,7 +167,7 @@ u8 GetMultiplayerId(void);
u8 bitmask_all_link_players_but_self(void);
bool8 SendBlock(u8, void *, u16);
bool8 sub_8007E9C(u8);
-bool8 sub_8007ECC(void);
+bool8 IsLinkTaskFinished(void);
u8 GetBlockReceivedStatus(void);
void ResetBlockReceivedFlags(void);
void ResetBlockReceivedFlag(u8);
@@ -194,5 +194,9 @@ u32 LinkMain1(u8 *, u16 *, u16[CMD_LENGTH][MAX_LINK_PLAYERS]);
void LinkVSync(void);
void Timer3Intr(void);
void SerialCB(void);
+void LinkTestScreen(void);
+void debug_sub_8008218(u16 *buffer, void *arg1, u16 (*arg2)[], u32 arg3);
+void debug_sub_8008264(u32 value, int left, int top, int r3, int sp0);
+u32 sub_8007E40(void);
#endif // GUARD_LINK_H
diff --git a/include/m4a.h b/include/m4a.h
index 7d016c98b..57a749a58 100644
--- a/include/m4a.h
+++ b/include/m4a.h
@@ -8,6 +8,7 @@ void m4aSoundVSync(void);
void m4aSoundInit(void);
void m4aSoundMain(void);
void m4aSongNumStart(u16);
+void m4aSongNumStartOrChange(u16);
void m4aSongNumStop(u16 n);
void m4aMPlayAllStop(void);
void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo);
diff --git a/include/macros.inc b/include/macros.inc
new file mode 100644
index 000000000..f34353079
--- /dev/null
+++ b/include/macros.inc
@@ -0,0 +1,149 @@
+ .include "include/macros/asm.inc"
+ .include "include/macros/function.inc"
+ .include "include/macros/movement.inc"
+ .include "include/macros/pokemon_data.inc"
+ .include "include/macros/ec.inc"
+ .include "include/macros/map.inc"
+
+ .macro region_map_location x, y, width, height, name
+ .byte \x
+ .byte \y
+ .byte \width
+ .byte \height
+ .4byte gMapName_\name
+ .endm
+
+ .macro obj_tiles address, uncompressed_size, tag
+ .4byte \address
+ .2byte \uncompressed_size
+ .2byte \tag
+ .endm
+
+ .macro null_obj_tiles
+ obj_tiles 0, 0, 0
+ .endm
+
+ .macro obj_pal address, tag
+ .4byte \address
+ .2byte \tag
+ .2byte 0 @ padding
+ .endm
+
+ .macro null_obj_pal
+ obj_pal 0, 0
+ .endm
+
+ .macro paired_pals tag, address
+ .2byte \tag
+ .2byte 0 @ padding
+ .4byte \address
+ .endm
+
+@ For object animation frames.
+ .macro obj_frame_tiles address, uncompressed_size
+ .4byte \address
+ .2byte \uncompressed_size
+ .2byte 0 @ padding
+ .endm
+
+ .macro spr_template tile_tag, pal_tag, oam, anims, images, affine_anims, callback
+ .2byte \tile_tag
+ .2byte \pal_tag
+ .4byte \oam
+ .4byte \anims
+ .4byte \images
+ .4byte \affine_anims
+ .4byte \callback
+ .endm
+
+@ Berry trees have a table defining the palette slot used for each of their 5
+@ stages. However, the first 2 stages always use the same slots regardless of
+@ the type of tree and the slots of the last 3 stages always equal each other.
+ .macro berry_tree_palette_slot_table slot
+ .byte 3, 4, \slot, \slot, \slot
+ .endm
+
+ .macro subsprite x, y, priority, tile_num_offset, size
+ .2byte \x
+ .2byte \y
+ .2byte ((\priority) << 14) | ((\tile_num_offset) << 4) | SPRITE_SIZE_\size
+ .2byte 0 @ padding
+ .endm
+
+ .macro obj_image_anim_frame pic_id, duration, flags = 0
+ .2byte \pic_id
+ .byte (\flags) | (\duration)
+ .byte 0 @ padding
+ .endm
+
+ .macro obj_image_anim_loop count
+ .2byte 0xfffd
+ .byte \count
+ .byte 0 @ padding
+ .endm
+
+ .macro obj_image_anim_jump target_index
+ .2byte 0xfffe
+ .byte \target_index
+ .byte 0 @ padding
+ .endm
+
+ .macro obj_image_anim_end
+ .2byte 0xffff
+ .2byte 0 @ padding
+ .endm
+
+ .macro obj_rot_scal_anim_frame delta_x_scale, delta_y_scale, delta_angle, duration
+ .2byte \delta_x_scale
+ .2byte \delta_y_scale
+ .byte \delta_angle
+ .byte \duration
+ .2byte 0 @ padding
+ .endm
+
+ .macro obj_rot_scal_anim_loop count
+ .2byte 0x7ffd
+ .2byte \count
+ .4byte 0 @ padding
+ .endm
+
+ .macro obj_rot_scal_anim_jump target_index
+ .2byte 0x7ffe
+ .2byte \target_index
+ .4byte 0 @ padding
+ .endm
+
+ .macro obj_rot_scal_anim_end unknown=0
+ .2byte 0x7fff
+ .2byte \unknown
+ .fill 4 @ padding
+ .endm
+
+ .macro credits_entry number, text
+ .4byte \number
+ .4byte \text
+ .endm
+
+ .macro door_anim_frame unknown, offset
+ .byte \unknown
+ .byte 0 @ padding
+ .2byte \offset
+ .endm
+
+ .macro door_anim_gfx metatile_num, unknown, tile_addr, palette_addr
+ .2byte \metatile_num
+ .2byte \unknown
+ .4byte \tile_addr
+ .4byte \palette_addr
+ .endm
+
+ .macro trainer_eye_trainer opp_1, opp_2, opp_3, opp_4, opp_5, map_name
+ .2byte OPPONENT_\opp_1
+ .2byte OPPONENT_\opp_2
+ .2byte OPPONENT_\opp_3
+ .2byte OPPONENT_\opp_4
+ .2byte OPPONENT_\opp_5
+ .2byte GROUP_\map_name
+ .2byte MAP_\map_name
+ .space 2
+ .endm
diff --git a/include/macros/asm.inc b/include/macros/asm.inc
new file mode 100644
index 000000000..26b2707ca
--- /dev/null
+++ b/include/macros/asm.inc
@@ -0,0 +1,17 @@
+ .ifndef GUARD_ASM_MACROS_ASM_INC
+ .set GUARD_ASM_MACROS_ASM_INC, 1
+
+ .macro inc x
+ .set \x, \x + 1
+ .endm
+
+ .macro enum_start x=0
+ .set __enum__, \x
+ .endm
+
+ .macro enum constant
+ .equiv \constant, __enum__
+ inc __enum__
+ .endm
+
+ .endif @ GUARD_ASM_MACROS_ASM_INC
diff --git a/include/macros/battle_ai_script.inc b/include/macros/battle_ai_script.inc
new file mode 100644
index 000000000..679e30340
--- /dev/null
+++ b/include/macros/battle_ai_script.inc
@@ -0,0 +1,554 @@
+ .macro if_random_less_than percent, address
+ .byte 0x00
+ .byte \percent
+ .4byte \address
+ .endm
+
+ @ unused
+ .macro if_random_greater_than percent, address
+ .byte 0x01
+ .byte \percent
+ .4byte \address
+ .endm
+
+ @ unused
+ .macro if_random_equal address
+ .byte 0x02
+ .4byte \address
+ .endm
+
+ @ unused
+ .macro if_random_not_equal address
+ .byte 0x03
+ .4byte \address
+ .endm
+
+ .macro score score
+ .byte 0x04
+ .byte \score
+ .endm
+
+ .macro if_hp_less_than target, percent, address
+ .byte 0x05
+ .byte \target
+ .byte \percent
+ .4byte \address
+ .endm
+
+ .macro if_hp_more_than target, percent, address
+ .byte 0x06
+ .byte \target
+ .byte \percent
+ .4byte \address
+ .endm
+
+ .macro if_hp_equal target, percent, address
+ .byte 0x07
+ .byte \target
+ .byte \percent
+ .4byte \address
+ .endm
+
+ .macro if_hp_not_equal target, percent, address
+ .byte 0x08
+ .byte \target
+ .byte \percent
+ .4byte \address
+ .endm
+
+ .macro if_status target, status, address
+ .byte 0x09
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro if_not_status target, status, address
+ .byte 0x0a
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro if_status2 target, status, address
+ .byte 0x0b
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro if_not_status2 target, status, address
+ .byte 0x0c
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro if_status3 target, status, address
+ .byte 0x0d
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro if_not_status3 target, status, address
+ .byte 0x0e
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro if_status4 target, status, address
+ .byte 0x0f
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro if_not_status4 target, status, address
+ .byte 0x10
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro if_less_than value, address
+ .byte 0x11
+ .byte \value
+ .4byte \address
+ .endm
+
+ .macro if_more_than value, address
+ .byte 0x12
+ .byte \value
+ .4byte \address
+ .endm
+
+ .macro if_equal value, address
+ .byte 0x13
+ .byte \value
+ .4byte \address
+ .endm
+
+ .macro if_not_equal value, address
+ .byte 0x14
+ .byte \value
+ .4byte \address
+ .endm
+
+ .macro if_less_than_32 value, address
+ .byte 0x15
+ .4byte \value
+ .4byte \address
+ .endm
+
+ .macro if_more_than_32 value, address
+ .byte 0x16
+ .4byte \value
+ .4byte \address
+ .endm
+
+ .macro if_equal_32 value, address
+ .byte 0x17
+ .4byte \value
+ .4byte \address
+ .endm
+
+ .macro if_not_equal_32 value, address
+ .byte 0x18
+ .4byte \value
+ .4byte \address
+ .endm
+
+ .macro if_move move, address
+ .byte 0x19
+ .2byte \move
+ .4byte \address
+ .endm
+
+ .macro if_not_move move, address
+ .byte 0x1a
+ .2byte \move
+ .4byte \address
+ .endm
+
+ .macro if_in_bytes list, address
+ .byte 0x1b
+ .4byte \list
+ .4byte \address
+ .endm
+
+ .macro if_not_in_bytes list, address
+ .byte 0x1c
+ .4byte \list
+ .4byte \address
+ .endm
+
+ .macro if_in_words list, address
+ .byte 0x1d
+ .4byte \list
+ .4byte \address
+ .endm
+
+ .macro if_not_in_words list, address
+ .byte 0x1e
+ .4byte \list
+ .4byte \address
+ .endm
+
+ .macro if_user_can_damage address
+ .byte 0x1f
+ .4byte \address
+ .endm
+
+ .macro if_user_cant_damage address
+ .byte 0x20
+ .4byte \address
+ .endm
+
+ .macro get_turn_count
+ .byte 0x21
+ .endm
+
+ .macro get_type byte
+ .byte 0x22
+ .byte \byte
+ .endm
+
+ @ unused
+ .macro get_move_power
+ .byte 0x23
+ .endm
+
+ .macro is_most_powerful_move
+ .byte 0x24
+ .endm
+
+ .macro get_move target
+ .byte 0x25
+ .byte \target
+ .endm
+
+ .macro if_arg_equal type, address
+ .byte 0x26
+ .byte \type
+ .4byte \address
+ .endm
+
+ @ unused
+ .macro if_arg_not_equal type, address
+ .byte 0x27
+ .byte \type
+ .4byte \address
+ .endm
+
+ .macro if_would_go_first target, address
+ .byte 0x28
+ .byte \target
+ .4byte \address
+ .endm
+
+ .macro if_would_not_go_first target, address
+ .byte 0x29
+ .byte \target
+ .4byte \address
+ .endm
+
+ @ nullsub
+ .macro ai_2a
+ .byte 0x2a
+ .endm
+
+ @ nullsub
+ .macro ai_2b
+ .byte 0x2b
+ .endm
+
+ .macro count_alive_pokemon target
+ .byte 0x2c
+ .byte \target
+ .endm
+
+ @ unused
+ .macro get_considered_move
+ .byte 0x2d
+ .endm
+
+ .macro get_effect
+ .byte 0x2e
+ .endm
+
+ .macro get_ability target
+ .byte 0x2f
+ .byte \target
+ .endm
+
+ @ unused
+ .macro get_highest_possible_damage
+ .byte 0x30
+ .endm
+
+ .macro if_damage_bonus value, address
+ .byte 0x31
+ .byte \value
+ .4byte \address
+ .endm
+
+ @ nullsub
+ .macro ai_32
+ .byte 0x32
+ .endm
+
+ @ nullsub
+ .macro ai_33
+ .byte 0x33
+ .endm
+
+ .macro if_status_in_party target, status, address
+ .byte 0x34
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ @ bugged
+ .macro if_status_not_in_party target, status, address
+ .byte 0x35
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro get_weather
+ .byte 0x36
+ .endm
+
+ .macro if_effect byte, address
+ .byte 0x37
+ .byte \byte
+ .4byte \address
+ .endm
+
+ .macro if_not_effect byte, address
+ .byte 0x38
+ .byte \byte
+ .4byte \address
+ .endm
+
+ .macro if_stat_level_less_than target, stat, level, address
+ .byte 0x39
+ .byte \target
+ .byte \stat
+ .byte \level
+ .4byte \address
+ .endm
+
+ .macro if_stat_level_more_than target, stat, level, address
+ .byte 0x3a
+ .byte \target
+ .byte \stat
+ .byte \level
+ .4byte \address
+ .endm
+
+ .macro if_stat_level_equal target, stat, level, address
+ .byte 0x3b
+ .byte \target
+ .byte \stat
+ .byte \level
+ .4byte \address
+ .endm
+
+ .macro if_stat_level_not_equal target, stat, level, address
+ .byte 0x3c
+ .byte \target
+ .byte \stat
+ .byte \level
+ .4byte \address
+ .endm
+
+ .macro if_can_faint address
+ .byte 0x3d
+ .4byte \address
+ .endm
+
+ .macro if_cant_faint address
+ .byte 0x3e
+ .4byte \address
+ .endm
+
+ @ unused
+ .macro if_has_move, target, move, address
+ .byte 0x3f
+ .byte \target
+ .2byte \move
+ .4byte \address
+ .endm
+
+ @ unused
+ .macro if_dont_have_move, target, move, address
+ .byte 0x40
+ .byte \target
+ .2byte \move
+ .4byte \address
+ .endm
+
+ .macro if_move_effect target, effect, address
+ .byte 0x41
+ .byte \target
+ .byte \effect
+ .4byte \address
+ .endm
+
+ .macro if_not_move_effect target, effect, address
+ .byte 0x42
+ .byte \target
+ .byte \effect
+ .4byte \address
+ .endm
+
+ .macro if_last_move_did_damage target, byte, address
+ .byte 0x43
+ .byte \target
+ .byte \byte
+ .4byte \address
+ .endm
+
+ .macro if_encored target, address
+ .byte 0x44
+ .byte \target
+ .4byte \address
+ .endm
+
+ .macro flee
+ .byte 0x45
+ .endm
+
+ .macro if_random_100 address
+ .byte 0x46
+ .4byte \address
+ .endm
+
+ .macro watch
+ .byte 0x47
+ .endm
+
+ .macro get_hold_effect target
+ .byte 0x48
+ .byte \target
+ .endm
+
+ .macro get_gender target
+ .byte 0x49
+ .byte \target
+ .endm
+
+ .macro is_first_turn target
+ .byte 0x4a
+ .byte \target
+ .endm
+
+ .macro get_stockpile_count target
+ .byte 0x4b
+ .byte \target
+ .endm
+
+ .macro is_double_battle
+ .byte 0x4c
+ .endm
+
+ .macro get_item target
+ .byte 0x4d
+ .byte \target
+ .endm
+
+ .macro get_move_type_from_result
+ .byte 0x4e
+ .endm
+
+ .macro get_move_power_from_result
+ .byte 0x4f
+ .endm
+
+ .macro get_move_effect_from_result
+ .byte 0x50
+ .endm
+
+ .macro get_protect_count target
+ .byte 0x51
+ .byte \target
+ .endm
+
+ @ nullsub
+ .macro ai_52
+ .byte 0x52
+ .endm
+
+ @ nullsub
+ .macro ai_53
+ .byte 0x53
+ .endm
+
+ @ nullsub
+ .macro ai_54
+ .byte 0x54
+ .endm
+
+ @ nullsub
+ .macro ai_55
+ .byte 0x55
+ .endm
+
+ @ nullsub
+ .macro ai_56
+ .byte 0x56
+ .endm
+
+ @ nullsub
+ .macro ai_57
+ .byte 0x57
+ .endm
+
+ @ unused
+ .macro call address
+ .byte 0x58
+ .4byte \address
+ .endm
+
+ .macro jump address
+ .byte 0x59
+ .4byte \address
+ .endm
+
+ .macro end
+ .byte 0x5a
+ .endm
+
+ .macro if_level_cond cond, address
+ .byte 0x5b
+ .byte \cond
+ .4byte \address
+ .endm
+
+ .macro if_user_higher_level address
+ if_level_cond 0, \address
+ .endm
+
+ .macro if_target_higher_level address
+ if_level_cond 1, \address
+ .endm
+
+ .macro if_equal_levels address
+ if_level_cond 2, \address
+ .endm
+
+ @ unused
+ .macro if_taunted address
+ .byte 0x5c
+ .4byte \address
+ .endm
+
+ .macro if_not_taunted address
+ .byte 0x5d
+ .4byte \address
+ .endm
diff --git a/include/macros/battle_anim.inc b/include/macros/battle_anim.inc
new file mode 100644
index 000000000..4ff845032
--- /dev/null
+++ b/include/macros/battle_anim.inc
@@ -0,0 +1,266 @@
+ .macro loadsprite id
+ .byte 0x00
+ .2byte \id
+ .endm
+
+ .macro unloadsprite id
+ .byte 0x01
+ .2byte \id
+ .endm
+
+ .macro sprite template, priority, argv:vararg
+ .byte 0x02
+ .4byte \template
+ .byte \priority
+ .byte (.Lsprite_\@_2 - .Lsprite_\@_1) / 2
+.Lsprite_\@_1:
+ .2byte \argv
+.Lsprite_\@_2:
+ .endm
+
+ .macro createtask addr, priority, argv:vararg
+ .byte 0x03
+ .4byte \addr
+ .byte \priority
+ .byte (.Lcreatetask_\@_2 - .Lcreatetask_\@_1) / 2
+.Lcreatetask_\@_1:
+ .2byte \argv
+.Lcreatetask_\@_2:
+ .endm
+
+ .macro pause delay
+ .byte 0x04
+ .byte \delay
+ .endm
+
+ .macro wait
+ .byte 0x05
+ .endm
+
+ .macro hang1
+ .byte 0x06
+ .endm
+
+ .macro hang2
+ .byte 0x07
+ .endm
+
+ .macro end
+ .byte 0x08
+ .endm
+
+ .macro playse id
+ .byte 0x09
+ .2byte \id
+ .endm
+
+ .macro monbg which
+ .byte 0x0A
+ .byte \which
+ .endm
+
+ .macro clearmonbg which
+ .byte 0x0B
+ .byte \which
+ .endm
+
+ .macro setalpha eva, evb
+ .byte 0x0C
+ .2byte ((\evb) << 8) | (\eva)
+ .endm
+
+ .macro blendoff
+ .byte 0x0D
+ .endm
+
+ .macro call addr
+ .byte 0x0E
+ .4byte \addr
+ .endm
+
+ .macro ret
+ .byte 0x0F
+ .endm
+
+ .macro setvar var_num, value
+ .byte 0x10
+ .byte \var_num
+ .2byte \value
+ .endm
+
+ .macro ifelse addr1, addr2
+ .byte 0x11
+ .4byte \addr1
+ .4byte \addr2
+ .endm
+
+ .macro jumpif cond, addr
+ .byte 0x12
+ .byte \cond
+ .4byte \addr
+ .endm
+
+ .macro jump addr
+ .byte 0x13
+ .4byte \addr
+ .endm
+
+ .macro fadetobg id
+ .byte 0x14
+ .byte \id
+ .endm
+
+ .macro restorebg
+ .byte 0x15
+ .endm
+
+ .macro waitbgfadeout
+ .byte 0x16
+ .endm
+
+ .macro waitbgfadein
+ .byte 0x17
+ .endm
+
+ .macro changebg id
+ .byte 0x18
+ .byte \id
+ .endm
+
+ .macro panse_19 id, pan
+ .byte 0x19
+ .2byte \id
+ .byte \pan
+ .endm
+
+ .macro setpan pan
+ .byte 0x1A
+ .byte \pan
+ .endm
+
+ .macro panse_1B id, pan_start, pan_end, step, delay
+ .byte 0x1B
+ .2byte \id
+ .byte \pan_start
+ .byte \pan_end
+ .byte \step
+ .byte \delay
+ .endm
+
+ .macro panse_1C id, pan, delay, count
+ .byte 0x1C
+ .2byte \id
+ .byte \pan
+ .byte \delay
+ .byte \count
+ .endm
+
+ .macro panse_1D id, pan, count
+ .byte 0x1D
+ .2byte \id
+ .byte \pan
+ .byte \count
+ .endm
+
+ .macro setbldcnt bldcnt
+ .byte 0x1E
+ .2byte \bldcnt
+ .endm
+
+ .macro createtask_1F addr, argv:vararg
+ .byte 0x1F
+ .4byte \addr
+ .byte (.Lcreatetask_1F_\@_2 - .Lcreatetask_1F_\@_1) / 2
+.Lcreatetask_1F_\@_1:
+ .2byte \argv
+.Lcreatetask_1F_\@_2:
+ .endm
+
+ .macro waitsound
+ .byte 0x20
+ .endm
+
+ .macro jumpvareq var_num, value, addr
+ .byte 0x21
+ .byte \var_num
+ .2byte \value
+ .4byte \addr
+ .endm
+
+ .macro monbg_22 unk
+ .byte 0x22
+ .byte \unk
+ .endm
+
+ .macro clearmonbg_23 unk
+ .byte 0x23
+ .byte \unk
+ .endm
+
+ .macro jumpunkcond addr
+ .byte 0x24
+ .4byte \addr
+ .endm
+
+ .macro fadetobg_25 a, b, c
+ .byte 0x25
+ .byte \a
+ .byte \b
+ .byte \c
+ .endm
+
+ .macro panse_26 id, pan_start, pan_end, step, delay
+ .byte 0x26
+ .2byte \id
+ .byte \pan_start
+ .byte \pan_end
+ .byte \step
+ .byte \delay
+ .endm
+
+ .macro panse_27 id, pan_start, pan_end, step, delay
+ .byte 0x27
+ .2byte \id
+ .byte \pan_start
+ .byte \pan_end
+ .byte \step
+ .byte \delay
+ .endm
+
+ .macro monbgprio_28 unk
+ .byte 0x28
+ .byte \unk
+ .endm
+
+ .macro monbgprio_29
+ .byte 0x29
+ .endm
+
+ .macro monbgprio_2A unk
+ .byte 0x2A
+ .byte \unk
+ .endm
+
+ .macro invisible side
+ .byte 0x2B
+ .byte \side
+ .endm
+
+ .macro visible side
+ .byte 0x2C
+ .byte \side
+ .endm
+
+ .macro doublebattle_2D unk
+ .byte 0x2D
+ .byte \unk
+ .endm
+
+ .macro doublebattle_2E unk
+ .byte 0x2E
+ .byte \unk
+ .endm
+
+ .macro stopsound
+ .byte 0x2F
+ .endm
diff --git a/include/macros/battle_script.inc b/include/macros/battle_script.inc
new file mode 100644
index 000000000..e4fa0c454
--- /dev/null
+++ b/include/macros/battle_script.inc
@@ -0,0 +1,1414 @@
+@ 0 ==
+@ 1 !=
+@ 2 <
+@ 3 >
+@ 4 &=
+
+ .macro calculatedamage
+ critical
+ atk5
+ atk6
+ atk7
+ .endm
+
+
+ .macro attackcanceler
+ .byte 0x00
+ .endm
+
+ .macro accuracycheck address, param1
+ .byte 0x01
+ .4byte \address
+ .2byte \param1
+ .endm
+
+ .macro attackstring
+ .byte 0x02
+ .endm
+
+ .macro ppreduce
+ .byte 0x03
+ .endm
+
+ .macro critcalc
+ .byte 0x04
+ .endm
+
+ .macro damagecalc
+ .byte 0x05
+ .endm
+
+ .macro typecalc
+ .byte 0x06
+ .endm
+
+ .macro adjustnormaldamage
+ .byte 0x07
+ .endm
+
+ .macro adjustnormaldamage2
+ .byte 0x08
+ .endm
+
+ .macro attackanimation
+ .byte 0x09
+ .endm
+
+ .macro waitanimation
+ .byte 0x0a
+ .endm
+
+ .macro healthbarupdate bank
+ .byte 0x0b
+ .byte \bank
+ .endm
+
+ .macro datahpupdate bank
+ .byte 0x0c
+ .byte \bank
+ .endm
+
+ .macro critmessage
+ .byte 0x0d
+ .endm
+
+ .macro effectivenesssound
+ .byte 0x0e
+ .endm
+
+ .macro resultmessage
+ .byte 0x0f
+ .endm
+
+ .macro printstring string
+ .byte 0x10
+ .2byte \string
+ .endm
+
+ .macro printselectionstring string
+ .byte 0x11
+ .2byte \string
+ .endm
+
+ .macro waitmessage delay
+ .byte 0x12
+ .2byte \delay
+ .endm
+
+ .macro printfromtable table
+ .byte 0x13
+ .4byte \table
+ .endm
+
+ .macro printselectionstringfromtable table
+ .byte 0x14
+ .4byte \table
+ .endm
+
+ .macro seteffectwithchance
+ .byte 0x15
+ .endm
+
+ .macro seteffectprimary
+ .byte 0x16
+ .endm
+
+ .macro seteffectsecondary
+ .byte 0x17
+ .endm
+
+ .macro clearstatusfromeffect bank
+ .byte 0x18
+ .byte \bank
+ .endm
+
+ .macro tryfaintmon bank, param2, param3
+ .byte 0x19
+ .byte \bank
+ .byte \param2
+ .4byte \param3
+ .endm
+
+ .macro dofaintanimation param1
+ .byte 0x1a
+ .byte \param1
+ .endm
+
+ .macro cleareffectsonfaint bank
+ .byte 0x1b
+ .byte \bank
+ .endm
+
+ .macro jumpifstatus bank, status, address
+ .byte 0x1c
+ .byte \bank
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro jumpifstatus2 bank, status, address
+ .byte 0x1d
+ .byte \bank
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro jumpifability bank, ability, address
+ .byte 0x1e
+ .byte \bank
+ .byte \ability
+ .4byte \address
+ .endm
+
+ .macro jumpifsideaffecting bank, status, address
+ .byte 0x1f
+ .byte \bank
+ .2byte \status
+ .4byte \address
+ .endm
+
+ .macro jumpifstat bank, flag, quantity, statid, address
+ .byte 0x20
+ .byte \bank
+ .byte \flag
+ .byte \quantity
+ .byte \statid
+ .4byte \address
+ .endm
+
+ .macro jumpifstatus3condition bank, mask, status, address
+ .byte 0x21
+ .byte \bank
+ .4byte \mask
+ .byte \status
+ .4byte \address
+ .endm
+
+ .macro jumpiftype bank, type, address
+ .byte 0x22
+ .byte \bank
+ .byte \type
+ .4byte \address
+ .endm
+
+ .macro getexp bank
+ .byte 0x23
+ .byte \bank
+ .endm
+
+ .macro atk24 address
+ .byte 0x24
+ .4byte \address
+ .endm
+
+ .macro movevaluescleanup
+ .byte 0x25
+ .endm
+
+ .macro setmultihit param1
+ .byte 0x26
+ .byte \param1
+ .endm
+
+ .macro decrementmultihit address
+ .byte 0x27
+ .4byte \address
+ .endm
+
+ .macro goto address
+ .byte 0x28
+ .4byte \address
+ .endm
+
+ .macro jumpifbyte ifflag, checkaddr, compare, address
+ .byte 0x29
+ .byte \ifflag
+ .4byte \checkaddr
+ .byte \compare
+ .4byte \address
+ .endm
+
+ .macro jumpifhalfword ifflag, checkaddr, compare, address
+ .byte 0x2a
+ .byte \ifflag
+ .4byte \checkaddr
+ .2byte \compare
+ .4byte \address
+ .endm
+
+ .macro jumpifword ifflag, checkaddr, compare, address
+ .byte 0x2b
+ .byte \ifflag
+ .4byte \checkaddr
+ .4byte \compare
+ .4byte \address
+ .endm
+
+ .macro jumpifarrayequal mem1, mem2, size, address
+ .byte 0x2c
+ .4byte \mem1
+ .4byte \mem2
+ .byte \size
+ .4byte \address
+ .endm
+
+ .macro jumpifarraynotequal mem1, mem2, size, address
+ .byte 0x2d
+ .4byte \mem1
+ .4byte \mem2
+ .byte \size
+ .4byte \address
+ .endm
+
+ .macro setbyte pointer, value
+ .byte 0x2e
+ .4byte \pointer
+ .byte \value
+ .endm
+
+ .macro addbyte pointer, value
+ .byte 0x2f
+ .4byte \pointer
+ .byte \value
+ .endm
+
+ .macro subbyte pointer, value
+ .byte 0x30
+ .4byte \pointer
+ .byte \value
+ .endm
+
+ .macro copyarray destination, source, size
+ .byte 0x31
+ .4byte \destination
+ .4byte \source
+ .byte \size
+ .endm
+
+ .macro copyarraywithindex param1, param2, param3, byte
+ .byte 0x32
+ .4byte \param1
+ .4byte \param2
+ .4byte \param3
+ .byte \byte
+ .endm
+
+ .macro orbyte pointer, value
+ .byte 0x33
+ .4byte \pointer
+ .byte \value
+ .endm
+
+ .macro orhalfword pointer, value
+ .byte 0x34
+ .4byte \pointer
+ .2byte \value
+ .endm
+
+ .macro orword pointer, value
+ .byte 0x35
+ .4byte \pointer
+ .4byte \value
+ .endm
+
+ .macro bicbyte pointer, value
+ .byte 0x36
+ .4byte \pointer
+ .byte \value
+ .endm
+
+ .macro bichalfword pointer, value
+ .byte 0x37
+ .4byte \pointer
+ .2byte \value
+ .endm
+
+ .macro bicword pointer, value
+ .byte 0x38
+ .4byte \pointer
+ .4byte \value
+ .endm
+
+ .macro pause pause_duration
+ .byte 0x39
+ .2byte \pause_duration
+ .endm
+
+ .macro waitstate
+ .byte 0x3a
+ .endm
+
+ .macro healthbar_update bank
+ .byte 0x3b
+ .byte \bank
+ .endm
+
+ .macro return
+ .byte 0x3c
+ .endm
+
+ .macro end
+ .byte 0x3d
+ .endm
+
+ .macro end2
+ .byte 0x3e
+ .endm
+
+ .macro end3
+ .byte 0x3f
+ .endm
+
+ .macro jumpifaffectedbyprotect address
+ .byte 0x40
+ .4byte \address
+ .endm
+
+ .macro call address
+ .byte 0x41
+ .4byte \address
+ .endm
+
+ .macro jumpiftype2 bank, type, address
+ .byte 0x42
+ .byte \bank
+ .byte \type
+ .4byte \address
+ .endm
+
+ .macro jumpifabilitypresent ability, address
+ .byte 0x43
+ .byte \ability
+ .4byte \address
+ .endm
+
+ .macro endselectionscript
+ .byte 0x44
+ .endm
+
+ .macro playanimation bank, animation, var_address
+ .byte 0x45
+ .byte \bank
+ .byte \animation
+ .4byte \var_address
+ .endm
+
+ .macro playanimation2 bank, address, int
+ .byte 0x46
+ .byte \bank
+ .4byte \address
+ .4byte \int
+ .endm
+
+ .macro setgraphicalstatchangevalues
+ .byte 0x47
+ .endm
+
+ .macro playstatchangeanimation bank, color, byte
+ .byte 0x48
+ .byte \bank
+ .byte \color
+ .byte \byte
+ .endm
+
+ .macro moveend byte1, byte2
+ .byte 0x49
+ .byte \byte1
+ .byte \byte2
+ .endm
+
+ .macro typecalc2
+ .byte 0x4a
+ .endm
+
+ .macro returnatktoball
+ .byte 0x4b
+ .endm
+
+ .macro getswitchedmondata bank
+ .byte 0x4c
+ .byte \bank
+ .endm
+
+ .macro switchindataupdate bank
+ .byte 0x4d
+ .byte \bank
+ .endm
+
+ .macro switchinanim bank, byte
+ .byte 0x4e
+ .byte \bank
+ .byte \byte
+ .endm
+
+ .macro jumpifcantswitch bank, address
+ .byte 0x4f
+ .byte \bank
+ .4byte \address
+ .endm
+
+ .macro openpartyscreen bank, address
+ .byte 0x50
+ .byte \bank
+ .4byte \address
+ .endm
+
+ .macro switchhandleorder bank, param2
+ .byte 0x51
+ .byte \bank
+ .byte \param2
+ .endm
+
+ .macro switchineffects bank
+ .byte 0x52
+ .byte \bank
+ .endm
+
+ .macro trainerslidein bank
+ .byte 0x53
+ .byte \bank
+ .endm
+
+ .macro playse word
+ .byte 0x54
+ .2byte \word
+ .endm
+
+ .macro fanfare int
+ .byte 0x55
+ .2byte \int
+ .endm
+
+ .macro playfaintcry bank_or_side
+ .byte 0x56
+ .byte \bank_or_side
+ .endm
+
+ .macro atk57
+ .byte 0x57
+ .endm
+
+ .macro returntoball bank
+ .byte 0x58
+ .byte \bank
+ .endm
+
+ .macro handlelearnnewmove param1, param2, bank_maybe
+ .byte 0x59
+ .4byte \param1
+ .4byte \param2
+ .byte \bank_maybe
+ .endm
+
+ .macro yesnoboxlearnmove address
+ .byte 0x5a
+ .4byte \address
+ .endm
+
+ .macro yesnoboxstoplearningmove address
+ .byte 0x5b
+ .4byte \address
+ .endm
+
+ .macro hitanimation bank
+ .byte 0x5c
+ .byte \bank
+ .endm
+
+ .macro getmoneyreward
+ .byte 0x5d
+ .endm
+
+ .macro atk5e bank
+ .byte 0x5e
+ .byte \bank
+ .endm
+
+ .macro atk5f
+ .byte 0x5f
+ .endm
+
+ .macro incrementgamestat byte
+ .byte 0x60
+ .byte \byte
+ .endm
+
+ .macro drawpartystatussummary bank_or_side
+ .byte 0x61
+ .byte \bank_or_side
+ .endm
+
+ .macro atk62 bank_or_side
+ .byte 0x62
+ .byte \bank_or_side
+ .endm
+
+ .macro jumptorandomattack bank
+ .byte 0x63
+ .byte \bank
+ .endm
+
+ .macro statusanimation bank
+ .byte 0x64
+ .byte \bank
+ .endm
+
+ .macro status2animation bank_or_side, address
+ .byte 0x65
+ .byte \bank_or_side
+ .4byte \address
+ .endm
+
+ .macro chosenstatusanimation bank_or_side, bank_or_side2, address
+ .byte 0x66
+ .byte \bank_or_side
+ .byte \bank_or_side2
+ .4byte \address
+ .endm
+
+ .macro yesnobox
+ .byte 0x67
+ .endm
+
+ .macro cancelallactions
+ .byte 0x68
+ .endm
+
+ .macro adjustsetdamage
+ .byte 0x69
+ .endm
+
+ .macro removeitem bank
+ .byte 0x6a
+ .byte \bank
+ .endm
+
+ .macro atknameinbuff1
+ .byte 0x6b
+ .endm
+
+ .macro drawlvlupbox
+ .byte 0x6c
+ .endm
+
+ .macro resetsentmonsvalue
+ .byte 0x6d
+ .endm
+
+ .macro setatktoplayer0
+ .byte 0x6e
+ .endm
+
+ .macro makevisible bank
+ .byte 0x6f
+ .byte \bank
+ .endm
+
+ .macro recordlastability bank
+ .byte 0x70
+ .byte \bank
+ .endm
+
+ .macro buffermovetolearn
+ .byte 0x71
+ .endm
+
+ .macro jumpifplayerran address
+ .byte 0x72
+ .4byte \address
+ .endm
+
+ .macro hpthresholds bank
+ .byte 0x73
+ .byte \bank
+ .endm
+
+ .macro hpthresholds2 bank
+ .byte 0x74
+ .byte \bank
+ .endm
+
+ .macro useitemonopponent
+ .byte 0x75
+ .endm
+
+ .macro various bank, byte
+ .byte 0x76
+ .byte \bank
+ .byte \byte
+ .endm
+
+ .macro setprotectlike
+ .byte 0x77
+ .endm
+
+ .macro faintifabilitynotdamp
+ .byte 0x78
+ .endm
+
+ .macro setatkhptozero
+ .byte 0x79
+ .endm
+
+ .macro jumpifnexttargetvalid address
+ .byte 0x7a
+ .4byte \address
+ .endm
+
+ .macro tryhealhalfhealth address, byte
+ .byte 0x7b
+ .4byte \address
+ .byte \byte
+ .endm
+
+ .macro trymirrormove
+ .byte 0x7c
+ .endm
+
+ .macro setrain
+ .byte 0x7d
+ .endm
+
+ .macro setreflect
+ .byte 0x7e
+ .endm
+
+ .macro setseeded
+ .byte 0x7f
+ .endm
+
+ .macro manipulatedamage id
+ .byte 0x80
+ .byte \id
+ .endm
+
+ .macro trysetrest address
+ .byte 0x81
+ .4byte \address
+ .endm
+
+ .macro jumpifnotfirstturn address
+ .byte 0x82
+ .4byte \address
+ .endm
+
+ .macro nop
+ .byte 0x83
+ .endm
+
+ .macro jumpifcantmakeasleep address
+ .byte 0x84
+ .4byte \address
+ .endm
+
+ .macro stockpile
+ .byte 0x85
+ .endm
+
+ .macro stockpiletobasedamage address
+ .byte 0x86
+ .4byte \address
+ .endm
+
+ .macro stockpiletohpheal address
+ .byte 0x87
+ .4byte \address
+ .endm
+
+ .macro negativedamage
+ .byte 0x88
+ .endm
+
+ .macro statbuffchange target, address
+ .byte 0x89
+ .byte \target
+ .4byte \address
+ .endm
+
+ .macro normalisebuffs
+ .byte 0x8a
+ .endm
+
+ .macro setbide
+ .byte 0x8b
+ .endm
+
+ .macro confuseifrepeatingattackends
+ .byte 0x8c
+ .endm
+
+ .macro setmultihitcounter count
+ .byte 0x8d
+ .byte \count
+ .endm
+
+ .macro initmultihitstring
+ .byte 0x8e
+ .endm
+
+ .macro forcerandomswitch address
+ .byte 0x8f
+ .4byte \address
+ .endm
+
+ .macro tryconversiontypechange address
+ .byte 0x90
+ .4byte \address
+ .endm
+
+ .macro givepaydaymoney
+ .byte 0x91
+ .endm
+
+ .macro setlightscreen
+ .byte 0x92
+ .endm
+
+ .macro tryKO address
+ .byte 0x93
+ .4byte \address
+ .endm
+
+ .macro damagetohalftargethp
+ .byte 0x94
+ .endm
+
+ .macro setsandstorm
+ .byte 0x95
+ .endm
+
+ .macro weatherdamage
+ .byte 0x96
+ .endm
+
+ .macro tryinfatuating address
+ .byte 0x97
+ .4byte \address
+ .endm
+
+ .macro updatestatusicon byte
+ .byte 0x98
+ .byte \byte
+ .endm
+
+ .macro setmist
+ .byte 0x99
+ .endm
+
+ .macro setfocusenergy
+ .byte 0x9a
+ .endm
+
+ .macro transformdataexecution
+ .byte 0x9b
+ .endm
+
+ .macro setsubstitute
+ .byte 0x9c
+ .endm
+
+ .macro mimicattackcopy address
+ .byte 0x9d
+ .4byte \address
+ .endm
+
+ .macro metronome
+ .byte 0x9e
+ .endm
+
+ .macro dmgtolevel
+ .byte 0x9f
+ .endm
+
+ .macro psywavedamageeffect
+ .byte 0xa0
+ .endm
+
+ .macro counterdamagecalculator address
+ .byte 0xa1
+ .4byte \address
+ .endm
+
+ .macro mirrorcoatdamagecalculator address
+ .byte 0xa2
+ .4byte \address
+ .endm
+
+ .macro disablelastusedattack address
+ .byte 0xa3
+ .4byte \address
+ .endm
+
+ .macro trysetencore address
+ .byte 0xa4
+ .4byte \address
+ .endm
+
+ .macro painsplitdmgcalc address
+ .byte 0xa5
+ .4byte \address
+ .endm
+
+ .macro settypetorandomresistance address
+ .byte 0xa6
+ .4byte \address
+ .endm
+
+ .macro setalwayshitflag
+ .byte 0xa7
+ .endm
+
+ .macro copymovepermanently address
+ .byte 0xa8
+ .4byte \address
+ .endm
+
+ .macro trychoosesleeptalkmove address
+ .byte 0xa9
+ .4byte \address
+ .endm
+
+ .macro setdestinybond
+ .byte 0xaa
+ .endm
+
+ .macro trysetdestinybondtohappen
+ .byte 0xab
+ .endm
+
+ .macro remaininghptopower
+ .byte 0xac
+ .endm
+
+ .macro tryspiteppreduce address
+ .byte 0xad
+ .4byte \address
+ .endm
+
+ .macro healpartystatus
+ .byte 0xae
+ .endm
+
+ .macro cursetarget address
+ .byte 0xaf
+ .4byte \address
+ .endm
+
+ .macro trysetspikes address
+ .byte 0xb0
+ .4byte \address
+ .endm
+
+ .macro setforesight
+ .byte 0xb1
+ .endm
+
+ .macro trysetperishsong address
+ .byte 0xb2
+ .4byte \address
+ .endm
+
+ .macro rolloutdamagecalculation
+ .byte 0xb3
+ .endm
+
+ .macro jumpifconfusedandstatmaxed bank, address
+ .byte 0xb4
+ .byte \bank
+ .4byte \address
+ .endm
+
+ .macro furycuttercalc
+ .byte 0xb5
+ .endm
+
+ .macro happinesstodamagecalculation
+ .byte 0xb6
+ .endm
+
+ .macro presentdamagecalculation
+ .byte 0xb7
+ .endm
+
+ .macro setsafeguard
+ .byte 0xb8
+ .endm
+
+ .macro magnitudedamagecalculation
+ .byte 0xb9
+ .endm
+
+ .macro jumpifnopursuitswitchdmg address
+ .byte 0xba
+ .4byte \address
+ .endm
+
+ .macro setsunny
+ .byte 0xbb
+ .endm
+
+ .macro maxattackhalvehp address
+ .byte 0xbc
+ .4byte \address
+ .endm
+
+ .macro copyfoestats address
+ .byte 0xbd
+ .4byte \address
+ .endm
+
+ .macro rapidspinfree
+ .byte 0xbe
+ .endm
+
+ .macro setdefensecurlbit
+ .byte 0xbf
+ .endm
+
+ .macro recoverbasedonsunlight address
+ .byte 0xc0
+ .4byte \address
+ .endm
+
+ .macro hiddenpowercalc
+ .byte 0xc1
+ .endm
+
+ .macro selectfirstvalidtarget
+ .byte 0xc2
+ .endm
+
+ .macro trysetfutureattack address
+ .byte 0xc3
+ .4byte \address
+ .endm
+
+ .macro trydobeatup address1, address2
+ .byte 0xc4
+ .4byte \address1
+ .4byte \address2
+ .endm
+
+ .macro setsemiinvulnerablebit
+ .byte 0xc5
+ .endm
+
+ .macro clearsemiinvulnerablebit
+ .byte 0xc6
+ .endm
+
+ .macro setminimize
+ .byte 0xc7
+ .endm
+
+ .macro sethail
+ .byte 0xc8
+ .endm
+
+ .macro jumpifattackandspecialattackcannotfall address
+ .byte 0xc9
+ .4byte \address
+ .endm
+
+ .macro setforcedtarget
+ .byte 0xca
+ .endm
+
+ .macro setcharge
+ .byte 0xcb
+ .endm
+
+ .macro callterrainattack
+ .byte 0xcc
+ .endm
+
+ .macro cureifburnedparalysedorpoisoned address
+ .byte 0xcd
+ .4byte \address
+ .endm
+
+ .macro settorment address
+ .byte 0xce
+ .4byte \address
+ .endm
+
+ .macro jumpifnodamage address
+ .byte 0xcf
+ .4byte \address
+ .endm
+
+ .macro settaunt address
+ .byte 0xd0
+ .4byte \address
+ .endm
+
+ .macro trysethelpinghand address
+ .byte 0xd1
+ .4byte \address
+ .endm
+
+ .macro tryswapitems address
+ .byte 0xd2
+ .4byte \address
+ .endm
+
+ .macro trycopyability address
+ .byte 0xd3
+ .4byte \address
+ .endm
+
+ .macro trywish byte, address
+ .byte 0xd4
+ .byte \byte
+ .4byte \address
+ .endm
+
+ .macro trysetroots address
+ .byte 0xd5
+ .4byte \address
+ .endm
+
+ .macro doubledamagedealtifdamaged
+ .byte 0xd6
+ .endm
+
+ .macro setyawn address
+ .byte 0xd7
+ .4byte \address
+ .endm
+
+ .macro setdamagetohealthdifference address
+ .byte 0xd8
+ .4byte \address
+ .endm
+
+ .macro scaledamagebyhealthratio
+ .byte 0xd9
+ .endm
+
+ .macro tryswapabilities address
+ .byte 0xda
+ .4byte \address
+ .endm
+
+ .macro tryimprision address
+ .byte 0xdb
+ .4byte \address
+ .endm
+
+ .macro trysetgrudge address
+ .byte 0xdc
+ .4byte \address
+ .endm
+
+ .macro weightdamagecalculation
+ .byte 0xdd
+ .endm
+
+ .macro assistattackselect address
+ .byte 0xde
+ .4byte \address
+ .endm
+
+ .macro trysetmagiccoat address
+ .byte 0xdf
+ .4byte \address
+ .endm
+
+ .macro trysetsnatch address
+ .byte 0xe0
+ .4byte \address
+ .endm
+
+ .macro trygetintimidatetarget address
+ .byte 0xe1
+ .4byte \address
+ .endm
+
+ .macro switchoutabilities bank
+ .byte 0xe2
+ .byte \bank
+ .endm
+
+ .macro jumpifhasnohp bank, address
+ .byte 0xe3
+ .byte \bank
+ .4byte \address
+ .endm
+
+ .macro getsecretpowereffect
+ .byte 0xe4
+ .endm
+
+ .macro pickup
+ .byte 0xe5
+ .endm
+
+ .macro docastformchangeanimation
+ .byte 0xe6
+ .endm
+
+ .macro trycastformdatachange
+ .byte 0xe7
+ .endm
+
+ .macro settypebasedhalvers address
+ .byte 0xe8
+ .4byte \address
+ .endm
+
+ .macro setweatherballtype
+ .byte 0xe9
+ .endm
+
+ .macro tryrecycleitem address
+ .byte 0xea
+ .4byte \address
+ .endm
+
+ .macro settypetoterrain address
+ .byte 0xeb
+ .4byte \address
+ .endm
+
+ .macro pursuitrelated address
+ .byte 0xec
+ .4byte \address
+ .endm
+
+ .macro snatchsetbanks
+ .byte 0xed
+ .endm
+
+ .macro removelightscreenreflect
+ .byte 0xee
+ .endm
+
+ .macro handleballthrow
+ .byte 0xef
+ .endm
+
+ .macro givecaughtmon
+ .byte 0xf0
+ .endm
+
+ .macro trysetcaughtmondexflags address
+ .byte 0xf1
+ .4byte \address
+ .endm
+
+ .macro displaydexinfo
+ .byte 0xf2
+ .endm
+
+ .macro trygivecaughtmonnick address
+ .byte 0xf3
+ .4byte \address
+ .endm
+
+ .macro subattackerhpbydmg
+ .byte 0xf4
+ .endm
+
+ .macro removeattackerstatus1
+ .byte 0xf5
+ .endm
+
+ .macro finishaction
+ .byte 0xf6
+ .endm
+
+ .macro finishturn
+ .byte 0xf7
+ .endm
+
+ .macro trainerslideout bank
+ .byte 0xf8
+ .byte \bank
+ .endm
+
+@ various command changed to more readable macros
+ .macro cancelmultiturnmoves bank
+ various \bank, VARIOUS_CANCEL_MULTI_TURN_MOVES
+ .endm
+
+ .macro setmagiccoattarget bank
+ various \bank, VARIOUS_SET_MAGIC_COAT_TARGET
+ .endm
+
+ .macro getifcantrunfrombattle bank
+ various \bank, VARIOUS_IS_RUNNING_IMPOSSIBLE
+ .endm
+
+ .macro getmovetarget bank
+ various \bank, VARIOUS_GET_MOVE_TARGET
+ .endm
+
+ .macro various4 bank
+ various \bank, 4
+ .endm
+
+ .macro resetintrimidatetracebits bank
+ various \bank, VARIOUS_RESET_INTIMIDATE_TRACE_BITS
+ .endm
+
+ .macro updatechoicemoveonlvlup bank
+ various \bank, VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP
+ .endm
+
+ .macro various7 bank
+ various \bank, 7
+ .endm
+
+ .macro various8 bank
+ various \bank, 8
+ .endm
+
+ .macro various9 bank
+ various \bank, 9
+ .endm
+
+ .macro various10 bank
+ various \bank, 10
+ .endm
+
+ .macro various11 bank
+ various \bank, 11
+ .endm
+
+ .macro various12 bank
+ various \bank, 12
+ .endm
+
+ .macro forfeityesnobox bank
+ various \bank, VARIOUS_EMIT_YESNOBOX
+ .endm
+
+ .macro various14 bank
+ various \bank, 14
+ .endm
+
+ .macro various15 bank
+ various \bank, 15
+ .endm
+
+ .macro various16 bank
+ various \bank, 16
+ .endm
+
+ .macro various17 bank
+ various \bank, 17
+ .endm
+
+ .macro waitcry bank
+ various \bank, VARIOUS_WAIT_CRY
+ .endm
+
+ .macro returnopponentmon1toball bank
+ various \bank, VARIOUS_RETURN_OPPONENT_MON1
+ .endm
+
+ .macro returnopponentmon2toball bank
+ various \bank, VARIOUS_RETURN_OPPONENT_MON2
+ .endm
+
+ .macro various21 bank
+ various \bank, 21
+ .endm
+
+ .macro various22 bank
+ various \bank, 22
+ .endm
+
+ .macro various23 bank
+ various \bank, 23
+ .endm
+
+ .macro various24 bank
+ various \bank, 24
+ .endm
+
+ .macro setoutcomeonteleport bank
+ various \bank, VARIOUS_SET_TELEPORT_OUTCOME
+ .endm
+
+ .macro playtrainerdefeatbgm bank
+ various \bank, VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC
+ .endm
+
+@ helpful macros
+ .macro setstatchanger stat, stages, down
+ setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7
+ .endm
+
+ .macro setmoveeffect effect
+ setbyte cEFFECT_CHOOSER \effect
+ .endm
+
+ .macro chosenstatus1animation bank, status
+ chosenstatusanimation \bank 0x0 \status
+ .endm
+
+ .macro chosenstatus2animation bank, status
+ chosenstatusanimation \bank 0x1 \status
+ .endm
+
+ .macro sethword dst, value
+ setbyte \dst, \value & 0xFF
+ setbyte \dst + 1, (\value >> 8) & 0xFF
+ .endm
+
+ .macro setword dst, value
+ setbyte \dst, \value & 0xFF
+ setbyte \dst + 1, (\value >> 8) & 0xFF
+ setbyte \dst + 2, (\value >> 16) & 0xFF
+ setbyte \dst + 3, (\value >> 24) & 0xFF
+ .endm
+
+ .macro copybyte dst, src
+ copyarray \dst, \src, 0x1
+ .endm
+
+ .macro copyhword dst, src
+ copyarray \dst, \src, 0x2
+ .endm
+
+ .macro copyword dst, src
+ copyarray \dst, \src, 0x4
+ .endm
+
+ .macro jumpifbytenotequal byte1, byte2, jumpptr
+ jumpifarraynotequal \byte1, \byte2, 0x1, \jumpptr
+ .endm
+
+ .macro jumpifbyteequal byte1, byte2, jumpptr
+ jumpifarrayequal \byte1, \byte2, 0x1, \jumpptr
+ .endm
+
+ .macro jumpifmove move, jumpptr
+ jumpifhalfword EQUAL, gCurrentMove, \move, \jumpptr
+ .endm
+
+ .macro jumpifnotmove move, jumpptr
+ jumpifhalfword NOT_EQUAL, gCurrentMove, \move, \jumpptr
+ .endm
+
+ .macro jumpifstatus3 bank, status, jumpptr
+ jumpifstatus3condition \bank, \status, 0x0, \jumpptr
+ .endm
+
+ .macro jumpifnostatus3 bank, status, jumpptr
+ jumpifstatus3condition \bank, \status, 0x1, \jumpptr
+ .endm
+
+ .macro jumpifmovehadnoeffect jumpptr
+ jumpifbyte COMMON_BITS, gBattleMoveFlags, MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED | MOVESTATUS_FAILED, \jumpptr
+ .endm
+
+ .macro jumpifbattletype flags, jumpptr
+ jumpifhalfword COMMON_BITS, gBattleTypeFlags, \flags, \jumpptr
+ .endm
+
+ .macro jumpifnotbattletype flags, jumpptr
+ jumpifhalfword NO_COMMON_BITS, gBattleTypeFlags, \flags, \jumpptr
+ .endm
diff --git a/include/macros/contest_ai_script.inc b/include/macros/contest_ai_script.inc
new file mode 100644
index 000000000..05d70e351
--- /dev/null
+++ b/include/macros/contest_ai_script.inc
@@ -0,0 +1,506 @@
+@ Add a positive/negative value to the score of the move being evaluated.
+
+ .macro score score
+ .byte 0x00
+ .byte \score
+ .endm
+
+@ turn (AKA "Appeal No.")
+
+ .macro get_turn
+ .byte 0x01
+ .endm
+
+ .macro if_turn_less_than param, addr
+ .byte 0x02
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_turn_more_than param, addr
+ .byte 0x03
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_turn_eq param, addr
+ .byte 0x04
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_turn_not_eq param, addr
+ .byte 0x05
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ audience excitement
+
+ .macro get_excitement
+ .byte 0x06
+ .endm
+
+ .macro if_excitement_less_than param, addr
+ .byte 0x07
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_excitement_more_than param, addr
+ .byte 0x08
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_excitement_eq param, addr
+ .byte 0x09
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_excitement_not_eq param, addr
+ .byte 0x0A
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ the order that the user goes in the current turn
+
+ .macro get_user_order
+ .byte 0x0B
+ .endm
+
+ .macro if_user_order_less_than param addr
+ .byte 0x0C
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_user_order_more_than param addr
+ .byte 0x0D
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_user_order_eq param addr
+ .byte 0x0E
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_user_order_not_eq param addr
+ .byte 0x0F
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ user condition
+
+ .macro get_user_condition
+ .byte 0x10
+ .endm
+
+ .macro if_user_condition_less_than param, addr
+ .byte 0x11
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_user_condition_more_than param, addr
+ .byte 0x12
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_user_condition_eq param, addr
+ .byte 0x13
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_user_condition_not_eq param, addr
+ .byte 0x14
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ 15
+@ 16
+@ 17
+@ 18
+@ 19
+@ 1A
+@ 1B
+@ 1C
+@ 1D
+@ 1E
+
+@ contest type
+
+ .macro get_contest_type
+ .byte 0x1F
+ .endm
+
+ .macro if_contest_type_eq param, addr
+ .byte 0x20
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_contest_type_not_eq param, addr
+ .byte 0x21
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ move excitement (change in excitement due to move)
+
+ .macro get_move_excitement
+ .byte 0x22
+ .endm
+
+ .macro if_move_excitement_less_than param, addr
+ .byte 0x23
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_move_excitement_more_than param, addr
+ .byte 0x24
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_move_excitement_eq param, addr
+ .byte 0x25
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_move_excitement_not_eq param, addr
+ .byte 0x26
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ move effect
+
+ .macro get_effect
+ .byte 0x27
+ .endm
+
+ .macro if_effect_eq param, addr
+ .byte 0x28
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_effect_not_eq param, addr
+ .byte 0x29
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ move effect type
+
+ .macro get_effect_type
+ .byte 0x2A
+ .endm
+
+ .macro if_effect_type_eq param, addr
+ .byte 0x2B
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_effect_type_not_eq param, addr
+ .byte 0x2C
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ whether the current move is the most appealing in the user's moveset
+
+ .macro check_most_appealing_move
+ .byte 0x2D
+ .endm
+
+ .macro if_most_appealing_move addr
+ .byte 0x2E
+ .4byte \addr
+ .endm
+
+@ 2F
+@ 30
+@ 31
+@ 32
+@ 33
+@ 34
+@ 35
+@ 36
+@ 37
+@ 38
+@ 39
+@ 3A
+
+@ number of times current move has been used
+
+ .macro get_move_used_count
+ .byte 0x3B
+ .endm
+
+ .macro if_move_used_count_less_than param, addr
+ .byte 0x3C
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_move_used_count_more_than param, addr
+ .byte 0x3D
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_move_used_count_eq param, addr
+ .byte 0x3E
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_move_used_count_not_eq param, addr
+ .byte 0x3F
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ whether the current move is a combo starter (with another move in the moveset)
+
+ .macro check_combo_starter
+ .byte 0x40
+ .endm
+
+ .macro if_combo_starter addr
+ .byte 0x41
+ .4byte \addr
+ .endm
+
+ .macro if_not_combo_starter addr
+ .byte 0x42
+ .4byte \addr
+ .endm
+
+@ whether the current move is a combo finisher (with another move in the moveset)
+
+ .macro check_combo_finisher
+ .byte 0x43
+ .endm
+
+ .macro if_combo_finisher addr
+ .byte 0x44
+ .4byte \addr
+ .endm
+
+ .macro if_not_combo_finisher addr
+ .byte 0x45
+ .4byte \addr
+ .endm
+
+@ whether the current move would finish a combo
+
+ .macro check_would_finish_combo
+ .byte 0x46
+ .endm
+
+ .macro if_would_finish_combo addr
+ .byte 0x47
+ .4byte \addr
+ .endm
+
+ .macro if_would_not_finish_combo addr
+ .byte 0x48
+ .4byte \addr
+ .endm
+
+@ condition of mon (indexed by order)
+
+ .macro get_condition mon
+ .byte 0x49
+ .byte \mon
+ .endm
+
+ .macro if_condition_less_than mon, value, addr
+ .byte 0x4A
+ .byte \mon
+ .byte \value
+ .4byte \addr
+ .endm
+
+ .macro if_condition_more_than mon, value, addr
+ .byte 0x4B
+ .byte \mon
+ .byte \value
+ .4byte \addr
+ .endm
+
+ .macro if_condition_eq mon, value, addr
+ .byte 0x4C
+ .byte \mon
+ .byte \value
+ .4byte \addr
+ .endm
+
+ .macro if_condition_not_eq mon, value, addr
+ .byte 0x4D
+ .byte \mon
+ .byte \value
+ .4byte \addr
+ .endm
+
+@ whether the mon used a combo starter move
+@ Even though this value is always 1 or 0 (i.e. TRUE/FALSE),
+@ there are less-than and greater-than comparison operations for some reason.
+
+ .macro get_used_combo_starter mon
+ .byte 0x4E
+ .byte \mon
+ .endm
+
+ .macro if_used_combo_starter_less_than mon, value, addr
+ .byte 0x4F
+ .byte \mon
+ .byte \value
+ .4byte \addr
+ .endm
+
+ .macro if_used_combo_starter_more_than mon, value, addr
+ .byte 0x50
+ .byte \mon
+ .byte \value
+ .4byte \addr
+ .endm
+
+
+ .macro if_used_combo_starter_eq mon, value, addr
+ .byte 0x51
+ .byte \mon
+ .byte \value
+ .4byte \addr
+ .endm
+
+ .macro if_used_combo_starter_not_eq mon, value, addr
+ .byte 0x52
+ .byte \mon
+ .byte \value
+ .4byte \addr
+ .endm
+
+@ whether the mon can make an appeal
+
+ .macro check_can_participate mon
+ .byte 0x53
+ .byte \mon
+ .endm
+
+ .macro if_can_participate mon, addr
+ .byte 0x54
+ .byte \mon
+ .4byte \addr
+ .endm
+
+ .macro if_cannot_participate mon, addr
+ .byte 0x55
+ .byte \mon
+ .4byte \addr
+ .endm
+
+@ 56
+@ 57
+
+ .macro contest_58 param addr
+ .byte 0x58
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ 59
+@ 5A
+@ 5B
+@ 5C
+@ 5D
+@ 5E
+@ 5F
+@ 60
+@ 61
+@ 62
+@ 63
+@ 64
+@ 65
+@ 66
+@ 67
+@ 68
+@ 69
+@ 6A
+@ 6B
+@ 6C
+@ 6D
+@ 6E
+@ 6F
+@ 70
+@ 71
+@ 72
+@ 73
+@ 74
+@ 75
+@ 76
+@ 77
+@ 78
+@ 79
+@ 7A
+@ 7B
+@ 7C
+
+ .macro if_random param addr
+ .byte 0x7D
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ 7E
+
+ .macro jump addr
+ .byte 0x7F
+ .4byte \addr
+ .endm
+
+ .macro call addr
+ .byte 0x80
+ .4byte \addr
+ .endm
+
+ .macro end
+ .byte 0x81
+ .endm
+
+ .macro check_user_has_exciting_move
+ .byte 0x82
+ .endm
+
+ .macro if_user_has_exciting_move addr
+ .byte 0x83
+ .4byte \addr
+ .endm
+
+ .macro if_user_doesnt_have_exciting_move addr
+ .byte 0x84
+ .4byte \addr
+ .endm
+
+@ 85
+@ 86
+
+ .macro if_effect_in_user_moveset param addr
+ .byte 0x87
+ .2byte \param
+ .4byte \addr
+ .endm
diff --git a/include/macros/ec.inc b/include/macros/ec.inc
new file mode 100644
index 000000000..d3fd45c2f
--- /dev/null
+++ b/include/macros/ec.inc
@@ -0,0 +1,8 @@
+
+ .macro ec_duplicates count
+ .2byte 0xff00 + \count
+ .endm
+
+ .macro ec_words_by_letter label
+ .2byte (gEasyChatWordsByLetter_\label - gEasyChatWordsAlphabetized) / 2
+ .endm
diff --git a/include/macros/event.inc b/include/macros/event.inc
new file mode 100644
index 000000000..fcbd3a055
--- /dev/null
+++ b/include/macros/event.inc
@@ -0,0 +1,1481 @@
+ @ Does nothing.
+ .macro nop
+ .byte 0x00
+ .endm
+
+ @ Does nothing.
+ .macro nop1
+ .byte 0x01
+ .endm
+
+ @ Terminates script execution.
+ .macro end
+ .byte 0x02
+ .endm
+
+ @ Jumps back to after the last-executed call statement, and continues script execution from there.
+ .macro return
+ .byte 0x03
+ .endm
+
+ @ Jumps to destination and continues script execution from there. The location of the calling script is remembered and can be returned to later.
+ .macro call destination
+ .byte 0x04
+ .4byte \destination
+ .endm
+
+ @ Jumps to destination and continues script execution from there.
+ .macro goto destination
+ .byte 0x05
+ .4byte \destination
+ .endm
+
+ @ If the result of the last comparison matches condition (see Comparison operators), jumps to destination and continues script execution from there.
+ .macro goto_if condition, destination
+ .byte 0x06
+ .byte \condition
+ .4byte \destination
+ .endm
+
+ @ If the result of the last comparison matches condition (see Comparison operators), calls destination.
+ .macro call_if condition, destination
+ .byte 0x07
+ .byte \condition
+ .4byte \destination
+ .endm
+
+ @ Jumps to the standard function at index function.
+ .macro gotostd function
+ .byte 0x08
+ .byte \function
+ .endm
+
+ @ Calls the standard function at index function.
+ .macro callstd function
+ .byte 0x09
+ .byte \function
+ .endm
+
+ @ If the result of the last comparison matches condition (see Comparison operators), jumps to the standard function at index function.
+ .macro gotostd_if condition, function
+ .byte 0x0a
+ .byte \condition
+ .byte \function
+ .endm
+
+ @ If the result of the last comparison matches condition (see Comparison operators), calls the standard function at index function.
+ .macro callstd_if condition, function
+ .byte 0x0b
+ .byte \condition
+ .byte \function
+ .endm
+
+ @ Executes a script stored in a default RAM location.
+ .macro gotoram
+ .byte 0x0c
+ .endm
+
+ @ Terminates script execution and "resets the script RAM".
+ .macro killscript
+ .byte 0x0d
+ .endm
+
+ @ Sets some status related to Mystery Event.
+ .macro setmysteryeventstatus value
+ .byte 0x0e
+ .byte \value
+ .endm
+
+ @ Sets the specified script bank to value.
+ .macro loadword destination, value
+ .byte 0x0f
+ .byte \destination
+ .4byte \value
+ .endm
+
+ @ Sets the specified script bank to value.
+ .macro loadbyte destination, value
+ .byte 0x10
+ .byte \destination
+ .byte \value
+ .endm
+
+ @ Sets the byte at offset to value.
+ .macro writebytetoaddr value, offset
+ .byte 0x11
+ .byte \value
+ .4byte \offset
+ .endm
+
+ @ Copies the byte value at source into the specified script bank.
+ .macro loadbytefromaddr destination, source
+ .byte 0x12
+ .byte \destination
+ .4byte \source
+ .endm
+
+ @ Not sure. Judging from XSE's description I think it takes the least-significant byte in bank source and writes it to destination.
+ .macro setptrbyte source, destination
+ .byte 0x13
+ .byte \source
+ .4byte \destination
+ .endm
+
+ @ Copies the contents of bank source into bank destination.
+ .macro copylocal destination, source
+ .byte 0x14
+ .byte \destination
+ .byte \source
+ .endm
+
+ @ Copies the byte at source to destination, replacing whatever byte was previously there.
+ .macro copybyte destination, source
+ .byte 0x15
+ .4byte \destination
+ .4byte \source
+ .endm
+
+ @ Changes the value of destination to value.
+ .macro setvar destination, value
+ .byte 0x16
+ .2byte \destination
+ .2byte \value
+ .endm
+
+ @ Changes the value of destination by adding value to it. Overflow is not prevented (0xFFFF + 1 = 0x0000).
+ .macro addvar destination, value
+ .byte 0x17
+ .2byte \destination
+ .2byte \value
+ .endm
+
+ @ Changes the value of destination by subtracting value to it. Overflow is not prevented (0x0000 - 1 = 0xFFFF).
+ .macro subvar destination, value
+ .byte 0x18
+ .2byte \destination
+ .2byte \value
+ .endm
+
+ @ Copies the value of source into destination.
+ .macro copyvar destination, source
+ .byte 0x19
+ .2byte \destination
+ .2byte \source
+ .endm
+
+ @ If source is not a variable, then this function acts like setvar. Otherwise, it acts like copyvar.
+ .macro setorcopyvar destination, source
+ .byte 0x1a
+ .2byte \destination
+ .2byte \source
+ .endm
+
+ @ Compares the values of script banks a and b, after forcing the values to bytes.
+ .macro compare_local_to_local byte1, byte2
+ .byte 0x1b
+ .byte \byte1
+ .byte \byte2
+ .endm
+
+ @ Compares the least-significant byte of the value of script bank a to a fixed byte value (b).
+ .macro compare_local_to_value a, b
+ .byte 0x1c
+ .byte \a
+ .byte \b
+ .endm
+
+ @ Compares the least-significant byte of the value of script bank a to the byte located at offset b.
+ .macro compare_local_to_addr a, b
+ .byte 0x1d
+ .byte \a
+ .4byte \b
+ .endm
+
+ @ Compares the byte located at offset a to the least-significant byte of the value of script bank b.
+ .macro compare_addr_to_local a, b
+ .byte 0x1e
+ .4byte \a
+ .byte \b
+ .endm
+
+ @ Compares the byte located at offset a to a fixed byte value (b).
+ .macro compare_addr_to_value a, b
+ .byte 0x1f
+ .4byte \a
+ .byte \b
+ .endm
+
+ @ Compares the byte located at offset a to the byte located at offset b.
+ .macro compare_addr_to_addr a, b
+ .byte 0x20
+ .4byte \a
+ .4byte \b
+ .endm
+
+ @ Compares the value of `var` to a fixed word value (b).
+ .macro compare_var_to_value var, value
+ .byte 0x21
+ .2byte \var
+ .2byte \value
+ .endm
+
+ @ Compares the value of `var1` to the value of `var2`.
+ .macro compare_var_to_var var1, var2
+ .byte 0x22
+ .2byte \var1
+ .2byte \var2
+ .endm
+
+ @ Generic compare macro which attempts to deduce argument types based on their values
+ @ Any values between 0x4000 to 0x4FFF and 0x8000 to 0x8FFF are considered event variable identifiers
+ .macro compare arg1, arg2
+ .if (((\arg1) >> 12) == 4 || ((\arg1) >> 12) == 8) && (((\arg2) >> 12) == 4 || ((\arg2) >> 12) == 8)
+ compare_var_to_var (\arg1), (\arg2)
+ .elseif (((\arg1) >> 12) == 4 || ((\arg1) >> 12) == 8) && ((\arg2) >= -0xFFFF && (\arg2) <= 0xFFFF)
+ compare_var_to_value (\arg1), ((\arg2) & 0xFFFF)
+ .else
+ .error "Invalid arguments for 'compare'"
+ .endif
+ .endm
+
+ @ Calls the native C function stored at `func`.
+ .macro callnative func
+ .byte 0x23
+ .4byte \func
+ .endm
+
+ @ Replaces the script with the function stored at `func`. Execution returns to the bytecode script when func returns TRUE.
+ .macro gotonative func
+ .byte 0x24
+ .4byte \func
+ .endm
+
+ @ Calls a special function; that is, a function designed for use by scripts and listed in a table of pointers.
+ .macro special function
+ .byte 0x25
+ .2byte SPECIAL_\function
+ .endm
+
+ @ Calls a special function. That function's output (if any) will be written to the variable you specify.
+ .macro specialvar output, function
+ .byte 0x26
+ .2byte \output
+ .2byte SPECIAL_\function
+ .endm
+
+ @ Blocks script execution until a command or ASM code manually unblocks it. Generally used with specific commands and specials. If this command runs, and a subsequent command or piece of ASM does not unblock state, the script will remain blocked indefinitely (essentially a hang).
+ .macro waitstate
+ .byte 0x27
+ .endm
+
+ @ Blocks script execution for time (frames? milliseconds?).
+ .macro delay time
+ .byte 0x28
+ .2byte \time
+ .endm
+
+ @ Sets a to 1.
+ .macro setflag a
+ .byte 0x29
+ .2byte \a
+ .endm
+
+ @ Sets a to 0.
+ .macro clearflag a
+ .byte 0x2a
+ .2byte \a
+ .endm
+
+ @ Compares a to 1.
+ .macro checkflag a
+ .byte 0x2b
+ .2byte \a
+ .endm
+
+ @ Initializes the RTC`s local time offset to the given hour and minute. In FireRed, this command is a nop.
+ .macro initclock hour, minute
+ .byte 0x2c
+ .2byte \hour
+ .2byte \minute
+ .endm
+
+ @ Runs time based events. In FireRed, this command is a nop.
+ .macro dodailyevents
+ .byte 0x2d
+ .endm
+
+ @ Sets the values of variables 0x8000, 0x8001, and 0x8002 to the current hour, minute, and second. In FRLG, this command sets those variables to zero.
+ .macro gettime
+ .byte 0x2e
+ .endm
+
+ @ Plays the specified (sound_number) sound. Only one sound may play at a time, with newer ones interrupting older ones.
+ .macro playse sound_number
+ .byte 0x2f
+ .2byte \sound_number
+ .endm
+
+ @ Blocks script execution until the currently-playing sound (triggered by playse) finishes playing.
+ .macro waitse
+ .byte 0x30
+ .endm
+
+ @ Plays the specified (fanfare_number) fanfare.
+ .macro playfanfare fanfare_number
+ .byte 0x31
+ .2byte \fanfare_number
+ .endm
+
+ @ Blocks script execution until all currently-playing fanfares finish.
+ .macro waitfanfare
+ .byte 0x32
+ .endm
+
+ @ Plays the specified (song_number) song. The byte is apparently supposed to be 0x00.
+ .macro playbgm song_number, unknown
+ .byte 0x33
+ .2byte \song_number
+ .byte \unknown
+ .endm
+
+ @ Saves the specified (song_number) song to be played later.
+ .macro savebgm song_number
+ .byte 0x34
+ .2byte \song_number
+ .endm
+
+ @ Crossfades the currently-playing song into the map's default song.
+ .macro fadedefaultbgm
+ .byte 0x35
+ .endm
+
+ @ Crossfades the currently-playng song into the specified (song_number) song.
+ .macro fadenewbgm song_number
+ .byte 0x36
+ .2byte \song_number
+ .endm
+
+ @ Fades out the currently-playing song.
+ .macro fadeoutbgm speed
+ .byte 0x37
+ .byte \speed
+ .endm
+
+ @ Fades the previously-playing song back in.
+ .macro fadeinbgm speed
+ .byte 0x38
+ .byte \speed
+ .endm
+
+ @ Sends the player to Warp warp on Map bank.map. If the specified warp is 0xFF, then the player will instead be sent to (X, Y) on the map.
+ .macro warp map, warp, X, Y
+ .byte 0x39
+ map \map
+ .byte \warp
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Clone of warp that does not play a sound effect.
+ .macro warpsilent map, warp, X, Y
+ .byte 0x3a
+ map \map
+ .byte \warp
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Clone of warp that plays a door opening animation before stepping upwards into it.
+ .macro warpdoor map, warp, X, Y
+ .byte 0x3b
+ map \map
+ .byte \warp
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Warps the player to another map using a hole animation.
+ .macro warphole map
+ .byte 0x3c
+ map \map
+ .endm
+
+ @ Clone of warp that uses a teleport effect. It is apparently only used in R/S/E.
+ .macro warpteleport map, warp, X, Y
+ .byte 0x3d
+ map \map
+ .byte \warp
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Sets the warp destination to be used later.
+ .macro setwarp map, warp, X, Y
+ .byte 0x3e
+ map \map
+ .byte \warp
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Sets the warp destination that a warp to Warp 127 on Map 127.127 will connect to. Useful when a map has warps that need to go to script-controlled locations (i.e. elevators).
+ .macro setdynamicwarp map, warp, X, Y
+ .byte 0x3f
+ map \map
+ .byte \warp
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Sets the destination that diving or emerging from a dive will take the player to.
+ .macro setdivewarp map, warp, X, Y
+ .byte 0x40
+ map \map
+ .byte \warp
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Sets the destination that falling into a hole will take the player to.
+ .macro setholewarp map, warp, X, Y
+ .byte 0x41
+ map \map
+ .byte \warp
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Retrieves the player's zero-indexed X- and Y-coordinates in the map, and stores them in the specified variables.
+ .macro getplayerxy X, Y
+ .byte 0x42
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Retrieves the number of Pokemon in the player's party, and stores that number in variable 0x800D (LASTRESULT).
+ .macro getpartysize
+ .byte 0x43
+ .endm
+
+ @ Attempts to add quantity of item index to the player's Bag. If the player has enough room, the item will be added and variable 0x800D (LASTRESULT) will be set to 0x0001; otherwise, LASTRESULT is set to 0x0000.
+ .macro giveitem index, quantity
+ .byte 0x44
+ .2byte \index
+ .2byte \quantity
+ .endm
+
+ @ Removes quantity of item index from the player's Bag.
+ .macro takeitem index, quantity
+ .byte 0x45
+ .2byte \index
+ .2byte \quantity
+ .endm
+
+ @ Checks if the player has enough space in their Bag to hold quantity more of item index. Sets variable 0x800D (LASTRESULT) to 0x0001 if there is room, or 0x0000 is there is no room.
+ .macro checkitemspace index, quantity
+ .byte 0x46
+ .2byte \index
+ .2byte \quantity
+ .endm
+
+ @ Checks if the player has quantity or more of item index in their Bag. Sets variable 0x800D (LASTRESULT) to 0x0001 if the player has enough of the item, or 0x0000 if they have fewer than quantity of the item.
+ .macro checkitem index, quantity
+ .byte 0x47
+ .2byte \index
+ .2byte \quantity
+ .endm
+
+ @ Checks which Bag pocket the specified (index) item belongs in, and writes the value to variable 0x800D (LASTRESULT). This script is used to show the name of the proper Bag pocket when the player receives an item via callstd (simplified to giveitem in XSE).
+ .macro checkitemtype index
+ .byte 0x48
+ .2byte \index
+ .endm
+
+ @ Adds a quantity amount of item index to the player's PC. Both arguments can be variables.
+ .macro givepcitem index, quantity
+ .byte 0x49
+ .2byte \index
+ .2byte \quantity
+ .endm
+
+ @ Checks for quantity amount of item index in the player's PC. Both arguments can be variables.
+ .macro checkpcitem index, quantity
+ .byte 0x4a
+ .2byte \index
+ .2byte \quantity
+ .endm
+
+ @ Adds decoration to the player's PC. In FireRed, this command is a nop. (The argument is read, but not used for anything.)
+ .macro givedecoration decoration
+ .byte 0x4b
+ .2byte \decoration
+ .endm
+
+ @ Removes a decoration from the player's PC. In FireRed, this command is a nop. (The argument is read, but not used for anything.)
+ .macro takedecoration decoration
+ .byte 0x4c
+ .2byte \decoration
+ .endm
+
+ @ Checks for decoration in the player's PC. In FireRed, this command is a nop. (The argument is read, but not used for anything.)
+ .macro checkdecor decoration
+ .byte 0x4d
+ .2byte \decoration
+ .endm
+
+ @ Checks if the player has enough space in their PC to hold decoration. Sets variable 0x800D (LASTRESULT) to 0x0001 if there is room, or 0x0000 is there is no room. In FireRed, this command is a nop. (The argument is read, but not used for anything.)
+ .macro checkdecorspace decoration
+ .byte 0x4e
+ .2byte \decoration
+ .endm
+
+ @ Applies the movement data at movements to the specified (index) Object event. Also closes any standard message boxes that are still open.
+ @ This command in fact uses variables to access the Object event ID. So, for example, if you setvar 0x8000 to 0x3, and then use applymovementpos 0x8000 @move1, Object event 3 will have the movements at @move1 applied to them.
+ .macro applymovement index, movements, mapGroup, mapNum
+ .ifb \mapGroup
+ .byte 0x4f
+ .2byte \index
+ .4byte \movements
+ .else
+ .byte 0x50
+ .2byte \index
+ .4byte \movements
+ .byte \mapGroup
+ .byte \mapNum
+ .endif
+ .endm
+
+ @ Blocks script execution until the movements being applied to the specified (index) Object event finish. If the specified Object event is 0x0000, then the command will block script execution until all Object events affected by applymovement finish their movements. If the specified Object event is not currently being manipulated with applymovement, then this command does nothing.
+ .macro waitmovement index, mapBank, mapNum
+ .ifb \mapBank
+ .byte 0x51
+ .2byte \index
+ .else
+ .byte 0x52
+ .2byte \index
+ .byte \mapBank
+ .byte \mapNum
+ .endif
+ .endm
+
+ @ Attempts to hide the specified (local_ID, a local ID) Object event on the specified map, by setting its visibility flag if it has a valid one. If the Object does not have a valid visibility flag, this command does nothing.
+ @ If no map is specified, then the current map is used
+ .macro removeobject localId, mapGroup, mapNum
+ .ifb \mapGroup
+ .byte 0x53
+ .2byte \localId
+ .else
+ .byte 0x54
+ .2byte \localId
+ .byte \mapGroup
+ .byte \mapNum
+ .endif
+ .endm
+
+ .macro addobject localId, mapGroup, mapNum
+ .ifb \mapGroup
+ .byte 0x55
+ .2byte \localId
+ .else
+ .byte 0x56
+ .2byte \localId
+ .byte \mapGroup
+ .byte \mapNum
+ .endif
+ .endm
+
+ @ Sets the specified (index) Object's position on the current map.
+ .macro setobjectxy index, x, y
+ .byte 0x57
+ .2byte \index
+ .2byte \x
+ .2byte \y
+ .endm
+
+ .macro showobjectat index, map
+ .byte 0x58
+ .2byte \index
+ map \map
+ .endm
+
+ .macro hideobjectat index, map
+ .byte 0x59
+ .2byte \index
+ map \map
+ .endm
+
+ @ If the script was called by a Object event, then that Object will turn to face toward the tile that the player is stepping off of.
+ .macro faceplayer
+ .byte 0x5a
+ .endm
+
+ .macro turnobject index, direction
+ .byte 0x5b
+ .2byte \index
+ .byte \direction
+ .endm
+
+ @ If the Trainer flag for Trainer index is not set, this command does absolutely nothing.
+ .macro trainerbattle type, trainer, word, pointer1, pointer2, pointer3, pointer4
+ .byte 0x5c
+ .byte \type
+ .2byte \trainer
+ .2byte \word
+ .if \type == 0
+ .4byte \pointer1 @ text
+ .4byte \pointer2 @ text
+ .elseif \type == 1
+ .4byte \pointer1 @ text
+ .4byte \pointer2 @ text
+ .4byte \pointer3 @ event script
+ .elseif \type == 2
+ .4byte \pointer1 @ text
+ .4byte \pointer2 @ text
+ .4byte \pointer3 @ event script
+ .elseif \type == 3
+ .4byte \pointer1 @ text
+ .elseif \type == 4
+ .4byte \pointer1 @ text
+ .4byte \pointer2 @ text
+ .4byte \pointer3 @ text
+ .elseif \type == 5
+ .4byte \pointer1 @ text
+ .4byte \pointer2 @ text
+ .elseif \type == 6
+ .4byte \pointer1 @ text
+ .4byte \pointer2 @ text
+ .4byte \pointer3 @ text
+ .4byte \pointer4 @ event script
+ .elseif \type == 7
+ .4byte \pointer1 @ text
+ .4byte \pointer2 @ text
+ .4byte \pointer3 @ text
+ .elseif \type == 8
+ .4byte \pointer1 @ text
+ .4byte \pointer2 @ text
+ .4byte \pointer3 @ text
+ .4byte \pointer4 @ event script
+ .endif
+ .endm
+
+ @ Starts a trainer battle using the battle information stored in RAM (usually by trainerbattle, which actually calls this command behind-the-scenes), and blocks script execution until the battle finishes.
+ .macro trainerbattlebegin
+ .byte 0x5d
+ .endm
+
+ @ Goes to address after the trainerbattle command (called by the battle functions, see battle_setup.c)
+ .macro gotopostbattlescript
+ .byte 0x5e
+ .endm
+
+ @ Goes to address specified in the trainerbattle command (called by the battle functions, see battle_setup.c)
+ .macro gotobeatenscript
+ .byte 0x5f
+ .endm
+
+ @ Compares Flag (trainer + 0x500) to 1. (If the flag is set, then the trainer has been defeated by the player.)
+ .macro checktrainerflag trainer
+ .byte 0x60
+ .2byte \trainer
+ .endm
+
+ @ Sets Flag (trainer + 0x500).
+ .macro settrainerflag trainer
+ .byte 0x61
+ .2byte \trainer
+ .endm
+
+ @ Clears Flag (trainer + 0x500).
+ .macro cleartrainerflag trainer
+ .byte 0x62
+ .2byte \trainer
+ .endm
+
+ .macro setobjectxyperm index, x, y
+ .byte 0x63
+ .2byte \index
+ .2byte \x
+ .2byte \y
+ .endm
+
+ .macro moveobjectoffscreen index
+ .byte 0x64
+ .2byte \index
+ .endm
+
+ .macro setobjectmovementtype word, byte
+ .byte 0x65
+ .2byte \word
+ .byte \byte
+ .endm
+
+ @ If a standard message box (or its text) is being drawn on-screen, this command blocks script execution until the box and its text have been fully drawn.
+ .macro waitmessage
+ .byte 0x66
+ .endm
+
+ @ Starts displaying a standard message box containing the specified text. If text is a pointer, then the string at that offset will be loaded and used. If text is script bank 0, then the value of script bank 0 will be treated as a pointer to the text. (You can use loadpointer to place a string pointer in a script bank.)
+ .macro message text
+ .byte 0x67
+ .4byte \text
+ .endm
+
+ @ Closes the current message box.
+ .macro closemessage
+ .byte 0x68
+ .endm
+
+ @ Ceases movement for all Objects on-screen.
+ .macro lockall
+ .byte 0x69
+ .endm
+
+ @ If the script was called by an Object, then that Object's movement will cease.
+ .macro lock
+ .byte 0x6a
+ .endm
+
+ @ Resumes normal movement for all Objects on-screen, and closes any standard message boxes that are still open.
+ .macro releaseall
+ .byte 0x6b
+ .endm
+
+ @ If the script was called by an Object, then that Object's movement will resume. This command also closes any standard message boxes that are still open.
+ .macro release
+ .byte 0x6c
+ .endm
+
+ @ Blocks script execution until the player presses any key.
+ .macro waitbuttonpress
+ .byte 0x6d
+ .endm
+
+ @ Displays a YES/NO multichoice box at the specified coordinates, and blocks script execution until the user makes a selection. Their selection is stored in variable 0x800D (LASTRESULT); 0x0000 for "NO" or if the user pressed B, and 0x0001 for "YES".
+ .macro yesnobox x, y
+ .byte 0x6e
+ .byte \x
+ .byte \y
+ .endm
+
+ @ Displays a multichoice box from which the user can choose a selection, and blocks script execution until a selection is made. Lists of options are predefined and the one to be used is specified with list. If b is set to a non-zero value, then the user will not be allowed to back out of the multichoice with the B button.
+ .macro multichoice x, y, list, b
+ .byte 0x6f
+ .byte \x
+ .byte \y
+ .byte \list
+ .byte \b
+ .endm
+
+ @ Displays a multichoice box from which the user can choose a selection, and blocks script execution until a selection is made. Lists of options are predefined and the one to be used is specified with list. The default argument determines the initial position of the cursor when the box is first opened; it is zero-indexed, and if it is too large, it is treated as 0x00. If b is set to a non-zero value, then the user will not be allowed to back out of the multichoice with the B button.
+ .macro multichoicedefault x, y, list, default, b
+ .byte 0x70
+ .byte \x
+ .byte \y
+ .byte \list
+ .byte \default
+ .byte \b
+ .endm
+
+ @ Displays a multichoice box from which the user can choose a selection, and blocks script execution until a selection is made. Lists of options are predefined and the one to be used is specified with list. The per_row argument determines how many list items will be shown on a single row of the box.
+ .macro multichoicegrid x, y, list, per_row, B
+ .byte 0x71
+ .byte \x
+ .byte \y
+ .byte \list
+ .byte \per_row
+ .byte \B
+ .endm
+
+ .macro drawbox byte1, byte2, byte3, byte4
+ .byte 0x72
+ .byte \byte1
+ .byte \byte2
+ .byte \byte3
+ .byte \byte4
+ .endm
+
+ .macro erasebox byte1, byte2, byte3, byte4
+ .byte 0x73
+ .byte \byte1
+ .byte \byte2
+ .byte \byte3
+ .byte \byte4
+ .endm
+
+ .macro drawboxtext byte1, byte2, byte3, byte4
+ .byte 0x74
+ .byte \byte1
+ .byte \byte2
+ .byte \byte3
+ .byte \byte4
+ .endm
+
+ @ Displays a box containing the front sprite for the specified (species) Pokemon species.
+ .macro drawmonpic species, x, y
+ .byte 0x75
+ .2byte \species
+ .byte \x
+ .byte \y
+ .endm
+
+ @ Hides all boxes displayed with drawmonpic.
+ .macro erasemonpic
+ .byte 0x76
+ .endm
+
+ @ Draws an image of the winner of the contest. In FireRed, this command is a nop. (The argument is discarded.)
+ .macro drawcontestwinner a
+ .byte 0x77
+ .byte \a
+ .endm
+
+ @ Displays the string at pointer as braille text in a standard message box. The string must be formatted to use braille characters.
+ .macro braillemessage text
+ .byte 0x78
+ .4byte \text
+ .endm
+
+ @ Gives the player one of the specified (species) Pokemon at level level holding item. The unknown arguments should all be zeroes.
+ .macro givemon species, level, item, unknown1, unknown2, unknown3
+ .byte 0x79
+ .2byte \species
+ .byte \level
+ .2byte \item
+ .4byte \unknown1
+ .4byte \unknown2
+ .byte \unknown3
+ .endm
+
+ .macro giveegg species
+ .byte 0x7a
+ .2byte \species
+ .endm
+
+ .macro setmonmove index, slot, move
+ .byte 0x7b
+ .byte \index
+ .byte \slot
+ .2byte \move
+ .endm
+
+ @ Checks if at least one Pokemon in the player's party knows the specified (index) attack. If so, variable 0x800D (LASTRESULT) is set to the (zero-indexed) slot number of the first Pokemon that knows the move. If not, LASTRESULT is set to 0x0006. Variable 0x8004 is also set to this Pokemon's species.
+ .macro checkpartymove index
+ .byte 0x7c
+ .2byte \index
+ .endm
+
+ @ Writes the name of the Pokemon at index species to the specified buffer.
+ .macro bufferspeciesname out, species
+ .byte 0x7d
+ .byte \out
+ .2byte \species
+ .endm
+
+ @ Writes the name of the species of the first Pokemon in the player's party to the specified buffer.
+ .macro bufferleadmonspeciesname out
+ .byte 0x7e
+ .byte \out
+ .endm
+
+ @ Writes the nickname of the Pokemon in slot slot (zero-indexed) of the player's party to the specified buffer. If an empty or invalid slot is specified, ten spaces ("") are written to the buffer.
+ .macro bufferpartymonnick out, slot
+ .byte 0x7f
+ .byte \out
+ .2byte \slot
+ .endm
+
+ @ Writes the name of the item at index item to the specified buffer. If the specified index is larger than the number of items in the game (0x176), the name of item 0 ("????????") is buffered instead.
+ .macro bufferitemname out, item
+ .byte 0x80
+ .byte \out
+ .2byte \item
+ .endm
+
+ @ Writes the name of the decoration at index decoration to the specified buffer. In FireRed, this command is a nop.
+ .macro bufferdecorationname out, decoration
+ .byte 0x81
+ .byte \out
+ .2byte \decoration
+ .endm
+
+ @ Writes the name of the move at index move to the specified buffer.
+ .macro buffermovename out, move
+ .byte 0x82
+ .byte \out
+ .2byte \move
+ .endm
+
+ @ Converts the value of input to a decimal string, and writes that string to the specified buffer.
+ .macro buffernumberstring out, input
+ .byte 0x83
+ .byte \out
+ .2byte \input
+ .endm
+
+ @ Writes the standard string identified by index to the specified buffer. This command has no protections in place at all, so specifying an invalid standard string (e.x. 0x2B) can and usually will cause data corruption.
+ .macro bufferstdstring out, index
+ .byte 0x84
+ .byte \out
+ .2byte \index
+ .endm
+
+ @ Copies the string at offset to the specified buffer.
+ .macro bufferstring out, offset
+ .byte 0x85
+ .byte \out
+ .4byte \offset
+ .endm
+
+ @ Opens the Pokemart system, offering the specified products for sale.
+ .macro pokemart products
+ .byte 0x86
+ .4byte \products
+ .endm
+
+ @ Opens the Pokemart system and treats the list of items as decorations.
+ .macro pokemartdecoration products
+ .byte 0x87
+ .4byte \products
+ .endm
+
+ @ Apparent clone of pokemartdecoration.
+ .macro pokemartdecoration2 products
+ .byte 0x88
+ .4byte \products
+ .endm
+
+ @ Starts up the slot machine minigame.
+ .macro playslotmachine word
+ .byte 0x89
+ .2byte \word
+ .endm
+
+ @ Sets a berry tree's specific berry and growth stage. In FireRed, this command is a nop.
+ .macro setberrytree tree_id, berry, growth_stage
+ .byte 0x8a
+ .byte \tree_id
+ .byte \berry
+ .byte \growth_stage
+ .endm
+
+ @ This allows you to choose a Pokemon to use in a contest. In FireRed, this command sets the byte at 0x03000EA8 to 0x01.
+ .macro choosecontestmon
+ .byte 0x8b
+ .endm
+
+ @ Starts a contest. In FireRed, this command is a nop.
+ .macro startcontest
+ .byte 0x8c
+ .endm
+
+ @ Shows the results of a contest. In FireRed, this command is a nop.
+ .macro showcontestresults
+ .byte 0x8d
+ .endm
+
+ @ Starts a contest over a link connection. In FireRed, this command is a nop.
+ .macro contestlinktransfer
+ .byte 0x8e
+ .endm
+
+ @ Stores a random integer between 0 and limit in variable 0x800D (LASTRESULT).
+ .macro random limit
+ .byte 0x8f
+ .2byte \limit
+ .endm
+
+ @ If check is 0x00, this command adds value to the player's money.
+ .macro givemoney value, check
+ .byte 0x90
+ .4byte \value
+ .byte \check
+ .endm
+
+ @ If check is 0x00, this command subtracts value from the player's money.
+ .macro takemoney value, check
+ .byte 0x91
+ .4byte \value
+ .byte \check
+ .endm
+
+ @ If check is 0x00, this command will check if the player has value or more money; script variable 0x800D (LASTRESULT) is set to 0x0001 if the player has enough money, or 0x0000 if the do not.
+ .macro checkmoney value, check
+ .byte 0x92
+ .4byte \value
+ .byte \check
+ .endm
+
+ @ Spawns a secondary box showing how much money the player has.
+ .macro showmoneybox x, y
+ .byte 0x93
+ .byte \x
+ .byte \y
+ .endm
+
+ @ Hides the secondary box spawned by showmoney.
+ .macro hidemoneybox x, y
+ .byte 0x94
+ .byte \x
+ .byte \y
+ .endm
+
+ @ Updates the secondary box spawned by showmoney. Consumes but does not use arguments.
+ .macro updatemoneybox x, y
+ .byte 0x95
+ .byte \x
+ .byte \y
+ .endm
+
+ @ Gets the price reduction for the index given. In FireRed, this command is a nop.
+ .macro getpricereduction index
+ .byte 0x96
+ .2byte \index
+ .endm
+
+ @ Fades the screen to and from black and white. Mode 0x00 fades from black, mode 0x01 fades out to black, mode 0x2 fades in from white, and mode 0x3 fades out to white.
+ .macro fadescreen effect
+ .byte 0x97
+ .byte \effect
+ .endm
+
+ @ Fades the screen to and from black and white. Mode 0x00 fades from black, mode 0x01 fades out to black, mode 0x2 fades in from white, and mode 0x3 fades out to white. Other modes may exist.
+ .macro fadescreenspeed effect, speed
+ .byte 0x98
+ .byte \effect
+ .byte \speed
+ .endm
+
+ .macro setflashradius word
+ .byte 0x99
+ .2byte \word
+ .endm
+
+ .macro animateflash byte
+ .byte 0x9a
+ .byte \byte
+ .endm
+
+ .macro messageautoscroll pointer
+ .byte 0x9b
+ .4byte \pointer
+ .endm
+
+ @ Executes the specified field move animation.
+ .macro dofieldeffect animation
+ .byte 0x9c
+ .2byte \animation
+ .endm
+
+ @ Sets up the field effect argument argument with the value value.
+ .macro setfieldeffectargument argument, param
+ .byte 0x9d
+ .byte \argument
+ .2byte \param
+ .endm
+
+ @ Blocks script execution until all playing field move animations complete.
+ .macro waitfieldeffect animation
+ .byte 0x9e
+ .2byte \animation
+ .endm
+
+ @ Sets which healing place the player will return to if all of the Pokemon in their party faint.
+ .macro setrespawn heallocation
+ .byte 0x9f
+ .2byte \heallocation
+ .endm
+
+ @ Checks the player's gender. If male, then 0x0000 is stored in variable 0x800D (LASTRESULT). If female, then 0x0001 is stored in LASTRESULT.
+ .macro checkplayergender
+ .byte 0xa0
+ .endm
+
+ @ Plays the specified (species) Pokemon's cry. You can use waitcry to block script execution until the sound finishes.
+ .macro playmoncry species, effect
+ .byte 0xa1
+ .2byte \species
+ .2byte \effect
+ .endm
+
+ @ Changes the metatile at (x, y) on the current map.
+ .macro setmetatile x, y, metatile_number, tile_attrib
+ .byte 0xa2
+ .2byte \x
+ .2byte \y
+ .2byte \metatile_number
+ .2byte \tile_attrib
+ .endm
+
+ @ Queues a weather change to the default weather for the map.
+ .macro resetweather
+ .byte 0xa3
+ .endm
+
+ @ Queues a weather change to type weather.
+ .macro setweather type
+ .byte 0xa4
+ .2byte \type
+ .endm
+
+ @ Executes the weather change queued with resetweather or setweather. The current weather will smoothly fade into the queued weather.
+ .macro doweather
+ .byte 0xa5
+ .endm
+
+ @ This command manages cases in which maps have tiles that change state when stepped on (specifically, cracked/breakable floors).
+ .macro setstepcallback subroutine
+ .byte 0xa6
+ .byte \subroutine
+ .endm
+
+ .macro setmaplayoutindex index
+ .byte 0xa7
+ .2byte \index
+ .endm
+
+ .macro setobjectpriority index, map, priority
+ .byte 0xa8
+ .2byte \index
+ map \map
+ .byte \priority
+ .endm
+
+ .macro resetobjectpriority index, map
+ .byte 0xa9
+ .2byte \index
+ map \map
+ .endm
+
+ .macro createvobject sprite, byte2, x, y, elevation, direction
+ .byte 0xaa
+ .byte \sprite
+ .byte \byte2
+ .2byte \x
+ .2byte \y
+ .byte \elevation
+ .byte \direction
+ .endm
+
+ .macro turnvobject index, direction
+ .byte 0xab
+ .byte \index
+ .byte \direction
+ .endm
+
+ @ Opens the door metatile at (X, Y) with an animation.
+ .macro opendoor x, y
+ .byte 0xac
+ .2byte \x
+ .2byte \y
+ .endm
+
+ @ Closes the door metatile at (X, Y) with an animation.
+ .macro closedoor x, y
+ .byte 0xad
+ .2byte \x
+ .2byte \y
+ .endm
+
+ @ Waits for the door animation started with opendoor or closedoor to finish.
+ .macro waitdooranim
+ .byte 0xae
+ .endm
+
+ @ Sets the door tile at (x, y) to be open without an animation.
+ .macro setdooropen x, y
+ .byte 0xaf
+ .2byte \x
+ .2byte \y
+ .endm
+
+ @ Sets the door tile at (x, y) to be closed without an animation.
+ .macro setdoorclosed x, y
+ .byte 0xb0
+ .2byte \x
+ .2byte \y
+ .endm
+
+ @ In FireRed, this command is a nop.
+ .macro addelevmenuitem
+ .byte 0xb1
+ .endm
+
+ @ In FireRed and Emerald, this command is a nop.
+ .macro showelevmenu
+ .byte 0xb2
+ .endm
+
+ .macro checkcoins out
+ .byte 0xb3
+ .2byte \out
+ .endm
+
+ .macro givecoins count
+ .byte 0xb4
+ .2byte \count
+ .endm
+
+ .macro takecoins count
+ .byte 0xb5
+ .2byte \count
+ .endm
+
+ @ Prepares to start a wild battle against a species at Level level holding item. Running this command will not affect normal wild battles. You start the prepared battle with dowildbattle.
+ .macro setwildbattle species, level, item
+ .byte 0xb6
+ .2byte \species
+ .byte \level
+ .2byte \item
+ .endm
+
+ @ Starts a wild battle against the Pokemon generated by setwildbattle. Blocks script execution until the battle finishes.
+ .macro dowildbattle
+ .byte 0xb7
+ .endm
+
+ .macro setvaddress long, word
+ .byte 0xb8
+ .4byte \long
+ .2byte \word
+ .endm
+
+ .macro vgoto pointer
+ .byte 0xb9
+ .4byte \pointer
+ .endm
+
+ .macro vcall pointer
+ .byte 0xba
+ .4byte \pointer
+ .endm
+
+ .macro vgoto_if byte, pointer
+ .byte 0xbb
+ .byte \byte
+ .4byte \pointer
+ .endm
+
+ .macro vcall_if byte, pointer
+ .byte 0xbc
+ .byte \byte
+ .4byte \pointer
+ .endm
+
+ .macro vmessage pointer
+ .byte 0xbd
+ .4byte \pointer
+ .endm
+
+ .macro vloadptr pointer
+ .byte 0xbe
+ .4byte \pointer
+ .endm
+
+ .macro vbufferstring byte, pointer
+ .byte 0xbf
+ .byte \byte
+ .4byte \pointer
+ .endm
+
+ @ Spawns a secondary box showing how many Coins the player has.
+ .macro showcoinsbox x, y
+ .byte 0xc0
+ .byte \x
+ .byte \y
+ .endm
+
+ @ Hides the secondary box spawned by showcoins. It consumes its arguments but doesn't use them.
+ .macro hidecoinsbox x, y
+ .byte 0xc1
+ .byte \x
+ .byte \y
+ .endm
+
+ @ Updates the secondary box spawned by showcoins. It consumes its arguments but doesn't use them.
+ .macro updatecoinsbox x, y
+ .byte 0xc2
+ .byte \x
+ .byte \y
+ .endm
+
+ @ Increases the value of the specified game stat by 1. The stat's value will not be allowed to exceed 0x00FFFFFF.
+ .macro incrementgamestat stat
+ .byte 0xc3
+ .byte \stat
+ .endm
+
+ @ Sets the destination that using an Escape Rope or Dig will take the player to.
+ .macro setescapewarp map, warp, x, y
+ .byte 0xc4
+ map \map
+ .byte \warp
+ .2byte \x
+ .2byte \y
+ .endm
+
+ @ Blocks script execution until cry finishes.
+ .macro waitmoncry
+ .byte 0xc5
+ .endm
+
+ @ Writes the name of the specified (box) PC box to the specified buffer.
+ .macro bufferboxname out, box
+ .byte 0xc6
+ .byte \out
+ .2byte \box
+ .endm
+
+ @ Sets the color of the text in standard message boxes. 0x00 produces blue (male) text, 0x01 produces red (female) text, 0xFF resets the color to the default for the current OW's gender, and all other values produce black text.
+ .macro textcolor color
+ .byte 0xc7
+ .byte \color
+ .endm
+
+ @ The exact purpose of this command is unknown, but it is related to the blue help-text box that appears on the bottom of the screen when the Main Menu is opened.
+ .macro loadhelp pointer
+ .byte 0xc8
+ .4byte \pointer
+ .endm
+
+ @ The exact purpose of this command is unknown, but it is related to the blue help-text box that appears on the bottom of the screen when the Main Menu is opened.
+ .macro unloadhelp
+ .byte 0xc9
+ .endm
+
+ @ After using this command, all standard message boxes will use the signpost frame.
+ .macro signmsg
+ .byte 0xca
+ .endm
+
+ @ Ends the effects of signmsg, returning message box frames to normal.
+ .macro normalmsg
+ .byte 0xcb
+ .endm
+
+ @ Compares the value of a hidden variable to a dword.
+ .macro comparehiddenvar a, value
+ .byte 0xcc
+ .byte \a
+ .4byte \value
+ .endm
+
+@ Supplementary
+
+ .macro goto_if_trainer_not_defeated opponent, dest
+ checktrainerflag \opponent
+ goto_if 0, \dest
+ .endm
+
+ .macro goto_if_trainer_defeated opponent, dest
+ checktrainerflag \opponent
+ goto_if 1, \dest
+ .endm
+
+ .macro call_if_trainer_not_defeated opponent, dest
+ checktrainerflag \opponent
+ call_if 0, \dest
+ .endm
+
+ .macro call_if_trainer_defeated opponent, dest
+ checktrainerflag \opponent
+ call_if 1, \dest
+ .endm
+
+ .macro goto_if_unset flag, dest
+ checkflag \flag
+ goto_if 0, \dest
+ .endm
+
+ .macro goto_if_set flag, dest
+ checkflag \flag
+ goto_if 1, \dest
+ .endm
+
+ .macro goto_if_lt dest @ LESS THAN
+ goto_if 0, \dest
+ .endm
+
+ .macro goto_if_eq dest @ EQUAL
+ goto_if 1, \dest
+ .endm
+
+ .macro goto_if_gt dest @ GREATER THAN
+ goto_if 2, \dest
+ .endm
+
+ .macro goto_if_le dest @ LESS THAN OR EQUAL
+ goto_if 3, \dest
+ .endm
+
+ .macro goto_if_ge dest @ GREATER THAN OR EQUAL
+ goto_if 4, \dest
+ .endm
+
+ .macro goto_if_ne dest @ NOT EQUAL
+ goto_if 5, \dest
+ .endm
+
+ .macro call_if_unset flag, dest
+ checkflag \flag
+ call_if 0, \dest
+ .endm
+
+ .macro call_if_set flag, dest
+ checkflag \flag
+ call_if 1, \dest
+ .endm
+
+ .macro call_if_lt dest @ LESS THAN
+ call_if 0, \dest
+ .endm
+
+ .macro call_if_eq dest @ EQUAL
+ call_if 1, \dest
+ .endm
+
+ .macro call_if_gt dest @ GREATER THAN
+ call_if 2, \dest
+ .endm
+
+ .macro call_if_le dest @ LESS THAN OR EQUAL
+ call_if 3, \dest
+ .endm
+
+ .macro call_if_ge dest @ GREATER THAN OR EQUAL
+ call_if 4, \dest
+ .endm
+
+ .macro call_if_ne dest @ NOT EQUAL
+ call_if 5, \dest
+ .endm
+
+ .macro switch var
+ copyvar VAR_SPECIAL_0, \var
+ .endm
+
+ .macro case condition, dest
+ compare_var_to_value VAR_SPECIAL_0, \condition
+ goto_if_eq \dest
+ .endm
+
+ .macro msgbox text, type=4
+ loadword 0, \text
+ callstd \type
+ .endm
+
+ @ Message box types
+ MSGBOX_YESNO = 5
+
+ YES = 1
+ NO = 0
+
+ .macro giveitem_std item, amount=1, function=0
+ setorcopyvar VAR_SPECIAL_0, \item
+ setorcopyvar VAR_SPECIAL_1, \amount
+ callstd \function
+ .endm
+
+ .macro givedecoration_std decoration
+ setorcopyvar VAR_SPECIAL_0, \decoration
+ callstd 7
+ .endm
diff --git a/include/macros/field_effect_script.inc b/include/macros/field_effect_script.inc
new file mode 100644
index 000000000..d5895b0ef
--- /dev/null
+++ b/include/macros/field_effect_script.inc
@@ -0,0 +1,42 @@
+ .macro loadtiles address
+ .byte 0
+ .4byte \address
+ .endm
+
+ .macro loadfadedpal address
+ .byte 1
+ .4byte \address
+ .endm
+
+ .macro loadpal address
+ .byte 2
+ .4byte \address
+ .endm
+
+ .macro callnative address
+ .byte 3
+ .4byte \address
+ .endm
+
+ .macro end
+ .byte 4
+ .endm
+
+ .macro loadgfx_callnative tiles_address, palette_address, function_address
+ .byte 5
+ .4byte \tiles_address
+ .4byte \palette_address
+ .4byte \function_address
+ .endm
+
+ .macro loadtiles_callnative tiles_address, function_address
+ .byte 6
+ .4byte \tiles_address
+ .4byte \function_address
+ .endm
+
+ .macro loadfadedpal_callnative palette_address, function_address
+ .byte 7
+ .4byte \palette_address
+ .4byte \function_address
+ .endm
diff --git a/include/macros/function.inc b/include/macros/function.inc
new file mode 100644
index 000000000..67fb373a8
--- /dev/null
+++ b/include/macros/function.inc
@@ -0,0 +1,29 @@
+ .macro arm_func_start name
+ .align 2, 0
+ .global \name
+ .arm
+ .type \name, function
+ .endm
+
+ .macro arm_func_end name
+ .size \name, .-\name
+ .endm
+
+ .macro thumb_func_start name
+ .align 2, 0
+ .global \name
+ .thumb
+ .thumb_func
+ .type \name, function
+ .endm
+
+ .macro non_word_aligned_thumb_func_start name
+ .global \name
+ .thumb
+ .thumb_func
+ .type \name, function
+ .endm
+
+ .macro thumb_func_end name
+ .size \name, .-\name
+ .endm
diff --git a/include/macros/m4a.inc b/include/macros/m4a.inc
new file mode 100644
index 000000000..6c5abc09b
--- /dev/null
+++ b/include/macros/m4a.inc
@@ -0,0 +1,13 @@
+ .macro song label, music_player, unknown
+ .4byte \label
+ .2byte \music_player
+ .2byte \unknown
+ .endm
+
+ .macro music_player info_struct, track_struct, unknown_1, unknown_2
+ .4byte \info_struct
+ .4byte \track_struct
+ .byte \unknown_1
+ .space 1
+ .2byte \unknown_2
+ .endm
diff --git a/include/macros/map.inc b/include/macros/map.inc
new file mode 100644
index 000000000..db37d9346
--- /dev/null
+++ b/include/macros/map.inc
@@ -0,0 +1,96 @@
+ .macro map map_id
+ .byte \map_id >> 8 @ map group
+ .byte \map_id & 0xFF @ map num
+ .endm
+
+ .macro map_script type, address
+ .byte \type
+ .4byte \address
+ .endm
+
+ .macro map_script_2 word1, word2, address
+ .2byte \word1
+ .2byte \word2
+ .4byte \address
+ .endm
+
+ .macro object_event byte1, word1, byte2, byte3, byte4, byte5, byte6, byte7, byte8, byte9, byte10, byte11, byte12, byte13, byte14, script, word2, byte15, byte16
+ .byte \byte1
+ .2byte \word1
+ .byte \byte2, \byte3, \byte4, \byte5, \byte6, \byte7, \byte8, \byte9, \byte10, \byte11, \byte12, \byte13, \byte14
+ .4byte \script
+ .2byte \word2
+ .byte \byte15, \byte16
+ inc _num_npcs
+ .endm
+
+ .macro warp_def x, y, byte, warp, map_id
+ .2byte \x, \y
+ .byte \byte, \warp
+ .byte \map_id & 0xFF @ map num
+ .byte \map_id >> 8 @ map group
+ inc _num_warps
+ .endm
+
+ .macro coord_event x, y, byte1, byte2, word1, word2, word3, script
+ .2byte \x, \y
+ .byte \byte1, \byte2
+ .2byte \word1, \word2, \word3
+ .4byte \script
+ inc _num_traps
+ .endm
+
+ .macro coord_weather_event x, y, height, weather
+ coord_event \x, \y, \height, 0, \weather, 0, 0, 0x0
+ .endm
+
+ .macro bg_event x, y, byte, kind, word, arg6, arg7, arg8
+ .2byte \x, \y
+ .byte \byte, \kind
+ .2byte \word
+ .if \kind < 5
+ .4byte \arg6
+ .else
+ .2byte \arg6
+ .byte \arg7, \arg8
+ .endif
+ inc _num_signs
+ .endm
+
+ .macro bg_hidden_item_event x, y, height, item, flag
+ bg_event \x, \y, \height, 7, 0, \item, ((\flag) - FLAG_HIDDEN_ITEMS_START), 0
+ .endm
+
+ .macro bg_secret_base_event x, y, height, secret_base_id
+ bg_event \x, \y, \height, 8, 0, \secret_base_id, 0, 0
+ .endm
+
+ .macro map_events npcs, warps, traps, signs
+ .byte _num_npcs, _num_warps, _num_traps, _num_signs
+ .4byte \npcs, \warps, \traps, \signs
+ reset_map_events
+ .endm
+
+ .macro reset_map_events
+ .set _num_npcs, 0
+ .set _num_warps, 0
+ .set _num_traps, 0
+ .set _num_signs, 0
+ .endm
+
+ reset_map_events
+
+
+ .equiv connection_down, 1
+ .equiv connection_up, 2
+ .equiv connection_left, 3
+ .equiv connection_right, 4
+ .equiv connection_dive, 5
+ .equiv connection_emerge, 6
+
+ .macro connection direction, offset, map, filler
+ .4byte connection_\direction
+ .4byte \offset
+ map \map
+ .space 2
+ .endm
diff --git a/include/macros/movement.inc b/include/macros/movement.inc
new file mode 100644
index 000000000..674ce7169
--- /dev/null
+++ b/include/macros/movement.inc
@@ -0,0 +1,116 @@
+ .macro create_movement name
+ enum _\name
+ .macro \name
+ .byte _\name
+ .endm
+ .endm
+
+ enum_start
+ create_movement step_00
+ create_movement step_01
+ create_movement step_02
+ create_movement step_03
+ create_movement slow_step_down
+ create_movement slow_step_up
+ create_movement slow_step_left
+ create_movement slow_step_right
+ create_movement step_down
+ create_movement step_up
+ create_movement step_left
+ create_movement step_right
+ create_movement fast_step_down
+ create_movement fast_step_up
+ create_movement fast_step_left
+ create_movement fast_step_right
+ create_movement step_10
+ create_movement step_11
+ create_movement step_12
+ create_movement step_13
+ create_movement step_14
+ create_movement step_15
+ create_movement step_16
+ create_movement step_17
+ create_movement step_18
+ create_movement step_19
+ create_movement step_1a
+ create_movement step_1b
+ create_movement step_1c
+ create_movement step_1d
+ create_movement step_1e
+ create_movement step_1f
+ create_movement step_20
+ create_movement step_21
+ create_movement step_22
+ create_movement step_23
+ create_movement step_24
+ create_movement step_25
+ create_movement step_26
+ create_movement step_27
+ create_movement step_28
+ create_movement step_29
+ create_movement step_2a
+ create_movement step_2b
+ create_movement step_2c
+ create_movement step_2d
+ create_movement step_2e
+ create_movement step_2f
+ create_movement step_30
+ create_movement step_31
+ create_movement step_32
+ create_movement step_33
+ create_movement step_34
+ create_movement step_35
+ create_movement step_36
+ create_movement step_37
+ create_movement step_38
+ create_movement step_39
+ create_movement step_3a
+ create_movement step_3b
+ create_movement step_3c
+ create_movement step_3d
+ create_movement step_3e
+ create_movement step_3f
+ create_movement step_40
+ create_movement step_41
+ create_movement step_42
+ create_movement step_43
+ create_movement step_44
+ create_movement step_45
+ create_movement step_46
+ create_movement step_47
+ create_movement step_48
+ create_movement step_49
+ create_movement step_4a
+ create_movement step_4b
+ create_movement step_4c
+ create_movement step_4d
+ create_movement step_4e
+ create_movement step_4f
+ create_movement step_50
+ create_movement step_51
+ create_movement step_52
+ create_movement step_53
+ create_movement step_54
+ create_movement step_55
+ create_movement step_56
+ create_movement step_57
+ create_movement step_58
+ create_movement step_59
+ create_movement step_5a
+ create_movement step_5b
+ create_movement step_5c
+ create_movement step_5d
+ create_movement step_5e
+ create_movement step_5f
+ create_movement step_60
+ create_movement step_61
+
+ enum_start 0x91
+ create_movement step_91
+ create_movement step_92
+
+ enum_start 0x96
+ create_movement step_96
+
+ enum_start 0xfe
+ create_movement step_end
diff --git a/include/macros/music_voice.inc b/include/macros/music_voice.inc
new file mode 100644
index 000000000..b7a9e7f8d
--- /dev/null
+++ b/include/macros/music_voice.inc
@@ -0,0 +1,125 @@
+ .macro voice_directsound base_midi_key, pan, sample_data_pointer, attack, decay, sustain, release
+ .byte 0
+ _voice_directsound \base_midi_key, \pan, \sample_data_pointer, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro voice_directsound_no_resample base_midi_key, pan, sample_data_pointer, attack, decay, sustain, release
+ .byte 8
+ _voice_directsound \base_midi_key, \pan, \sample_data_pointer, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro voice_directsound_alt base_midi_key, pan, sample_data_pointer, attack, decay, sustain, release
+ .byte 16
+ _voice_directsound \base_midi_key, \pan, \sample_data_pointer, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro _voice_directsound base_midi_key, pan, sample_data_pointer, attack, decay, sustain, release
+ .byte \base_midi_key
+ .byte 0
+ .if \pan != 0
+ .byte (0x80 | \pan)
+ .else
+ .byte 0
+ .endif
+ .4byte \sample_data_pointer
+ .byte \attack
+ .byte \decay
+ .byte \sustain
+ .byte \release
+ .endm
+
+ .macro voice_square_1 sweep, duty_cycle, attack, decay, sustain, release
+ _voice_square_1 1, \sweep, \duty_cycle, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro voice_square_1_alt sweep, duty_cycle, attack, decay, sustain, release
+ _voice_square_1 9, \sweep, \duty_cycle, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro _voice_square_1 type, sweep, duty_cycle, attack, decay, sustain, release
+ .byte \type, 60, 0
+ .byte \sweep
+ .byte (\duty_cycle & 0x3)
+ .byte 0, 0, 0
+ .byte (\attack & 0x7)
+ .byte (\decay & 0x7)
+ .byte (\sustain & 0xF)
+ .byte (\release & 0x7)
+ .endm
+
+ .macro voice_square_2 duty_cycle, attack, decay, sustain, release
+ _voice_square_2 2, \duty_cycle, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro voice_square_2_alt duty_cycle, attack, decay, sustain, release
+ _voice_square_2 10, \duty_cycle, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro _voice_square_2 type, duty_cycle, attack, decay, sustain, release
+ .byte \type, 60, 0, 0
+ .byte (\duty_cycle & 0x3)
+ .byte 0, 0, 0
+ .byte (\attack & 0x7)
+ .byte (\decay & 0x7)
+ .byte (\sustain & 0xF)
+ .byte (\release & 0x7)
+ .endm
+
+ .macro voice_programmable_wave wave_samples_pointer, attack, decay, sustain, release
+ _voice_programmable_wave 3, \wave_samples_pointer, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro voice_programmable_wave_alt wave_samples_pointer, attack, decay, sustain, release
+ _voice_programmable_wave 11, \wave_samples_pointer, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro _voice_programmable_wave type, wave_samples_pointer, attack, decay, sustain, release
+ .byte \type, 60, 0, 0
+ .4byte \wave_samples_pointer
+ .byte (\attack & 0x7)
+ .byte (\decay & 0x7)
+ .byte (\sustain & 0xF)
+ .byte (\release & 0x7)
+ .endm
+
+ .macro voice_noise period, attack, decay, sustain, release
+ _voice_noise 4, \period, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro voice_noise_alt period, attack, decay, sustain, release
+ _voice_noise 12, \period, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro _voice_noise type, period, attack, decay, sustain, release
+ .byte \type, 60, 0, 0
+ .byte (\period & 0x1)
+ .byte 0, 0, 0
+ .byte (\attack & 0x7)
+ .byte (\decay & 0x7)
+ .byte (\sustain & 0xF)
+ .byte (\release & 0x7)
+ .endm
+
+ .macro voice_keysplit voice_group_pointer, keysplit_table_pointer
+ .byte 0x40, 0, 0, 0
+ .4byte \voice_group_pointer
+ .4byte \keysplit_table_pointer
+ .endm
+
+ .macro voice_keysplit_all voice_group_pointer
+ .byte 0x80, 0, 0, 0
+ .4byte \voice_group_pointer
+ .4byte 0
+ .endm
+
+ .macro cry sample
+ .byte 0x20, 60, 0, 0
+ .4byte \sample
+ .byte 0xff, 0, 0xff, 0
+ .endm
+
+ .macro cry2 sample
+ .byte 0x30, 60, 0, 0
+ .4byte \sample
+ .byte 0xff, 0, 0xff, 0
+ .endm
diff --git a/include/macros/pokemon_data.inc b/include/macros/pokemon_data.inc
new file mode 100644
index 000000000..b0a5f22e3
--- /dev/null
+++ b/include/macros/pokemon_data.inc
@@ -0,0 +1,57 @@
+ .macro pokedex_entry pokemon_name, height, weight, pokemon_scale, pokemon_offset, trainer_scale, trainer_offset
+ .2byte \height @ in decimeters
+ .2byte \weight @ in hectograms
+ .4byte DexDescription_\pokemon_name\()_1
+ .4byte DexDescription_\pokemon_name\()_2
+ .2byte 0 @ unused
+ .2byte \pokemon_scale
+ .2byte \pokemon_offset
+ .2byte \trainer_scale
+ .2byte \trainer_offset
+ .2byte 0 @ padding
+ .endm
+
+ .macro base_stats hp, attack, defense, speed, sp_attack, sp_defense
+ .byte \hp
+ .byte \attack
+ .byte \defense
+ .byte \speed
+ .byte \sp_attack
+ .byte \sp_defense
+ .endm
+
+ .macro ev_yield hp, attack, defense, speed, sp_attack, sp_defense
+ .2byte (\sp_defense << 10) | (\sp_attack << 8) | (\speed << 6) | (\defense << 4) | (\attack << 2) | \hp
+ .endm
+
+ .macro level_up_move level, move
+ .2byte (\level << 9) | \move
+ .endm
+
+ .macro evo_entry method, parameter, target_species
+ .2byte \method
+ .2byte \parameter
+ .2byte \target_species
+ .2byte 0 @ padding
+ .endm
+
+ .macro empty_evo_entries count
+ .fill 8 * \count, 1, 0
+ .endm
+
+ .macro egg_moves_begin species
+ .2byte 20000 + \species
+ .endm
+
+@ If the min level equals the max level, only one level argument is needed.
+ .macro wild_mon species, min_level, max_level
+ .byte \min_level
+
+ .ifb \max_level
+ .byte \min_level
+ .else
+ .byte \max_level
+ .endif
+
+ .2byte SPECIES_\species
+ .endm
diff --git a/include/main.h b/include/main.h
index ff9bb89c7..78403225e 100644
--- a/include/main.h
+++ b/include/main.h
@@ -51,6 +51,8 @@ extern bool8 gLinkVSyncDisabled;
extern const u8 gGameVersion;
extern const u8 gGameLanguage;
+extern u16 gKeyRepeatStartDelay;
+
void AgbMain(void);
void SetMainCallback2(MainCallback callback);
void InitKeys(void);
diff --git a/include/matsuda_debug_menu.h b/include/matsuda_debug_menu.h
index 60f2dc48c..ad877a014 100644
--- a/include/matsuda_debug_menu.h
+++ b/include/matsuda_debug_menu.h
@@ -3,7 +3,6 @@
#define BIT(n) (1 << (n))
-void sub_80AB184(void);
void sub_80AA280(u8);
void sub_80AA5E8(u8);
void sub_80AA658(u8);
diff --git a/include/menu.h b/include/menu.h
index 9a5ca62a0..3295cd5c5 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -26,45 +26,43 @@ extern u16 gMenuMessageBoxContentTileOffset;
void CloseMenu(void);
void AppendToList(u8 *list, u8 *pindex, u32 value);
-void InitMenuWindow(const struct WindowConfig *);
-void MultistepInitMenuWindowBegin(const struct WindowConfig *);
+void InitMenuWindow(const struct WindowTemplate *);
+void MultistepInitMenuWindowBegin(const struct WindowTemplate *);
bool32 MultistepInitMenuWindowContinue(void);
-void unref_sub_8071DA4(struct WindowConfig *, u16);
-void MenuLoadTextWindowGraphics_OverrideFrameType(u8);
-void MenuLoadTextWindowGraphics(void);
-void BasicInitMenuWindow(const struct WindowConfig *);
-void MenuPrint(const u8 *, u8, u8);
-void MenuZeroFillWindowRect(u8, u8, u8, u8);
-void MenuFillWindowRectWithBlankTile(u8, u8, u8, u8);
-void MenuZeroFillScreen(void);
-void MenuDrawTextWindow(u8, u8, u8, u8);
+void unref_sub_8071DA4(struct WindowTemplate *, u16);
+void Menu_LoadStdFrameGraphicsOverrideStyle(u8);
+void Menu_LoadStdFrameGraphics(void);
+void BasicInitMenuWindow(const struct WindowTemplate *);
+void Menu_PrintText(const u8 *, u8, u8);
+void Menu_EraseWindowRect(u8, u8, u8, u8);
+void Menu_BlankWindowRect(u8, u8, u8, u8);
+void Menu_EraseScreen(void);
+void Menu_DrawStdWindowFrame(u8, u8, u8, u8);
void sub_8071F40(const u8 *);
void sub_8071F60(u8, u8, u8);
u16 unref_sub_8071F98(u8, u8);
void unref_sub_8071FBC(u16, u8, u8, u8, u8);
-void MenuDisplayMessageBox(void);
+void Menu_DisplayDialogueFrame(void);
void MenuPrintMessage(const u8 *, u8, u8);
void MenuPrintMessageDefaultCoords(const u8 *);
-void MenuSetText(const u8 *);
-u8 MenuUpdateWindowText(void);
+void Menu_SetText(const u8 *);
+u8 Menu_UpdateWindowText(void);
u8 unref_sub_8072098(void);
-void sub_80720B0(void);
-u8 MoveMenuCursor(s8);
-u8 MoveMenuCursorNoWrap(s8);
-u8 GetMenuCursorPos(void);
-s8 ProcessMenuInput(void);
-s8 ProcessMenuInputNoWrap(void);
-u8 MoveMenuCursor3(s8);
-u8 MoveMenuCursor4(s8);
+void Menu_ClearWindowText(void);
+u8 Menu_MoveCursor(s8);
+u8 Menu_MoveCursorNoWrap(s8);
+u8 Menu_GetCursorPos(void);
+s8 Menu_ProcessInput(void);
+s8 Menu_ProcessInputNoWrap(void);
void sub_807274C(u8, u8, u8, u8, const struct MenuAction[], u8, u32);
-s8 sub_80727CC(void);
-u8 sub_807288C(u8);
-void PrintMenuItems(u8, u8, u8, const struct MenuAction[]);
-void PrintMenuItemsReordered(u8 left, u8 top, u8 menuItemCount, const struct MenuAction2 menuItems[], const u8 *order);
+s8 Menu_ProcessInputGridLayout(void);
+u8 Menu_GetColumnXCoord(u8);
+void Menu_PrintItems(u8, u8, u8, const struct MenuAction[]);
+void Menu_PrintItemsReordered(u8 left, u8 top, u8 menuItemCount, const struct MenuAction2 menuItems[], const u8 *order);
void InitYesNoMenu(u8, u8, u8);
void DisplayYesNoMenu(u8, u8, u32);
-s8 ProcessMenuInputNoWrap_(void);
-u8 MenuPrint_PixelCoords(const u8 *, u8, u16, u8);
+s8 Menu_ProcessInputNoWrap_(void);
+u8 Menu_PrintTextPixelCoords(const u8 *, u8, u16, u8);
u8 sub_8072A18(const u8 *, u8, u16, u8, u32);
u8 unref_sub_8072A5C(u8 *, u8 *, u8, u16, u8, u32);
int sub_8072AB0(const u8 *, u8, u16, u8, u8, u32);
@@ -75,16 +73,15 @@ u8 *sub_8072C14(u8 *, s32, u8, u8);
u8 *sub_8072C44(u8 *, s32, u8, u8);
u8 *sub_8072C74(u8 *, const u8 *, u8, u8);
u8 sub_8072CA4(const u8 *s);
-u8 sub_8072CBC(void);
-void sub_8072CD4(u8 *, u8 *, u8 *);
-u32 MenuUpdateWindowText_OverrideLineLength(u8);
+u8 Menu_GetTextWindowPaletteNum(void);
+void Menu_GetTextColors(u8 *, u8 *, u8 *);
+u32 Menu_UpdateWindowTextOverrideLineLength(u8);
struct Window * unref_sub_8072D0C(void);
u8 InitMenu(u8, u8, u8, u8, u8, u8);
-void RedrawMenuCursor(u8, u8);
void unref_sub_8072DC0(void);
void sub_8072DCC(u8);
void sub_8072DDC(u8);
-void HandleDestroyMenuCursors(void);
+void Menu_DestroyCursor(void);
#if GERMAN
u8 *de_sub_8073174(u8 *name, const u8 *format);
diff --git a/include/menu_cursor.h b/include/menu_cursor.h
index ca82ef244..8d9a4f23c 100644
--- a/include/menu_cursor.h
+++ b/include/menu_cursor.h
@@ -4,11 +4,11 @@
#include "sprite.h"
void sub_814A590(void);
-u8 sub_814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5);
+u8 MenuCursor_Create814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5);
u8 sub_814A758(u8 a1, u8 a2, u8 a3, u8 a4);
u8 unref_sub_814A7AC(u8 a1, u16 a2, u8 a3);
void DestroyMenuCursor(void);
-void sub_814A880(u8 a1, u8 a2);
+void MenuCursor_SetPos814A880(u8 a1, u8 a2);
void sub_814A904(void);
void sub_814A958(u8 a1);
void sub_814AABC(void (*callback)(struct Sprite *));
@@ -16,8 +16,8 @@ void sub_814AAF8(u16 a1);
void sub_814AB84(void);
void unref_sub_814ABE4(int a1);
u8 CreateBlendedOutlineCursor(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5);
-void sub_814AD44(void);
-void sub_814AD7C(u8 a1, u8 a2);
+void MenuCursor_Destroy814AD44(void);
+void MenuCursor_SetPos814AD7C(u8 a1, u8 a2);
void sub_814ADC8(void);
void sub_814ADF4(u8 a1);
diff --git a/include/menu_helpers.h b/include/menu_helpers.h
index 993d698bd..a1c872c73 100644
--- a/include/menu_helpers.h
+++ b/include/menu_helpers.h
@@ -9,7 +9,22 @@ struct YesNoFuncTable
void (*noFunc)(u8);
};
-void sub_80F9020(void);
+// SetVerticalScrollIndicators enums
+enum
+{
+ TOP_ARROW,
+ BOTTOM_ARROW,
+ LEFT_ARROW, // Bag arrows
+ RIGHT_ARROW
+};
+
+enum
+{
+ VISIBLE,
+ INVISIBLE
+};
+
+void ClearBGTilemapBuffers(void);
void DisplayItemMessageOnField(u8, const u8 *, TaskFunc, u16);
void DoYesNoFuncWithChoice(u8, const struct YesNoFuncTable *);
void sub_80F914C(u8, const struct YesNoFuncTable *);
@@ -19,21 +34,21 @@ bool8 sub_80F92F4(u16);
bool8 sub_80F931C(u16);
bool8 sub_80F9344(void);
void sub_80F9368(void);
-void sub_80F9438(void);
-void sub_80F944C(void);
+void ClearVideoCallbacks(void);
+void ClearVerticalScrollIndicatorPalettes(void);
void sub_80F9480(u8 *, u8);
void sub_80F94A4(u8, u8 *, s16, s16);
void sub_80F94F8(u8 *);
void sub_80F9520(u8 *, u8);
void CreateVerticalScrollIndicators(u8, u16, u16);
-void sub_80F979C(u8, bool8);
+void SetVerticalScrollIndicators(u8, bool8);
void DestroyVerticalScrollIndicator(u8);
void LoadScrollIndicatorPalette(void);
void BuyMenuFreeMemory(void);
-void sub_80F98A4(u8);
+void StopVerticalScrollIndicators(u8);
void StartVerticalScrollIndicators(u8);
void sub_80F98DC(u8);
void PauseVerticalScrollIndicator(u8);
-void sub_80F9988(u8, u8);
+void SetVerticalScrollIndicatorPriority(u8, u8);
#endif // GUARD_MENU_HELPERS_H
diff --git a/include/mon_markings.h b/include/mon_markings.h
new file mode 100644
index 000000000..d06264865
--- /dev/null
+++ b/include/mon_markings.h
@@ -0,0 +1,31 @@
+#ifndef POKERUBY_MON_MARKINGS_H
+#define POKERUBY_MON_MARKINGS_H
+
+struct PokemonMarkMenu
+{
+ /*0x0000*/ u16 baseTileTag;
+ /*0x0002*/ u16 basePaletteTag;
+ /*0x0004*/ u8 markings; // bit flags
+ /*0x0005*/ s8 cursorPos;
+ /*0x0006*/ bool8 markingsArray[4];
+ /*0x000A*/ u8 cursorBaseY;
+ /*0x000B*/ bool8 spriteSheetLoadRequired;
+ /*0x000C*/ struct Sprite *menuWindowSprites[2]; // upper and lower halves of menu window
+ /*0x0014*/ struct Sprite *menuMarkingSprites[4];
+ /*0x0024*/ struct Sprite *menuTextSprite;
+ /*0x0028*/ const u8 *frameTiles;
+ /*0x002C*/ const u16 *framePalette;
+ /*0x0030*/ u8 menuWindowSpriteTiles[0x1000];
+ /*0x1030*/ u8 filler1030[0x80];
+ /*0x10B0*/ u8 tileLoadState;
+}; // 10b4
+
+void sub_80F727C(struct PokemonMarkMenu *ptr);
+void sub_80F7404(void);
+void sub_80F7418(u8 markings, s16 x, s16 y);
+void sub_80F7470(void);
+bool8 sub_80F7500(void);
+struct Sprite *sub_80F7940(u16 tileTag, u16 paletteTag, const u16 *palette);
+void sub_80F7A10(u8 markings, void *dest);
+
+#endif //POKERUBY_MON_MARKINGS_H
diff --git a/include/money.h b/include/money.h
index 9f4ef71bc..e3a3f898d 100644
--- a/include/money.h
+++ b/include/money.h
@@ -7,7 +7,7 @@ void RemoveMoney(u32 *, u32);
void GetMoneyAmountText(u8 *buffer, u32 arg1, u8 arg2);
void PrintMoneyAmount(u32 arg0, u8 arg1, u8 x, u8 y);
void sub_80B7AEC(u32, u8 left, u8 top);
-void sub_80B7B34(u8, u8, int);
+void Draw10000Sprite(u8, u8, int);
void UpdateMoneyWindow(u32, u8, u8);
void OpenMoneyWindow(u32, u8, u8);
void CloseMoneyWindow(u8, u8);
diff --git a/include/mystery_event_menu.h b/include/mystery_event_menu.h
index 8801789d9..c1f5fbb8f 100644
--- a/include/mystery_event_menu.h
+++ b/include/mystery_event_menu.h
@@ -2,5 +2,6 @@
#define GUARD_MYSTERY_EVENT_MENU_H
void CB2_InitMysteryEventMenu(void);
+void debug_sub_815D15C(void);
#endif // GUARD_MYSTERY_EVENT_MENU_H
diff --git a/include/overworld.h b/include/overworld.h
index 0954f1b63..50089593f 100644
--- a/include/overworld.h
+++ b/include/overworld.h
@@ -235,4 +235,6 @@ void CreateLinkPlayerSprite(u8);
void SpriteCB_LinkPlayer(struct Sprite *);
void sub_805465C(void);
+void CB2_InitTestMenu(void);
+
#endif // GUARD_ROM4_H
diff --git a/include/pc_screen_effect.h b/include/pc_screen_effect.h
new file mode 100644
index 000000000..d3f6d22de
--- /dev/null
+++ b/include/pc_screen_effect.h
@@ -0,0 +1,21 @@
+#ifndef GUARD_PC_SCREEN_EFFECT_H
+#define GUARD_PC_SCREEN_EFFECT_H
+
+struct PCScreenEffectStruct
+{
+ /*0x00*/ u16 tileTag;
+ /*0x02*/ u16 paletteTag;
+ /*0x04*/ u16 unk04;
+ /*0x06*/ u16 unk06;
+ /*0x08*/ u16 unk08;
+ /*0x0A*/ u16 unk0A;
+ /*0x0C*/ s16 unk0C;
+ /*0x10*/ u32 selectedPalettes;
+};
+
+void sub_80C5CD4(struct PCScreenEffectStruct *unkStruct);
+bool8 sub_80C5DCC(void);
+void sub_80C5E38(struct PCScreenEffectStruct *unkStruct);
+bool8 sub_80C5F98(void);
+
+#endif //GUARD_PC_SCREEN_EFFECT_H
diff --git a/include/pokeblock.h b/include/pokeblock.h
index 6720653a0..cda598f6c 100644
--- a/include/pokeblock.h
+++ b/include/pokeblock.h
@@ -3,12 +3,20 @@
enum
{
- PBLOCK_CLR_BLACK,
- PBLOCK_CLR_RED,
+ PBLOCK_CLR_RED = 1,
PBLOCK_CLR_BLUE,
PBLOCK_CLR_PINK,
PBLOCK_CLR_GREEN,
- PBLOCK_CLR_YELLOW
+ PBLOCK_CLR_YELLOW,
+ PBLOCK_CLR_PURPLE,
+ PBLOCK_CLR_INDIGO,
+ PBLOCK_CLR_BROWN,
+ PBLOCK_CLR_LITEBLUE,
+ PBLOCK_CLR_OLIVE,
+ PBLOCK_CLR_GRAY,
+ PBLOCK_CLR_BLACK,
+ PBLOCK_CLR_WHITE,
+ PBLOCK_CLR_GOLD,
};
enum
diff --git a/include/pokedex.h b/include/pokedex.h
index d8416889a..73877bead 100644
--- a/include/pokedex.h
+++ b/include/pokedex.h
@@ -23,6 +23,6 @@ s8 GetSetPokedexFlag(u16, u8);
u16 GetNationalPokedexCount(u8);
u16 GetHoennPokedexCount(u8);
bool8 CompletedHoennPokedex(void);
-u16 sub_8090FF4(void);
+bool16 CompletedNationalPokedex(void);
#endif // GUARD_POKEDEX_H
diff --git a/include/pokemon.h b/include/pokemon.h
index a1c30f1f3..169045c0c 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -258,7 +258,6 @@ struct BoxPokemon
/*0x13*/ u8 isBadEgg:1;
u8 hasSpecies:1;
u8 isEgg:1;
- u8 unused:5;
/*0x14*/ u8 otName[OT_NAME_LENGTH];
/*0x1B*/ u8 markings;
/*0x1C*/ u16 checksum;
@@ -351,6 +350,8 @@ struct BattlePokemon
/*0x54*/ u32 otId;
};
+// Shouldn't these be the same enum?
+
enum
{
STAT_STAGE_HP, // 0
@@ -363,6 +364,16 @@ enum
STAT_STAGE_EVASION, // 7
};
+enum
+{
+ STAT_HP, // 0
+ STAT_ATK, // 1
+ STAT_DEF, // 2
+ STAT_SPD, // 3
+ STAT_SPATK, // 4
+ STAT_SPDEF, // 5
+};
+
struct BaseStats
{
/*0x00*/ u8 baseHP;
@@ -405,9 +416,8 @@ struct BattleMove
u8 pp;
u8 secondaryEffectChance;
u8 target;
- u8 priority;
+ s8 priority;
u8 flags;
- u8 pad[3];
};
#define FLAG_MAKES_CONTACT 0x1
@@ -418,10 +428,10 @@ struct BattleMove
struct PokemonStorage
{
- /*0x00*/ u8 currentBox;
- /*0x01*/ struct BoxPokemon boxes[14][30];
- u8 boxNames[14][9];
- u8 unkArray[14];
+ /*0x0000*/ u8 currentBox;
+ /*0x0004*/ struct BoxPokemon boxes[14][30];
+ /*0x8344*/ u8 boxNames[14][9];
+ /*0x83c2*/ u8 wallpaper[14];
};
struct SpindaSpot
@@ -492,8 +502,8 @@ extern struct Pokemon gEnemyParty[PARTY_SIZE];
extern const u8 *const gItemEffectTable[];
extern const struct BaseStats gBaseStats[];
extern const u32 gExperienceTables[][101];
-extern const u16 *const gLevelUpLearnsets[];
-extern const struct EvolutionData gEvolutionTable[];
+extern const u16 *gLevelUpLearnsets[];
+extern struct Evolution gEvolutionTable[][5];
extern struct PokemonStorage gPokemonStorage;
void ZeroBoxMonData(struct BoxPokemon *boxMon);
@@ -512,7 +522,7 @@ void sub_803ADE8(struct Pokemon *mon, struct UnknownPokemonStruct *src);
void sub_803AF78(struct Pokemon *mon, struct UnknownPokemonStruct *dest);
u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon);
void CalculateMonStats(struct Pokemon *mon);
-void sub_803B4B4(const struct BoxPokemon *src, struct Pokemon *dest);
+void ExpandBoxMon(const struct BoxPokemon *src, struct Pokemon *dest);
u8 GetLevelFromMonExp(struct Pokemon *mon);
u8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon);
u16 GiveMoveToMon(struct Pokemon *mon, u16 move);
@@ -613,8 +623,12 @@ bool8 IsPokeSpriteNotFlipped(u16);
u8 GetLevelUpMovesBySpecies(u16, u16 *);
u8 TryIncrementMonLevel(struct Pokemon *);
bool8 IsShiny(struct Pokemon *mon);
+void RandomlyGivePartyPokerus(struct Pokemon *party);
+void PartySpreadPokerus(struct Pokemon *party);
struct Sprite *sub_80F7920(u16, u16, const u16 *);
+void BoxMonRestorePP(struct BoxPokemon *);
+bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId);
#endif // GUARD_POKEMON_H
diff --git a/include/pokemon_icon.h b/include/pokemon_icon.h
index 7e26c1c9b..a1a965d81 100644
--- a/include/pokemon_icon.h
+++ b/include/pokemon_icon.h
@@ -1,6 +1,9 @@
#ifndef GUARD_POKEMON_ICON_H
#define GUARD_POKEMON_ICON_H
+extern const u8 * const gMonIconTable[];
+extern const u8 gMonIconPaletteIndices[];
+
u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality);
u8 UpdateMonIconFrame(struct Sprite *sprite);
u8 sub_809D3A4(u16 arg0, void (*)(struct Sprite *), int, u8 arg3, u32 arg4);
@@ -12,5 +15,6 @@ void sub_809D580(u16);
void sub_809D608(u16);
void sub_809D62C(struct Sprite *sprite);
void sub_809D824(struct Sprite *sprite, u8 animNum);
+u16 mon_icon_convert_unown_species_id(u16 species, u32 personality);
#endif // GUARD_POKEMON_ICON_H
diff --git a/include/pokemon_item_effect.h b/include/pokemon_item_effect.h
index c09649aff..014612b05 100644
--- a/include/pokemon_item_effect.h
+++ b/include/pokemon_item_effect.h
@@ -1,6 +1,6 @@
#ifndef GUARD_POKEMON_ITEM_EFFECT_H
#define GUARD_POKEMON_ITEM_EFFECT_H
-bool8 ExecuteTableBasedItemEffect_(struct Pokemon *mon, u16, u8, u16);
+bool8 ExecuteTableBasedItemEffect_(struct Pokemon *mon, u16, u8, u8);
#endif // GUARD_POKEMON_ITEM_EFFECT_H
diff --git a/include/pokemon_storage_system.h b/include/pokemon_storage_system.h
index 9fe3436ef..5319b7a2d 100644
--- a/include/pokemon_storage_system.h
+++ b/include/pokemon_storage_system.h
@@ -1,8 +1,302 @@
#ifndef GUARD_POKEMON_STORAGE_SYSTEM_H
#define GUARD_POKEMON_STORAGE_SYSTEM_H
+#include "pc_screen_effect.h"
+#include "mon_markings.h"
+
+enum {
+ PC_TEXT_EXIT_BOX,
+ PC_TEXT_WHAT_YOU_DO,
+ PC_TEXT_PICK_A_THEME,
+ PC_TEXT_PICK_A_WALLPAPER,
+ PC_TEXT_IS_SELECTED,
+ PC_TEXT_JUMP_TO_WHICH_BOX,
+ PC_TEXT_DEPOSIT_IN_WHICH_BOX,
+ PC_TEXT_WAS_DEPOSITED,
+ PC_TEXT_BOX_IS_FULL,
+ PC_TEXT_RELEASE_POKE,
+ PC_TEXT_WAS_RELEASED,
+ PC_TEXT_BYE_BYE,
+ PC_TEXT_MARK_POKE,
+ PC_TEXT_LAST_POKE,
+ PC_TEXT_PARTY_FULL,
+ PC_TEXT_HOLDING_POKE,
+ PC_TEXT_WHICH_ONE_WILL_TAKE,
+ PC_TEXT_CANT_RELEASE_EGG,
+ PC_TEXT_CONTINUE_BOX,
+ PC_TEXT_CAME_BACK,
+ PC_TEXT_WORRIED,
+ PC_TEXT_SURPRISE,
+ PC_TEXT_PLEASE_REMOVE_MAIL
+};
+
+enum {
+ PC_TEXT_FMT_NORMAL,
+ PC_TEXT_FMT_MON_NAME,
+ PC_TEXT_FMT_UNK_02,
+ PC_TEXT_FMT_UNK_03,
+ PC_TEXT_FMT_MON_NAME_2,
+ PC_TEXT_FMT_UNK_05,
+ PC_TEXT_FMT_MON_NAME_AFTER_EXCL_MARK
+};
+
+struct StorageAction {
+ const u8 *text;
+ u8 format;
+};
+
+struct PSS_MenuStringPtrs {
+ const u8 *text;
+ const u8 *desc;
+};
+
+struct UnkStruct_2000028 {
+ void *unk_00;
+ void *unk_04;
+ u16 unk_08;
+ u16 unk_0a;
+ void (*unk_0c)(struct UnkStruct_2000028 *data);
+};
+
+struct UnkStruct_2000020 {
+ struct UnkStruct_2000028 *unk_00;
+ u8 unk_04;
+ u8 unk_05;
+};
+
+struct UnkPSSStruct_2002370 {
+ struct Sprite *unk_0000;
+ struct Sprite *unk_0004[4];
+ u32 unk_0014[3];
+ struct Sprite *unk_0020[2];
+ u8 filler_0028[0x214];
+ u8 curBox;
+ u8 unk_023d;
+ u8 unk_023e;
+ u16 unk_0240;
+ u16 unk_0242;
+}; // 0244
+
+struct PokemonStorageSystemData {
+ void (*unk_0000)(void);
+ u8 unk_0004;
+ u8 unk_0005;
+ u8 unk_0006;
+ u8 unk_0007;
+ u16 unk_0008;
+ u16 unk_000a;
+ struct PCScreenEffectStruct unk_000c;
+ struct UnkStruct_2000020 unk_0020;
+ struct UnkStruct_2000028 unk_0028[8];
+ u16 unk_00a8[0x400];
+ u16 unk_08a8;
+ u16 unk_08aa;
+ u8 unk_08ac;
+ u8 unk_08ad;
+ u8 unk_08ae;
+ u8 unk_08af;
+ u8 unk_08b0;
+ bool8 unk_08b1;
+ s16 unk_08b2;
+ u16 unk_08b4;
+ u16 unk_08b6;
+ u16 unk_08b8;
+ bool8 unk_08ba;
+ u8 unk_08bb;
+ u16 unk_08bc;
+ u16 unk_08be;
+ u16 unk_08c0;
+ u16 unk_08c2;
+ u16 unk_08c4;
+ u16 unk_08c6;
+ u16 unk_08c8;
+ u8 unk_08ca[0x400];
+ u8 unk_0cca;
+ u16 unk_0ccc[0x10];
+ u16 unk_0cec;
+ u16 unk_0cee;
+ struct Sprite *unk_0cf0[2];
+ struct Sprite *unk_0cf8[2];
+ struct Sprite *unk_0d00[2];
+ u32 unk_0d08;
+ u8 filler_0d0c[0x50];
+ u16 unk_0d5c;
+ s16 unk_0d5e;
+ s16 unk_0d60;
+ u16 unk_0d62[360];
+ u8 unk_1032;
+ struct Sprite *unk_1034;
+ struct Sprite *unk_1038[6]; // party
+ struct Sprite *unk_1050[30]; // box
+ struct Sprite **unk_10c8;
+ struct Sprite **unk_10cc;
+ u16 unk_10d0[40];
+ u16 unk_1120[40];
+ u8 unk_1170;
+ u8 unk_1171;
+ u16 unk_1172;
+ s16 unk_1174;
+ s16 unk_1176;
+ u16 unk_1178;
+ u8 unk_117a;
+ s8 unk_117b;
+ u8 unk_117c;
+ u8 unk_117d;
+ u8 filler_117e[0x42];
+ struct Sprite *unk_11c0;
+ struct Sprite *unk_11c4;
+ s32 unk_11c8;
+ s32 unk_11cc;
+ s32 unk_11d0;
+ s32 unk_11d4;
+ s16 unk_11d8;
+ s16 unk_11da;
+ u16 unk_11dc;
+ s8 unk_11de;
+ s8 unk_11df;
+ u8 unk_11e0;
+ u8 unk_11e1;
+ u8 unk_11e2;
+ u8 unk_11e3;
+ u8 filler_11e4[4];
+ const u8 *unk_11e8;
+ u32 unk_11ec;
+ u16 unk_11f0;
+ u16 unk_11f2;
+ u8 filler_11f4[2];
+ u8 unk_11f6;
+ u8 unk_11f7;
+ u8 unk_11f8;
+ u8 unk_11f9;
+ u8 unk_11fa[0x15];
+ u8 unk_120f[0x25];
+ u8 unk_1234[0x25];
+ u8 unk_1259[0x21];
+ u8 unk_127a[0x2a];
+ bool8 (*unk_12a4)(void);
+ u8 unk_12a8;
+ u8 unk_12a9;
+ struct Sprite *unk_12ac;
+ struct Sprite *unk_12b0[2];
+ u16 *unk_12b8;
+ struct PokemonMarkMenu unk_12bc;
+ struct UnkPSSStruct_2002370 unk_2370;
+ struct Pokemon unk_25b4;
+ struct Pokemon unk_2618;
+ u8 unk_267c;
+ u8 unk_267d;
+ u8 unk_267e;
+ u8 unk_267f;
+ s8 unk_2680;
+ s8 unk_2681;
+ s8 unk_2682;
+ s8 unk_2683;
+ u16 unk_2684;
+ u16 unk_2686[3];
+ u8 unk_268c;
+ u8 unk_268d;
+ u8 unk_268e;
+ union {
+ struct Pokemon *pokemon;
+ struct BoxPokemon *box;
+ } unk_2690;
+ u8 unk_2694[18];
+ u8 unk_26a6[62];
+ u8 unk_26e4[0x16];
+ u16 unk_26fa;
+ u16 *unk_26fc;
+ struct Sprite *unk_2700;
+ u16 unk_2704[0x10];
+ u8 filler_2724[0x60];
+ u8 unk_2784[0x800];
+ u8 filler_2f84[0x1800];
+ u8 unk_4784[0x800];
+};
+
+extern u16 gUnknown_02039760[0x600];
+extern struct UnkPSSStruct_2002370 *gUnknown_02038478;
+extern struct PokemonStorageSystemData *const gPokemonStorageSystemPtr;
+extern u8 *const gUnknown_083B6DB8;
+
+u8 StorageSystemGetPartySize(void);
+s16 GetIndexOfFirstEmptySpaceInBoxN(u8 boxId);
+u8 CountAlivePartyMonsExceptOne(u8 toSkip);
+u8 CountPokemonInBoxN(u8 boxId);
+void sub_8096264(struct UnkPSSStruct_2002370 *a0, u16 tileTag, u16 palTag, u8 a3);
+void sub_809634C(u8 curBox);
+u8 sub_8096368(void);
+void sub_809635C(void);
+void sub_8096310(void);
+void sub_80961A8(void);
+void task_intro_29(u8 whichMenu);
void ResetPokemonStorageSystem(void);
-void BoxMonRestorePP(struct BoxPokemon *);
-void party_compaction(void);
+void ResetPSSMonIconSprites(void);
+void SpawnBoxIconSprites(u8 boxId);
+u8 get_preferred_box(void);
+void sub_8098BF0(void);
+void sub_8098D20(u8 monId);
+bool8 sub_80990AC(void);
+void sub_8099200(bool8 a0);
+void sub_8099310(void);
+bool8 sub_8099374(void);
+void sub_8099480(void);
+void sub_80994A8(s16 a0);
+void sub_8099520(u8 a0);
+void sub_809954C(void);
+void sub_8099584(u8 a0, u8 a1);
+void sub_809960C(u8 a0, u8 a1);
+void sub_80996B0(u8 a0, u8 a1);
+bool8 sub_809971C(void);
+void sub_809981C(u8 mode, u8 idx);
+bool8 sub_80998D8(void);
+void sub_8099920(void);
+void sub_8099958(void);
+bool8 sub_8099990(void);
+struct Sprite *sub_809A9A0(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority);
+void sub_8099BF8(u8 a0);
+void sub_8099C70(u8 whichBox);
+bool8 sub_8099D34(void);
+void sub_8099DCC(u8 a0);
+bool8 sub_8099E08(void);
+void sub_809A860(bool8 a0);
+void sub_809AA24(void);
+void sub_809AA98(void);
+bool8 sub_809AC00(void);
+void sub_809B0C0(u8 a0);
+void sub_809B0D4(void);
+void sub_809B0E0(void);
+u8 sub_809B0F4(void);
+void sub_809B068(void);
+void sub_809B100(u8 a0);
+bool8 sub_809B130(void);
+void sub_809B440(void);
+bool8 sub_809B62C(u8);
+void sub_809B6BC(void);
+void sub_809B6DC(void);
+bool8 sub_809B734(void);
+void sub_809B760(void);
+void sub_809B7AC(void);
+void sub_809B7D4(void);
+s8 sub_809B960(void);
+void sub_809BB90(void);
+void sub_809BBC0(void);
+void sub_809BC18(void);
+void sub_809BD14(void);
+s16 party_compaction(void);
+void sub_809BDD8(u8 markings);
+bool8 sub_809BE80(void);
+bool8 sub_809BEBC(void);
+bool8 sub_809BF20(void);
+bool8 sub_809BF48(void);
+u8 sub_809CA40(void);
+void sub_809CDCC(void);
+void sub_809CDEC(u8 a0);
+void sub_809CE84(void);
+s16 sub_809CF30(void);
+void sub_809CFDC(struct UnkStruct_2000020 *a0, struct UnkStruct_2000028 *a1, u8 a2);
+void sub_809CFF0(void);
+void sub_809D034(void *dest, u16 dLeft, u16 dTop, const void *src, u16 sLeft, u16 sTop, u16 width, u16 height);
+void sub_809D104(void *dest, u16 dLeft, u16 dTop, const void *src, u16 sLeft, u16 sTop, u16 width, u16 height);
+void sub_809D16C(void *dest, u16 dLeft, u16 dTop, u16 width, u16 height);
#endif // GUARD_POKEMON_STORAGE_SYSTEM_H
diff --git a/include/region_map.h b/include/region_map.h
index 254307052..e7a357fe2 100644
--- a/include/region_map.h
+++ b/include/region_map.h
@@ -68,5 +68,6 @@ void CreateRegionMapPlayerIcon(u16, u16);
const u8 *GetMapSectionName(u8 *dest, u16 mapSectionId, u16 length);
const u8 *CopyMapName(u8 *dest, u16 b);
const u8 *CopyLocationName(u8 *dest, u16 b);
+void CB2_InitFlyRegionMap(void);
#endif // GUARD_REGION_MAP_H
diff --git a/include/region_map_sections.h b/include/region_map_sections.h
index a3bd60b59..a3bd60b59 100755..100644
--- a/include/region_map_sections.h
+++ b/include/region_map_sections.h
diff --git a/include/reset_rtc_screen.h b/include/reset_rtc_screen.h
index 5807dec99..2de95534a 100644
--- a/include/reset_rtc_screen.h
+++ b/include/reset_rtc_screen.h
@@ -2,5 +2,6 @@
#define GUARD_RESET_RTC_SCREEN_H
void CB2_InitResetRtcScreen(void);
+void debug_sub_806F8F8(void);
#endif // GUARD_RESET_RTC_SCREEN_H
diff --git a/include/roamer.h b/include/roamer.h
index 9d5f3c4ed..86908bd00 100644
--- a/include/roamer.h
+++ b/include/roamer.h
@@ -7,5 +7,7 @@ void UpdateLocationHistoryForRoamer(void);
void RoamerMoveToOtherLocationSet(void);
void RoamerMove();
u8 TryStartRoamerEncounter(void);
+void UpdateRoamerHPStatus(struct Pokemon *mon);
+void SetRoamerInactive(void);
#endif
diff --git a/include/rom_8077ABC.h b/include/rom_8077ABC.h
index dda90c48f..ff737135b 100644
--- a/include/rom_8077ABC.h
+++ b/include/rom_8077ABC.h
@@ -25,9 +25,9 @@ u8 GetBankSide(u8 slot);
u8 GetBankSide(u8);
u8 GetBankIdentity(u8);
u8 GetBankIdentity(u8 slot);
-u8 GetBankByPlayerAI(u8);
-u8 GetBankByPlayerAI(u8);
-u8 GetBankByPlayerAI(u8 state);
+u8 GetBankByIdentity(u8);
+u8 GetBankByIdentity(u8);
+u8 GetBankByIdentity(u8 state);
bool8 IsBankSpritePresent(u8);
bool8 IsDoubleBattle();
u8 IsDoubleBattle(void);
@@ -85,7 +85,7 @@ void sub_8078174(struct Sprite *sprite);
void sub_80793C4(struct Sprite *sprite);
void sub_807A3FC(u8 slot, u8 a2, s16 *a3, s16 *a4);
u8 sub_8079ED4(u8 slot);
-int sub_807A100(u8 slot, u8 a2);
+s16 sub_807A100(u8 slot, u8 a2);
u16 sub_80790F0(s16 a, s16 b);
void sub_8078FDC(struct Sprite *sprite, bool8 a2, s16 xScale, s16 yScale, u16 rotation);
void sub_807867C(struct Sprite *sprite, s16 a2);
@@ -103,5 +103,9 @@ bool8 sub_8078718(struct Sprite *sprite);
bool8 sub_8078CE8(struct Sprite *sprite);
void oamt_add_pos2_onto_pos1(struct Sprite *sprite);
void sub_8078BD4(struct Sprite *sprite);
+void sub_807941C(struct Sprite *sprite);
+void sub_80789D4(bool8 a1);
+void sub_8079AB8(u8 sprite, u8 sprite2);
+u8 sub_807A4A0(int bank, u8 sprite, int species);
#endif // GUARD_ROM_8077ABC_H
diff --git a/include/roulette.h b/include/roulette.h
new file mode 100644
index 000000000..7d114a073
--- /dev/null
+++ b/include/roulette.h
@@ -0,0 +1,38 @@
+#ifndef GUARD_ROULETTE_H
+#define GUARD_ROULETTE_H
+
+struct UnkStruct1
+{
+ u16 var00;
+ u16 var02;
+ u8 var04;
+ u8 var05;
+ u8 var06;
+ s8 var07_0:5;
+ s8 var07_5:2;
+ s8 var07_7:1;
+};
+
+struct UnkStruct3
+{
+ u8 var00_0:7;
+ u8 var00_7:1;
+ u8 var01;
+ s8 var02;
+ s8 var03;
+ struct UnkStruct1 var04;
+};
+
+struct UnkStruct0
+{
+ u8 var00;
+ u8 var01;
+ u16 var02; //flag for each UnkStruct3
+ struct UnkStruct3 var04[0x10];
+};
+
+s16 sub_81174C4(s16, s16);
+s16 sub_81174E0(s16);
+void PlayRoulette(void);
+
+#endif
diff --git a/include/roulette_util.h b/include/roulette_util.h
new file mode 100644
index 000000000..daeaeeeef
--- /dev/null
+++ b/include/roulette_util.h
@@ -0,0 +1,14 @@
+#ifndef GUARD_ROULETTE_UTIL_H
+#define GUARD_ROULETTE_UTIL_H
+
+#include "roulette.h"
+
+void sub_8124918(struct UnkStruct0 *);
+u8 sub_812492C(struct UnkStruct0 *, u8, struct UnkStruct1 *);
+void task_tutorial_controls_fadein(struct UnkStruct0 *);
+void sub_8124CE8(struct UnkStruct0 *, u16);
+void sub_8124D3C(struct UnkStruct0 *, u16);
+void sub_8124DDC(u16 *, u16, u8, u8, u8, u8);
+void sub_8124E2C(u16 *, u16 *, u8, u8, u8, u8);
+
+#endif
diff --git a/include/save.h b/include/save.h
index c35ad547a..13e07d06a 100644
--- a/include/save.h
+++ b/include/save.h
@@ -1,85 +1,38 @@
#ifndef GUARD_SAVE_H
#define GUARD_SAVE_H
-struct SaveSectionLocation
-{
- u8 *data;
- u16 size;
-};
-
-struct SaveSection
-{
- u8 data[0xFF4];
- u16 id;
- u16 checksum;
- u32 security;
- u32 counter;
-}; // size is 0x1000
-
-// headless save section?
-struct UnkSaveSection
-{
- u8 data[0xFF4];
- u32 security;
-}; // size is 0xFF8
-
// Ruby/Sapphire's save data is Flash 128K, which is 32 save sectors.
#define NUM_SECTORS 32 // defined in agb_flash but not in a header
-#define UNKNOWN_CHECK_VALUE 0x8012025
+#define SAVE_STATUS_EMPTY 0
+#define SAVE_STATUS_OK 1
+#define SAVE_STATUS_NO_FLASH 4
+#define SAVE_STATUS_ERROR 0xFF
-// SetDamagedSectorBits states
-enum
-{
- ENABLE,
- DISABLE,
- CHECK // unused
-};
+extern u16 gSaveFileStatus;
+
+void Save_EraseAllData(void);
+void Save_ResetSaveCounters(void);
-// Do save types
enum
{
- NORMAL_SAVE,
- LINK_SAVE,
- EREADER_SAVE, // mossdeep event
- HOF_SAVE,
- DIFFERENT_FILE_SAVE,
- HOF_DELETE_SAVE // unused
+ SAVE_NORMAL,
+ SAVE_LINK,
+ SAVE_EREADER,
+ SAVE_HALL_OF_FAME,
+ SAVE_OVERWRITE_DIFFERENT_FILE,
+ SAVE_HALL_OF_FAME_ERASE_BEFORE, // unused
};
-void ClearSaveData(void);
-void ResetSaveCounters(void);
-bool32 ManipulateSectorBits(u8 op, u8 bit);
-u8 save_write_to_flash(u16 a1, const struct SaveSectionLocation *a2);
-u8 HandleWriteSector(u16, const struct SaveSectionLocation *);
-u8 HandleWriteSectorNBytes(u8 sector, u8 *data, u16 size);
-u8 TryWriteSector(u8, u8 *);
-u32 RestoreSaveBackupVarsAndIncrement(const struct SaveSectionLocation *location);
-u32 RestoreSaveBackupVars(const struct SaveSectionLocation *location);
-u8 sub_812550C(u16 a1, const struct SaveSectionLocation *location);
-u8 sub_812556C(u16 a1, const struct SaveSectionLocation *location);
-u8 sub_81255B8(u16, const struct SaveSectionLocation *location);
-u8 sub_8125758(u16 a1, const struct SaveSectionLocation *location);
-u8 sub_81257F0(u16 a1, const struct SaveSectionLocation *location);
-u8 sub_812587C(u16 a1, const struct SaveSectionLocation *location);
-u8 sub_81258BC(u16, const struct SaveSectionLocation *location);
-u8 GetSaveValidStatus(const struct SaveSectionLocation *location);
-u8 sub_8125B88(u8 a1, u8 *data, u16 size);
-u8 DoReadFlashWholeSection(u8, struct SaveSection *);
-u16 CalculateChecksum(void *, u16);
-u8 HandleSavingData(u8 saveType);
-u8 TrySavingData(u8 saveType);
+u8 Save_WriteDataInternal(u8 saveType);
+u8 Save_WriteData(u8 saveType);
+
u8 sub_8125D80(void);
bool8 sub_8125DA8(void);
u8 sub_8125DDC(void);
u8 sub_8125E04(void);
u8 sub_8125E2C(void);
bool8 sub_8125E6C(void);
-u8 sub_8125EC8(u8 a1);
-bool8 unref_sub_8125F4C(struct UnkSaveSection *a1);
-u8 unref_sub_8125FA0(void);
-u8 unref_sub_8125FF0(u8 *data, u16 size);
-u8 unref_sub_8126068(u8 sector, u8 *data, u32 size);
-u8 unref_sub_8126080(u8 sector, u8 *data);
+u8 Save_LoadGameData(u8 a1);
#endif // GUARD_SAVE_H
diff --git a/include/scanline_effect.h b/include/scanline_effect.h
new file mode 100644
index 000000000..314a856fa
--- /dev/null
+++ b/include/scanline_effect.h
@@ -0,0 +1,48 @@
+#ifndef GUARD_SCANLINE_EFFECT_H
+#define GUARD_SCANLINE_EFFECT_H
+
+// DMA control value to ransfer a single 16-bit value at HBlank
+#define SCANLINE_EFFECT_DMACNT_16BIT (((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_INC | DMA_16BIT | DMA_DEST_RELOAD) << 16) | 1)
+
+#define SCANLINE_EFFECT_REG_BG0HOFS (REG_ADDR_BG0HOFS - REG_ADDR_BG0HOFS)
+#define SCANLINE_EFFECT_REG_BG0VOFS (REG_ADDR_BG0VOFS - REG_ADDR_BG0HOFS)
+#define SCANLINE_EFFECT_REG_BG1HOFS (REG_ADDR_BG1HOFS - REG_ADDR_BG0HOFS)
+#define SCANLINE_EFFECT_REG_BG1VOFS (REG_ADDR_BG1VOFS - REG_ADDR_BG0HOFS)
+#define SCANLINE_EFFECT_REG_BG2HOFS (REG_ADDR_BG2HOFS - REG_ADDR_BG0HOFS)
+#define SCANLINE_EFFECT_REG_BG2VOFS (REG_ADDR_BG2VOFS - REG_ADDR_BG0HOFS)
+#define SCANLINE_EFFECT_REG_BG3HOFS (REG_ADDR_BG3HOFS - REG_ADDR_BG0HOFS)
+#define SCANLINE_EFFECT_REG_BG3VOFS (REG_ADDR_BG3VOFS - REG_ADDR_BG0HOFS)
+
+struct ScanlineEffectParams
+{
+ volatile void *dmaDest;
+ u32 dmaControl;
+ u8 initState;
+ u8 unused9;
+};
+
+struct ScanlineEffect
+{
+ void *dmaSrcBuffers[2];
+ volatile void *dmaDest;
+ u32 dmaControl;
+ void (*setFirstScanlineReg)(void);
+ u8 srcBuffer;
+ u8 state;
+ u8 unused16;
+ u8 unused17;
+ u8 waveTaskId;
+ u8 filler19[0x7];
+};
+
+extern struct ScanlineEffect gScanlineEffect;
+
+extern u16 gScanlineEffectRegBuffers[][0x3C0];
+
+void ScanlineEffect_Stop(void);
+void ScanlineEffect_Clear(void);
+void ScanlineEffect_SetParams(struct ScanlineEffectParams);
+void ScanlineEffect_InitHBlankDmaTransfer(void);
+u8 ScanlineEffect_InitWave(u8 startLine, u8 endLine, u8 frequency, u8 amplitude, u8 delayInterval, u8 regOffset, bool8 a7);
+
+#endif // GUARD_SCANLINE_EFFECT_H
diff --git a/include/shop.h b/include/shop.h
index b785ca764..80602e26c 100644
--- a/include/shop.h
+++ b/include/shop.h
@@ -17,6 +17,14 @@ enum
ANIM_NUM
};
+// shop options
+enum
+{
+ SHOP_BUY,
+ SHOP_SELL,
+ SHOP_EXIT
+};
+
struct MartInfo
{
/* 0x0 */ void (* callback) (void);
@@ -29,20 +37,9 @@ struct MartInfo
/* 0xD */ u8 curItemCount; // if you are selling an item, this is the count of the current item stack you have.
};
-void sub_80B2E38(u8);
-void HandleShopMenuQuit(u8);
-void sub_80B2FA0(u8);
-void BuyMenuDrawGraphics(void);
-void sub_80B3240(void);
-void sub_80B3270(void);
-void BuyMenuDrawMapGraphics(void);
-void sub_80B3764(int, int);
-void sub_80B37EC(void);
-void sub_80B40E8(u8);
-void CreatePokemartMenu(u16 *);
-void CreateDecorationShop1Menu(u16 *);
-void CreateDecorationShop2Menu(u16 *);
-void sub_80B356C(void);
-void sub_80B368C(void);
+void Shop_CreatePokemartMenu(u16 *);
+void Shop_CreateDecorationShop1Menu(u16 *);
+void Shop_CreateDecorationShop2Menu(u16 *);
+void Shop_RunExitSellMenuTask(u8 taskId);
#endif // GUARD_SHOP_H
diff --git a/include/slot_machine.h b/include/slot_machine.h
index c39aa7ca8..7759ca1b2 100644
--- a/include/slot_machine.h
+++ b/include/slot_machine.h
@@ -1,8 +1,80 @@
#ifndef GUARD_SLOT_MACHINE_H
#define GUARD_SLOT_MACHINE_H
-void PlaySlotMachine(u8, void *);
+enum {
+ SLOT_MACHINE_TAG_7_RED,
+ SLOT_MACHINE_TAG_7_BLUE,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_CHERRY,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_REPLAY
+};
+
+enum {
+ SLOT_MACHINE_MATCHED_1CHERRY,
+ SLOT_MACHINE_MATCHED_2CHERRY,
+ SLOT_MACHINE_MATCHED_REPLAY,
+ SLOT_MACHINE_MATCHED_LOTAD,
+ SLOT_MACHINE_MATCHED_AZURILL,
+ SLOT_MACHINE_MATCHED_POWER,
+ SLOT_MACHINE_MATCHED_777_MIXED,
+ SLOT_MACHINE_MATCHED_777_RED,
+ SLOT_MACHINE_MATCHED_777_BLUE,
+ SLOT_MACHINE_MATCHED_NONE
+};
+
+struct SlotMachineEwramStruct {
+ /*0x00*/ u8 state;
+ /*0x01*/ u8 unk01;
+ /*0x02*/ u8 pikaPower;
+ /*0x03*/ u8 unk03;
+ /*0x04*/ u8 unk04;
+ /*0x05*/ u8 unk05;
+ /*0x06*/ u8 unk06;
+ /*0x07*/ u8 unk07;
+ /*0x08*/ u16 matchedSymbols;
+ /*0x0A*/ u8 unk0A;
+ /*0x0B*/ u8 unk0B;
+ /*0x0C*/ s16 coins;
+ /*0x0E*/ s16 payout;
+ /*0x10*/ s16 unk10;
+ /*0x12*/ s16 bet;
+ /*0x14*/ s16 unk14;
+ /*0x16*/ s16 unk16;
+ /*0x18*/ s16 unk18;
+ /*0x1A*/ s16 unk1A;
+ /*0x1C*/ s16 unk1C[3];
+ /*0x22*/ u16 unk22[3];
+ /*0x28*/ s16 reelPositions[3];
+ /*0x2E*/ s16 unk2E[3];
+ /*0x34*/ s16 unk34[3];
+ /*0x3A*/ u8 reelTasks[3];
+ /*0x3D*/ u8 unk3D;
+ /*0x3E*/ u8 unk3E;
+ /*0x3F*/ u8 unk3F;
+ /*0x40*/ u8 unk40;
+ /*0x41*/ u8 unk41;
+ /*0x42*/ u8 unk42;
+ /*0x43*/ u8 unk43;
+ /*0x44*/ u8 unk44[5];
+ /*0x49*/ u8 unk49[2];
+ /*0x49*/ u8 unk4B[3];
+ /*0x4E*/ u8 unk4E[2];
+ /*0x50*/ u8 unk50[2];
+ /*0x52*/ u8 unk52[2];
+ /*0x54*/ u8 unk54[4];
+ /*0x58*/ u16 win0h;
+ /*0x5a*/ u16 win0v;
+ /*0x5c*/ u16 winIn;
+ /*0x5e*/ u16 winOut;
+ /*0x60*/ u16 backupMapMusic;
+ /*0x64*/ MainCallback prevMainCb;
+};
+
+void PlaySlotMachine(u8 arg0, MainCallback cb);
void sub_8104DA4(void);
-u8 sub_8105BB4(u8, u8, s16);
+u8 sub_8105BB4(u8 templateIdx, u8 cbAndCoordsIdx, s16 a2);
+void debug_sub_811609C(u8, void (*)(void));
#endif // GUARD_SLOT_MACHINE_H
diff --git a/include/sprite.h b/include/sprite.h
index 13c76c84b..3ad418356 100644
--- a/include/sprite.h
+++ b/include/sprite.h
@@ -120,10 +120,6 @@ union AffineAnimCmd
{.jump = {.type = AFFINEANIMCMDTYPE_JUMP, .target = _target}}
#define AFFINEANIMCMD_END \
{.type = AFFINEANIMCMDTYPE_END}
-#define AFFINEANIMCMD_LOOP(_count) \
- {.loop = {.type = AFFINEANIMCMDTYPE_LOOP, .count = _count}}
-#define AFFINEANIMCMD_JUMP(_target) \
- {.jump = {.type = AFFINEANIMCMDTYPE_JUMP, .target = _target}}
struct AffineAnimState
{
@@ -172,6 +168,8 @@ struct SpriteTemplate
void (*callback)(struct Sprite *);
};
+typedef void (*SpriteCallback)(struct Sprite *);
+
struct Sprite
{
/*0x00*/ struct OamData oam;
@@ -180,7 +178,7 @@ struct Sprite
/*0x10*/ const union AffineAnimCmd *const *affineAnims;
/*0x14*/ const struct SpriteTemplate *template;
/*0x18*/ const struct SubspriteTable *subspriteTables;
- /*0x1C*/ void (*callback)(struct Sprite *);
+ /*0x1C*/ SpriteCallback callback;
/*0x20*/ struct Coords16 pos1;
/*0x24*/ struct Coords16 pos2;
@@ -237,6 +235,9 @@ extern const union AffineAnimCmd *const gDummySpriteAffineAnimTable[];
extern s16 gSpriteCoordOffsetX;
extern s16 gSpriteCoordOffsetY;
extern u8 gReservedSpritePaletteCount;
+extern u16 gReservedSpriteTileCount;
+
+extern u8 gOamLimit;
extern struct Sprite gSprites[];
diff --git a/include/strings.h b/include/strings.h
index fe9cfc6ba..91c5c5344 100644
--- a/include/strings.h
+++ b/include/strings.h
@@ -164,7 +164,7 @@ extern const u8 gOtherText_None[];
extern const u8 gOtherText_ThreeQuestions2[];
-extern const u8 gOtherText_FiveQuestionsAndSlash[];
+extern const u8 gOtherText_FiveQuestions[];
extern const u8 gOtherText_OneDash[];
extern const u8 gOtherText_TwoDashes[];
diff --git a/include/text.h b/include/text.h
index ebc4ebe7e..71afd1d00 100644
--- a/include/text.h
+++ b/include/text.h
@@ -74,7 +74,7 @@
#define CHAR_NEWLINE 0xFE
#define EOS 0xFF // end of string
-struct WindowConfig
+struct WindowTemplate
{
u8 bgNum;
u8 charBaseBlock;
@@ -126,7 +126,7 @@ struct Window
/*0x20*/ const u8 *text;
/*0x24*/ u8 *tileData;
/*0x28*/ u16 *tilemap;
- /*0x2C*/ const struct WindowConfig *config;
+ /*0x2C*/ const struct WindowTemplate *template;
};
extern vu16 *const gBGControlRegs[];
@@ -137,65 +137,65 @@ extern const u16 gUnknown_081E29D8[];
extern const u16 gUnknown_081E29E0[];
extern const u16 gUnknown_081E29E8[];
-extern const struct WindowConfig gWindowConfig_81E6C3C;
-extern const struct WindowConfig gWindowConfig_81E6C58;
-extern const struct WindowConfig gWindowConfig_81E6C74;
-extern const struct WindowConfig gWindowConfig_81E6C90;
-extern const struct WindowConfig gWindowConfig_81E6CAC;
-extern const struct WindowConfig gWindowConfig_81E6CC8;
-extern const struct WindowConfig gWindowConfig_81E6CE4;
-extern const struct WindowConfig gWindowConfig_81E6D00;
-extern const struct WindowConfig gWindowConfig_81E6D1C;
-extern const struct WindowConfig gWindowConfig_81E6D38;
-extern const struct WindowConfig gWindowConfig_81E6D54;
-extern const struct WindowConfig gWindowConfig_81E6D70;
-extern const struct WindowConfig gWindowConfig_81E6D8C;
-extern const struct WindowConfig gWindowConfig_81E6DA8;
-extern const struct WindowConfig WindowConfig_TrainerCard_Back_Values;
-extern const struct WindowConfig WindowConfig_TrainerCard_Back_Labels;
-extern const struct WindowConfig gWindowConfig_81E6DFC;
-extern const struct WindowConfig gWindowConfig_81E6E18;
-extern const struct WindowConfig gWindowConfig_81E6E34;
-extern const struct WindowConfig gWindowConfig_81E6E50;
-extern const struct WindowConfig gWindowConfig_81E6E6C;
-extern const struct WindowConfig gWindowConfig_81E6E88;
-extern const struct WindowConfig gWindowConfig_81E6EA4;
-extern const struct WindowConfig gWindowConfig_81E6EC0;
-extern const struct WindowConfig gWindowConfig_81E6EDC;
-extern const struct WindowConfig gWindowConfig_81E6EF8;
-extern const struct WindowConfig gWindowConfig_81E6F14;
-extern const struct WindowConfig gWindowConfig_81E6F30;
-extern const struct WindowConfig gWindowConfig_81E6F4C;
-extern const struct WindowConfig gWindowConfig_81E6F68;
-extern const struct WindowConfig gWindowConfig_81E6F84;
-extern const struct WindowConfig gWindowConfig_81E6FA0;
-extern const struct WindowConfig gWindowConfig_81E6FBC;
-extern const struct WindowConfig gWindowConfig_81E6FD8;
-extern const struct WindowConfig gWindowConfig_81E6FF4;
-extern const struct WindowConfig gWindowConfig_81E7010;
-extern const struct WindowConfig gWindowConfig_81E702C;
-extern const struct WindowConfig gWindowConfig_81E7048;
-extern const struct WindowConfig gWindowConfig_81E7064;
-extern const struct WindowConfig gWindowConfig_81E7080;
-extern const struct WindowConfig gWindowConfig_81E709C;
-extern const struct WindowConfig gWindowConfig_81E70B8;
-extern const struct WindowConfig gWindowConfig_81E70D4;
-extern const struct WindowConfig gWindowConfig_81E70F0;
-extern const struct WindowConfig gWindowConfig_81E710C;
-extern const struct WindowConfig gWindowConfig_81E7128;
-extern const struct WindowConfig gWindowConfig_81E7144;
-extern const struct WindowConfig gWindowConfig_81E7160;
-extern const struct WindowConfig gWindowConfig_81E717C;
-extern const struct WindowConfig gWindowConfig_81E7198;
-extern const struct WindowConfig gWindowConfig_81E71B4;
-extern const struct WindowConfig gWindowConfig_81E71D0;
-extern const struct WindowConfig gWindowConfig_81E71EC;
-extern const struct WindowConfig gWindowConfig_81E7208;
-extern const struct WindowConfig gWindowConfig_81E7224;
-extern const struct WindowConfig gWindowConfig_81E7240;
-extern const struct WindowConfig gWindowConfig_81E725C;
-extern const struct WindowConfig gWindowConfig_81E7278;
-extern const struct WindowConfig gWindowConfig_81E7294;
+extern const struct WindowTemplate gWindowTemplate_81E6C3C;
+extern const struct WindowTemplate gWindowTemplate_81E6C58;
+extern const struct WindowTemplate gWindowTemplate_81E6C74;
+extern const struct WindowTemplate gWindowTemplate_81E6C90;
+extern const struct WindowTemplate gWindowTemplate_81E6CAC;
+extern const struct WindowTemplate gWindowTemplate_81E6CC8;
+extern const struct WindowTemplate gWindowTemplate_81E6CE4;
+extern const struct WindowTemplate gWindowTemplate_81E6D00;
+extern const struct WindowTemplate gWindowTemplate_81E6D1C;
+extern const struct WindowTemplate gWindowTemplate_81E6D38;
+extern const struct WindowTemplate gWindowTemplate_81E6D54;
+extern const struct WindowTemplate gWindowTemplate_81E6D70;
+extern const struct WindowTemplate gWindowTemplate_81E6D8C;
+extern const struct WindowTemplate gWindowTemplate_81E6DA8;
+extern const struct WindowTemplate gWindowTemplate_TrainerCard_Back_Values;
+extern const struct WindowTemplate gWindowTemplate_TrainerCard_Back_Labels;
+extern const struct WindowTemplate gWindowTemplate_81E6DFC;
+extern const struct WindowTemplate gWindowTemplate_81E6E18;
+extern const struct WindowTemplate gWindowTemplate_81E6E34;
+extern const struct WindowTemplate gWindowTemplate_81E6E50;
+extern const struct WindowTemplate gWindowTemplate_81E6E6C;
+extern const struct WindowTemplate gWindowTemplate_81E6E88;
+extern const struct WindowTemplate gWindowTemplate_81E6EA4;
+extern const struct WindowTemplate gWindowTemplate_81E6EC0;
+extern const struct WindowTemplate gWindowTemplate_81E6EDC;
+extern const struct WindowTemplate gWindowTemplate_81E6EF8;
+extern const struct WindowTemplate gWindowTemplate_81E6F14;
+extern const struct WindowTemplate gWindowTemplate_81E6F30;
+extern const struct WindowTemplate gWindowTemplate_81E6F4C;
+extern const struct WindowTemplate gWindowTemplate_81E6F68;
+extern const struct WindowTemplate gWindowTemplate_81E6F84;
+extern const struct WindowTemplate gWindowTemplate_81E6FA0;
+extern const struct WindowTemplate gWindowTemplate_81E6FBC;
+extern const struct WindowTemplate gWindowTemplate_81E6FD8;
+extern const struct WindowTemplate gWindowTemplate_81E6FF4;
+extern const struct WindowTemplate gWindowTemplate_81E7010;
+extern const struct WindowTemplate gWindowTemplate_81E702C;
+extern const struct WindowTemplate gWindowTemplate_81E7048;
+extern const struct WindowTemplate gWindowTemplate_81E7064;
+extern const struct WindowTemplate gWindowTemplate_81E7080;
+extern const struct WindowTemplate gWindowTemplate_81E709C;
+extern const struct WindowTemplate gWindowTemplate_81E70B8;
+extern const struct WindowTemplate gWindowTemplate_81E70D4;
+extern const struct WindowTemplate gWindowTemplate_81E70F0;
+extern const struct WindowTemplate gWindowTemplate_81E710C;
+extern const struct WindowTemplate gWindowTemplate_81E7128;
+extern const struct WindowTemplate gWindowTemplate_81E7144;
+extern const struct WindowTemplate gWindowTemplate_81E7160;
+extern const struct WindowTemplate gWindowTemplate_81E717C;
+extern const struct WindowTemplate gWindowTemplate_81E7198;
+extern const struct WindowTemplate gWindowTemplate_81E71B4;
+extern const struct WindowTemplate gWindowTemplate_81E71D0;
+extern const struct WindowTemplate gWindowTemplate_81E71EC;
+extern const struct WindowTemplate gWindowTemplate_81E7208;
+extern const struct WindowTemplate gWindowTemplate_81E7224;
+extern const struct WindowTemplate gWindowTemplate_81E7240;
+extern const struct WindowTemplate gWindowTemplate_81E725C;
+extern const struct WindowTemplate gWindowTemplate_81E7278;
+extern const struct WindowTemplate gWindowTemplate_81E7294;
extern u16 gBGTilemapBuffers[4][0x400];
@@ -205,52 +205,54 @@ extern u8 gStringVar3[];
extern u8 gStringVar4[];
extern u8 gTileBuffer[];
-void LoadFontDefaultPalette(const struct WindowConfig *winConfig);
-void SetUpWindowConfig(const struct WindowConfig *winConfig);
+void LoadFontDefaultPalette(const struct WindowTemplate *winConfig);
+void Text_LoadWindowTemplate(const struct WindowTemplate *winConfig);
u16 InitWindowTileData(struct Window *win, u16 startOffset);
u32 MultistepInitWindowTileData(struct Window *win, u16 startOffset);
bool32 MultistepLoadFont(void);
-void InitWindowFromConfig(struct Window *win, const struct WindowConfig *winConfig);
-void InitWindow(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top);
-void sub_8002E4C(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6);
-void sub_8002E90(struct Window *win, const u8 *text);
-void sub_8002EB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top);
-u8 sub_8002F44(struct Window *win);
-u8 sub_8003418(struct Window *win);
-u8 sub_8003460(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top);
+void Text_InitWindowWithTemplate(struct Window *win, const struct WindowTemplate *winConfig);
+void Text_InitWindow(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top);
+void Text_InitWindow8002E4C(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6);
+void Text_SetWindowText(struct Window *win, const u8 *text);
+void Text_InitWindow8002EB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top);
+u8 Text_PrintWindow8002F44(struct Window *win);
+u8 Text_PrintWindowSimple(struct Window *win);
+u8 Text_InitWindowAndPrintText(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top);
u8 sub_8003490(struct Window *win, u8 c, u16 tileDataStartOffset, u8 left, u8 top);
void sub_80034D4(u8 *tileData, const u8 *text);
u8 sub_80034EC(u8 *str);
u8 *sub_8003504(u8 *dest, s32 value, u8 alignAmount, u8 alignType);
u8 *sub_8003558(u8 *dest, const u8 *src, u8 alignAmount, u8 alignType);
-u8 sub_80035AC(struct Window *win);
-u8 sub_800374C(struct Window *win);
-u8 sub_8003778(struct Window *win);
-u8 sub_80037A0(struct Window *win);
-u32 sub_80037C8(struct Window *win, u8 lineLength);
-void ClearWindowTextLines(struct Window *win);
-u16 GetWindowTilemapEntry(struct Window *win, u8 x, u8 y);
-void DrawWindowRect(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom);
+u8 Text_UpdateWindow(struct Window *win);
+u8 Text_UpdateWindowInBattle(struct Window *win);
+u8 Text_UpdateWindowAutoscroll(struct Window *win);
+u8 Text_UpdateWindowInContest(struct Window *win);
+u32 Text_UpdateWindowOverrideLineLength(struct Window *win, u8 lineLength);
+void Text_ClearWindow(struct Window *win);
+u16 Text_GetWindowTilemapEntry(struct Window *win, u8 x, u8 y);
+void Text_FillWindowBorder(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom);
void DrawWindowRect_DefaultPalette(struct Window *win, u16 tileNum, u8 left, u8 top, u8 right, u8 bottom);
-void FillWindowRect(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom);
-void FillWindowRect_DefaultPalette(struct Window *win, u16 tileNum, u8 left, u8 top, u8 right, u8 bottom);
-void ZeroFillWindowRect(struct Window *win, u8 left, u8 top, u8 right, u8 bottom);
-void FillWindowRectWithBlankTile(struct Window *win, u8 left, u8 top, u8 right, u8 bottom);
+void Text_FillWindowRect(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom);
+void Text_FillWindowRectDefPalette(struct Window *win, u16 tileNum, u8 left, u8 top, u8 right, u8 bottom);
+void Text_EraseWindowRect(struct Window *win, u8 left, u8 top, u8 right, u8 bottom);
+void Text_BlankWindowRect(struct Window *win, u8 left, u8 top, u8 right, u8 bottom);
u8 GetExtCtrlCodeLength(u8 code);
u8 *AlignInt1(struct Window *win, u8 *dest, s32 value, u8 alignAmount, u8 alignType);
u8 *AlignInt2(struct Window *win, u8 *dest, s32 value, u8 alignAmount, u8 alignType);
u8 *AlignString(struct Window *win, u8 *dest, const u8 *src, u8 alignAmount, u8 alignType);
u8 GetStringWidth(struct Window *win, const u8 *s);
-u8 sub_8004D04(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6);
-u8 sub_8004D38(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top);
-u8 sub_8004DB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top, u16 a6);
-u8 sub_8004E24(struct Window *win);
-void sub_8004E28(struct Window *win, u8 *foreground, u8 *background, u8 *shadow);
-void sub_8004E3C(const struct WindowConfig *winConfig, u8 *tileData, const u8 *text);
-u8 GetStringWidthGivenWindowConfig(const struct WindowConfig *winConfig, const u8 *s);
+u8 Text_InitWindow8004D04(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6);
+u8 Text_InitWindow8004D38(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top);
+u8 Text_InitWindow8004DB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top, u16 a6);
+u8 Text_GetWindowPaletteNum(struct Window *win);
+void Text_GetTextColors(struct Window *win, u8 *foreground, u8 *background, u8 *shadow);
+void Text_InitWindow8004E3C(const struct WindowTemplate *winConfig, u8 *tileData, const u8 *text);
+u8 Text_GetStringWidthFromWindowTemplate(const struct WindowTemplate *winConfig, const u8 *s);
void ConvertInternationalString(u8 *s, u8 language);
-void StripExtCtrlCodes(u8 *str);
+void Text_StripExtCtrlCodes(u8 *str);
s32 StringCompareWithoutExtCtrlCodes(const u8 *str1, const u8 *str2);
u8 sub_8004FD0(struct Window *win, u8 *dest, const u8 *src, u16 tileDataStartOffset, u8 left, u16 top, u8 width, u32 a8);
+extern const u16 gUnknownPalette_81E6692[];
+
#endif // GUARD_TEXT_H
diff --git a/include/text_window.h b/include/text_window.h
index 7df1453ca..21e05ece0 100644
--- a/include/text_window.h
+++ b/include/text_window.h
@@ -9,17 +9,17 @@ struct FrameGraphics
const u16 *palette;
};
-u16 SetTextWindowBaseTileNum(u16 baseTileNum);
-void LoadTextWindowGraphics(struct Window *win);
-void LoadTextWindowGraphics_OverridePalSlot(struct Window *win, u8 palSlot);
-void LoadTextWindowGraphics_OverrideFrameType(struct Window *win, u8 frameType);
-void DrawTextWindow(struct Window *win, u8 left, u8 top, u8 right, u8 bottom);
-const struct FrameGraphics *GetTextWindowFrameGraphics(u8 frameType);
-u16 SetMessageBoxBaseTileNum(u16 baseTileNum);
+u16 TextWindow_SetBaseTileNum(u16 baseTileNum);
+void TextWindow_LoadStdFrameGraphics(struct Window *win);
+void TextWindow_LoadStdFrameGraphicsOverridePal(struct Window *win, u8 palSlot);
+void TextWindow_LoadStdFrameGraphicsOverrideStyle(struct Window *win, u8 frameType);
+void TextWindow_DrawStdFrame(struct Window *win, u8 left, u8 top, u8 right, u8 bottom);
+const struct FrameGraphics *TextWindow_GetFrameGraphics(u8 frameType);
+u16 TextWindow_SetDlgFrameBaseTileNum(u16 baseTileNum);
void unref_sub_80651DC(struct Window *, u8 *);
-void DisplayMessageBox(struct Window *);
-void DrawStandardMessageBox(struct Window *win);
-void LoadMessageBoxTiles(struct Window *win);
-void ClearStandardMessageBox(struct Window *win);
+void TextWindow_DisplayDialogueFrame(struct Window *);
+void TextWindow_DrawDialogueFrame(struct Window *win);
+void TextWindow_LoadDialogueFrameTiles(struct Window *win);
+void TextWindow_EraseDialogueFrame(struct Window *win);
#endif // GUARD_TEXT_WINDOW_H
diff --git a/include/trade.h b/include/trade.h
index 46f58a802..d6dee0bd9 100644
--- a/include/trade.h
+++ b/include/trade.h
@@ -51,6 +51,7 @@ extern const u32 gUnknown_0820CA98[];
extern const u16 gUnknown_0820F798[];
void sub_8047CD8(void);
+void sub_804B790(void);
void sub_804E174(void);
extern const u8 gOtherText_MaleSymbol3[2];
extern const u8 gOtherText_FemaleSymbol3[2];
diff --git a/include/trainer.h b/include/trainer.h
index 2e0beb342..e8f2776d2 100644
--- a/include/trainer.h
+++ b/include/trainer.h
@@ -17,83 +17,83 @@
#define TRAINER_ENCOUNTER_MUSIC_RICH 13 // Rich Boys and Gentlemen
enum {
- TRAINER_CLASS_AQUA_LEADER,
- TRAINER_CLASS_TEAM_AQUA_M,
- TRAINER_CLASS_TEAM_AQUA_F,
- TRAINER_CLASS_AROMA_LADY,
- TRAINER_CLASS_RUIN_MANIAC,
- TRAINER_CLASS_INTERVIEWER,
- TRAINER_CLASS_TUBER_F,
- TRAINER_CLASS_TUBER_M,
- TRAINER_CLASS_COOL_TRAINER_M,
- TRAINER_CLASS_COOL_TRAINER_F,
- TRAINER_CLASS_HEX_MANIAC,
- TRAINER_CLASS_LADY,
- TRAINER_CLASS_BEAUTY,
- TRAINER_CLASS_RICH_BOY,
- TRAINER_CLASS_POKEMANIAC,
- TRAINER_CLASS_SWIMMER_M,
- TRAINER_CLASS_BLACK_BELT,
- TRAINER_CLASS_GUITARIST,
- TRAINER_CLASS_KINDLER,
- TRAINER_CLASS_CAMPER,
- TRAINER_CLASS_BUG_MANIAC,
- TRAINER_CLASS_PSYCHIC_M,
- TRAINER_CLASS_PSYCHIC_F,
- TRAINER_CLASS_GENTLEMAN,
- TRAINER_CLASS_ELITE_FOUR_M,
- TRAINER_CLASS_ELITE_FOUR_F,
- TRAINER_CLASS_LEADER_F,
- TRAINER_CLASS_LEADER_M,
- TRAINER_CLASS_LEADER_MF,
- TRAINER_CLASS_SCHOOL_KID_M,
- TRAINER_CLASS_SCHOOL_KID_F,
- TRAINER_CLASS_SR_AND_JR,
- TRAINER_CLASS_POKEFAN_M,
- TRAINER_CLASS_POKEFAN_F,
- TRAINER_CLASS_EXPERT_M,
- TRAINER_CLASS_EXPERT_F,
- TRAINER_CLASS_YOUNGSTER,
- TRAINER_CLASS_CHAMPION,
- TRAINER_CLASS_FISHERMAN,
- TRAINER_CLASS_CYCLING_TRIATHLETE_M,
- TRAINER_CLASS_CYCLING_TRIATHLETE_F,
- TRAINER_CLASS_RUNNING_TRIATHLETE_M,
- TRAINER_CLASS_RUNNING_TRIATHLETE_F,
- TRAINER_CLASS_SWIMMING_TRIATHLETE_M,
- TRAINER_CLASS_SWIMMING_TRIATHLETE_F,
- TRAINER_CLASS_DRAGON_TAMER,
- TRAINER_CLASS_BIRD_KEEPER,
- TRAINER_CLASS_NINJA_BOY,
- TRAINER_CLASS_BATTLE_GIRL,
- TRAINER_CLASS_PARASOL_LADY,
- TRAINER_CLASS_SWIMMER_F,
- TRAINER_CLASS_PICNICKER,
- TRAINER_CLASS_TWINS,
- TRAINER_CLASS_SAILOR,
- TRAINER_CLASS_BOARDER_1,
- TRAINER_CLASS_BOARDER_2,
- TRAINER_CLASS_COLLECTOR,
- TRAINER_CLASS_WALLY,
- TRAINER_CLASS_BRENDAN_1,
- TRAINER_CLASS_BRENDAN_2,
- TRAINER_CLASS_BRENDAN_3,
- TRAINER_CLASS_MAY_1,
- TRAINER_CLASS_MAY_2,
- TRAINER_CLASS_MAY_3,
- TRAINER_CLASS_POKEMON_BREEDER_M,
- TRAINER_CLASS_POKEMON_BREEDER_F,
- TRAINER_CLASS_POKEMON_RANGER_M,
- TRAINER_CLASS_POKEMON_RANGER_F,
- TRAINER_CLASS_MAGMA_LEADER,
- TRAINER_CLASS_TEAM_MAGMA_M,
- TRAINER_CLASS_TEAM_MAGMA_F,
- TRAINER_CLASS_LASS,
- TRAINER_CLASS_BUG_CATCHER,
- TRAINER_CLASS_HIKER,
- TRAINER_CLASS_YOUNG_COUPLE,
- TRAINER_CLASS_OLD_COUPLE,
- TRAINER_CLASS_SIS_AND_BRO
+ FACILITY_CLASS_AQUA_LEADER,
+ FACILITY_CLASS_TEAM_AQUA_M,
+ FACILITY_CLASS_TEAM_AQUA_F,
+ FACILITY_CLASS_AROMA_LADY,
+ FACILITY_CLASS_RUIN_MANIAC,
+ FACILITY_CLASS_INTERVIEWER,
+ FACILITY_CLASS_TUBER_F,
+ FACILITY_CLASS_TUBER_M,
+ FACILITY_CLASS_COOL_TRAINER_M,
+ FACILITY_CLASS_COOL_TRAINER_F,
+ FACILITY_CLASS_HEX_MANIAC,
+ FACILITY_CLASS_LADY,
+ FACILITY_CLASS_BEAUTY,
+ FACILITY_CLASS_RICH_BOY,
+ FACILITY_CLASS_POKEMANIAC,
+ FACILITY_CLASS_SWIMMER_M,
+ FACILITY_CLASS_BLACK_BELT,
+ FACILITY_CLASS_GUITARIST,
+ FACILITY_CLASS_KINDLER,
+ FACILITY_CLASS_CAMPER,
+ FACILITY_CLASS_BUG_MANIAC,
+ FACILITY_CLASS_PSYCHIC_M,
+ FACILITY_CLASS_PSYCHIC_F,
+ FACILITY_CLASS_GENTLEMAN,
+ FACILITY_CLASS_ELITE_FOUR_M,
+ FACILITY_CLASS_ELITE_FOUR_F,
+ FACILITY_CLASS_LEADER_F,
+ FACILITY_CLASS_LEADER_M,
+ FACILITY_CLASS_LEADER_MF,
+ FACILITY_CLASS_SCHOOL_KID_M,
+ FACILITY_CLASS_SCHOOL_KID_F,
+ FACILITY_CLASS_SR_AND_JR,
+ FACILITY_CLASS_POKEFAN_M,
+ FACILITY_CLASS_POKEFAN_F,
+ FACILITY_CLASS_EXPERT_M,
+ FACILITY_CLASS_EXPERT_F,
+ FACILITY_CLASS_YOUNGSTER,
+ FACILITY_CLASS_CHAMPION,
+ FACILITY_CLASS_FISHERMAN,
+ FACILITY_CLASS_CYCLING_TRIATHLETE_M,
+ FACILITY_CLASS_CYCLING_TRIATHLETE_F,
+ FACILITY_CLASS_RUNNING_TRIATHLETE_M,
+ FACILITY_CLASS_RUNNING_TRIATHLETE_F,
+ FACILITY_CLASS_SWIMMING_TRIATHLETE_M,
+ FACILITY_CLASS_SWIMMING_TRIATHLETE_F,
+ FACILITY_CLASS_DRAGON_TAMER,
+ FACILITY_CLASS_BIRD_KEEPER,
+ FACILITY_CLASS_NINJA_BOY,
+ FACILITY_CLASS_BATTLE_GIRL,
+ FACILITY_CLASS_PARASOL_LADY,
+ FACILITY_CLASS_SWIMMER_F,
+ FACILITY_CLASS_PICNICKER,
+ FACILITY_CLASS_TWINS,
+ FACILITY_CLASS_SAILOR,
+ FACILITY_CLASS_BOARDER_1,
+ FACILITY_CLASS_BOARDER_2,
+ FACILITY_CLASS_COLLECTOR,
+ FACILITY_CLASS_WALLY,
+ FACILITY_CLASS_BRENDAN_1,
+ FACILITY_CLASS_BRENDAN_2,
+ FACILITY_CLASS_BRENDAN_3,
+ FACILITY_CLASS_MAY_1,
+ FACILITY_CLASS_MAY_2,
+ FACILITY_CLASS_MAY_3,
+ FACILITY_CLASS_POKEMON_BREEDER_M,
+ FACILITY_CLASS_POKEMON_BREEDER_F,
+ FACILITY_CLASS_POKEMON_RANGER_M,
+ FACILITY_CLASS_POKEMON_RANGER_F,
+ FACILITY_CLASS_MAGMA_LEADER,
+ FACILITY_CLASS_TEAM_MAGMA_M,
+ FACILITY_CLASS_TEAM_MAGMA_F,
+ FACILITY_CLASS_LASS,
+ FACILITY_CLASS_BUG_CATCHER,
+ FACILITY_CLASS_HIKER,
+ FACILITY_CLASS_YOUNG_COUPLE,
+ FACILITY_CLASS_OLD_COUPLE,
+ FACILITY_CLASS_SIS_AND_BRO
};
enum {
@@ -183,64 +183,64 @@ enum {
};
enum {
- TRAINER_CLASS_NAME_POKEMON_TRAINER_1,
- TRAINER_CLASS_NAME_POKEMON_TRAINER_2,
- TRAINER_CLASS_NAME_AQUA_LEADER,
- TRAINER_CLASS_NAME_TEAM_AQUA,
- TRAINER_CLASS_NAME_AQUA_ADMIN,
- TRAINER_CLASS_NAME_AROMA_LADY,
- TRAINER_CLASS_NAME_RUIN_MANIAC,
- TRAINER_CLASS_NAME_INTERVIEWER,
- TRAINER_CLASS_NAME_TUBER_F,
- TRAINER_CLASS_NAME_TUBER_M,
- TRAINER_CLASS_NAME_COOL_TRAINER,
- TRAINER_CLASS_NAME_HEX_MANIAC,
- TRAINER_CLASS_NAME_LADY,
- TRAINER_CLASS_NAME_BEAUTY,
- TRAINER_CLASS_NAME_RICH_BOY,
- TRAINER_CLASS_NAME_POKEMANIAC,
- TRAINER_CLASS_NAME_SWIMMER_M,
- TRAINER_CLASS_NAME_BLACK_BELT,
- TRAINER_CLASS_NAME_GUITARIST,
- TRAINER_CLASS_NAME_KINDLER,
- TRAINER_CLASS_NAME_CAMPER,
- TRAINER_CLASS_NAME_BUG_MANIAC,
- TRAINER_CLASS_NAME_PSYCHIC,
- TRAINER_CLASS_NAME_GENTLEMAN,
- TRAINER_CLASS_NAME_ELITE_FOUR,
- TRAINER_CLASS_NAME_LEADER,
- TRAINER_CLASS_NAME_SCHOOL_KID,
- TRAINER_CLASS_NAME_SR_AND_JR,
- TRAINER_CLASS_NAME_WINSTRATE,
- TRAINER_CLASS_NAME_POKEFAN,
- TRAINER_CLASS_NAME_EXPERT,
- TRAINER_CLASS_NAME_YOUNGSTER,
- TRAINER_CLASS_NAME_CHAMPION,
- TRAINER_CLASS_NAME_FISHERMAN,
- TRAINER_CLASS_NAME_TRIATHLETE,
- TRAINER_CLASS_NAME_DRAGON_TAMER,
- TRAINER_CLASS_NAME_BIRD_KEEPER,
- TRAINER_CLASS_NAME_NINJA_BOY,
- TRAINER_CLASS_NAME_BATTLE_GIRL,
- TRAINER_CLASS_NAME_PARASOL_LADY,
- TRAINER_CLASS_NAME_SWIMMER_F,
- TRAINER_CLASS_NAME_PICNICKER,
- TRAINER_CLASS_NAME_TWINS,
- TRAINER_CLASS_NAME_SAILOR,
- TRAINER_CLASS_NAME_BOARDER,
- TRAINER_CLASS_NAME_COLLECTOR,
- TRAINER_CLASS_NAME_POKEMON_TRAINER_3,
- TRAINER_CLASS_NAME_POKEMON_BREEDER,
- TRAINER_CLASS_NAME_POKEMON_RANGER,
- TRAINER_CLASS_NAME_MAGMA_LEADER,
- TRAINER_CLASS_NAME_TEAM_MAGMA,
- TRAINER_CLASS_NAME_MAGMA_ADMIN,
- TRAINER_CLASS_NAME_LASS,
- TRAINER_CLASS_NAME_BUG_CATCHER,
- TRAINER_CLASS_NAME_HIKER,
- TRAINER_CLASS_NAME_YOUNG_COUPLE,
- TRAINER_CLASS_NAME_OLD_COUPLE,
- TRAINER_CLASS_NAME_SIS_AND_BRO
+ TRAINER_CLASS_POKEMON_TRAINER_1,
+ TRAINER_CLASS_POKEMON_TRAINER_2,
+ TRAINER_CLASS_AQUA_LEADER,
+ TRAINER_CLASS_TEAM_AQUA,
+ TRAINER_CLASS_AQUA_ADMIN,
+ TRAINER_CLASS_AROMA_LADY,
+ TRAINER_CLASS_RUIN_MANIAC,
+ TRAINER_CLASS_INTERVIEWER,
+ TRAINER_CLASS_TUBER_F,
+ TRAINER_CLASS_TUBER_M,
+ TRAINER_CLASS_COOL_TRAINER,
+ TRAINER_CLASS_HEX_MANIAC,
+ TRAINER_CLASS_LADY,
+ TRAINER_CLASS_BEAUTY,
+ TRAINER_CLASS_RICH_BOY,
+ TRAINER_CLASS_POKEMANIAC,
+ TRAINER_CLASS_SWIMMER_M,
+ TRAINER_CLASS_BLACK_BELT,
+ TRAINER_CLASS_GUITARIST,
+ TRAINER_CLASS_KINDLER,
+ TRAINER_CLASS_CAMPER,
+ TRAINER_CLASS_BUG_MANIAC,
+ TRAINER_CLASS_PSYCHIC,
+ TRAINER_CLASS_GENTLEMAN,
+ TRAINER_CLASS_ELITE_FOUR,
+ TRAINER_CLASS_LEADER,
+ TRAINER_CLASS_SCHOOL_KID,
+ TRAINER_CLASS_SR_AND_JR,
+ TRAINER_CLASS_WINSTRATE,
+ TRAINER_CLASS_POKEFAN,
+ TRAINER_CLASS_EXPERT,
+ TRAINER_CLASS_YOUNGSTER,
+ TRAINER_CLASS_CHAMPION,
+ TRAINER_CLASS_FISHERMAN,
+ TRAINER_CLASS_TRIATHLETE,
+ TRAINER_CLASS_DRAGON_TAMER,
+ TRAINER_CLASS_BIRD_KEEPER,
+ TRAINER_CLASS_NINJA_BOY,
+ TRAINER_CLASS_BATTLE_GIRL,
+ TRAINER_CLASS_PARASOL_LADY,
+ TRAINER_CLASS_SWIMMER_F,
+ TRAINER_CLASS_PICNICKER,
+ TRAINER_CLASS_TWINS,
+ TRAINER_CLASS_SAILOR,
+ TRAINER_CLASS_BOARDER,
+ TRAINER_CLASS_COLLECTOR,
+ TRAINER_CLASS_POKEMON_TRAINER_3,
+ TRAINER_CLASS_POKEMON_BREEDER,
+ TRAINER_CLASS_POKEMON_RANGER,
+ TRAINER_CLASS_MAGMA_LEADER,
+ TRAINER_CLASS_TEAM_MAGMA,
+ TRAINER_CLASS_MAGMA_ADMIN,
+ TRAINER_CLASS_LASS,
+ TRAINER_CLASS_BUG_CATCHER,
+ TRAINER_CLASS_HIKER,
+ TRAINER_CLASS_YOUNG_COUPLE,
+ TRAINER_CLASS_OLD_COUPLE,
+ TRAINER_CLASS_SIS_AND_BRO
};
#endif // GUARD_TRAINER_H
diff --git a/include/trainer_card.h b/include/trainer_card.h
index b9d3ca081..28cabbd09 100644
--- a/include/trainer_card.h
+++ b/include/trainer_card.h
@@ -28,10 +28,12 @@ struct TrainerCard {
/*0x30*/ u8 playerName[8];
};
-void sub_8093110(void (*)(void));
-void sub_8093130(u8, void (*)(void));
-void sub_8093390(struct TrainerCard *);
+void TrainerCard_ShowPlayerCard(void (*)(void));
+void TrainerCard_ShowLinkCard(u8, void (*)(void));
+void TrainerCard_GenerateCardForPlayer(struct TrainerCard *);
u8 sub_80934C4(u8 id);
+void debug_sub_80A0710(void (*)(void));
+void debug_sub_80A073C(void (*)(void));
extern struct TrainerCard gTrainerCards[4];
diff --git a/include/tv.h b/include/tv.h
index 91b871f71..2edccb365 100644
--- a/include/tv.h
+++ b/include/tv.h
@@ -107,5 +107,6 @@ void UpdateTVShowsPerDay(u16);
void sub_80C045C();
void sub_80BF088(u8, s32);
void sub_80BFD20(void);
+void PutPokemonTodayCaughtOnAir(void);
#endif // GUARD_TV_H
diff --git a/include/unknown_task.h b/include/unknown_task.h
deleted file mode 100644
index 011e5f5b5..000000000
--- a/include/unknown_task.h
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef GUARD_UNKNOWN_TASK_H
-#define GUARD_UNKNOWN_TASK_H
-
-struct UnknownTaskStruct
-{
- volatile void *dest;
- u32 control;
- u8 unk8;
- u8 unk9;
-};
-
-struct UnknownTaskStruct2
-{
- void *src[2];
- volatile void *dest;
- u32 unkC;
- void (*unk10)(void);
- u8 srcBank;
- u8 unk15;
- u8 unk16;
- u8 unk17;
- u8 taskId;
- u8 filler19[0x7];
-};
-
-extern struct UnknownTaskStruct2 gUnknown_03004DC0;
-
-extern u16 gUnknown_03004DE0[][0x3C0];
-
-void remove_some_task(void);
-void remove_some_task(void);
-void dp12_8087EA4(void);
-void dp12_8087EA4(void);
-//void sub_80895F8(u32 i, u32 i1, u32 i2);
-//void sub_80895F8();
-void sub_80895F8(struct UnknownTaskStruct unk);
-void sub_8089668(void);
-void sub_8089668();
-//void sub_8089944(int i, int i1, int i2, int i3, int i4, int i5, int i6);
-u8 sub_8089944(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7);
-
-#endif // GUARD_UNKNOWN_TASK_H