diff options
Diffstat (limited to 'include')
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); |