summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/battle.h264
-rw-r--r--include/battle_anim.h42
-rw-r--r--include/battle_interface.h10
-rw-r--r--include/battle_message.h44
-rw-r--r--include/battle_script_commands.h8
-rw-r--r--include/battle_string_ids.h214
-rw-r--r--include/constants/battle.h6
-rw-r--r--include/constants/contest.h44
-rw-r--r--include/constants/item_effects.h92
-rw-r--r--include/constants/pokemon.h4
-rw-r--r--include/contest.h225
-rw-r--r--include/contest_internal.h154
-rw-r--r--include/contest_link.h14
-rw-r--r--include/contest_link_80C857C.h14
-rw-r--r--include/contest_link_util.h (renamed from include/contest_link_80C2020.h)12
-rw-r--r--include/contest_painting.h19
-rw-r--r--include/contest_painting_effects.h28
-rw-r--r--include/contest_util.h (renamed from include/script_pokemon_80C4.h)2
-rw-r--r--include/credits.h2
-rw-r--r--include/data2.h8
-rw-r--r--include/decompress.h6
-rw-r--r--include/dewford_trend.h2
-rw-r--r--include/easy_chat.h2
-rw-r--r--include/ewram.h385
-rw-r--r--include/field_effect.h2
-rw-r--r--include/global.h55
-rw-r--r--include/graphics.h8
-rw-r--r--include/image_processing_effects.h53
-rw-r--r--include/intro_credits_graphics.h2
-rw-r--r--include/item.h10
-rw-r--r--include/link.h2
-rw-r--r--include/menu.h4
-rw-r--r--include/party_menu.h67
-rw-r--r--include/pokedex.h10
-rw-r--r--include/pokedex_cry_screen.h14
-rw-r--r--include/pokemon.h18
-rw-r--r--include/pokemon_icon.h4
-rw-r--r--include/pokemon_summary_screen.h2
-rw-r--r--include/record_mixing.h10
-rw-r--r--include/region_map.h13
-rw-r--r--include/rom_8077ABC.h6
-rw-r--r--include/secret_base.h2
-rw-r--r--include/sprite.h4
-rw-r--r--include/text.h36
-rw-r--r--include/tv.h4
45 files changed, 1207 insertions, 720 deletions
diff --git a/include/battle.h b/include/battle.h
index afebbc781..59bfea1d2 100644
--- a/include/battle.h
+++ b/include/battle.h
@@ -4,6 +4,7 @@
#include "sprite.h"
#include "constants/battle.h"
#include "battle_setup.h"
+#include "main.h"
#define GET_BATTLER_POSITION(battler) (gBattlerPositions[battler])
#define GET_BATTLER_SIDE(battler) (GetBattlerPosition(battler) & BIT_SIDE)
@@ -232,14 +233,14 @@ struct BattleResults
{
u8 playerFaintCounter; // 0x0
u8 opponentFaintCounter; // 0x1
- u8 unk2; // 0x2
- u8 unk3; // 0x3
- u8 unk4; // 0x4
+ u8 totalMonSwitchCounter; // 0x2
+ u8 playerHealInBattleCount; // 0x3
+ u8 reviveCount; // 0x4
u8 playerMonWasDamaged:1; // 0x5
- u8 unk5_1:1; // 0x5
+ u8 usedMasterBall:1; // 0x5
u16 poke1Species; // 0x6
u8 pokeString1[10]; // 0x8
- u8 unk12;
+ u8 unk12; // unused
u8 battleTurnCounter; // 0x13
u8 pokeString2[10]; // 0x14
u8 filler1E[2];
@@ -281,211 +282,170 @@ struct AI_Stack
u8 size;
};
+struct LinkPartnerHeader
+{
+ u8 versionSignatureLo;
+ u8 versionSignatureHi;
+ u8 vsScreenHealthFlagsLo;
+ u8 vsScreenHealthFlagsHi;
+ struct BattleEnigmaBerry battleEnigmaBerry;
+};
+
+union MultiBuffers
+{
+ struct LinkPartnerHeader linkPartnerHeader;
+ struct MultiBattlePokemonTx multiBattleMons[3];
+};
+
+// Used internally
+struct LinkBattleCommunicationHeader
+{
+ u8 state;
+ u8 activeBattler;
+ u8 battlerAttacker;
+ u8 battlerTarget;
+ u16 size;
+ u8 absentBattlerFlags;
+ u8 effectBattler;
+ u8 data[0];
+};
+
+struct ChooseMoveStruct {
+ u16 moves[4];
+ u8 currentPp[4];
+ u8 maxPp[4];
+ u16 species;
+ u8 monType1;
+ u8 monType2;
+};
+
struct BattleStruct /* 0x2000000 */
{
- /*0x00000*/ u8 unk0;
- /*0x00001*/ bool8 unk1;
- /*0x00002*/ u8 unk2;
- /*0x00003*/ bool8 unk3;
- u8 filler4[0x15DDA];
- /*0x15DDE*/ u8 unk15DDE;
- /*0x15DDF*/ u8 unk15DDF;
- /*0x15DE0*/ u8 filler15DE0[0x220];
+ u8 filler00000[0x14000];
+ /*0x14000*/ u8 linkSend[0x1000];
+ /*0x15000*/ u8 linkRecv[0x1000];
/*0x16000*/ u8 turnEffectsTracker;
/*0x16001*/ u8 turnEffectsBattlerId;
/*0x16002*/ u8 animTurn;
/*0x16003*/ u8 scriptingActive;
- /*0x16004*/ u8 wrappedMove[8];
+ /*0x16004*/ u8 wrappedMove[MAX_BATTLERS_COUNT * 2];
/*0x1600C*/ u8 cmd49StateTracker;
- /*0x1600D*/ u8 unk1600D;
+ /*0x1600D*/ u8 unk1600D; // unused
/*0x1600E*/ u8 turnCountersTracker;
/*0x1600F*/ u8 getexpStateTracker;
- /*0x16010*/ u8 moveTarget[4];
- /*0x16014*/ u8 unk16014;
- /*0x16015*/ u8 unk16015;
- /*0x16016*/ u8 unk16016;
- /*0x16017*/ u8 unk16017;
+ /*0x16010*/ u8 moveTarget[MAX_BATTLERS_COUNT];
+ /*0x16014*/ u32 painSplitHP;
/*0x16018*/ u8 expGetterMonId;
- /*0x16019*/ u8 unk16019;
+ /*0x16019*/ u8 unk16019; // unused
/*0x1601A*/ u8 atk5A_StateTracker; //also atk5B, statetracker
/*0x1601B*/ u8 wildVictorySong;
/*0x1601C*/ u8 dynamicMoveType;
- /*0x1601D*/ u8 unk1601D;
+ /*0x1601D*/ u8 focusPunchBattler;
/*0x1601E*/ u8 statChanger;
/*0x1601F*/ u8 dmgMultiplier;
- /*0x16020*/ u8 wrappedBy[4];
- /*0x16024*/ u16 assistMove[24];
- /*0x16054*/ u8 unk16054;
- /*0x16055*/ u8 unk16055;
+ /*0x16020*/ u8 wrappedBy[MAX_BATTLERS_COUNT];
+ /*0x16024*/ u16 assistMove[PARTY_SIZE * MAX_MON_MOVES];
+ /*0x16054*/ u8 battlerPreventingSwitchout;
+ /*0x16055*/ u8 unk16055; // unused
/*0x16056*/ u8 moneyMultiplier;
- /*0x16057*/ u8 unk16057;
- /*0x16058*/ u8 unk16058;
- /*0x16059*/ u8 sub80173A4_Tracker;
- /*0x1605A*/ u8 unk1605A;
- /*0x1605B*/ u8 unk1605B;
+ /*0x16057*/ u8 savedTurnActionNumber;
+ /*0x16058*/ u8 switchInAbilitiesCounter;
+ /*0x16059*/ u8 faintedActionsState;
+ /*0x1605A*/ u8 faintedActionsBattlerId;
/*0x1605C*/ u16 exp;
/*0x1605E*/ u8 unk1605E;
/*0x1605F*/ u8 sentInPokes;
- /*0x16060*/ u8 unk16060[4];
- /*0x16064*/ u8 unk16064[4];
+ /*0x16060*/ u8 selectionScriptFinished[MAX_BATTLERS_COUNT];
+ /*0x16064*/ u8 unk16064[MAX_BATTLERS_COUNT];
/*0x16068*/ u8 monToSwitchIntoId[MAX_BATTLERS_COUNT];
- /*0x1606C*/ u8 unk1606C[4][3];
- /*0x16078*/ u8 unk16078;
- /*0x16079*/ u8 caughtNick[11];
- /*0x16084*/ u8 unk16084;
+ /*0x1606C*/ u8 unk1606C[MAX_BATTLERS_COUNT][3];
+ /*0x16078*/ u8 runTries;
+ /*0x16079*/ u8 caughtNick[POKEMON_NAME_LENGTH + 1];
+ /*0x16084*/ u8 battleStyle;
/*0x16085*/ u8 unk16085;
- /*0x16086*/ u8 unk16086;
- /*0x16087*/ u8 unk16087;
+ /*0x16086*/ u8 safariGoNearCounter;
+ /*0x16087*/ u8 safariPkblThrowCounter;
/*0x16088*/ u8 safariFleeRate;
- /*0x16089*/ u8 unk16089;
- /*0x1608A*/ u8 unk1608A;
- /*0x1608B*/ u8 unk1608B;
- /*0x1608C*/ u8 ChosenMoveID[4];
+ /*0x16089*/ u8 safariCatchFactor;
+ /*0x1608A*/ u8 linkBattleVsSpriteId_V;
+ /*0x1608B*/ u8 linkBattleVsSpriteId_S;
+ /*0x1608C*/ u8 ChosenMoveID[MAX_BATTLERS_COUNT];
/*0x16090*/ s32 bideDmg;
- /*0x16094*/ u8 unk16094;
- /*0x16095*/ u8 unk16095;
- /*0x16096*/ u8 unk16096;
- /*0x16097*/ u8 unk16097;
- /*0x16098*/ u8 unk16098;
- /*0x16099*/ u8 unk16099;
- /*0x1609A*/ u8 unk1609a;
+ /*0x16094*/ u8 stateIdAfterSelScript[4];
+ /*0x16098*/ u8 unk16098[3]; // unused
/*0x1609B*/ u8 castformToChangeInto;
/*0x1609C*/ u8 atk6C_statetracker;
/*0x1609D*/ u8 unk1609D;
- /*0x1609E*/ u8 unk1609E;
- /*0x1609F*/ u8 unk1609F;
+ /*0x1609E*/ u8 dbgAICycleMoveTracker[2]; // debug
/*0x160A0*/ u8 stringMoveType;
/*0x160A1*/ u8 animTargetsHit;
/*0x160A2*/ u8 expGetterBattlerId;
/*0x160A3*/ u8 unk160A3;
/*0x160A4*/ u8 animArg1;
/*0x160A5*/ u8 animArg2;
- /*0x160A6*/ u8 unk160A6;
+ /*0x160A6*/ u8 unk160A6; // related to gAbsentBattlerFlags, possibly absent flags turn ago?
/*0x160A7*/ u8 unk160A7;
/*0x160A8*/ u8 unk160A8;
/*0x160A9*/ u8 unk160A9;
- /*0x160AA*/ u8 unk160Aa;
- /*0x160AB*/ u8 unk160Ab;
- /*0x160AC*/ u8 unk160AC;
- /*0x160AD*/ u8 unk160AD;
- /*0x160AE*/ u8 unk160AE;
- /*0x160AF*/ u8 unk160AF;
- /*0x160B0*/ u8 unk160B0;
- /*0x160B1*/ u8 unk160B1;
- /*0x160B2*/ u8 unk160B2;
- /*0x160B3*/ u8 unk160B3;
- /*0x160B4*/ u8 unk160B4;
- /*0x160B5*/ u8 unk160B5;
- /*0x160B6*/ u8 unk160B6;
- /*0x160B7*/ u8 unk160B7;
- /*0x160B8*/ u8 unk160B8;
- /*0x160B9*/ u8 unk160B9;
- /*0x160BA*/ u8 unk160Ba;
- /*0x160BB*/ u8 unk160Bb;
+ /*0x160AA*/ u8 unk160AA;
+ /*0x160AB*/ u8 unk160AB;
+ /*0x160AC*/ u16 lastTakenMove[2 * 2 * 2];
/*0x160BC*/ u16 HP_OnSwitchout[2];
- /*0x160C0*/ u8 unk160C0;
+ /*0x160C0*/ u8 abilityPreventingSwitchout;
/*0x160C1*/ u8 hpScale;
- /*0x160C2*/ u8 unk160C2;
- /*0x160C3*/ u8 unk160C3;
- /*0x160C4*/ u8 unk160C4;
- /*0x160C5*/ u8 unk160C5;
- /*0x160C6*/ u8 unk160C6;
- /*0x160C7*/ u8 unk160C7;
+ /*0x160C2*/ u16 unk160C2;
+ /*0x160C4*/ MainCallback unk160C4;
+
+ // Buffers used by the AI are indexed using (battler / 2)
+ // i.e. the flank bit, because at no point in game is the
+ // player's partner in a multi battle controlled by the AI.
+ // This is changed in Emerald to support the Tabitha fight
+ // in the Space Center.
/*0x160C8*/ u8 AI_monToSwitchIntoId[2];
/*0x160CA*/ u8 synchroniseEffect;
- /*0x160CB*/ u8 linkPlayerIndex;
- /*0x160CC*/ u16 usedHeldItems[4];
- /*0x160D4*/ u8 unk160D4;
- /*0x160D5*/ u8 unk160D5;
- /*0x160D6*/ u8 unk160D6;
- /*0x160D7*/ u8 unk160D7;
- /*0x160D8*/ u8 unk160D8[2];
- /*0x160DA*/ u8 unk160DA[2];
- /*0x160DC*/ u8 unk160DC;
+ /*0x160CB*/ u8 multiplayerId;
+ /*0x160CC*/ u16 usedHeldItems[MAX_BATTLERS_COUNT];
+ // Space is reserved for two u16s, one for each opponent in
+ // doubles. However, only the lower byte of each is ever used.
+ /*0x160D4*/ u16 AI_usedItemId[2];
+ /*0x160D8*/ u8 AI_usedItemType[2];
+ /*0x160DA*/ u8 AI_usedItemEffect[2];
+ /*0x160DC*/ u8 statAnimPlayed;
/*0x160DD*/ u8 intimidateBank;
/*0x160DE*/ u8 unk160DE;
/*0x160DF*/ u8 unk160DF;
- /*0x160E0*/ u8 unk160E0;
- /*0x160E1*/ u8 unk160E1;
- /*0x160E2*/ u8 unk160E2;
- /*0x160E3*/ u8 unk160E3;
- /*0x160E4*/ u8 unk160E4;
- /*0x160E5*/ u8 unk160E5;
+ /*0x160E0*/ u8 unk160E0[6];
/*0x160E6*/ u8 unk160E6;
/*0x160E7*/ u8 atkCancellerTracker;
- /*0x160E8*/ u8 unk160E8;
- /*0x160E9*/ u8 unk160E9;
- /*0x160EA*/ u8 unk160EA;
- /*0x160EB*/ u8 unk160EB;
- /*0x160EC*/ u8 unk160EC;
- /*0x160ED*/ u8 unk160ED;
- /*0x160EE*/ u8 unk160EE;
- /*0x160EF*/ u8 unk160EF;
- /*0x160F0*/ u8 unk160F0;
- /*0x160F1*/ u8 unk160F1;
- /*0x160F2*/ u8 unk160F2;
- /*0x160F3*/ u8 unk160F3;
- /*0x160F4*/ u8 unk160F4;
- /*0x160F5*/ u8 unk160F5;
- /*0x160F6*/ u8 unk160F6;
- /*0x160F7*/ u8 unk160F7;
+ /*0x160E8*/ u16 choicedMove[MAX_BATTLERS_COUNT];
+ /*0x160F0*/ u16 changedItems[MAX_BATTLERS_COUNT];
/*0x160F8*/ u8 unk160F8;
/*0x160F9*/ u8 unk160F9;
- /*0x160FA*/ u8 unk160FA;
+ /*0x160FA*/ u8 levelUpHP;
/*0x160FB*/ u8 unk160FB;
/*0x160FC*/ u8 turnSideTracker;
/*0x160FD*/ u8 unk160FD;
/*0x160FE*/ u8 unk160FE;
/*0x160FF*/ u8 unk160FF;
- /*0x16100*/ u8 unk16100;
- /*0x16101*/ u8 unk16101;
- /*0x16102*/ u8 unk16102;
- /*0x16103*/ u8 unk16103;
- /*0x16104*/ u8 unk16104;
- /*0x16105*/ u8 unk16105;
- /*0x16106*/ u8 unk16106;
- /*0x16107*/ u8 unk16107;
- /*0x16108*/ u8 unk16108;
- /*0x16109*/ u8 unk16109;
- /*0x1610A*/ u8 unk1610A;
- /*0x1610B*/ u8 unk1610B;
- /*0x1610C*/ u8 unk1610C;
- /*0x1610D*/ u8 unk1610D;
- /*0x1610E*/ u8 unk1610E;
- /*0x1610F*/ u8 unk1610F;
+ /*0x16100*/ u16 lastTakenMoveFrom[2 * 4];
/*0x16110*/ u8 wishPerishSongState;
/*0x16111*/ u8 wishPerishSongBattlerId;
- /*0x16112*/ u8 unk16112;
- /*0x16113*/ u8 unk16113;
- /*0x16114*/ u8 unk16114;
- /*0x16115*/ u8 unk16115;
- /*0x16116*/ u8 unk16116;
- /*0x16117*/ u8 unk16117;
- /*0x16118*/ u8 unk16118;
- /*0x16119*/ u8 unk16119;
- /*0x1611A*/ u8 unk1611A;
- /*0x1611B*/ u8 unk1611B;
- /*0x1611C*/ u8 unk1611C;
- /*0x1611D*/ u8 unk1611D;
- /*0x1611E*/ u8 unk1611E;
- /*0x1611F*/ u8 unk1611F;
-
- //u8 filler2[0x72E];
- /* 0x16A00 */ struct BattleHistory unk_2016A00_2;
+ /*0x16112*/ u8 multihitMoveEffect;
+ /*0x16113*/ u8 givenExpMons;
};
-struct Struct2017100
+struct ResourceFlags
{
u32 arr[4];
};
-struct Struct2017800
+struct BattleSpriteInfo
{
u8 invisible:1;
- u8 unk0_1:1;
+ u8 lowHpSong:1;
u8 substituteSprite:1;
- u8 unk0_3:1;
- u8 unk0_4:1;
+ u8 flag_x8:1;
+ u8 hpNumbersNoBars:1;
u16 transformedSpecies;
};
@@ -529,8 +489,6 @@ struct Struct20238C8
u8 unk0_7:1;
};
-#define gBattleResources_statsBeforeLvlUp ((struct StatsArray *)(gSharedMem + 0x17180))
-
#define GET_MOVE_TYPE(move, typeArg) \
{ \
if (gBattleStruct->dynamicMoveType) \
@@ -659,7 +617,7 @@ void sub_800D6D4();
void ApplyPlayerChosenFrameToBattleMenu();
void DrawMainBattleBackground(void);
void LoadBattleTextboxAndBackground();
-void sub_800DE30(u8);
+void InitLinkBattleVsScreen(u8);
void DrawBattleEntryBackground();
// src/battle_2.o
@@ -667,7 +625,7 @@ void CB2_InitBattle(void);
void CB2_InitBattleInternal(void);
void CB2_HandleStartBattle(void);
void sub_800F104(void);
-void sub_800F298(void);
+void CB2_HandleStartMultiBattle(void);
void BattleMainCB2(void);
void sub_800F838(struct Sprite *);
u8 CreateNPCTrainerParty(struct Pokemon *, u16);
@@ -688,7 +646,7 @@ void objc_dp11b_pingpong(struct Sprite *);
void nullsub_41(void);
void sub_8010800(void);
void BattleMainCB1(void);
-void sub_8010874(void);
+void BattleStartClearSetData(void);
void bc_8012FAC(void);
void sub_8011384(void);
void bc_801333C(void);
diff --git a/include/battle_anim.h b/include/battle_anim.h
index 71a61f175..133dde62f 100644
--- a/include/battle_anim.h
+++ b/include/battle_anim.h
@@ -5,6 +5,16 @@
#include "sprite.h"
+// battle_anim_status_effects.c
+#define STAT_ANIM_PLUS1 15
+#define STAT_ANIM_PLUS2 39
+#define STAT_ANIM_MINUS1 22
+#define STAT_ANIM_MINUS2 46
+#define STAT_ANIM_MULTIPLE_PLUS1 55
+#define STAT_ANIM_MULTIPLE_PLUS2 56
+#define STAT_ANIM_MULTIPLE_MINUS1 57
+#define STAT_ANIM_MULTIPLE_MINUS2 58
+
#define REG_BGnCNT_BITFIELD(n) (*(vBgCnt *)REG_ADDR_BG##n##CNT)
#define REG_BG0CNT_BITFIELD REG_BGnCNT_BITFIELD(0)
#define REG_BG1CNT_BITFIELD REG_BGnCNT_BITFIELD(1)
@@ -31,31 +41,15 @@ enum
BATTLER_COORD_ATTR_RAW_BOTTOM,
};
-struct UnknownStruct1
-{
- u8 unk0;
-};
-
-struct UnknownStruct2
-{
- void *unk0;
- u16 *unk4;
- u8 unk8;
-};
-
-struct UnknownStruct3
-{
- u8 unk0;
- u8 filler1[0xB];
-};
-
-struct EWRAM_19348_Struct
+struct ContestMoveAnim
{
- /*0x00*/ u16 species2;
- /*0x02*/ u16 species;
- /*0x04*/ u8 filler4[0x8];
- /*0x0C*/ u32 otId;
- /*0x10*/ u32 personality;
+ u16 species;
+ u16 targetSpecies;
+ bool8 hasTargetAnim:1;
+ u8 contestant;
+ u32 personality;
+ u32 otId;
+ u32 targetPersonality;
};
extern void (*gAnimScriptCallback)(void);
diff --git a/include/battle_interface.h b/include/battle_interface.h
index a3e00fd12..11d7cbf19 100644
--- a/include/battle_interface.h
+++ b/include/battle_interface.h
@@ -1,6 +1,8 @@
#ifndef GUARD_BATTLE_INTERFACE_H
#define GUARD_BATTLE_INTERFACE_H
+#include "battle_controllers.h" // for struct HpAndStatus
+
struct BattleInterfaceStruct1
{
s32 unk0;
@@ -10,12 +12,6 @@ struct BattleInterfaceStruct1
u32 unk10;
};
-struct BattleInterfaceStruct2
-{
- u16 unk0;
- u32 unk4;
-};
-
u8 battle_make_oam_normal_battle(u8);
u8 battle_make_oam_safari_battle(void);
void sub_8043D84(u8, u8, u32, u32, u32);
@@ -25,7 +21,7 @@ void nullsub_11();
void UpdateOamPriorityInAllHealthboxes(u8);
void sub_8043F44(u8);
void sub_804454C(void);
-u8 sub_8044804(u8, const struct BattleInterfaceStruct2 *, u8, u8);
+u8 sub_8044804(u8, const struct HpAndStatus *, u8, u8);
void sub_8044CA0(u8);
void sub_8045A5C(u8, struct Pokemon *, u8);
s32 sub_8045C78(u8, u8, u8, u8);
diff --git a/include/battle_message.h b/include/battle_message.h
index 97a42bbf8..b4e46cfe7 100644
--- a/include/battle_message.h
+++ b/include/battle_message.h
@@ -18,6 +18,50 @@ struct StringInfoBattle
u8 textBuffs[3][0x10];
};
+#define B_TXT_BUFF1 0x0
+#define B_TXT_BUFF2 0x1
+#define B_TXT_PLAYER_MON1_NAME 0x2
+#define B_TXT_OPPONENT_MON1_NAME 0x3
+#define B_TXT_PLAYER_MON2_NAME 0x4
+#define B_TXT_OPPONENT_MON2_NAME 0x5
+#define B_TXT_LINK_PLAYER_MON1_NAME 0x6
+#define B_TXT_LINK_OPPONENT_MON1_NAME 0x7
+#define B_TXT_LINK_PLAYER_MON2_NAME 0x8
+#define B_TXT_LINK_OPPONENT_MON2_NAME 0x9
+#define B_TXT_ATK_NAME_WITH_PREFIX_MON1 0xA
+#define B_TXT_ATK_PARTNER_NAME 0xB
+#define B_TXT_ATK_NAME_WITH_PREFIX 0xC
+#define B_TXT_DEF_NAME_WITH_PREFIX 0xD
+#define B_TXT_EFF_NAME_WITH_PREFIX 0xE // EFF = short for gEffectBank
+#define B_TXT_ACTIVE_NAME_WITH_PREFIX 0xF
+#define B_TXT_SCR_ACTIVE_NAME_WITH_PREFIX 0x10
+#define B_TXT_CURRENT_MOVE 0x11
+#define B_TXT_LAST_MOVE 0x12
+#define B_TXT_LAST_ITEM 0x13
+#define B_TXT_LAST_ABILITY 0x14
+#define B_TXT_ATK_ABILITY 0x15
+#define B_TXT_DEF_ABILITY 0x16
+#define B_TXT_SCR_ACTIVE_ABILITY 0x17
+#define B_TXT_EFF_ABILITY 0x18
+#define B_TXT_TRAINER1_CLASS 0x19
+#define B_TXT_TRAINER1_NAME 0x1A
+#define B_TXT_LINK_PLAYER_NAME 0x1B
+#define B_TXT_LINK_PARTNER_NAME 0x1C
+#define B_TXT_LINK_OPPONENT1_NAME 0x1D
+#define B_TXT_LINK_OPPONENT2_NAME 0x1E
+#define B_TXT_LINK_SCR_TRAINER_NAME 0x1F
+#define B_TXT_PLAYER_NAME 0x20
+#define B_TXT_TRAINER1_LOSE_TEXT 0x21
+#define B_TXT_22 0x22
+#define B_TXT_PC_CREATOR_NAME 0x23
+#define B_TXT_ATK_PREFIX1 0x24
+#define B_TXT_DEF_PREFIX1 0x25
+#define B_TXT_ATK_PREFIX2 0x26
+#define B_TXT_DEF_PREFIX2 0x27
+#define B_TXT_ATK_PREFIX3 0x28
+#define B_TXT_DEF_PREFIX3 0x29
+#define B_TXT_BUFF3 0x2A
+
// for B_TXT_BUFF1, B_TXT_BUFF2 and B_TXT_BUFF3
#define B_BUFF_STRING 0
diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h
index 36f54c6a8..4cfa4d71b 100644
--- a/include/battle_script_commands.h
+++ b/include/battle_script_commands.h
@@ -16,10 +16,10 @@
#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 STAT_CHANGE_NEGATIVE (1 << 0)
+#define STAT_CHANGE_BY_TWO (1 << 1)
+#define STAT_CHANGE_MULTIPLE_STATS (1 << 2)
+#define STAT_CHANGE_CANT_PREVENT (1 << 3)
#define ATK4F_DONT_CHECK_STATUSES 0x80
diff --git a/include/battle_string_ids.h b/include/battle_string_ids.h
index f242284b0..ec43dbb90 100644
--- a/include/battle_string_ids.h
+++ b/include/battle_string_ids.h
@@ -384,4 +384,218 @@
#define STRINGID_TRAINER1WINTEXT 379
#define STRINGID_TRAINER2WINTEXT 380
+
+// The below IDs are all indexes into battle message tables,
+// used to determine which of a set of messages to print.
+// They are assigned to the MULTISTRING_CHOOSER byte of gBattleCommunication
+// and read when e.g. the command printfromtable is used.
+
+// gStatUpStringIds
+#define B_MSG_ATTACKER_STAT_ROSE 0
+#define B_MSG_DEFENDER_STAT_ROSE 1
+#define B_MSG_STAT_WONT_INCREASE 2
+#define B_MSG_STAT_ROSE_EMPTY 3
+#define B_MSG_STAT_ROSE_ITEM 4
+#define B_MSG_USED_DIRE_HIT 5
+
+// gStatDownStringIds
+#define B_MSG_ATTACKER_STAT_FELL 0
+#define B_MSG_DEFENDER_STAT_FELL 1
+#define B_MSG_STAT_WONT_DECREASE 2
+#define B_MSG_STAT_FELL_EMPTY 3
+
+// gMissStringIds
+#define B_MSG_MISSED 0
+#define B_MSG_PROTECTED 1
+#define B_MSG_AVOIDED_ATK 2
+#define B_MSG_AVOIDED_DMG 3
+#define B_MSG_GROUND_MISS 4
+
+// gAbsorbDrainStringIds
+#define B_MSG_ABSORB 0
+#define B_MSG_ABSORB_OOZE 1
+
+// gLeechSeedStringIds
+#define B_MSG_LEECH_SEED_SET 0
+#define B_MSG_LEECH_SEED_MISS 1
+#define B_MSG_LEECH_SEED_FAIL 2
+#define B_MSG_LEECH_SEED_DRAIN 3
+#define B_MSG_LEECH_SEED_OOZE 4
+
+// gFirstTurnOfTwoStringIds
+#define B_MSG_TURN1_RAZOR_WIND 0
+#define B_MSG_TURN1_SOLAR_BEAM 1
+#define B_MSG_TURN1_SKULL_BASH 2
+#define B_MSG_TURN1_SKY_ATTACK 3
+#define B_MSG_TURN1_FLY 4
+#define B_MSG_TURN1_DIG 5
+#define B_MSG_TURN1_DIVE 6
+#define B_MSG_TURN1_BOUNCE 7
+
+// gMoveWeatherChangeStringIds
+#define B_MSG_STARTED_RAIN 0
+#define B_MSG_STARTED_DOWNPOUR 1
+#define B_MSG_WEATHER_FAILED 2
+#define B_MSG_STARTED_SANDSTORM 3
+#define B_MSG_STARTED_SUNLIGHT 4
+#define B_MSG_STARTED_HAIL 5
+
+// gRainContinuesStringIds
+#define B_MSG_RAIN_CONTINUES 0
+#define B_MSG_DOWNPOUR_CONTINUES 1
+#define B_MSG_RAIN_STOPPED 2
+
+// gSandStormHailContinuesStringIds / gSandStormHailDmgStringIds/ gSandStormHailEndStringIds
+#define B_MSG_SANDSTORM 0
+#define B_MSG_HAIL 1
+
+// gReflectLightScreenSafeguardStringIds
+#define B_MSG_SIDE_STATUS_FAILED 0
+#define B_MSG_SET_REFLECT_SINGLE 1
+#define B_MSG_SET_REFLECT_DOUBLE 2
+#define B_MSG_SET_LIGHTSCREEN_SINGLE 3
+#define B_MSG_SET_LIGHTSCREEN_DOUBLE 4
+#define B_MSG_SET_SAFEGUARD 5
+
+// gProtectLikeUsedStringIds
+#define B_MSG_PROTECTED_ITSELF 0
+#define B_MSG_BRACED_ITSELF 1
+#define B_MSG_PROTECT_FAILED 2
+
+// gRestUsedStringIds
+#define B_MSG_REST 0
+#define B_MSG_REST_STATUSED 1
+
+// gWokeUpStringIds
+#define B_MSG_WOKE_UP 0
+#define B_MSG_WOKE_UP_UPROAR 1
+
+// gUproarAwakeStringIds
+#define B_MSG_CANT_SLEEP_UPROAR 0
+#define B_MSG_UPROAR_KEPT_AWAKE 1
+#define B_MSG_STAYED_AWAKE_USING 2
+
+// gUproarOverTurnStringIds
+#define B_MSG_UPROAR_CONTINUES 0
+#define B_MSG_UPROAR_ENDS 1
+
+// gStockpileUsedStringIds
+#define B_MSG_STOCKPILED 0
+#define B_MSG_CANT_STOCKPILE 1
+
+// gSwallowFailStringIds
+#define B_MSG_SWALLOW_FAILED 0
+#define B_MSG_SWALLOW_FULL_HP 1
+
+// gKOFailedStringIds
+#define B_MSG_KO_MISS 0
+#define B_MSG_KO_UNAFFECTED 1
+
+// gMistUsedStringIds
+#define B_MSG_SET_MIST 0
+#define B_MSG_MIST_FAILED 1
+
+// gFocusEnergyUsedStringIds
+#define B_MSG_GETTING_PUMPED 0
+#define B_MSG_FOCUS_ENERGY_FAILED 1
+
+// gTransformUsedStringIds
+#define B_MSG_TRANSFORMED 0
+#define B_MSG_TRANSFORM_FAILED 1
+
+// gSubstituteUsedStringIds
+#define B_MSG_SET_SUBSTITUTE 0
+#define B_MSG_SUBSTITUTE_FAILED 1
+
+// gPartyStatusHealStringIds
+#define B_MSG_BELL 0
+#define B_MSG_BELL_SOUNDPROOF_ATTACKER 1
+#define B_MSG_BELL_SOUNDPROOF_PARTNER 2
+#define B_MSG_BELL_BOTH_SOUNDPROOF 3
+#define B_MSG_SOOTHING_AROMA 4
+
+// gFutureMoveUsedStringIds
+#define B_MSG_FUTURE_SIGHT 0
+#define B_MSG_DOOM_DESIRE 1
+
+// gItemSwapStringIds
+#define B_MSG_ITEM_SWAP_TAKEN 0
+#define B_MSG_ITEM_SWAP_GIVEN 1
+#define B_MSG_ITEM_SWAP_BOTH 2
+
+// gSportsUsedStringIds
+#define B_MSG_WEAKEN_ELECTRIC 0
+#define B_MSG_WEAKEN_FIRE 1
+
+// gCaughtMonStringIds
+#define B_MSG_SENT_SOMEONES_PC 0
+#define B_MSG_SENT_LANETTES_PC 1
+#define B_MSG_SOMEONES_BOX_FULL 2
+#define B_MSG_LANETTES_BOX_FULL 3
+
+// gInobedientStringIds
+#define B_MSG_LOAFING 0
+#define B_MSG_WONT_OBEY 1
+#define B_MSG_TURNED_AWAY 2
+#define B_MSG_PRETEND_NOT_NOTICE 3
+#define B_MSG_INCAPABLE_OF_POWER 4
+// For randomly selecting a disobey string
+// Skips the one used for Battle Palace
+#define NUM_LOAF_STRINGS 4
+
+// gSafariGetNearStringIds
+#define B_MSG_CREPT_CLOSER 0
+#define B_MSG_CANT_GET_CLOSER 1
+
+// gSafariPokeblockResultStringIds
+#define B_MSG_MON_CURIOUS 0
+#define B_MSG_MON_ENTHRALLED 1
+#define B_MSG_MON_IGNORED 2
+
+// gFlashFireStringIds
+#define B_MSG_FLASH_FIRE_BOOST 0
+#define B_MSG_FLASH_FIRE_NO_BOOST 1
+
+// gBerryEffectStringIds
+#define B_MSG_CURED_PROBLEM 0
+#define B_MSG_NORMALIZED_STATUS 1
+
+// gNoEscapeStringIds
+#define B_MSG_CANT_ESCAPE 0
+#define B_MSG_DONT_LEAVE_BIRCH 1
+#define B_MSG_PREVENTS_ESCAPE 2
+#define B_MSG_CANT_ESCAPE_2 3
+#define B_MSG_ATTACKER_CANT_ESCAPE 4
+
+// gGotPoisonedStringIds / gGotParalyzedStringIds / gFellAsleepStringIds
+// gGotBurnedStringIds / gGotFrozenStringIds / gAttractUsedStringIds
+#define B_MSG_STATUSED 0
+#define B_MSG_STATUSED_BY_ABILITY 1
+
+// gBRNPreventionStringIds / gPRLZPreventionStringIds / gPSNPreventionStringIds
+#define B_MSG_ABILITY_PREVENTS_MOVE_STATUS 0
+#define B_MSG_ABILITY_PREVENTS_ABILITY_STATUS 1
+#define B_MSG_STATUS_HAD_NO_EFFECT 2
+
+// gGotDefrostedStringIds
+#define B_MSG_DEFROSTED 0
+#define B_MSG_DEFROSTED_BY_MOVE 1
+
+// gBattlePalaceFlavorTextTable
+#define B_MSG_GLINT_IN_EYE 0
+#define B_MSG_GETTING_IN_POS 1
+#define B_MSG_GROWL_DEEPLY 2
+#define B_MSG_EAGER_FOR_MORE 3
+
+// gRefereeStringsTable
+#define B_MSG_REF_NOTHING_IS_DECIDED 0
+#define B_MSG_REF_THATS_IT 1
+#define B_MSG_REF_JUDGE_MIND 2
+#define B_MSG_REF_JUDGE_SKILL 3
+#define B_MSG_REF_JUDGE_BODY 4
+#define B_MSG_REF_PLAYER_WON 5
+#define B_MSG_REF_OPPONENT_WON 6
+#define B_MSG_REF_DRAW 7
+#define B_MSG_REF_COMMENCE_BATTLE 8
+
#endif // GUARD_BATTLE_STRING_IDS_H
diff --git a/include/constants/battle.h b/include/constants/battle.h
index 5aa1772d1..658f9ad6f 100644
--- a/include/constants/battle.h
+++ b/include/constants/battle.h
@@ -81,6 +81,7 @@
// These persist remain outside of battle and after switching out
#define STATUS1_NONE 0x0
#define STATUS1_SLEEP 0x7
+#define STATUS1_SLEEP_TURN(num) ((num) << 0)
#define STATUS1_POISON 0x8
#define STATUS1_BURN 0x10
#define STATUS1_FREEZE 0x20
@@ -93,12 +94,16 @@
// Volatile status ailments
// These are removed after exiting the battle or switching out
#define STATUS2_CONFUSION 0x00000007
+#define STATUS2_CONFUSION_TURN(num) ((num) << 0)
#define STATUS2_FLINCHED 0x00000008
#define STATUS2_UPROAR 0x00000070
+#define STATUS2_UPROAR_TURN(num) ((num) << 4)
#define STATUS2_BIDE 0x00000300 // two bits 0x100, 0x200
#define STATUS2_LOCK_CONFUSE 0x00000C00
+#define STATUS2_LOCK_CONFUSE_TURN(num) ((num) << 10)
#define STATUS2_MULTIPLETURNS 0x00001000
#define STATUS2_WRAPPED 0x0000E000
+#define STATUS2_WRAPPED_TURN(num) ((num) << 13)
#define STATUS2_INFATUATION 0x000F0000 // 4 bits, one for every battler
#define STATUS2_INFATUATED_WITH(battler) (gBitTable[battler] << 16)
#define STATUS2_FOCUS_ENERGY 0x00100000
@@ -205,6 +210,7 @@
#define MOVE_EFFECT_BURN 0x3
#define MOVE_EFFECT_FREEZE 0x4
#define MOVE_EFFECT_PARALYSIS 0x5
+#define PRIMARY_STATUS_MOVE_EFFECT MOVE_EFFECT_TOXIC // All above move effects apply primary status
#define MOVE_EFFECT_TOXIC 0x6
#define MOVE_EFFECT_CONFUSION 0x7
#define MOVE_EFFECT_FLINCH 0x8
diff --git a/include/constants/contest.h b/include/constants/contest.h
new file mode 100644
index 000000000..e960809cc
--- /dev/null
+++ b/include/constants/contest.h
@@ -0,0 +1,44 @@
+#ifndef POKERUBY_CONSTANTS_CONTEST_H
+#define POKERUBY_CONSTANTS_CONTEST_H
+
+
+#define CONTEST_AI_CHECK_BAD_MOVE (1 << 0)
+#define CONTEST_AI_CHECK_COMBO (1 << 1)
+#define CONTEST_AI_CHECK_BORING (1 << 2)
+#define CONTEST_AI_CHECK_EXCITEMENT (1 << 3)
+#define CONTEST_AI_CHECK_ORDER (1 << 4)
+#define CONTEST_AI_CHECK_GOOD_MOVE (1 << 5)
+#define CONTEST_AI_ERRATIC (1 << 6)
+#define CONTEST_AI_DUMMY_1 (1 << 7)
+#define CONTEST_AI_DUMMY_2 (1 << 8)
+#define CONTEST_AI_DUMMY_3 (1 << 9)
+#define CONTEST_AI_DUMMY_4 (1 << 10)
+#define CONTEST_AI_DUMMY_5 (1 << 11)
+#define CONTEST_AI_DUMMY_6 (1 << 12)
+#define CONTEST_AI_DUMMY_7 (1 << 13)
+#define CONTEST_AI_DUMMY_8 (1 << 14)
+#define CONTEST_AI_DUMMY_9 (1 << 15)
+#define CONTEST_AI_DUMMY_10 (1 << 16)
+#define CONTEST_AI_DUMMY_11 (1 << 17)
+#define CONTEST_AI_DUMMY_12 (1 << 18)
+#define CONTEST_AI_DUMMY_13 (1 << 19)
+#define CONTEST_AI_DUMMY_14 (1 << 20)
+#define CONTEST_AI_DUMMY_15 (1 << 21)
+#define CONTEST_AI_DUMMY_16 (1 << 22)
+#define CONTEST_AI_DUMMY_17 (1 << 23)
+#define CONTEST_AI_DUMMY_18 (1 << 24)
+#define CONTEST_AI_DUMMY_19 (1 << 25)
+#define CONTEST_AI_DUMMY_20 (1 << 26)
+#define CONTEST_AI_DUMMY_21 (1 << 27)
+#define CONTEST_AI_DUMMY_22 (1 << 28)
+#define CONTEST_AI_DUMMY_23 (1 << 29)
+#define CONTEST_AI_DUMMY_24 (1 << 30)
+#define CONTEST_AI_DUMMY_25 (1 << 31)
+
+// The below scripts are used by every AI contest opponent
+// It includes every non-dummy script
+#define CONTEST_AI_COMMON (CONTEST_AI_CHECK_BAD_MOVE | CONTEST_AI_CHECK_COMBO | CONTEST_AI_CHECK_BORING | \
+ CONTEST_AI_CHECK_EXCITEMENT | CONTEST_AI_CHECK_ORDER | CONTEST_AI_CHECK_GOOD_MOVE | CONTEST_AI_ERRATIC | \
+ CONTEST_AI_DUMMY_1 | CONTEST_AI_DUMMY_2 | CONTEST_AI_DUMMY_3 | CONTEST_AI_DUMMY_4 | CONTEST_AI_DUMMY_5)
+
+#endif //POKERUBY_CONSTANTS_CONTEST_H
diff --git a/include/constants/item_effects.h b/include/constants/item_effects.h
new file mode 100644
index 000000000..5086b28e6
--- /dev/null
+++ b/include/constants/item_effects.h
@@ -0,0 +1,92 @@
+#ifndef POKERUBY_CONSTANTS_ITEM_EFFECTS_H
+#define POKERUBY_CONSTANTS_ITEM_EFFECTS_H
+
+// field 0 masks
+#define ITEM0_X_ATTACK 0x0F
+#define ITEM0_DIRE_HIT 0x30 // Works the same way as the move Focus Energy.
+#define ITEM0_SACRED_ASH 0x40
+#define ITEM0_INFATUATION 0x80
+
+// field 1 masks
+#define ITEM1_X_SPEED 0x0F
+#define ITEM1_X_DEFEND 0xF0
+
+// field 2 masks
+#define ITEM2_X_SPATK 0x0F
+#define ITEM2_X_ACCURACY 0xF0
+
+// field 3 masks
+#define ITEM3_CONFUSION 0x1
+#define ITEM3_PARALYSIS 0x2
+#define ITEM3_FREEZE 0x4
+#define ITEM3_BURN 0x8
+#define ITEM3_POISON 0x10
+#define ITEM3_SLEEP 0x20
+#define ITEM3_LEVEL_UP 0x40
+#define ITEM3_GUARD_SPEC 0x80 // Works the same way as the move Mist.
+
+#define ITEM3_STATUS_ALL (ITEM3_CONFUSION | ITEM3_PARALYSIS | ITEM3_FREEZE | ITEM3_BURN | ITEM3_POISON | ITEM3_SLEEP)
+
+// field 4 masks
+#define ITEM4_EV_HP 0x1
+#define ITEM4_EV_ATK 0x2
+#define ITEM4_HEAL_HP 0x4
+#define ITEM4_HEAL_PP 0x8
+#define ITEM4_HEAL_PP_ONE 0x10
+#define ITEM4_PP_UP 0x20
+#define ITEM4_REVIVE 0x40
+#define ITEM4_EVO_STONE 0x80
+
+// field 5 masks
+#define ITEM5_EV_DEF 0x1
+#define ITEM5_EV_SPEED 0x2
+#define ITEM5_EV_SPDEF 0x4
+#define ITEM5_EV_SPATK 0x8
+#define ITEM5_PP_MAX 0x10
+#define ITEM5_FRIENDSHIP_LOW 0x20
+#define ITEM5_FRIENDSHIP_MID 0x40
+#define ITEM5_FRIENDSHIP_HIGH 0x80
+
+#define ITEM5_FRIENDSHIP_ALL (ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID | ITEM5_FRIENDSHIP_HIGH)
+
+// fields 6 and onwards are item-specific arguments
+#define ITEM_EFFECT_ARG_START 6
+
+// Special HP recovery amounts for ITEM4_HEAL_HP
+#define ITEM6_HEAL_HP_FULL ((u8) -1)
+#define ITEM6_HEAL_HP_HALF ((u8) -2)
+#define ITEM6_HEAL_HP_LVL_UP ((u8) -3)
+
+// Special PP recovery amounts for ITEM4_HEAL_PP
+#define ITEM6_HEAL_PP_FULL 0x7F
+
+// Amount of EV modified by ITEM4_EV_HP, ITEM4_EV_ATK, ITEM5_EV_DEF, ITEM5_EV_SPEED, ITEM5_EV_SPDEF and ITEM5_EV_SPATK
+#define ITEM6_ADD_EV 10
+#define ITEM6_SUBTRACT_EV -10
+
+// Used for GetItemEffectType.
+#define ITEM_EFFECT_X_ITEM 0
+#define ITEM_EFFECT_RAISE_LEVEL 1
+#define ITEM_EFFECT_HEAL_HP 2
+#define ITEM_EFFECT_CURE_POISON 3
+#define ITEM_EFFECT_CURE_SLEEP 4
+#define ITEM_EFFECT_CURE_BURN 5
+#define ITEM_EFFECT_CURE_FREEZE 6
+#define ITEM_EFFECT_CURE_PARALYSIS 7
+#define ITEM_EFFECT_CURE_CONFUSION 8
+#define ITEM_EFFECT_CURE_INFATUATION 9
+#define ITEM_EFFECT_SACRED_ASH 10
+#define ITEM_EFFECT_CURE_ALL_STATUS 11
+#define ITEM_EFFECT_ATK_EV 12
+#define ITEM_EFFECT_HP_EV 13
+#define ITEM_EFFECT_SPATK_EV 14
+#define ITEM_EFFECT_SPDEF_EV 15
+#define ITEM_EFFECT_SPEED_EV 16
+#define ITEM_EFFECT_DEF_EV 17
+#define ITEM_EFFECT_EVO_STONE 18
+#define ITEM_EFFECT_PP_UP 19
+#define ITEM_EFFECT_PP_MAX 20
+#define ITEM_EFFECT_HEAL_PP 21
+#define ITEM_EFFECT_NONE 22
+
+#endif // POKERUBY_CONSTANTS_ITEM_EFFECTS_H
diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h
index f5a9f4a6e..d1cec4461 100644
--- a/include/constants/pokemon.h
+++ b/include/constants/pokemon.h
@@ -141,6 +141,10 @@
#define NUM_STATS 6
#define UNOWN_FORM_COUNT 28
+#define MIN_STAT_STAGE 0
+#define DEFAULT_STAT_STAGE 6
+#define MAX_STAT_STAGE 12
+
#define PLAYER_HAS_TWO_USABLE_MONS 0
#define PLAYER_HAS_ONE_MON 1
#define PLAYER_HAS_ONE_USABLE_MON 2
diff --git a/include/contest.h b/include/contest.h
index bf2613fe3..87e75007a 100644
--- a/include/contest.h
+++ b/include/contest.h
@@ -13,6 +13,38 @@ enum
enum
{
+ CONTEST_WINNER_ARTIST,
+ CONTEST_WINNER_NORMAL,
+ CONTEST_WINNER_SUPER,
+ CONTEST_WINNER_HYPER_1,
+ CONTEST_WINNER_HYPER_2,
+ CONTEST_WINNER_HYPER_3,
+ CONTEST_WINNER_MASTER_1,
+ CONTEST_WINNER_MASTER_2,
+ CONTEST_WINNER_MASTER_3,
+ NUM_CONTEST_HALL_WINNERS = CONTEST_WINNER_MASTER_3,
+ MUSEUM_CONTEST_WINNERS_START = CONTEST_WINNER_MASTER_3,
+ CONTEST_WINNER_MUSEUM_COOL,
+ CONTEST_WINNER_MUSEUM_BEAUTY,
+ CONTEST_WINNER_MUSEUM_CUTE,
+ CONTEST_WINNER_MUSEUM_SMART,
+ CONTEST_WINNER_MUSEUM_TOUGH,
+};
+
+enum
+{
+ CONTEST_RANK_NORMAL,
+ CONTEST_RANK_SUPER,
+ CONTEST_RANK_HYPER,
+ CONTEST_RANK_MASTER,
+ CONTEST_RANK_LINK
+};
+
+#define CONTEST_SAVE_FOR_MUSEUM ((u8)-1)
+#define CONTEST_SAVE_FOR_ARTIST ((u8)-2)
+
+enum
+{
CONTEST_EFFECT_HIGHLY_APPEALING,
CONTEST_EFFECT_USER_MORE_EASILY_STARTLED,
CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES,
@@ -263,130 +295,127 @@ void CB2_StartContest(void);
void Contest_CreatePlayerMon(u8);
void Contest_InitAllPokemon(u8, u8);
u8 CanMonParticipateInContest(struct Pokemon *party);
-u16 InitContestMonConditionI(u8, u8);
-void InitContestMonConditions(u8);
+u16 CalculateContestantRound1Points(u8, u8);
+void CalculateRound1Points(u8);
u8 IsSpeciesNotUnown(u16);
-void sub_80AF668(void);
-void sub_80B0F28(u8);
+void CalculateFinalScores(void);
+void SortContestants(u8);
bool8 Contest_SaveWinner(u8);
-u8 sub_80B2C4C(u8, u8);
+u8 GetContestWinnerSaveIdx(u8, u8);
void Contest_ResetWinners(void);
s8 Contest_GetMoveExcitement(u16);
// Contest Shared EWRAM
-struct Shared18000
+struct ContestTempSave
{
- /*0x18000*/ u8 unk18000;
- /*0x18001*/ u8 filler18001[3];
- /*0x18004*/ u16 unk18004[16][16];
- /*0x18204*/ u16 unk18204[0x200];
- /*0x18604*/ u16 unk18604[0x200];
- /*0x18A04*/ u8 unk18A04[0x800];
+ /*0x18004*/ u16 cachedWindowPalettes[16][16];
+ /*0x18204*/ u16 cachedPlttBufferUnfaded[0x200];
+ /*0x18604*/ u16 cachedPlttBufferFaded[0x200];
+ /*0x18A04*/ u8 savedJunk[0x800];
};
struct Contest
{
/*0x19204*/ u8 playerMoveChoice;
- /*0x19205*/ u8 turnNumber;
+ /*0x19205*/ u8 appealNumber;
/*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;
+ /*0x1920A*/ bool16 unk1920A_0:1; // Task active flags?
+ bool16 unk1920A_1:1;
+ bool16 unk1920A_2:1;
+ bool16 unk1920A_3:1;
+ bool16 waitForJudgeSpeechBubble:1;
+ bool16 isShowingApplauseMeter:1;
+ bool16 applauseMeterIsMoving:1;
+ bool16 animatingAudience:1;
+ /*0x1920B*/ bool16 waitForAudienceBlend:1;
+ bool16 sliderHeartsAnimating:1;
+ bool16 waitForLink:1;
/*0x1920C*/ u8 mainTaskId;
/*0x1920D*/ u8 unk1920D[4];
- /*0x19211*/ u8 unk19211;
- /*0x19212*/ u8 unk19212;
+ /*0x19211*/ u8 judgeAttentionTaskId;
+ /*0x19212*/ u8 blendTaskId;
/*0x19213*/ u8 filler19213;
- /*0x19214*/ u8 unk19214;
- /*0x19215*/ u8 unk19215;
- /*0x19216*/ u8 unk19216; // sprite ID
+ /*0x19214*/ u8 turnNumber;
+ /*0x19215*/ u8 currentContestant;
+ /*0x19216*/ u8 judgeSpeechBubbleSpriteId;
/*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
+ /*0x19218*/ u8 prevTurnOrder[4];
+ /*0x1921C*/ u32 unusedRng; // saved RNG value?
+ u16 moveHistory[5][4]; // move history?
+ u8 excitementHistory[5][4]; // excitement history
u8 applauseMeterSpriteId; // sprite ID
- /*0x1925D*/ u8 unk1925D;
- /*0x1925E*/ u8 unk1925E;
+ /*0x1925D*/ u8 contestSetupState;
+ /*0x1925E*/ u8 moveAnimTurnCount;
};
struct ContestantStatus
{
- /*0x00*/ s16 appeal1; // move appeal?
- /*0x02*/ s16 appeal2; // final appeal after end of turn, maybe?
- /*0x04*/ s16 unk4;
+ /*0x00*/ s16 baseAppeal;
+ /*0x02*/ s16 appeal;
+ /*0x04*/ s16 pointTotal;
/*0x06*/ u16 currMove;
/*0x08*/ u16 prevMove;
/*0x0A*/ u8 moveCategory;
- /*0x0B*/ u8 unkB_0:2;
- u8 unkB_2:2;
+ /*0x0B*/ u8 ranking:2;
+ u8 unkB_2:2; // unused
u8 moveRepeatCount:3;
- u8 noMoreTurns:1; // used a one-time move?
- /*0x0C*/ u8 nervous:1;
+ bool8 noMoreTurns:1; // used a one-time move?
+ /*0x0C*/ bool8 nervous:1;
u8 numTurnsSkipped:2;
/*0x0D*/ s8 condition;
/*0x0E*/ u8 jam;
/*0x0F*/ u8 jamReduction;
// Flags set by move effect
- /*0x10*/ u8 resistant:1;
- u8 immune:1;
- u8 moreEasilyStartled:1;
- u8 usedRepeatableMove:1;
+ /*0x10*/ bool8 resistant:1;
+ bool8 immune:1;
+ bool8 moreEasilyStartled:1;
+ bool8 usedRepeatableMove:1;
u8 conditionMod:2; // 1: just raised condition; 2: appeal greatly improved by condition
u8 turnOrderMod:2; // 1: defined; 2: random
/*0x11*/ u8 turnOrderModAction:2; // 1: made first; 2: made last; 3: made random
- u8 turnSkipped:1;
- u8 exploded:1;
- u8 overrideCategoryExcitementMod:1;
- u8 appealTripleCondition:1;
+ bool8 turnSkipped:1;
+ bool8 exploded:1;
+ bool8 overrideCategoryExcitementMod:1;
+ bool8 appealTripleCondition:1;
/*0x12*/ u8 jamSafetyCount;
/*0x13*/ u8 effectStringId; // status action?
/*0x14*/ u8 effectStringId2;
- /*0x15*/ u8 disappointedRepeat:1;
- u8 unk15_1:1;
- u8 unk15_2:1;
- u8 unk15_3:1;
- u8 hasJudgesAttention:1;
- u8 judgesAttentionWasRemoved:1;
- u8 unk15_6:1;
- /*0x16*/ u8 unk16;
- /*0x17*/ u8 unk17;
- /*0x18*/ u8 unk18;
+ /*0x15*/ bool8 repeatedMove:1;
+ bool8 unk15_1:1; // unused
+ bool8 repeatedPrevMove:1;
+ bool8 completedComboFlag:1;
+ bool8 hasJudgesAttention:1;
+ bool8 judgesAttentionWasRemoved:1;
+ bool8 usedComboMove:1;
+ /*0x16*/ u8 completedCombo;
+ /*0x17*/ u8 comboAppealBonus;
+ /*0x18*/ u8 repeatJam;
/*0x19*/ u8 nextTurnOrder; // turn position
/*0x1A*/ u8 attentionLevel; // How much the Pokemon "stood out"
- /*0x1B*/ u8 unk1B;
+ /*0x1B*/ u8 contestantAnimTarget;
};
-// possibly the same as UnknownContestStruct3?
-struct UnknownContestStruct4
+struct ContestGfxState
{
- u8 unk0; // sprite ID
- u8 unk1; // sprite ID
- u8 unk2_0:1;
- u8 unk2_1:1;
- u8 unk2_2:1;
+ u8 sliderHeartSpriteId;
+ u8 nextTurnSpriteId;
+ bool8 sliderUpdating:1;
+ bool8 boxBlinking:1;
+ bool8 updatingAppealHearts:1;
};
-struct UnknownContestStruct5
+struct ContestExcitement
{
- s8 bits_0; // current move excitement?
- u8 excitementFrozen:1;
+ s8 moveExcitement;
+ bool8 excitementFrozen:1;
u8 excitementFreezer:3;
- s8 unk2;
+ s8 excitementAppealBonus;
};
-struct UnknownContestStruct7
+struct ContestAppealMoveResults
{
u8 turnOrder[4];
s16 jam;
@@ -396,49 +425,25 @@ struct UnknownContestStruct7
u8 contestant;
};
-struct UnknownContestStruct8
-{
- u16 unk0;
- u16 unk2;
- u8 unk4_0:1;
- u8 unk5;
- u32 unk8;
- u32 unkC;
- u32 unk10;
-};
-
-struct UnknownContestStruct6
+struct ContestFinalStandings
{
- s32 unk0;
- s32 unk4;
- s32 unk8;
- s32 unkC;
+ s32 totalPoints;
+ s32 round1Points;
+ s32 random;
+ s32 contestant;
};
-// 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 gContestMonConditions[4];
-extern s16 gUnknown_02038678[4];
-extern s16 gUnknown_02038680[4];
-extern s16 gUnknown_02038688[4];
+extern u8 gContestantTurnOrder[4];
+extern s16 gContestMonRound1Points[4];
+extern s16 gContestMonTotalPoints[4];
+extern s16 gContestMonAppealPointTotals[4];
+extern s16 gContestMonRound2Points[4];
extern u8 gContestFinalStandings[4];
-extern u8 gUnknown_02038696[4];
-extern u8 gUnknown_0203869B;
+extern u8 gContestantTurnOrder[4];
+extern u8 gContestLinkLeaderIndex;
extern u16 gSpecialVar_ContestRank;
extern u16 gSpecialVar_ContestCategory;
extern u8 gContestMonPartyIndex;
@@ -447,7 +452,7 @@ void SetContestantEffectStringID(u8 a, u8 b);
void SetContestantEffectStringID2(u8 a, u8 b);
void MakeContestantNervous(u8 p);
bool8 Contest_IsMonsTurnDisabled(u8 a);
-bool8 sub_80B214C(u8 a);
+bool8 IsContestantAllowedToCombo(u8 contestant);
void SetStartledString(u8 a, u8 b);
#endif // GUARD_CONTEST_H
diff --git a/include/contest_internal.h b/include/contest_internal.h
new file mode 100644
index 000000000..1c9e875ea
--- /dev/null
+++ b/include/contest_internal.h
@@ -0,0 +1,154 @@
+#ifndef GUARD_CONTEST_INTERNAL_H
+#define GUARD_CONTEST_INTERNAL_H
+
+void InitContestResources(void);
+void Task_StartContestWaitFade(u8 taskId);
+void Task_TryStartLinkContest(u8 taskId);
+void Task_CommunicateMonIdxs(u8 taskId);
+void Task_EndCommunicateMonIdxs(u8 taskId);
+void Task_ReadyStartLinkContest(u8 taskId);
+u8 SetupContestGraphics(u8 *a);
+void Task_WaitToRaiseCurtainAtStart(u8 taskId);
+void Task_RaiseCurtainAtStart(u8 taskId);
+void ContestMainCallback2(void);
+void ContestVBlankCallback(void);
+void Task_DisplayAppealNumberText(u8 taskId);
+void sub_80ABC3C(u8);
+void Task_TryShowMoveSelectScreen(u8 taskId);
+void Task_ShowMoveSelectScreen(u8 taskId);
+void Task_HandleMoveSelectInput(u8 taskId);
+void DrawMoveSelectArrow(s8 a);
+void EraseMoveSelectArrow(s8 a); // nullsub
+void Task_SelectedMove(u8 taskId);
+void Task_EndCommunicateMoveSelections(u8 taskId);
+void Task_HideMoveSelectScreen(u8 taskId);
+void Task_HideApplauseMeterForAppealStart(u8 taskId);
+void Task_WaitHideApplauseMeterForAppealStart(u8 taskId);
+void Task_AppealSetup(u8 taskId);
+void Task_DoAppeals(u8 taskId);
+void Task_EndWaitForLink(u8 taskId);
+void SpriteCB_MonSlideIn(struct Sprite *sprite);
+void SpriteCB_MonSlideOut(struct Sprite *sprite);
+void Task_FinishRoundOfAppeals(u8 taskId);
+void Task_ReadyUpdateHeartSliders(u8 taskId);
+void Task_UpdateHeartSliders(u8 taskId);
+void Task_WaitForHeartSliders(u8 taskId);
+void sub_80ADB04(u8 taskId);
+void Task_WaitBeforePrintRoundResult(u8 taskId);
+void Task_PrintRoundResultText(u8 taskId);
+void Task_WaitPrintRoundResultText(u8 taskId);
+void Task_ReUpdateHeartSliders(u8 taskId);
+void Task_WaitForHeartSlidersAgain(u8 taskId);
+void Task_DropCurtainAtRoundEnd(u8 taskId);
+void Task_TryStartNextRoundOfAppeals(u8 taskId);
+void Task_StartNewRoundOfAppeals(u8 taskId);
+void Task_EndAppeals(u8 taskId);
+void Task_WaitForOutOfTimeMsg(u8 taskId);
+void Task_DropCurtainAtAppealsEnd(u8 taskId);
+void Task_TryCommunicateFinalStandings(u8 taskId);
+void Task_CommunicateFinalStandings(u8 taskId);
+void Task_EndCommunicateFinalStandings(u8 taskId);
+void Task_ContestReturnToField(u8 taskId);
+void FieldCB_ContestReturnToField(void);
+void InsertStringDigit(u8 *, s32);
+bool8 IsPlayerLinkLeader(void);
+void __copy_tilemap(void *);
+void PrintContestantTrainerName(u8 contestant);
+void PrintContestantTrainerNameWithColor(u8 contestant, u8 color);
+void PrintContestantMonName(u8 contestant);
+void PrintContestantMonNameWithColor(u8 contestant, u8 color);
+u8 CreateJudgeSprite(void);
+u8 CreateJudgeSpeechBubbleSprite(void);
+u8 CreateContestantSprite(u16, u32, u32);
+void SwapMoveDescAndContestTilemaps(void);
+void PrintContestMoveDescription(u16);
+void Contest_ClearMoveDescriptionBox(void);
+bool8 UpdateConditionStars(u8, u8);
+bool8 DrawStatusSymbol(u8);
+void DrawStatusSymbols(void);
+void ContestClearGeneralTextWindow(void);
+u16 GetChosenMove(u8);
+void GetAllChosenMoves(void);
+void sub_80AF2A0(u8);
+void RankContestants(void);
+void SetAttentionLevels(void);
+s16 GetContestantRound2Points(u8 a);
+void DetermineFinalStandings(void);
+bool8 DidContestantPlaceHigher(s32 a, s32 b, struct ContestFinalStandings *c);
+void ContestPrintLinkStandby(void);
+void Task_unused_80AF94C(u8 taskId);
+void FillContestantWindowBgs(void);
+u16 GetAppealHeartTileOffset(u8 a);
+s8 GetNumHeartsFromAppealPoints(s16 a);
+u8 UpdateAppealHearts(s16 startAppeal, s16 appealDelta, u8 contestant);
+void Task_UpdateAppealHearts(u8 taskId);
+void CreateSliderHeartSprites(void);
+void UpdateHeartSliders(void);
+bool8 SlidersDoneUpdating(void);
+void sub_80AFF60(struct Sprite *);
+void SetBottomSliderHeartsInvisibility(bool8);
+void CreateNextTurnSprites(void);
+void CreateApplauseMeterSprite(void);
+void nullsub_18(s8);
+void sub_80B0238(struct Sprite *);
+void sub_80B0280(struct Sprite *);
+void sub_80B02A8(struct Sprite *);
+void sub_80B02F4(struct Sprite *);
+void CreateJudgeAttentionEyeTask(void);
+void sub_80B03A8(u8);
+void sub_80B03D8(u8);
+void sub_80B0458(u8);
+void CreateUnusedBlendTask(void);
+void InitUnusedBlendTaskData(u8 contestant);
+void UpdateBlendTaskContestantData(u8 contestant);
+void nullsub_19(int);
+void Task_UnusedBlend(u8 taskId);
+void Task_UnusedBrokenBlend(u8 taskId);
+void StartStopFlashJudgeAttentionEye(u8);
+u8 CreateContestantBoxBlinkSprites(u8);
+void BlinkContestantBox(u8, bool8);
+void SpriteCB_BlinkContestantBox(struct Sprite *);
+void SpriteCB_EndBlinkContestantBox(struct Sprite *);
+void Unused_EndBlinkingState(u8 a, int unused);
+void ContestDebugTogglePointTotal(void);
+void ContestDebugDoPrint(void);
+void DrawContestantWindows(void);
+void CalculateAppealMoveImpact(u8 contestant);
+void PrintAppealMoveResultText(u8, u8);
+void ApplyNextTurnOrder(void);
+void DoJudgeSpeechBubble(u8);
+void UpdateApplauseMeter(void);
+u8 StartApplauseOverflowAnimation(void);
+void Task_ApplauseOverflowAnimation(u8);
+void SlideApplauseMeterIn(void);
+void Task_SlideApplauseMeterIn(u8);
+void SlideApplauseMeterOut(void);
+void Task_SlideApplauseMeterOut(u8);
+void ShowAndUpdateApplauseMeter(s8);
+void Task_ShowAndUpdateApplauseMeter(u8);
+void AnimateAudience(void);
+void Task_AnimateAudience(u8);
+void BlendAudienceBackground(s8 excitementDir, s8 blendDir);
+void Task_BlendAudienceBackground(u8 taskId);
+void ShowHideNextTurnGfx(bool8 a);
+const u8 *GetTurnOrderNumberGfx(u8);
+void DrawUnnervedSymbols(void);
+void SetBgForCurtainDrop(void);
+void UpdateContestantBoxOrder(void);
+void Task_StartDropCurtainAtRoundEnd(u8 taskId);
+void Task_UpdateCurtainDropAtRoundEnd(u8 taskId);
+void Task_ResetForNextRound(u8 taskId);
+void Task_WaitRaiseCurtainAtRoundEnd(u8 taskId);
+void Task_StartRaiseCurtainAtRoundEnd(u8 taskId);
+void AnimateSliderHearts(u8 animId);
+void Task_WaitForSliderHeartAnim(u8 taskId);
+u16 SanitizeMove(u16 move);
+u16 SanitizeSpecies(u16 species);
+void SetMoveSpecificAnimData(u8 contestant);
+void ClearMoveAnimData(u8 contestant);
+void SetMoveAnimAttackerData(u8 contestant);
+void CreateInvisibleBattleTargetSprite(void);
+void SetBattleTargetSpritePosition(void);
+void SelectContestMoveBankTarget(u16);
+
+#endif //GUARD_CONTEST_INTERNAL_H
diff --git a/include/contest_link.h b/include/contest_link.h
new file mode 100644
index 000000000..3bd5fa2bb
--- /dev/null
+++ b/include/contest_link.h
@@ -0,0 +1,14 @@
+#ifndef GUARD_CONTEST_LINK_H
+#define GUARD_CONTEST_LINK_H
+
+void sub_80C8734(u8 taskId);
+void Task_LinkContest_CommunicateRng(u8 taskId);
+void Task_LinkContest_CommunicateMonIdxs(u8 taskId);
+void Task_LinkContest_CommunicateLeaderIds(u8 taskId);
+void Task_LinkContest_CommunicateRound1Points(u8 taskId);
+void Task_LinkContest_CommunicateTurnOrder(u8 taskId);
+u8 GetStringLanguage(const u8 *string);
+void Task_LinkContest_Init(u8 taskId);
+void Task_LinkContest_CommunicateCategory(u8 taskId);
+
+#endif // GUARD_CONTEST_LINK_H
diff --git a/include/contest_link_80C857C.h b/include/contest_link_80C857C.h
deleted file mode 100644
index 15f41fe7f..000000000
--- a/include/contest_link_80C857C.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef GUARD_CONTEST_LINK_80C857C_H
-#define GUARD_CONTEST_LINK_80C857C_H
-
-void sub_80C8734(u8);
-void sub_80C88AC(u8);
-void sub_80C89DC(u8);
-void sub_80C8E1C(u8);
-void sub_80C8EBC(u8);
-void sub_80C8F34(u8);
-u8 GetStringLanguage(const u8 *string);
-void sub_80C8604(u8 taskId);
-void sub_80C8938(u8 taskId);
-
-#endif // GUARD_CONTEST_LINK_80C857C_H
diff --git a/include/contest_link_80C2020.h b/include/contest_link_util.h
index 5b1390ce1..8c527f971 100644
--- a/include/contest_link_80C2020.h
+++ b/include/contest_link_util.h
@@ -1,15 +1,15 @@
-#ifndef GUARD_CONTEST_LINK_80C2020_H
-#define GUARD_CONTEST_LINK_80C2020_H
+#ifndef GUARD_CONTEST_LINK_UTIL_H
+#define GUARD_CONTEST_LINK_UTIL_H
void sub_80C2358(void);
void Contest_GetTrainerNameI_StringVar1(void);
void Contest_GetNicknameI_StringVar1(void);
void sub_80C48C8(void);
-void sub_80C48F4(void);
+void Contest_GetSpeciesNameI_StringVar1(void);
void sub_80C4940(void);
-void sub_80C4980(u8);
-u8 sub_80C4B34(u8 *);
+void ContestLinkTransfer(u8 category);
+u8 LinkContest_GetLeaderIndex(u8 *a0);
void Contest_CopyAndConvertTrainerName_Intl(u8 *, const u8 *);
void Contest_CopyAndConvertNicknameI_Intl(u8 *, u8);
-#endif // GUARD_CONTEST_LINK_80C2020_H
+#endif // GUARD_CONTEST_LINK_UTIL_H
diff --git a/include/contest_painting.h b/include/contest_painting.h
index 81535ec8b..fda6e963a 100644
--- a/include/contest_painting.h
+++ b/include/contest_painting.h
@@ -32,21 +32,10 @@ enum
CONTESTRESULT_TOUGH = 6,
};
-struct Unk2015E00
+struct ContestPaintingBuffers
{
- u16 unk2015e00[128][32];
- u16 unk2017e00[0];
-};
-
-struct ContestEntry
-{
- /*0x00*/ u32 personality;
- /*0x04*/ u32 otId;
- /*0x08*/ u16 species;
- /*0x0A*/ u8 contestType;
- /*0x0B*/ u8 pokemon_name[POKEMON_NAME_LENGTH];
- /*0x15*/ u8 pad15;
- /*0x16*/ u8 trainer_name[OT_NAME_LENGTH];
+ u16 pixels[0x1000];
+ u16 palette[0x100];
};
struct LabelPair
@@ -55,7 +44,7 @@ struct LabelPair
const u8 *suffix;
};
-void sub_8106630(u32);
+void SetContestWinnerForPainting(u32 contestWinnerId);
void CB2_ContestPainting(void);
#endif
diff --git a/include/contest_painting_effects.h b/include/contest_painting_effects.h
deleted file mode 100644
index 8b99ba692..000000000
--- a/include/contest_painting_effects.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef GUARD_CUTE_SKETCH_H
-#define GUARD_CUTE_SKETCH_H
-
-struct Unk03005E20
-{
- u8 var_0;
- u8 pad1[3];
- u16 (*var_4)[][32];
- u16 *var_8;
- u8 pad0C[4];
- u16 (*var_10)[][32];
- u16 var_14;
- u16 var_16;
- u8 var_18;
- u8 var_19;
- u8 var_1A;
- u8 var_1B;
- u8 var_1C;
- u8 var_1D;
- u8 var_1E;
- u8 var_1F;
-};
-
-void sub_80FC7A0(struct Unk03005E20 *);
-void sub_80FD8CC(struct Unk03005E20 *);
-void sub_80FDA18(struct Unk03005E20 *);
-
-#endif // GUARD_CUTE_SKETCH_H
diff --git a/include/script_pokemon_80C4.h b/include/contest_util.h
index fab07994e..a22bd9548 100644
--- a/include/script_pokemon_80C4.h
+++ b/include/contest_util.h
@@ -6,7 +6,7 @@ void sub_80C5580(void);
void SetBattleTowerPlayerParty(void);
void ReducePlayerPartyToThree(void);
-u8 sub_80C4D50(void);
+u8 CountPlayerMuseumPaintings(void);
void ShowContestWinner(void);
void ScrSpecial_HealPlayerParty();
u8 ScriptGiveMon(u16, u8, u16, u32, u32, u8);
diff --git a/include/credits.h b/include/credits.h
index dabe24048..34a166e72 100644
--- a/include/credits.h
+++ b/include/credits.h
@@ -6,6 +6,6 @@
// Exported RAM declarations
// Exported ROM declarations
-void sub_81439D0(void);
+void CB2_StartCreditsSequence(void);
#endif //GUARD_credits_H
diff --git a/include/data2.h b/include/data2.h
index ed23a10ce..c5c8a42fb 100644
--- a/include/data2.h
+++ b/include/data2.h
@@ -21,9 +21,9 @@ extern const struct SpriteFrameImage gSpriteImageTable_81E7A30[];
extern const struct SpriteFrameImage gSpriteImageTable_81E7A50[];
extern const struct SpriteFrameImage gSpriteImageTable_81E7A70[];
extern const union AffineAnimCmd *const gSpriteAffineAnimTable_81E7B70[];
-extern const union AffineAnimCmd *const gSpriteAffineAnimTable_81E7BEC[];
+extern const union AffineAnimCmd *const gAffineAnims_BattleSpriteOpponentSide[];
-extern const union AffineAnimCmd *const gSpriteAffineAnimTable_81E7C18[];
+extern const union AffineAnimCmd *const gAffineAnims_BattleSpriteContest[];
extern const union AnimCmd *const gSpriteAnimTable_81E7C64[];
extern const struct MonCoords gMonFrontPicCoords[];
extern const struct MonCoords gMonBackPicCoords[];
@@ -48,8 +48,8 @@ extern const u8 gUnknown_081F96C8[];
extern const struct CompressedSpriteSheet gUnknown_081FAEA4;
extern const struct CompressedSpritePalette gUnknown_081FAEAC;
extern const struct SpriteTemplate gSpriteTemplate_81FAF0C;
-extern u8 *const gUnknown_081FAF4C[];
-//extern u8 (*const gUnknown_081FAF4C[])[0x800];
+extern u8 *const gMonSpriteGfx_Sprite_ptr[];
+//extern u8 (*const gMonSpriteGfx_Sprite_ptr[])[0x800];
extern const struct BattleMove gBattleMoves[];
// data/graphics/trainers/front_pic_coords.inc
diff --git a/include/decompress.h b/include/decompress.h
index a97dd78f1..5bf992217 100644
--- a/include/decompress.h
+++ b/include/decompress.h
@@ -10,8 +10,10 @@ void LoadCompressedObjectPicOverrideBuffer(const struct CompressedSpriteSheet *s
void LoadCompressedObjectPalette(const struct CompressedSpritePalette *src);
void LoadCompressedObjectPaletteOverrideBuffer(const struct CompressedSpritePalette *src, void *buffer);
void DecompressPicFromTable_2(const struct CompressedSpriteSheet *a, u8 coords, u8 y_offset, void *d, void *dest, s32 species);
-void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *spriteSheet, u32 coords, u32 y_offset, u32 d, void *dest, s32 species, u32 pid);
-void LoadSpecialPokePic(const struct CompressedSpriteSheet *spriteSheet, u32 coords, u32 y_offset, u32 d, void *dest, s32 species, u32 pid, u32 frontOrBack);
+void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, u32 coords, u32 y_offset,
+ void *decompBuf, void *dest, s32 species, u32 pid);
+void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, u32 b, u32 c,
+ void *decompBuffer, void *dest, s32 species, u32 pid, u32 frontOrBack);
void Unused_LZDecompressWramIndirect(const void **src, void *dest);
#endif // GUARD_DECOMPRESS_H
diff --git a/include/dewford_trend.h b/include/dewford_trend.h
index 16b2bdd75..5540d6655 100644
--- a/include/dewford_trend.h
+++ b/include/dewford_trend.h
@@ -3,7 +3,7 @@
void InitDewfordTrend(void);
bool8 sub_80FA364(u16 *a);
-void sub_80FA4E4(void *, u32, u8);
+void ReceiveDewfordTrendData(void *, u32, u8);
void UpdateDewfordTrendPerDay(u16);
#endif
diff --git a/include/easy_chat.h b/include/easy_chat.h
index 729bc0b62..468902e4c 100644
--- a/include/easy_chat.h
+++ b/include/easy_chat.h
@@ -18,7 +18,7 @@ struct Shared1000
u16 *unk4;
u8 unk8;
u8 unk9;
- u8 unkA; // length of unkC array
+ u8 unkA; // length of contestant array
u8 unkB; // reporter talked to (Gabby or Ty)
u16 unkC[9];
void (*unk20)(void);
diff --git a/include/ewram.h b/include/ewram.h
index da544f5c2..e1639e4a9 100644
--- a/include/ewram.h
+++ b/include/ewram.h
@@ -2,278 +2,171 @@
#define GUARD_EWRAM_H
extern u8 gSharedMem[];
-#define ewram_addr 0x02000000 // used in gSharedMem addr hacks
// Note: we have duplicate ewram labels because its clear some memory
// regions overlap others but have different definitions. Until some
// dupes can be determined to be the same, they will be deliberate
// seperated.
+#define gDecompressionBuffer (gSharedMem + 0x1E000)
+
+// battle_interface.c
+#define eBattleInterfaceGfxBuffer ((u8 *)EWRAM)
+
+// region_map.c, field_region_map.c
+#define eRegionMapState (*(struct RegionMapState *)gSharedMem)
+
+// field_weather.c
#define eDroughtPaletteData (*(struct WeatherPaletteData *)gSharedMem)
+
+// battle etc.
+// This overlaps with so many things it's not even funny
+// The actual data starts at 0x02014000
+#define eMultiTxBuffer (*(union MultiBuffers *)gSharedMem)
#define gBattleStruct ((struct BattleStruct *) (gSharedMem + 0x0))
-#define ewram0_2 (*(struct Struct2000000 *)(gSharedMem + 0x0))
-#define namingScreenData (*(struct NamingScreenData *)(gSharedMem + 0x0))
-#define ewramBerryPic (gSharedMem + 0x0)
-#define ewram0_4 (*(struct Unk2000000 *)(gSharedMem + 0x0))
-#define ewram0_5 (*(struct UnkStruct *)(gSharedMem + 0x0))
-#define eMatsudaDebugVar (gSharedMem[0x0])
-#define eBrendanSprite (gSharedMem + 0x0)
-#define ewram0_6 (u32)(&gSharedMem[0])
-#define ewram0_7 (&gSharedMem[0])
-#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 eSlotMachine ((struct SlotMachineEwramStruct *)(gSharedMem + 0x0))
-#define ewram0_9(i) (u8 *)(ewram_addr + (i * 0x20))
-#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)
-#define eMaySprite (gSharedMem + 0x800)
-#define ewram888 (gSharedMem + 0x888)
-#define ewramBlankMapName (gSharedMem + 0xA48)
-#define ewramA6E (gSharedMem[0xA6E])
-#define ewram01000 (*(struct Unk2001000 *)(gSharedMem + 0x1000))
-#define ewramBerryPicTemp (gSharedMem + 0x1000)
-#define EWRAM_1000 (*(struct Struct2001000 *)(gSharedMem + 0x1000))
-#define ewram4000 (gSharedMem + 0x4000)
-#define gUnknown_02007000 (*(ewramStruct_02007000 *)(gSharedMem + 0x7000))
-#define ARRAY_2007800 ((struct EasyChatPair *)(gSharedMem + 0x7800))
-#define ARRAY_2007900 ((struct EasyChatPair *)(gSharedMem + 0x7900))
-#define ewram_2008000 (*(struct PlayerRecords *)(gSharedMem + 0x08000))
-#define ewram8000 (&gSharedMem[0x8000])
-#define ePokedexPalAddr1 (void *)(gSharedMem + 0x8000)
-#define ewram8800 (&gSharedMem[0x8800])
-#define ewram9000 (&gSharedMem[0x9000])
-#define ewram9000_hack (void *)(ewram_addr + 0x9000) // TODO: Fix this.
-#define ewram9800 (&gSharedMem[0x9800])
-#define ewramA000 (&gSharedMem[0xA000])
-#define ewramA800 (&gSharedMem[0xA800])
-#define ewramB000 (&gSharedMem[0xB000])
-#define ewramB800 (&gSharedMem[0xB800])
+// This macro ensures that any changes to the battle struct
+// definition will not horribly break things in battle.
+#define BSTRUCT_OFF(member) (offsetof(struct BattleStruct, member) + ((u8 *)gBattleStruct - gSharedMem))
+#define BCOMM(buff, member, blockOff, i) (gSharedMem[BSTRUCT_OFF(buff) + offsetof(struct LinkBattleCommunicationHeader, member) + blockOff + i])
+
+// battle_transition.c
#define TRANSITION_STRUCT (*(struct TransitionData *) (gSharedMem + 0xC000))
-#define ewramC000 (&gSharedMem[0xC000])
-#define ePokedexPalAddr2 (void *)(gSharedMem + 0xC000)
-#define ewramC03C (&gSharedMem[0xC03C])
-#define ewramC800 (&gSharedMem[0xC800])
-#define ewramD000 (&gSharedMem[0xD000])
-#define ewramD800 (&gSharedMem[0xD800])
-#define ewramE000 (&gSharedMem[0xE000])
-#define ewramE800 (&gSharedMem[0xE800])
-#define ewramF000 (&gSharedMem[0xF000])
-#define ewramF800 (&gSharedMem[0xF800])
-#define ewram_2010000 (*(struct TradeEwramStruct *)(gSharedMem + 0x10000))
-#define ewram10000 (&gSharedMem[0x10000])
-#define eSlotMachineGfxBuffer (void *)(gSharedMem + 0x10000) // slot machine
-#define ePokedexPalAddr3 (void *)(gSharedMem + 0x10000)
-#define ewram10800 (&gSharedMem[0x10800])
-#define ewram11000 (&gSharedMem[0x11000])
-#define ewram11800 (&gSharedMem[0x11800])
-#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])
-#define ePokedexPalAddr4 (void *)(gSharedMem + 0x14000)
-#define ewram14000arr(i, data) (gSharedMem[0x14000 + i + data])
-#define ewram14004arr(i, data) (gSharedMem[0x14004 + i + data])
-#define ewram14008arr(i, data) (gSharedMem[0x14008 + data + i])
-#define ewram14800 (&gSharedMem[0x14800])
-#define EWRAM_14800 ((u16 *)(gSharedMem + 0x14800))
-#define sEvoInfo ((*(struct EvoInfo*)(gSharedMem + 0x14800)))
-#define EWRAM_15000 ((u8 *)(gSharedMem + 0x15000))
-#define ewram15000 (&gSharedMem[0x15000])
-#define ewram15000arr(i, data) (gSharedMem[0x15000 + data + i])
-#define ewram15800 (&gSharedMem[0x15800])
-#define ewram15DDE (gSharedMem[0x15DDE])
-#define ewram15DDF (gSharedMem[0x15DDF])
-#define ewram15DE0 ((*(struct ContestEntry*)(gSharedMem + 0x15DE0)))
-#define ewram15E00 ((*(struct Unk2015E00*)(gSharedMem + 0x15E00)))
-#define ewram16000 (gSharedMem[0x16000])
-#define ewram16000_2 (&gSharedMem[0x16000])
-#define ewram16001 (gSharedMem[0x16001])
-#define ewram16002 (gSharedMem[0x16002])
-#define ewram16003 (gSharedMem[0x16003])
-#define ewram16004arr(i, battler) (gSharedMem[0x16004 + i + battler * 2])
-#define ewram1600C (gSharedMem[0x1600C])
-#define ewram1600E (gSharedMem[0x1600E])
-#define ewram16010arr(battler) (gSharedMem[0x16010 + battler])
-#define ewram1601B (gSharedMem[0x1601B])
-#define eDynamicMoveType (gSharedMem[0x1601C])
-#define eFocusPunchBattler (gSharedMem[0x1601D])
-#define eDmgMultiplier (gSharedMem[0x1601F])
-#define ewram16020 ((u8 *)(gSharedMem + 0x16020))
-#define ewram16020arr(i) (gSharedMem[0x16020 + i])
-#define ewram16054 (gSharedMem[0x16054])
-#define ewram16056 (gSharedMem[0x16056])
-#define ewram16058 (gSharedMem[0x16058])
-#define ewram16059 (gSharedMem[0x16059])
-#define ewram16060(battler) (gSharedMem[0x16060 + battler])
-#define BATTLE_PARTY_ID(battler) (gSharedMem[0x16064 + battler])
-#define ewram16064 (&gSharedMem[0x16064])
-#define ewram16064arr(battler) (gSharedMem[0x16064 + battler])
-#define ewram16068arr(i) (gSharedMem[0x16068 + i])
-#define UNK_201606C_ARRAY (gSharedMem + 0x1606C) // lazy define but whatever.
-#define ewram1606Carr(i, a) (gSharedMem[0x1606C + i + a * 3])
-#define ewram16078 (gSharedMem[0x16078])
-#define ewram16084 (gSharedMem[0x16084])
-#define ewram16086 (gSharedMem[0x16086])
-#define ewram16087 (gSharedMem[0x16087])
-#define ewram16088 (gSharedMem[0x16088])
-#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(battler) (gSharedMem[0x1608C + battler])
-#define ewram16094arr(battler) (gSharedMem[0x16094 + battler])
-#define EWRAM_1609D (gSharedMem[0x1609D])
-#define ewram1609e(flank) (gSharedMem[0x1609E + (flank)])
-#define ewram160A1 (gSharedMem[0x160A1])
-#define ewram160A4 (gSharedMem[0x160A4])
-#define ewram160A5 (gSharedMem[0x160A5])
-#define ewram160A6 (gSharedMem[0x160A6])
-#define ewram160A8 (gSharedMem[0x160A8])
-#define ewram160A9 (gSharedMem[0x160A9])
-#define ewram160AA (gSharedMem[0x160AA])
-#define ewram160AB (gSharedMem[0x160AB])
-#define ewram160AC ((u8 *)(gSharedMem + 0x160AC))
-#define ewram160ACarr(i) (gSharedMem[0x160AC + i])
-#define ewram160ACarr2(i, battler) (gSharedMem[0x160AC + i + battler * 2])
-#define ewram160BC ((u16 *)(gSharedMem + 0x160BC)) // hp
-#define ewram160BCarr(battler) (gSharedMem[0x160BC + battler * 2])
-#define ewram160C0 (gSharedMem[0x160C0])
-#define ewram160C2_Flags ((u16 *)(gSharedMem + 0x160C2))
-#define ewram160C4_Callback ((MainCallback *)(gSharedMem + 0x160C4))
-#define ewram160C8 (gSharedMem[0x160C8])
-#define ewram160C8arr(battler) (gSharedMem[0x160C8 + (battler / 2)])
-#define ewram160C9 (gSharedMem[0x160C9])
-#define ewram160CB (gSharedMem[0x160CB])
-#define ewram160CC ((u8 *)(gSharedMem + 0x160CC))
-#define ewram160CCarr(i) (gSharedMem[0x160CC + i])
-#define USED_HELD_ITEM(battler) ((((u16*)(&gSharedMem[0x160CC + battler * 2]))))
-#define USED_HELD_ITEMS(battler) (*(u16 *)&gSharedMem[0x160CC + 2 * (battler)])
-#define ewram160D4(battler) (gSharedMem[0x160D4 + (battler / 2) * 2])
-#define ewram160D8(battler) (gSharedMem[0x160D8 + (battler / 2)])
-#define ewram160DA(battler) (gSharedMem[0x160DA + (battler >> 1)])
-#define ewram160DD (gSharedMem[0x160DD])
-#define ewram160E0(i) (gSharedMem[0x160E0 + i])
-#define ewram160E6 (gSharedMem[0x160E6])
-#define ewram160E7 (gSharedMem[0x160E7])
-#define CHOICED_MOVE(battler) (((u16*)(&gSharedMem[0x160E8 + battler * 2])))
-#define ewram160E8 ((u8 *)(gSharedMem + 0x160E8))
-#define ewram160E8arr(i) (gSharedMem[0x160E8 + i])
-#define ewram160E8arr2(i, battler) (gSharedMem[0x160E8 + i + battler * 2])
-#define ewram160F0 ((u8 *)(gSharedMem + 0x160F0))
-#define ewram160F0arr(i) (gSharedMem[0x160F0 + i])
-#define ewram160F8 (gSharedMem[0x160F8])
-#define ewram160F9 (gSharedMem[0x160F9])
-#define eStatHp (gSharedMem[0x160FA])
-#define ewram160FB (gSharedMem[0x160FB])
-#define ewram16100 ((u8 *)(gSharedMem + 0x16100))
-#define ewram16100arr(i) (gSharedMem[0x16100 + i])
-#define ewram16100arr2(i, battler) (gSharedMem[0x16100 + i + battler * 4])
-#define ewram16108 ((u8 *)(gSharedMem + 0x16108))
-#define ewram16108arr(i) (gSharedMem[0x16108 + i])
-#define ewram16110 (gSharedMem[0x16110])
-#define ewram16111 (gSharedMem[0x16111])
-#define eMultihitMoveEffect (gSharedMem[0x16112])
-#define ewram16113 (gSharedMem[0x16113])
+#define eTransitionMugshotDecompBuff (&gSharedMem[0xC03C])
+
#define ewram16400 (gSharedMem + 0x16400)
+
+// gBattleResources
#define AI_THINKING_STRUCT ((struct AI_ThinkingStruct *)(gSharedMem + 0x16800))
#define AI_BATTLE_HISTORY ((struct BattleHistory *) (gSharedMem + 0x16A00))
#define AI_STACK ((struct AI_Stack *) (gSharedMem + 0x16C00))
-#define AI_ARRAY_160CC(i) (gSharedMem[0x160CC + i * 2])
-#define ewram16800 (&gSharedMem[0x16800])
-#define ewram17000 (&gSharedMem[0x17000])
-#define eMoveTutorMenu (struct MoveTutorMenu *)(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 eBattleFlagsArr (*(struct ResourceFlags *)(gSharedMem + 0x17100))
#define B_BATTLESCRIPTS_STACK ((struct BattleScriptsStack *) (gSharedMem + 0x17110))
-#define ewram17130 (gSharedMem[0x17130])
#define B_FUNCTION_STACK ((struct BattleCallbacksStack *) (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 gBattleResources_statsBeforeLvlUp ((struct StatsArray *)(gSharedMem + 0x17180))
+#define gBattleSpriteInfo ((struct BattleSpriteInfo *) (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))
-#define ewram18000_2 (&gSharedMem[0x18000])
-#define ewram18000_3 *(struct Pokemon **)(gSharedMem + 0x18000)
-#define eBerryBlenderData (struct BerryBlenderData*)(&gSharedMem[0x18000])
-#define eEggHatchData (struct EggHatchData*)(&gSharedMem[0x18000])
+#define eBattleBars ((struct BattleBar *)(gSharedMem + 0x17850))
+
+#define eBattleAnimPalBackup_Battle ((u16 *)(gSharedMem + 0x18000)) // also: shop.c, battle_anim.c
+
+// Contest
+#define eBattleAnimPalBackup_Contest ((u16 *)(gSharedMem + 0x14800))
+#define eUnzippedContestAudience_Gfx (&gSharedMem[0x15800]) // overlaps other contest vars
+#define eCurContestWinnerSaveIdx (gSharedMem[0x15DDE])
+#define eCurContestWinnerIsForArtist (gSharedMem[0x15DDF])
+#define eCurContestWinner ((*(struct ContestWinner*)(gSharedMem + 0x15DE0)))
+#define eContestPaintingBuffers ((*(struct ContestPaintingBuffers*)(gSharedMem + 0x15E00)))
+#define eEnableContestDebugging (gSharedMem[0x18000])
+#define eContestTempSave (*(struct ContestTempSave *)(gSharedMem + 0x18004))
+#define sContest (*(struct Contest *)(gSharedMem + 0x19204))
+#define sContestantStatus ((struct ContestantStatus *)(gSharedMem + 0x19260))
+#define eContestAppealResults (*(struct ContestAppealMoveResults *)(gSharedMem + 0x192D0))
+#define eContestAI ((struct ContestAIInfo *)(gSharedMem + 0x192E4))
+#define eContestExcitement (*(struct ContestExcitement *)(gSharedMem + 0x19328))
+#define eContestGfxState ((struct ContestGfxState *)(gSharedMem + 0x19338))
+#define gContestResources__moveAnim (*(struct ContestMoveAnim *)(gSharedMem + 0x19348))
+
+// Non-battle allocations
+#define namingScreenData (*(struct NamingScreenData *)(gSharedMem + 0x0))
+#define eSaveSection (struct SaveSector *)(gSharedMem + 0x0)
+#define eSlotMachine ((struct SlotMachineEwramStruct *)(gSharedMem + 0x0))
+#define ePokemonStorageSystem (*(struct PokemonStorageSystemData *)(gSharedMem + 0))
+
+#define ewramSavedItemsPocket ((struct ItemSlot *)(gSharedMem + 0x1E000)) // saved items pocket (for Wally battle)
+#define ewramSavedPokeballsPocket ((struct ItemSlot *)(gSharedMem + 0x1F000)) // saved Pokeballs pocket (for Wally battle)
+
+// party_menu.c
+#define ePartyMenu (*(struct Unk2001000 *)(gSharedMem + 0x1000))
+#define eMoveTutorMenu (struct MoveTutorMenu *)(gSharedMem + 0x17000)
+#define ePartyMenu2 (*(struct Unk201B000 *)(gSharedMem + 0x1B000))
+#define gPartyMenu (*(struct PartyMenu *)(gSharedMem + 0x1C000))
+
+// player_pc.c, party_menu.c
+#define eMailboxInfo (*(struct MailboxStruct *)(gSharedMem + 0x1FE00))
+
+// item_menu.c
+#define ewramBerryPic (gSharedMem + 0x0)
+#define ewramBerryPicTemp (gSharedMem + 0x1000)
+
+// record_mixing.c
+#define eRecordMixTvShows ((union TVShow (*)[TV_SHOWS_COUNT])(gSharedMem + 0x7000))
+#define eRecordMixPokeNews ((struct PokeNews (*)[POKE_NEWS_COUNT])(gSharedMem + 0x7000)) // same addr as above
+#define eLinkedDewfordTrendsBuffer ((struct EasyChatPair *)(gSharedMem + 0x7800))
+#define eSavedDewfordTrendsBuffer ((struct EasyChatPair *)(gSharedMem + 0x7900))
+#define eReceivedRecords (*(struct PlayerRecords *)(gSharedMem + 0x08000))
+#define eSentRecord (*(struct PlayerRecords *)(gSharedMem + 0x18000))
+
+// pokedex.c
+#define ePokedexGraphicsBuffer ((void *)&gSharedMem[0x8000])
#define ePokedexView1 (struct PokedexView *)(gSharedMem + 0x18000)
-#define UNK_2018000_STRUCT (*(struct UnknownStruct2018000 *)(gSharedMem + 0x18000))
-#define pssData (*(struct PokemonSummaryScreenStruct *)(gSharedMem + 0x18000))
-#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 eWRAM_19348Struct ((struct EWRAM_19348_Struct *)(gSharedMem + 0x19348))
-#define ewram19800 (&gSharedMem[0x19800])
#define ePokedexView4 (struct PokedexView *)(gSharedMem + 0x19800)
+
+// pokedex_cry_screen.c
+#define sCryWaveformWindowTiledata (&gSharedMem[0])
+#define ePokedexCryScreen (*(struct PokedexCryScreen *)(gSharedMem + 0x1C000))
+#define ePokedexCryScreen2 (*(struct PokedexCryMeterNeedle *)(gSharedMem + 0x1C800))
+
+#define ewram_2010000 (*(struct TradeEwramStruct *)(gSharedMem + 0x10000))
+#define eBerryBlenderGfxBuffer (&gSharedMem[0x10000])
+#define eSlotMachineGfxBuffer (void *)(gSharedMem + 0x10000) // slot machine
+#define eSlotMachineReelTimeGfxBuffer (&gSharedMem[0x13200])
+#define sEvoInfo ((*(struct EvoInfo*)(gSharedMem + 0x14800)))
+
+// roulette_gfx.c
+#define ewram17000 (&gSharedMem[0x17000])
+#define ewram17E00 ((u16 *)(gSharedMem + 0x17E00))
+#define ewram18000 ((u16 *)(gSharedMem + 0x18000)) // also: shop.c, battle_anim.c
+
+#define eCableCar1 ((struct CableCarEwramStruct1 *)(gSharedMem + 0x17000))
+#define eCableCar2 ((struct CableCarEwramStruct2 *)(gSharedMem + 0x19000))
+
+#define eBerryBlenderData (struct BerryBlenderData*)(&gSharedMem[0x18000])
+#define eEggHatchData (struct EggHatchData*)(&gSharedMem[0x18000])
+
+// pokemon_summary_screen.c
+#define pssData (*(struct PokemonSummaryScreenStruct *)(gSharedMem + 0x18000))
#define ewram1A000 (&gSharedMem[0x1A000])
-#define ewram1A800 (&gSharedMem[0x1A800])
-#define ewram1B000 (*(struct Unk201B000 *)(gSharedMem + 0x1B000))
-#define ewram1B000_alt (*(struct Struct201B000 *)(gSharedMem + 0x1B000))
-#define EWRAM_1B000 ewram1B000_alt // FIXME
-#define EWRAM_1B000_2 (*(struct Struct201B000 *)(gSharedMem + 0x1B000))
-#define ewram1B000_2 (&gSharedMem[0x1B000])
-#define ewram1B800 (&gSharedMem[0x1B800])
-#define EWRAM_1C000 (*(struct Struct201C000 *)(gSharedMem + 0x1C000))
-#define ewram1C000 (*(struct Unk201C000 *)(gSharedMem + 0x1C000))
-#define ewram1c000 (*(struct Unk201C000 *)(gSharedMem + 0x1C000)) // FIXME, names too similar
-#define eHallOfFameMons1 (struct HallofFameMons*)(&gSharedMem[0x1C000])
+
+// roulette.c
+#define ewram18800 ((u16 *)(gSharedMem + 0x18800))
+#define eRoulette ((struct Roulette *)(gSharedMem + 0x19000))
+
+#define sCreditsData (*(struct CreditsData *)(gSharedMem + 0x1C000))
+
+// hall_of_fame.c
+#define eHofGfxPtr (gSharedMem + 0x8000)
+#define eHofMonPtr (struct HallofFameMons*)(&gSharedMem[0x1C000])
#define eHOFPCScreenEffect (*(struct PCScreenEffectStruct *)(gSharedMem + 0x1c000))
-#define ewram1D000 ((struct Pokemon *)(gSharedMem + 0x1D000))
-#define ewram1D000_2 ((u16 *)(gSharedMem + 0x1D000))
-#define ewram1D400 ((u16 *)(gSharedMem + 0x1D400))
-#define ewramSavedItemsPocket ((struct ItemSlot *)(gSharedMem + 0x1E000)) // saved items pocket (for Wally battle)
-#define ewram1E000(i) (gSharedMem[0x1E000 + i])
-#define eHallOfFameMons2 (struct HallofFameMons*)(&gSharedMem[0x1E000])
-#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)
-#define HALL_OF_FAME_SHEET_2 ((u8 *)(gSharedMem + 0x1F000))
-#define EWRAM_1F800 ((u16 *)(gSharedMem + 0x1F800))
-#define ewram_1F800_2 (const u16 *)(gSharedMem + 0x1F800)
-#define ewram1FE00 (*(struct Unk201FE00 *)(gSharedMem + 0x1FE00))
-#define eMailboxInfo (*(struct MailboxStruct *)(gSharedMem + 0x1FE00))
+
+#define eMultiBattleSetupPartySendBuffer \
+ ((struct Pokemon *)(gSharedMem + 0x1D000))
+
+// pokeblock_feed.c
+#define ePokeblockFeedMonAnimX ((s16 *)(gSharedMem + 0x1D000))
+#define ePokeblockFeedMonAnimY ((s16 *)(gSharedMem + 0x1D400))
+
+// decoration.c
+#define sDecorationContext (*(struct DecoPCPointers *)(gSharedMem + 0x1f000))
+
#define eCutGrassSpriteArray (gSharedMem + 0x1FFF0) // 8 sprite IDs
-#define ewram1FFFC (gSharedMem[0x1FFFC])
-#define ewram1FFFD (gSharedMem[0x1FFFD])
+
+// reshow_battle_screen.c
#define gHelperState (gSharedMem[0x1FFFE])
-#define ewram1FFFE (gSharedMem[0x1FFFE])
#define gReshowState (gSharedMem[0x1FFFF])
+
+// item_menu.c
#define ewramBagSetupStep (gSharedMem[0x1FFFF])
-#define ewram1FFFF (gSharedMem[0x1FFFF])
+
+// pokeblock_feed.c
+#define ePokeblockSpriteId (gSharedMem[0x1FFFC])
+#define ePokeblockFeedCaseSpriteId (gSharedMem[0x1FFFD])
+#define ePokeblockMonSpriteId (gSharedMem[0x1FFFE])
+
+// pokeblock.c
+#define ePokeblockCaseSpriteId (gSharedMem[0x1FFFE])
+#define ePokeblockGfxState (gSharedMem[0x1FFFF])
#endif
diff --git a/include/field_effect.h b/include/field_effect.h
index 6bf98d4f7..f961e3a3f 100644
--- a/include/field_effect.h
+++ b/include/field_effect.h
@@ -9,7 +9,7 @@ extern const struct SpritePalette gUnknown_0839F114;
extern const struct CompressedSpriteSheet gTrainerFrontPicTable[2];
extern const struct SpriteTemplate gSpriteTemplate_839F128;
extern const struct OamData gOamData_839F0F4;
-extern struct SpriteTemplate gUnknown_02024E8C;
+extern struct SpriteTemplate gCreatingSpriteTemplate;
extern u8 gLastFieldPokeMenuOpened;
diff --git a/include/global.h b/include/global.h
index e5114c396..7897e20c2 100644
--- a/include/global.h
+++ b/include/global.h
@@ -36,6 +36,12 @@
#define KANA(txt) _(txt)
#endif
+#define SWAP(x,y,t) {\
+ t = x; \
+ x = y; \
+ y = t; \
+}
+
// Prevent cross-jump optimization.
#define BLOCK_CROSS_JUMP asm("");
@@ -89,6 +95,18 @@ enum
(ptr)[3] = ((value) >> 24) & 0xFF;\
})
+// Converts a number to Q8.8 fixed-point format
+#define Q_8_8(n) ((s16)((n) * 256))
+
+// Converts a number from Q8.8 fixed-point format to integer
+#define Q_8_8_TO_INT(n) ((s16)((n) >> 8))
+
+// Converts a number to Q4.12 fixed-point format
+#define Q_4_12(n) ((s16)((n) * 4096))
+
+// Converts a number from Q4.12 fixed-point format to integer
+#define Q_4_12_TO_INT(n) ((s16)((n) >> 12))
+
// Credits to Made (dolphin emoji)
#define S16TOPOSFLOAT(val) \
({ \
@@ -115,26 +133,31 @@ struct UCoords16
u16 y;
};
+struct SecretBaseParty
+{
+ /*0x1A3C*/ u32 personality[PARTY_SIZE];
+ /*0x1A54*/ u16 moves[PARTY_SIZE * MAX_MON_MOVES];
+ /*0x1A84*/ u16 species[PARTY_SIZE];
+ /*0x1A90*/ u16 heldItems[PARTY_SIZE];
+ /*0x1A9C*/ u8 levels[PARTY_SIZE];
+ /*0x1AA2*/ u8 EVs[PARTY_SIZE];
+};
+
struct SecretBaseRecord
{
/*0x1A08*/ u8 secretBaseId;
- /*0x1A09*/ u8 sbr_field_1_0:4;
+ /*0x1A09*/ u8 toRegister:4;
/*0x1A09*/ u8 gender:1;
- /*0x1A09*/ u8 sbr_field_1_5:1;
- /*0x1A09*/ u8 sbr_field_1_6:2;
+ /*0x1A09*/ u8 battledOwnerToday:1;
+ /*0x1A09*/ u8 registryStatus:2;
/*0x1A0A*/ u8 playerName[OT_NAME_LENGTH];
/*0x1A11*/ u8 trainerId[4]; // byte 0 is used for determining trainer class
- /*0x1A16*/ u16 sbr_field_e;
- /*0x1A18*/ u8 sbr_field_10;
- /*0x1A19*/ u8 sbr_field_11;
+ /*0x1A16*/ u16 numSecretBasesReceived;
+ /*0x1A18*/ u8 numTimesEntered;
+ /*0x1A19*/ u8 unused;
/*0x1A1A*/ u8 decorations[DECOR_MAX_SECRET_BASE];
/*0x1A2A*/ u8 decorationPos[DECOR_MAX_SECRET_BASE];
- /*0x1A3C*/ u32 partyPersonality[PARTY_SIZE];
- /*0x1A54*/ u16 partyMoves[PARTY_SIZE * 4];
- /*0x1A84*/ u16 partySpecies[PARTY_SIZE];
- /*0x1A90*/ u16 partyHeldItems[PARTY_SIZE];
- /*0x1A9C*/ u8 partyLevels[PARTY_SIZE];
- /*0x1AA2*/ u8 partyEVs[PARTY_SIZE];
+ /*0x1A3C*/ struct SecretBaseParty party;
};
#include "constants/game_stat.h"
@@ -735,7 +758,7 @@ struct Time
struct Pokedex
{
/*0x00*/ u8 order;
- /*0x01*/ u8 unknown1;
+ /*0x01*/ u8 mode;
/*0x02*/ u8 nationalMagic; // must equal 0xDA in order to have National mode
/*0x03*/ u8 unknown2;
/*0x04*/ u32 unownPersonality; // set when you first see Unown
@@ -848,12 +871,6 @@ struct UnkStruct_8054FF8
u16 field_C;
};
-// wasnt defined so I had to define it
-struct HallOfFame
-{
- u8 filler[0x1F00];
-};
-
extern struct SaveBlock2 gSaveBlock2;
#endif // GUARD_GLOBAL_H
diff --git a/include/graphics.h b/include/graphics.h
index 66ef9a028..a6ccc520f 100644
--- a/include/graphics.h
+++ b/include/graphics.h
@@ -35,14 +35,16 @@ extern const u8 gInterfaceGfx_PremierBall[];
extern const u8 gInterfacePal_PremierBall[];
extern const u8 gUnknown_08D030D0[];
-extern const u8 gUnknown_08D17144[];
-extern const u8 gUnknown_08D1725C[];
-extern const u8 gUnknown_08D17424[];
+extern const u8 gContestPalette[];
+extern const u8 gContestGfx[];
+extern const u8 gContestBgmap[];
extern const u8 gUnknown_08D17C3C[];
extern const u8 gContestMiscGfx[];
extern const u8 gContestAudienceGfx[];
extern const u8 gContestJudgeSymbolsGfx[];
extern const u8 gContest3Pal[];
+extern const u8 gContestNumbers_UnusedGfx[];
+extern const u8 gContestNumbers_UnusedPal[];
extern const u8 gTiles_8D1975C[];
extern const u8 gUnknown_08D1977C[];
extern const u8 gUnknown_08D1A250[];
diff --git a/include/image_processing_effects.h b/include/image_processing_effects.h
new file mode 100644
index 000000000..47153023b
--- /dev/null
+++ b/include/image_processing_effects.h
@@ -0,0 +1,53 @@
+#ifndef GUARD_IMAGE_PROCESSING_EFFECTS_H
+#define GUARD_IMAGE_PROCESSING_EFFECTS_H
+
+enum
+{
+ IMAGE_EFFECT_POINTILLISM = 2,
+ IMAGE_EFFECT_GRAYSCALE_LIGHT = 6,
+ IMAGE_EFFECT_BLUR = 8,
+ IMAGE_EFFECT_OUTLINE_COLORED = 9,
+ IMAGE_EFFECT_INVERT_BLACK_WHITE = 10,
+ IMAGE_EFFECT_THICK_BLACK_WHITE = 11,
+ IMAGE_EFFECT_SHIMMER = 13,
+ IMAGE_EFFECT_OUTLINE = 30,
+ IMAGE_EFFECT_INVERT = 31,
+ IMAGE_EFFECT_BLUR_RIGHT = 32,
+ IMAGE_EFFECT_BLUR_DOWN = 33,
+ IMAGE_EFFECT_CHARCOAL = 36,
+};
+
+enum
+{
+ QUANTIZE_EFFECT_STANDARD,
+ QUANTIZE_EFFECT_STANDARD_LIMITED_COLORS,
+ QUANTIZE_EFFECT_PRIMARY_COLORS,
+ QUANTIZE_EFFECT_GRAYSCALE,
+ QUANTIZE_EFFECT_GRAYSCALE_SMALL,
+ QUANTIZE_EFFECT_BLACK_WHITE,
+};
+
+struct ImageProcessingContext
+{
+ u8 effect;
+ void *canvasPixels;
+ u16 *canvasPalette;
+ u8 fillerC[0x4];
+ void *dest;
+ u16 quantizeEffect;
+ u16 bgType;
+ u8 paletteStart;
+ u8 columnStart;
+ u8 rowStart;
+ u8 columnEnd;
+ u8 rowEnd;
+ u8 canvasWidth;
+ u8 canvasHeight;
+ u8 personality;
+};
+
+void ApplyImageProcessingEffects(struct ImageProcessingContext *);
+void ConvertImageProcessingToGBA(struct ImageProcessingContext *);
+void ApplyImageProcessingQuantization(struct ImageProcessingContext *);
+
+#endif // GUARD_IMAGE_PROCESSING_EFFECTS_H
diff --git a/include/intro_credits_graphics.h b/include/intro_credits_graphics.h
index 303f50095..1abd06c93 100644
--- a/include/intro_credits_graphics.h
+++ b/include/intro_credits_graphics.h
@@ -16,7 +16,7 @@ void sub_8148CB0(u8);
void sub_8148E90(u8);
u8 sub_8148EC0(u8 a, u16 b, u16 c, u16 d);
void sub_8148F3C(u8);
-void sub_8149020(u8);
+void CycleSceneryPalette(u8);
u8 intro_create_brendan_sprite(s16 a, s16 b);
u8 intro_create_may_sprite(s16 a, s16 b);
u8 intro_create_latios_sprite(s16 a, s16 b);
diff --git a/include/item.h b/include/item.h
index 69fe1f941..9c7e1b673 100644
--- a/include/item.h
+++ b/include/item.h
@@ -1,6 +1,16 @@
#ifndef GUARD_ITEM_H
#define GUARD_ITEM_H
+// These constants are used in gItems
+enum
+{
+ POCKET_ITEMS = 1,
+ POCKET_POKE_BALLS,
+ POCKET_TM_HM,
+ POCKET_BERRIES,
+ POCKET_KEY_ITEMS,
+};
+
typedef void (*ItemUseFunc)(u8);
struct BagPocket
diff --git a/include/link.h b/include/link.h
index 6c9c25202..a4540b346 100644
--- a/include/link.h
+++ b/include/link.h
@@ -185,7 +185,7 @@ void sub_800826C(void);
void sub_80082EC(void);
u8 GetLinkPlayerCount_2(void);
bool8 IsLinkMaster(void);
-void sub_800832C(void);
+void SetCloseLinkCallback(void);
void sub_8008480(void);
void sub_80084A4(void);
void CB2_LinkError(void);
diff --git a/include/menu.h b/include/menu.h
index a6ff6050e..9b132bda2 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -69,7 +69,9 @@ 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);
void MenuPrint_RightAligned(const u8 *, u8, u8);
-void sub_8072B80(const u8 *, u8, u8, const u8 *);
+
+// Prints src aligned to right edge of widthRefStr in window defined by left and top
+void MenuPrint_AlignedToRightOfReferenceString(const u8 *src, u8 left, u8 top, const u8 *widthRefStr);
void MenuPrint_Centered(const u8 *, u8, u8, u16);
u8 *AlignInt1InMenuWindow(u8 *, s32, u8, u8);
u8 *AlignInt2InMenuWindow(u8 *, s32, u8, u8);
diff --git a/include/party_menu.h b/include/party_menu.h
index 172435b2d..bfd2c6cae 100644
--- a/include/party_menu.h
+++ b/include/party_menu.h
@@ -43,49 +43,33 @@ struct PartyPopupMenu
/*0x4*/const u8 *items; // menu item ids (ids for a MenuAction2 array)
};
-// TODO: Unify these two structs
+#define pmStatGrowths data
+#define pmSetupState data[0]
+#define pmMonIndex data[1]
+#define pmUnk268 data[2]
+#define pmUnk272 data[7]
+#define pmUnk27E data[13]
+#define pmUnk280 data[14]
+#define pmUnk282 data[15]
struct Unk201B000
{
struct Pokemon unk0[6];
u8 menuType;
u8 promptTextId;
- u8 filler25A[2];
TaskFunc menuHandler;
u8 menuHandlerTaskId;
u8 unk261;
- u8 unk262;
+ u8 unk262; // Never read
u8 unk263;
- // Stat growth upon level-up. First 6 bytes = old stats, Second 6 bytes = new stats.
- s16 statGrowths[NUM_STATS * 2];
- u8 filler27C[2];
- s16 unk27E;
- s16 unk280;
- s16 unk282;
-};
-
-struct Struct201B000
-{
- u8 filler0[0x259];
- u8 promptTextId;
- u8 filler25A[6];
- u8 menuHandlerTaskId;
- u8 unk261;
- u8 unk262;
- s16 setupState;
- s16 monIndex;
- s16 unk268;
- u8 filler26A[8];
- u16 unk272;
- u8 filler274[14];
- u16 unk282;
+ s16 data[16];
};
struct Unk2001000
{
u8 unk0;
- u8 unk1;
- u8 unk2;
+ u8 slotId;
+ u8 slotId2;
u8 unk3;
u8 unk4;
u8 unk5;
@@ -97,18 +81,17 @@ struct Unk2001000
u16 array[53561];
};
-struct UnknownPokemonStruct2
+struct PartyMenu
{
- /*0x00*/ u16 species;
- /*0x02*/ u16 heldItem;
- /*0x04*/ u8 nickname[11];
- /*0x0F*/ u8 level;
- /*0x10*/ u16 hp;
- /*0x12*/ u16 maxhp;
- /*0x14*/ u32 status;
- /*0x18*/ u32 personality;
- /*0x1C*/ u8 gender;
- /*0x1D*/ u8 language;
+ /*0x00*/ struct Pokemon *pokemon;
+ /*0x04*/ u8 unk4;
+ /*0x05*/ u8 primarySelectedMonIndex;
+ /*0x06*/ u16 secondarySelectedIndex;
+ /*0x08*/ u16 unk8;
+ /*0x0A*/ u8 pad_0A[2];
+ /*0x0C*/ s32 unkC;
+ /*0x10*/ TaskFunc unk10;
+ /*0x14*/ TaskFunc unk14;
};
void CB2_PartyMenuMain(void);
@@ -137,7 +120,7 @@ void sub_806D3B4(u8 taskId, u16 species1, u16 species2);
void sub_806D4AC(u8 taskId, u16 species, u8 c);
void sub_806D50C(u8 taskId, u8 monIndex);
void PrintPartyMenuPromptText(u8 textId, u8 b);
-void sub_806D5A4(void);
+void PartyMenuEraseMsgBoxAndFrame(void);
void SetMonIconAnim(u8 spriteId, struct Pokemon *pokemon);
void CreatePartyMenuMonIcon(u8 taskId, u8 monIndex, u8 c, struct Pokemon *pokemon);
void TryCreatePartyMenuMonIcon(u8 a, u8 monIndex, struct Pokemon *pokemon);
@@ -151,7 +134,7 @@ void SetHeldItemIconVisibility(u8 a, u8 monIndex);
void PartyMenuDoPrintMonNickname(u8 monIndex, int b, const u8 *nameBuffer);
void PrintPartyMenuMonNickname(u8 monIndex, u8 b, struct Pokemon *pokemon);
void PrintPartyMenuMonNicknames(void);
-void CreateMonIcon_LinkMultiBattle(u8 taskId, u8 monIndex, u8 menuType, struct UnknownPokemonStruct2 *pokemon);
+void CreateMonIcon_LinkMultiBattle(u8 taskId, u8 monIndex, u8 menuType, struct MultiBattlePokemonTx *pokemon);
u8 *GetMonNickname(struct Pokemon *pokemon, u8 *stringBuffer);
void PartyMenuPutStatusTilemap(u8 monIndex, u8 b, u8 status);
void PartyMenuDoPrintLevel(u8 monIndex, u8 b, u8 level);
@@ -172,7 +155,7 @@ void SetPartyPopupMenuOffsets(u8 menuIndex, u8 *left, u8 *top, const struct Part
void ShowPartyPopupMenu(u8 menuIndex, const struct PartyPopupMenu *menu, const struct MenuAction2 *menuActions, u8 cursorPos);
void ClosePartyPopupMenu(u8 index, const struct PartyPopupMenu *menu);
TaskFunc PartyMenuGetPopupMenuFunc(u8 menuIndex, const struct PartyPopupMenu *menus, const struct MenuAction2 *menuActions, u8 itemIndex);
-u8 sub_806E834(const u8 *message, u8 arg1);
+u8 DisplayPartyMenuMessage(const u8 *message, u8 noClearAfter);
void sub_806E8D0(u8 taskId, u16 b, TaskFunc c);
void party_menu_link_mon_held_item_object(u8);
void Task_ConfirmGiveHeldItem(u8);
diff --git a/include/pokedex.h b/include/pokedex.h
index 1d3d9b388..7592d6ba9 100644
--- a/include/pokedex.h
+++ b/include/pokedex.h
@@ -7,7 +7,7 @@
#define NATIONAL_DEX_COUNT 386
void ResetPokedex(void);
-void sub_808C0A0(void);
+void ResetPokedexScrollPositions(void);
void CB2_InitPokedex(void);
u8 sub_809070C(u16 dexNum, u32 b, u32 c);
const u8 *GetPokemonCategory(u16);
@@ -28,7 +28,7 @@ u16 GetHoennPokedexCount(u8);
bool8 CompletedHoennPokedex(void);
bool16 CompletedNationalPokedex(void);
-extern bool8 gUnknown_03005CE8;
+extern bool8 gUnusedPokedexU8;
struct PokedexEntry
{
@@ -46,9 +46,9 @@ struct PokedexEntry
extern const struct PokedexEntry gPokedexEntries[];
-u16 sub_8091A4C(u16 gender, s16 x, s16 y, u16 paletteNum);
-u16 sub_80918EC(u16 num, s16 x, s16 y, u16 paletteNum);
+u16 CreateSizeScreenTrainerPic(u16 gender, s16 x, s16 y, u16 paletteNum);
+u16 CreateMonSpriteFromNationalDexNumber(u16 num, s16 x, s16 y, u16 paletteNum);
-void sub_8091738(u16, u16, u16);
+void PrintFootprint(u16 num, u16 b, u16 c);
#endif // GUARD_POKEDEX_H
diff --git a/include/pokedex_cry_screen.h b/include/pokedex_cry_screen.h
index ee586a092..d2134eb51 100644
--- a/include/pokedex_cry_screen.h
+++ b/include/pokedex_cry_screen.h
@@ -1,19 +1,19 @@
#ifndef GUARD_POKEDEX_CRY_SCREEN_H
#define GUARD_POKEDEX_CRY_SCREEN_H
-struct CryRelatedStruct
+struct CryScreenWindow
{
- u16 unk0;
- u8 unk2;
+ u16 charBase;
+ u8 screenBase;
u8 paletteNo;
u8 xPos;
u8 yPos;
};
-u8 ShowPokedexCryScreen(struct CryRelatedStruct *, u8);
-u8 sub_8119E3C(struct CryRelatedStruct *, u8);
-void sub_8119F88(u8 a);
-void sub_811A050(u16 species);
+bool8 ShowPokedexCryScreen(struct CryScreenWindow * cry, u8 arg1);
+bool8 LoadCryWaveformWindow(struct CryScreenWindow * cry, u8 bgId);
+void UpdateCryWaveformWindow(u8 bgId);
+void CryScreenPlayButton(u16 species);
void DestroyCryMeterNeedleSprite();
#endif // GUARD_POKEDEX_CRY_SCREEN_H
diff --git a/include/pokemon.h b/include/pokemon.h
index d2ab1335c..cbad2c9ae 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -193,6 +193,20 @@ struct UnknownPokemonStruct
/*0x2B*/u8 friendship;
};
+struct MultiBattlePokemonTx
+{
+ /*0x00*/ u16 species;
+ /*0x02*/ u16 heldItem;
+ /*0x04*/ u8 nickname[11];
+ /*0x0F*/ u8 level;
+ /*0x10*/ u16 hp;
+ /*0x12*/ u16 maxhp;
+ /*0x14*/ u32 status;
+ /*0x18*/ u32 personality;
+ /*0x1C*/ u8 gender;
+ /*0x1D*/ u8 language;
+};
+
#define BATTLE_STATS_NO 8
struct BattlePokemon
@@ -255,6 +269,8 @@ enum
STAT_SPD, // 3
STAT_SPATK, // 4
STAT_SPDEF, // 5
+ STAT_ACC, // 6
+ STAT_EVA, // 7
};
struct BaseStats
@@ -487,7 +503,7 @@ const u8 *GetMonSpritePal(struct Pokemon *mon);
const u8 *GetMonSpritePalFromOtIdPersonality(u16, u32, u32);
const struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u16, u32, u32);
bool8 IsOtherTrainer(u32, u8 *);
-void sub_8040B8C(void);
+void SetMonPreventsSwitchingString(void);
void SetWildMonHeldItem(void);
u8 *sub_8040D08();
bool32 ShouldHideGenderIconForLanguage(u16 species, u8 *name, u8 language);
diff --git a/include/pokemon_icon.h b/include/pokemon_icon.h
index ad0e4b56b..c23598ec7 100644
--- a/include/pokemon_icon.h
+++ b/include/pokemon_icon.h
@@ -13,8 +13,8 @@ void sub_809D510(struct Sprite *);
void sub_809D51C(void);
void sub_809D580(u16);
void sub_809D608(u16);
-void sub_809D62C(struct Sprite *sprite);
-void sub_809D824(struct Sprite *sprite, u8 animNum);
+void SpriteCB_PokemonIcon(struct Sprite *sprite);
+void SetPartyHPBarSprite(struct Sprite *sprite, u8 animNum);
const u8 *GetMonIconPtr(u16 species, u32 personality);
u16 mon_icon_convert_unown_species_id(u16 species, u32 personality);
extern const u8 gMonIconPaletteIndices[];
diff --git a/include/pokemon_summary_screen.h b/include/pokemon_summary_screen.h
index 29bdd332e..02296c27f 100644
--- a/include/pokemon_summary_screen.h
+++ b/include/pokemon_summary_screen.h
@@ -13,7 +13,7 @@ enum PokemonSummaryScreenMode
PSS_MODE_NORMAL,
PSS_MODE_MOVES_ONLY,
PSS_MODE_SELECT_MOVE,
- PSS_MODE_UNKNOWN, // TODO: this mode might be used by pokemon_storage_system
+ PSS_MODE_MOVE_DELETER, // TODO: this mode might be used by pokemon_storage_system
PSS_MODE_NO_MOVE_ORDER_EDIT,
PSS_MODE_PC_NORMAL,
PSS_MODE_PC_MOVES_ONLY,
diff --git a/include/record_mixing.h b/include/record_mixing.h
index 089a7337f..d1467493d 100644
--- a/include/record_mixing.h
+++ b/include/record_mixing.h
@@ -4,7 +4,7 @@
#include <stddef.h>
void RecordMixing_PrepareExchangePacket(void);
-void RecordMixing_ReceiveExchangePacket(u32 a);
+void RecordMixing_ReceiveExchangePacket(u32 which);
void Task_RecordMixing_SoundEffect(u8 taskId);
void Task_RecordMixing_Main(u8 taskId);
void sub_80B95F0(u8 taskId);
@@ -19,15 +19,15 @@ u8 GetMultiplayerId_(void);
u16 *GetPlayerRecvBuffer(u8 player);
void sub_80B9A78(void);
void sub_80B9A88(u8 *a);
-void sub_80B9B1C(u8 *a, size_t size, u8 index);
-void sub_80B9B70(void *a, u32 size, u8 index);
+void ReceiveOldManData(u8 *a, size_t size, u8 index);
+void ReceiveBattleTowerData(void *battleTowerRecord, u32 size, u8 index);
u8 sub_80B9BBC(struct DayCareMail *a);
void sub_80B9BC4(u8 *, size_t, u8[][2], u8 d, u8 e);
u8 sub_80B9C4C(u8 *a);
// ASM
-void sub_80B9C6C(struct RecordMixingDayCareMail *, size_t, u8, TVShow *);
-void sub_80B9F3C(u16 *, u8);
+void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t recordSize, u8 which, TVShow *shows);
+void ReceiveGiftItem(u16 *pItemId, u8 b);
void sub_80BA00C(u8);
#endif // GUARD_RECORD_MIXING_H
diff --git a/include/region_map.h b/include/region_map.h
index 24c768ea5..f42c7c493 100644
--- a/include/region_map.h
+++ b/include/region_map.h
@@ -60,6 +60,19 @@ struct RegionMap
/*0x280*/ u8 cursorLargeImage[0x600];
}; // size: 0x880
+struct RegionMapState
+{
+ void (*callback)(void);
+ u16 state;
+ u16 mapSectionId;
+ struct RegionMap regionMap;
+ u16 unk_888[0xE0];
+ u8 blankMapName[0x26];
+ bool8 choseFlyLocation;
+};
+
+extern struct RegionMapState *const gRegionMapState;
+
void InitRegionMap(struct RegionMap *regionMap, bool8 zoomed);
void sub_80FA904(struct RegionMap *regionMap, bool8 zoomed);
bool8 sub_80FA940(void);
diff --git a/include/rom_8077ABC.h b/include/rom_8077ABC.h
index 4f49885bf..c4cdfd7ad 100644
--- a/include/rom_8077ABC.h
+++ b/include/rom_8077ABC.h
@@ -12,12 +12,12 @@ struct Struct_sub_8078914 {
struct TransformStatus
{
- u16 unknown;
+ u8 unk0;
u16 species;
};
u8 GetBattlerSpriteCoord(u8, u8);
-u8 sub_8077E44(u8 slot, u16 species, u8 a3);
+u8 GetBattlerSpriteFinal_Y(u8 slot, u16 species, u8 a3);
u8 GetAnimBattlerSpriteId(u8 bank);
void StoreSpriteCallbackInData(struct Sprite *sprite, void(*callback)(struct Sprite *));
void sub_8078314(struct Sprite *sprite);
@@ -38,7 +38,7 @@ bool8 IsBankSpritePresent(u8);
bool8 IsDoubleBattle();
u8 IsDoubleBattle(void);
bool8 IsDoubleBattle(void);
-void sub_8078914();
+void sub_8078914(struct Struct_sub_8078914 * unk);
u8 sub_80789BC();
void InitSpriteDataForLinearTranslation(struct Sprite *sprite);
void InitAnimLinearTranslation(struct Sprite *sprite);
diff --git a/include/secret_base.h b/include/secret_base.h
index dafbca085..130c78ca3 100644
--- a/include/secret_base.h
+++ b/include/secret_base.h
@@ -18,7 +18,7 @@ u8 *GetSecretBaseMapName(u8 *dest);
void SetPlayerSecretBaseRecordMixingParty();
const u8 *GetSecretBaseTrainerLoseText(void);
void sub_80BCF1C(u8 taskId);
-void sub_80BD674(void *playerRecords, u32 size, u8 c);
+void ReceiveSecretBasesData(void *playerRecords, u32 size, u8 c);
#if DEBUG
void unref_sub_80BCD7C(u8 secretBaseIndex);
u8 *sub_80BC190(u8 *dest, u8 arg1);
diff --git a/include/sprite.h b/include/sprite.h
index f7a21ef46..e88cf6496 100644
--- a/include/sprite.h
+++ b/include/sprite.h
@@ -191,8 +191,8 @@ struct Sprite
/*0x18*/ const struct SubspriteTable *subspriteTables;
/*0x1C*/ SpriteCallback callback;
- /*0x20*/ struct Coords16 pos1;
- /*0x24*/ struct Coords16 pos2;
+ /*0x20*/ s16 x, y;
+ /*0x24*/ s16 x2, y2;
/*0x28*/ s8 centerToCornerVecX;
/*0x29*/ s8 centerToCornerVecY;
diff --git a/include/text.h b/include/text.h
index 8b5df9280..f765a0e05 100644
--- a/include/text.h
+++ b/include/text.h
@@ -5,10 +5,15 @@
#define CHAR_LV 0x34
#define CHAR_SONG_WORD_SEPARATOR 0x37 // separates words in the bard song. Not sure if it's used for anything else
#define CHAR_0 0xA1
+#define CHAR_EXCL_MARK 0xAB
#define CHAR_QUESTION_MARK 0xAC
#define CHAR_PERIOD 0xAD
#define CHAR_HYPHEN 0xAE
#define CHAR_ELLIPSIS 0xB0
+#define CHAR_DBL_QUOT_LEFT 0xB1
+#define CHAR_DBL_QUOT_RIGHT 0xB2
+#define CHAR_SGL_QUOT_LEFT 0xB3
+#define CHAR_SGL_QUOT_RIGHT 0xB4
#define CHAR_MALE 0xB5
#define CHAR_FEMALE 0xB6
#define CHAR_CURRENCY 0xB7
@@ -75,7 +80,6 @@
#define CHAR_NEWLINE 0xFE
#define EOS 0xFF // end of string
-#define EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW 4
#define TEXT_COLOR_TRANSPARENT 0x00
#define TEXT_COLOR_DARK_GREY 0x01
#define TEXT_COLOR_RED 0x02
@@ -93,8 +97,28 @@
#define TEXT_COLOR_LIGHT_BLUE 0x0E
#define TEXT_COLOR_WHITE2 0x0F
-#define EXT_CTRL_CODE_CLEAR 17
-
+#define EXT_CTRL_CODE_COLOR 0x01
+#define EXT_CTRL_CODE_HIGHLIGHT 0x02
+#define EXT_CTRL_CODE_SHADOW 0x03
+#define EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW 0x04
+#define EXT_CTRL_CODE_PALETTE 0x05
+#define EXT_CTRL_CODE_SIZE 0x06
+#define EXT_CTRL_CODE_RESET_SIZE 0x07
+#define EXT_CTRL_CODE_PAUSE 0x08
+#define EXT_CTRL_CODE_PAUSE_UNTIL_PRESS 0x09
+#define EXT_CTRL_CODE_WAIT_SE 0x0A
+#define EXT_CTRL_CODE_PLAY_BGM 0x0B
+#define EXT_CTRL_CODE_ESCAPE 0x0C
+#define EXT_CTRL_CODE_SHIFT_TEXT 0x0D // nop
+#define EXT_CTRL_CODE_SHIFT_DOWN 0x0E
+#define EXT_CTRL_CODE_FILL_WINDOW 0x0F
+#define EXT_CTRL_CODE_PLAY_SE 0x10
+#define EXT_CTRL_CODE_CLEAR 0x11
+#define EXT_CTRL_CODE_SKIP 0x12
+#define EXT_CTRL_CODE_CLEAR_TO 0x13
+#define EXT_CTRL_CODE_MIN_LETTER_SPACING 0x14
+#define EXT_CTRL_CODE_JPN 0x15
+#define EXT_CTRL_CODE_ENG 0x16
struct WindowTemplate
{
@@ -206,7 +230,7 @@ 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_ContestPainting;
extern const struct WindowTemplate gWindowTemplate_81E717C;
extern const struct WindowTemplate gWindowTemplate_81E7198;
extern const struct WindowTemplate gWindowTemplate_81E71B4;
@@ -236,7 +260,7 @@ void Text_InitWindowWithTemplate(struct Window *win, const struct WindowTemplate
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);
+void Contest_StartTextPrinter(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);
@@ -248,7 +272,7 @@ u8 *sub_8003558(u8 *dest, const u8 *src, u8 alignAmount, u8 alignType);
u8 Text_UpdateWindow(struct Window *win);
u8 Text_UpdateWindowInBattle(struct Window *win);
u8 Text_UpdateWindowAutoscroll(struct Window *win);
-u8 Text_UpdateWindowInContest(struct Window *win);
+u8 Contest_RunTextPrinter(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);
diff --git a/include/tv.h b/include/tv.h
index a7064f8fd..1ca601a35 100644
--- a/include/tv.h
+++ b/include/tv.h
@@ -72,7 +72,7 @@ s8 sub_80BF74C(TVShow tvShow[]);
bool8 sub_80BF77C(u16);
bool8 sub_80BF77C(u16);
u32 GetPlayerTrainerId(void);
-void sub_80BFD44(u8 *, u32, u8);
+void ReceiveTvShowsData(u8 *, u32, u8);
u8 sub_80C004C(TVShow *tv1, TVShow *tv2, u8 idx);
u8 sub_80C00B4(TVShow *tv1, TVShow *tv2, u8 idx);
u8 sub_80C0134(TVShow *tv1, TVShow *tv2, u8 idx);
@@ -99,7 +99,7 @@ void ResetGabbyAndTy(void);
void TakeTVShowInSearchOfTrainersOffTheAir(void);
extern u8 GabbyAndTyGetBattleNum(void);
void sub_80C04A0(void);
-void sub_80C0514(void *, u32, u8);
+void ReceivePokeNewsData(void *, u32, u8);
void DoTVShowBravoTrainerPokemonProfile(void);
void DoTVShowBravoTrainerBattleTowerProfile(void);
void DoTVShowTodaysSmartShopper(void);