summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorProjectRevoTPP <projectrevotpp@hotmail.com>2017-03-18 04:00:15 +0100
committerProjectRevoTPP <projectrevotpp@hotmail.com>2017-03-18 04:00:15 +0100
commit6035511c139549a0291b6b3d43b9b080f792b2b6 (patch)
tree128cb1580f3c1ac1a6f897ea2e8e703265e88914 /include
parentd4703599837531d1118b64822c85755f28747ee1 (diff)
reorganize and add new headers for many files
Diffstat (limited to 'include')
-rw-r--r--include/asm.inc.h101
-rw-r--r--include/battle.h7
-rw-r--r--include/battle_ai.h31
-rw-r--r--include/battle_anim.h58
-rw-r--r--include/battle_party_menu.h15
-rw-r--r--include/battle_setup.h152
-rw-r--r--include/bike.h56
-rw-r--r--include/braille_puzzles.h14
-rw-r--r--include/clock.h8
-rw-r--r--include/contest.h26
-rw-r--r--include/contest_painting.h77
-rw-r--r--include/dewford_trend.h10
-rw-r--r--include/field_control_avatar.h13
-rw-r--r--include/field_door.h25
-rw-r--r--include/field_map_obj_helpers.h11
-rw-r--r--include/field_player_avatar.h2
-rw-r--r--include/gba/flash_internal.h7
-rw-r--r--include/global.h31
-rw-r--r--include/intro.h1
-rw-r--r--include/matsuda_debug_menu.h11
-rw-r--r--include/name_string_util.h7
-rw-r--r--include/naming_screen.h83
-rw-r--r--include/rom4.h2
-rw-r--r--include/rom6.h7
-rw-r--r--include/save.h69
-rw-r--r--include/script_menu.h31
-rw-r--r--include/script_pokemon_80C4.h22
-rw-r--r--include/script_pokemon_80F9.h17
-rw-r--r--include/trainer_see.h2
-rw-r--r--include/vars.h2
30 files changed, 718 insertions, 180 deletions
diff --git a/include/asm.inc.h b/include/asm.inc.h
index 8189914fa..9ee10aa58 100644
--- a/include/asm.inc.h
+++ b/include/asm.inc.h
@@ -38,14 +38,6 @@ void CreatePokeballSprite(u8 r0, u8 r1, u8 r2, u8 r3, u8 s1, u8 s2, u8 s3, u16 s
// asm/berry_blender.o
void sub_80516C4(u8, u16);
-// src/field_door.o
-void FieldSetDoorOpened(u32, u32);
-void FieldSetDoorClosed(u32, u32);
-s8 FieldAnimateDoorClose(u32, u32);
-s8 FieldAnimateDoorOpen(u32, u32);
-bool8 FieldIsDoorAnimationRunning(void);
-u32 sub_8058790(u32 x, u32 y);
-
// asm/field_map_obj.o
void sub_805AA98();
u8 sub_805AB54(void);
@@ -137,32 +129,11 @@ u8 ZCoordToPriority(u8);
void FieldObjectUpdateZCoord(struct MapObject *pObject);
void SetObjectSubpriorityByZCoord(u8, struct Sprite *, u8);
-// src/field_map_obj_helpers.o
-bool8 FreezeMapObject(struct MapObject *);
-void FreezeMapObjects(void);
-void FreezeMapObjectsExceptOne(u8);
-void UnfreezeMapObjects(void);
-void sub_806487C(struct Sprite *sprite, bool8 invisible);
-void sub_8064990(u8, u8);
-
-// asm/field_control_avatar.o
-void FieldClearPlayerInput(struct FieldInput *pStruct);
-void FieldGetPlayerInput(struct FieldInput *pStruct, u16 keys, u16 heldKeys);
-int sub_8068024(struct FieldInput *pStruct);
-u8 *sub_80682A8(struct MapPosition *, u8, u8);
-void overworld_poison_timer_set(void);
-void prev_quest_postbuffer_cursor_backup_reset(void);
-u8 *sub_8068E24(struct MapPosition *);
-u8 *GetFieldObjectScriptPointerForComparison();
-
// asm/field_tasks.o
void SetUpFieldTasks();
void ActivatePerStepCallback(u8);
void ResetFieldTasksArgs(void);
-// asm/clock.o
-void DoTimeBasedEvents(void);
-
// asm/reset_rtc_screen.o
void CB2_InitResetRtcScreen(void);
@@ -203,10 +174,6 @@ u8 sub_8083664(void);
void sub_8083A84(TaskFunc);
s32 sub_8083BF4(u8 id);
-// src/fldeff_emotion.o
-void sub_8084894(struct Sprite *sprite, u16 a2, u8 a3);
-void objc_exclamation_mark_probably(struct Sprite *sprite);
-
// asm/rom_80859BC.o
u8 CreateTrainerSprite_BirchSpeech(u8, u16, u16, u8, void *);
void LoadTrainerGfx_TrainerCard(u8 gender, int, void *);
@@ -259,11 +226,6 @@ u8 sub_80A7D8C(u8 berry, int i, int i1);
void sub_80A7DD4(void);
u8 sub_80A7E5C(u8);
-// src/matsuda_debug_menu.o
-void sub_80AA280(u8);
-void sub_80AA5E8(u8);
-void sub_80AA658(u8);
-
// asm/contest.o
void sub_80AB1B0(void);
void sub_80AE098(u8);
@@ -279,18 +241,6 @@ void CreatePokemartMenu(void *);
void CreateDecorationShop1Menu(void *);
void CreateDecorationShop2Menu(void *);
-// src/script_menu.o
-bool8 sub_80B5054(u8, u8, u8, u8);
-bool8 sub_80B50B0(u8, u8, u8, u8, u8);
-bool8 Multichoice(u8, u8, u8, u8);
-bool8 yes_no_box(u8, u8);
-bool8 sub_80B5578(u8, u8, u8, u8, u8);
-bool8 sub_80B58C4(u16, u8, u8);
-void *picbox_close(void);
-
-// asm/naming_screen.o
-void DoNamingScreen(u8 r0, u8 *r1, u16 r2, u16 r3, u32 s0, MainCallback s4);
-
// asm/secret_base.o
void sub_80BB5B4(void);
u8 sub_80BBB24(void);
@@ -330,15 +280,6 @@ void sub_80C4940(void);
void sub_80C4980(u8);
u8 sub_80C4B34(u8 *);
-// asm/script_pokemon_util_80C4BF0.o
-u8 sub_80C4D50(void);
-void ShowContestWinner(void);
-void HealPlayerParty();
-u8 ScriptGiveMon(u16, u8, u16, u32, u32, u8);
-u8 ScriptGiveEgg(u16);
-void ScriptWildBattle(u16, u8, u16);
-void ScriptSetMonMoveSlot(u8, u16, u8);
-
// asm/fldeff_80C5CD4.o
void DoFieldPoisonEffect(void);
bool32 FieldPoisonEffectIsRunning(void);
@@ -357,16 +298,6 @@ void sub_80C8E1C(u8);
void sub_80C8EBC(u8);
void sub_80C8F34(u8);
-// asm/bike.o
-void MovePlayerOnBike(u8, u16, u16);
-void sub_80E5B38(u16 i, u16 c);
-u8 IsRunningDisallowed(u8);
-bool8 player_should_look_direction_be_enforced_upon_movement(void);
-void BikeClearState(int i, int i1);
-void sub_80E6010(u8 i);
-s16 GetPlayerSpeed(void);
-void sub_80E6084();
-
// asm/easy_chat.o
void sub_80E6764(void);
void sub_80EB3FC(u8 *, u16);
@@ -385,13 +316,6 @@ bool8 sub_80F9344(void);
void sub_80F9368(void);
void sub_80F9438(void);
-// asm/script_pokemon_util_80F99CC.o
-void sub_80F99CC(void);
-
-// src/dewford_trend.o
-void sub_80FA17C(void);
-void sub_80FA4E4(void *, u32, u8);
-
// asm/region_map.o
void sub_80FBFB4(u8 *str, u8 region, u8);
void CopyMapName();
@@ -400,13 +324,6 @@ u8 *CopyLocationName(u8 *dest, u8 location);
// asm/slot_machine.o
void PlaySlotMachine(u8, void *);
-// asm/contest_painting.o
-void sub_8106630(u32);
-
-// asm/rom6.o
-bool8 npc_before_player_of_type(u8);
-u8 oei_task_add(void);
-
// asm/pokeblock.o
void sub_810C994(void);
void sub_810CA6C(s32);
@@ -464,13 +381,6 @@ void sub_8134AC0(void *);
// src/player_pc.o
void NewGameInitPCItems(void);
-// src/intro.o
-void sub_813CE30(u16, u16, u16, u16);
-
-// asm/braille_puzzles.o
-bool8 ShouldDoBrailleStrengthEffect(void);
-void DoBrailleStrengthEffect(void);
-
// asm/intro_credits_graphics.o
void load_intro_part2_graphics(/*TODO: arg types*/);
void sub_8148C78(/*TODO: arg types*/);
@@ -482,14 +392,3 @@ u8 intro_create_brendan_sprite(/*TODO: arg types*/);
u8 intro_create_may_sprite(/*TODO: arg types*/);
u8 intro_create_latios_sprite(/*TODO: arg types*/);
u8 intro_create_latias_sprite(/*TODO: arg types*/);
-
-// asm/name_string_util.o
-void SanitizeNameString(u8*);
-
-// src/agb_flash.o
-u16 ReadFlashId(void);
-u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void));
-void ReadFlash(u16 sectorNum, u32 offset, u8 *dest, u32 size);
-u32 ProgramFlashSectorAndVerify();
-u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, u8 *src, u32 n);
-u16 IdentifyFlash(void);
diff --git a/include/battle.h b/include/battle.h
index daaa78cd3..4b9144721 100644
--- a/include/battle.h
+++ b/include/battle.h
@@ -107,9 +107,12 @@ struct SmallItemStruct
struct BattleStruct /* 0x2000000 */
{
- u8 filler0[0x1601C];
+ u8 filler0[0x15DDE];
+ /*0x15DDE*/ u8 unk15DDE;
+ /*0x15DDF*/ u8 unk15DDF;
+ /*0x15DE0*/ u8 filler15DE0[0x23C]; // 0xAF off?
struct SmallBattleStruct1 unk;
- u8 filler1[0x68]; // 0x2016020
+ u8 filler1[0x68];
/* 0x16089 */ u8 safariFleeRate;
u8 filler1_2[0x42];
/* 0x160CB */ u8 linkPlayerIndex;
diff --git a/include/battle_ai.h b/include/battle_ai.h
new file mode 100644
index 000000000..a5fea3480
--- /dev/null
+++ b/include/battle_ai.h
@@ -0,0 +1,31 @@
+#ifndef GUARD_BATTLEAI_H
+#define GUARD_BATTLEAI_H
+
+#define AIScriptRead32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24)
+#define AIScriptRead16(ptr) ((ptr)[0] | (ptr)[1] << 8)
+#define AIScriptRead8(ptr) ((ptr)[0])
+#define AIScriptReadPtr(ptr) (u8*) AIScriptRead32(ptr)
+
+enum
+{
+ TARGET,
+ USER
+};
+
+// AI states
+enum
+{
+ AIState_SettingUp,
+ AIState_Processing,
+ AIState_FinishedProcessing,
+ AIState_DoNotProcess
+};
+
+// battle_ai
+void BattleAI_SetupAIData(void);
+void BattleAI_DoAIProcessing(void);
+void sub_810745C(void);
+void AIStackPushVar(u8 *);
+u8 AIStackPop(void);
+
+#endif
diff --git a/include/battle_anim.h b/include/battle_anim.h
new file mode 100644
index 000000000..eb98ebf09
--- /dev/null
+++ b/include/battle_anim.h
@@ -0,0 +1,58 @@
+#ifndef GUARD_BATTLEANIM_H
+#define GUARD_BATTLEANIM_H
+
+#define SCRIPT_READ_8(ptr) ((ptr)[0])
+#define SCRIPT_READ_16(ptr) ((ptr)[0] | ((ptr)[1] << 8))
+#define SCRIPT_READ_32(ptr) ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24))
+
+#define REG_BGnCNT_BITFIELD(n) (*(struct BGCntrlBitfield *)REG_ADDR_BG##n##CNT)
+#define REG_BG1CNT_BITFIELD REG_BGnCNT_BITFIELD(1)
+#define REG_BG2CNT_BITFIELD REG_BGnCNT_BITFIELD(2)
+
+#define EWRAM_14800 ((u16 *)(unk_2000000 + 0x14800))
+#define EWRAM_17800 ((struct UnknownStruct1 *)(unk_2000000 + 0x17800))
+#define EWRAM_17810 ((struct UnknownStruct3 *)(unk_2000000 + 0x17810))
+#define EWRAM_18000 ((u16 *)(unk_2000000 + 0x18000))
+#define EWRAM_19348 (*(u16 *)(unk_2000000 + 0x19348))
+
+struct BGCntrlBitfield
+{
+ volatile u16 priority:2;
+ volatile u16 charBaseBlock:2;
+ volatile u16 field_0_2:4;
+ volatile u16 field_1_0:5;
+ volatile u16 areaOverflowMode:1;
+ volatile u16 screenSize:2;
+};
+
+struct BattleAnimBackground
+{
+ void *image;
+ void *palette;
+ void *tilemap;
+};
+
+struct UnknownStruct1
+{
+ u8 unk0;
+};
+
+struct UnknownStruct2
+{
+ void *unk0;
+ u16 *unk4;
+ u8 unk8;
+};
+
+struct UnknownStruct3
+{
+ u8 unk0;
+ u8 filler1[0xB];
+};
+
+void move_something(const u8 *const moveAnims[], u16 b, u8 c);
+bool8 b_side_obj__get_some_boolean(u8 a);
+void sub_8076034(u8, u8);
+bool8 sub_8076BE0(void);
+
+#endif
diff --git a/include/battle_party_menu.h b/include/battle_party_menu.h
index c808cdcd7..d0ae8da35 100644
--- a/include/battle_party_menu.h
+++ b/include/battle_party_menu.h
@@ -13,8 +13,23 @@ struct UnknownStruct1
s16 unk266;
};
+struct PartyMenuItem
+{
+ const u8 *text;
+ TaskFunc func;
+};
+
+struct PartyPopupMenu
+{
+ u8 unk0;
+ u8 unk1;
+ const u8 *unk4;
+};
+
extern u8 unk_2000000[];
+void SetUpBattlePokemonMenu(u8);
+
#define EWRAM_1609D unk_2000000[0x1609D]
#define EWRAM_1B000 (*(struct UnknownStruct1 *)(unk_2000000 + 0x1B000))
diff --git a/include/battle_setup.h b/include/battle_setup.h
index 2a1a2e717..e88aefe6d 100644
--- a/include/battle_setup.h
+++ b/include/battle_setup.h
@@ -1,84 +1,136 @@
#ifndef GUARD_BATTLE_SETUP_H
#define GUARD_BATTLE_SETUP_H
-// task01_battle_start
-// task_add_01_battle_start
+#define NUM_TRAINER_EYE_TRAINERS 56
+#define TRAINER_REMATCH_STEPS 255
+
+// IV + LEVEL + SPECIES
+struct TrainerPartyMember0
+{
+ u16 iv;
+ u8 level;
+ u16 species;
+};
+
+// IV + LEVEL + SPECIES + MOVES
+struct TrainerPartyMember1
+{
+ u16 iv;
+ u8 level;
+ u16 species;
+ u16 moves[4];
+};
+
+// IV + LEVEL + SPECIES + ITEMS
+struct TrainerPartyMember2
+{
+ u16 iv;
+ u8 level;
+ u16 species;
+ u16 heldItem;
+};
+
+// IV + LEVEL + SPECIES + ITEMS + MOVES
+struct TrainerPartyMember3
+{
+ u16 iv;
+ u8 level;
+ u16 species;
+ u16 heldItem;
+ u16 moves[4];
+};
+
+struct TrainerBattleSpec
+{
+ void *ptr;
+ u8 ptrType;
+};
+
+struct TrainerEyeTrainer
+{
+ u16 trainerNums[5];
+ u16 mapGroup;
+ u16 mapNum;
+};
+
+//void task01_battle_start(u8 taskId);
+//void task_add_01_battle_start(u8 transition, u16 song);
void CheckForSafariZoneAndProceed(void);
void StartBattle_StandardWild(void);
void StartBattle_Roamer(void);
void StartBattle_Safari(void);
-// task_add_01_battle_start_with_music_and_stats
-// StartBattle_WallyTutorial
+//void task_add_01_battle_start_with_music_and_stats(void);
+//void StartBattle_WallyTutorial(void);
void StartBattle_ScriptedWild(void);
-// StartBattle_SouthernIsland
-// StartBattle_Rayquaza
-// StartBattle_GroudonKyogre
-// StartBattle_Regi
+//void StartBattle_SouthernIsland(void);
+//void StartBattle_Rayquaza(void);
+//void StartBattle_GroudonKyogre(void);
+//void StartBattle_Regi(void);
void HandleWildBattleEnd(void);
void HandleScriptedWildBattleEnd(void);
-// GetBattleTerrain
-// GetBattleTransitionTypeByMap
-// GetSumOfPartyMonLevel
-// GetSumOfEnemyPartyLevel
+s8 GetBattleTerrain(void);
+//s8 GetBattleTransitionTypeByMap(void);
+//u16 GetSumOfPartyMonLevel(u8 numMons);
+//u8 GetSumOfEnemyPartyLevel(u16 trainerNum, u8 numMons);
u8 GetWildBattleTransition(void);
u8 GetTrainerBattleTransition(void);
-// GetBattleTowerBattleTransition
-// ChooseStarter
+u8 GetBattleTowerBattleTransition(void);
+//void ChooseStarter(void);
void CB2_GiveStarter(void);
void CB2_StartFirstBattle(void);
void HandleFirstBattleEnd(void);
-// TrainerBattleLoadArg32
-// TrainerBattleLoadArg16
-// TrainerBattleLoadArg8
-// trainerflag_opponent
+//u32 TrainerBattleLoadArg32(u8 *ptr);
+//u16 TrainerBattleLoadArg16(u8 *ptr);
+//u8 TrainerBattleLoadArg8(u8 *ptr);
+//u16 trainerflag_opponent(void);
bool32 battle_exit_is_player_defeat(u32 a1);
-// sub_80822BC
-// TrainerBattleLoadArgs
-// battle_80801F0
+//void sub_80822BC(void);
+//void TrainerBattleLoadArgs(const struct TrainerBattleSpec *specs, u8 *data);
+//void battle_80801F0(void);
u8 *TrainerBattleConfigure(u8 *data);
void TrainerWantsBattle(u8, u8 *);
bool32 GetTrainerFlagFromScriptPointer(u8 *data);
-// sub_8082524
-// sub_8082558
-// sub_8082564
-// sub_808257C
-// unref_sub_8082590
+//void sub_8082524(void);
+//u8 sub_8082558(void);
+//u8 sub_8082564(void);
+//void sub_808257C(void);
+//void unref_sub_8082590(void); // unused
u8 trainer_flag_check(u16);
void trainer_flag_set(u16);
void trainer_flag_clear(u16);
void sub_80825E4(void);
void sub_808260C(void);
-// do_choose_name_or_words_screen
-// sub_80826B0
-// sub_80826D8
+void do_choose_name_or_words_screen(void);
+//void sub_80826B0(void);
+//void sub_80826D8(void);
u8 *sub_80826E8(void);
u8 *sub_8082700(void);
-// sub_8082718
-// PlayTrainerEncounterMusic
-// SanitizeString
+//void sub_8082718(void);
+//void PlayTrainerEncounterMusic(void);
+//u8 *SanitizeString(u8 *str);
u8 *sub_808281C(void);
-// sub_8082830
-// unref_sub_808286C
+u8 *sub_8082830(void);
+//u8 *unref_sub_808286C(void);
u8 *sub_8082880(void);
-// sub_8082894
-// sub_80828B8
-// sub_80828FC
-// sub_80829A8
-// sub_80829E8
-// sub_8082A18
-// sub_8082A54
-// sub_8082A90
-// sub_8082AE4
-// sub_8082B10
-// sub_8082B44
+//s32 sub_8082894(const struct TrainerEyeTrainer *trainers, u16 trainerNum);
+//s32 sub_80828B8(const struct TrainerEyeTrainer *trainers, u16 trainerNum);
+//bool32 sub_80828FC(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum);
+//s32 sub_80829A8(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum);
+//s32 sub_80829E8(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum);
+//bool8 sub_8082A18(const struct TrainerEyeTrainer *trainers, u16 trainerNum);
+//bool8 sub_8082A54(const struct TrainerEyeTrainer *trainers, u16 trainerNum);
+//u16 sub_8082A90(const struct TrainerEyeTrainer *trainers, u16 trainerNum);
+//void sub_8082AE4(const struct TrainerEyeTrainer *trainers, u16 trainerNum);
+//bool8 sub_8082B10(const struct TrainerEyeTrainer *trainers, u16 trainerNum);
+//bool32 sub_8082B44(void);
void sub_8082B78(void);
-// sub_8082BA4
+//bool32 sub_8082BA4(void);
void sub_8082BD0(u16, u16);
-// sub_8082C0C
-// unref_sub_8082C2C
+s32 sub_8082C0C(u16 mapGroup, u16 mapNum);
+s32 unref_sub_8082C2C(u16 mapGroup, u16 mapNum);
u16 sub_8082C4C(u16 a1);
-// sub_8082C68
-// sub_8082C9C
+//s32 sub_8082C68(void);
+//u8 sub_8082C9C(void);
void sub_8082CB8(void);
#endif // GUARD_BATTLE_SETUP_H
diff --git a/include/bike.h b/include/bike.h
new file mode 100644
index 000000000..decbd1d49
--- /dev/null
+++ b/include/bike.h
@@ -0,0 +1,56 @@
+#ifndef GUARD_BIKE_H
+#define GUARD_BIKE_H
+
+struct UnknownStruct1
+{
+ u32 unk0;
+ u32 unk4;
+ u32 unk8;
+ u32 unkC;
+ const u8 *unk10;
+ const u8 *unk14;
+ u32 unk18;
+};
+
+// Player speeds
+enum
+{
+ SPEED_STANDING,
+ SPEED_NORMAL,
+ SPEED_FAST,
+ SPEED_FASTER,
+ SPEED_FASTEST,
+};
+
+//Acro bike states
+enum
+{
+ ACRO_STATE_NORMAL,
+ ACRO_STATE_TURNING,
+ ACRO_STATE_WHEELIE_STANDING,
+ ACRO_STATE_BUNNY_HOP,
+ ACRO_STATE_WHEELIE_MOVING,
+ ACRO_STATE_5,
+ ACRO_STATE_6,
+};
+
+//Acro bike transitions
+enum
+{
+ ACRO_TRANS_FACE_DIRECTION,
+ ACRO_TRANS_NORMAL_TO_WHEELIE = 3,
+ ACRO_TRANS_WHEELIE_TO_NORMAL,
+};
+
+void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys);
+void sub_80E5B38(u16 a, u16 b);
+bool8 IsRunningDisallowed(u8 tile);
+bool8 IsBikingDisallowedByPlayer(void);
+bool8 player_should_look_direction_be_enforced_upon_movement(void);
+void GetOnOffBike(u8 var);
+void BikeClearState(int var1, int var2);
+void sub_80E6010(u8 var);
+s16 GetPlayerSpeed(void);
+void sub_80E6084(void);
+
+#endif
diff --git a/include/braille_puzzles.h b/include/braille_puzzles.h
new file mode 100644
index 000000000..2b0e2bb96
--- /dev/null
+++ b/include/braille_puzzles.h
@@ -0,0 +1,14 @@
+#ifndef GUARD_BRAILLEPUZZLES_H
+#define GUARD_BRAILLEPUZZLES_H
+
+bool8 ShouldDoBrailleStrengthEffect(void);
+void DoBrailleStrengthEffect(void);
+void UseFlyAncientTomb_Callback(void);
+void UseFlyAncientTomb_Finish(void);
+void Task_BrailleWait(u8 taskId);
+bool32 BrailleWait_CheckButtonPress(void);
+void SealedChamberShakingEffect(u8 taskId);
+bool8 ShouldDoBrailleDigEffect(void);
+void DoBrailleDigEffect(void);
+
+#endif
diff --git a/include/clock.h b/include/clock.h
new file mode 100644
index 000000000..4e6560c91
--- /dev/null
+++ b/include/clock.h
@@ -0,0 +1,8 @@
+#ifndef GUARD_CLOCK_H
+#define GUARD_CLOCK_H
+
+// TODO: time of day and seconds in a day defines
+
+void DoTimeBasedEvents(void);
+
+#endif
diff --git a/include/contest.h b/include/contest.h
new file mode 100644
index 000000000..82520717f
--- /dev/null
+++ b/include/contest.h
@@ -0,0 +1,26 @@
+#ifndef GUARD_CONTEST_H
+#define GUARD_CONTEST_H
+
+struct ContestPokemon
+{
+ /* 0x00 */ u16 species;
+ /* 0x02 */ u8 nickname[POKEMON_NAME_LENGTH];
+ /* 0x0D */ u8 trainerName[8];
+ /* 0x15 */ u8 unk15;
+ /* 0x16 */ u8 unk16;
+ /* 0x17 */ u8 filler17[7];
+ /* 0x1E */ u16 moves[4]; // moves
+ /* 0x26 */ u8 cool; // cool
+ /* 0x27 */ u8 beauty; // beauty
+ /* 0x28 */ u8 cute; // cute
+ /* 0x29 */ u8 smart; // smart
+ /* 0x2A */ u8 tough; // tough
+ /* 0x2B */ u8 sheen; // sheen
+ /* 0x2C */ u8 filler2C[12];
+ /* 0x38 */ u32 unk38;
+ /* 0x3C */ u32 unk3C;
+}; // wow
+
+extern struct ContestPokemon gContestMons[];
+
+#endif // GUARD_CONTEST_H
diff --git a/include/contest_painting.h b/include/contest_painting.h
new file mode 100644
index 000000000..896aa299b
--- /dev/null
+++ b/include/contest_painting.h
@@ -0,0 +1,77 @@
+#ifndef GUARD_CONTESTPAINTING_H
+#define GUARD_CONTESTPAINTING_H
+
+#define MOSAIC_BIT_BG_HSIZE (0)
+#define MOSAIC_BIT_BG_VSIZE (4)
+#define MOSAIC_BIT_OBJ_HSIZE (8)
+#define MOSAIC_BIT_OBJ_VSIZE (12)
+
+enum
+{
+ CONTEST_COOL,
+ CONTEST_BEAUTY,
+ CONTEST_CUTE,
+ CONTEST_SMART,
+ CONTEST_TOUGH,
+};
+
+enum
+{
+ CONTESTRESULT_COOL = 9,
+ CONTESTRESULT_BEAUTY = 13,
+ CONTESTRESULT_CUTE = 2,
+ CONTESTRESULT_SMART = 36,
+ CONTESTRESULT_TOUGH = 6,
+};
+
+struct Unk2015E00
+{
+ u16 unk2015e00[128][32];
+ u16 unk2017e00[0];
+};
+
+struct ContestEntry
+{
+ /*0x00*/ u8 var0;
+ /*0x04*/ u32 var4;
+ /*0x08*/ u16 var8;
+ /*0x0A*/ u8 contestType;
+ /*0x0B*/ u8 pokemon_name[POKEMON_NAME_LENGTH];
+ /*0x15*/ u8 pad15;
+ /*0x16*/ u8 trainer_name[OT_NAME_LENGTH];
+};
+
+struct Unk3000756
+{
+ /*0x00*/ u8 var_0;
+};
+
+struct LabelPair
+{
+ const u8 *prefix;
+ const u8 *suffix;
+};
+
+struct Unk03005E20
+{
+ u8 var_0;
+ u8 pad1[3];
+ u16 (*var_4)[][32];
+ u16 (*var_8)[];
+ u8 pad0C[4];
+ u32 var_10;
+ u16 var_14;
+ u16 var_16;
+ u8 var_18;
+ u8 var_19;
+ u8 var_1A;
+ u8 var_1B;
+ u8 var_1C;
+ u8 var_1D;
+ u8 var_1E;
+ u8 var_1F;
+};
+
+void sub_8106630(u32);
+
+#endif
diff --git a/include/dewford_trend.h b/include/dewford_trend.h
new file mode 100644
index 000000000..713d491b6
--- /dev/null
+++ b/include/dewford_trend.h
@@ -0,0 +1,10 @@
+#ifndef GUARD_DEWFORDTREND_H
+#define GUARD_DEWFORDTREND_H
+
+#define ARRAY_2007800 ((struct EasyChatPair *)(unk_2000000 + 0x7800))
+#define ARRAY_2007900 ((struct EasyChatPair *)(unk_2000000 + 0x7900))
+
+void sub_80FA17C(void);
+void sub_80FA4E4(void *, u32, u8);
+
+#endif
diff --git a/include/field_control_avatar.h b/include/field_control_avatar.h
new file mode 100644
index 000000000..3f17ebee9
--- /dev/null
+++ b/include/field_control_avatar.h
@@ -0,0 +1,13 @@
+#ifndef GUARD_FIELDCONTROLAVATAR_H
+#define GUARD_FIELDCONTROLAVATAR_H
+
+void FieldClearPlayerInput(struct FieldInput *pStruct);
+void FieldGetPlayerInput(struct FieldInput *pStruct, u16 keys, u16 heldKeys);
+int sub_8068024(struct FieldInput *pStruct);
+u8 *sub_80682A8(struct MapPosition *, u8, u8);
+void overworld_poison_timer_set(void);
+void prev_quest_postbuffer_cursor_backup_reset(void);
+u8 *sub_8068E24(struct MapPosition *);
+u8 *GetFieldObjectScriptPointerForComparison();
+
+#endif
diff --git a/include/field_door.h b/include/field_door.h
new file mode 100644
index 000000000..1759e0dc1
--- /dev/null
+++ b/include/field_door.h
@@ -0,0 +1,25 @@
+#ifndef GUARD_FIELDDOOR_H
+#define GUARD_FIELDDOOR_H
+
+struct DoorGraphics
+{
+ u16 metatileNum;
+ u8 unk2;
+ void *tiles;
+ void *palette;
+};
+
+struct DoorAnimFrame
+{
+ u8 time;
+ u16 offset;
+};
+
+void FieldSetDoorOpened(u32, u32);
+void FieldSetDoorClosed(u32, u32);
+s8 FieldAnimateDoorClose(u32, u32);
+s8 FieldAnimateDoorOpen(u32, u32);
+bool8 FieldIsDoorAnimationRunning(void);
+u32 sub_8058790(u32 x, u32 y);
+
+#endif
diff --git a/include/field_map_obj_helpers.h b/include/field_map_obj_helpers.h
new file mode 100644
index 000000000..5498bde12
--- /dev/null
+++ b/include/field_map_obj_helpers.h
@@ -0,0 +1,11 @@
+#ifndef GUARD_FIELDMAPOBJHELP_H
+#define GUARD_FIELDMAPOBJHELP_H
+
+bool8 FreezeMapObject(struct MapObject *);
+void FreezeMapObjects(void);
+void FreezeMapObjectsExceptOne(u8);
+void UnfreezeMapObjects(void);
+void sub_806487C(struct Sprite *sprite, bool8 invisible);
+void sub_8064990(u8, u8);
+
+#endif
diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h
index 3efca3af7..a4f77a172 100644
--- a/include/field_player_avatar.h
+++ b/include/field_player_avatar.h
@@ -78,7 +78,7 @@ u8 GetPlayerAvatarGraphicsIdByCurrentState(void);
void SetPlayerAvatarExtraStateTransition(u8 a, u8 b);
void InitPlayerAvatar(s16 a, s16 b, u8 c, u8 d);
// sub_8059B88
-// sub_8059BF4
+void sub_8059BF4(void);
// sub_8059C3C
void sub_8059C94(u8);
// sub_8059D08
diff --git a/include/gba/flash_internal.h b/include/gba/flash_internal.h
index 6156b6c14..cbcfb5466 100644
--- a/include/gba/flash_internal.h
+++ b/include/gba/flash_internal.h
@@ -65,6 +65,10 @@ u16 ReadFlashId(void);
void StartFlashTimer(u8 phase);
void SetReadFlash1(u16 *dest);
void StopFlashTimer(void);
+u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void));
+u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src);
+void ReadFlash(u16 sectorNum, u32 offset, u8 *dest, u32 size);
+u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, u8 *src, u32 n);
u16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData);
@@ -73,4 +77,7 @@ u16 EraseFlashSector_MX(u16 sectorNum);
u16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data);
u16 ProgramFlashSector_MX(u16 sectorNum, u8 *src);
+// agb_flash_1m
+u16 IdentifyFlash(void);
+
#endif // GUARD_GBA_FLASH_INTERNAL_H
diff --git a/include/global.h b/include/global.h
index 56338a9e8..ad08af84f 100644
--- a/include/global.h
+++ b/include/global.h
@@ -71,6 +71,11 @@ enum
BAG_KEYITEMS
};
+struct TextStruct
+{
+ const u8 *text;
+};
+
struct Coords16
{
s16 x;
@@ -167,7 +172,8 @@ struct RamScript
struct SB1_2EFC_Struct
{
- u8 unknown[0x20];
+ u16 var;
+ u8 unknown[0x1E];
};
struct EasyChatPair
@@ -295,6 +301,25 @@ typedef union OldMan {
struct UnkMauvilleOldManStruct2 oldMan2;
} OldMan;
+struct Unk_SB_Access_Struct1
+{
+ u8 filler0[0xF8];
+ struct SB1_2EFC_Struct sb1_2EFC_struct[5];
+};
+
+struct Unk_SB_Access_Struct2
+{
+ struct SB1_2EFC_Struct sb1_2EFC_struct2[12]; // each is 0x20
+ /*0x2F84*/ u8 filler[0x18];
+};
+
+/*0x2E04*/
+typedef union SB_Struct {
+ struct Unk_SB_Access_Struct1 unkSB1;
+ struct Unk_SB_Access_Struct2 unkSB2;
+} SB_Struct;
+// size is 0x198
+
struct SaveBlock1 /* 0x02025734 */
{
/*0x00*/ struct Coords16 pos;
@@ -364,8 +389,8 @@ struct SaveBlock1 /* 0x02025734 */
/*0x2D94*/ OldMan oldMan;
/*0x2DC0*/ u8 unk_2DC0[0x14];
/*0x2DD4*/ struct EasyChatPair easyChatPairs[5]; //Dewford trend [0] and some other stuff
- /*0x2DFC*/ u8 filler_2DFC[0x100];
- /*0x2EFC*/ struct SB1_2EFC_Struct sb1_2EFC_struct[5];
+ /*0x2DFC*/ u8 filler_2DFC[0x8];
+ /*0x2E04*/ SB_Struct sbStruct;
/*0x2F9C*/ u8 filler_2F9C[0xA0];
/*0x303C*/ u8 filler_303C[0x38];
/*0x3074*/ u8 filler_3074[0x42];
diff --git a/include/intro.h b/include/intro.h
index a859a9ce4..7fdbd9cb0 100644
--- a/include/intro.h
+++ b/include/intro.h
@@ -3,5 +3,6 @@
void c2_copyright_1(void);
void CB2_InitCopyrightScreen(void);
+void sub_813CE30(u16, u16, u16, u16);
#endif // GUARD_INTRO_H
diff --git a/include/matsuda_debug_menu.h b/include/matsuda_debug_menu.h
new file mode 100644
index 000000000..5df53d688
--- /dev/null
+++ b/include/matsuda_debug_menu.h
@@ -0,0 +1,11 @@
+#ifndef GUARD_MATSUDADEBUG_H
+#define GUARD_MATSUDADEBUG_H
+
+#define BIT(n) (1 << (n))
+
+void sub_80AB184(void);
+void sub_80AA280(u8);
+void sub_80AA5E8(u8);
+void sub_80AA658(u8);
+
+#endif
diff --git a/include/name_string_util.h b/include/name_string_util.h
new file mode 100644
index 000000000..110f8cc22
--- /dev/null
+++ b/include/name_string_util.h
@@ -0,0 +1,7 @@
+#ifndef GUARD_NAMESTRINGUTIL_H
+#define GUARD_NAMESTRINGUTIL_H
+
+void PadNameString(u8 *a1, u8 a2);
+void SanitizeNameString(u8 *a1);
+
+#endif
diff --git a/include/naming_screen.h b/include/naming_screen.h
new file mode 100644
index 000000000..b6b464538
--- /dev/null
+++ b/include/naming_screen.h
@@ -0,0 +1,83 @@
+#ifndef GUARD_NAMINGSCREEN_H
+#define GUARD_NAMINGSCREEN_H
+
+#define KBEVENT_NONE 0
+#define KBEVENT_PRESSED_A 5
+#define KBEVENT_PRESSED_B 6
+#define KBEVENT_PRESSED_SELECT 8
+#define KBEVENT_PRESSED_START 9
+
+enum
+{
+ NAMING_SCREEN_TEMPLATE_PLAYER_NAME,
+ NAMING_SCREEN_TEMPLATE_BOX_NAME,
+ NAMING_SCREEN_TEMPLATE_MON_NAME,
+};
+
+struct NamingScreenTemplate
+{
+ u8 unk0;
+ u8 maxChars;
+ u8 unk2;
+ u8 unk3;
+ u8 unk4; //mode?
+ u8 unk5;
+ u8 unk6;
+ u8 unk7;
+ const u8 *title;
+};
+
+struct NamingScreenData
+{
+ /*0x00*/ u8 state;
+ /*0x01*/ u8 templateNum;
+ /*0x02*/ u16 unk2;
+ /*0x04*/ u16 bg1vOffset;
+ /*0x06*/ u16 bg2vOffset;
+ /*0x08*/ u16 unk8;
+ /*0x0A*/ u16 unkA;
+ /*0x0C*/ u8 unkC;
+ /*0x0D*/ u8 unkD;
+ /*0x0E*/ u8 currentPage;
+ /*0x0F*/ u8 cursorSpriteId;
+ /*0x10*/ u8 unk10;
+ /*0x11*/ u8 textBuffer[0x10];
+ /*0x21*/ u8 filler21[0x13];
+ const struct NamingScreenTemplate *template;
+ /*0x38*/ u8 *destBuffer;
+ /*0x3C*/ u16 unk3C; //savedKeyRepeatStartDelay
+ /*0x3E*/ u16 unk3E;
+ /*0x40*/ u16 unk40;
+ /*0x42*/ u32 unk42;
+ /*0x46*/ MainCallback returnCallback;
+};
+
+enum
+{
+ PAGE_UPPER,
+ PAGE_LOWER,
+ PAGE_OTHERS,
+};
+
+enum
+{
+ MAIN_STATE_BEGIN_FADE_IN,
+ MAIN_STATE_WAIT_FADE_IN,
+ MAIN_STATE_HANDLE_INPUT,
+ MAIN_STATE_MOVE_TO_OK_BUTTON,
+ MAIN_STATE_START_PAGE_SWAP,
+ MAIN_STATE_WAIT_PAGE_SWAP,
+ MAIN_STATE_6,
+ MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE,
+ MAIN_STATE_BEGIN_FADE_OUT,
+};
+
+enum
+{
+ INPUT_STATE_DISABLED,
+ INPUT_STATE_ENABLED,
+};
+
+void DoNamingScreen(u8 r0, u8 *r1, u16 r2, u16 r3, u32 s0, MainCallback s4);
+
+#endif
diff --git a/include/rom4.h b/include/rom4.h
index bb3486c38..5aae277a6 100644
--- a/include/rom4.h
+++ b/include/rom4.h
@@ -20,7 +20,7 @@ struct LinkPlayerMapObject
// sub_8052F5C
// flag_var_implications_of_teleport_
void new_game(void);
-// sub_8053014
+void sub_8053014(void);
void sub_8053050(void);
// sub_805308C
void ResetGameStats(void);
diff --git a/include/rom6.h b/include/rom6.h
new file mode 100644
index 000000000..e7a3ba48e
--- /dev/null
+++ b/include/rom6.h
@@ -0,0 +1,7 @@
+#ifndef GUARD_ROM6_H
+#define GUARD_ROM6_H
+
+bool8 npc_before_player_of_type(u8);
+u8 oei_task_add(void);
+
+#endif
diff --git a/include/save.h b/include/save.h
index fe22e4ad7..b9d4121ec 100644
--- a/include/save.h
+++ b/include/save.h
@@ -12,38 +12,63 @@ struct SaveSection
u8 data[0xFF4];
u16 id;
u16 checksum;
- u32 unknown;
+ u32 security;
u32 counter;
-};
+}; // size is 0x1000
+// headless save section?
struct UnkSaveSection
{
u8 data[0xFF4];
- u32 unknown;
+ u32 security;
+}; // size is 0xFF8
+
+// Ruby/Sapphire's save data is Flash 128K, which is 32 save sectors.
+#define NUM_SECTORS 32 // defined in agb_flash but not in a header
+
+#define UNKNOWN_CHECK_VALUE 0x8012025
+
+// SetDamagedSectorBits states
+enum
+{
+ ENABLE,
+ DISABLE,
+ CHECK // unused
+};
+
+// Do save types
+enum
+{
+ NORMAL_SAVE,
+ LINK_SAVE,
+ EREADER_SAVE, // mossdeep event
+ HOF_SAVE,
+ DIFFERENT_FILE_SAVE,
+ HOF_DELETE_SAVE // unused
};
void ClearSaveData(void);
-void sub_81251B8(void);
-bool32 sub_81251D4(u8 op, u8 bit);
-u8 save_write_to_flash(u16 a1, struct SaveSectionLocation *a2);
-u8 sub_81252D8(u16, struct SaveSectionLocation *);
-u8 sub_81253C8(u8 sector, u8 *data, u16 size);
-u8 sub_8125440(u8, u8 *);
-u32 sub_812546C(struct SaveSectionLocation *a1);
-u32 sub_81254C8(struct SaveSectionLocation *a1);
-u8 sub_812550C(u16 a1, struct SaveSectionLocation *a2);
-u8 sub_812556C(u16 a1, struct SaveSectionLocation *a2);
-u8 sub_81255B8(u16, struct SaveSectionLocation *);
-u8 sub_8125758(u16 a1, struct SaveSectionLocation *a2);
-u8 sub_81257F0(u16 a1, struct SaveSectionLocation *a2);
-u8 sub_812587C(u16 a1, struct SaveSectionLocation *a2);
-u8 sub_81258BC(u16, struct SaveSectionLocation *);
-u8 sub_8125974(struct SaveSectionLocation *);
+void ResetSaveCounters(void);
+bool32 ManipulateSectorBits(u8 op, u8 bit);
+u8 save_write_to_flash(u16 a1, const struct SaveSectionLocation *a2);
+u8 HandleWriteSector(u16, const struct SaveSectionLocation *);
+u8 HandleWriteSectorNBytes(u8 sector, u8 *data, u16 size);
+u8 TryWriteSector(u8, u8 *);
+u32 RestoreSaveBackupVarsAndIncrement(const struct SaveSectionLocation *location);
+u32 RestoreSaveBackupVars(const struct SaveSectionLocation *location);
+u8 sub_812550C(u16 a1, const struct SaveSectionLocation *location);
+u8 sub_812556C(u16 a1, const struct SaveSectionLocation *location);
+u8 sub_81255B8(u16, const struct SaveSectionLocation *location);
+u8 sub_8125758(u16 a1, const struct SaveSectionLocation *location);
+u8 sub_81257F0(u16 a1, const struct SaveSectionLocation *location);
+u8 sub_812587C(u16 a1, const struct SaveSectionLocation *location);
+u8 sub_81258BC(u16, const struct SaveSectionLocation *location);
+u8 sub_8125974(const struct SaveSectionLocation *location);
u8 sub_8125B88(u8 a1, u8 *data, u16 size);
u8 sub_8125BF8(u8, struct SaveSection *);
-u16 sub_8125C10(void *, u16);
-u8 sub_8125C3C(u8 a1);
-u8 sub_8125D44(u8 a1);
+u16 CalculateChecksum(void *, u16);
+u8 HandleSavingData(u8 saveType);
+u8 TrySavingData(u8 saveType);
u8 sub_8125D80(void);
bool8 sub_8125DA8(void);
u8 sub_8125DDC(void);
diff --git a/include/script_menu.h b/include/script_menu.h
new file mode 100644
index 000000000..7a504556e
--- /dev/null
+++ b/include/script_menu.h
@@ -0,0 +1,31 @@
+#ifndef GUARD_SCRIPTMENU_H
+#define GUARD_SCRIPTMENU_H
+
+struct MultichoiceListStruct
+{
+ struct MenuAction *list;
+ u8 count;
+};
+
+bool8 sub_80B5054(u8 left, u8 top, u8 var3, u8 var4);
+bool8 sub_80B50B0(u8 left, u8 top, u8 var3, u8 var4, u8 var5);
+u16 GetStringWidthInTilesForScriptMenu(const u8 *str);
+void DrawMultichoiceMenu(u8, u8, u8, struct MenuAction *list, u8, u8);
+void sub_80B5230(u8, u8, u8, u8, u8, u8);
+void sub_80B52B4(u8);
+bool8 Multichoice(u8 var1, u8 var2, u8 var3, u8 var4);
+void sub_80B53B4(u8, u8, u8, struct MenuAction *list, u8);
+bool8 yes_no_box(u8 var1, u8 var2);
+bool8 IsScriptActive(void); // unused
+void task_yes_no_maybe(u8);
+bool8 sub_80B5578(u8 left, u8 top, u8 multichoiceId, u8 a4, u8 columnCount);
+void sub_80B5684(u8);
+bool8 TryCreatePCMenu(void);
+void CreatePCMenu(void);
+void sub_80B5838(void);
+void task_picbox(u8 taskId);
+bool8 sub_80B58C4(u16 var1, u8 var2, u8 var3);
+void *picbox_close(void);
+bool8 sub_80B59AC(void);
+
+#endif
diff --git a/include/script_pokemon_80C4.h b/include/script_pokemon_80C4.h
new file mode 100644
index 000000000..6d4e689b5
--- /dev/null
+++ b/include/script_pokemon_80C4.h
@@ -0,0 +1,22 @@
+#ifndef GUARD_SCRIPTPOKE80C4_H
+#define GUARD_SCRIPTPOKE80C4_H
+
+struct MonCoords
+{
+ u8 x, y;
+};
+
+void sub_80C5190(u8);
+void sub_80C5580(void);
+void SetBattleTowerPlayerParty(void);
+void ReducePlayerPartyToThree(void);
+
+u8 sub_80C4D50(void);
+void ShowContestWinner(void);
+void HealPlayerParty();
+u8 ScriptGiveMon(u16, u8, u16, u32, u32, u8);
+u8 ScriptGiveEgg(u16);
+void ScriptWildBattle(u16, u8, u16);
+void ScriptSetMonMoveSlot(u8, u16, u8);
+
+#endif
diff --git a/include/script_pokemon_80F9.h b/include/script_pokemon_80F9.h
new file mode 100644
index 000000000..d65c99c15
--- /dev/null
+++ b/include/script_pokemon_80F9.h
@@ -0,0 +1,17 @@
+#ifndef GUARD_SCRIPTPOKE80F9_H
+#define GUARD_SCRIPTPOKE80F9_H
+
+struct UnknownStruct2018000
+{
+ u8 filler0[0x8];
+ u8 unk8;
+};
+
+extern struct UnknownStruct2018000 unk_2018000;
+
+void sub_80F9A8C(u8);
+void sub_80F9C00(void);
+void sub_80F9E1C(void);
+void sub_80F99CC(void);
+
+#endif
diff --git a/include/trainer_see.h b/include/trainer_see.h
index e4d1fe270..dd04912e7 100644
--- a/include/trainer_see.h
+++ b/include/trainer_see.h
@@ -30,5 +30,7 @@ void sub_80846E4(u8 taskId);
void sub_8084794(u32 var);
void sub_80847C8(void);
void sub_80847D8(u8);
+void sub_8084894(struct Sprite *sprite, u16 a2, u8 a3);
+void objc_exclamation_mark_probably(struct Sprite *sprite);
#endif // GUARD_TRAINER_SEE_H
diff --git a/include/vars.h b/include/vars.h
index e041e33bb..3fc71dc15 100644
--- a/include/vars.h
+++ b/include/vars.h
@@ -23,4 +23,6 @@
#define VAR_BARBOACH_SIZE_RECORD 0x404F
+#define VAR_PORTHOLE 0x40B4
+
#endif // GUARD_VARS_H