pokeemerald/include/global.h

1071 lines
32 KiB
C
Raw Normal View History

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"
#include "fpmath.h"
#include "constants/global.h"
#include "constants/flags.h"
#include "constants/vars.h"
2020-10-01 23:20:38 +02:00
#include "constants/species.h"
#include "constants/pokedex.h"
2021-02-05 21:25:12 +01:00
#include "constants/berry.h"
#include "constants/maps.h"
#include "constants/pokemon.h"
#include "constants/easy_chat.h"
2022-03-04 17:02:19 +01:00
#include "constants/trainer_hill.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_unified(x) asm(".syntax unified\n" x "\n.syntax divided")
#define NAKED __attribute__((naked))
2017-01-15 00:17:51 +01:00
2021-10-23 11:10:00 +02:00
/// IDE support
#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__INTELLISENSE__)
// We define these when using certain IDEs to fool preproc
#define _(x) {x}
#define __(x) {x}
2021-10-23 11:10:00 +02:00
#define INCBIN(...) {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
#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; \
}
#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) >= (b) ? (a) : (b))
#if MODERN
#define abs(x) (((x) < 0) ? -(x) : (x))
#endif
2021-03-19 23:17:43 +01:00
// Used in cases where division by 0 can occur in the retail version.
// Avoids invalid opcodes on some emulators, and the otherwise UB.
#ifdef UBFIX
#define SAFE_DIV(a, b) ((b) ? (a) / (b) : 0)
#else
#define SAFE_DIV(a, b) ((a) / (b))
#endif
2023-08-16 22:44:45 +02:00
// The below macro does a%n, but (to match) will switch to a&(n-1) if n is a power of 2.
// There are cases where GF does a&(n-1) where we would really like to have a%n, because
// if n is changed to a value that isn't a power of 2 then a&(n-1) is unlikely to work as
// intended, and a%n for powers of 2 isn't always optimized to use &.
#define MOD(a, n)(((n) & ((n)-1)) ? ((a) % (n)) : ((a) & ((n)-1)))
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)
2017-11-29 19:54:15 +01:00
// 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))
2022-07-29 16:52:35 +02:00
#define T2_READ_PTR(ptr) (void *) T2_READ_32(ptr)
2017-11-29 19:54:15 +01:00
2019-03-25 03:56:16 +01:00
// Macros for checking the joypad
#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; \
})
2021-11-01 17:02:08 +01:00
#define DIV_ROUND_UP(val, roundBy)(((val) / (roundBy)) + (((val) % (roundBy)) ? 1 : 0))
2021-11-01 17:02:08 +01:00
#define ROUND_BITS_TO_BYTES(numBits) DIV_ROUND_UP(numBits, 8)
#define NUM_DEX_FLAG_BYTES ROUND_BITS_TO_BYTES(POKEMON_SLOTS_NUMBER)
2021-11-01 17:02:08 +01:00
#define NUM_FLAG_BYTES ROUND_BITS_TO_BYTES(FLAGS_COUNT)
2023-03-13 20:37:46 +01:00
#define NUM_TRENDY_SAYING_BYTES ROUND_BITS_TO_BYTES(NUM_TRENDY_SAYINGS)
// Calls m0/m1/.../m8 depending on how many arguments are passed.
#define VARARG_8(m, ...) CAT(m, NARG_8(__VA_ARGS__))(__VA_ARGS__)
// This returns the number of arguments passed to it (up to 8).
#define NARG_8(...) NARG_8_(_, ##__VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1, 0)
#define NARG_8_(_, a, b, c, d, e, f, g, h, N, ...) N
#define CAT(a, b) CAT_(a, b)
#define CAT_(a, b) a ## b
#define STR(a) STR_(a)
#define STR_(a) #a
// Converts a string to a compound literal, essentially making it a pointer to const u8
#define COMPOUND_STRING(str) (const u8[]) _(str)
// This produces an error at compile-time if expr is zero.
// It looks like file.c:line: size of array `id' is negative
#define STATIC_ASSERT(expr, id) typedef char id[(expr) ? 1 : -1];
2023-09-08 04:18:18 +02:00
#define FEATURE_FLAG_ASSERT(flag, id) STATIC_ASSERT(flag > TEMP_FLAGS_END || flag == 0, id)
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;
/*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;
2019-05-14 11:54:58 +02:00
/*0x10*/ u8 filler[0x68]; // Previously Dex Flags, feel free to remove.
2017-09-02 22:31:37 +02:00
};
2021-02-25 10:37:25 +01:00
struct PokemonJumpRecords
2017-09-03 22:50:17 +02:00
{
u16 jumpsInRow;
2021-02-25 10:37:25 +01:00
u16 unused1; // Set to 0, never read
2017-09-03 22:50:17 +02:00
u16 excellentsInRow;
2021-02-25 10:37:25 +01:00
u16 gamesWithMaxPlayers;
u32 unused2; // Set to 0, never read
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
};
struct PyramidBag
{
2021-10-23 16:55:46 +02:00
u16 itemId[FRONTIER_LVL_MODE_COUNT][PYRAMID_BAG_ITEMS_COUNT];
u8 quantity[FRONTIER_LVL_MODE_COUNT][PYRAMID_BAG_ITEMS_COUNT];
2017-09-03 22:50:17 +02:00
};
2017-09-08 16:46:37 +02:00
struct BerryCrush
{
2021-03-16 10:40:42 +01:00
u16 pressingSpeeds[4]; // For the record with each possible group size, 2-5 players
2017-09-08 16:46:37 +02:00
u32 berryPowderAmount;
u32 unk;
};
struct ApprenticeMon
{
u16 species;
2019-09-08 17:53:48 +02:00
u16 moves[MAX_MON_MOVES];
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
struct Apprentice
2018-05-25 21:00:41 +02:00
{
2018-10-14 14:35:51 +02:00
u8 id:5;
u8 lvlMode:2;
//u8 padding1:1;
2019-11-20 23:36:52 +01:00
u8 numQuestions;
2018-10-14 14:35:51 +02:00
u8 number;
//u8 padding2;
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;
u32 checksum;
2018-05-25 21:00:41 +02: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;
};
struct EmeraldBattleTowerRecord
{
/*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;
/*0xE7*/ //u8 padding[3];
2018-05-26 00:25:36 +02:00
/*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;
};
2020-07-11 14:07:10 +02:00
// For displaying party information on the player's Battle Dome tourney page
2019-12-21 10:27:12 +01:00
struct DomeMonData
2018-08-15 15:49:50 +02:00
{
2019-09-08 17:53:48 +02:00
u16 moves[MAX_MON_MOVES];
u8 evs[NUM_STATS];
2018-08-15 15:49:50 +02:00
u8 nature;
//u8 padding;
2018-08-15 15:49:50 +02:00
};
2019-02-07 19:58:09 +01:00
struct RentalMon
2018-08-26 15:27:06 +02:00
{
u16 monId;
//u8 padding1[2];
2018-09-03 22:55:55 +02:00
u32 personality;
u8 ivs;
2019-05-14 15:22:16 +02:00
u8 abilityNum;
//u8 padding2[2];
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;
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
#define BATTLE_TOWER_RECORD_COUNT 5
2018-08-15 23:04:46 +02:00
struct BattleFrontier
2017-01-14 20:53:20 +01:00
{
2018-10-21 20:13:12 +02:00
/*0x64C*/ struct EmeraldBattleTowerRecord towerPlayer;
/*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;
u8 challengePaused:1;
u8 disableRecordBattle:1;
//u8 padding1:4;
/*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;
2021-10-23 16:55:46 +02:00
/*0xCE0*/ u16 towerWinStreaks[4][FRONTIER_LVL_MODE_COUNT];
/*0xCF0*/ u16 towerRecordWinStreaks[4][FRONTIER_LVL_MODE_COUNT];
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;
/*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;
2021-10-23 16:55:46 +02:00
/*0xD0C*/ u16 domeWinStreaks[2][FRONTIER_LVL_MODE_COUNT];
/*0xD14*/ u16 domeRecordWinStreaks[2][FRONTIER_LVL_MODE_COUNT];
/*0xD1C*/ u16 domeTotalChampionships[2][FRONTIER_LVL_MODE_COUNT];
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];
/*0xDC4*/ u16 unused_DC4;
/*0xDC6*/ u16 palacePrize;
2021-10-23 16:55:46 +02:00
/*0xDC8*/ u16 palaceWinStreaks[2][FRONTIER_LVL_MODE_COUNT];
/*0xDD0*/ u16 palaceRecordWinStreaks[2][FRONTIER_LVL_MODE_COUNT];
/*0xDD8*/ u16 arenaPrize;
2021-10-23 16:55:46 +02:00
/*0xDDA*/ u16 arenaWinStreaks[FRONTIER_LVL_MODE_COUNT];
/*0xDDE*/ u16 arenaRecordStreaks[FRONTIER_LVL_MODE_COUNT];
/*0xDE2*/ u16 factoryWinStreaks[2][FRONTIER_LVL_MODE_COUNT];
/*0xDEA*/ u16 factoryRecordWinStreaks[2][FRONTIER_LVL_MODE_COUNT];
/*0xDF6*/ u16 factoryRentsCount[2][FRONTIER_LVL_MODE_COUNT];
/*0xDFA*/ u16 factoryRecordRentsCount[2][FRONTIER_LVL_MODE_COUNT];
/*0xE02*/ u16 pikePrize;
2021-10-23 16:55:46 +02:00
/*0xE04*/ u16 pikeWinStreaks[FRONTIER_LVL_MODE_COUNT];
/*0xE08*/ u16 pikeRecordStreaks[FRONTIER_LVL_MODE_COUNT];
/*0xE0C*/ u16 pikeTotalStreaks[FRONTIER_LVL_MODE_COUNT];
2019-02-08 00:37:41 +01:00
/*0xE10*/ u8 pikeHintedRoomIndex:3;
u8 pikeHintedRoomType:4;
u8 pikeHealingRoomsDisabled:1;
/*0xE11*/ //u8 padding2;
2019-11-01 02:33:01 +01:00
/*0xE12*/ u16 pikeHeldItemsBackup[FRONTIER_PARTY_SIZE];
/*0xE18*/ u16 pyramidPrize;
2021-10-23 16:55:46 +02:00
/*0xE1A*/ u16 pyramidWinStreaks[FRONTIER_LVL_MODE_COUNT];
/*0xE1E*/ u16 pyramidRecordStreaks[FRONTIER_LVL_MODE_COUNT];
2019-02-07 03:01:29 +01:00
/*0xE22*/ u16 pyramidRandoms[4];
/*0xE2A*/ u8 pyramidTrainerFlags; // 1 bit for each trainer (MAX_PYRAMID_TRAINERS)
/*0xE2B*/ //u8 padding3;
2017-09-03 22:50:17 +02:00
/*0xE2C*/ struct PyramidBag pyramidBag;
2019-02-07 03:01:29 +01:00
/*0xE68*/ u8 pyramidLightRadius;
/*0xE69*/ //u8 padding4;
/*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;
/*0xEC0*/ u16 domeWinningMoves[DOME_TOURNAMENT_TRAINERS_COUNT];
2019-11-13 22:10:05 +01:00
/*0xEE0*/ u8 trainerFlags;
2021-10-23 16:55:46 +02:00
/*0xEE1*/ u8 opponentNames[FRONTIER_LVL_MODE_COUNT][PLAYER_NAME_LENGTH + 1];
/*0xEF1*/ u8 opponentTrainerIds[FRONTIER_LVL_MODE_COUNT][TRAINER_ID_LENGTH];
2019-11-24 22:58:40 +01:00
/*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
{
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
//u8 padding;
2019-11-20 23:36:52 +01:00
u16 data; // used both as an itemId and a moveId
};
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;
u8 saveId:2;
//u8 padding1:3;
2019-11-20 23:36:52 +01:00
/*0xB3*/ u8 unused;
/*0xB4*/ u8 speciesIds[MULTI_PARTY_SIZE];
/*0xB7*/ //u8 padding2;
2019-11-20 23:36:52 +01:00
/*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;
//u8 padding;
2018-10-28 21:11:53 +01:00
};
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;
//u8 padding;
2018-10-28 21:11:53 +01:00
};
struct SaveBlock2
{
2018-09-01 22:03:21 +02:00
/*0x00*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
/*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];
/*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
//u16 padding1:4;
//u16 padding2;
/*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
/*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];
/*0x1EC*/ struct BerryCrush berryCrush;
2021-02-25 10:37:25 +01:00
/*0x1FC*/ struct PokemonJumpRecords pokeJump;
/*0x20C*/ struct BerryPickingResults berryPick;
2021-10-23 16:55:46 +02:00
/*0x21C*/ struct RankingHall1P hallRecords1P[HALL_FACILITIES_COUNT][FRONTIER_LVL_MODE_COUNT][HALL_RECORDS_COUNT]; // From record mixing.
/*0x57C*/ struct RankingHall2P hallRecords2P[FRONTIER_LVL_MODE_COUNT][HALL_RECORDS_COUNT]; // From record mixing.
2020-07-12 02:25:56 +02:00
/*0x624*/ u16 contestLinkResults[CONTEST_CATEGORIES_COUNT][CONTESTANT_COUNT];
/*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;
Decompile TV (#80) * ClearTVShowData * special_0x44 * DoTVShow (nonmatching because align) * DoTVShowBravoTrainerPokemonProfile * Update field names * DoTVShowBravoTrainerBattleTower * Renaming of struct fields * sub_80EBFF4 and UpdateTVScreensOnMap * SetTVMetatilesOnMap * Power buttons for the TV screens on the map * special_0x45 * sub_80EC18C * special_0x4a * ResetGabbyAndTy * GabbyAndTyBeforeInterview * GabbyAndTyAfterInterview * Through IsTVShowInSearchOfTrainersAiring * GabbyAndTyGetLastQuote * GabbyAndTyGetLastBattleTrivia * GabbyAndTySetScriptVarsToFieldObjectLocalIds * InterviewAfter; use TVShow as a precursor for making the individual show structs anonymous * Make TV structs anonymous within the union * Move the TV union to its own subheader * Move TV show enums to the global.tv.h subheader * Funcion renaming * Apply static attributes where able * PutPokemonTodayCaughtOnAir * sub_80EC8A4 * PutPokemonTodayFailedOnTheAir * sub_80EC9E8, sub_80ECA10 * sub_80ECA38 * sub_80ECB00 * Put3CheersForPokeblocksOnTheAir * PutFanClubSpecialOnTheAir * ContestLiveUpdates_BeforeInterview * Other before-interview Contest Live Updates functions * ContestLiveUpdates_BeforeInterview_5 * InterviewAfter_BravoTrainerPokemonProfile * BravoTrainerPokemonProfile_BeforeInterview1 * BravoTrainerPokemonProfile_BeforeInterview2 * Disassemble TV data * Decompile TV data * InterviewAfter_BravoTrainerBattleTowerProfile * SaveRecordedItemPurchasesForTVShow * PutNameRaterShowOnTheAir * StartMassOutbreak * PutLilycoveContestLadyShowOnTheAir * InterviewAfter_FanClubLetter * Rip TV strings * InterviewAfter_RecentHappenings * InterviewAfter_PkmnFanClubOpinions * sub_80ED718 * EndMassOutbreak * sub_80ED888 * sub_80ED8B4 * UpdateMassOutbreakTimeLeft * sub_80ED950 * PutFishingAdviceShowOnTheAir * through sub_80EDA80 * ewram and common syms are now fetched from the object files * BSS symbols are taken from the tv.o file * through sub_80EDC60 * sub_80EDCE8 * sub_80EDD78 * through sub_80EDE84 * nomatching sub_80EDE98 * sub_80EDFB4 * sub_80EE104 * sub_80EE104 * sub_80EE184 * sub_80EE2CC * sub_80EE35C * sub_80EE44C * sub_80EE4DC * sub_80EE5A4 * sub_80EE69C * sub_80EE72C * sub_80EE7C0 * sub_80EE818 * sub_80EE8C8 * sub_80EEA70 * sub_80EEB98 * sub_80EEBF4 * through sub_80EED60 * Functions relating to Pokemon News * sub_80EEF6C * GetPriceReduction * IsPriceDiscounted * sub_80EF120 * through sub_80EF370 * sub_80EF40C * HasMixableShowAlreadyBeenSpawnedWithPlayerID * TV_SortPurchasesByQuantity * FindActiveBroadcastByShowType_SetScriptResult * InterviewBefore * through sub_80EF88C * through sub_80EF93C * through sub_80EFA24 * through TV_BernoulliTrial * sub_80EFB58 * sub_80EFBA4 * sub_80EFBDC * through sub_80EFD98 * ChangePokemonNickname * ChangeBoxPokemonNickname * sub_80EFF9C * through player_id_to_dword * CheckForBigMovieOrEmergencyNewsOnTV * GetMomOrDadStringForTVMessage * sub_80F01E8 * sub_80F0358 * sub_80F049C * TV record mixing functions * sub_80F06D0 * sub_80F0708 nonmatching * through sub_80F0B24 * sub_80F0B64 * through sub_80F0C04 * sub_80F0C7C * sub_80F0D60 * sub_80F0E58 * sub_80F0E84 * through sub_80F0F24 * sub_80F0F64 * sub_80F1208 * sub_80F1254 * sub_80F1290 * sub_80F12A4 * sub_80F14F8 * DoTVShowTodaysSmartShopper * DoTVShowTheNameRaterShow * DoTVShowPokemonTodaySuccessfulCapture * DoTVShowPokemonTodayFailedCapture * DoTVShowPokemonFanClubLetter * DoTVShowRecentHappenings * DoTVShowPokemonFanClubOpinions * DoTVShowPokemonNewsMassOutbreak * DoTVShowPokemonContestLiveUpdates * DoTVShowPokemonBattleUpdate * DoTVShow3CheersForPokeblocks * DoTVShowInSearchOfTrainers * Label GabbyAndTyData fields; remove ddump comments from data/text/tv.inc * DoTVShowPokemonAngler * DoTVShowTheWorldOfMasters; update RAM symbols and field names * Decorate static functions * DoTVShowTodaysRivalTrainer; region map enums * TVDewfordTrendWatcherNetworkTextGroup * DoTVShowHoennTreasureInvestigators * DoTVShowFindThatGamer * DoTVShowBreakingNewsTV * DoTVShowSecretBaseVisit * DoTVShowPokemonLotterWinnerFlashReport * DoTVShowThePokemonBattleSeminar * DoTVShowTrainerFanClubSpecial, DoTVShowTrainerFanClub * DoTVShowSpotTheCuties * DoTVShowPokemonNewsBattleFrontier * DoTVShowWhatsNo1InHoennToday * Helpers for DoTVShowSecretBaseSecrets * DoTVShowSecretBaseSecrets * DoTVShowSafariFanClub * Finish decompilation of tv.s * Some renaming * Rename text group pointers * revoke statis; pokenews enums * Labels are number one * Label all TV struct fields * Make data/text/tv.inc more readable * Split data/text/tv.inc * Rename pokenews text pointers * Frontier Symbol constants; indicate static rodata objects with 's' prefix * Fix leading spaces/tabs F*** CLion sometimes * Fix inconsequential warning
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
Decompile TV (#80) * ClearTVShowData * special_0x44 * DoTVShow (nonmatching because align) * DoTVShowBravoTrainerPokemonProfile * Update field names * DoTVShowBravoTrainerBattleTower * Renaming of struct fields * sub_80EBFF4 and UpdateTVScreensOnMap * SetTVMetatilesOnMap * Power buttons for the TV screens on the map * special_0x45 * sub_80EC18C * special_0x4a * ResetGabbyAndTy * GabbyAndTyBeforeInterview * GabbyAndTyAfterInterview * Through IsTVShowInSearchOfTrainersAiring * GabbyAndTyGetLastQuote * GabbyAndTyGetLastBattleTrivia * GabbyAndTySetScriptVarsToFieldObjectLocalIds * InterviewAfter; use TVShow as a precursor for making the individual show structs anonymous * Make TV structs anonymous within the union * Move the TV union to its own subheader * Move TV show enums to the global.tv.h subheader * Funcion renaming * Apply static attributes where able * PutPokemonTodayCaughtOnAir * sub_80EC8A4 * PutPokemonTodayFailedOnTheAir * sub_80EC9E8, sub_80ECA10 * sub_80ECA38 * sub_80ECB00 * Put3CheersForPokeblocksOnTheAir * PutFanClubSpecialOnTheAir * ContestLiveUpdates_BeforeInterview * Other before-interview Contest Live Updates functions * ContestLiveUpdates_BeforeInterview_5 * InterviewAfter_BravoTrainerPokemonProfile * BravoTrainerPokemonProfile_BeforeInterview1 * BravoTrainerPokemonProfile_BeforeInterview2 * Disassemble TV data * Decompile TV data * InterviewAfter_BravoTrainerBattleTowerProfile * SaveRecordedItemPurchasesForTVShow * PutNameRaterShowOnTheAir * StartMassOutbreak * PutLilycoveContestLadyShowOnTheAir * InterviewAfter_FanClubLetter * Rip TV strings * InterviewAfter_RecentHappenings * InterviewAfter_PkmnFanClubOpinions * sub_80ED718 * EndMassOutbreak * sub_80ED888 * sub_80ED8B4 * UpdateMassOutbreakTimeLeft * sub_80ED950 * PutFishingAdviceShowOnTheAir * through sub_80EDA80 * ewram and common syms are now fetched from the object files * BSS symbols are taken from the tv.o file * through sub_80EDC60 * sub_80EDCE8 * sub_80EDD78 * through sub_80EDE84 * nomatching sub_80EDE98 * sub_80EDFB4 * sub_80EE104 * sub_80EE104 * sub_80EE184 * sub_80EE2CC * sub_80EE35C * sub_80EE44C * sub_80EE4DC * sub_80EE5A4 * sub_80EE69C * sub_80EE72C * sub_80EE7C0 * sub_80EE818 * sub_80EE8C8 * sub_80EEA70 * sub_80EEB98 * sub_80EEBF4 * through sub_80EED60 * Functions relating to Pokemon News * sub_80EEF6C * GetPriceReduction * IsPriceDiscounted * sub_80EF120 * through sub_80EF370 * sub_80EF40C * HasMixableShowAlreadyBeenSpawnedWithPlayerID * TV_SortPurchasesByQuantity * FindActiveBroadcastByShowType_SetScriptResult * InterviewBefore * through sub_80EF88C * through sub_80EF93C * through sub_80EFA24 * through TV_BernoulliTrial * sub_80EFB58 * sub_80EFBA4 * sub_80EFBDC * through sub_80EFD98 * ChangePokemonNickname * ChangeBoxPokemonNickname * sub_80EFF9C * through player_id_to_dword * CheckForBigMovieOrEmergencyNewsOnTV * GetMomOrDadStringForTVMessage * sub_80F01E8 * sub_80F0358 * sub_80F049C * TV record mixing functions * sub_80F06D0 * sub_80F0708 nonmatching * through sub_80F0B24 * sub_80F0B64 * through sub_80F0C04 * sub_80F0C7C * sub_80F0D60 * sub_80F0E58 * sub_80F0E84 * through sub_80F0F24 * sub_80F0F64 * sub_80F1208 * sub_80F1254 * sub_80F1290 * sub_80F12A4 * sub_80F14F8 * DoTVShowTodaysSmartShopper * DoTVShowTheNameRaterShow * DoTVShowPokemonTodaySuccessfulCapture * DoTVShowPokemonTodayFailedCapture * DoTVShowPokemonFanClubLetter * DoTVShowRecentHappenings * DoTVShowPokemonFanClubOpinions * DoTVShowPokemonNewsMassOutbreak * DoTVShowPokemonContestLiveUpdates * DoTVShowPokemonBattleUpdate * DoTVShow3CheersForPokeblocks * DoTVShowInSearchOfTrainers * Label GabbyAndTyData fields; remove ddump comments from data/text/tv.inc * DoTVShowPokemonAngler * DoTVShowTheWorldOfMasters; update RAM symbols and field names * Decorate static functions * DoTVShowTodaysRivalTrainer; region map enums * TVDewfordTrendWatcherNetworkTextGroup * DoTVShowHoennTreasureInvestigators * DoTVShowFindThatGamer * DoTVShowBreakingNewsTV * DoTVShowSecretBaseVisit * DoTVShowPokemonLotterWinnerFlashReport * DoTVShowThePokemonBattleSeminar * DoTVShowTrainerFanClubSpecial, DoTVShowTrainerFanClub * DoTVShowSpotTheCuties * DoTVShowPokemonNewsBattleFrontier * DoTVShowWhatsNo1InHoennToday * Helpers for DoTVShowSecretBaseSecrets * DoTVShowSecretBaseSecrets * DoTVShowSafariFanClub * Finish decompilation of tv.s * Some renaming * Rename text group pointers * revoke statis; pokenews enums * Labels are number one * Label all TV struct fields * Make data/text/tv.inc more readable * Split data/text/tv.inc * Rename pokenews text pointers * Frontier Symbol constants; indicate static rodata objects with 's' prefix * Fix leading spaces/tabs F*** CLion sometimes * Fix inconsequential warning
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;
/*0x1AAE*/ u8 decorations[DECOR_MAX_SECRET_BASE];
/*0x1ABE*/ u8 decorationPositions[DECOR_MAX_SECRET_BASE];
/*0x1ACE*/ //u8 padding[2];
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"
Decompile TV (#80) * ClearTVShowData * special_0x44 * DoTVShow (nonmatching because align) * DoTVShowBravoTrainerPokemonProfile * Update field names * DoTVShowBravoTrainerBattleTower * Renaming of struct fields * sub_80EBFF4 and UpdateTVScreensOnMap * SetTVMetatilesOnMap * Power buttons for the TV screens on the map * special_0x45 * sub_80EC18C * special_0x4a * ResetGabbyAndTy * GabbyAndTyBeforeInterview * GabbyAndTyAfterInterview * Through IsTVShowInSearchOfTrainersAiring * GabbyAndTyGetLastQuote * GabbyAndTyGetLastBattleTrivia * GabbyAndTySetScriptVarsToFieldObjectLocalIds * InterviewAfter; use TVShow as a precursor for making the individual show structs anonymous * Make TV structs anonymous within the union * Move the TV union to its own subheader * Move TV show enums to the global.tv.h subheader * Funcion renaming * Apply static attributes where able * PutPokemonTodayCaughtOnAir * sub_80EC8A4 * PutPokemonTodayFailedOnTheAir * sub_80EC9E8, sub_80ECA10 * sub_80ECA38 * sub_80ECB00 * Put3CheersForPokeblocksOnTheAir * PutFanClubSpecialOnTheAir * ContestLiveUpdates_BeforeInterview * Other before-interview Contest Live Updates functions * ContestLiveUpdates_BeforeInterview_5 * InterviewAfter_BravoTrainerPokemonProfile * BravoTrainerPokemonProfile_BeforeInterview1 * BravoTrainerPokemonProfile_BeforeInterview2 * Disassemble TV data * Decompile TV data * InterviewAfter_BravoTrainerBattleTowerProfile * SaveRecordedItemPurchasesForTVShow * PutNameRaterShowOnTheAir * StartMassOutbreak * PutLilycoveContestLadyShowOnTheAir * InterviewAfter_FanClubLetter * Rip TV strings * InterviewAfter_RecentHappenings * InterviewAfter_PkmnFanClubOpinions * sub_80ED718 * EndMassOutbreak * sub_80ED888 * sub_80ED8B4 * UpdateMassOutbreakTimeLeft * sub_80ED950 * PutFishingAdviceShowOnTheAir * through sub_80EDA80 * ewram and common syms are now fetched from the object files * BSS symbols are taken from the tv.o file * through sub_80EDC60 * sub_80EDCE8 * sub_80EDD78 * through sub_80EDE84 * nomatching sub_80EDE98 * sub_80EDFB4 * sub_80EE104 * sub_80EE104 * sub_80EE184 * sub_80EE2CC * sub_80EE35C * sub_80EE44C * sub_80EE4DC * sub_80EE5A4 * sub_80EE69C * sub_80EE72C * sub_80EE7C0 * sub_80EE818 * sub_80EE8C8 * sub_80EEA70 * sub_80EEB98 * sub_80EEBF4 * through sub_80EED60 * Functions relating to Pokemon News * sub_80EEF6C * GetPriceReduction * IsPriceDiscounted * sub_80EF120 * through sub_80EF370 * sub_80EF40C * HasMixableShowAlreadyBeenSpawnedWithPlayerID * TV_SortPurchasesByQuantity * FindActiveBroadcastByShowType_SetScriptResult * InterviewBefore * through sub_80EF88C * through sub_80EF93C * through sub_80EFA24 * through TV_BernoulliTrial * sub_80EFB58 * sub_80EFBA4 * sub_80EFBDC * through sub_80EFD98 * ChangePokemonNickname * ChangeBoxPokemonNickname * sub_80EFF9C * through player_id_to_dword * CheckForBigMovieOrEmergencyNewsOnTV * GetMomOrDadStringForTVMessage * sub_80F01E8 * sub_80F0358 * sub_80F049C * TV record mixing functions * sub_80F06D0 * sub_80F0708 nonmatching * through sub_80F0B24 * sub_80F0B64 * through sub_80F0C04 * sub_80F0C7C * sub_80F0D60 * sub_80F0E58 * sub_80F0E84 * through sub_80F0F24 * sub_80F0F64 * sub_80F1208 * sub_80F1254 * sub_80F1290 * sub_80F12A4 * sub_80F14F8 * DoTVShowTodaysSmartShopper * DoTVShowTheNameRaterShow * DoTVShowPokemonTodaySuccessfulCapture * DoTVShowPokemonTodayFailedCapture * DoTVShowPokemonFanClubLetter * DoTVShowRecentHappenings * DoTVShowPokemonFanClubOpinions * DoTVShowPokemonNewsMassOutbreak * DoTVShowPokemonContestLiveUpdates * DoTVShowPokemonBattleUpdate * DoTVShow3CheersForPokeblocks * DoTVShowInSearchOfTrainers * Label GabbyAndTyData fields; remove ddump comments from data/text/tv.inc * DoTVShowPokemonAngler * DoTVShowTheWorldOfMasters; update RAM symbols and field names * Decorate static functions * DoTVShowTodaysRivalTrainer; region map enums * TVDewfordTrendWatcherNetworkTextGroup * DoTVShowHoennTreasureInvestigators * DoTVShowFindThatGamer * DoTVShowBreakingNewsTV * DoTVShowSecretBaseVisit * DoTVShowPokemonLotterWinnerFlashReport * DoTVShowThePokemonBattleSeminar * DoTVShowTrainerFanClubSpecial, DoTVShowTrainerFanClub * DoTVShowSpotTheCuties * DoTVShowPokemonNewsBattleFrontier * DoTVShowWhatsNo1InHoennToday * Helpers for DoTVShowSecretBaseSecrets * DoTVShowSecretBaseSecrets * DoTVShowSafariFanClub * Finish decompilation of tv.s * Some renaming * Rename text group pointers * revoke statis; pokenews enums * Labels are number one * Label all TV struct fields * Make data/text/tv.inc more readable * Split data/text/tv.inc * Rename pokenews text pointers * Frontier Symbol constants; indicate static rodata objects with 's' prefix * Fix leading spaces/tabs F*** CLion sometimes * Fix inconsequential warning
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;
//u8 padding;
2017-09-02 21:43:53 +02:00
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];
//u8 padding;
2017-09-02 21:43:53 +02:00
};
struct RamScript
{
u32 checksum;
struct RamScriptData data;
};
2021-03-31 21:53:01 +02:00
// See dewford_trend.c
struct DewfordTrend
2017-09-02 21:43:53 +02:00
{
2021-03-31 21:53:01 +02:00
u16 trendiness:7;
u16 maxTrendiness:7;
u16 gainingTrendiness:1;
//u16 padding:1;
2021-03-31 21:53:01 +02:00
u16 rand;
2017-09-02 21:43:53 +02:00
u16 words[2];
}; /*size = 0x8*/
2018-05-02 17:31:58 +02:00
struct MauvilleManCommon
{
u8 id;
};
struct MauvilleManBard
{
/*0x00*/ u8 id;
/*0x01*/ //u8 padding1;
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;
/*0x2B*/ //u8 padding2;
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;
/*0x03*/ //u8 padding1;
/*0x04*/ u16 randomWords[GIDDY_MAX_TALES];
2021-10-18 20:40:04 +02:00
/*0x18*/ u8 questionList[GIDDY_MAX_QUESTIONS];
2018-05-02 17:31:58 +02:00
/*0x20*/ u8 language;
/*0x21*/ //u8 padding2;
2017-09-02 21:43:53 +02:00
}; /*size = 0x2C*/
2018-05-02 17:31:58 +02:00
struct MauvilleManHipster
{
u8 id;
2023-03-13 20:37:46 +01:00
bool8 taughtWord;
2018-05-02 17:31:58 +02:00
u8 language;
};
2017-09-02 21:43:53 +02:00
struct MauvilleOldManTrader
{
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];
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;
#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;
};
struct LinkBattleRecords
{
struct LinkBattleRecord entries[LINK_B_RECORDS_COUNT];
u8 languages[LINK_B_RECORDS_COUNT];
//u8 padding;
};
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;
//u8 padding;
2017-09-03 22:50:17 +02:00
};
2021-10-23 16:55:46 +02:00
struct Mail
{
/*0x00*/ u16 words[MAIL_WORDS_COUNT];
/*0x12*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
/*0x1A*/ u8 trainerId[TRAINER_ID_LENGTH];
/*0x1E*/ u16 species;
/*0x20*/ u16 itemId;
};
2021-04-25 23:22:45 +02:00
struct DaycareMail
2017-09-04 18:26:39 +02:00
{
2021-10-23 16:55:46 +02:00
struct Mail message;
u8 otName[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;
2021-04-25 23:22:45 +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;
//u8 padding[3];
2017-09-04 18:26:39 +02:00
};
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;
2021-09-09 21:24:34 +02:00
/*0x002*/ u16 question[QUIZ_QUESTION_LEN];
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;
/*0x02A*/ bool8 waitingForChallenger;
/*0x02B*/ u8 questionId;
/*0x02C*/ u8 prevQuestionId;
/*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];
/*0x00C*/ u8 favorId;
/*0x00D*/ //u8 padding1;
/*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;
/*0x013*/ //u8 padding2;
2017-09-20 04:25:31 +02:00
};
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];
/*0x00C*/ u8 maxSheen;
/*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;
u8 filler[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;
//u8 padding;
2017-10-20 18:52:01 +02:00
};
struct TrainerNameRecord
2018-12-15 23:58:47 +01:00
{
2017-12-05 01:10:37 +01:00
u32 trainerId;
u8 ALIGNED(2) trainerName[PLAYER_NAME_LENGTH + 1];
2017-12-05 01:10:37 +01:00
};
2022-03-04 17:02:19 +01:00
struct TrainerHillSave
2019-01-13 12:12:27 +01:00
{
/*0x3D64*/ u32 timer;
/*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;
u16 checkedFinalTime:1;
u16 spokeToOwner:1;
u16 hasLost:1;
u16 maybeECardScanDuringChallenge:1;
u16 field_3D6E_0f:1;
u16 mode:2; // HILL_MODE_*
//u16 padding:8;
2019-01-13 12:12:27 +01:00
};
struct WonderNewsMetadata
2019-03-24 23:20:35 +01:00
{
2021-10-17 08:09:31 +02:00
u8 newsType:2;
2022-11-22 08:17:03 +01:00
u8 sentRewardCounter:3;
u8 rewardCounter:3;
u8 berry;
//u8 padding[2];
2019-03-24 23:20:35 +01:00
};
struct WonderNews
2019-03-24 23:20:35 +01:00
{
2021-10-17 07:35:26 +02:00
u16 id;
u8 sendType; // SEND_TYPE_*
2021-10-14 18:12:16 +02:00
u8 bgType;
2021-10-17 07:15:16 +02:00
u8 titleText[WONDER_NEWS_TEXT_LENGTH];
u8 bodyText[WONDER_NEWS_BODY_TEXT_LINES][WONDER_NEWS_TEXT_LENGTH];
2019-03-24 23:20:35 +01:00
};
struct WonderCard
2019-03-24 23:20:35 +01:00
{
2021-10-17 07:15:16 +02:00
u16 flagId; // Event flag (sReceivedGiftFlags) + WONDER_CARD_FLAG_OFFSET
u16 iconSpecies;
2021-10-17 07:15:16 +02:00
u32 idNumber;
u8 type:2; // CARD_TYPE_*
2021-10-14 18:12:16 +02:00
u8 bgType:4;
u8 sendType:2; // SEND_TYPE_*
u8 maxStamps;
2021-10-17 07:15:16 +02:00
u8 titleText[WONDER_CARD_TEXT_LENGTH];
u8 subtitleText[WONDER_CARD_TEXT_LENGTH];
u8 bodyText[WONDER_CARD_BODY_TEXT_LINES][WONDER_CARD_TEXT_LENGTH];
u8 footerLine1Text[WONDER_CARD_TEXT_LENGTH];
u8 footerLine2Text[WONDER_CARD_TEXT_LENGTH];
//u8 padding[2];
2019-03-24 23:20:35 +01:00
};
struct WonderCardMetadata
2019-03-24 23:20:35 +01:00
{
u16 battlesWon;
u16 battlesLost;
u16 numTrades;
u16 iconSpecies;
2021-10-17 07:35:26 +02:00
u16 stampData[2][MAX_STAMP_CARD_STAMPS]; // First element is STAMP_SPECIES, second is STAMP_ID
2019-03-24 23:20:35 +01:00
};
struct MysteryGiftSave
2019-03-24 23:20:35 +01:00
{
u32 newsCrc;
struct WonderNews news;
u32 cardCrc;
struct WonderCard card;
u32 cardMetadataCrc;
struct WonderCardMetadata cardMetadata;
u16 questionnaireWords[NUM_QUESTIONNAIRE_WORDS];
struct WonderNewsMetadata newsMetadata;
2022-09-11 20:14:49 +02:00
u32 trainerIds[2][5]; // Saved ids for 10 trainers, 5 each for battles and trades
2019-03-24 23:20:35 +01:00
}; // 0x36C 0x3598
// For external event data storage. The majority of these may have never been used.
// 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
struct ExternalEventData
{
u8 unknownExternalDataFields1[7]; // if actually used, may be broken up into different fields.
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; // Master Ball from JP Colosseum Bonus Disc; for reaching 30,000 totalEarnedPokeCoupons
u32 gotSilverPokeCouponTitleReward:1; // Light Ball Pikachu from JP Colosseum Bonus Disc; for reaching 5000 totalEarnedPokeCoupons
u32 gotBronzePokeCouponTitleReward:1; // PP Max from JP Colosseum Bonus Disc; for reaching 2500 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.
} __attribute__((packed)); /*size = 0x14*/
// For external event flags. The majority of these may have never been used.
// In Emerald, Jirachi cannot normally be received, but hacking the distribution discs allows Emerald to receive Jirachi and set the flag
struct ExternalEventFlags
{
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 1499 deposited)
//u8 padding:5;
u8 unknownFlag1;
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.
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;
} __attribute__((packed));/*size = 0x15*/
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;
/*0x31*/ //u8 padding1;
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;
/*0x235*/ //u8 padding2[3];
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];
2019-05-14 11:54:58 +02:00
/*0x988*/ u8 filler1[0x34]; // Previously Dex Flags, feel free to remove.
2017-09-02 21:43:53 +02:00
/*0x9BC*/ u16 berryBlenderRecords[3];
/*0x9C2*/ u8 unused_9C2[6];
2017-09-02 21:43:53 +02:00
/*0x9C8*/ u16 trainerRematchStepCounter;
2019-12-05 21:33:36 +01:00
/*0x9CA*/ u8 trainerRematches[MAX_REMATCH_ENTRIES];
/*0xA2E*/ //u8 padding3[2];
/*0xA30*/ struct ObjectEvent objectEvents[OBJECT_EVENTS_COUNT];
/*0xC70*/ struct ObjectEventTemplate objectEventTemplates[OBJECT_EVENT_TEMPLATES_COUNT];
/*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];
/*0x27CA*/ //u8 padding4[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;
Decompile TV (#80) * ClearTVShowData * special_0x44 * DoTVShow (nonmatching because align) * DoTVShowBravoTrainerPokemonProfile * Update field names * DoTVShowBravoTrainerBattleTower * Renaming of struct fields * sub_80EBFF4 and UpdateTVScreensOnMap * SetTVMetatilesOnMap * Power buttons for the TV screens on the map * special_0x45 * sub_80EC18C * special_0x4a * ResetGabbyAndTy * GabbyAndTyBeforeInterview * GabbyAndTyAfterInterview * Through IsTVShowInSearchOfTrainersAiring * GabbyAndTyGetLastQuote * GabbyAndTyGetLastBattleTrivia * GabbyAndTySetScriptVarsToFieldObjectLocalIds * InterviewAfter; use TVShow as a precursor for making the individual show structs anonymous * Make TV structs anonymous within the union * Move the TV union to its own subheader * Move TV show enums to the global.tv.h subheader * Funcion renaming * Apply static attributes where able * PutPokemonTodayCaughtOnAir * sub_80EC8A4 * PutPokemonTodayFailedOnTheAir * sub_80EC9E8, sub_80ECA10 * sub_80ECA38 * sub_80ECB00 * Put3CheersForPokeblocksOnTheAir * PutFanClubSpecialOnTheAir * ContestLiveUpdates_BeforeInterview * Other before-interview Contest Live Updates functions * ContestLiveUpdates_BeforeInterview_5 * InterviewAfter_BravoTrainerPokemonProfile * BravoTrainerPokemonProfile_BeforeInterview1 * BravoTrainerPokemonProfile_BeforeInterview2 * Disassemble TV data * Decompile TV data * InterviewAfter_BravoTrainerBattleTowerProfile * SaveRecordedItemPurchasesForTVShow * PutNameRaterShowOnTheAir * StartMassOutbreak * PutLilycoveContestLadyShowOnTheAir * InterviewAfter_FanClubLetter * Rip TV strings * InterviewAfter_RecentHappenings * InterviewAfter_PkmnFanClubOpinions * sub_80ED718 * EndMassOutbreak * sub_80ED888 * sub_80ED8B4 * UpdateMassOutbreakTimeLeft * sub_80ED950 * PutFishingAdviceShowOnTheAir * through sub_80EDA80 * ewram and common syms are now fetched from the object files * BSS symbols are taken from the tv.o file * through sub_80EDC60 * sub_80EDCE8 * sub_80EDD78 * through sub_80EDE84 * nomatching sub_80EDE98 * sub_80EDFB4 * sub_80EE104 * sub_80EE104 * sub_80EE184 * sub_80EE2CC * sub_80EE35C * sub_80EE44C * sub_80EE4DC * sub_80EE5A4 * sub_80EE69C * sub_80EE72C * sub_80EE7C0 * sub_80EE818 * sub_80EE8C8 * sub_80EEA70 * sub_80EEB98 * sub_80EEBF4 * through sub_80EED60 * Functions relating to Pokemon News * sub_80EEF6C * GetPriceReduction * IsPriceDiscounted * sub_80EF120 * through sub_80EF370 * sub_80EF40C * HasMixableShowAlreadyBeenSpawnedWithPlayerID * TV_SortPurchasesByQuantity * FindActiveBroadcastByShowType_SetScriptResult * InterviewBefore * through sub_80EF88C * through sub_80EF93C * through sub_80EFA24 * through TV_BernoulliTrial * sub_80EFB58 * sub_80EFBA4 * sub_80EFBDC * through sub_80EFD98 * ChangePokemonNickname * ChangeBoxPokemonNickname * sub_80EFF9C * through player_id_to_dword * CheckForBigMovieOrEmergencyNewsOnTV * GetMomOrDadStringForTVMessage * sub_80F01E8 * sub_80F0358 * sub_80F049C * TV record mixing functions * sub_80F06D0 * sub_80F0708 nonmatching * through sub_80F0B24 * sub_80F0B64 * through sub_80F0C04 * sub_80F0C7C * sub_80F0D60 * sub_80F0E58 * sub_80F0E84 * through sub_80F0F24 * sub_80F0F64 * sub_80F1208 * sub_80F1254 * sub_80F1290 * sub_80F12A4 * sub_80F14F8 * DoTVShowTodaysSmartShopper * DoTVShowTheNameRaterShow * DoTVShowPokemonTodaySuccessfulCapture * DoTVShowPokemonTodayFailedCapture * DoTVShowPokemonFanClubLetter * DoTVShowRecentHappenings * DoTVShowPokemonFanClubOpinions * DoTVShowPokemonNewsMassOutbreak * DoTVShowPokemonContestLiveUpdates * DoTVShowPokemonBattleUpdate * DoTVShow3CheersForPokeblocks * DoTVShowInSearchOfTrainers * Label GabbyAndTyData fields; remove ddump comments from data/text/tv.inc * DoTVShowPokemonAngler * DoTVShowTheWorldOfMasters; update RAM symbols and field names * Decorate static functions * DoTVShowTodaysRivalTrainer; region map enums * TVDewfordTrendWatcherNetworkTextGroup * DoTVShowHoennTreasureInvestigators * DoTVShowFindThatGamer * DoTVShowBreakingNewsTV * DoTVShowSecretBaseVisit * DoTVShowPokemonLotterWinnerFlashReport * DoTVShowThePokemonBattleSeminar * DoTVShowTrainerFanClubSpecial, DoTVShowTrainerFanClub * DoTVShowSpotTheCuties * DoTVShowPokemonNewsBattleFrontier * DoTVShowWhatsNo1InHoennToday * Helpers for DoTVShowSecretBaseSecrets * DoTVShowSecretBaseSecrets * DoTVShowSafariFanClub * Finish decompilation of tv.s * Some renaming * Rename text group pointers * revoke statis; pokenews enums * Labels are number one * Label all TV struct fields * Make data/text/tv.inc more readable * Split data/text/tv.inc * Rename pokenews text pointers * Frontier Symbol constants; indicate static rodata objects with 's' prefix * Fix leading spaces/tabs F*** CLion sometimes * Fix inconsequential warning
2017-10-13 17:09:36 +02:00
/*0x2B92*/ u8 outbreakLocationMapNum;
/*0x2B93*/ u8 outbreakLocationMapGroup;
/*0x2B94*/ u8 outbreakPokemonLevel;
2021-11-16 22:13:52 +01:00
/*0x2B95*/ u8 outbreakUnused1;
/*0x2B96*/ u16 outbreakUnused2;
2019-09-08 17:53:48 +02:00
/*0x2B98*/ u16 outbreakPokemonMoves[MAX_MON_MOVES];
2021-11-16 22:13:52 +01:00
/*0x2BA0*/ u8 outbreakUnused3;
Decompile TV (#80) * ClearTVShowData * special_0x44 * DoTVShow (nonmatching because align) * DoTVShowBravoTrainerPokemonProfile * Update field names * DoTVShowBravoTrainerBattleTower * Renaming of struct fields * sub_80EBFF4 and UpdateTVScreensOnMap * SetTVMetatilesOnMap * Power buttons for the TV screens on the map * special_0x45 * sub_80EC18C * special_0x4a * ResetGabbyAndTy * GabbyAndTyBeforeInterview * GabbyAndTyAfterInterview * Through IsTVShowInSearchOfTrainersAiring * GabbyAndTyGetLastQuote * GabbyAndTyGetLastBattleTrivia * GabbyAndTySetScriptVarsToFieldObjectLocalIds * InterviewAfter; use TVShow as a precursor for making the individual show structs anonymous * Make TV structs anonymous within the union * Move the TV union to its own subheader * Move TV show enums to the global.tv.h subheader * Funcion renaming * Apply static attributes where able * PutPokemonTodayCaughtOnAir * sub_80EC8A4 * PutPokemonTodayFailedOnTheAir * sub_80EC9E8, sub_80ECA10 * sub_80ECA38 * sub_80ECB00 * Put3CheersForPokeblocksOnTheAir * PutFanClubSpecialOnTheAir * ContestLiveUpdates_BeforeInterview * Other before-interview Contest Live Updates functions * ContestLiveUpdates_BeforeInterview_5 * InterviewAfter_BravoTrainerPokemonProfile * BravoTrainerPokemonProfile_BeforeInterview1 * BravoTrainerPokemonProfile_BeforeInterview2 * Disassemble TV data * Decompile TV data * InterviewAfter_BravoTrainerBattleTowerProfile * SaveRecordedItemPurchasesForTVShow * PutNameRaterShowOnTheAir * StartMassOutbreak * PutLilycoveContestLadyShowOnTheAir * InterviewAfter_FanClubLetter * Rip TV strings * InterviewAfter_RecentHappenings * InterviewAfter_PkmnFanClubOpinions * sub_80ED718 * EndMassOutbreak * sub_80ED888 * sub_80ED8B4 * UpdateMassOutbreakTimeLeft * sub_80ED950 * PutFishingAdviceShowOnTheAir * through sub_80EDA80 * ewram and common syms are now fetched from the object files * BSS symbols are taken from the tv.o file * through sub_80EDC60 * sub_80EDCE8 * sub_80EDD78 * through sub_80EDE84 * nomatching sub_80EDE98 * sub_80EDFB4 * sub_80EE104 * sub_80EE104 * sub_80EE184 * sub_80EE2CC * sub_80EE35C * sub_80EE44C * sub_80EE4DC * sub_80EE5A4 * sub_80EE69C * sub_80EE72C * sub_80EE7C0 * sub_80EE818 * sub_80EE8C8 * sub_80EEA70 * sub_80EEB98 * sub_80EEBF4 * through sub_80EED60 * Functions relating to Pokemon News * sub_80EEF6C * GetPriceReduction * IsPriceDiscounted * sub_80EF120 * through sub_80EF370 * sub_80EF40C * HasMixableShowAlreadyBeenSpawnedWithPlayerID * TV_SortPurchasesByQuantity * FindActiveBroadcastByShowType_SetScriptResult * InterviewBefore * through sub_80EF88C * through sub_80EF93C * through sub_80EFA24 * through TV_BernoulliTrial * sub_80EFB58 * sub_80EFBA4 * sub_80EFBDC * through sub_80EFD98 * ChangePokemonNickname * ChangeBoxPokemonNickname * sub_80EFF9C * through player_id_to_dword * CheckForBigMovieOrEmergencyNewsOnTV * GetMomOrDadStringForTVMessage * sub_80F01E8 * sub_80F0358 * sub_80F049C * TV record mixing functions * sub_80F06D0 * sub_80F0708 nonmatching * through sub_80F0B24 * sub_80F0B64 * through sub_80F0C04 * sub_80F0C7C * sub_80F0D60 * sub_80F0E58 * sub_80F0E84 * through sub_80F0F24 * sub_80F0F64 * sub_80F1208 * sub_80F1254 * sub_80F1290 * sub_80F12A4 * sub_80F14F8 * DoTVShowTodaysSmartShopper * DoTVShowTheNameRaterShow * DoTVShowPokemonTodaySuccessfulCapture * DoTVShowPokemonTodayFailedCapture * DoTVShowPokemonFanClubLetter * DoTVShowRecentHappenings * DoTVShowPokemonFanClubOpinions * DoTVShowPokemonNewsMassOutbreak * DoTVShowPokemonContestLiveUpdates * DoTVShowPokemonBattleUpdate * DoTVShow3CheersForPokeblocks * DoTVShowInSearchOfTrainers * Label GabbyAndTyData fields; remove ddump comments from data/text/tv.inc * DoTVShowPokemonAngler * DoTVShowTheWorldOfMasters; update RAM symbols and field names * Decorate static functions * DoTVShowTodaysRivalTrainer; region map enums * TVDewfordTrendWatcherNetworkTextGroup * DoTVShowHoennTreasureInvestigators * DoTVShowFindThatGamer * DoTVShowBreakingNewsTV * DoTVShowSecretBaseVisit * DoTVShowPokemonLotterWinnerFlashReport * DoTVShowThePokemonBattleSeminar * DoTVShowTrainerFanClubSpecial, DoTVShowTrainerFanClub * DoTVShowSpotTheCuties * DoTVShowPokemonNewsBattleFrontier * DoTVShowWhatsNo1InHoennToday * Helpers for DoTVShowSecretBaseSecrets * DoTVShowSecretBaseSecrets * DoTVShowSafariFanClub * Finish decompilation of tv.s * Some renaming * Rename text group pointers * revoke statis; pokenews enums * Labels are number one * Label all TV struct fields * Make data/text/tv.inc more readable * Split data/text/tv.inc * Rename pokenews text pointers * Frontier Symbol constants; indicate static rodata objects with 's' prefix * Fix leading spaces/tabs F*** CLion sometimes * Fix inconsequential warning
2017-10-13 17:09:36 +02:00
/*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];
2021-10-23 16:55:46 +02:00
/*0x2BE0*/ struct Mail mail[MAIL_COUNT];
2023-03-13 20:37:46 +01:00
/*0x2E20*/ u8 unlockedTrendySayings[NUM_TRENDY_SAYING_BYTES]; // Bitfield for unlockable Easy Chat words in EC_GROUP_TRENDY_SAYING
/*0x2E25*/ //u8 padding5[3];
2017-09-03 22:50:17 +02:00
/*0x2E28*/ OldMan oldMan;
2021-03-31 21:53:01 +02:00
/*0x2e64*/ struct DewfordTrend dewfordTrends[SAVED_TRENDS_COUNT];
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;
/*0x3150*/ struct LinkBattleRecords linkBattleRecords;
/*0x31A8*/ u8 giftRibbons[GIFT_RIBBONS_COUNT];
/*0x31B3*/ struct ExternalEventData externalEventData;
/*0x31C7*/ struct ExternalEventFlags externalEventFlags;
2017-09-03 22:50:17 +02:00
/*0x31DC*/ struct Roamer roamer;
/*0x31F8*/ struct EnigmaBerry enigmaBerry;
/*0x322C*/ struct MysteryGiftSave mysteryGift;
/*0x3???*/ u8 dexSeen[NUM_DEX_FLAG_BYTES];
/*0x3???*/ u8 dexCaught[NUM_DEX_FLAG_BYTES];
/*0x3???*/ u32 trainerHillTimes[NUM_TRAINER_HILL_MODES];
2019-05-14 11:54:58 +02:00
/*0x3???*/ struct RamScript ramScript;
/*0x3???*/ struct RecordMixingGift recordMixingGift;
/*0x3???*/ LilycoveLady lilycoveLady;
/*0x3???*/ struct TrainerNameRecord trainerNameRecords[20];
2020-07-11 14:07:10 +02:00
/*0x3???*/ u8 registeredTexts[UNION_ROOM_KB_ROW_COUNT][21];
/*0x3???*/ struct TrainerHillSave trainerHill;
2019-05-14 11:54:58 +02:00
/*0x3???*/ struct WaldaPhrase waldaPhrase;
// sizeof: 0x3???
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;
s8 elevation;
2018-02-12 15:01:43 +01:00
};
2016-01-08 10:08:16 +01:00
#endif // GUARD_GLOBAL_H