2016-01-08 10:08:16 +01:00
# ifndef GUARD_GLOBAL_H
# define GUARD_GLOBAL_H
2018-01-21 20:40:19 +01:00
# include <string.h>
2019-06-29 04:26:11 +02:00
# include <limits.h>
2018-01-07 04:00:08 +01:00
# include "config.h" // we need to define config before gba headers as print stuff needs the functions nulled before defines.
2016-10-31 09:14:22 +01:00
# include "gba/gba.h"
2018-12-25 03:22:56 +01:00
# include "constants/global.h"
2020-06-24 23:00:19 +02:00
# include "constants/flags.h"
# include "constants/vars.h"
2020-10-01 23:20:38 +02:00
# include "constants/species.h"
2021-02-05 21:25:12 +01:00
# include "constants/berry.h"
2016-01-08 10:08:16 +01:00
2017-01-15 00:17:51 +01:00
// Prevent cross-jump optimization.
# define BLOCK_CROSS_JUMP asm("");
// to help in decompiling
# define asm_comment(x) asm volatile("@ -- " x " -- ")
2017-09-06 20:25:17 +02:00
# define asm_unified(x) asm(".syntax unified\n" x "\n.syntax divided")
2018-05-12 00:24:32 +02:00
# define NAKED __attribute__((naked))
2017-01-15 00:17:51 +01:00
2018-01-21 20:40:19 +01:00
// IDE support
2018-05-12 00:24:32 +02:00
# if defined (__APPLE__) || defined (__CYGWIN__) || defined (_MSC_VER)
2018-01-21 20:40:19 +01:00
# define _(x) x
# define __(x) x
2019-08-04 21:35:35 +02:00
// Fool CLion IDE
# define INCBIN(x) {0}
# define INCBIN_U8 INCBIN
# define INCBIN_U16 INCBIN
# define INCBIN_U32 INCBIN
# define INCBIN_S8 INCBIN
# define INCBIN_S16 INCBIN
# define INCBIN_S32 INCBIN
2018-05-12 00:24:32 +02:00
# endif // IDE support
2017-01-15 00:17:51 +01:00
2018-01-30 00:26:36 +01:00
# define ARRAY_COUNT(array) (size_t)(sizeof(array) / sizeof((array)[0]))
2017-01-15 00:17:51 +01:00
2019-08-05 14:46:52 +02:00
// GameFreak used a macro called "NELEMS", as evidenced by
// AgbAssert calls.
# define NELEMS(arr) (sizeof(arr) / sizeof(*(arr)))
2018-08-30 15:01:07 +02:00
# define SWAP(a, b, temp) \
{ \
temp = a ; \
a = b ; \
b = temp ; \
}
2017-09-21 10:50:15 +02:00
// useful math macros
// Converts a number to Q8.8 fixed-point format
# define Q_8_8(n) ((s16)((n) * 256))
// Converts a number to Q4.12 fixed-point format
# define Q_4_12(n) ((s16)((n) * 4096))
2018-06-20 23:07:51 +02:00
// Converts a number to Q24.8 fixed-point format
2020-05-20 21:23:21 +02:00
# define Q_24_8(n) ((s32)((n) << 8))
2018-06-20 23:07:51 +02:00
2018-02-16 05:30:39 +01:00
// Converts a Q8.8 fixed-point format number to a regular integer
# define Q_8_8_TO_INT(n) ((int)((n) / 256))
// Converts a Q4.12 fixed-point format number to a regular integer
# define Q_4_12_TO_INT(n) ((int)((n) / 4096))
2018-06-20 23:07:51 +02:00
// Converts a Q24.8 fixed-point format number to a regular integer
# define Q_24_8_TO_INT(n) ((int)((n) >> 8))
2018-01-31 21:26:57 +01:00
# define min(a, b) ((a) < (b) ? (a) : (b))
# define max(a, b) ((a) >= (b) ? (a) : (b))
2019-06-26 14:13:38 +02:00
# if MODERN
# define abs(x) (((x) < 0) ? -(x) : (x))
# endif
2018-12-14 04:33:54 +01:00
// Extracts the upper 16 bits of a 32-bit number
# define HIHALF(n) (((n) & 0xFFFF0000) >> 16)
// Extracts the lower 16 bits of a 32-bit number
# define LOHALF(n) ((n) & 0xFFFF)
2017-11-29 19:54:15 +01:00
// There are many quirks in the source code which have overarching behavioral differences from
// a number of other files. For example, diploma.c seems to declare rodata before each use while
// other files declare out of order and must be at the beginning. There are also a number of
// macros which differ from one file to the next due to the method of obtaining the result, such
// as these below. Because of this, there is a theory (Two Team Theory) that states that these
// programming projects had more than 1 "programming team" which utilized different macros for
// each of the files that were worked on.
# define T1_READ_8(ptr) ((ptr)[0])
# define T1_READ_16(ptr) ((ptr)[0] | ((ptr)[1] << 8))
# define T1_READ_32(ptr) ((ptr)[0] | ((ptr)[1] << 8) | ((ptr)[2] << 16) | ((ptr)[3] << 24))
# define T1_READ_PTR(ptr) (u8*) T1_READ_32(ptr)
// T2_READ_8 is a duplicate to remain consistent with each group.
# define T2_READ_8(ptr) ((ptr)[0])
# define T2_READ_16(ptr) ((ptr)[0] + ((ptr)[1] << 8))
# define T2_READ_32(ptr) ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24))
# define T2_READ_PTR(ptr) (void*) T2_READ_32(ptr)
2019-03-25 03:56:16 +01:00
// Macros for checking the joypad
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
# define TEST_BUTTON(field, button) ({(field) & (button);})
2019-03-25 03:56:16 +01:00
# define JOY_NEW(button) TEST_BUTTON(gMain.newKeys, button)
# define JOY_HELD(button) TEST_BUTTON(gMain.heldKeys, button)
2020-08-24 20:52:33 +02:00
# define JOY_HELD_RAW(button) TEST_BUTTON(gMain.heldKeysRaw, button)
2020-08-07 08:00:41 +02:00
# define JOY_REPEAT(button) TEST_BUTTON(gMain.newAndRepeatedKeys, button)
2019-03-25 03:56:16 +01:00
2018-12-09 20:41:52 +01:00
# define S16TOPOSFLOAT(val) \
( { \
s16 v = ( val ) ; \
float f = ( float ) v ; \
if ( v < 0 ) f + = 65536.0f ; \
f ; \
} )
2020-06-24 23:00:19 +02:00
# define ROUND_BITS_TO_BYTES(numBits)(((numBits) / 8) + (((numBits) % 8) ? 1 : 0))
2020-10-01 23:20:38 +02:00
# define DEX_FLAGS_NO (ROUND_BITS_TO_BYTES(NUM_SPECIES))
2020-06-24 23:00:19 +02:00
# define NUM_FLAG_BYTES (ROUND_BITS_TO_BYTES(FLAGS_COUNT))
2018-10-14 16:27:48 +02:00
struct Coords8
{
2018-08-11 23:51:54 +02:00
s8 x ;
s8 y ;
} ;
2018-10-14 16:27:48 +02:00
struct UCoords8
{
2018-08-11 23:51:54 +02:00
u8 x ;
u8 y ;
} ;
2017-09-01 23:40:13 +02:00
struct Coords16
{
s16 x ;
s16 y ;
} ;
struct UCoords16
{
u16 x ;
u16 y ;
} ;
2018-02-14 00:58:22 +01:00
struct Coords32
{
s32 x ;
s32 y ;
} ;
struct UCoords32
{
u32 x ;
u32 y ;
} ;
2017-09-02 23:28:44 +02:00
struct Time
{
/*0x00*/ s16 days ;
/*0x02*/ s8 hours ;
/*0x03*/ s8 minutes ;
/*0x04*/ s8 seconds ;
} ;
2017-09-02 22:31:37 +02:00
struct Pokedex
{
/*0x00*/ u8 order ;
2018-12-15 21:12:28 +01:00
/*0x01*/ u8 mode ;
2017-09-02 22:31:37 +02:00
/*0x02*/ u8 nationalMagic ; // must equal 0xDA in order to have National mode
/*0x03*/ u8 unknown2 ;
/*0x04*/ u32 unownPersonality ; // set when you first see Unown
/*0x08*/ u32 spindaPersonality ; // set when you first see Spinda
/*0x0C*/ u32 unknown3 ;
2018-05-10 09:30:42 +02:00
/*0x10*/ u8 owned [ DEX_FLAGS_NO ] ;
/*0x44*/ u8 seen [ DEX_FLAGS_NO ] ;
2017-09-02 22:31:37 +02:00
} ;
2019-07-29 12:35:57 +02:00
struct PokemonJumpResults
2017-09-03 22:50:17 +02:00
{
u16 jumpsInRow ;
u16 field2 ;
u16 excellentsInRow ;
u16 field6 ;
2019-07-29 12:35:57 +02:00
u32 field8 ;
2017-09-03 22:50:17 +02:00
u32 bestJumpScore ;
} ;
2019-07-29 12:35:57 +02:00
struct BerryPickingResults
2017-09-03 22:50:17 +02:00
{
u32 bestScore ;
u16 berriesPicked ;
u16 berriesPickedInRow ;
2017-09-08 16:46:37 +02:00
u8 field_8 ;
u8 field_9 ;
u8 field_A ;
u8 field_B ;
u8 field_C ;
u8 field_D ;
u8 field_E ;
u8 field_F ;
2017-09-03 22:50:17 +02:00
} ;
2018-04-29 13:36:26 +02:00
// two arrays for lvl50 and open level
2017-09-03 22:50:17 +02:00
struct PyramidBag
{
2018-04-29 13:36:26 +02:00
u16 itemId [ 2 ] [ PYRAMID_BAG_ITEMS_COUNT ] ;
u8 quantity [ 2 ] [ PYRAMID_BAG_ITEMS_COUNT ] ;
2017-09-03 22:50:17 +02:00
} ;
2017-09-08 16:46:37 +02:00
struct BerryCrush
{
u16 berryCrushResults [ 4 ] ;
u32 berryPowderAmount ;
u32 unk ;
} ;
2018-10-13 20:38:46 +02:00
struct ApprenticeMon
{
u16 species ;
2019-09-08 17:53:48 +02:00
u16 moves [ MAX_MON_MOVES ] ;
2018-10-13 20:38:46 +02:00
u16 item ;
} ;
2019-11-15 00:56:18 +01:00
// This is for past players Apprentices or Apprentices received via Record Mix.
// For the current Apprentice, see struct PlayersApprentice
2018-10-13 20:38:46 +02:00
struct Apprentice
2018-05-25 21:00:41 +02:00
{
2018-10-14 14:35:51 +02:00
u8 id : 5 ;
u8 lvlMode : 2 ; // + 1
2019-11-20 23:36:52 +01:00
u8 numQuestions ;
2018-10-14 14:35:51 +02:00
u8 number ;
2019-11-01 02:33:01 +01:00
struct ApprenticeMon party [ MULTI_PARTY_SIZE ] ;
2019-11-19 17:36:38 +01:00
u16 speechWon [ EASY_CHAT_BATTLE_WORDS_COUNT ] ;
2019-08-06 19:52:10 +02:00
u8 playerId [ TRAINER_ID_LENGTH ] ;
2018-10-13 00:48:26 +02:00
u8 playerName [ PLAYER_NAME_LENGTH ] ;
u8 language ;
2018-10-24 23:14:45 +02:00
u32 checksum ;
2018-05-25 21:00:41 +02:00
} ;
2018-12-10 21:49:33 +01:00
struct BattleTowerPokemon
2018-05-26 00:25:36 +02:00
{
u16 species ;
u16 heldItem ;
2019-09-08 17:53:48 +02:00
u16 moves [ MAX_MON_MOVES ] ;
2018-05-26 00:25:36 +02:00
u8 level ;
u8 ppBonuses ;
u8 hpEV ;
u8 attackEV ;
u8 defenseEV ;
u8 speedEV ;
u8 spAttackEV ;
u8 spDefenseEV ;
u32 otId ;
u32 hpIV : 5 ;
u32 attackIV : 5 ;
u32 defenseIV : 5 ;
u32 speedIV : 5 ;
u32 spAttackIV : 5 ;
u32 spDefenseIV : 5 ;
u32 gap : 1 ;
2019-05-14 15:22:16 +02:00
u32 abilityNum : 1 ;
2018-05-26 00:25:36 +02:00
u32 personality ;
u8 nickname [ POKEMON_NAME_LENGTH + 1 ] ;
u8 friendship ;
} ;
2019-09-04 21:11:57 +02:00
# define NULL_BATTLE_TOWER_POKEMON { .nickname = __("$$$$$$$$$$$") }
2018-05-26 00:25:36 +02:00
struct EmeraldBattleTowerRecord
{
2018-10-20 00:33:51 +02:00
/*0x00*/ u8 lvlMode ; // 0 = level 50, 1 = level 100
2018-10-21 00:06:42 +02:00
/*0x01*/ u8 facilityClass ;
2018-05-26 00:25:36 +02:00
/*0x02*/ u16 winStreak ;
2018-09-01 22:03:21 +02:00
/*0x04*/ u8 name [ PLAYER_NAME_LENGTH + 1 ] ;
2019-08-06 19:52:10 +02:00
/*0x0C*/ u8 trainerId [ TRAINER_ID_LENGTH ] ;
2019-11-15 00:56:18 +01:00
/*0x10*/ u16 greeting [ EASY_CHAT_BATTLE_WORDS_COUNT ] ;
/*0x1C*/ u16 speechWon [ EASY_CHAT_BATTLE_WORDS_COUNT ] ;
/*0x28*/ u16 speechLost [ EASY_CHAT_BATTLE_WORDS_COUNT ] ;
2019-11-24 22:58:40 +01:00
/*0x34*/ struct BattleTowerPokemon party [ MAX_FRONTIER_PARTY_SIZE ] ;
2018-05-26 00:25:36 +02:00
/*0xE4*/ u8 language ;
/*0xE8*/ u32 checksum ;
} ;
2019-11-24 22:58:40 +01:00
struct BattleTowerInterview
{
u16 playerSpecies ;
u16 opponentSpecies ;
u8 opponentName [ PLAYER_NAME_LENGTH + 1 ] ;
u8 opponentMonNickname [ POKEMON_NAME_LENGTH + 1 ] ;
u8 opponentLanguage ;
} ;
2018-10-21 00:06:42 +02:00
struct BattleTowerEReaderTrainer
{
/*0x00*/ u8 unk0 ;
/*0x01*/ u8 facilityClass ;
/*0x02*/ u16 winStreak ;
/*0x04*/ u8 name [ PLAYER_NAME_LENGTH + 1 ] ;
2019-08-06 19:52:10 +02:00
/*0x0C*/ u8 trainerId [ TRAINER_ID_LENGTH ] ;
2019-11-15 00:56:18 +01:00
/*0x10*/ u16 greeting [ EASY_CHAT_BATTLE_WORDS_COUNT ] ;
/*0x1C*/ u16 farewellPlayerLost [ EASY_CHAT_BATTLE_WORDS_COUNT ] ;
/*0x28*/ u16 farewellPlayerWon [ EASY_CHAT_BATTLE_WORDS_COUNT ] ;
2019-11-01 02:33:01 +01:00
/*0x34*/ struct BattleTowerPokemon party [ FRONTIER_PARTY_SIZE ] ;
2018-10-21 00:06:42 +02:00
/*0xB8*/ u32 checksum ;
} ;
2019-12-21 10:27:12 +01:00
// For displaying party information on the player's Battle Dome tourney page
struct DomeMonData
2018-08-15 15:49:50 +02:00
{
2019-09-08 17:53:48 +02:00
u16 moves [ MAX_MON_MOVES ] ;
2019-12-18 08:32:52 +01:00
u8 evs [ NUM_STATS ] ;
2018-08-15 15:49:50 +02:00
u8 nature ;
} ;
2019-02-07 19:58:09 +01:00
struct RentalMon
2018-08-26 15:27:06 +02:00
{
u16 monId ;
2018-09-03 22:55:55 +02:00
u32 personality ;
u8 ivs ;
2019-05-14 15:22:16 +02:00
u8 abilityNum ;
2018-08-26 15:27:06 +02:00
} ;
2018-08-15 23:04:46 +02:00
struct BattleDomeTrainer
2018-08-15 15:49:50 +02:00
{
2018-08-15 23:04:46 +02:00
u16 trainerId : 10 ;
2018-08-25 18:46:15 +02:00
u16 isEliminated : 1 ;
u16 eliminatedAt : 2 ;
2019-12-18 08:32:52 +01:00
u16 forfeited : 3 ;
2018-08-15 15:49:50 +02:00
} ;
2018-08-15 23:04:46 +02:00
# define DOME_TOURNAMENT_TRAINERS_COUNT 16
2020-11-17 17:21:34 +01:00
# define BATTLE_TOWER_RECORD_COUNT 5
2018-08-15 23:04:46 +02:00
2018-06-17 12:30:09 +02:00
struct BattleFrontier
2017-01-14 20:53:20 +01:00
{
2018-10-21 20:13:12 +02:00
/*0x64C*/ struct EmeraldBattleTowerRecord towerPlayer ;
2020-11-17 17:21:34 +01:00
/*0x738*/ struct EmeraldBattleTowerRecord towerRecords [ BATTLE_TOWER_RECORD_COUNT ] ; // From record mixing.
2019-11-24 22:58:40 +01:00
/*0xBEB*/ struct BattleTowerInterview towerInterview ;
2018-10-21 00:06:42 +02:00
/*0xBEC*/ struct BattleTowerEReaderTrainer ereaderTrainer ;
2019-11-24 22:58:40 +01:00
/*0xCA8*/ u8 challengeStatus ;
/*0xCA9*/ u8 lvlMode : 2 ;
/*0xCA9*/ u8 challengePaused : 1 ;
2020-01-08 11:43:06 +01:00
/*0xCA9*/ u8 disableRecordBattle : 1 ;
2019-11-25 22:43:43 +01:00
/*0xCAA*/ u16 selectedPartyMons [ MAX_FRONTIER_PARTY_SIZE ] ;
2019-11-24 22:58:40 +01:00
/*0xCB2*/ u16 curChallengeBattleNum ; // Battle number / room number (Pike) / floor number (Pyramid)
2019-02-07 18:37:28 +01:00
/*0xCB4*/ u16 trainerIds [ 20 ] ;
2019-11-24 22:58:40 +01:00
/*0xCDC*/ u32 winStreakActiveFlags ;
2018-10-27 21:01:35 +02:00
/*0xCE0*/ u16 towerWinStreaks [ 4 ] [ 2 ] ;
/*0xCF0*/ u16 towerRecordWinStreaks [ 4 ] [ 2 ] ;
2019-11-24 22:58:40 +01:00
/*0xD00*/ u16 battledBrainFlags ;
/*0xD02*/ u16 towerSinglesStreak ; // Never read
/*0xD04*/ u16 towerNumWins ; // Increments to MAX_STREAK but never read otherwise
/*0xD06*/ u8 towerBattleOutcome ;
/*0xD07*/ u8 towerLvlMode ;
2019-12-18 08:32:52 +01:00
/*0xD08*/ u8 domeAttemptedSingles50 : 1 ;
/*0xD08*/ u8 domeAttemptedSinglesOpen : 1 ;
/*0xD08*/ u8 domeHasWonSingles50 : 1 ;
/*0xD08*/ u8 domeHasWonSinglesOpen : 1 ;
/*0xD08*/ u8 domeAttemptedDoubles50 : 1 ;
/*0xD08*/ u8 domeAttemptedDoublesOpen : 1 ;
/*0xD08*/ u8 domeHasWonDoubles50 : 1 ;
/*0xD08*/ u8 domeHasWonDoublesOpen : 1 ;
/*0xD09*/ u8 domeUnused ;
/*0xD0A*/ u8 domeLvlMode ;
/*0xD0B*/ u8 domeBattleMode ;
2018-10-27 21:01:35 +02:00
/*0xD0C*/ u16 domeWinStreaks [ 2 ] [ 2 ] ;
/*0xD14*/ u16 domeRecordWinStreaks [ 2 ] [ 2 ] ;
/*0xD1C*/ u16 domeTotalChampionships [ 2 ] [ 2 ] ;
2018-08-15 23:04:46 +02:00
/*0xD24*/ struct BattleDomeTrainer domeTrainers [ DOME_TOURNAMENT_TRAINERS_COUNT ] ;
2019-11-01 02:33:01 +01:00
/*0xD64*/ u16 domeMonIds [ DOME_TOURNAMENT_TRAINERS_COUNT ] [ FRONTIER_PARTY_SIZE ] ;
2019-11-29 03:09:35 +01:00
/*0xDC4*/ u16 unused_DC4 ;
/*0xDC6*/ u16 palacePrize ;
2018-10-27 21:01:35 +02:00
/*0xDC8*/ u16 palaceWinStreaks [ 2 ] [ 2 ] ;
/*0xDD0*/ u16 palaceRecordWinStreaks [ 2 ] [ 2 ] ;
2019-11-29 03:09:35 +01:00
/*0xDD8*/ u16 arenaPrize ;
2018-10-27 21:01:35 +02:00
/*0xDDA*/ u16 arenaWinStreaks [ 2 ] ;
/*0xDDE*/ u16 arenaRecordStreaks [ 2 ] ;
/*0xDE2*/ u16 factoryWinStreaks [ 2 ] [ 2 ] ;
/*0xDEA*/ u16 factoryRecordWinStreaks [ 2 ] [ 2 ] ;
/*0xDF6*/ u16 factoryRentsCount [ 2 ] [ 2 ] ;
/*0xDFA*/ u16 factoryRecordRentsCount [ 2 ] [ 2 ] ;
2019-11-29 03:09:35 +01:00
/*0xE02*/ u16 pikePrize ;
2018-10-27 21:01:35 +02:00
/*0xE04*/ u16 pikeWinStreaks [ 2 ] ;
/*0xE08*/ u16 pikeRecordStreaks [ 2 ] ;
/*0xE0C*/ u16 pikeTotalStreaks [ 2 ] ;
2019-02-08 00:37:41 +01:00
/*0xE10*/ u8 pikeHintedRoomIndex : 3 ;
/*0xE10*/ u8 pikeHintedRoomType : 4 ;
/*0xE10*/ u8 pikeHealingRoomsDisabled : 1 ;
2019-11-01 02:33:01 +01:00
/*0xE12*/ u16 pikeHeldItemsBackup [ FRONTIER_PARTY_SIZE ] ;
2019-11-29 03:09:35 +01:00
/*0xE18*/ u16 pyramidPrize ;
2018-10-27 21:01:35 +02:00
/*0xE1A*/ u16 pyramidWinStreaks [ 2 ] ;
/*0xE1E*/ u16 pyramidRecordStreaks [ 2 ] ;
2019-02-07 03:01:29 +01:00
/*0xE22*/ u16 pyramidRandoms [ 4 ] ;
/*0xE2A*/ u8 pyramidTrainerFlags ;
2017-09-03 22:50:17 +02:00
/*0xE2C*/ struct PyramidBag pyramidBag ;
2019-02-07 03:01:29 +01:00
/*0xE68*/ u8 pyramidLightRadius ;
2019-11-29 03:09:35 +01:00
/*0xE6A*/ u16 verdanturfTentPrize ;
/*0xE6C*/ u16 fallarborTentPrize ;
/*0xE6E*/ u16 slateportTentPrize ;
2019-12-21 10:27:12 +01:00
/*0xE70*/ struct RentalMon rentalMons [ FRONTIER_PARTY_SIZE * 2 ] ;
2018-10-28 00:50:06 +02:00
/*0xEB8*/ u16 battlePoints ;
2019-11-24 22:58:40 +01:00
/*0xEBA*/ u16 cardBattlePoints ;
2018-10-21 20:13:12 +02:00
/*0xEBC*/ u32 battlesCount ;
2019-12-18 08:32:52 +01:00
/*0xEC0*/ u16 domeWinningMoves [ DOME_TOURNAMENT_TRAINERS_COUNT ] ;
2019-11-13 22:10:05 +01:00
/*0xEE0*/ u8 trainerFlags ;
2019-11-24 22:58:40 +01:00
/*0xEE1*/ u8 opponentNames [ 2 ] [ PLAYER_NAME_LENGTH + 1 ] ;
/*0xEF1*/ u8 opponentTrainerIds [ 2 ] [ TRAINER_ID_LENGTH ] ;
/*0xEF9*/ u8 unk_EF9 : 7 ; // Never read
2019-11-13 22:10:05 +01:00
/*0xEF9*/ u8 savedGame : 1 ;
2019-11-24 22:58:40 +01:00
/*0xEFA*/ u8 unused_EFA ;
/*0xEFB*/ u8 unused_EFB ;
2019-12-21 10:27:12 +01:00
/*0xEFC*/ struct DomeMonData domePlayerPartyData [ FRONTIER_PARTY_SIZE ] ;
2017-01-14 20:53:20 +01:00
} ;
2019-11-20 23:36:52 +01:00
struct ApprenticeQuestion
2018-10-13 20:38:46 +02:00
{
2019-11-20 23:36:52 +01:00
u8 questionId : 2 ;
u8 monId : 2 ;
u8 moveSlot : 2 ;
u8 suggestedChange : 2 ; // TRUE if told to use held item or second move, FALSE if told to use no item or first move
u16 data ; // used both as an itemId and a moveId
2018-10-13 20:38:46 +02:00
} ;
2018-10-14 16:27:48 +02:00
struct PlayersApprentice
{
/*0xB0*/ u8 id ;
2019-11-19 17:36:38 +01:00
/*0xB1*/ u8 lvlMode : 2 ; //0: Unassigned, 1: Lv 50, 2: Open Lv
/*0xB1*/ u8 questionsAnswered : 4 ;
2019-11-20 23:36:52 +01:00
/*0xB1*/ u8 leadMonId : 2 ;
/*0xB2*/ u8 party : 3 ;
2019-11-21 01:00:08 +01:00
/*0xB2*/ u8 saveId : 2 ;
2019-11-20 23:36:52 +01:00
/*0xB3*/ u8 unused ;
/*0xB4*/ u8 speciesIds [ MULTI_PARTY_SIZE ] ;
/*0xB8*/ struct ApprenticeQuestion questions [ APPRENTICE_MAX_QUESTIONS ] ;
2018-10-14 16:27:48 +02:00
} ;
2018-10-28 21:11:53 +01:00
struct RankingHall1P
{
2019-08-06 19:52:10 +02:00
u8 id [ TRAINER_ID_LENGTH ] ;
2018-10-28 21:11:53 +01:00
u16 winStreak ;
u8 name [ PLAYER_NAME_LENGTH + 1 ] ;
u8 language ;
} ;
struct RankingHall2P
{
2019-08-06 19:52:10 +02:00
u8 id1 [ TRAINER_ID_LENGTH ] ;
u8 id2 [ TRAINER_ID_LENGTH ] ;
2018-10-28 21:11:53 +01:00
u16 winStreak ;
u8 name1 [ PLAYER_NAME_LENGTH + 1 ] ;
u8 name2 [ PLAYER_NAME_LENGTH + 1 ] ;
u8 language ;
} ;
2018-06-17 12:30:09 +02:00
struct SaveBlock2
{
2018-09-01 22:03:21 +02:00
/*0x00*/ u8 playerName [ PLAYER_NAME_LENGTH + 1 ] ;
2018-06-17 12:30:09 +02:00
/*0x08*/ u8 playerGender ; // MALE, FEMALE
2018-12-27 23:30:47 +01:00
/*0x09*/ u8 specialSaveWarpFlags ;
2019-08-06 19:52:10 +02:00
/*0x0A*/ u8 playerTrainerId [ TRAINER_ID_LENGTH ] ;
2018-06-17 12:30:09 +02:00
/*0x0E*/ u16 playTimeHours ;
/*0x10*/ u8 playTimeMinutes ;
/*0x11*/ u8 playTimeSeconds ;
/*0x12*/ u8 playTimeVBlanks ;
/*0x13*/ u8 optionsButtonMode ; // OPTIONS_BUTTON_MODE_[NORMAL/LR/L_EQUALS_A]
/*0x14*/ u16 optionsTextSpeed : 3 ; // OPTIONS_TEXT_SPEED_[SLOW/MID/FAST]
u16 optionsWindowFrameType : 5 ; // Specifies one of the 20 decorative borders for text boxes
u16 optionsSound : 1 ; // OPTIONS_SOUND_[MONO/STEREO]
u16 optionsBattleStyle : 1 ; // OPTIONS_BATTLE_STYLE_[SHIFT/SET]
u16 optionsBattleSceneOff : 1 ; // whether battle animations are disabled
u16 regionMapZoom : 1 ; // whether the map is zoomed in
/*0x18*/ struct Pokedex pokedex ;
/*0x90*/ u8 filler_90 [ 0x8 ] ;
/*0x98*/ struct Time localTimeOffset ;
/*0xA0*/ struct Time lastBerryTreeUpdate ;
2020-04-13 14:42:31 +02:00
/*0xA8*/ u32 gcnLinkFlags ; // Read by Pokemon Colosseum/XD
2018-06-17 12:30:09 +02:00
/*0xAC*/ u32 encryptionKey ;
2018-10-14 16:27:48 +02:00
/*0xB0*/ struct PlayersApprentice playerApprentice ;
2019-11-15 00:56:18 +01:00
/*0xDC*/ struct Apprentice apprentices [ APPRENTICE_COUNT ] ;
2018-06-17 12:30:09 +02:00
/*0x1EC*/ struct BerryCrush berryCrush ;
/*0x1FC*/ struct PokemonJumpResults pokeJump ;
/*0x20C*/ struct BerryPickingResults berryPick ;
2018-10-28 21:11:53 +01:00
/*0x21C*/ struct RankingHall1P hallRecords1P [ HALL_FACILITIES_COUNT ] [ 2 ] [ 3 ] ; // From record mixing.
/*0x57C*/ struct RankingHall2P hallRecords2P [ 2 ] [ 3 ] ; // From record mixing.
2020-07-12 02:25:56 +02:00
/*0x624*/ u16 contestLinkResults [ CONTEST_CATEGORIES_COUNT ] [ CONTESTANT_COUNT ] ;
2018-06-17 12:30:09 +02:00
/*0x64C*/ struct BattleFrontier frontier ;
} ; // sizeof=0xF2C
2017-01-14 20:53:20 +01:00
extern struct SaveBlock2 * gSaveBlock2Ptr ;
2018-02-07 13:49:33 +01:00
struct SecretBaseParty
{
u32 personality [ PARTY_SIZE ] ;
2020-07-12 02:25:56 +02:00
u16 moves [ PARTY_SIZE * MAX_MON_MOVES ] ;
2018-02-07 13:49:33 +01:00
u16 species [ PARTY_SIZE ] ;
u16 heldItems [ PARTY_SIZE ] ;
u8 levels [ PARTY_SIZE ] ;
u8 EVs [ PARTY_SIZE ] ;
} ;
2019-04-05 23:11:24 +02:00
struct SecretBase
2017-09-02 21:43:53 +02:00
{
2017-10-24 01:21:08 +02:00
/*0x1A9C*/ u8 secretBaseId ;
2021-02-05 18:08:25 +01:00
/*0x1A9D*/ bool8 toRegister : 4 ;
2017-10-13 17:09:36 +02:00
/*0x1A9D*/ u8 gender : 1 ;
2019-04-05 23:11:24 +02:00
/*0x1A9D*/ u8 battledOwnerToday : 1 ;
/*0x1A9D*/ u8 registryStatus : 2 ;
2018-09-01 22:03:21 +02:00
/*0x1A9E*/ u8 trainerName [ PLAYER_NAME_LENGTH ] ;
2019-08-06 19:52:10 +02:00
/*0x1AA5*/ u8 trainerId [ TRAINER_ID_LENGTH ] ; // byte 0 is used for determining trainer class
2017-10-13 17:09:36 +02:00
/*0x1AA9*/ u8 language ;
2019-04-05 23:11:24 +02:00
/*0x1AAA*/ u16 numSecretBasesReceived ;
/*0x1AAC*/ u8 numTimesEntered ;
2021-02-05 18:08:25 +01:00
/*0x1AAD*/ u8 unused ;
2019-09-06 08:12:00 +02:00
/*0x1AAE*/ u8 decorations [ DECOR_MAX_SECRET_BASE ] ;
/*0x1ABE*/ u8 decorationPositions [ DECOR_MAX_SECRET_BASE ] ;
2018-02-07 13:49:33 +01:00
/*0x1AD0*/ struct SecretBaseParty party ;
2017-09-02 21:43:53 +02:00
} ;
2017-12-05 18:55:48 +01:00
# include "constants/game_stat.h"
2017-09-02 21:43:53 +02:00
# include "global.fieldmap.h"
# include "global.berry.h"
2017-10-13 17:09:36 +02:00
# include "global.tv.h"
2017-09-02 21:43:53 +02:00
# include "pokemon.h"
struct WarpData
{
s8 mapGroup ;
s8 mapNum ;
s8 warpId ;
s16 x , y ;
} ;
struct ItemSlot
{
u16 itemId ;
u16 quantity ;
} ;
struct Pokeblock
{
u8 color ;
u8 spicy ;
u8 dry ;
u8 sweet ;
u8 bitter ;
u8 sour ;
u8 feel ;
} ;
struct Roamer
{
/*0x00*/ u32 ivs ;
/*0x04*/ u32 personality ;
/*0x08*/ u16 species ;
/*0x0A*/ u16 hp ;
/*0x0C*/ u8 level ;
/*0x0D*/ u8 status ;
/*0x0E*/ u8 cool ;
/*0x0F*/ u8 beauty ;
/*0x10*/ u8 cute ;
/*0x11*/ u8 smart ;
/*0x12*/ u8 tough ;
/*0x13*/ bool8 active ;
/*0x14*/ u8 filler [ 0x8 ] ;
} ;
struct RamScriptData
{
u8 magic ;
u8 mapGroup ;
u8 mapNum ;
u8 objectId ;
u8 script [ 995 ] ;
} ;
struct RamScript
{
u32 checksum ;
struct RamScriptData data ;
} ;
struct EasyChatPair
{
u16 unk0_0 : 7 ;
u16 unk0_7 : 7 ;
u16 unk1_6 : 1 ;
u16 unk2 ;
u16 words [ 2 ] ;
} ; /*size = 0x8*/
struct MailStruct
{
2017-12-03 19:19:11 +01:00
/*0x00*/ u16 words [ MAIL_WORDS_COUNT ] ;
2018-09-01 22:03:21 +02:00
/*0x12*/ u8 playerName [ PLAYER_NAME_LENGTH + 1 ] ;
2019-08-06 19:52:10 +02:00
/*0x1A*/ u8 trainerId [ TRAINER_ID_LENGTH ] ;
2017-09-02 21:43:53 +02:00
/*0x1E*/ u16 species ;
/*0x20*/ u16 itemId ;
} ;
2018-05-02 17:31:58 +02:00
struct MauvilleManCommon
{
u8 id ;
} ;
struct MauvilleManBard
{
/*0x00*/ u8 id ;
2019-10-20 22:11:07 +02:00
/*0x02*/ u16 songLyrics [ BARD_SONG_LENGTH ] ;
/*0x0E*/ u16 temporaryLyrics [ BARD_SONG_LENGTH ] ;
/*0x1A*/ u8 playerName [ PLAYER_NAME_LENGTH + 1 ] ;
2018-05-02 17:31:58 +02:00
/*0x22*/ u8 filler_2DB6 [ 0x3 ] ;
2019-08-06 19:52:10 +02:00
/*0x25*/ u8 playerTrainerId [ TRAINER_ID_LENGTH ] ;
2018-05-02 17:31:58 +02:00
/*0x29*/ bool8 hasChangedSong ;
/*0x2A*/ u8 language ;
2017-09-02 21:43:53 +02:00
} ; /*size = 0x2C*/
2018-05-02 17:31:58 +02:00
struct MauvilleManStoryteller
{
u8 id ;
bool8 alreadyRecorded ;
u8 filler2 [ 2 ] ;
2019-10-20 22:11:07 +02:00
u8 gameStatIDs [ NUM_STORYTELLER_TALES ] ;
u8 trainerNames [ NUM_STORYTELLER_TALES ] [ PLAYER_NAME_LENGTH ] ;
u8 statValues [ NUM_STORYTELLER_TALES ] [ 4 ] ;
u8 language [ NUM_STORYTELLER_TALES ] ;
2018-05-02 17:31:58 +02:00
} ;
struct MauvilleManGiddy
2017-09-02 21:43:53 +02:00
{
2018-05-02 17:31:58 +02:00
/*0x00*/ u8 id ;
/*0x01*/ u8 taleCounter ;
/*0x02*/ u8 questionNum ;
/*0x04*/ u16 randomWords [ 10 ] ;
/*0x18*/ u8 questionList [ 8 ] ;
/*0x20*/ u8 language ;
2017-09-02 21:43:53 +02:00
} ; /*size = 0x2C*/
2018-05-02 17:31:58 +02:00
struct MauvilleManHipster
{
u8 id ;
bool8 alreadySpoken ;
u8 language ;
} ;
2017-09-02 21:43:53 +02:00
struct MauvilleOldManTrader
{
2018-05-08 00:18:00 +02:00
u8 id ;
2020-02-23 16:46:22 +01:00
u8 decorations [ NUM_TRADER_ITEMS ] ;
2019-10-20 22:11:07 +02:00
u8 playerNames [ NUM_TRADER_ITEMS ] [ 11 ] ;
2018-05-08 00:18:00 +02:00
u8 alreadyTraded ;
2019-10-20 22:11:07 +02:00
u8 language [ NUM_TRADER_ITEMS ] ;
2017-09-02 21:43:53 +02:00
} ;
typedef union OldMan
{
2018-05-02 17:31:58 +02:00
struct MauvilleManCommon common ;
struct MauvilleManBard bard ;
struct MauvilleManGiddy giddy ;
struct MauvilleManHipster hipster ;
2017-09-02 21:43:53 +02:00
struct MauvilleOldManTrader trader ;
2018-05-03 23:03:52 +02:00
struct MauvilleManStoryteller storyteller ;
2017-09-02 21:43:53 +02:00
u8 filler [ 0x40 ] ;
} OldMan ;
struct RecordMixing_UnknownStructSub
{
u32 unk0 ;
u8 data [ 0x34 ] ;
//u8 data[0x38];
} ;
struct RecordMixing_UnknownStruct
{
struct RecordMixing_UnknownStructSub data [ 2 ] ;
u32 unk70 ;
u16 unk74 [ 0x2 ] ;
} ;
2018-05-01 14:01:54 +02:00
# define LINK_B_RECORDS_COUNT 5
2017-09-02 21:43:53 +02:00
struct LinkBattleRecord
{
2018-09-01 22:03:21 +02:00
u8 name [ PLAYER_NAME_LENGTH + 1 ] ;
2017-09-02 21:43:53 +02:00
u16 trainerId ;
u16 wins ;
u16 losses ;
u16 draws ;
} ;
2018-05-01 14:01:54 +02:00
struct LinkBattleRecords
{
struct LinkBattleRecord entries [ LINK_B_RECORDS_COUNT ] ;
u8 languages [ LINK_B_RECORDS_COUNT ] ;
} ;
2017-09-02 21:43:53 +02:00
struct RecordMixingGiftData
{
u8 unk0 ;
u8 quantity ;
u16 itemId ;
u8 filler4 [ 8 ] ;
} ;
struct RecordMixingGift
{
int checksum ;
struct RecordMixingGiftData data ;
} ;
2017-09-03 22:50:17 +02:00
struct ContestWinner
{
u32 personality ;
u32 trainerId ;
u16 species ;
u8 contestCategory ;
2018-09-01 22:03:21 +02:00
u8 monName [ POKEMON_NAME_LENGTH + 1 ] ;
u8 trainerName [ PLAYER_NAME_LENGTH + 1 ] ;
2017-09-03 22:50:17 +02:00
u8 contestRank ;
} ;
2018-05-25 21:00:41 +02:00
struct DayCareMail
2017-09-04 18:26:39 +02:00
{
2018-05-25 21:00:41 +02:00
struct MailStruct message ;
2018-09-01 22:03:21 +02:00
u8 OT_name [ PLAYER_NAME_LENGTH + 1 ] ;
2017-11-14 20:23:25 +01:00
u8 monName [ POKEMON_NAME_LENGTH + 1 ] ;
u8 gameLanguage : 4 ;
u8 monLanguage : 4 ;
2017-09-04 18:26:39 +02:00
} ;
2017-11-14 20:23:25 +01:00
struct DaycareMon
{
struct BoxPokemon mon ;
2018-05-25 21:00:41 +02:00
struct DayCareMail mail ;
2017-11-14 20:23:25 +01:00
u32 steps ;
2017-09-04 18:26:39 +02:00
} ;
2017-11-14 20:23:25 +01:00
struct DayCare
2017-09-04 18:26:39 +02:00
{
2017-11-14 20:23:25 +01:00
struct DaycareMon mons [ DAYCARE_MON_COUNT ] ;
2017-09-04 18:26:39 +02:00
u32 offspringPersonality ;
u8 stepCounter ;
} ;
2017-11-14 20:23:25 +01:00
struct RecordMixingDayCareMail
{
struct DayCareMail mail [ DAYCARE_MON_COUNT ] ;
u32 numDaycareMons ;
bool16 holdsItem [ DAYCARE_MON_COUNT ] ;
} ;
2017-09-20 04:25:31 +02:00
struct LilycoveLadyQuiz
2017-09-19 22:17:23 +02:00
{
2017-09-20 04:25:31 +02:00
/*0x000*/ u8 id ;
2019-08-05 05:12:49 +02:00
/*0x001*/ u8 state ;
2019-08-04 10:22:19 +02:00
/*0x002*/ u16 question [ 9 ] ;
2019-08-06 02:37:09 +02:00
/*0x014*/ u16 correctAnswer ;
/*0x016*/ u16 playerAnswer ;
2018-09-01 22:03:21 +02:00
/*0x018*/ u8 playerName [ PLAYER_NAME_LENGTH + 1 ] ;
2019-08-06 19:52:10 +02:00
/*0x020*/ u16 playerTrainerId [ TRAINER_ID_LENGTH ] ;
2019-08-06 02:37:09 +02:00
/*0x028*/ u16 prize ;
2019-08-04 10:22:19 +02:00
/*0x02a*/ bool8 waitingForChallenger ;
/*0x02b*/ u8 questionId ;
/*0x02c*/ u8 prevQuestionId ;
2017-09-20 04:35:40 +02:00
/*0x02d*/ u8 language ;
2017-09-20 04:25:31 +02:00
} ;
2017-09-19 22:17:23 +02:00
2019-08-04 10:22:19 +02:00
struct LilycoveLadyFavor
2017-09-20 04:25:31 +02:00
{
/*0x000*/ u8 id ;
2019-08-05 05:12:49 +02:00
/*0x001*/ u8 state ;
/*0x002*/ bool8 likedItem ;
/*0x003*/ u8 numItemsGiven ;
2018-09-01 22:03:21 +02:00
/*0x004*/ u8 playerName [ PLAYER_NAME_LENGTH + 1 ] ;
2019-08-04 10:22:19 +02:00
/*0x00c*/ u8 favorId ;
2017-09-20 04:25:31 +02:00
/*0x00e*/ u16 itemId ;
2019-08-05 05:12:49 +02:00
/*0x010*/ u16 bestItem ;
2017-09-20 04:25:31 +02:00
/*0x012*/ u8 language ;
} ;
2017-09-19 22:17:23 +02:00
2017-09-20 04:25:31 +02:00
struct LilycoveLadyContest
{
/*0x000*/ u8 id ;
2019-08-04 18:00:42 +02:00
/*0x001*/ bool8 givenPokeblock ;
2019-08-06 02:37:09 +02:00
/*0x002*/ u8 numGoodPokeblocksGiven ;
/*0x003*/ u8 numOtherPokeblocksGiven ;
2018-09-01 22:03:21 +02:00
/*0x004*/ u8 playerName [ PLAYER_NAME_LENGTH + 1 ] ;
2019-08-06 02:37:09 +02:00
/*0x00c*/ u8 maxSheen ;
2017-09-20 22:49:22 +02:00
/*0x00d*/ u8 category ;
/*0x00e*/ u8 language ;
2017-09-20 04:25:31 +02:00
} ;
2017-11-03 00:26:14 +01:00
typedef union // 3b58
2017-09-20 04:25:31 +02:00
{
struct LilycoveLadyQuiz quiz ;
2019-08-04 10:38:59 +02:00
struct LilycoveLadyFavor favor ;
2017-09-20 04:25:31 +02:00
struct LilycoveLadyContest contest ;
2017-09-20 22:49:22 +02:00
u8 id ;
2017-11-04 03:26:12 +01:00
u8 pad [ 0x40 ] ;
2017-09-19 22:17:23 +02:00
} LilycoveLady ;
2017-10-20 18:52:01 +02:00
struct WaldaPhrase
{
2018-12-15 23:58:47 +01:00
u16 colors [ 2 ] ; // Background, foreground.
2017-10-20 18:52:01 +02:00
u8 text [ 16 ] ;
u8 iconId ;
u8 patternId ;
bool8 patternUnlocked ;
} ;
2019-02-15 09:40:57 +01:00
struct TrainerNameRecord
2018-12-15 23:58:47 +01:00
{
2017-12-05 01:10:37 +01:00
u32 trainerId ;
2018-09-01 22:03:21 +02:00
u8 trainerName [ PLAYER_NAME_LENGTH + 1 ] ;
2017-12-05 01:10:37 +01:00
} ;
2019-01-13 12:12:27 +01:00
struct SaveTrainerHill
{
2019-02-28 03:28:34 +01:00
/*0x3D64*/ u32 timer ;
2019-02-28 04:16:01 +01:00
/*0x3D68*/ u32 bestTime ;
2019-11-16 19:45:21 +01:00
/*0x3D6C*/ u8 unk_3D6C ;
2019-01-13 12:12:27 +01:00
/*0x3D6D*/ u8 unused ;
2019-11-13 22:10:05 +01:00
/*0x3D6E*/ u16 receivedPrize : 1 ;
/*0x3D6E*/ u16 checkedFinalTime : 1 ;
/*0x3D6E*/ u16 spokeToOwner : 1 ;
/*0x3D6E*/ u16 hasLost : 1 ;
/*0x3D6E*/ u16 maybeECardScanDuringChallenge : 1 ;
/*0x3D6E*/ u16 field_3D6E_0f : 1 ;
/*0x3D6E*/ u16 tag : 2 ;
2019-01-13 12:12:27 +01:00
} ;
2019-03-24 23:20:35 +01:00
struct MysteryEventStruct
{
u8 unk_0_0 : 2 ;
u8 unk_0_2 : 3 ;
u8 unk_0_5 : 3 ;
u8 unk_1 ;
} ;
2019-04-02 19:57:03 +02:00
struct WonderNews
2019-03-24 23:20:35 +01:00
{
u16 unk_00 ;
u8 unk_02 ;
u8 unk_03 ;
u8 unk_04 [ 40 ] ;
u8 unk_2C [ 10 ] [ 40 ] ;
} ;
2019-04-02 19:57:03 +02:00
struct WonderNewsSaveStruct
2019-03-24 23:20:35 +01:00
{
u32 crc ;
2019-04-02 19:57:03 +02:00
struct WonderNews data ;
2019-03-24 23:20:35 +01:00
} ;
2019-04-02 19:57:03 +02:00
struct WonderCard
2019-03-24 23:20:35 +01:00
{
u16 unk_00 ;
u16 unk_02 ;
u32 unk_04 ;
u8 unk_08_0 : 2 ;
u8 unk_08_2 : 4 ;
u8 unk_08_6 : 2 ;
u8 unk_09 ;
u8 unk_0A [ 40 ] ;
u8 unk_32 [ 40 ] ;
u8 unk_5A [ 4 ] [ 40 ] ;
u8 unk_FA [ 40 ] ;
u8 unk_122 [ 40 ] ;
} ;
2019-04-02 19:57:03 +02:00
struct WonderCardSaveStruct
2019-03-24 23:20:35 +01:00
{
u32 crc ;
2019-04-02 19:57:03 +02:00
struct WonderCard data ;
2019-03-24 23:20:35 +01:00
} ;
struct MEventBuffer_3430_Sub
{
u16 unk_00 ;
u16 unk_02 ;
u16 unk_04 ;
u16 unk_06 ;
u16 unk_08 [ 2 ] [ 7 ] ;
} ;
struct MEventBuffer_3430
{
u32 crc ;
struct MEventBuffer_3430_Sub data ;
} ;
struct MEventBuffers
{
2019-04-02 19:57:03 +02:00
/*0x000 0x322C*/ struct WonderNewsSaveStruct wonderNews ;
/*0x1c0 0x33EC*/ struct WonderCardSaveStruct wonderCard ;
2019-03-24 23:20:35 +01:00
/*0x310 0x353C*/ struct MEventBuffer_3430 buffer_310 ;
/*0x338 0x3564*/ u16 unk_338 [ 4 ] ;
/*0x340 0x356C*/ struct MysteryEventStruct unk_340 ;
/*0x344 0x3570*/ u32 unk_344 [ 2 ] [ 5 ] ;
} ; // 0x36C 0x3598
2021-02-15 17:40:16 +01:00
// For external event data storage. The majority of these may have never been used.
2021-02-16 21:37:58 +01:00
// In Emerald, the only known used fields are the PokeCoupon and BoxRS ones, but hacking the distribution discs allows Emerald to receive events and set the others
2021-02-15 17:40:16 +01:00
struct ExternalEventData
{
u8 unknownExternalDataFields1 [ 7 ] ; // if actually used, may be broken up into different fields.
2021-02-16 15:41:07 +01:00
u32 unknownExternalDataFields2 : 8 ;
u32 currentPokeCoupons : 24 ; // PokéCoupons stored by Pokémon Colosseum and XD from Mt. Battle runs. Earned PokéCoupons are also added to totalEarnedPokeCoupons. Colosseum/XD caps this at 9,999,999, but will read up to 16,777,215.
u32 gotGoldPokeCouponTitleReward : 1 ; // PP Max from JP Colosseum Bonus Disc; for reaching 2500 totalEarnedPokeCoupons
u32 gotSilverPokeCouponTitleReward : 1 ; // Light Ball Pikachu from JP Colosseum Bonus Disc; for reaching 5000 totalEarnedPokeCoupons
u32 gotBronzePokeCouponTitleReward : 1 ; // Master Ball from Jp Colosseum Bonus Disc; for reaching 30,000 totalEarnedPokeCoupons
u32 receivedAgetoCelebi : 1 ; // from JP Colosseum Bonus Disc
u32 unknownExternalDataFields3 : 4 ;
u32 totalEarnedPokeCoupons : 24 ; // Used by the JP Colosseum bonus disc. Determines PokéCoupon rank to distribute rewards. Unread in International games. Colosseum/XD caps this at 9,999,999.
u8 unknownExternalDataFields4 [ 5 ] ; // if actually used, may be broken up into different fields.
2021-02-16 21:37:58 +01:00
u8 usedBoxRS : 1 ; // Set by Pokémon Box: Ruby & Sapphire; denotes whether this save has connected to it and triggered the free False Swipe Swablu Egg giveaway.
u8 boxRSEggsUnlocked : 2 ; // Set by Pokémon Box: Ruby & Sapphire; denotes the number of Eggs unlocked from deposits; 1 for ExtremeSpeed Zigzagoon (at 100 deposited), 2 for Pay Day Skitty (at 500 deposited), 3 for Surf Pichu (at 1500 deposited)
u8 padding : 5 ;
} __attribute__ ( ( packed ) ) ; /*size = 0x15*/
2021-02-15 17:40:16 +01:00
// For external event flags. The majority of these may have never been used.
2021-02-16 15:41:07 +01:00
// In Emerald, Jirachi cannot normally be received, but hacking the distribution discs allows Emerald to receive Jirachi and set the flag
2021-02-15 17:40:16 +01:00
struct ExternalEventFlags
{
u8 unknownFlag1 ;
2021-02-16 15:41:07 +01:00
u8 receivedGCNJirachi ; // Both the US Colosseum Bonus Disc and PAL/AUS Pokémon Channel use this field. One cannot receive a WISHMKR Jirachi and CHANNEL Jirachi with the same savefile.
2021-02-15 17:40:16 +01:00
u8 unknownFlag3 ;
u8 unknownFlag4 ;
u8 unknownFlag5 ;
u8 unknownFlag6 ;
u8 unknownFlag7 ;
u8 unknownFlag8 ;
u8 unknownFlag9 ;
u8 unknownFlag10 ;
u8 unknownFlag11 ;
u8 unknownFlag12 ;
u8 unknownFlag13 ;
u8 unknownFlag14 ;
u8 unknownFlag15 ;
u8 unknownFlag16 ;
u8 unknownFlag17 ;
u8 unknownFlag18 ;
u8 unknownFlag19 ;
u8 unknownFlag20 ;
} ; /*size = 0x14*/
2017-09-02 21:43:53 +02:00
struct SaveBlock1
{
/*0x00*/ struct Coords16 pos ;
/*0x04*/ struct WarpData location ;
2018-12-27 23:30:47 +01:00
/*0x0C*/ struct WarpData continueGameWarp ;
/*0x14*/ struct WarpData dynamicWarp ;
/*0x1C*/ struct WarpData lastHealLocation ; // used by white-out and teleport
/*0x24*/ struct WarpData escapeWarp ; // used by Dig and Escape Rope
2018-02-12 18:26:26 +01:00
/*0x2C*/ u16 savedMusic ;
2017-09-02 21:43:53 +02:00
/*0x2E*/ u8 weather ;
2018-12-08 19:05:03 +01:00
/*0x2F*/ u8 weatherCycleStage ;
2018-02-12 18:26:26 +01:00
/*0x30*/ u8 flashLevel ;
2018-06-21 00:41:51 +02:00
/*0x32*/ u16 mapLayoutId ;
2017-09-02 21:43:53 +02:00
/*0x34*/ u16 mapView [ 0x100 ] ;
/*0x234*/ u8 playerPartyCount ;
2018-04-29 13:36:26 +02:00
/*0x238*/ struct Pokemon playerParty [ PARTY_SIZE ] ;
2017-09-02 21:43:53 +02:00
/*0x490*/ u32 money ;
/*0x494*/ u16 coins ;
/*0x496*/ u16 registeredItem ; // registered for use with SELECT button
2018-04-29 13:36:26 +02:00
/*0x498*/ struct ItemSlot pcItems [ PC_ITEMS_COUNT ] ;
/*0x560*/ struct ItemSlot bagPocket_Items [ BAG_ITEMS_COUNT ] ;
/*0x5D8*/ struct ItemSlot bagPocket_KeyItems [ BAG_KEYITEMS_COUNT ] ;
/*0x650*/ struct ItemSlot bagPocket_PokeBalls [ BAG_POKEBALLS_COUNT ] ;
/*0x690*/ struct ItemSlot bagPocket_TMHM [ BAG_TMHM_COUNT ] ;
/*0x790*/ struct ItemSlot bagPocket_Berries [ BAG_BERRIES_COUNT ] ;
2017-12-16 00:08:23 +01:00
/*0x848*/ struct Pokeblock pokeblocks [ POKEBLOCKS_COUNT ] ;
2018-05-10 09:30:42 +02:00
/*0x988*/ u8 seen1 [ DEX_FLAGS_NO ] ;
2017-09-02 21:43:53 +02:00
/*0x9BC*/ u16 berryBlenderRecords [ 3 ] ;
/*0x9C2*/ u8 field_9C2 [ 6 ] ;
/*0x9C8*/ u16 trainerRematchStepCounter ;
2019-12-05 21:33:36 +01:00
/*0x9CA*/ u8 trainerRematches [ MAX_REMATCH_ENTRIES ] ;
2019-11-21 05:12:51 +01:00
/*0xA30*/ struct ObjectEvent objectEvents [ OBJECT_EVENTS_COUNT ] ;
/*0xC70*/ struct ObjectEventTemplate objectEventTemplates [ OBJECT_EVENT_TEMPLATES_COUNT ] ;
2020-06-24 23:00:19 +02:00
/*0x1270*/ u8 flags [ NUM_FLAG_BYTES ] ;
2017-09-13 19:30:05 +02:00
/*0x139C*/ u16 vars [ VARS_COUNT ] ;
2017-09-03 22:50:17 +02:00
/*0x159C*/ u32 gameStats [ NUM_GAME_STATS ] ;
2017-09-13 19:30:05 +02:00
/*0x169C*/ struct BerryTree berryTrees [ BERRY_TREES_COUNT ] ;
2019-04-05 23:11:24 +02:00
/*0x1A9C*/ struct SecretBase secretBases [ SECRET_BASES_COUNT ] ;
2020-02-23 16:46:22 +01:00
/*0x271C*/ u8 playerRoomDecorations [ DECOR_MAX_PLAYERS_HOUSE ] ;
/*0x2728*/ u8 playerRoomDecorationPositions [ DECOR_MAX_PLAYERS_HOUSE ] ;
/*0x2734*/ u8 decorationDesks [ 10 ] ;
/*0x273E*/ u8 decorationChairs [ 10 ] ;
/*0x2748*/ u8 decorationPlants [ 10 ] ;
/*0x2752*/ u8 decorationOrnaments [ 30 ] ;
/*0x2770*/ u8 decorationMats [ 30 ] ;
/*0x278E*/ u8 decorationPosters [ 10 ] ;
/*0x2798*/ u8 decorationDolls [ 40 ] ;
/*0x27C0*/ u8 decorationCushions [ 10 ] ;
2017-09-03 22:50:17 +02:00
/*0x27CA*/ u8 padding_27CA [ 2 ] ;
2018-05-26 00:25:36 +02:00
/*0x27CC*/ TVShow tvShows [ TV_SHOWS_COUNT ] ;
/*0x2B50*/ PokeNews pokeNews [ POKE_NEWS_COUNT ] ;
2017-09-03 22:50:17 +02:00
/*0x2B90*/ u16 outbreakPokemonSpecies ;
2017-10-13 17:09:36 +02:00
/*0x2B92*/ u8 outbreakLocationMapNum ;
/*0x2B93*/ u8 outbreakLocationMapGroup ;
/*0x2B94*/ u8 outbreakPokemonLevel ;
/*0x2B95*/ u8 outbreakUnk1 ;
/*0x2B96*/ u16 outbreakUnk2 ;
2019-09-08 17:53:48 +02:00
/*0x2B98*/ u16 outbreakPokemonMoves [ MAX_MON_MOVES ] ;
2017-10-13 17:09:36 +02:00
/*0x2BA0*/ u8 outbreakUnk4 ;
/*0x2BA1*/ u8 outbreakPokemonProbability ;
/*0x2BA2*/ u16 outbreakDaysLeft ;
2017-09-03 22:50:17 +02:00
/*0x2BA4*/ struct GabbyAndTyData gabbyAndTyData ;
2019-11-15 00:56:18 +01:00
/*0x2BB0*/ u16 easyChatProfile [ EASY_CHAT_BATTLE_WORDS_COUNT ] ;
/*0x2BBC*/ u16 easyChatBattleStart [ EASY_CHAT_BATTLE_WORDS_COUNT ] ;
/*0x2BC8*/ u16 easyChatBattleWon [ EASY_CHAT_BATTLE_WORDS_COUNT ] ;
/*0x2BD4*/ u16 easyChatBattleLost [ EASY_CHAT_BATTLE_WORDS_COUNT ] ;
2017-11-14 20:23:25 +01:00
/*0x2BE0*/ struct MailStruct mail [ MAIL_COUNT ] ;
2019-02-26 18:17:41 +01:00
/*0x2E20*/ u8 additionalPhrases [ 8 ] ; // bitfield for 33 additional phrases in easy chat system
2017-09-03 22:50:17 +02:00
/*0x2E28*/ OldMan oldMan ;
/*0x2e64*/ struct EasyChatPair easyChatPairs [ 5 ] ; //Dewford trend [0] and some other stuff
2020-06-17 23:48:20 +02:00
/*0x2e90*/ struct ContestWinner contestWinners [ NUM_CONTEST_WINNERS ] ; // see CONTEST_WINNER_*
2017-11-14 20:23:25 +01:00
/*0x3030*/ struct DayCare daycare ;
2018-05-01 14:01:54 +02:00
/*0x3150*/ struct LinkBattleRecords linkBattleRecords ;
2021-02-15 17:40:16 +01:00
/*0x31A8*/ u8 giftRibbons [ 11 ] ;
/*0x31B3*/ struct ExternalEventData externalEventData ;
/*0x31C7*/ struct ExternalEventFlags externalEventFlags ;
2017-09-03 22:50:17 +02:00
/*0x31DC*/ struct Roamer roamer ;
/*0x31F8*/ struct EnigmaBerry enigmaBerry ;
2019-03-24 23:20:35 +01:00
/*0x322C*/ struct MEventBuffers unk_322C ;
/*0x3598*/ u8 field_3598 [ 0x180 ] ;
2019-01-13 13:15:23 +01:00
/*0x3718*/ u32 trainerHillTimes [ 4 ] ;
2017-09-04 18:26:39 +02:00
/*0x3728*/ struct RamScript ramScript ;
/*0x3B14*/ struct RecordMixingGift recordMixingGift ;
2018-05-10 09:30:42 +02:00
/*0x3B24*/ u8 seen2 [ DEX_FLAGS_NO ] ;
2017-09-20 04:25:31 +02:00
/*0x3B58*/ LilycoveLady lilycoveLady ;
2019-02-15 09:40:57 +01:00
/*0x3B98*/ struct TrainerNameRecord trainerNameRecords [ 20 ] ;
2020-06-01 20:05:29 +02:00
/*0x3C88*/ u8 registeredTexts [ UNION_ROOM_KB_ROW_COUNT ] [ 21 ] ;
2019-03-27 01:03:46 +01:00
/*0x3D5A*/ u8 filler3D5A [ 0xA ] ;
2019-01-13 12:12:27 +01:00
/*0x3D64*/ struct SaveTrainerHill trainerHill ;
2017-10-20 18:52:01 +02:00
/*0x3D70*/ struct WaldaPhrase waldaPhrase ;
2017-09-04 18:26:39 +02:00
// sizeof: 0x3D88
2017-09-02 21:43:53 +02:00
} ;
extern struct SaveBlock1 * gSaveBlock1Ptr ;
2018-02-12 15:01:43 +01:00
struct MapPosition
{
s16 x ;
s16 y ;
2018-06-16 14:04:29 +02:00
s8 height ;
2018-02-12 15:01:43 +01:00
} ;
2019-02-10 09:54:50 +01:00
struct TradeRoomPlayer
2018-02-12 15:01:43 +01:00
{
2019-02-10 09:54:50 +01:00
u8 playerId ;
2019-02-18 07:03:44 +01:00
u8 isLocalPlayer ;
2018-02-12 15:01:43 +01:00
u8 c ;
2019-02-10 06:50:46 +01:00
u8 facing ;
2019-02-10 09:54:50 +01:00
struct MapPosition pos ;
2018-02-12 15:01:43 +01:00
u16 field_C ;
} ;
2016-01-08 10:08:16 +01:00
# endif // GUARD_GLOBAL_H