summaryrefslogtreecommitdiff
path: root/src/field
diff options
context:
space:
mode:
Diffstat (limited to 'src/field')
-rw-r--r--src/field/battle_tower.c287
-rw-r--r--src/field/berry.c521
-rw-r--r--src/field/berry_tag_screen.c36
-rw-r--r--src/field/bike.c20
-rw-r--r--src/field/braille_puzzles.c4
-rw-r--r--src/field/choose_party.c142
-rw-r--r--src/field/coins.c6
-rw-r--r--src/field/coord_event_weather.c4
-rw-r--r--src/field/daycare.c24
-rw-r--r--src/field/decoration.c145
-rw-r--r--src/field/decoration_inventory.c11
-rw-r--r--src/field/diploma.c12
-rw-r--r--src/field/easy_chat.c445
-rw-r--r--src/field/field_control_avatar.c76
-rw-r--r--src/field/field_effect.c27
-rw-r--r--src/field/field_effect_helpers.c6
-rw-r--r--src/field/field_fadetransition.c32
-rw-r--r--src/field/field_map_obj.c522
-rw-r--r--src/field/field_message_box.c20
-rw-r--r--src/field/field_player_avatar.c215
-rw-r--r--src/field/field_poison.c47
-rw-r--r--src/field/field_region_map.c14
-rw-r--r--src/field/field_screen_effect.c30
-rw-r--r--src/field/field_specials.c82
-rw-r--r--src/field/field_weather.c983
-rw-r--r--src/field/field_weather_effects.c85
-rw-r--r--src/field/fieldmap.c18
-rw-r--r--src/field/fldeff_cut.c113
-rw-r--r--src/field/fldeff_escalator.c132
-rw-r--r--src/field/fldeff_flash.c30
-rw-r--r--src/field/fldeff_poison.c4
-rw-r--r--src/field/fldeff_secretpower.c96
-rw-r--r--src/field/fldeff_softboiled.c4
-rw-r--r--src/field/fldeff_strength.c23
-rw-r--r--src/field/item.c2
-rw-r--r--src/field/item_menu.c742
-rw-r--r--src/field/item_use.c46
-rw-r--r--src/field/map_name_popup.c8
-rw-r--r--src/field/mauville_man.c107
-rw-r--r--src/field/menu_helpers.c149
-rw-r--r--src/field/money.c12
-rw-r--r--src/field/overworld.c148
-rw-r--r--src/field/party_menu.c800
-rw-r--r--src/field/pc_screen_effect.c17
-rw-r--r--src/field/player_pc.c320
-rw-r--r--src/field/pokeblock.c192
-rw-r--r--src/field/pokedex_area_screen.c20
-rw-r--r--src/field/pokenav.c16
-rw-r--r--src/field/region_map.c55
-rw-r--r--src/field/roamer.c19
-rw-r--r--src/field/safari_zone.c4
-rw-r--r--src/field/scrcmd.c18
-rw-r--r--src/field/script_menu.c68
-rw-r--r--src/field/secret_base.c263
-rw-r--r--src/field/shop.c731
-rw-r--r--src/field/slot_machine.c7757
-rw-r--r--src/field/start_menu.c410
-rw-r--r--src/field/starter_choose.c34
-rw-r--r--src/field/trader.c30
-rw-r--r--src/field/tv.c34
-rw-r--r--src/field/use_pokeblock.c41
-rw-r--r--src/field/wallclock.c43
-rw-r--r--src/field/wild_encounter.c43
63 files changed, 13468 insertions, 2877 deletions
diff --git a/src/field/battle_tower.c b/src/field/battle_tower.c
index caebc6a7b..41d5ae9d1 100644
--- a/src/field/battle_tower.c
+++ b/src/field/battle_tower.c
@@ -103,59 +103,59 @@ static const u16 sBattleTowerHeldItems[] = {
#include "../data/battle_tower/level_100_mons.h"
static const u8 sMaleTrainerClasses[] = {
- TRAINER_CLASS_RUIN_MANIAC,
- TRAINER_CLASS_TUBER_M,
- TRAINER_CLASS_COOL_TRAINER_M,
- TRAINER_CLASS_RICH_BOY,
- TRAINER_CLASS_POKEMANIAC,
- TRAINER_CLASS_SWIMMER_M,
- TRAINER_CLASS_BLACK_BELT,
- TRAINER_CLASS_GUITARIST,
- TRAINER_CLASS_KINDLER,
- TRAINER_CLASS_CAMPER,
- TRAINER_CLASS_BUG_MANIAC,
- TRAINER_CLASS_PSYCHIC_M,
- TRAINER_CLASS_GENTLEMAN,
- TRAINER_CLASS_SCHOOL_KID_M,
- TRAINER_CLASS_POKEFAN_M,
- TRAINER_CLASS_EXPERT_M,
- TRAINER_CLASS_YOUNGSTER,
- TRAINER_CLASS_FISHERMAN,
- TRAINER_CLASS_CYCLING_TRIATHLETE_M,
- TRAINER_CLASS_RUNNING_TRIATHLETE_M,
- TRAINER_CLASS_SWIMMING_TRIATHLETE_M,
- TRAINER_CLASS_DRAGON_TAMER,
- TRAINER_CLASS_BIRD_KEEPER,
- TRAINER_CLASS_NINJA_BOY,
- TRAINER_CLASS_SAILOR,
- TRAINER_CLASS_COLLECTOR,
- TRAINER_CLASS_POKEMON_BREEDER_M,
- TRAINER_CLASS_POKEMON_RANGER_M,
- TRAINER_CLASS_BUG_CATCHER,
- TRAINER_CLASS_HIKER,
+ FACILITY_CLASS_RUIN_MANIAC,
+ FACILITY_CLASS_TUBER_M,
+ FACILITY_CLASS_COOL_TRAINER_M,
+ FACILITY_CLASS_RICH_BOY,
+ FACILITY_CLASS_POKEMANIAC,
+ FACILITY_CLASS_SWIMMER_M,
+ FACILITY_CLASS_BLACK_BELT,
+ FACILITY_CLASS_GUITARIST,
+ FACILITY_CLASS_KINDLER,
+ FACILITY_CLASS_CAMPER,
+ FACILITY_CLASS_BUG_MANIAC,
+ FACILITY_CLASS_PSYCHIC_M,
+ FACILITY_CLASS_GENTLEMAN,
+ FACILITY_CLASS_SCHOOL_KID_M,
+ FACILITY_CLASS_POKEFAN_M,
+ FACILITY_CLASS_EXPERT_M,
+ FACILITY_CLASS_YOUNGSTER,
+ FACILITY_CLASS_FISHERMAN,
+ FACILITY_CLASS_CYCLING_TRIATHLETE_M,
+ FACILITY_CLASS_RUNNING_TRIATHLETE_M,
+ FACILITY_CLASS_SWIMMING_TRIATHLETE_M,
+ FACILITY_CLASS_DRAGON_TAMER,
+ FACILITY_CLASS_BIRD_KEEPER,
+ FACILITY_CLASS_NINJA_BOY,
+ FACILITY_CLASS_SAILOR,
+ FACILITY_CLASS_COLLECTOR,
+ FACILITY_CLASS_POKEMON_BREEDER_M,
+ FACILITY_CLASS_POKEMON_RANGER_M,
+ FACILITY_CLASS_BUG_CATCHER,
+ FACILITY_CLASS_HIKER,
};
static const u8 sFemaleTrainerClasses[] = {
- TRAINER_CLASS_AROMA_LADY,
- TRAINER_CLASS_TUBER_F,
- TRAINER_CLASS_COOL_TRAINER_F,
- TRAINER_CLASS_HEX_MANIAC,
- TRAINER_CLASS_LADY,
- TRAINER_CLASS_BEAUTY,
- TRAINER_CLASS_PSYCHIC_F,
- TRAINER_CLASS_SCHOOL_KID_F,
- TRAINER_CLASS_POKEFAN_F,
- TRAINER_CLASS_EXPERT_F,
- TRAINER_CLASS_CYCLING_TRIATHLETE_F,
- TRAINER_CLASS_RUNNING_TRIATHLETE_F,
- TRAINER_CLASS_SWIMMING_TRIATHLETE_F,
- TRAINER_CLASS_BATTLE_GIRL,
- TRAINER_CLASS_PARASOL_LADY,
- TRAINER_CLASS_SWIMMER_F,
- TRAINER_CLASS_PICNICKER,
- TRAINER_CLASS_POKEMON_BREEDER_F,
- TRAINER_CLASS_POKEMON_RANGER_F,
- TRAINER_CLASS_LASS,
+ FACILITY_CLASS_AROMA_LADY,
+ FACILITY_CLASS_TUBER_F,
+ FACILITY_CLASS_COOL_TRAINER_F,
+ FACILITY_CLASS_HEX_MANIAC,
+ FACILITY_CLASS_LADY,
+ FACILITY_CLASS_BEAUTY,
+ FACILITY_CLASS_PSYCHIC_F,
+ FACILITY_CLASS_SCHOOL_KID_F,
+ FACILITY_CLASS_POKEFAN_F,
+ FACILITY_CLASS_EXPERT_F,
+ FACILITY_CLASS_CYCLING_TRIATHLETE_F,
+ FACILITY_CLASS_RUNNING_TRIATHLETE_F,
+ FACILITY_CLASS_SWIMMING_TRIATHLETE_F,
+ FACILITY_CLASS_BATTLE_GIRL,
+ FACILITY_CLASS_PARASOL_LADY,
+ FACILITY_CLASS_SWIMMER_F,
+ FACILITY_CLASS_PICNICKER,
+ FACILITY_CLASS_POKEMON_BREEDER_F,
+ FACILITY_CLASS_POKEMON_RANGER_F,
+ FACILITY_CLASS_LASS,
};
static const u8 sMaleTrainerGfxIds[] = {
@@ -255,11 +255,11 @@ static void ResetBattleTowerStreak(u8 levelType);
static void ValidateBattleTowerRecordChecksums(void);
static void PrintEReaderTrainerFarewellMessage(void);
extern void SetBattleTowerTrainerGfxId(u8);
-extern void sub_8135A3C(void);
+static void SaveCurrentWinStreak(void);
static void sub_8135CFC(void);
static void CheckMonBattleTowerBanlist(u16, u16, u16, u8, u8, u16 *, u16 *, u8 *);
static void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *);
-static void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer);
+void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer);
static void SetBattleTowerRecordChecksum(struct BattleTowerRecord *);
static void ClearBattleTowerRecord(struct BattleTowerRecord *);
@@ -1538,7 +1538,7 @@ void CheckPartyBattleTowerBanlist(void)
StringAppend(gStringVar1, BattleText_Format8);
return;
}
-
+
if (1 & counter)
StringAppend(gStringVar1, BattleText_Format6);
else
@@ -1699,7 +1699,7 @@ void SetBattleTowerProperty(void)
}
gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]++;
- sub_8135A3C();
+ SaveCurrentWinStreak();
gSpecialVar_Result = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType];
gStringVar1[0] = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] + 0xA1;
@@ -1711,7 +1711,7 @@ void SetBattleTowerProperty(void)
gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]++;
}
- sub_8135A3C();
+ SaveCurrentWinStreak();
gSpecialVar_Result = gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType];
break;
case 8:
@@ -1801,118 +1801,35 @@ void SetBattleTowerParty(void)
ReducePlayerPartyToThree();
}
-#ifdef NONMATCHING
-void sub_8135A3C(void)
+static void SaveCurrentWinStreak(void)
{
- u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType;
- u16 winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType);
+ u8 levelType = gSaveBlock2.battleTower.battleTowerLevelType;
+ u16 streak = GetCurrentBattleTowerWinStreak(levelType);
- if (gSaveBlock2.battleTower.recordWinStreaks[battleTowerLevelType] < winStreak)
- {
- gSaveBlock2.battleTower.recordWinStreaks[battleTowerLevelType] = winStreak;
- }
+ if (gSaveBlock2.battleTower.recordWinStreaks[levelType] < streak)
+ gSaveBlock2.battleTower.recordWinStreaks[levelType] = streak;
if (gSaveBlock2.battleTower.recordWinStreaks[0] > gSaveBlock2.battleTower.recordWinStreaks[1])
{
- u16 streak = gSaveBlock2.battleTower.recordWinStreaks[0];
+ streak = gSaveBlock2.battleTower.recordWinStreaks[0];
SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak);
+
if (streak > 9999)
- {
gSaveBlock2.battleTower.bestBattleTowerWinStreak = 9999;
- }
else
- {
gSaveBlock2.battleTower.bestBattleTowerWinStreak = streak;
- }
}
else
{
- u16 streak = gSaveBlock2.battleTower.recordWinStreaks[1];
+ streak = gSaveBlock2.battleTower.recordWinStreaks[1];
SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak);
+
if (streak > 9999)
- {
gSaveBlock2.battleTower.bestBattleTowerWinStreak = 9999;
- }
else
- {
gSaveBlock2.battleTower.bestBattleTowerWinStreak = streak;
- }
}
}
-#else
-__attribute__((naked))
-void sub_8135A3C(void)
-{
- asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- ldr r6, _08135A84 @ =gSaveBlock2\n\
- ldr r1, _08135A88 @ =0x00000554\n\
- adds r0, r6, r1\n\
- ldrb r4, [r0]\n\
- lsls r4, 31\n\
- lsrs r4, 31\n\
- adds r0, r4, 0\n\
- bl GetCurrentBattleTowerWinStreak\n\
- lsls r0, 16\n\
- lsrs r5, r0, 16\n\
- lsls r4, 1\n\
- movs r3, 0xAC\n\
- lsls r3, 3\n\
- adds r2, r6, r3\n\
- adds r4, r2\n\
- ldrh r0, [r4]\n\
- cmp r0, r5\n\
- bcs _08135A66\n\
- strh r5, [r4]\n\
-_08135A66:\n\
- ldr r0, _08135A8C @ =0x00000562\n\
- adds r1, r6, r0\n\
- ldrh r0, [r2]\n\
- ldrh r3, [r1]\n\
- cmp r0, r3\n\
- bls _08135A94\n\
- adds r5, r0, 0\n\
- movs r0, 0x20\n\
- adds r1, r5, 0\n\
- bl SetGameStat\n\
- ldr r1, _08135A90 @ =0x0000270f\n\
- cmp r5, r1\n\
- bhi _08135AA4\n\
- b _08135AB4\n\
- .align 2, 0\n\
-_08135A84: .4byte gSaveBlock2\n\
-_08135A88: .4byte 0x00000554\n\
-_08135A8C: .4byte 0x00000562\n\
-_08135A90: .4byte 0x0000270f\n\
-_08135A94:\n\
- ldrh r5, [r1]\n\
- movs r0, 0x20\n\
- adds r1, r5, 0\n\
- bl SetGameStat\n\
- ldr r1, _08135AAC @ =0x0000270f\n\
- cmp r5, r1\n\
- bls _08135AB4\n\
-_08135AA4:\n\
- ldr r2, _08135AB0 @ =0x00000572\n\
- adds r0, r6, r2\n\
- strh r1, [r0]\n\
- b _08135ABA\n\
- .align 2, 0\n\
-_08135AAC: .4byte 0x0000270f\n\
-_08135AB0: .4byte 0x00000572\n\
-_08135AB4:\n\
- ldr r3, _08135AC0 @ =0x00000572\n\
- adds r0, r6, r3\n\
- strh r5, [r0]\n\
-_08135ABA:\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_08135AC0: .4byte 0x00000572\n\
- .syntax divided\n");
-}
-#endif // NONMATCHING
void sub_8135AC4(void)
{
@@ -1951,7 +1868,7 @@ void sub_8135AC4(void)
}
SetBattleTowerRecordChecksum(&gSaveBlock2.battleTower.playerRecord);
- sub_8135A3C();
+ SaveCurrentWinStreak();
}
void SaveBattleTowerProgress(void)
@@ -1978,7 +1895,7 @@ void SaveBattleTowerProgress(void)
VarSet(VAR_TEMP_0, 0);
gSaveBlock2.battleTower.unk_554 = 1;
- TrySavingData(EREADER_SAVE);
+ Save_WriteData(SAVE_EREADER);
}
void BattleTower_SoftReset(void)
@@ -2068,79 +1985,15 @@ u16 GetCurrentBattleTowerWinStreak(u8 battleTowerLevelType)
return winStreak;
}
-#ifdef NONMATCHING
void DetermineBattleTowerPrize(void)
{
- u16 prizeItem;
- struct SaveBlock2 *saveBlock = &gSaveBlock2;
- u8 battleTowerLevelType = saveBlock->battleTower.battleTowerLevelType;
+ u8 levelType = gSaveBlock2.battleTower.battleTowerLevelType;
- if (saveBlock->battleTower.curStreakChallengesNum[battleTowerLevelType] - 1 > 5)
- {
- prizeItem = sLongStreakPrizes[Random() % ARRAY_COUNT(sLongStreakPrizes)];
- }
+ if (gSaveBlock2.battleTower.curStreakChallengesNum[levelType] - 1 > 5)
+ gSaveBlock2.battleTower.prizeItem = sLongStreakPrizes[Random() % ARRAY_COUNT(sLongStreakPrizes)];
else
- {
- prizeItem = sShortStreakPrizes[Random() % ARRAY_COUNT(sShortStreakPrizes)];
- }
-
- saveBlock->battleTower.prizeItem = prizeItem;
-}
-#else
-__attribute__((naked))
-void DetermineBattleTowerPrize(void)
-{
- asm(".syntax unified\n\
- push {r4,r5,lr}\n\
- ldr r5, _08135DB0 @ =gSaveBlock2\n\
- ldr r1, _08135DB4 @ =0x00000554\n\
- adds r0, r5, r1\n\
- ldrb r0, [r0]\n\
- lsls r0, 31\n\
- lsrs r0, 31\n\
- lsls r0, 1\n\
- ldr r2, _08135DB8 @ =0x0000055c\n\
- adds r1, r5, r2\n\
- adds r0, r1\n\
- ldrh r0, [r0]\n\
- subs r0, 0x1\n\
- cmp r0, 0x5\n\
- ble _08135DC0\n\
- bl Random\n\
- ldr r4, _08135DBC @ =sLongStreakPrizes\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- movs r1, 0x9\n\
- b _08135DCC\n\
- .align 2, 0\n\
-_08135DB0: .4byte gSaveBlock2\n\
-_08135DB4: .4byte 0x00000554\n\
-_08135DB8: .4byte 0x0000055c\n\
-_08135DBC: .4byte sLongStreakPrizes\n\
-_08135DC0:\n\
- bl Random\n\
- ldr r4, _08135DE8 @ =sShortStreakPrizes\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- movs r1, 0x6\n\
-_08135DCC:\n\
- bl __umodsi3\n\
- lsls r0, 16\n\
- lsrs r0, 15\n\
- adds r0, r4\n\
- ldrh r1, [r0]\n\
- movs r2, 0xAD\n\
- lsls r2, 3\n\
- adds r0, r5, r2\n\
- strh r1, [r0]\n\
- pop {r4,r5}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_08135DE8: .4byte sShortStreakPrizes\n\
- .syntax divided\n");
+ gSaveBlock2.battleTower.prizeItem = sShortStreakPrizes[Random() % ARRAY_COUNT(sShortStreakPrizes)];
}
-#endif // NONMATCHING
void GiveBattleTowerPrize(void)
{
diff --git a/src/field/berry.c b/src/field/berry.c
index 088267ad0..588807755 100644
--- a/src/field/berry.c
+++ b/src/field/berry.c
@@ -999,6 +999,66 @@ extern u16 gSpecialVar_0x8006;
static u8 CalcBerryYield(struct BerryTree *tree);
static u16 GetStageDurationByBerryType(u8 berry);
+#if DEBUG
+__attribute__((naked))
+void debug_sub_80C2B04()
+{
+ asm(
+ " push {lr}\n"
+ " mov r0, #0x0\n"
+ " bl sub_80B47D8\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " ldr r2, ._1 @ gTasks\n"
+ " lsl r1, r0, #0x2\n"
+ " add r1, r1, r0\n"
+ " lsl r1, r1, #0x3\n"
+ " add r1, r1, r2\n"
+ " ldrh r0, [r1, #0x10]\n"
+ " sub r0, r0, #0x1\n"
+ " strh r0, [r1, #0x10]\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._2:\n"
+ " .align 2, 0\n"
+ "._1:\n"
+ " .word gTasks\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_80C2B30()
+{
+ asm(
+ " push {lr}\n"
+ " mov r0, #0x1\n"
+ " bl sub_80B47D8\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " ldr r2, ._3 @ gTasks\n"
+ " lsl r1, r0, #0x2\n"
+ " add r1, r1, r0\n"
+ " lsl r1, r1, #0x3\n"
+ " add r1, r1, r2\n"
+ " ldrh r0, [r1, #0x10]\n"
+ " sub r0, r0, #0x1\n"
+ " strh r0, [r1, #0x10]\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._4:\n"
+ " .align 2, 0\n"
+ "._3:\n"
+ " .word gTasks\n"
+ "\n"
+ );
+}
+#endif
+
// unused
// this could be static, but making it so causes a compile-time warning.
void ClearEnigmaBerries(void)
@@ -1022,6 +1082,180 @@ void SetEnigmaBerry(u8 *src)
gSaveBlock1.enigmaBerry.berry.description2 = gSaveBlock1.enigmaBerry.description2;
}
+#if DEBUG
+__attribute__((naked))
+void debug_sub_80C2BD0()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " ldr r3, ._11 @ gSaveBlock1\n"
+ " ldr r1, ._11 + 4 @ 0x316c\n"
+ " add r4, r3, r1\n"
+ " ldr r6, [r4]\n"
+ " add r1, r1, #0x4\n"
+ " add r2, r3, r1\n"
+ " ldr r7, [r2]\n"
+ " mov r1, #0x0\n"
+ " str r1, [r4]\n"
+ " str r1, [r2]\n"
+ " add r4, r0, #0\n"
+ " mov r2, #0x0\n"
+ " ldr r5, ._11 + 8 @ 0x52b\n"
+ "._10:\n"
+ " add r0, r4, r1\n"
+ " ldrb r0, [r0]\n"
+ " add r2, r2, r0\n"
+ " add r1, r1, #0x1\n"
+ " cmp r1, r5\n"
+ " bls ._10 @cond_branch\n"
+ " ldr r1, ._11 + 4 @ 0x316c\n"
+ " add r0, r3, r1\n"
+ " str r6, [r0]\n"
+ " add r1, r1, #0x4\n"
+ " add r0, r3, r1\n"
+ " str r7, [r0]\n"
+ " add r0, r2, #0\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._12:\n"
+ " .align 2, 0\n"
+ "._11:\n"
+ " .word gSaveBlock1\n"
+ " .word 0x316c\n"
+ " .word 0x52b\n"
+ "\n"
+ );
+}
+#endif
+
+#if DEBUG
+__attribute__((naked))
+u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry)
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, r9\n"
+ " mov r6, r8\n"
+ " push {r6, r7}\n"
+ " add r3, r0, #0\n"
+ " lsl r1, r1, #0x18\n"
+ " lsr r1, r1, #0x18\n"
+ " mov r9, r1\n"
+ " lsl r2, r2, #0x18\n"
+ " lsr r2, r2, #0x18\n"
+ " mov r8, r2\n"
+ " ldr r4, ._16 @ gSaveBlock1\n"
+ " ldr r1, ._16 + 4 @ 0x3160\n"
+ " add r0, r4, r1\n"
+ " add r2, r0, #0\n"
+ " ldr r1, ._16 + 8 @ gBerries\n"
+ " ldmia r1!, {r5, r6, r7}\n"
+ " stmia r2!, {r5, r6, r7}\n"
+ " ldmia r1!, {r5, r6, r7}\n"
+ " stmia r2!, {r5, r6, r7}\n"
+ " ldr r1, [r1]\n"
+ " str r1, [r2]\n"
+ " add r1, r3, #0\n"
+ " bl StringCopy\n"
+ " ldr r0, ._16 + 12 @ 0x361c\n"
+ " add r6, r4, r0\n"
+ " ldr r1, ._16 + 16 @ gUnknown_Debug_083F7F84\n"
+ " add r0, r6, #0\n"
+ " bl StringCopy\n"
+ " ldr r1, ._16 + 20 @ 0x3649\n"
+ " add r5, r4, r1\n"
+ " ldr r1, ._16 + 24 @ gUnknown_Debug_083F7F90\n"
+ " add r0, r5, #0\n"
+ " bl StringCopy\n"
+ " ldr r2, ._16 + 28 @ 0x316c\n"
+ " add r0, r4, r2\n"
+ " str r6, [r0]\n"
+ " ldr r6, ._16 + 32 @ 0x3170\n"
+ " add r0, r4, r6\n"
+ " str r5, [r0]\n"
+ " mov r2, #0x0\n"
+ " ldr r6, ._16 + 36 @ 0x47f\n"
+ " ldr r7, ._16 + 40 @ 0x317c\n"
+ " add r5, r4, r7\n"
+ " ldr r3, ._16 + 44 @ gSpriteImage_UnusedCherry\n"
+ "._13:\n"
+ " add r0, r2, r5\n"
+ " add r1, r2, r3\n"
+ " ldrb r1, [r1]\n"
+ " strb r1, [r0]\n"
+ " add r2, r2, #0x1\n"
+ " cmp r2, r6\n"
+ " ble ._13 @cond_branch\n"
+ " ldr r0, ._16 @ gSaveBlock1\n"
+ " ldr r3, ._16 + 48 @ gSpritePalette_UnusedCherry\n"
+ " ldr r2, ._16 + 52 @ 0x35fc\n"
+ " add r1, r0, r2\n"
+ " mov r2, #0xf\n"
+ "._14:\n"
+ " ldrh r0, [r3]\n"
+ " strh r0, [r1]\n"
+ " add r3, r3, #0x2\n"
+ " add r1, r1, #0x2\n"
+ " sub r2, r2, #0x1\n"
+ " cmp r2, #0\n"
+ " bge ._14 @cond_branch\n"
+ " mov r2, #0x0\n"
+ " ldr r5, ._16 + 56 @ gSaveBlock1\n"
+ " ldr r3, ._16 + 60 @ gUnknown_Debug_839B6CE\n"
+ "._15:\n"
+ " add r0, r2, r5\n"
+ " add r1, r2, r3\n"
+ " ldrb r1, [r1]\n"
+ " strb r1, [r0]\n"
+ " add r2, r2, #0x1\n"
+ " cmp r2, #0x11\n"
+ " ble ._15 @cond_branch\n"
+ " ldr r5, ._16 + 64 @ 0x3688\n"
+ " add r0, r4, r5\n"
+ " mov r6, r9\n"
+ " strb r6, [r0]\n"
+ " ldr r7, ._16 + 68 @ 0x3689\n"
+ " add r0, r4, r7\n"
+ " mov r1, r8\n"
+ " strb r1, [r0]\n"
+ " ldr r2, ._16 + 4 @ 0x3160\n"
+ " add r0, r4, r2\n"
+ " bl debug_sub_80C2BD0\n"
+ " add r5, r5, #0x4\n"
+ " add r1, r4, r5\n"
+ " str r0, [r1]\n"
+ " pop {r3, r4}\n"
+ " mov r8, r3\n"
+ " mov r9, r4\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._17:\n"
+ " .align 2, 0\n"
+ "._16:\n"
+ " .word gSaveBlock1\n"
+ " .word 0x3160\n"
+ " .word gBerries\n"
+ " .word 0x361c\n"
+ " .word gUnknown_Debug_083F7F84\n"
+ " .word 0x3649\n"
+ " .word gUnknown_Debug_083F7F90\n"
+ " .word 0x316c\n"
+ " .word 0x3170\n"
+ " .word 0x47f\n"
+ " .word 0x317c\n"
+ " .word gSpriteImage_UnusedCherry\n"
+ " .word gSpritePalette_UnusedCherry\n"
+ " .word 0x35fc\n"
+ " .word gSaveBlock1+0x3676\n"
+ " .word gUnknown_Debug_839B6CE\n"
+ " .word 0x3688\n"
+ " .word 0x3689\n"
+ "\n"
+ );
+}
+#else
static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry)
{
const u8 *description1;
@@ -1051,9 +1285,110 @@ static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry)
return checksum;
}
+#endif
+
+#if DEBUG
+__attribute__((naked))
+void debug_sub_80C2D24()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, r8\n"
+ " push {r7}\n"
+ " ldr r6, [sp, #0x18]\n"
+ " ldr r4, [sp, #0x1c]\n"
+ " mov r8, r4\n"
+ " ldr r5, ._18 @ gSaveBlock1\n"
+ " ldr r7, ._18 + 4 @ 0x3175\n"
+ " add r4, r5, r7\n"
+ " strb r0, [r4]\n"
+ " ldr r4, ._18 + 8 @ 0x3176\n"
+ " add r0, r5, r4\n"
+ " strb r1, [r0]\n"
+ " add r7, r7, #0x2\n"
+ " add r0, r5, r7\n"
+ " strb r2, [r0]\n"
+ " ldr r1, ._18 + 12 @ 0x3178\n"
+ " add r0, r5, r1\n"
+ " strb r3, [r0]\n"
+ " add r4, r4, #0x3\n"
+ " add r0, r5, r4\n"
+ " strb r6, [r0]\n"
+ " add r7, r7, #0x3\n"
+ " add r0, r5, r7\n"
+ " mov r1, r8\n"
+ " strb r1, [r0]\n"
+ " sub r4, r4, #0x19\n"
+ " add r0, r5, r4\n"
+ " bl debug_sub_80C2BD0\n"
+ " ldr r7, ._18 + 16 @ 0x368c\n"
+ " add r5, r5, r7\n"
+ " str r0, [r5]\n"
+ " pop {r3}\n"
+ " mov r8, r3\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._19:\n"
+ " .align 2, 0\n"
+ "._18:\n"
+ " .word gSaveBlock1\n"
+ " .word 0x3175\n"
+ " .word 0x3176\n"
+ " .word 0x3178\n"
+ " .word 0x368c\n"
+ "\n"
+ );
+}
+#endif
// due to e-reader scans being particularly volatile to failure, it is a requirement to check for
// their integrity here due to scans possibly failing to produce the correct result.
+#if DEBUG
+__attribute__((naked))
+bool32 IsEnigmaBerryValid()
+{
+ asm(
+ " push {r4, lr}\n"
+ " ldr r4, ._24 @ gSaveBlock1\n"
+ " ldr r1, ._24 + 4 @ 0x3174\n"
+ " add r0, r4, r1\n"
+ " ldrb r0, [r0]\n"
+ " cmp r0, #0\n"
+ " beq ._22 @cond_branch\n"
+ " ldr r2, ._24 + 8 @ 0x316a\n"
+ " add r0, r4, r2\n"
+ " ldrb r0, [r0]\n"
+ " cmp r0, #0\n"
+ " beq ._22 @cond_branch\n"
+ " ldr r1, ._24 + 12 @ 0x3160\n"
+ " add r0, r4, r1\n"
+ " bl debug_sub_80C2BD0\n"
+ " ldr r2, ._24 + 16 @ 0x368c\n"
+ " add r1, r4, r2\n"
+ " ldr r1, [r1]\n"
+ " cmp r0, r1\n"
+ " bne ._22 @cond_branch\n"
+ " mov r0, #0x1\n"
+ " b ._23\n"
+ "._25:\n"
+ " .align 2, 0\n"
+ "._24:\n"
+ " .word gSaveBlock1\n"
+ " .word 0x3174\n"
+ " .word 0x316a\n"
+ " .word 0x3160\n"
+ " .word 0x368c\n"
+ "._22:\n"
+ " mov r0, #0x0\n"
+ "._23:\n"
+ " pop {r4}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+#else
bool32 IsEnigmaBerryValid(void)
{
if (gSaveBlock1.enigmaBerry.berry.stageDuration == 0)
@@ -1064,6 +1399,7 @@ bool32 IsEnigmaBerryValid(void)
return FALSE;
return TRUE;
}
+#endif
const struct Berry *GetBerryInfo(u8 berry)
{
@@ -1417,6 +1753,177 @@ bool8 PlayerHasBerries(void)
return IsBagPocketNonEmpty(BAG_BERRIES);
}
+#if DEBUG
+void debug_sub_80C33FC(u8 *buffer, s32 value, u8 n)
+{
+ StringAppend(gStringVar4, buffer);
+ ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEADING_ZEROS, n);
+ StringAppend(gStringVar4, gStringVar1);
+}
+
+extern const u8 gUnknown_Debug_083F7F9D[];
+extern const u8 gUnknown_Debug_083F7FA2[];
+extern const u8 gUnknown_Debug_083F7FA9[];
+extern const u8 gUnknown_Debug_083F7FB0[];
+extern const u8 gUnknown_Debug_083F7FB7[];
+extern const u8 gUnknown_Debug_083F7FBE[];
+extern const u8 gUnknown_Debug_083F7FC5[];
+extern const u8 gUnknown_Debug_083F7FCC[];
+extern const u8 gUnknown_Debug_083F7FD3[];
+extern const u8 gUnknown_Debug_083F7FD3[];
+extern const u8 gUnknown_Debug_083F7FD3[];
+
+#ifdef NONMATCHING
+u8* DebugOpenBerryInfo(void)
+{
+ s32 i;
+ u8 berryTreeId;
+ struct BerryTree *berryTree;
+
+ if (GetFieldObjectScriptPointerPlayerFacing() != &S_BerryTree)
+ return NULL;
+
+ berryTreeId = FieldObjectGetBerryTreeId(gSelectedMapObject);
+ berryTree = GetBerryTreeInfo(berryTreeId);
+
+ for (i = 0; i < 500; i++)
+ gStringVar4[i] |= 0xFF;
+
+ debug_sub_80C33FC(gUnknown_Debug_083F7F9D, berryTreeId, 3);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FA2, berryTree->berry, 2);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FA9, berryTree->stage, 2);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FB0, berryTree->secondsUntilNextStage, 5);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FB7, berryTree->berryYield, 2);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FBE, berryTree->regrowthCount, 3);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FC5, berryTree->growthSparkle, 1);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FCC, berryTree->watered1, 1);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered2, 1);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered3, 1);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered4, 1);
+
+ return gStringVar4;
+}
+#else
+__attribute__((naked))
+void DebugOpenBerryInfo()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " bl GetFieldObjectScriptPointerPlayerFacing\n"
+ " ldr r1, ._138 @ S_BerryTree\n"
+ " cmp r0, r1\n"
+ " beq ._136 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " b ._137\n"
+ "._139:\n"
+ " .align 2, 0\n"
+ "._138:\n"
+ " .word S_BerryTree\n"
+ "._136:\n"
+ " ldr r0, ._141 @ gSelectedMapObject\n"
+ " ldrb r0, [r0]\n"
+ " bl FieldObjectGetBerryTreeId\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r6, r0, #0x18\n"
+ " add r0, r6, #0\n"
+ " bl GetBerryTreeInfo\n"
+ " add r5, r0, #0\n"
+ " mov r2, #0x0\n"
+ " ldr r7, ._141 + 4 @ 0x1f3\n"
+ " ldr r4, ._141 + 8 @ gStringVar4\n"
+ " mov r3, #0xff\n"
+ "._140:\n"
+ " add r1, r2, r4\n"
+ " ldrb r0, [r1]\n"
+ " orr r0, r0, r3\n"
+ " strb r0, [r1]\n"
+ " add r2, r2, #0x1\n"
+ " cmp r2, r7\n"
+ " ble ._140 @cond_branch\n"
+ " ldr r0, ._141 + 12 @ gUnknown_Debug_083F7F9D\n"
+ " add r1, r6, #0\n"
+ " mov r2, #0x3\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r0, ._141 + 16 @ gUnknown_Debug_083F7FA2\n"
+ " ldrb r1, [r5]\n"
+ " mov r2, #0x2\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r0, ._141 + 20 @ gUnknown_Debug_083F7FA9\n"
+ " ldrb r1, [r5, #0x1]\n"
+ " lsl r1, r1, #0x19\n"
+ " lsr r1, r1, #0x19\n"
+ " mov r2, #0x2\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r0, ._141 + 24 @ gUnknown_Debug_083F7FB0\n"
+ " ldrh r1, [r5, #0x2]\n"
+ " mov r2, #0x5\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r0, ._141 + 28 @ gUnknown_Debug_083F7FB7\n"
+ " ldrb r1, [r5, #0x4]\n"
+ " mov r2, #0x2\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r0, ._141 + 32 @ gUnknown_Debug_083F7FBE\n"
+ " ldrb r1, [r5, #0x5]\n"
+ " lsl r1, r1, #0x1c\n"
+ " lsr r1, r1, #0x1c\n"
+ " mov r2, #0x3\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r0, ._141 + 36 @ gUnknown_Debug_083F7FC5\n"
+ " ldrb r1, [r5, #0x1]\n"
+ " lsr r1, r1, #0x7\n"
+ " mov r2, #0x1\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r0, ._141 + 40 @ gUnknown_Debug_083F7FCC\n"
+ " ldrb r1, [r5, #0x5]\n"
+ " lsl r1, r1, #0x1b\n"
+ " lsr r1, r1, #0x1f\n"
+ " mov r2, #0x1\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r4, ._141 + 44 @ gUnknown_Debug_083F7FD3\n"
+ " ldrb r1, [r5, #0x5]\n"
+ " lsl r1, r1, #0x1a\n"
+ " lsr r1, r1, #0x1f\n"
+ " add r0, r4, #0\n"
+ " mov r2, #0x1\n"
+ " bl debug_sub_80C33FC\n"
+ " ldrb r1, [r5, #0x5]\n"
+ " lsl r1, r1, #0x19\n"
+ " lsr r1, r1, #0x1f\n"
+ " add r0, r4, #0\n"
+ " mov r2, #0x1\n"
+ " bl debug_sub_80C33FC\n"
+ " ldrb r1, [r5, #0x5]\n"
+ " lsr r1, r1, #0x7\n"
+ " add r0, r4, #0\n"
+ " mov r2, #0x1\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r0, ._141 + 8 @ gStringVar4\n"
+ "._137:\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._142:\n"
+ " .align 2, 0\n"
+ "._141:\n"
+ " .word gSelectedMapObject\n"
+ " .word 0x1f3\n"
+ " .word gStringVar4\n"
+ " .word gUnknown_Debug_083F7F9D\n"
+ " .word gUnknown_Debug_083F7FA2\n"
+ " .word gUnknown_Debug_083F7FA9\n"
+ " .word gUnknown_Debug_083F7FB0\n"
+ " .word gUnknown_Debug_083F7FB7\n"
+ " .word gUnknown_Debug_083F7FBE\n"
+ " .word gUnknown_Debug_083F7FC5\n"
+ " .word gUnknown_Debug_083F7FCC\n"
+ " .word gUnknown_Debug_083F7FD3\n"
+ "\n"
+ );
+}
+#endif
+
+#endif
+
// whenever the player is not within view of the berry tree during its sparkle state, the
// sparkle state will be reset.
void ResetBerryTreeSparkleFlags(void)
@@ -1445,3 +1952,17 @@ void ResetBerryTreeSparkleFlags(void)
}
}
}
+
+#if DEBUG
+static const u8 gUnknown_Debug_083F7F84[] = _("そとから きた きのみ");
+static const u8 gUnknown_Debug_083F7F90[] = _("ただいま かいはつちゅう");
+static const u8 gUnknown_Debug_083F7F9D[] = _("POS:");
+static const u8 gUnknown_Debug_083F7FA2[] = _("\nTYPE:");
+static const u8 gUnknown_Debug_083F7FA9[] = _("\nGROW:");
+static const u8 gUnknown_Debug_083F7FB0[] = _("\nTIME:");
+static const u8 gUnknown_Debug_083F7FB7[] = _("\nFCNT:");
+static const u8 gUnknown_Debug_083F7FBE[] = _("\nSCNT:");
+static const u8 gUnknown_Debug_083F7FC5[] = _("\nHOOK:");
+static const u8 gUnknown_Debug_083F7FCC[] = _("\nWBIT:");
+static const u8 gUnknown_Debug_083F7FD3[] = _("");
+#endif
diff --git a/src/field/berry_tag_screen.c b/src/field/berry_tag_screen.c
index 960a163c1..ed0ab86ae 100644
--- a/src/field/berry_tag_screen.c
+++ b/src/field/berry_tag_screen.c
@@ -42,7 +42,7 @@ extern u8 gBerryCheck_Pal[];
extern u8 gUnknown_08E788E4[];
extern u8 gUnknown_08E78A84[];
-static const u8 *const gUnknown_0841192C[] =
+const u8 *const gUnknown_0841192C[] =
{
ContestStatsText_VerySoft,
ContestStatsText_Soft,
@@ -93,7 +93,7 @@ static bool8 sub_8146058(void)
switch (gMain.state)
{
case 0:
- sub_80F9438();
+ ClearVideoCallbacks();
sub_80F9368();
sub_8146288();
REG_BLDCNT = 0;
@@ -109,11 +109,11 @@ static bool8 sub_8146058(void)
gMain.state += 1;
break;
case 3:
- SetUpWindowConfig(&gWindowConfig_81E6E18);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6E18);
gMain.state += 1;
break;
case 4:
- MultistepInitMenuWindowBegin(&gWindowConfig_81E6E18);
+ MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E18);
gMain.state += 1;
break;
case 5:
@@ -189,7 +189,6 @@ static void sub_8146288(void)
bool8 sub_81462B8(void)
{
u16 i;
- void *addr;
switch (gSharedMem.var_1FFFF)
{
@@ -213,8 +212,7 @@ bool8 sub_81462B8(void)
else
gBGTilemapBuffers[2][i] = 0x5042;
}
- addr = (void *)(VRAM + 0x3800);
- DmaCopy16(3, gBGTilemapBuffers[2], addr, 0x800);
+ DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x3800), 0x800);
gSharedMem.var_1FFFF += 1;
break;
case 4:
@@ -280,18 +278,18 @@ static void sub_81464E4(void)
berryInfo = GetBerryInfo(gSpecialVar_ItemId + OFFSET_7B + 1);
ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_ItemId - FIRST_BERRY + 1, STR_CONV_MODE_LEADING_ZEROS, 2);
- MenuPrint(gStringVar1, 12, 4);
+ Menu_PrintText(gStringVar1, 12, 4);
#if ENGLISH
- MenuPrint(berryInfo->name, 14, 4);
+ Menu_PrintText(berryInfo->name, 14, 4);
#elif GERMAN
StringCopy(buffer, berryInfo->name);
StringAppend(buffer, gOtherText_Berry2);
- MenuPrint(buffer, 14, 4);
+ Menu_PrintText(buffer, 14, 4);
#endif
- MenuPrint(berryInfo->description1, 4, 14);
- MenuPrint(berryInfo->description2, 4, 16);
+ Menu_PrintText(berryInfo->description1, 4, 14);
+ Menu_PrintText(berryInfo->description2, 4, 16);
#ifdef UNITS_IMPERIAL
size = (berryInfo->size * 1000) / 254;
@@ -301,7 +299,7 @@ static void sub_81464E4(void)
sizeMajor = size / 100;
#endif
- MenuPrint(gOtherText_Size, 11, 7);
+ Menu_PrintText(gOtherText_Size, 11, 7);
if (berryInfo->size != 0)
{
#ifdef UNITS_IMPERIAL
@@ -311,18 +309,18 @@ static void sub_81464E4(void)
ConvertIntToDecimalStringN(gStringVar1, berryInfo->size / 10, STR_CONV_MODE_LEFT_ALIGN, 2);
ConvertIntToDecimalStringN(gStringVar2, berryInfo->size % 10, STR_CONV_MODE_LEFT_ALIGN, 2);
#endif
- MenuPrint(gContestStatsText_Unknown1, 16, 7);
+ Menu_PrintText(gContestStatsText_Unknown1, 16, 7);
}
else
{
- MenuPrint(gOtherText_ThreeQuestions2, 16, 7);
+ Menu_PrintText(gOtherText_ThreeQuestions2, 16, 7);
}
- MenuPrint(gOtherText_Firm, 11, 9);
+ Menu_PrintText(gOtherText_Firm, 11, 9);
if (berryInfo->firmness != 0)
- MenuPrint(gUnknown_0841192C[berryInfo->firmness - 1], 16, 9);
+ Menu_PrintText(gUnknown_0841192C[berryInfo->firmness - 1], 16, 9);
else
- MenuPrint(gOtherText_ThreeQuestions2, 16, 9);
+ Menu_PrintText(gOtherText_ThreeQuestions2, 16, 9);
}
static void sub_8146600(u8 berry)
@@ -445,7 +443,7 @@ static void sub_8146810(s8 berry)
static void sub_81468BC(void)
{
- MenuZeroFillWindowRect(0, 4, 29, 19);
+ Menu_EraseWindowRect(0, 4, 29, 19);
sub_81464E4();
// center of berry sprite
diff --git a/src/field/bike.c b/src/field/bike.c
index 8db01b4b4..98966ebd4 100644
--- a/src/field/bike.c
+++ b/src/field/bike.c
@@ -14,6 +14,11 @@ extern bool8 gBikeCyclingChallenge;
extern u8 gBikeCollisions;
extern u8 gUnusedBikeCameraAheadPanback;
+#if DEBUG
+extern u8 gUnknown_020297ED;
+u8 debug_sub_805F2B0(u8);
+#endif
+
static void MovePlayerOnMachBike(u8, u16, u16);
static u8 GetMachBikeTransition(u8 *);
static void MachBikeTransition_FaceDirection(u8);
@@ -134,6 +139,13 @@ void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys)
static void MovePlayerOnMachBike(u8 direction, u16 newKeys, u16 heldKeys)
{
+#if DEBUG
+ if (gUnknown_020297ED && debug_sub_805F2B0(direction))
+ {
+ Bike_SetBikeStill();
+ return;
+ }
+#endif
sMachBikeTransitions[GetMachBikeTransition(&direction)](direction);
}
@@ -271,6 +283,14 @@ static void MachBikeTransition_TrySlowDown(u8 var)
// the acro bike requires the input handler to be executed before the transition can.
static void MovePlayerOnAcroBike(u8 newDirection, u16 newKeys, u16 heldKeys)
{
+#if DEBUG
+ if (gUnknown_020297ED && debug_sub_805F2B0(newDirection))
+ {
+ Bike_SetBikeStill();
+ return;
+ }
+#endif
+
sAcroBikeTransitions[CheckMovementInputAcroBike(&newDirection, newKeys, heldKeys)](newDirection);
}
diff --git a/src/field/braille_puzzles.c b/src/field/braille_puzzles.c
index 0d304714d..f11fb5fb3 100644
--- a/src/field/braille_puzzles.c
+++ b/src/field/braille_puzzles.c
@@ -161,7 +161,7 @@ void Task_BrailleWait(u8 taskId)
case 1:
if (BrailleWait_CheckButtonPress() != FALSE)
{
- MenuZeroFillScreen();
+ Menu_EraseScreen();
PlaySE(SE_SELECT);
data[0] = 2;
}
@@ -170,7 +170,7 @@ void Task_BrailleWait(u8 taskId)
data[1] = data[1] - 1;
if (data[1] == 0)
{
- MenuZeroFillScreen();
+ Menu_EraseScreen();
data[0] = 3;
data[1] = 30;
}
diff --git a/src/field/choose_party.c b/src/field/choose_party.c
index d278eda4a..7529c4271 100644
--- a/src/field/choose_party.c
+++ b/src/field/choose_party.c
@@ -1,5 +1,5 @@
#include "global.h"
-#include "decoration.h"
+#include "event_data.h"
#include "field_fadetransition.h"
#include "main.h"
#include "menu.h"
@@ -7,6 +7,7 @@
#include "palette.h"
#include "party_menu.h"
#include "pokemon_menu.h"
+#include "field_weather.h"
#include "pokemon.h"
#include "pokemon_summary_screen.h"
#include "overworld.h"
@@ -318,19 +319,19 @@ static void sub_812238C(u8 taskId)
{
if (gMain.newAndRepeatedKeys & 0x40)
{
- if (GetMenuCursorPos() != 0)
+ if (Menu_GetCursorPos() != 0)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(-1);
+ Menu_MoveCursor(-1);
}
return;
}
if (gMain.newAndRepeatedKeys & 0x80)
{
- if (GetMenuCursorPos() != 3)
+ if (Menu_GetCursorPos() != 3)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(1);
+ Menu_MoveCursor(1);
}
return;
}
@@ -343,7 +344,7 @@ static void sub_812238C(u8 taskId)
gTasks[taskId].data[4],
sBattleTowerEntryMenu,
sBattleTowerEntryMenuItems,
- GetMenuCursorPos());
+ Menu_GetCursorPos());
popupMenuFunc(taskId);
return;
}
@@ -461,8 +462,8 @@ static void BattleTowerEntryMenuCallback_Enter(u8 taskId)
}
}
PlaySE(SE_HAZURE);
- MenuZeroFillWindowRect(20, 10, 29, 19);
- HandleDestroyMenuCursors();
+ Menu_EraseWindowRect(20, 10, 29, 19);
+ Menu_DestroyCursor();
sub_806D5A4();
sub_806E834(gOtherText_NoMoreThreePoke, 1);
gTasks[taskId].func = sub_8122728;
@@ -475,8 +476,8 @@ static void sub_8122728(u8 taskId)
if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))
{
- MenuZeroFillWindowRect(0, 14, 29, 19);
- HandleDestroyMenuCursors();
+ Menu_EraseWindowRect(0, 14, 29, 19);
+ Menu_DestroyCursor();
BattleTowerEntryMenuCallback_Exit(taskId);
}
}
@@ -515,8 +516,8 @@ static void BattleTowerEntryMenuCallback_NoEntry(u8 taskId)
static void sub_81227FC(u8 taskId)
{
- MenuZeroFillWindowRect(20, 10, 29, 19);
- HandleDestroyMenuCursors();
+ Menu_EraseWindowRect(20, 10, 29, 19);
+ Menu_DestroyCursor();
PrintPartyMenuPromptText(0, 0);
gTasks[taskId].func = HandleBattleTowerPartyMenu;
}
@@ -527,6 +528,107 @@ static void BattleTowerEntryMenuCallback_Exit(u8 taskId)
sub_81227FC(taskId);
}
+#if DEBUG
+__attribute__((naked))
+void debug_sub_81381B4()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, r9\n"
+ " mov r6, r8\n"
+ " push {r6, r7}\n"
+ " ldr r4, ._189 @ gUnknown_02023A00\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0x0\n"
+ " mov r2, #0x60\n"
+ " bl memset\n"
+ " mov r7, #0x0\n"
+ " mov r8, r4\n"
+ " mov r0, #0x4\n"
+ " add r0, r0, r8\n"
+ " mov r9, r0\n"
+ "._188:\n"
+ " mov r0, #0x64\n"
+ " add r1, r7, #0\n"
+ " mul r1, r1, r0\n"
+ " ldr r0, ._189 + 4 @ gPlayerParty\n"
+ " add r5, r1, r0\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x41\n"
+ " bl GetMonData\n"
+ " lsl r4, r7, #0x5\n"
+ " mov r1, r8\n"
+ " add r6, r4, r1\n"
+ " strh r0, [r6]\n"
+ " lsl r0, r0, #0x10\n"
+ " cmp r0, #0\n"
+ " beq ._187 @cond_branch\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x38\n"
+ " bl GetMonData\n"
+ " strb r0, [r6, #0xf]\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x39\n"
+ " bl GetMonData\n"
+ " strh r0, [r6, #0x10]\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x3a\n"
+ " bl GetMonData\n"
+ " strh r0, [r6, #0x12]\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x37\n"
+ " bl GetMonData\n"
+ " mov r1, r8\n"
+ " add r1, r1, #0x14\n"
+ " add r1, r4, r1\n"
+ " str r0, [r1]\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0xc\n"
+ " bl GetMonData\n"
+ " strh r0, [r6, #0x2]\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x0\n"
+ " bl GetMonData\n"
+ " mov r1, r8\n"
+ " add r1, r1, #0x18\n"
+ " add r1, r4, r1\n"
+ " str r0, [r1]\n"
+ " add r0, r5, #0\n"
+ " bl GetMonGender\n"
+ " strb r0, [r6, #0x1c]\n"
+ " add r4, r4, r9\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x2\n"
+ " add r2, r4, #0\n"
+ " bl GetMonData\n"
+ " add r0, r4, #0\n"
+ " bl Text_StripExtCtrlCodes\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x3\n"
+ " bl GetMonData\n"
+ " strb r0, [r6, #0x1d]\n"
+ "._187:\n"
+ " add r0, r7, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r7, r0, #0x18\n"
+ " cmp r7, #0x2\n"
+ " bls ._188 @cond_branch\n"
+ " pop {r3, r4}\n"
+ " mov r8, r3\n"
+ " mov r9, r4\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._190:\n"
+ " .align 2, 0\n"
+ "._189:\n"
+ " .word gUnknown_02023A00\n"
+ " .word gPlayerParty+0x12c\n"
+ "\n"
+ );
+}
+#endif
+
bool8 SetupLinkMultiBattlePartyMenu(void)
{
switch (ewram1B000_alt.setupState)
@@ -806,19 +908,19 @@ static void Task_DaycareStorageMenu8122EAC(u8 taskId)
{
if (gMain.newAndRepeatedKeys & 0x40)
{
- if (GetMenuCursorPos() != 0)
+ if (Menu_GetCursorPos() != 0)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(-1);
+ Menu_MoveCursor(-1);
}
return;
}
if (gMain.newAndRepeatedKeys & 0x80)
{
- if (GetMenuCursorPos() != 3)
+ if (Menu_GetCursorPos() != 3)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(1);
+ Menu_MoveCursor(1);
}
return;
}
@@ -831,7 +933,7 @@ static void Task_DaycareStorageMenu8122EAC(u8 taskId)
gTasks[taskId].data[4],
sDaycareStorageMenus,
sDaycareStorageMenuItems,
- GetMenuCursorPos());
+ Menu_GetCursorPos());
popupMenuFunc(taskId);
return;
}
@@ -896,8 +998,8 @@ static void DaycareStorageMenuCallback_Summary(u8 taskId)
static void DaycareStorageMenuCallback_Exit(u8 taskId)
{
PlaySE(SE_SELECT);
- MenuZeroFillWindowRect(20, 10, 29, 19);
- HandleDestroyMenuCursors();
+ Menu_EraseWindowRect(20, 10, 29, 19);
+ Menu_DestroyCursor();
PrintPartyMenuPromptText(15, 0);
gTasks[taskId].func = HandleDaycarePartyMenu;
}
@@ -930,7 +1032,7 @@ void sub_81231AC(void)
static void sub_81231C4(u8 taskId)
{
- if (sub_807D770() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
{
DestroyTask(taskId);
ScriptContext2_Disable();
diff --git a/src/field/coins.c b/src/field/coins.c
index 91a4b508d..2c217e635 100644
--- a/src/field/coins.c
+++ b/src/field/coins.c
@@ -13,13 +13,13 @@ void UpdateCoinsWindow(s32 coins, u8 x, u8 y)
void ShowCoinsWindow(u32 coins, u8 x, u8 y)
{
- MenuDrawTextWindow(x, y, x + 9, y + 3);
+ Menu_DrawStdWindowFrame(x, y, x + 9, y + 3);
UpdateCoinsWindow(coins, x, y);
}
void HideCoinsWindow(u8 x, u8 y)
{
- MenuZeroFillWindowRect(x, y, x + 9, y + 3);
+ Menu_EraseWindowRect(x, y, x + 9, y + 3);
}
void PrintCoins(s32 coins, u8 b, u8 x, u8 y)
@@ -46,7 +46,7 @@ void PrintCoins(s32 coins, u8 b, u8 x, u8 y)
ptr[2] = (b - StringLength(string)) * 6;
ptr += 3;
StringCopy(ptr, string);
- MenuPrint(gOtherText_Coins2, x, y);
+ Menu_PrintText(gOtherText_Coins2, x, y);
}
u16 GetCoins(void)
diff --git a/src/field/coord_event_weather.c b/src/field/coord_event_weather.c
index db4e9c161..60b87fa30 100644
--- a/src/field/coord_event_weather.c
+++ b/src/field/coord_event_weather.c
@@ -34,7 +34,7 @@ static const struct CoordEventWeather sCoordEventWeatherFuncs[] =
{ COORD_EVENT_WEATHER_FOG_2, CoordEventWeather_DiagonalFog },
{ COORD_EVENT_WEATHER_ASH, CoordEventWeather_Ash },
{ COORD_EVENT_WEATHER_SANDSTORM, CoordEventWeather_Sandstorm },
- { COORD_EVENT_WEATHER_DARK, CoordEventWeather_Dark },
+ { COORD_EVENT_WEATHER_SHADE, CoordEventWeather_Dark },
{ COORD_EVENT_WEATHER_DROUGHT, CoordEventWeather_Drought },
{ COORD_EVENT_WEATHER_ROUTE119_CYCLE, CoordEventWeather_Route119Cycle },
{ COORD_EVENT_WEATHER_ROUTE123_CYCLE, CoordEventWeather_Route123Cycle },
@@ -87,7 +87,7 @@ static void CoordEventWeather_Sandstorm(void)
static void CoordEventWeather_Dark(void)
{
- SetWeather(WEATHER_DARK);
+ SetWeather(WEATHER_SHADE);
}
static void CoordEventWeather_Drought(void)
diff --git a/src/field/daycare.c b/src/field/daycare.c
index c28bc65ca..2f0c7281e 100644
--- a/src/field/daycare.c
+++ b/src/field/daycare.c
@@ -205,7 +205,7 @@ static u16 TakeSelectedPokemonFromDaycare(struct DayCare * daycare, u8 slot)
GetBoxMonNick(&daycare->mons[slot], gStringVar1);
species = GetBoxMonData(&daycare->mons[slot], MON_DATA_SPECIES);
- sub_803B4B4(&daycare->mons[slot], &pokemon);
+ ExpandBoxMon(&daycare->mons[slot], &pokemon);
if (GetMonData(&pokemon, MON_DATA_LEVEL) != MAX_LEVEL)
{
@@ -341,7 +341,7 @@ u16 GetEggSpecies(u16 species)
{
for (k = 0; k < 5; k++)
{
- if (gEvolutionTable[j].evolutions[k].targetSpecies == species)
+ if (gEvolutionTable[j][k].targetSpecies == species)
{
species = j;
found = TRUE;
@@ -557,7 +557,7 @@ void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, struct BoxP
{
for (j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++)
{
- if (gHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01 + j) && CanMonLearnTMHM(egg, j))
+ if (gHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01_FOCUS_PUNCH + j) && CanMonLearnTMHM(egg, j))
{
if (GiveMoveToMon(egg, gHatchedEggFatherMoves[i]) == 0xffff)
DeleteFirstMoveAndGiveMoveToMon(egg, gHatchedEggFatherMoves[i]);
@@ -1741,7 +1741,7 @@ static void HandleDaycareLevelMenuInput(u8 taskId)
if (gTasks[taskId].data[0] != 0)
{
gTasks[taskId].data[0] --;
- MoveMenuCursor(-1);
+ Menu_MoveCursor(-1);
PlaySE(SE_SELECT);
}
}
@@ -1750,25 +1750,25 @@ static void HandleDaycareLevelMenuInput(u8 taskId)
if (gTasks[taskId].data[0] != 2)
{
gTasks[taskId].data[0]++;
- MoveMenuCursor(+1);
+ Menu_MoveCursor(+1);
PlaySE(SE_SELECT);
}
}
else if (gMain.newKeys & A_BUTTON)
{
- HandleDestroyMenuCursors();
+ Menu_DestroyCursor();
PlaySE(SE_SELECT);
gLastFieldPokeMenuOpened = gSpecialVar_Result = gTasks[taskId].data[0];
DestroyTask(taskId);
- MenuZeroFillWindowRect(15, 6, 29, 13);
+ Menu_EraseWindowRect(15, 6, 29, 13);
EnableBothScriptContexts();
}
else if (gMain.newKeys & B_BUTTON)
{
- HandleDestroyMenuCursors();
+ Menu_DestroyCursor();
gLastFieldPokeMenuOpened = gSpecialVar_Result = 2;
DestroyTask(taskId);
- MenuZeroFillWindowRect(15, 6, 29, 13);
+ Menu_EraseWindowRect(15, 6, 29, 13);
EnableBothScriptContexts();
}
}
@@ -1776,11 +1776,11 @@ static void HandleDaycareLevelMenuInput(u8 taskId)
void ShowDaycareLevelMenu(void)
{
u8 buffer[100];
- MenuDrawTextWindow(15, 6, 29, 13);
+ Menu_DrawStdWindowFrame(15, 6, 29, 13);
GetDaycareLevelMenuText(&gSaveBlock1.daycare, buffer);
- MenuPrint(buffer, 16, 7);
+ Menu_PrintText(buffer, 16, 7);
GetDaycareLevelMenuLevelText(&gSaveBlock1.daycare, buffer);
- MenuPrint_PixelCoords(buffer, 0xce, 0x38, TRUE);
+ Menu_PrintTextPixelCoords(buffer, 0xce, 0x38, TRUE);
InitMenu(0, 16, 7, 3, 0, 13);
CreateTask(HandleDaycareLevelMenuInput, 3);
}
diff --git a/src/field/decoration.c b/src/field/decoration.c
index 87a9d8028..0e7fa5f41 100644
--- a/src/field/decoration.c
+++ b/src/field/decoration.c
@@ -19,6 +19,7 @@
#include "event_data.h"
#include "field_weather.h"
#include "decoration.h"
+#include "shop.h"
#include "ewram.h"
EWRAM_DATA u8 *gUnknown_020388D0 = NULL;
@@ -1433,8 +1434,8 @@ extern u8 gUnknown_0815F399[];
void sub_80FE1DC(void)
{
sub_80FE2B4();
- MenuDrawTextWindow(0, 0, 10, 9);
- PrintMenuItems(1, 1, 4, (const struct MenuAction *)gUnknown_083EC604);
+ Menu_DrawStdWindowFrame(0, 0, 10, 9);
+ Menu_PrintItems(1, 1, 4, (const struct MenuAction *)gUnknown_083EC604);
InitMenu(0, 1, 1, 4, gUnknown_020388D4, 9);
}
@@ -1487,13 +1488,13 @@ void Task_DecorationPCProcessMenuInput(u8 taskId)
if (gMain.newKeys & DPAD_UP)
{
PlaySE(SE_SELECT);
- gUnknown_020388D4 = MoveMenuCursor(-1);
+ gUnknown_020388D4 = Menu_MoveCursor(-1);
sub_80FE394();
}
if (gMain.newKeys & DPAD_DOWN)
{
PlaySE(SE_SELECT);
- gUnknown_020388D4 = MoveMenuCursor(1);
+ gUnknown_020388D4 = Menu_MoveCursor(1);
sub_80FE394();
}
if (gMain.newKeys & A_BUTTON)
@@ -1510,15 +1511,15 @@ void Task_DecorationPCProcessMenuInput(u8 taskId)
void sub_80FE394(void)
{
- MenuFillWindowRectWithBlankTile(2, 15, 27, 18);
- MenuPrint(gUnknown_083EC624[gUnknown_020388D4], 2, 15);
+ Menu_BlankWindowRect(2, 15, 27, 18);
+ Menu_PrintText(gUnknown_083EC624[gUnknown_020388D4], 2, 15);
}
void gpu_pal_decompress_alloc_tag_and_upload(u8 taskId)
{
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 10, 9);
- MenuFillWindowRectWithBlankTile(2, 15, 27, 18);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 10, 9);
+ Menu_BlankWindowRect(2, 15, 27, 18);
FreeSpritePaletteByTag(6);
if (ewram_1f000.isPlayerRoom == 0)
{
@@ -1546,7 +1547,7 @@ void sub_80FE470(u8 decoCat, u8 left, u8 top, u8 palIdx) // PrintDecorationCateg
{
u8 *strptr;
u8 v0;
- v0 = sub_8072CBC();
+ v0 = Menu_GetTextWindowPaletteNum();
// PALETTE {palIdx}
strptr = gStringVar4;
strptr[0] = EXT_CTRL_CODE_BEGIN;
@@ -1561,13 +1562,13 @@ void sub_80FE470(u8 decoCat, u8 left, u8 top, u8 palIdx) // PrintDecorationCateg
strptr[1] = 5;
strptr[2] = v0;
strptr[3] = EOS;
- MenuPrint(gStringVar4, left, top);
+ Menu_PrintText(gStringVar4, left, top);
}
void sub_80FE528(u8 taskId) // PrintDecorationCategorySelectionMenuStrings
{
u8 decoCat;
- MenuDrawTextWindow(0, 0, 14, 19);
+ Menu_DrawStdWindowFrame(0, 0, 14, 19);
for (decoCat=0; decoCat<8; decoCat++)
{
if (ewram_1f000.isPlayerRoom == 1 && gTasks[taskId].data[11] == 0 && decoCat != DECORCAT_DOLL && decoCat != DECORCAT_CUSHION)
@@ -1578,13 +1579,13 @@ void sub_80FE528(u8 taskId) // PrintDecorationCategorySelectionMenuStrings
sub_80FE470(decoCat, 1, 2 * decoCat + 1, 255); // Unselectable
}
}
- MenuPrint(gUnknownText_Exit, 1, 17);
+ Menu_PrintText(gUnknownText_Exit, 1, 17);
}
void sub_80FE5AC(u8 taskId)
{
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 29, 19);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 29, 19);
sub_80FE528(taskId);
InitMenu(0, 1, 1, 9, gUnknown_020388F6, 13);
gTasks[taskId].func = sub_80FE604;
@@ -1597,15 +1598,15 @@ void sub_80FE604(u8 taskId)
if (gMain.newAndRepeatedKeys & DPAD_UP)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(-1);
+ Menu_MoveCursor(-1);
} else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(1);
+ Menu_MoveCursor(1);
} else if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
- gUnknown_020388F6 = GetMenuCursorPos();
+ gUnknown_020388F6 = Menu_GetCursorPos();
if (gUnknown_020388F6 != 8)
{
gUnknown_020388D5 = sub_8134194(gUnknown_020388F6);
@@ -1614,14 +1615,14 @@ void sub_80FE604(u8 taskId)
sub_8134104(gUnknown_020388F6);
gUnknown_020388D0 = gDecorationInventories[gUnknown_020388F6].items;
sub_80FEF50(taskId);
- sub_80F944C();
+ ClearVerticalScrollIndicatorPalettes();
sub_80F9480(gUnknown_020388F7, 8);
LoadScrollIndicatorPalette();
gTasks[taskId].func = sub_80FE868;
} else
{
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 14, 19);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 14, 19);
DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE418, 0);
}
} else
@@ -1649,17 +1650,17 @@ void sub_80FE728(u8 taskId)
void sub_80FE758(u8 taskId)
{
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 14, 19);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 14, 19);
if (gTasks[taskId].data[11] != 2)
{
sub_80FE1DC();
- MenuDisplayMessageBox();
+ Menu_DisplayDialogueFrame();
sub_80FE394();
gTasks[taskId].func = Task_DecorationPCProcessMenuInput;
} else
{
- sub_80B3068(taskId);
+ Shop_RunExitSellMenuTask(taskId);
}
}
@@ -1677,18 +1678,18 @@ void sub_80FE7D4(u8 *dest, u8 decClass)
void sub_80FE7EC(u8 taskId)
{
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 29, 19);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 29, 19);
sub_80FEC94(taskId);
sub_80FECB8(gUnknown_020388F6);
#if ENGLISH
- MenuDrawTextWindow(15, 12, 29, 19);
+ Menu_DrawStdWindowFrame(15, 12, 29, 19);
#elif GERMAN
if ((gUnknown_020388F2 + gUnknown_020388F4) != gUnknown_020388D5)
{
- MenuDrawTextWindow(15, 12, 29, 19);
+ Menu_DrawStdWindowFrame(15, 12, 29, 19);
}
#endif
@@ -1710,7 +1711,7 @@ void sub_80FE894(u8 taskId /*r8*/, s8 cursorVector /*r5*/, s8 bgVector /*r7*/)
PlaySE(SE_SELECT);
if (cursorVector != 0)
{
- gUnknown_020388F2 = MoveMenuCursor(cursorVector);
+ gUnknown_020388F2 = Menu_MoveCursor(cursorVector);
}
if (bgVector != 0)
{
@@ -1722,12 +1723,12 @@ void sub_80FE894(u8 taskId /*r8*/, s8 cursorVector /*r5*/, s8 bgVector /*r7*/)
{
if (v0)
{
- MenuDrawTextWindow(15, 12, 29, 19);
+ Menu_DrawStdWindowFrame(15, 12, 29, 19);
}
sub_80FECE0(gUnknown_020388F2 + gUnknown_020388F4);
} else
{
- MenuZeroFillWindowRect(15, 12, 29, 19);
+ Menu_EraseWindowRect(15, 12, 29, 19);
}
}
@@ -1757,7 +1758,7 @@ void sub_80FE948(u8 taskId)
}
if (gMain.newKeys & A_BUTTON)
{
- HandleDestroyMenuCursors();
+ Menu_DestroyCursor();
PlaySE(SE_SELECT);
gUnknown_020388F5 = gUnknown_020388F2 + gUnknown_020388F4;
if (gUnknown_020388F5 == gUnknown_020388D5)
@@ -1769,7 +1770,7 @@ void sub_80FE948(u8 taskId)
}
} else if (gMain.newKeys & B_BUTTON)
{
- HandleDestroyMenuCursors();
+ Menu_DestroyCursor();
PlaySE(SE_SELECT);
gUnknown_083EC634[gTasks[taskId].data[11]].noFunc(taskId);
}
@@ -1783,17 +1784,17 @@ void sub_80FEABC(u8 taskId, u8 dummy1)
u16 i;
u16 j;
u8 ni;
- if (gUnknown_020388F4 != 0 || (DestroyVerticalScrollIndicator(0), gUnknown_020388F4 != 0))
+ if (gUnknown_020388F4 != 0 || (DestroyVerticalScrollIndicator(TOP_ARROW), gUnknown_020388F4 != 0))
{
- CreateVerticalScrollIndicators(0, 0x3c, 0x08);
+ CreateVerticalScrollIndicators(TOP_ARROW, 0x3c, 0x08);
}
if (gUnknown_020388F4 + 7 == gUnknown_020388D5)
{
- DestroyVerticalScrollIndicator(1);
+ DestroyVerticalScrollIndicator(BOTTOM_ARROW);
}
if (gUnknown_020388F4 + 7 < gUnknown_020388D5)
{
- CreateVerticalScrollIndicators(1, 0x3c, 0x98);
+ CreateVerticalScrollIndicators(BOTTOM_ARROW, 0x3c, 0x98);
}
for (i=gUnknown_020388F4; i<gUnknown_020388F4+8; i++)
{
@@ -1839,13 +1840,13 @@ void sub_80FEABC(u8 taskId, u8 dummy1)
void sub_80FEC94(u8 taskId)
{
- MenuDrawTextWindow(0, 0, 14, 19);
+ Menu_DrawStdWindowFrame(0, 0, 14, 19);
sub_80FEABC(taskId, 0);
}
void sub_80FECB8(u8 decoCat)
{
- MenuDrawTextWindow(15, 0, 29, 3);
+ Menu_DrawStdWindowFrame(15, 0, 29, 3);
sub_80FE470(decoCat, 16, 1, 0xff);
}
@@ -1902,8 +1903,8 @@ _080FED26:\n\
void sub_80FED1C(void)
{
- MenuZeroFillWindowRect(15, 0, 29, 3);
- MenuZeroFillWindowRect(15, 12, 29, 19);
+ Menu_EraseWindowRect(15, 0, 29, 3);
+ Menu_EraseWindowRect(15, 12, 29, 19);
}
void sub_80FED3C(u8 taskId)
@@ -2003,10 +2004,10 @@ void sub_80FEF50(u8 taskId)
void sub_80FEF74(void)
{
sub_80F9520(gUnknown_020388F7, 8);
- DestroyVerticalScrollIndicator(0);
- DestroyVerticalScrollIndicator(1);
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 14, 19);
+ DestroyVerticalScrollIndicator(TOP_ARROW);
+ DestroyVerticalScrollIndicator(BOTTOM_ARROW);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 14, 19);
}
bool8 sub_80FEFA4(void)
@@ -2035,16 +2036,16 @@ void sub_80FEFF4(u8 taskId)
void sub_80FF034(u8 taskId)
{
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 14, 19);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 14, 19);
sub_80FE5AC(taskId);
}
void sub_80FF058(u8 taskId)
{
sub_80F9520(gUnknown_020388F7, 8);
- DestroyVerticalScrollIndicator(0);
- DestroyVerticalScrollIndicator(1);
+ DestroyVerticalScrollIndicator(TOP_ARROW);
+ DestroyVerticalScrollIndicator(BOTTOM_ARROW);
BuyMenuFreeMemory();
gTasks[taskId].func = sub_80FF034;
}
@@ -2238,7 +2239,7 @@ void sub_80FF5BC(u8 taskId)
{
if (sub_80FF58C() == TRUE)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_80FF6AC;
} else
@@ -2271,8 +2272,8 @@ void sub_80FF6AC(u8 taskId)
if (!gPaletteFade.active)
{
sub_80FF0E0(taskId);
- DestroyVerticalScrollIndicator(0);
- DestroyVerticalScrollIndicator(1);
+ DestroyVerticalScrollIndicator(TOP_ARROW);
+ DestroyVerticalScrollIndicator(BOTTOM_ARROW);
sub_80F9520(gUnknown_020388F7, 8);
BuyMenuFreeMemory();
gTasks[taskId].data[2] = 1;
@@ -2288,7 +2289,7 @@ void sub_80FF6AC(u8 taskId)
gTasks[taskId].data[2] = 2;
break;
case 2:
- if (sub_807D770() == 1)
+ if (IsWeatherNotFadingIn() == TRUE)
{
gTasks[taskId].data[12] = 0;
sub_810065C(taskId);
@@ -3128,7 +3129,7 @@ void sub_81000A0(u8 taskId)
void sub_81000C4(u8 taskId)
{
- MenuZeroFillWindowRect(0, 0, 29, 19);
+ Menu_EraseWindowRect(0, 0, 29, 19);
sub_8100174(taskId);
if (gDecorations[gUnknown_020388D0[gUnknown_020388F5]].permission != DECORPERM_SOLID_MAT)
{
@@ -3186,13 +3187,13 @@ void sub_8100248(u8 taskId)
void sub_810026C(u8 taskId)
{
- MenuZeroFillWindowRect(0, 0, 29, 19);
+ Menu_EraseWindowRect(0, 0, 29, 19);
sub_810028C(taskId);
}
void sub_810028C(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = c1_overworld_prev_quest;
}
@@ -3221,7 +3222,7 @@ void c1_overworld_prev_quest(u8 taskId)
void sub_8100334(u8 taskId)
{
- if (sub_807D770() == 1)
+ if (IsWeatherNotFadingIn() == TRUE)
{
gTasks[taskId].func = sub_80FE948;
}
@@ -3341,7 +3342,7 @@ void sub_8100494(u8 taskId)
void sub_810065C(u8 taskId)
{
- MenuZeroFillWindowRect(0, 0, 29, 19);
+ Menu_EraseWindowRect(0, 0, 29, 19);
gSprites[gUnknown_020391A8].data[7] = 0;
gTasks[taskId].data[10] = 0;
gTasks[taskId].func = sub_8100494;
@@ -3628,7 +3629,7 @@ void sub_8100A0C(u8 taskId)
{
if (sub_8100D38(taskId) == 1)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_8100E70;
} else
@@ -3723,7 +3724,7 @@ void sub_8100C88(u8 taskId)
{
DrawWholeMapView();
ScriptContext1_SetupScript(gUnknown_081A2F8A);
- MenuZeroFillWindowRect(0, 0, 29, 19);
+ Menu_EraseWindowRect(0, 0, 29, 19);
gTasks[taskId].data[2] = 2;
}
break;
@@ -3734,7 +3735,7 @@ void sub_8100C88(u8 taskId)
gTasks[taskId].data[2] = 3;
break;
case 3:
- if (sub_807D770() == 1)
+ if (IsWeatherNotFadingIn() == TRUE)
{
gTasks[taskId].data[13] = -1;
DisplayItemMessageOnField(taskId, gSecretBaseText_DecorReturned, sub_81010F0, 0);
@@ -3760,7 +3761,7 @@ bool8 sub_8100D38(u8 taskId)
void SetUpPuttingAwayDecorationPlayerAvatar(void)
{
player_get_direction_lower_nybble();
- MenuZeroFillWindowRect(0, 0, 29, 19);
+ Menu_EraseWindowRect(0, 0, 29, 19);
gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data[0];
sub_81016C8();
gUnknown_03004880.unk4 = CreateSprite(&gSpriteTemplate_83ECA88, 0x78, 0x50, 0);
@@ -3790,7 +3791,7 @@ void sub_8100E70(u8 taskId)
data[2] = 1;
data[6] = 1;
data[5] = 1;
- HandleDestroyMenuCursors();
+ Menu_DestroyCursor();
}
break;
case 1:
@@ -3799,7 +3800,7 @@ void sub_8100E70(u8 taskId)
data[2] = 2;
break;
case 2:
- if (sub_807D770() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
{
data[12] = 1;
sub_8100EEC(taskId);
@@ -3810,7 +3811,7 @@ void sub_8100E70(u8 taskId)
void sub_8100EEC(u8 taskId)
{
- MenuZeroFillWindowRect(0, 0, 29, 19);
+ Menu_EraseWindowRect(0, 0, 29, 19);
gSprites[gUnknown_020391A8].data[7] = 0;
gSprites[gUnknown_020391A8].invisible = 0;
gSprites[gUnknown_020391A8].callback = sub_8101698;
@@ -4137,7 +4138,7 @@ void sub_8101518(u8 taskId)
void sub_810153C(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_8100C88;
}
@@ -4150,13 +4151,13 @@ void sub_810156C(u8 taskId)
void sub_8101590(u8 taskId)
{
- MenuZeroFillWindowRect(0, 0, 29, 19);
+ Menu_EraseWindowRect(0, 0, 29, 19);
sub_81015B0(taskId);
}
void sub_81015B0(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_81015E0;
}
@@ -4183,7 +4184,7 @@ void sub_81015E0(u8 taskId)
void sub_8101648(u8 taskId)
{
- if (sub_807D770() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
{
gTasks[taskId].func = Task_DecorationPCProcessMenuInput;
}
@@ -4192,7 +4193,7 @@ void sub_8101648(u8 taskId)
void sub_8101678(void)
{
pal_fill_black();
- MenuDisplayMessageBox();
+ Menu_DisplayDialogueFrame();
sub_80FE220();
CreateTask(sub_8101648, 8);
}
@@ -4274,7 +4275,7 @@ void sub_8101824(u8 taskId)
void sub_8101848(u8 taskId)
{
- MenuZeroFillWindowRect(20, 8, 26, 14);
+ Menu_EraseWindowRect(20, 8, 26, 14);
sub_8109A30(gUnknown_020388D0[gUnknown_020388F5]);
gUnknown_020388D0[gUnknown_020388F5] = DECOR_NONE;
sub_80FF098(taskId);
diff --git a/src/field/decoration_inventory.c b/src/field/decoration_inventory.c
index dd0e972aa..8f7f5eb92 100644
--- a/src/field/decoration_inventory.c
+++ b/src/field/decoration_inventory.c
@@ -164,3 +164,14 @@ u8 sub_81341D4(void)
}
return count;
}
+
+
+#if DEBUG
+void debug_sub_814A3A8(void)
+{
+ u8 decor;
+
+ for (decor = 0; decor < DECOR_COUNT; decor++)
+ IsThereStorageSpaceForDecoration(decor);
+}
+#endif
diff --git a/src/field/diploma.c b/src/field/diploma.c
index 27601404c..b31fc7dec 100644
--- a/src/field/diploma.c
+++ b/src/field/diploma.c
@@ -10,7 +10,7 @@
#include "strings2.h"
#include "task.h"
#include "text.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
static void VBlankCB(void);
static void MainCB2(void);
@@ -62,14 +62,14 @@ void CB2_ShowDiploma(void)
LZ77UnCompVram(gDiplomaTiles, (void *)VRAM);
LZ77UnCompVram(gDiplomaTilemap, (void *)(VRAM + 0x3000));
- remove_some_task();
+ ScanlineEffect_Stop();
ResetTasks();
ResetSpriteData();
ResetPaletteFade();
FreeAllSpritePalettes();
LoadPalette(gDiplomaPalettes, 0, 64);
- SetUpWindowConfig(&gWindowConfig_81E6C3C);
- InitMenuWindow(&gWindowConfig_81E6CE4);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C);
+ InitMenuWindow(&gWindowTemplate_81E6CE4);
DisplayDiplomaText();
BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
@@ -125,7 +125,7 @@ static void Task_DiplomaFadeOut(u8 taskId)
static void DisplayDiplomaText(void)
{
- if (sub_8090FF4())
+ if (CompletedNationalPokedex())
{
REG_BG3HOFS = 256;
StringCopy(gStringVar1, gOtherText_NationalDex);
@@ -135,5 +135,5 @@ static void DisplayDiplomaText(void)
REG_BG3HOFS = 0;
StringCopy(gStringVar1, gOtherText_HoennDex);
}
- MenuPrint(gOtherText_DiplomaCertificationGameFreak, 6, 2);
+ Menu_PrintText(gOtherText_DiplomaCertificationGameFreak, 6, 2);
} \ No newline at end of file
diff --git a/src/field/easy_chat.c b/src/field/easy_chat.c
deleted file mode 100644
index 94532506f..000000000
--- a/src/field/easy_chat.c
+++ /dev/null
@@ -1,445 +0,0 @@
-#include "global.h"
-#include "easy_chat.h"
-#include "constants/easy_chat.h"
-#include "data2.h"
-#include "event_data.h"
-#include "field_message_box.h"
-#include "pokedex.h"
-#include "random.h"
-#include "string_util.h"
-#include "strings.h"
-#include "strings2.h"
-#include "text.h"
-
-static bool8 sub_80EB680(u16 *, u16, u16, u16);
-static u16 sub_80EB9D8(void);
-static u16 sub_80EB960(void);
-
-extern void *gEasyChatGroupWords[];
-extern const u8 gEasyChatGroupSizes[];
-
-extern u16 gSpecialVar_0x8004;
-
-IWRAM_DATA u8 gUnknown_03000740;
-
-// returns the end of the destination buffer text
-u8 *EasyChat_GetWordText(u8 *dst, u16 word)
-{
- u16 group;
- u16 wordIndex;
- u8 *src;
- u16 i;
-
- if (sub_80EB37C(word))
- return StringCopy(dst, gOtherText_ThreeQuestions);
-
- if (word == 0xFFFF)
- {
- *dst = EOS;
- return dst;
- }
- else
- {
- group = EC_GROUP(word);
- wordIndex = EC_INDEX(word);
- switch (group)
- {
- case EC_GROUP_POKEMON: // 0
- case EC_GROUP_POKEMON_2: // 21
- dst = StringCopy(dst, gSpeciesNames[wordIndex]);
- break;
- case EC_GROUP_MOVE_1: // 18
- case EC_GROUP_MOVE_2: // 19
- dst = StringCopy(dst, gMoveNames[wordIndex]);
- break;
- default:
- src = gEasyChatGroupWords[group];
- for (i = wordIndex - 1; i != 0xFFFF; i--)
- {
- while (*src++ != EOS)
- ;
- }
- dst = StringCopy(dst, src);
- break;
- }
- *dst = EOS;
- return dst;
- }
-}
-
-u8 *ConvertEasyChatWordsToString(u8 *dst, u16 *words, u16 arg2, u16 arg3)
-{
- u16 i;
- u16 n;
-
- const u16 i1 = arg2 - 1;
-
- for (i = 0; i < arg3; i++)
- {
- u16 word;
-
- for (n = 0; n < i1; n++)
- {
- dst = EasyChat_GetWordText(dst, words[0]);
-
- if (words[0] != 0xFFFF)
- {
- dst[0] = CHAR_SPACE;
- dst++;
- }
-
- words++;
- }
-
- word = words[0];
- words++;
- dst = EasyChat_GetWordText(dst, word);
-
- dst[0] = CHAR_NEWLINE;
- dst++;
- }
-
- dst--;
- dst[0] = EOS;
-
- return dst;
-}
-
-u8 *sub_80EB544(u8 *dst, u16 *words, u16 arg2, u16 arg3)
-{
- u16 i;
- u16 n;
-
- const u16 i1 = arg2 - 1;
-
- for (i = 0; i < arg3; i++)
- {
- u16 word;
-
- for (n = 0; n < i1; n++)
- {
- dst = EasyChat_GetWordText(dst, words[0]);
-
- if (words[0] != 0xFFFF)
- {
- dst[0] = CHAR_SPACE;
- dst++;
- }
-
- words++;
- }
-
- word = words[0];
- words++;
- dst = EasyChat_GetWordText(dst, word);
-
- // Only difference with ConvertEasyChatWordsToString
- dst[0] = (i == 0) ? CHAR_NEWLINE : CHAR_PROMPT_SCROLL;
- dst++;
- }
-
- dst--;
- dst[0] = EOS;
-
- return dst;
-}
-
-
-u16 unref_sub_80EB5E0(u16 arg0)
-{
- const u8 *chars;
- u16 i;
- u16 length;
- int group, word;
-
-
- if (arg0 == 0xFFFF)
- return 0;
-
- group = EC_GROUP(arg0);
- word = EC_INDEX(arg0);
- switch (group)
- {
- case EC_GROUP_POKEMON: // 0
- case EC_GROUP_POKEMON_2: // 21
- chars = gSpeciesNames[word];
- break;
- case EC_GROUP_MOVE_1: // 18
- case EC_GROUP_MOVE_2: // 19
- chars = gMoveNames[word];
- break;
- default:
- chars = gEasyChatGroupWords[group];
- for (i = word - 1; i != 0xFFFF; i--)
- {
- while (*chars++ != EOS)
- ;
- }
- break;
- }
-
- length = 0;
- while (*chars != EOS)
- {
- chars++;
- length++;
- }
-
- return length;
-}
-
-static bool8 sub_80EB680(u16 *arg0, u16 arg1, u16 arg2, u16 arg3)
-{
- return FALSE;
-}
-
-void unref_sub_80EB684(u8 arg0, u16 arg1)
-{
- u16 *ptr;
- u16 c;
-
- // FIXME: find actual tv shows used
- switch (arg0)
- {
- case 5:
- c = 6;
- ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x04);
- break;
- case 7:
- c = 2;
- ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x1C);
- break;
- case 8:
- c = 1;
- ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x02);
- break;
- default:
- return;
- }
-
- c -= 1;
- while (c != 0xFFFF)
- {
- *ptr = -1;
- ptr++;
- c -= 1;
- }
-}
-
-void sub_80EB6FC(u16 *arg0, u16 arg1)
-{
- u16 i;
-
- for (i = arg1 - 1; i != 0xFFFF; i--)
- {
- *arg0 = 0xFFFF;
- arg0++;
- }
-
-}
-
-u16 sub_80EB72C(u16 group)
-{
- u16 local1 = Random() % gEasyChatGroupSizes[group];
-
- if (group == EC_GROUP_POKEMON
- || group == EC_GROUP_POKEMON_2
- || group == EC_GROUP_MOVE_1
- || group == EC_GROUP_MOVE_2)
- {
- local1 = ((u16 *) gEasyChatGroupWords[group])[local1];
- }
-
- return ((group & 0x7F) << 9) | (local1 & 0x1FF);
-}
-
-u16 sub_80EB784(u16 group)
-{
- if (!sub_80EAD7C(group))
- return -1;
-
- if (group != EC_GROUP_POKEMON)
- {
- if (group == EC_GROUP_TRENDY_SAYING)
- return sub_80EB960();
- }
- else
- {
- return sub_80EB9D8();
- }
-
- return sub_80EB72C(group);
-}
-
-void sub_80EB7C4(void)
-{
- u16 *words;
- u16 arg1, arg2;
-
- switch (gSpecialVar_0x8004)
- {
- case 0:
- words = gSaveBlock1.easyChats.unk2B1C;
- arg1 = 2;
- arg2 = 2;
- break;
- case 1:
- words = gSaveBlock1.easyChats.unk2B28;
- if (sub_80EB680(gSaveBlock1.easyChats.unk2B28, 3, 2, 20))
- {
- arg1 = 2;
- arg2 = 3;
- }
- else
- {
- arg1 = 3;
- arg2 = 2;
- }
- break;
- case 2:
- words = gSaveBlock1.easyChats.unk2B34;
- arg1 = 3;
- arg2 = 2;
- break;
- case 3:
- words = gSaveBlock1.easyChats.unk2B40;
- arg1 = 3;
- arg2 = 2;
- break;
- default:
- return;
- }
-
- ConvertEasyChatWordsToString(gStringVar4, words, arg1, arg2);
- ShowFieldAutoScrollMessage(gStringVar4);
-}
-
-void BufferRandomHobbyOrLifestyleString(void)
-{
- u16 group, local2;
-
- if (Random() & 1)
- group = EC_GROUP_HOBBIES;
- else
- group = EC_GROUP_LIFESTYLE;
-
- local2 = sub_80EB784(group);
- EasyChat_GetWordText(gStringVar2, local2);
-}
-
-u8 sub_80EB868(u8 arg0)
-{
- int offset;
- int index;
-
- index = arg0 / 8;
- offset = arg0 % 8;
- return (gSaveBlock1.unk2D8C[index] >> offset) & 1;
-}
-
-void sub_80EB890(u8 arg0)
-{
- int offset;
- int index;
-
- if (arg0 < 33)
- {
- index = arg0 / 8;
- offset = arg0 % 8;
- gSaveBlock1.unk2D8C[index] |= 1 << offset;
- }
-}
-
-u8 sub_80EB8C0(void)
-{
- u8 i, count;
-
- for (i = 0, count = 0; i < 33; i++)
- {
- if (sub_80EB868(i))
- count++;
- }
- return count;
-}
-
-u16 sub_80EB8EC(void)
-{
- u16 i;
- u16 local1, local2;
-
- local1 = sub_80EB8C0();
- if (local1 == 33)
- return -1;
-
- local2 = Random() % (33 - local1);
- for (i = 0; i < 33; i++)
- {
- if (sub_80EB868(i) == 0)
- {
- if (local2 == 0)
- {
- sub_80EB890(i);
- return (i & 0x1FF) | 0x2800;
- }
- local2--;
- }
- }
- return -1;
-}
-
-static u16 sub_80EB960(void)
-{
- u16 i;
- u16 local1;
-
- local1 = sub_80EB8C0();
- if (local1 == 0)
- return -1;
-
- local1 = Random() % local1;
- for (i = 0; i < 33; i++)
- {
- if (sub_80EB868(i))
- {
- if (local1 == 0)
- return (i & 0x1FF) | 0x2800;
- local1--;
- }
- }
-
- return -1;
-}
-
-u8 sub_80EB9C8(void)
-{
- return IsNationalPokedexEnabled();
-}
-
-static u16 sub_80EB9D8(void)
-{
- u16 *speciesList;
- u16 local1;
- u16 i;
-
- local1 = sub_80EAE88(0);
-
- if (local1 == 0)
- return -1;
-
- local1 = Random() % local1;
- speciesList = (u16 *) gEasyChatGroupWords[EC_GROUP_POKEMON];
- for (i = 0; i < gEasyChatGroupSizes[EC_GROUP_POKEMON]; i++)
- {
- const u16 dexNum = SpeciesToNationalPokedexNum(*speciesList);
- const u8 local2 = GetSetPokedexFlag(dexNum, 0);
-
- if (local2)
- {
- if (local1 == 0)
- return *speciesList & 0x1FF;
- local1--;
- }
- speciesList++;
- }
- return -1;
-}
diff --git a/src/field/field_control_avatar.c b/src/field/field_control_avatar.c
index 52e66f16e..3ae422512 100644
--- a/src/field/field_control_avatar.c
+++ b/src/field/field_control_avatar.c
@@ -4,6 +4,7 @@
#include "bike.h"
#include "coord_event_weather.h"
#include "daycare.h"
+#include "debug.h"
#include "event_data.h"
#include "field_fadetransition.h"
#include "field_player_avatar.h"
@@ -35,6 +36,7 @@ extern u16 gSpecialVar_Facing;
extern struct LinkPlayerMapObject gLinkPlayerMapObjects[];
extern u16 gSpecialVar_0x8004;
extern u16 gSpecialVar_0x8005;
+extern u8 gUnknown_020297ED;
static EWRAM_DATA u8 gUnknown_0202E8C0 = 0;
static EWRAM_DATA u16 gUnknown_0202E8C2 = 0;
@@ -103,7 +105,7 @@ static void sub_8068C30(struct MapHeader *, s8, struct MapPosition *);
static bool8 map_warp_consider_2_to_inside(struct MapPosition *, u16, u8);
static s8 map_warp_check(struct MapHeader *, u16, u16, u8);
static u8 *mapheader_trigger_activate_at(struct MapHeader *, u16, u16, u8);
-static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *, u16, u16, u8);
+static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *, u16, u16, u8);;
void FieldClearPlayerInput(struct FieldInput *input)
{
@@ -162,6 +164,31 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys)
input->dpadDirection = DIR_WEST;
else if (heldKeys & DPAD_RIGHT)
input->dpadDirection = DIR_EAST;
+#if DEBUG
+ if ((heldKeys & R_BUTTON) && input->pressedStartButton)
+ {
+ input->input_field_1_2 = TRUE;
+ input->pressedStartButton = FALSE;
+ }
+ if (gUnknown_020297ED)
+ {
+ if (heldKeys & R_BUTTON)
+ {
+ input->input_field_1_1 = TRUE;
+ input->input_field_0_6 = FALSE;
+ input->input_field_0_1 = FALSE;
+ input->input_field_0_4 = FALSE;
+ input->input_field_0_5 = FALSE;
+ if (newKeys & SELECT_BUTTON)
+ {
+ input->input_field_1_0 = TRUE;
+ input->pressedSelectButton = FALSE;
+ }
+ }
+ if (heldKeys & L_BUTTON)
+ input->input_field_1_3 = TRUE;
+ }
+#endif
}
int sub_8068024(struct FieldInput *input)
@@ -173,15 +200,30 @@ int sub_8068024(struct FieldInput *input)
r6 = player_get_direction_lower_nybble();
player_get_pos_to_and_height(&position);
r4 = MapGridGetMetatileBehaviorAt(position.x, position.y);
- if (CheckTrainers() == TRUE)
+#if DEBUG
+ if (input->input_field_1_3 && dive_warp(&position, r4) == TRUE)
return TRUE;
- if (mapheader_run_first_tag2_script_list_match() == 1)
+#endif
+
+ if (
+#if DEBUG
+ !input->input_field_1_1 &&
+#endif
+ CheckTrainers() == TRUE)
+ return TRUE;
+
+ if (
+#if DEBUG
+ !input->input_field_1_1 &&
+#endif
+ mapheader_run_first_tag2_script_list_match() == 1)
return TRUE;
+
if (input->pressedBButton && sub_80687A4() == 1)
return TRUE;
if (input->input_field_0_6)
{
- IncrementGameStat(5);
+ IncrementGameStat(GAME_STAT_STEPS);
if (sub_80687E4(&position, r4, r6) == 1)
return TRUE;
}
@@ -211,6 +253,21 @@ int sub_8068024(struct FieldInput *input)
}
if (input->pressedSelectButton && sub_80A6D1C() == TRUE)
return TRUE;
+
+#if DEBUG
+ if (input->input_field_1_0)
+ {
+ debug_sub_80888D8();
+ return TRUE;
+ }
+ if (input->input_field_1_2)
+ {
+ PlaySE(SE_WIN_OPEN);
+ DebugMenu_8077048();
+ return TRUE;
+ }
+#endif
+
return FALSE;
}
@@ -532,7 +589,7 @@ static void happiness_algorithm_step(void)
{
struct Pokemon *pkmn = gPlayerParty;
- for (i = 5; i >= 0; i--)
+ for (i = 0; i < 6; i++)
{
AdjustFriendship(pkmn, 5);
pkmn++;
@@ -767,20 +824,19 @@ static u8 *trigger_activate(struct CoordEvent *coordEvent)
return NULL;
}
-static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 x, u16 y, u8 d)
+static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 x, u16 y, u8 elevation)
{
s32 i;
struct CoordEvent *coordEvents = mapHeader->events->coordEvents;
u8 coordEventCount = mapHeader->events->coordEventCount;
- u8 *script;
for (i = 0; i < coordEventCount; i++)
{
if ((u16)coordEvents[i].x == x && (u16)coordEvents[i].y == y)
{
- if (coordEvents[i].unk4 == d || coordEvents[i].unk4 == 0)
+ if (coordEvents[i].elevation == elevation || coordEvents[i].elevation == 0)
{
- script = trigger_activate(&coordEvents[i]);
+ u8 *script = trigger_activate(&coordEvents[i]);
if (script != NULL)
return script;
}
@@ -811,7 +867,7 @@ static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *mapHea
return NULL;
}
-int dive_warp(struct MapPosition *position, u16 b)
+bool8 dive_warp(struct MapPosition *position, u16 b)
{
if (gMapHeader.mapType == MAP_TYPE_UNDERWATER && sub_805750C(b) == 0)
{
diff --git a/src/field/field_effect.c b/src/field/field_effect.c
index 1e2aaa4ed..e1389c378 100644
--- a/src/field/field_effect.c
+++ b/src/field/field_effect.c
@@ -25,6 +25,7 @@
#include "field_map_obj.h"
#include "util.h"
#include "field_effect_helpers.h"
+#include "pokemon_storage_system.h"
#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))}
@@ -407,7 +408,7 @@ void FieldEffectScript_LoadFadedPalette(u8 **script)
{
struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script);
LoadSpritePalette(palette);
- sub_807D78C(IndexOfSpritePaletteTag(palette->tag));
+ UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag));
(*script) += 4;
}
@@ -543,7 +544,7 @@ u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority)
LoadCompressedObjectPalette(&gMonPaletteTable[species]);
GetMonSpriteTemplate_803C56C(species, 3);
gUnknown_02024E8C.paletteTag = gMonPaletteTable[0].tag;
- sub_807DE38(IndexOfSpritePaletteTag(gMonPaletteTable[0].tag) + 0x10);
+ PreservePaletteInWeather(IndexOfSpritePaletteTag(gMonPaletteTable[0].tag) + 0x10);
return CreateSprite(&gUnknown_02024E8C, x, y, subpriority);
}
@@ -556,13 +557,13 @@ u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subprio
LoadCompressedObjectPalette(spritePalette);
GetMonSpriteTemplate_803C56C(species, 3);
gUnknown_02024E8C.paletteTag = spritePalette->tag;
- sub_807DE38(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10);
+ PreservePaletteInWeather(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10);
return CreateSprite(&gUnknown_02024E8C, x, y, subpriority);
}
void FreeResourcesAndDestroySprite(struct Sprite *sprite)
{
- sub_807DE68();
+ ResetPreservedPalettesInWeather();
FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum));
if (sprite->oam.affineMode != 0)
{
@@ -1091,7 +1092,7 @@ void task00_8084310(u8 taskId)
task = &gTasks[taskId];
if (!task->data[0])
{
- if (!sub_807D770())
+ if (!IsWeatherNotFadingIn())
{
return;
}
@@ -1191,7 +1192,7 @@ bool8 sub_80867AC(struct Task *task) // gUnknown_0839F2CC[0]
bool8 sub_8086854(struct Task *task) // gUnknown_0839F2CC[1]
{
- if (sub_807D770())
+ if (IsWeatherNotFadingIn())
{
task->data[0]++;
}
@@ -1813,7 +1814,7 @@ bool8 sub_80874CC(struct Task *task, struct MapObject *mapObject, struct Sprite
bool8 sub_80874FC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite)
{
- if (sub_807D770())
+ if (IsWeatherNotFadingIn())
{
gFieldEffectArguments[0] = mapObject->coords2.x;
gFieldEffectArguments[1] = mapObject->coords2.y;
@@ -2046,7 +2047,7 @@ void sub_8087A74(u8 taskId)
void sub_8087AA4(struct Task *task)
{
- if (sub_807D770())
+ if (IsWeatherNotFadingIn())
{
task->data[0]++;
task->data[15] = player_get_direction_lower_nybble();
@@ -2199,7 +2200,7 @@ void sub_8087E4C(struct Task *task)
{
struct Sprite *sprite;
s16 centerToCornerVecY;
- if (sub_807D770())
+ if (IsWeatherNotFadingIn())
{
sprite = &gSprites[gPlayerAvatar.spriteId];
centerToCornerVecY = -(sprite->centerToCornerVecY << 1);
@@ -2434,8 +2435,8 @@ void sub_8088380(struct Task *task)
IntrCallback callback;
LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback);
SetVBlankCallback(callback);
- SetUpWindowConfig(&gWindowConfig_81E6CE4);
- InitMenuWindow(&gWindowConfig_81E6CE4);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4);
+ InitMenuWindow(&gWindowTemplate_81E6CE4);
FreeResourcesAndDestroySprite(&gSprites[task->data[15]]);
FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON);
DestroyTask(FindTaskIdByFunc(sub_8088120));
@@ -2557,8 +2558,8 @@ void sub_808862C(struct Task *task)
CpuFill32(0, (void *)VRAM + bg0cnt, 0x800);
LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback);
SetVBlankCallback(intrCallback);
- SetUpWindowConfig(&gWindowConfig_81E6CE4);
- InitMenuWindow(&gWindowConfig_81E6CE4);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4);
+ InitMenuWindow(&gWindowTemplate_81E6CE4);
FreeResourcesAndDestroySprite(&gSprites[task->data[15]]);
FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON);
DestroyTask(FindTaskIdByFunc(sub_808847C));
diff --git a/src/field/field_effect_helpers.c b/src/field/field_effect_helpers.c
index 165829a55..c9d337de1 100644
--- a/src/field/field_effect_helpers.c
+++ b/src/field/field_effect_helpers.c
@@ -29,8 +29,6 @@ static void sub_81280A0(struct MapObject *, struct Sprite *, struct Sprite *);
static void sub_8128174(struct Sprite *);
static u32 ShowDisguiseFieldEffect(u8, u8, u8);
-const u8 UnusedEggString_8401E28[] = _("タマゴ");
-
void SetUpReflection(struct MapObject *mapObject, struct Sprite *sprite, bool8 flag)
{
struct Sprite *newSprite;
@@ -95,7 +93,7 @@ static void npc_pal_op_B(struct MapObject *mapObject, u8 paletteNum)
{
pal_patch_for_npc(npc_paltag_by_palslot(paletteNum), paletteNum);
}
- sub_807D78C(paletteNum);
+ UpdateSpritePaletteWithWeather(paletteNum);
}
}
@@ -107,7 +105,7 @@ static void npc_pal_op_A(struct MapObject *mapObject, u8 paletteNum)
if (graphicsInfo->paletteTag2 != 0x11ff)
{
pal_patch_for_npc(graphicsInfo->paletteTag2, paletteNum);
- sub_807D78C(paletteNum);
+ UpdateSpritePaletteWithWeather(paletteNum);
}
}
diff --git a/src/field/field_fadetransition.c b/src/field/field_fadetransition.c
index 5014e97e3..21235500a 100644
--- a/src/field/field_fadetransition.c
+++ b/src/field/field_fadetransition.c
@@ -44,18 +44,18 @@ void pal_fill_for_map_transition(void)
switch (fade_type_for_given_maplight_pair(map_light, Overworld_GetMapTypeOfSaveblockLocation()))
{
case 0:
- fade_screen(0, 0);
+ FadeScreen(0, 0);
palette_bg_fill_black();
break;
case 1:
- fade_screen(2, 0);
+ FadeScreen(2, 0);
palette_bg_fill_white();
}
}
void pal_fill_black(void)
{
- fade_screen(0, 0);
+ FadeScreen(0, 0);
palette_bg_fill_black();
}
@@ -65,10 +65,10 @@ void fade_8080918(void)
switch (sub_810CDB8(light_level, warp1_get_mapheader()->mapType))
{
case 0:
- fade_screen(1, 0);
+ FadeScreen(1, 0);
break;
case 1:
- fade_screen(3, 0);
+ FadeScreen(3, 0);
}
}
@@ -146,7 +146,7 @@ void sub_8080A5C(u8 taskId)
task->data[0]++;
break;
case 1:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
pal_fill_for_map_transition();
task->data[0]++;
@@ -366,7 +366,7 @@ bool32 sub_8080E64(void)
bool32 sub_8080E70(void)
{
- if (sub_807D770() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
return TRUE;
else
return FALSE;
@@ -483,7 +483,7 @@ void sub_8081050(u8 taskId)
{
case 0:
ClearLinkCallback_2();
- fade_screen(1, 0);
+ FadeScreen(1, 0);
sub_8053FF8();
PlaySE(SE_KAIDAN);
data[0]++;
@@ -511,6 +511,22 @@ void sub_80810DC(void)
CreateTask(sub_8081050, 10);
}
+#if DEBUG
+
+__attribute__((naked))
+void debug_sub_80888D8()
+{
+ asm("\
+ PUSH {LR}\n\
+ BL debug_sub_8052E04\n\
+ BL sub_8080E88\n\
+ BL ScriptContext2_Enable\n\
+ POP {R0}\n\
+ BX R0");
+}
+
+#endif
+
void task0A_fade_n_map_maybe(u8 taskId)
{
struct Task *task = &gTasks[taskId];
diff --git a/src/field/field_map_obj.c b/src/field/field_map_obj.c
index ba7c3d68e..13d8ebb5b 100644
--- a/src/field/field_map_obj.c
+++ b/src/field/field_map_obj.c
@@ -1907,6 +1907,9 @@ static u8 gUnknown_030005A4;
static u16 gUnknown_030005A6;
struct MapObject gMapObjects[16];
+#if DEBUG
+u8 gUnknown_Debug_03004BC0[4]; // unknown type
+#endif
void npc_clear_ids_and_state(struct MapObject *mapObj)
{
@@ -1917,6 +1920,40 @@ void npc_clear_ids_and_state(struct MapObject *mapObj)
mapObj->mapobj_unk_1C = 0xFF;
}
+#if DEBUG
+__attribute__((naked))
+void npcs_clear_ids_and_state()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " mov r4, #0x0\n"
+ " ldr r5, ._2 @ gMapObjects\n"
+ "._1:\n"
+ " lsl r0, r4, #0x3\n"
+ " add r0, r0, r4\n"
+ " lsl r0, r0, #0x2\n"
+ " add r0, r0, r5\n"
+ " bl npc_clear_ids_and_state\n"
+ " add r0, r4, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " cmp r4, #0xf\n"
+ " bls ._1 @cond_branch\n"
+ " ldr r1, ._2 + 4 @ gUnknown_Debug_03004BC0\n"
+ " mov r0, #0x0\n"
+ " strb r0, [r1]\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._3:\n"
+ " .align 2, 0\n"
+ "._2:\n"
+ " .word gMapObjects\n"
+ " .word gUnknown_Debug_03004BC0\n"
+ "\n"
+ );
+}
+#else
void npcs_clear_ids_and_state(void)
{
u8 i;
@@ -1924,6 +1961,7 @@ void npcs_clear_ids_and_state(void)
for (i = 0; i < 16; i++)
npc_clear_ids_and_state(&gMapObjects[i]);
}
+#endif
void sub_805AA98(void)
{
@@ -2017,6 +2055,176 @@ u8 GetFieldObjectIdByLocalId(u8 localId)
return 16;
}
+#if DEBUG
+__attribute__((naked))
+u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c)
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, r9\n"
+ " mov r6, r8\n"
+ " push {r6, r7}\n"
+ " add sp, sp, #0xfffffffc\n"
+ " add r5, r0, #0\n"
+ " lsl r1, r1, #0x18\n"
+ " lsr r6, r1, #0x18\n"
+ " lsl r2, r2, #0x18\n"
+ " lsr r7, r2, #0x18\n"
+ " ldrb r0, [r5]\n"
+ " add r1, r6, #0\n"
+ " add r2, r7, #0\n"
+ " mov r3, sp\n"
+ " bl GetAvailableFieldObjectSlot\n"
+ " lsl r0, r0, #0x18\n"
+ " cmp r0, #0\n"
+ " beq ._35 @cond_branch\n"
+ " mov r0, #0x10\n"
+ " b ._36\n"
+ "._35:\n"
+ " mov r0, sp\n"
+ " ldrb r1, [r0]\n"
+ " lsl r0, r1, #0x3\n"
+ " add r0, r0, r1\n"
+ " lsl r0, r0, #0x2\n"
+ " ldr r1, ._40 @ gMapObjects\n"
+ " add r4, r0, r1\n"
+ " add r0, r4, #0\n"
+ " bl npc_clear_ids_and_state\n"
+ " ldrh r3, [r5, #0x4]\n"
+ " add r3, r3, #0x7\n"
+ " lsl r3, r3, #0x10\n"
+ " lsr r3, r3, #0x10\n"
+ " ldrh r2, [r5, #0x6]\n"
+ " add r2, r2, #0x7\n"
+ " lsl r2, r2, #0x10\n"
+ " lsr r2, r2, #0x10\n"
+ " ldrb r0, [r4]\n"
+ " mov r1, #0x1\n"
+ " orr r0, r0, r1\n"
+ " mov r1, #0x4\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r4]\n"
+ " ldrb r0, [r5, #0x1]\n"
+ " strb r0, [r4, #0x5]\n"
+ " ldrb r0, [r5, #0x9]\n"
+ " strb r0, [r4, #0x6]\n"
+ " ldrb r0, [r5]\n"
+ " strb r0, [r4, #0x8]\n"
+ " strb r6, [r4, #0x9]\n"
+ " strb r7, [r4, #0xa]\n"
+ " strh r3, [r4, #0xc]\n"
+ " strh r2, [r4, #0xe]\n"
+ " strh r3, [r4, #0x10]\n"
+ " strh r2, [r4, #0x12]\n"
+ " strh r3, [r4, #0x14]\n"
+ " strh r2, [r4, #0x16]\n"
+ " ldrb r0, [r5, #0x8]\n"
+ " mov r7, #0xf\n"
+ " add r1, r7, #0\n"
+ " and r1, r1, r0\n"
+ " ldrb r2, [r4, #0xb]\n"
+ " mov r0, #0x10\n"
+ " neg r0, r0\n"
+ " mov r8, r0\n"
+ " and r0, r0, r2\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r4, #0xb]\n"
+ " ldrb r1, [r5, #0x8]\n"
+ " lsl r1, r1, #0x4\n"
+ " and r0, r0, r7\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r4, #0xb]\n"
+ " ldrb r1, [r5, #0xa]\n"
+ " lsl r1, r1, #0x1c\n"
+ " mov r0, #0xf\n"
+ " mov r9, r0\n"
+ " lsr r1, r1, #0x1c\n"
+ " ldrb r2, [r4, #0x19]\n"
+ " mov r0, r8\n"
+ " and r0, r0, r2\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r4, #0x19]\n"
+ " ldrb r1, [r5, #0xa]\n"
+ " lsr r1, r1, #0x4\n"
+ " lsl r1, r1, #0x4\n"
+ " and r0, r0, r7\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r4, #0x19]\n"
+ " ldrh r0, [r5, #0xc]\n"
+ " strb r0, [r4, #0x7]\n"
+ " ldrh r0, [r5, #0xe]\n"
+ " strb r0, [r4, #0x1d]\n"
+ " ldr r1, ._40 + 4 @ gUnknown_0836DC09\n"
+ " ldrb r0, [r5, #0x9]\n"
+ " add r0, r0, r1\n"
+ " ldrb r1, [r0]\n"
+ " add r0, r4, #0\n"
+ " add r0, r0, #0x20\n"
+ " strb r1, [r0]\n"
+ " ldrb r1, [r0]\n"
+ " add r0, r4, #0\n"
+ " bl FieldObjectSetDirection\n"
+ " add r0, r4, #0\n"
+ " bl FieldObjectHandleDynamicGraphicsId\n"
+ " ldr r1, ._40 + 8 @ gUnknown_0836DBBC\n"
+ " ldrb r0, [r4, #0x6]\n"
+ " add r0, r0, r1\n"
+ " ldrb r0, [r0]\n"
+ " cmp r0, #0\n"
+ " beq ._39 @cond_branch\n"
+ " ldrb r2, [r4, #0x19]\n"
+ " add r0, r7, #0\n"
+ " and r0, r0, r2\n"
+ " cmp r0, #0\n"
+ " bne ._38 @cond_branch\n"
+ " lsl r0, r2, #0x1c\n"
+ " lsr r0, r0, #0x1c\n"
+ " add r0, r0, #0x1\n"
+ " mov r1, r9\n"
+ " and r0, r0, r1\n"
+ " mov r1, r8\n"
+ " and r1, r1, r2\n"
+ " orr r1, r1, r0\n"
+ " strb r1, [r4, #0x19]\n"
+ "._38:\n"
+ " ldrb r2, [r4, #0x19]\n"
+ " mov r0, #0xf0\n"
+ " and r0, r0, r2\n"
+ " cmp r0, #0\n"
+ " bne ._39 @cond_branch\n"
+ " lsr r1, r2, #0x4\n"
+ " add r1, r1, #0x1\n"
+ " lsl r1, r1, #0x4\n"
+ " add r0, r7, #0\n"
+ " and r0, r0, r2\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r4, #0x19]\n"
+ "._39:\n"
+ " ldr r1, ._40 + 12 @ gUnknown_Debug_03004BC0\n"
+ " ldrb r0, [r1]\n"
+ " add r0, r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " mov r0, sp\n"
+ " ldrb r0, [r0]\n"
+ "._36:\n"
+ " add sp, sp, #0x4\n"
+ " pop {r3, r4}\n"
+ " mov r8, r3\n"
+ " mov r9, r4\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._41:\n"
+ " .align 2, 0\n"
+ "._40:\n"
+ " .word gMapObjects\n"
+ " .word gUnknown_0836DC09\n"
+ " .word gUnknown_0836DBBC\n"
+ " .word gUnknown_Debug_03004BC0\n"
+ "\n"
+ );
+}
+#else
#ifdef NONMATCHING
u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c)
{
@@ -2227,6 +2435,7 @@ _0805ADD8: .4byte gUnknown_0836DBBC\n\
.syntax divided\n");
}
#endif
+#endif
u8 sub_805ADDC(u8 localId)
{
@@ -2266,11 +2475,38 @@ u8 GetAvailableFieldObjectSlot(u16 a, u8 b, u8 c, u8 *d)
return 0;
}
+#if DEBUG
+__attribute__((naked))
+void RemoveFieldObject(struct MapObject *mapObject)
+{
+ asm(
+ " push {lr}\n"
+ " ldrb r2, [r0]\n"
+ " mov r1, #0x2\n"
+ " neg r1, r1\n"
+ " and r1, r1, r2\n"
+ " strb r1, [r0]\n"
+ " bl RemoveFieldObjectInternal\n"
+ " ldr r1, ._72 @ gUnknown_Debug_03004BC0\n"
+ " ldrb r0, [r1]\n"
+ " sub r0, r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._73:\n"
+ " .align 2, 0\n"
+ "._72:\n"
+ " .word gUnknown_Debug_03004BC0\n"
+ "\n"
+ );
+}
+#else
void RemoveFieldObject(struct MapObject *mapObject)
{
mapObject->active = FALSE;
RemoveFieldObjectInternal(mapObject);
}
+#endif
void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
{
@@ -2303,6 +2539,226 @@ void npc_hide_all_but_player(void)
}
}
+#if DEBUG
+__attribute__((naked))
+u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f)
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, sl\n"
+ " mov r6, r9\n"
+ " mov r5, r8\n"
+ " push {r5, r6, r7}\n"
+ " add r7, r1, #0\n"
+ " add r1, r2, #0\n"
+ " add r2, r3, #0\n"
+ " ldr r3, [sp, #0x20]\n"
+ " ldr r4, [sp, #0x24]\n"
+ " lsl r1, r1, #0x18\n"
+ " lsr r1, r1, #0x18\n"
+ " lsl r2, r2, #0x18\n"
+ " lsr r2, r2, #0x18\n"
+ " lsl r3, r3, #0x10\n"
+ " lsr r3, r3, #0x10\n"
+ " mov r9, r3\n"
+ " lsl r4, r4, #0x10\n"
+ " lsr r4, r4, #0x10\n"
+ " mov sl, r4\n"
+ " bl InitFieldObjectStateFromTemplate\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " mov r8, r0\n"
+ " cmp r0, #0x10\n"
+ " bne ._83 @cond_branch\n"
+ " mov r0, #0x10\n"
+ " b ._92\n"
+ "._83:\n"
+ " mov r0, r8\n"
+ " lsl r4, r0, #0x3\n"
+ " add r0, r4, r0\n"
+ " lsl r0, r0, #0x2\n"
+ " ldr r1, ._87 @ gMapObjects\n"
+ " add r5, r0, r1\n"
+ " ldrb r0, [r5, #0x5]\n"
+ " bl GetFieldObjectGraphicsInfo\n"
+ " add r6, r0, #0\n"
+ " ldrb r1, [r6, #0xc]\n"
+ " mov r0, #0xf\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " bne ._85 @cond_branch\n"
+ " ldrh r0, [r6, #0x2]\n"
+ " lsl r1, r1, #0x1c\n"
+ " lsr r1, r1, #0x1c\n"
+ " bl npc_load_two_palettes__no_record\n"
+ " b ._89\n"
+ "._88:\n"
+ " .align 2, 0\n"
+ "._87:\n"
+ " .word gMapObjects\n"
+ "._85:\n"
+ " cmp r0, #0xa\n"
+ " bne ._89 @cond_branch\n"
+ " ldrh r0, [r6, #0x2]\n"
+ " lsl r1, r1, #0x1c\n"
+ " lsr r1, r1, #0x1c\n"
+ " bl npc_load_two_palettes__and_record\n"
+ "._89:\n"
+ " ldrb r0, [r5, #0x6]\n"
+ " cmp r0, #0x4c\n"
+ " bne ._90 @cond_branch\n"
+ " ldrb r0, [r5, #0x1]\n"
+ " mov r1, #0x20\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r5, #0x1]\n"
+ "._90:\n"
+ " ldr r1, ._93 @ 0xffff\n"
+ " add r0, r1, #0\n"
+ " strh r0, [r7, #0x2]\n"
+ " add r0, r7, #0\n"
+ " mov r1, #0x0\n"
+ " mov r2, #0x0\n"
+ " mov r3, #0x0\n"
+ " bl CreateSprite\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r7, r0, #0x18\n"
+ " cmp r7, #0x40\n"
+ " bne ._91 @cond_branch\n"
+ " ldr r1, ._93 + 4 @ gUnknown_Debug_03004BC0\n"
+ " ldrb r0, [r1]\n"
+ " sub r0, r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " ldr r0, ._93 + 8 @ gMapObjects\n"
+ " mov r2, r8\n"
+ " add r1, r4, r2\n"
+ " lsl r1, r1, #0x2\n"
+ " add r1, r1, r0\n"
+ " ldrb r2, [r1]\n"
+ " mov r0, #0x2\n"
+ " neg r0, r0\n"
+ " and r0, r0, r2\n"
+ " strb r0, [r1]\n"
+ " mov r0, #0x10\n"
+ " b ._92\n"
+ "._94:\n"
+ " .align 2, 0\n"
+ "._93:\n"
+ " .word 0xffff\n"
+ " .word gUnknown_Debug_03004BC0\n"
+ " .word gMapObjects\n"
+ "._91:\n"
+ " lsl r0, r7, #0x4\n"
+ " add r0, r0, r7\n"
+ " lsl r0, r0, #0x2\n"
+ " ldr r1, ._96 @ gSprites\n"
+ " add r4, r0, r1\n"
+ " mov r1, r9\n"
+ " lsl r0, r1, #0x10\n"
+ " asr r0, r0, #0x10\n"
+ " ldrh r2, [r5, #0x10]\n"
+ " add r0, r0, r2\n"
+ " lsl r0, r0, #0x10\n"
+ " asr r0, r0, #0x10\n"
+ " mov r2, sl\n"
+ " lsl r1, r2, #0x10\n"
+ " asr r1, r1, #0x10\n"
+ " ldrh r2, [r5, #0x12]\n"
+ " add r1, r1, r2\n"
+ " lsl r1, r1, #0x10\n"
+ " asr r1, r1, #0x10\n"
+ " add r2, r4, #0\n"
+ " add r2, r2, #0x20\n"
+ " add r3, r4, #0\n"
+ " add r3, r3, #0x22\n"
+ " bl sub_8060388\n"
+ " ldrh r0, [r6, #0x8]\n"
+ " lsl r0, r0, #0x10\n"
+ " asr r0, r0, #0x11\n"
+ " neg r0, r0\n"
+ " add r1, r4, #0\n"
+ " add r1, r1, #0x28\n"
+ " strb r0, [r1]\n"
+ " ldrh r0, [r6, #0xa]\n"
+ " lsl r0, r0, #0x10\n"
+ " asr r0, r0, #0x11\n"
+ " neg r0, r0\n"
+ " add r2, r4, #0\n"
+ " add r2, r2, #0x29\n"
+ " strb r0, [r2]\n"
+ " ldrh r0, [r4, #0x20]\n"
+ " add r0, r0, #0x8\n"
+ " strh r0, [r4, #0x20]\n"
+ " ldrh r1, [r4, #0x22]\n"
+ " add r1, r1, #0x10\n"
+ " mov r0, #0x0\n"
+ " ldsb r0, [r2, r0]\n"
+ " add r0, r0, r1\n"
+ " strh r0, [r4, #0x22]\n"
+ " ldrb r1, [r6, #0xc]\n"
+ " lsl r1, r1, #0x1c\n"
+ " lsr r1, r1, #0x18\n"
+ " ldrb r2, [r4, #0x5]\n"
+ " mov r0, #0xf\n"
+ " and r0, r0, r2\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r4, #0x5]\n"
+ " add r2, r4, #0\n"
+ " add r2, r2, #0x3e\n"
+ " ldrb r0, [r2]\n"
+ " mov r1, #0x2\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r2]\n"
+ " mov r0, r8\n"
+ " strh r0, [r4, #0x2e]\n"
+ " strb r7, [r5, #0x4]\n"
+ " ldrb r1, [r6, #0xc]\n"
+ " lsl r1, r1, #0x19\n"
+ " lsr r1, r1, #0x1f\n"
+ " lsl r1, r1, #0x4\n"
+ " ldrb r2, [r5, #0x1]\n"
+ " mov r0, #0x11\n"
+ " neg r0, r0\n"
+ " and r0, r0, r2\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r5, #0x1]\n"
+ " lsl r0, r0, #0x1b\n"
+ " cmp r0, #0\n"
+ " blt ._95 @cond_branch\n"
+ " ldrb r0, [r5, #0x18]\n"
+ " lsl r0, r0, #0x1c\n"
+ " lsr r0, r0, #0x1c\n"
+ " bl FieldObjectDirectionToImageAnimId\n"
+ " add r1, r0, #0\n"
+ " lsl r1, r1, #0x18\n"
+ " lsr r1, r1, #0x18\n"
+ " add r0, r4, #0\n"
+ " bl StartSpriteAnim\n"
+ "._95:\n"
+ " ldrb r0, [r5, #0xb]\n"
+ " lsr r0, r0, #0x4\n"
+ " add r1, r4, #0\n"
+ " mov r2, #0x1\n"
+ " bl SetObjectSubpriorityByZCoord\n"
+ " add r0, r5, #0\n"
+ " add r1, r4, #0\n"
+ " bl sub_80634D0\n"
+ " mov r0, r8\n"
+ "._92:\n"
+ " pop {r3, r4, r5}\n"
+ " mov r8, r3\n"
+ " mov r9, r4\n"
+ " mov sl, r5\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._97:\n"
+ " .align 2, 0\n"
+ "._96:\n"
+ " .word gSprites\n"
+ "\n"
+ );
+}
+#else
u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f)
{
u8 mapObjectId;
@@ -2352,6 +2808,7 @@ u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *
sub_80634D0(mapObject, sprite);
return mapObjectId;
}
+#endif
u8 SpawnFieldObject(struct MapObjectTemplate *mapObjTemplate, u8 b, u8 c, s16 d, s16 e)
{
@@ -2440,7 +2897,7 @@ void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjT
MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObjTemplate->graphicsId, mapObjTemplate->movementType, sprTemplate, subspriteTables);
}
-u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 c, s16 d, u8 subpriority)
+u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority)
{
struct SpriteTemplate spriteTemplate;
const struct SubspriteTable *subspriteTables;
@@ -2449,7 +2906,7 @@ u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 c
MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, callback, &spriteTemplate, &subspriteTables);
if (spriteTemplate.paletteTag != 0xFFFF)
sub_805BDF8(spriteTemplate.paletteTag);
- spriteId = CreateSprite(&spriteTemplate, c, d, subpriority);
+ spriteId = CreateSprite(&spriteTemplate, x, y, subpriority);
if (spriteId != 64 && subspriteTables != NULL)
{
SetSubspriteTables(&gSprites[spriteId], subspriteTables);
@@ -2574,6 +3031,66 @@ void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject)
void sub_805B75C(u8, s16, s16);
+#if DEBUG
+__attribute__((naked))
+void sub_805B710(u16 u161, u16 u162)
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, r8\n"
+ " push {r7}\n"
+ " add r4, r0, #0\n"
+ " add r5, r1, #0\n"
+ " lsl r4, r4, #0x10\n"
+ " lsr r4, r4, #0x10\n"
+ " lsl r5, r5, #0x10\n"
+ " lsr r5, r5, #0x10\n"
+ " ldr r6, ._153 @ gUnknown_Debug_03004BC0\n"
+ " mov r0, #0x0\n"
+ " strb r0, [r6]\n"
+ " bl ClearPlayerAvatarInfo\n"
+ " mov r7, #0x0\n"
+ " ldr r0, ._153 + 4 @ gMapObjects\n"
+ " mov r8, r0\n"
+ " lsl r4, r4, #0x10\n"
+ " lsl r5, r5, #0x10\n"
+ "._152:\n"
+ " lsl r0, r7, #0x3\n"
+ " add r0, r0, r7\n"
+ " lsl r0, r0, #0x2\n"
+ " add r0, r0, r8\n"
+ " ldrb r0, [r0]\n"
+ " lsl r0, r0, #0x1f\n"
+ " cmp r0, #0\n"
+ " beq ._151 @cond_branch\n"
+ " add r0, r7, #0\n"
+ " asr r1, r4, #0x10\n"
+ " asr r2, r5, #0x10\n"
+ " bl sub_805B75C\n"
+ " ldrb r0, [r6]\n"
+ " add r0, r0, #0x1\n"
+ " strb r0, [r6]\n"
+ "._151:\n"
+ " add r0, r7, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r7, r0, #0x18\n"
+ " cmp r7, #0xf\n"
+ " bls ._152 @cond_branch\n"
+ " bl sub_805AAB0\n"
+ " pop {r3}\n"
+ " mov r8, r3\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._154:\n"
+ " .align 2, 0\n"
+ "._153:\n"
+ " .word gUnknown_Debug_03004BC0\n"
+ " .word gMapObjects\n"
+ "\n"
+ );
+}
+#else
void sub_805B710(u16 a, u16 b)
{
u8 i;
@@ -2586,6 +3103,7 @@ void sub_805B710(u16 a, u16 b)
}
sub_805AAB0();
}
+#endif
extern void SetPlayerAvatarFieldObjectIdAndObjectId(u8, u8);
extern void sub_805B914(struct MapObject *);
diff --git a/src/field/field_message_box.c b/src/field/field_message_box.c
index 35aac7ac9..5eec7a14b 100644
--- a/src/field/field_message_box.c
+++ b/src/field/field_message_box.c
@@ -19,8 +19,8 @@ static void PrintFieldMessageFromStringVar4(void);
void InitFieldMessageBox(void)
{
sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN;
- SetMessageBoxBaseTileNum(gMenuTextWindowContentTileOffset);
- InitWindowFromConfig(&gFieldMessageBoxWindow, &gWindowConfig_81E6CE4);
+ TextWindow_SetDlgFrameBaseTileNum(gMenuTextWindowContentTileOffset);
+ Text_InitWindowWithTemplate(&gFieldMessageBoxWindow, &gWindowTemplate_81E6CE4);
}
static void Task_FieldMessageBox(u8 taskId)
@@ -29,22 +29,22 @@ static void Task_FieldMessageBox(u8 taskId)
switch (task->data[0])
{
case 0:
- LoadMessageBoxTiles(&gFieldMessageBoxWindow);
+ TextWindow_LoadDialogueFrameTiles(&gFieldMessageBoxWindow);
task->data[0]++;
break;
case 1:
- DrawStandardMessageBox(&gFieldMessageBoxWindow);
+ TextWindow_DrawDialogueFrame(&gFieldMessageBoxWindow);
task->data[0]++;
break;
case 2:
switch (sMessageBoxMode)
{
case FIELD_MESSAGE_BOX_NORMAL:
- if (!sub_80035AC(&gFieldMessageBoxWindow))
+ if (!Text_UpdateWindow(&gFieldMessageBoxWindow))
return;
break;
case FIELD_MESSAGE_BOX_AUTO_SCROLL:
- if (!sub_8003778(&gFieldMessageBoxWindow))
+ if (!Text_UpdateWindowAutoscroll(&gFieldMessageBoxWindow))
return;
break;
}
@@ -117,20 +117,20 @@ bool8 unref_sub_8064BD0(const u8 *message)
static void PrintFieldMessage(const u8 *message)
{
StringExpandPlaceholders(gStringVar4, message);
- sub_8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15);
+ Text_InitWindow8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15);
CreateFieldMessageBoxTask();
}
static void PrintFieldMessageFromStringVar4(void)
{
- sub_8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15);
+ Text_InitWindow8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15);
CreateFieldMessageBoxTask();
}
void HideFieldMessageBox(void)
{
DestroyFieldMessageBoxTask();
- ClearStandardMessageBox(&gFieldMessageBoxWindow);
+ TextWindow_EraseDialogueFrame(&gFieldMessageBoxWindow);
sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN;
}
@@ -150,6 +150,6 @@ bool8 IsFieldMessageBoxHidden(void)
void unref_sub_8064CA0(void)
{
DestroyFieldMessageBoxTask();
- DrawStandardMessageBox(&gFieldMessageBoxWindow);
+ TextWindow_DrawDialogueFrame(&gFieldMessageBoxWindow);
sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN;
}
diff --git a/src/field/field_player_avatar.c b/src/field/field_player_avatar.c
index d80076be4..a7594372d 100644
--- a/src/field/field_player_avatar.c
+++ b/src/field/field_player_avatar.c
@@ -32,9 +32,9 @@ static void npc_clear_strange_bits(struct MapObject *a);
static void MovePlayerAvatarUsingKeypadInput(u8 a, u16 b, u16 c);
static void PlayerAllowForcedMovementIfMovingSameDirection(void);
static bool8 TryDoMetatileBehaviorForcedMovement(void);
-static u8 GetForcedMovementByMetatileBehavior(void);
+/*static*/ u8 GetForcedMovementByMetatileBehavior(void);
static void MovePlayerNotOnBike(u8 a, u16 b);
-static u8 CheckMovementInputNotOnBike(u8 a);
+/*static*/ u8 CheckMovementInputNotOnBike(u8 a);
static u8 CheckForPlayerAvatarCollision(u8 a);
static u8 sub_8058EF0(s16 a, s16 b, u8 c);
static bool8 ShouldJumpLedge(s16 a, s16 b, u8 c);
@@ -260,12 +260,59 @@ static void PlayerAllowForcedMovementIfMovingSameDirection(void)
gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_5;
}
+#if DEBUG
+__attribute__((naked))
+u8 TryDoMetatileBehaviorForcedMovement()
+{
+ asm(
+ " push {r4, lr}\n"
+ " ldr r0, ._27 @ gUnknown_020297ED\n"
+ " ldrb r0, [r0]\n"
+ " cmp r0, #0\n"
+ " beq ._25 @cond_branch\n"
+ " ldr r0, ._27 + 4 @ gMain\n"
+ " ldrh r1, [r0, #0x2c]\n"
+ " mov r0, #0x80\n"
+ " lsl r0, r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._25 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " b ._26\n"
+ "._28:\n"
+ " .align 2, 0\n"
+ "._27:\n"
+ " .word gUnknown_020297ED\n"
+ " .word gMain\n"
+ "._25:\n"
+ " ldr r4, ._29 @ gUnknown_0830FBA0\n"
+ " bl GetForcedMovementByMetatileBehavior\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x16\n"
+ " add r0, r0, r4\n"
+ " ldr r0, [r0]\n"
+ " bl _call_via_r0\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ "._26:\n"
+ " pop {r4}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._30:\n"
+ " .align 2, 0\n"
+ "._29:\n"
+ " .word gUnknown_0830FBA0\n"
+ "\n"
+ );
+}
+#else
static bool8 TryDoMetatileBehaviorForcedMovement(void)
{
return gUnknown_0830FBA0[GetForcedMovementByMetatileBehavior()]();
}
+#endif
-static u8 GetForcedMovementByMetatileBehavior(void)
+/*static*/ u8 GetForcedMovementByMetatileBehavior(void)
{
u8 i;
@@ -436,12 +483,57 @@ bool8 ForcedMovement_MuddySlope(void)
}
}
+#if DEBUG
+__attribute__((naked))
+void MovePlayerNotOnBike(u8 u81, u16 u161)
+{
+ asm(
+ " push {r4, r5, r6, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r2, r0, #0x18\n"
+ " add r5, r2, #0\n"
+ " lsl r1, r1, #0x10\n"
+ " lsr r6, r1, #0x10\n"
+ " ldr r0, ._84 @ gUnknown_020297ED\n"
+ " ldrb r0, [r0]\n"
+ " cmp r0, #0\n"
+ " beq ._82 @cond_branch\n"
+ " add r0, r2, #0\n"
+ " bl debug_sub_805F2B0\n"
+ " lsl r0, r0, #0x18\n"
+ " cmp r0, #0\n"
+ " bne ._83 @cond_branch\n"
+ "._82:\n"
+ " ldr r4, ._84 + 4 @ gUnknown_0830FBEC\n"
+ " add r0, r5, #0\n"
+ " bl CheckMovementInputNotOnBike\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x16\n"
+ " add r0, r0, r4\n"
+ " ldr r2, [r0]\n"
+ " add r0, r5, #0\n"
+ " add r1, r6, #0\n"
+ " bl _call_via_r2\n"
+ "._83:\n"
+ " pop {r4, r5, r6}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._85:\n"
+ " .align 2, 0\n"
+ "._84:\n"
+ " .word gUnknown_020297ED\n"
+ " .word gUnknown_0830FBEC\n"
+ "\n"
+ );
+}
+#else
static void MovePlayerNotOnBike(u8 direction, u16 heldKeys)
{
gUnknown_0830FBEC[CheckMovementInputNotOnBike(direction)](direction, heldKeys);
}
+#endif
-static u8 CheckMovementInputNotOnBike(u8 direction)
+/*static*/ u8 CheckMovementInputNotOnBike(u8 direction)
{
if (direction == DIR_NONE)
{
@@ -523,7 +615,7 @@ u8 CheckForFieldObjectCollision(struct MapObject *a, s16 x, s16 y, u8 direction,
return 5;
if (ShouldJumpLedge(x, y, direction))
{
- IncrementGameStat(0x2B);
+ IncrementGameStat(GAME_STAT_JUMPED_DOWN_LEDGES);
return COLLISION_LEDGE_JUMP;
}
if (collision == 4 && sub_8058F6C(x, y, direction))
@@ -1507,7 +1599,7 @@ u8 Fishing4(struct Task *task)
{
u32 randVal;
- MenuDisplayMessageBox();
+ Menu_DisplayDialogueFrame();
task->tStep++;
task->tFrameCounter = 0;
task->tNumDots = 0;
@@ -1549,7 +1641,7 @@ u8 Fishing5(struct Task *task)
}
else
{
- MenuPrint(dot, task->tNumDots + 4, 15);
+ Menu_PrintText(dot, task->tNumDots + 4, 15);
task->tNumDots++;
}
}
@@ -1573,7 +1665,7 @@ u8 Fishing6(struct Task *task)
u8 Fishing7(struct Task *task)
{
sub_805A954();
- MenuPrint(gOtherText_OhABite, 4, 17);
+ Menu_PrintText(gOtherText_OhABite, 4, 17);
task->tStep++;
task->tFrameCounter = 0;
return 0;
@@ -1624,7 +1716,7 @@ u8 Fishing10(struct Task *task)
{
sub_805A954();
MenuPrintMessageDefaultCoords(gOtherText_PokeOnHook);
- MenuDisplayMessageBox();
+ Menu_DisplayDialogueFrame();
task->tStep++;
task->tFrameCounter = 0;
return 0;
@@ -1637,7 +1729,7 @@ u8 Fishing11(struct Task *task)
if (task->tFrameCounter == 0)
{
- if (MenuUpdateWindowText())
+ if (Menu_UpdateWindowText())
{
struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
@@ -1647,7 +1739,7 @@ u8 Fishing11(struct Task *task)
sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 0, 0);
gSprites[gPlayerAvatar.spriteId].pos2.x = 0;
gSprites[gPlayerAvatar.spriteId].pos2.y = 0;
- MenuZeroFillScreen();
+ Menu_EraseScreen();
task->tFrameCounter++;
return 0;
}
@@ -1688,7 +1780,7 @@ u8 Fishing13(struct Task *task)
u8 Fishing14(struct Task *task)
{
sub_805A954();
- MenuDisplayMessageBox();
+ Menu_DisplayDialogueFrame();
task->tStep++;
return 0;
}
@@ -1713,12 +1805,12 @@ u8 Fishing15(struct Task *task)
u8 Fishing16(struct Task *task)
{
- if (MenuUpdateWindowText())
+ if (Menu_UpdateWindowText())
{
gPlayerAvatar.preventStep = FALSE;
ScriptContext2_Disable();
UnfreezeMapObjects();
- MenuZeroFillScreen();
+ Menu_EraseScreen();
sub_80BE97C(0);
DestroyTask(FindTaskIdByFunc(Task_Fishing));
}
@@ -1763,3 +1855,98 @@ static void sub_805A954(void)
if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 1, playerSprite->pos2.y);
}
+
+#if DEBUG
+__attribute__((naked))
+void debug_sub_805F2B0()
+{
+ asm(
+ " push {lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r2, r0, #0x18\n"
+ " ldr r0, ._422 @ gMain\n"
+ " ldrh r1, [r0, #0x2c]\n"
+ " mov r0, #0x80\n"
+ " lsl r0, r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " bne ._420 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " b ._421\n"
+ "._423:\n"
+ " .align 2, 0\n"
+ "._422:\n"
+ " .word gMain\n"
+ "._420:\n"
+ " add r0, r2, #0\n"
+ " bl debug_sub_805F2DC\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ "._421:\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_805F2DC()
+{
+ asm(
+ " push {r4, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " cmp r4, #0\n"
+ " bne ._424 @cond_branch\n"
+ " ldr r2, ._426 @ gMapObjects\n"
+ " ldr r0, ._426 + 4 @ gPlayerAvatar\n"
+ " ldrb r1, [r0, #0x5]\n"
+ " lsl r0, r1, #0x3\n"
+ " add r0, r0, r1\n"
+ " lsl r0, r0, #0x2\n"
+ " add r0, r0, r2\n"
+ " ldrb r0, [r0, #0x18]\n"
+ " lsr r0, r0, #0x4\n"
+ " bl PlayerFaceDirection\n"
+ " b ._430\n"
+ "._427:\n"
+ " .align 2, 0\n"
+ "._426:\n"
+ " .word gMapObjects\n"
+ " .word gPlayerAvatar\n"
+ "._424:\n"
+ " ldr r2, ._431 @ gMapObjects\n"
+ " ldr r0, ._431 + 4 @ gPlayerAvatar\n"
+ " ldrb r1, [r0, #0x5]\n"
+ " lsl r0, r1, #0x3\n"
+ " add r0, r0, r1\n"
+ " lsl r0, r0, #0x2\n"
+ " add r0, r0, r2\n"
+ " ldrb r0, [r0, #0x1]\n"
+ " lsr r0, r0, #0x7\n"
+ " cmp r0, #0\n"
+ " beq ._429 @cond_branch\n"
+ " add r0, r4, #0\n"
+ " bl CanCameraMoveInDirection\n"
+ " cmp r0, #0\n"
+ " bne ._429 @cond_branch\n"
+ " add r0, r4, #0\n"
+ " bl PlayerOnBikeCollide\n"
+ " b ._430\n"
+ "._432:\n"
+ " .align 2, 0\n"
+ "._431:\n"
+ " .word gMapObjects\n"
+ " .word gPlayerAvatar\n"
+ "._429:\n"
+ " add r0, r4, #0\n"
+ " bl PlayerGoSpeed4\n"
+ "._430:\n"
+ " mov r0, #0x1\n"
+ " pop {r4}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+#endif
diff --git a/src/field/field_poison.c b/src/field/field_poison.c
index 49678f269..8365351f9 100644
--- a/src/field/field_poison.c
+++ b/src/field/field_poison.c
@@ -43,7 +43,7 @@ void MonFaintFromPoisonOnField(u8 partyMember)
u32 val = 0;
AdjustFriendship(pkmn, 7);
- SetMonData(pkmn, MON_DATA_STATUS, (u8*)&val);
+ SetMonData(pkmn, MON_DATA_STATUS, &val);
GetMonData(pkmn, MON_DATA_NICKNAME, gStringVar1);
StringGetEnd10(gStringVar1);
}
@@ -60,38 +60,36 @@ bool32 CheckMonFaintedFromPoison(u8 partyMember)
return FALSE;
}
-//Task data
-enum
-{
- TD_STATE,
- TD_PARTY_MEMBER,
-};
+#define tState data[0]
+#define tPartyMember data[1]
void Task_WhiteOut(u8 taskId)
{
- s16 *taskData = gTasks[taskId].data;
+ s16 *data = gTasks[taskId].data;
- switch (taskData[TD_STATE])
+ switch (tState)
{
- case 0: //Check if Pokemon have fainted due to poison
- while (taskData[TD_PARTY_MEMBER] < 6)
+ case 0:
+ // Check if any Pokemon have fainted due to poison
+ while (tPartyMember < 6)
{
- if (CheckMonFaintedFromPoison(taskData[TD_PARTY_MEMBER]))
+ if (CheckMonFaintedFromPoison(tPartyMember))
{
- MonFaintFromPoisonOnField(taskData[TD_PARTY_MEMBER]);
+ // Show message about fainted mon
+ MonFaintFromPoisonOnField(tPartyMember);
ShowFieldMessage(fieldPoisonText_PokemonFainted);
- taskData[TD_STATE]++;
+ tState++;
return;
}
- taskData[TD_PARTY_MEMBER]++;
+ tPartyMember++;
}
- taskData[TD_STATE] = 2;
+ tState = 2;
break;
- case 1: //Wait for message box to disappear
+ case 1: // Wait for message box to disappear
if (IsFieldMessageBoxHidden())
- taskData[TD_STATE]--; //Check next party member
+ tState--; // Go to previous step and check next party member
break;
- case 2: //Done checking Pokemon
+ case 2: // done checking all mons
if (AllMonsFainted())
gSpecialVar_Result = 1;
else
@@ -102,6 +100,9 @@ void Task_WhiteOut(u8 taskId)
}
}
+#undef tState
+#undef tPartyMember
+
void ExecuteWhiteOut(void)
{
CreateTask(Task_WhiteOut, 0x50);
@@ -115,26 +116,28 @@ s32 DoPoisonFieldEffect(void)
u32 numFainting = 0;
int i;
+ // count the number of mons that are poisoned and fainting from poison,
+ // and decrement HP of all poisoned mons
for (i = 0; i < 6; i++)
{
u32 hp;
- // UB: Too few arguments for function 'GetMonData'
if (GetMonData(pkmn, MON_DATA_SANITY_BIT2) != 0
&& pokemon_ailments_get_primary(GetMonData(pkmn, MON_DATA_STATUS)) == 1)
{
+ // decrement HP of poisoned mon
hp = GetMonData(pkmn, MON_DATA_HP);
if (hp != 0)
hp--;
if (hp == 0)
- numFainting++; //Pokemon will now faint due to poison
+ numFainting++;
SetMonData(pkmn, MON_DATA_HP, &hp);
numPoisoned++;
}
pkmn++;
}
if (numFainting != 0 || numPoisoned != 0)
- DoFieldPoisonEffect();
+ FldeffPoison_Start();
if (numFainting != 0)
return 2;
if (numPoisoned != 0)
diff --git a/src/field/field_region_map.c b/src/field/field_region_map.c
index 73e101d8f..54091459f 100644
--- a/src/field/field_region_map.c
+++ b/src/field/field_region_map.c
@@ -50,13 +50,13 @@ void CB2_FieldInitRegionMap(void)
InitRegionMap((void *)&ewram0_5.unk8, 0);
CreateRegionMapPlayerIcon(0, 0);
CreateRegionMapCursor(1, 1);
- SetUpWindowConfig(&gWindowConfig_81E709C);
- InitMenuWindow(&gWindowConfig_81E709C);
- MenuZeroFillScreen();
+ Text_LoadWindowTemplate(&gWindowTemplate_81E709C);
+ InitMenuWindow(&gWindowTemplate_81E709C);
+ Menu_EraseScreen();
REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256;
- MenuDrawTextWindow(21, 0, 29, 3);
+ Menu_DrawStdWindowFrame(21, 0, 29, 3);
sub_8072BD8(gOtherText_Hoenn, 0x16, 1, 0x38);
- MenuDrawTextWindow(16, 16, 29, 19);
+ Menu_DrawStdWindowFrame(16, 16, 29, 19);
sub_813F0C8();
SetMainCallback2(CB2_FieldRegionMap);
SetVBlankCallback(VBlankCB_FieldRegionMap);
@@ -117,7 +117,7 @@ void sub_813EFDC(void)
void sub_813F0C8(void)
{
- MenuFillWindowRectWithBlankTile(17, 17, 28, 18);
+ Menu_BlankWindowRect(17, 17, 28, 18);
if (ewram0_5.unk8.unk16)
- MenuPrint(ewram0_5.unk8.str, 17, 17);
+ Menu_PrintText(ewram0_5.unk8.str, 17, 17);
}
diff --git a/src/field/field_screen_effect.c b/src/field/field_screen_effect.c
index a472d5a9c..61301c5a9 100644
--- a/src/field/field_screen_effect.c
+++ b/src/field/field_screen_effect.c
@@ -7,13 +7,13 @@
#include "script.h"
#include "task.h"
#include "text.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
const static u16 gUnknown_0839ACDC[] = { 0xC8, 0x48, 0x38, 0x28, 0x18, 0x0 };
const s32 gMaxFlashLevel = 4;
-const static struct UnknownTaskStruct gUnknown_0839ACEC =
+const static struct ScanlineEffectParams gUnknown_0839ACEC =
{
(void *)REG_ADDR_WIN0H,
((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1,
@@ -64,18 +64,18 @@ static void sub_8081424(u8 taskId)
switch (data[0])
{
case 0:
- sub_8081398(&gUnknown_03004DE0[gUnknown_03004DC0.srcBank][0], data[1], data[2], data[3]);
+ sub_8081398(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], data[1], data[2], data[3]);
data[0] = 1;
break;
case 1:
- sub_8081398(&gUnknown_03004DE0[gUnknown_03004DC0.srcBank][0], data[1], data[2], data[3]);
+ sub_8081398(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], data[1], data[2], data[3]);
data[0] = 0;
data[3] += data[5];
if (data[3] > data[4])
{
if (data[6] == 1)
{
- remove_some_task();
+ ScanlineEffect_Stop();
data[0] = 2;
}
else
@@ -85,7 +85,7 @@ static void sub_8081424(u8 taskId)
}
break;
case 2:
- dp12_8087EA4();
+ ScanlineEffect_Clear();
DestroyTask(taskId);
break;
}
@@ -140,8 +140,8 @@ void sub_80815E0(u8 a1)
{
if (a1)
{
- sub_8081398(&gUnknown_03004DE0[0][0], 120, 80, gUnknown_0839ACDC[a1]);
- CpuFastSet(&gUnknown_03004DE0[0], &gUnknown_03004DE0[1], 480);
+ sub_8081398(&gScanlineEffectRegBuffers[0][0], 120, 80, gUnknown_0839ACDC[a1]);
+ CpuFastSet(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 480);
}
}
@@ -208,14 +208,14 @@ static void sub_80816A8(u8 taskId)
REG_BLDALPHA = 1804;
REG_WININ = 63;
REG_WINOUT = 30;
- sub_8081398(&gUnknown_03004DE0[0][0], data[2], data[3], 1);
- CpuFastSet(&gUnknown_03004DE0[0], &gUnknown_03004DE0[1], 480);
- //sub_80895F8(gUnknown_0839ACEC[0], gUnknown_0839ACEC[1], gUnknown_0839ACEC[2]);
- sub_80895F8(gUnknown_0839ACEC);
+ sub_8081398(&gScanlineEffectRegBuffers[0][0], data[2], data[3], 1);
+ CpuFastSet(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 480);
+ //ScanlineEffect_SetParams(gUnknown_0839ACEC[0], gUnknown_0839ACEC[1], gUnknown_0839ACEC[2]);
+ ScanlineEffect_SetParams(gUnknown_0839ACEC);
data[0] = 1;
break;
case 1:
- MenuFillWindowRectWithBlankTile(0, 0, 29, 19);
+ Menu_BlankWindowRect(0, 0, 29, 19);
sub_808161C(data[1]);
sub_8081534(data[2], data[3], 1, 160, 1, 2);
data[0] = 2;
@@ -264,8 +264,8 @@ static void sub_80816A8(u8 taskId)
}
break;
case 5:
- MenuZeroFillWindowRect(0, 0, 29, 19);
- LoadFontDefaultPalette(&gWindowConfig_81E6CE4);
+ Menu_EraseWindowRect(0, 0, 29, 19);
+ LoadFontDefaultPalette(&gWindowTemplate_81E6CE4);
REG_WIN0H = 255;
REG_DISPCNT = data[6];
REG_BLDCNT = data[7];
diff --git a/src/field/field_specials.c b/src/field/field_specials.c
index fc6f690a3..e56d9ddbb 100644
--- a/src/field/field_specials.c
+++ b/src/field/field_specials.c
@@ -1058,21 +1058,21 @@ static void sub_810E874(void)
ScriptContext2_Enable();
if (gUnknown_0203925A > 5)
{
- MenuDrawTextWindow(0, 0, 8, 11);
+ Menu_DrawStdWindowFrame(0, 0, 8, 11);
InitMenu(0, 1, 1, 5, 0, 7);
gUnknown_0203925C = 0;
- sub_80F944C();
+ ClearVerticalScrollIndicatorPalettes();
LoadScrollIndicatorPalette();
sub_810ECD4();
}
else
{
- MenuDrawTextWindow(0, 0, 8, 2 * gUnknown_0203925A + 1);
+ Menu_DrawStdWindowFrame(0, 0, 8, 2 * gUnknown_0203925A + 1);
InitMenu(0, 1, 1, gUnknown_0203925A, 0, 7);
}
for (i = 0; i < 5 && gUnknown_03000760[i].var0 != 16; i ++)
{
- MenuPrint(gUnknown_083F8380[gUnknown_03000760[i].var0], 1, 2 * i + 1);
+ Menu_PrintText(gUnknown_083F8380[gUnknown_03000760[i].var0], 1, 2 * i + 1);
}
DisplayCurrentElevatorFloor();
CreateTask(sub_810E984, 8);
@@ -1080,7 +1080,7 @@ static void sub_810E874(void)
void DisplayCurrentElevatorFloor(void)
{
- MenuDrawTextWindow(20, 0, 29, 5);
+ Menu_DrawStdWindowFrame(20, 0, 29, 5);
sub_8072BD8(gOtherText_NowOn, 21, 1, 64);
sub_8072BD8(gUnknown_083F8380[gSpecialVar_0x8005], 21, 3, 64);
}
@@ -1091,15 +1091,15 @@ void sub_810E984(u8 taskId)
if (gMain.newKeys == DPAD_UP && gUnknown_0203925B != 0)
{
gUnknown_0203925B--;
- curMenuPos = GetMenuCursorPos();
- MoveMenuCursorNoWrap(-1);
+ curMenuPos = Menu_GetCursorPos();
+ Menu_MoveCursorNoWrap(-1);
sub_810EAC8(curMenuPos, DPAD_UP);
}
if (gMain.newKeys == DPAD_DOWN && gUnknown_0203925B != gUnknown_0203925A - 1)
{
gUnknown_0203925B++;
- curMenuPos = GetMenuCursorPos();
- MoveMenuCursorNoWrap(+1);
+ curMenuPos = Menu_GetCursorPos();
+ Menu_MoveCursorNoWrap(+1);
sub_810EAC8(curMenuPos, DPAD_DOWN);
}
if (gMain.newKeys & A_BUTTON)
@@ -1109,7 +1109,7 @@ void sub_810E984(u8 taskId)
{
gSpecialVar_Result = 0;
PlaySE(SE_SELECT);
- MenuZeroFillWindowRect(0, 0, 29, 12);
+ Menu_EraseWindowRect(0, 0, 29, 12);
sub_810EC9C(taskId);
}
else
@@ -1119,7 +1119,7 @@ void sub_810E984(u8 taskId)
ShakeScreenInElevator();
FieldObjectTurnByLocalIdAndMap(gSpecialVar_LastTalked, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, DIR_SOUTH);
sub_810EEDC();
- MenuZeroFillScreen();
+ Menu_EraseScreen();
DestroyTask(taskId);
}
}
@@ -1128,7 +1128,7 @@ void sub_810E984(u8 taskId)
gSpecialVar_Result = 0;
PlaySE(SE_SELECT);
sub_810EEDC();
- MenuZeroFillWindowRect(0, 0, 29, 12);
+ Menu_EraseWindowRect(0, 0, 29, 12);
sub_810EC9C(taskId);
}
}
@@ -1163,10 +1163,10 @@ bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput)
if (flag)
{
sub_810EB90(newPos, 5);
- MenuFillWindowRectWithBlankTile(2, 1, 7, 10);
+ Menu_BlankWindowRect(2, 1, 7, 10);
for (i=0; i<5 && gUnknown_03000760[newPos].var0 != 16; newPos++, i++)
{
- MenuPrint(gUnknown_083F8380[gUnknown_03000760[newPos].var0], 1, i * 2 + 1);
+ Menu_PrintText(gUnknown_083F8380[gUnknown_03000760[newPos].var0], 1, i * 2 + 1);
}
}
return flag;
@@ -1227,7 +1227,7 @@ bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput)
"\tmovs r1, 0x1\n"
"\tmovs r2, 0x7\n"
"\tmovs r3, 0xA\n"
- "\tbl MenuFillWindowRectWithBlankTile\n"
+ "\tbl Menu_BlankWindowRect\n"
"\tmovs r5, 0\n"
"\tldr r2, _0810EB88 @ =gUnknown_03000760\n"
"\tlsls r1, r4, 2\n"
@@ -1249,7 +1249,7 @@ bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput)
"\tlsls r2, 24\n"
"\tlsrs r2, 24\n"
"\tmovs r1, 0x1\n"
- "\tbl MenuPrint\n"
+ "\tbl Menu_PrintText\n"
"\tadds r0, r4, 0x1\n"
"\tlsls r0, 24\n"
"\tlsrs r4, r0, 24\n"
@@ -1283,7 +1283,7 @@ void sub_810EB90(u8 newPos, u8 maxItems)
if (newPos == 0)
{
gUnknown_0203925C ^= 0x02;
- DestroyVerticalScrollIndicator(0);
+ DestroyVerticalScrollIndicator(TOP_ARROW);
}
else
{
@@ -1296,7 +1296,7 @@ void sub_810EB90(u8 newPos, u8 maxItems)
else if (newPos + maxItems == gUnknown_0203925A)
{
gUnknown_0203925C ^= 0x01;
- DestroyVerticalScrollIndicator(1);
+ DestroyVerticalScrollIndicator(BOTTOM_ARROW);
}
}
@@ -1347,7 +1347,7 @@ void sub_810ECB0(void)
if (gUnknown_0203925C >> 1 != 1)
{
gUnknown_0203925C |= 0x2;
- CreateVerticalScrollIndicators(0, 0x24, 0x08);
+ CreateVerticalScrollIndicators(TOP_ARROW, 0x24, 0x08);
}
}
@@ -1356,7 +1356,7 @@ void sub_810ECD4(void)
if ((gUnknown_0203925C & 1) == 0)
{
gUnknown_0203925C |= 0x1;
- CreateVerticalScrollIndicators(1, 0x24, 0x48);
+ CreateVerticalScrollIndicators(BOTTOM_ARROW, 0x24, 0x48);
}
}
@@ -1428,11 +1428,11 @@ void sub_810EEDC(void)
{
if ((gUnknown_0203925C & 1) != 0)
{
- DestroyVerticalScrollIndicator(1);
+ DestroyVerticalScrollIndicator(BOTTOM_ARROW);
}
if ((gUnknown_0203925C >> 1) == 1)
{
- DestroyVerticalScrollIndicator(0);
+ DestroyVerticalScrollIndicator(TOP_ARROW);
}
BuyMenuFreeMemory();
}
@@ -1539,15 +1539,15 @@ void ShowGlassWorkshopMenu(void)
{
u8 i;
ScriptContext2_Enable();
- MenuDrawTextWindow(0, 0, 10, 11);
+ Menu_DrawStdWindowFrame(0, 0, 10, 11);
InitMenu(0, 1, 1, 5, 0, 9);
gUnknown_0203925C = 0;
- sub_80F944C();
+ ClearVerticalScrollIndicatorPalettes();
LoadScrollIndicatorPalette();
sub_810F2B4();
for (i=0; i<5; i++)
{
- MenuPrint(gUnknown_083F83C0[i], 1, 2 * i + 1);
+ Menu_PrintText(gUnknown_083F83C0[i], 1, 2 * i + 1);
}
gUnknown_0203925B = 0;
gUnknown_0203925A = ARRAY_COUNT(gUnknown_083F83C0);
@@ -1560,33 +1560,33 @@ void sub_810F118(u8 taskId)
if (gMain.newKeys == DPAD_UP && gUnknown_0203925B != 0)
{
gUnknown_0203925B--;
- prevCursorPos = GetMenuCursorPos();
- MoveMenuCursorNoWrap(-1);
+ prevCursorPos = Menu_GetCursorPos();
+ Menu_MoveCursorNoWrap(-1);
sub_810F1F4(prevCursorPos, DPAD_UP);
}
if (gMain.newKeys == DPAD_DOWN && gUnknown_0203925B != gUnknown_0203925A - 1)
{
gUnknown_0203925B++;
- prevCursorPos = GetMenuCursorPos();
- MoveMenuCursorNoWrap(1);
+ prevCursorPos = Menu_GetCursorPos();
+ Menu_MoveCursorNoWrap(1);
sub_810F1F4(prevCursorPos, DPAD_DOWN);
}
if (gMain.newKeys & A_BUTTON)
{
- HandleDestroyMenuCursors();
+ Menu_DestroyCursor();
gSpecialVar_Result = gUnknown_0203925B;
PlaySE(SE_SELECT);
sub_810EEDC();
- MenuZeroFillWindowRect(0, 0, 29, 12);
+ Menu_EraseWindowRect(0, 0, 29, 12);
sub_810EC9C(taskId);
}
if (gMain.newKeys & B_BUTTON)
{
- HandleDestroyMenuCursors();
+ Menu_DestroyCursor();
gSpecialVar_Result = 0x7f;
PlaySE(SE_SELECT);
sub_810EEDC();
- MenuZeroFillWindowRect(0, 0, 29, 12);
+ Menu_EraseWindowRect(0, 0, 29, 12);
sub_810EC9C(taskId);
}
}
@@ -1621,10 +1621,10 @@ bool8 sub_810F1F4(u8 prevCursorPos, u8 dpadInput)
if (flag)
{
GlassWorkshopUpdateScrollIndicators(newPos, 5);
- MenuFillWindowRectWithBlankTile(2, 1, 9, 10);
+ Menu_BlankWindowRect(2, 1, 9, 10);
for (i=0; i<5; newPos++, i++)
{
- MenuPrint(gUnknown_083F83C0[newPos], 1, 2 * i + 1);
+ Menu_PrintText(gUnknown_083F83C0[newPos], 1, 2 * i + 1);
}
}
return flag;
@@ -1683,7 +1683,7 @@ bool8 sub_810F1F4(u8 prevCursorPos, u8 dpadInput)
"\tmovs r1, 0x1\n"
"\tmovs r2, 0x9\n"
"\tmovs r3, 0xA\n"
- "\tbl MenuFillWindowRectWithBlankTile\n"
+ "\tbl Menu_BlankWindowRect\n"
"\tmovs r5, 0\n"
"\tldr r7, _0810F28C @ =gUnknown_083F83C0\n"
"_0810F25C:\n"
@@ -1695,7 +1695,7 @@ bool8 sub_810F1F4(u8 prevCursorPos, u8 dpadInput)
"\tlsls r2, 24\n"
"\tlsrs r2, 24\n"
"\tmovs r1, 0x1\n"
- "\tbl MenuPrint\n"
+ "\tbl Menu_PrintText\n"
"\tadds r0, r4, 0x1\n"
"\tlsls r0, 24\n"
"\tlsrs r4, r0, 24\n"
@@ -1721,7 +1721,7 @@ void sub_810F290(void)
if (gUnknown_0203925C >> 1 != 1)
{
gUnknown_0203925C |= 0x02;
- CreateVerticalScrollIndicators(0, 0x2c, 0x08);
+ CreateVerticalScrollIndicators(TOP_ARROW, 0x2c, 0x08);
}
}
@@ -1730,7 +1730,7 @@ void sub_810F2B4(void)
if (!(gUnknown_0203925C & 0x01))
{
gUnknown_0203925C |= 0x01;
- CreateVerticalScrollIndicators(1, 0x2c, 0x58);
+ CreateVerticalScrollIndicators(BOTTOM_ARROW, 0x2c, 0x58);
}
}
@@ -1739,7 +1739,7 @@ void GlassWorkshopUpdateScrollIndicators(u8 newPos, u8 maxItems)
if (newPos == 0)
{
gUnknown_0203925C ^= 0x02;
- DestroyVerticalScrollIndicator(0);
+ DestroyVerticalScrollIndicator(TOP_ARROW);
}
else
{
@@ -1752,7 +1752,7 @@ void GlassWorkshopUpdateScrollIndicators(u8 newPos, u8 maxItems)
else if (newPos + maxItems == gUnknown_0203925A)
{
gUnknown_0203925C ^= 0x01;
- DestroyVerticalScrollIndicator(1);
+ DestroyVerticalScrollIndicator(BOTTOM_ARROW);
}
}
diff --git a/src/field/field_weather.c b/src/field/field_weather.c
index 4a819bddf..fbc5431ae 100644
--- a/src/field/field_weather.c
+++ b/src/field/field_weather.c
@@ -13,7 +13,13 @@
#include "trig.h"
#include "ewram.h"
-#define MACRO1(a) ((((a) >> 1) & 0xF) | (((a) >> 2) & 0xF0) | (((a) >> 3) & 0xF00))
+#define MACRO1(color) ((((color) >> 1) & 0xF) | (((color) >> 2) & 0xF0) | (((color) >> 3) & 0xF00))
+
+enum {
+ GAMMA_NONE,
+ GAMMA_NORMAL,
+ GAMMA_ALT,
+};
struct RGBColor
{
@@ -24,7 +30,7 @@ struct RGBColor
struct WeatherPaletteData
{
- u16 data[0][0x1000]; // unknown length
+ u16 gammaShiftColors[8][0x1000]; // 0x1000 is the number of bytes that make up all palettes.
};
struct WeatherCallbacks
@@ -35,10 +41,14 @@ struct WeatherCallbacks
bool8 (*finish)(void);
};
-extern struct Weather gWeather;
-extern u8 gUnknown_0202FF38[];
-extern u16 gUnknown_0202FF58;
-IWRAM_DATA const u8 *gUnknown_030006DC;
+EWRAM_DATA struct Weather gWeather = {0};
+EWRAM_DATA u8 gFieldEffectPaletteGammaTypes[32] = {0};
+EWRAM_DATA u16 gUnknown_0202FF58 = 0;
+#if DEBUG
+EWRAM_DATA u16 gUnknown_Debug_20301FE = 0;
+#endif
+
+static const u8 *sPaletteGammaTypes;
const u8 DroughtPaletteData_0[] = INCBIN_U8("graphics/weather/drought0.bin.lz");
const u8 DroughtPaletteData_1[] = INCBIN_U8("graphics/weather/drought1.bin.lz");
@@ -46,8 +56,6 @@ const u8 DroughtPaletteData_2[] = INCBIN_U8("graphics/weather/drought2.bin.lz");
const u8 DroughtPaletteData_3[] = INCBIN_U8("graphics/weather/drought3.bin.lz");
const u8 DroughtPaletteData_4[] = INCBIN_U8("graphics/weather/drought4.bin.lz");
const u8 DroughtPaletteData_5[] = INCBIN_U8("graphics/weather/drought5.bin.lz");
-extern u8 (*gUnknown_0202FC48)[32];
-extern u8 gUnknown_0202F9E8[32];
static const u8 *const sCompressedDroughtPalettes[] =
{
@@ -57,7 +65,7 @@ static const u8 *const sCompressedDroughtPalettes[] =
DroughtPaletteData_3,
DroughtPaletteData_4,
DroughtPaletteData_5,
- gSharedMem,
+ (u8*)eDroughtPaletteData.gammaShiftColors,
};
// This is a pointer to gWeather. All code in this file accesses gWeather directly,
@@ -66,6 +74,18 @@ static const u8 *const sCompressedDroughtPalettes[] =
// this file produces the same result as accessing gWeather directly.
struct Weather *const gWeatherPtr = &gWeather;
+static bool8 LightenSpritePaletteInFog(u8);
+static void BuildGammaShiftTables(void);
+static void UpdateWeatherGammaShift(void);
+static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex);
+static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor);
+static void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor);
+static void ApplyFogBlend(u8 blendCoeff, u16 blendColor);
+static bool8 FadeInScreen_RainShowShade(void);
+static bool8 FadeInScreen_Drought(void);
+static bool8 FadeInScreen_Fog1(void);
+static void FadeInScreenWithWeather(void);
+static void DoNothing(void);
void None_Init(void);
void None_Main(void);
bool8 None_Finish(void);
@@ -109,10 +129,10 @@ void Fog1_InitVars(void);
void Fog1_Main(void);
void Fog1_InitAll(void);
bool8 Fog1_Finish(void);
-void Weather11_InitVars(void);
-void Weather11_Main(void);
-void Weather11_InitAll(void);
-bool8 Weather11_Finish(void);
+void Shade_InitVars(void);
+void Shade_Main(void);
+void Shade_InitAll(void);
+bool8 Shade_Finish(void);
void Drought_InitVars(void);
void Drought_Main(void);
void Drought_InitAll(void);
@@ -131,7 +151,7 @@ static const struct WeatherCallbacks sWeatherFuncs[] =
{None_Init, None_Main, None_Init, None_Finish},
{Clouds_InitVars, Clouds_Main, Clouds_InitAll, Clouds_Finish},
{Weather2_InitVars, Weather2_Main, Weather2_InitAll, Weather2_Finish},
- {LightRain_InitVars, LightRain_Main, LightRain_InitAll, LightRain_Finish}, // light rain
+ {LightRain_InitVars, LightRain_Main, LightRain_InitAll, LightRain_Finish},
{Snow_InitVars, Snow_Main, Snow_InitAll, Snow_Finish},
{MedRain_InitVars, Rain_Main, MedRain_InitAll, Rain_Finish},
{Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish},
@@ -139,68 +159,112 @@ static const struct WeatherCallbacks sWeatherFuncs[] =
{Sandstorm_InitVars, Sandstorm_Main, Sandstorm_InitAll, Sandstorm_Finish},
{Fog2_InitVars, Fog2_Main, Fog2_InitAll, Fog2_Finish},
{Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish},
- {Weather11_InitVars, Weather11_Main, Weather11_InitAll, Weather11_Finish},
+ {Shade_InitVars, Shade_Main, Shade_InitAll, Shade_Finish},
{Drought_InitVars, Drought_Main, Drought_InitAll, Drought_Finish},
{HeavyRain_InitVars, Rain_Main, HeavyRain_InitAll, Rain_Finish},
{Bubbles_InitVars, Bubbles_Main, Bubbles_InitAll, Bubbles_Finish},
};
-void (*const gUnknown_083970B8[])(void) =
+void (*const gWeatherPalStateFuncs[])(void) =
{
- sub_807CC24,
- sub_807CCAC,
- nullsub_39,
- nullsub_39,
+ UpdateWeatherGammaShift, // WEATHER_PAL_STATE_CHANGING_WEATHER
+ FadeInScreenWithWeather, // WEATHER_PAL_STATE_SCREEN_FADING_IN
+ DoNothing, // WEATHER_PAL_STATE_SCREEN_FADING_OUT
+ DoNothing, // WEATHER_PAL_STATE_IDLE
};
-const u8 gUnknown_083970C8[] =
+// This table specifies which of the gamma shift tables should be
+// applied to each of the background and sprite palettes.
+static const u8 sBasePaletteGammaTypes[32] =
{
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 0,
- 2,
- 1,
- 2,
- 2,
- 2,
- 2,
- 1,
- 1,
- 1,
- 1,
- 2,
- 1,
- 1,
- 1,
- 1,
- 1,
+ // background palettes
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NONE,
+ GAMMA_NONE,
+ // sprite palettes
+ GAMMA_ALT,
+ GAMMA_NORMAL,
+ GAMMA_ALT,
+ GAMMA_ALT,
+ GAMMA_ALT,
+ GAMMA_ALT,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_ALT,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
};
+#if DEBUG
+
+const u8 gDebugText_Weather_0[] = _("なし   ");
+const u8 gDebugText_Weather_1[] = _("はれ   ");
+const u8 gDebugText_Weather_2[] = _("はれ2  ");
+const u8 gDebugText_Weather_3[] = _("あめ   ");
+const u8 gDebugText_Weather_4[] = _("ゆき   ");
+const u8 gDebugText_Weather_5[] = _("かみなり ");
+const u8 gDebugText_Weather_6[] = _("きり   ");
+const u8 gDebugText_Weather_7[] = _("かざんばい");
+const u8 gDebugText_Weather_8[] = _("すなあらし");
+const u8 gDebugText_Weather_9[] = _("きり2  ");
+const u8 gDebugText_Weather_10[] = _("かいてい ");
+const u8 gDebugText_Weather_11[] = _("くもり  ");
+const u8 gDebugText_Weather_12[] = _("はれ3  ");
+const u8 gDebugText_Weather_13[] = _("おおあめ");
+const u8 gDebugText_Weather_14[] = _("かいてい2");
+
+const u8 *const gDebugText_Weather[] =
+{
+ gDebugText_Weather_0,
+ gDebugText_Weather_1,
+ gDebugText_Weather_2,
+ gDebugText_Weather_3,
+ gDebugText_Weather_4,
+ gDebugText_Weather_5,
+ gDebugText_Weather_6,
+ gDebugText_Weather_7,
+ gDebugText_Weather_8,
+ gDebugText_Weather_9,
+ gDebugText_Weather_10,
+ gDebugText_Weather_11,
+ gDebugText_Weather_12,
+ gDebugText_Weather_13,
+ gDebugText_Weather_14,
+};
+
+#endif
+
const u16 gUnknown_083970E8[] = INCBIN_U16("graphics/weather/0.gbapal");
void StartWeather(void)
{
u8 index;
+
if (!FuncIsActiveTask(Task_WeatherMain))
{
index = AllocSpritePalette(0x1200);
CpuCopy32(gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32);
- sub_807CB10();
- gWeatherPtr->unknown_6D5 = index;
- gWeatherPtr->unknown_6D4 = AllocSpritePalette(0x1201);
+ BuildGammaShiftTables();
+ gWeatherPtr->altGammaSpritePalIndex = index;
+ gWeatherPtr->weatherPicSpritePalIndex = AllocSpritePalette(0x1201);
gWeatherPtr->rainSpriteCount = 0;
gWeatherPtr->unknown_6D8 = 0;
gWeatherPtr->cloudSpritesCreated = 0;
@@ -211,49 +275,53 @@ void StartWeather(void)
gWeatherPtr->sandstormSprites1Created = 0;
gWeatherPtr->sandstormSprites2Created = 0;
gWeatherPtr->unknown_72E = 0;
- gWeatherPtr->unknown_6FA = 0;
+ gWeatherPtr->lightenedFogSpritePalsCount = 0;
Weather_SetBlendCoeffs(16, 0);
gWeatherPtr->currWeather = 0;
- gWeatherPtr->unknown_6C6 = 3;
- gWeatherPtr->unknown_6C8 = 0;
- gWeatherPtr->unknown_6D3 = 1;
- gWeatherPtr->unknown_6C9 = CreateTask(Task_WeatherInit, 80);
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;
+ gWeatherPtr->readyForInit = FALSE;
+ gWeatherPtr->weatherChangeComplete = TRUE;
+ gWeatherPtr->taskId = CreateTask(Task_WeatherInit, 80);
}
}
-void DoWeatherEffect(u8 effect)
+void ChangeWeather(u8 weather)
{
- if (effect != WEATHER_RAIN_LIGHT && effect != WEATHER_RAIN_MED && effect != WEATHER_RAIN_HEAVY)
+ if (weather != WEATHER_RAIN_LIGHT && weather != WEATHER_RAIN_MED && weather != WEATHER_RAIN_HEAVY)
{
PlayRainSoundEffect();
}
- if (gWeatherPtr->nextWeather != effect && gWeatherPtr->currWeather == effect)
+
+ if (gWeatherPtr->nextWeather != weather && gWeatherPtr->currWeather == weather)
{
- sWeatherFuncs[effect].initVars();
+ sWeatherFuncs[weather].initVars();
}
- gWeatherPtr->unknown_6D3 = 0;
- gWeatherPtr->nextWeather = effect;
+
+ gWeatherPtr->weatherChangeComplete = FALSE;
+ gWeatherPtr->nextWeather = weather;
gWeatherPtr->finishStep = 0;
}
-void sub_807C988(u8 effect)
+void sub_807C988(u8 weather)
{
PlayRainSoundEffect();
- gWeatherPtr->currWeather = effect;
- gWeatherPtr->nextWeather = effect;
+ gWeatherPtr->currWeather = weather;
+ gWeatherPtr->nextWeather = weather;
}
-void sub_807C9B4(u8 effect)
+void sub_807C9B4(u8 weather)
{
PlayRainSoundEffect();
- gWeatherPtr->currWeather = effect;
- gWeatherPtr->nextWeather = effect;
- gWeatherPtr->unknown_6C8 = 1;
+ gWeatherPtr->currWeather = weather;
+ gWeatherPtr->nextWeather = weather;
+ gWeatherPtr->readyForInit = TRUE;
}
void Task_WeatherInit(u8 taskId)
{
- if (gWeatherPtr->unknown_6C8)
+ // Waits until it's ok to initialize weather.
+ // When the screen fades in, this is set to TRUE.
+ if (gWeatherPtr->readyForInit)
{
sWeatherFuncs[gWeatherPtr->currWeather].initAll();
gTasks[taskId].func = Task_WeatherMain;
@@ -266,24 +334,26 @@ void Task_WeatherMain(u8 taskId)
{
if (!sWeatherFuncs[gWeatherPtr->currWeather].finish())
{
+ // Finished cleaning up previous weather. Now transition to next weather.
sWeatherFuncs[gWeatherPtr->nextWeather].initVars();
- gWeatherPtr->unknown_6C3 = 0;
- gWeatherPtr->unknown_6C6 = 0;
+ gWeatherPtr->gammaStepFrameCounter = 0;
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER;
gWeatherPtr->currWeather = gWeatherPtr->nextWeather;
- gWeatherPtr->unknown_6D3 = 1;
+ gWeatherPtr->weatherChangeComplete = TRUE;
}
}
else
{
sWeatherFuncs[gWeatherPtr->currWeather].main();
}
- gUnknown_083970B8[gWeatherPtr->unknown_6C6]();
+
+ gWeatherPalStateFuncs[gWeatherPtr->palProcessingState]();
}
void None_Init(void)
{
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 0;
+ gWeatherPtr->gammaTargetIndex = 0;
+ gWeatherPtr->gammaStepDelay = 0;
}
void None_Main(void)
@@ -295,7 +365,10 @@ u8 None_Finish(void)
return 0;
}
-void sub_807CB10(void)
+// Builds two tables that contain gamma shifts for palette colors.
+// It's unclear why the two tables aren't declared as const arrays, since
+// this function always builds the same two tables.
+static void BuildGammaShiftTables(void)
{
u16 v0;
u8 (*v1)[32];
@@ -308,15 +381,15 @@ void sub_807CB10(void)
u16 v11;
s16 dunno;
- gUnknown_030006DC = gUnknown_083970C8;
+ sPaletteGammaTypes = sBasePaletteGammaTypes;
for (v0 = 0; v0 <= 1; v0++)
{
if (v0 == 0)
- v1 = gWeatherPtr->unknown_200;
+ v1 = gWeatherPtr->gammaShifts;
else
- v1 = gWeatherPtr->unk460;
+ v1 = gWeatherPtr->altGammaShifts;
- for (v2 = 0; (u16)v2 <= 0x1f; v2++)
+ for (v2 = 0; v2 < 32; v2++)
{
v4 = v2 << 8;
if (v0 == 0)
@@ -335,88 +408,86 @@ void sub_807CB10(void)
v10 += 0xf;
}
v11 = v10 >> 4;
- if (v2 <= 0xb)
+ if (v2 < 12)
{
- for (; v6 <= 0x12; v6++)
+ for (; v6 < 19; v6++)
{
v4 += v11;
dunno = v4 - v9;
if (dunno > 0)
- {
v4 -= (dunno + ((u16)dunno >> 15)) >> 1;
- }
v1[v6][v2] = v4 >> 8;
if (v1[v6][v2] > 0x1f)
- {
v1[v6][v2] = 0x1f;
- }
}
}
else
{
- for (; v6 <= 0x12; v6++)
+ for (; v6 < 19; v6++)
{
v4 += v11;
v1[v6][v2] = v4 >> 8;
if (v1[v6][v2] > 0x1f)
- {
v1[v6][v2] = 0x1f;
- }
}
}
}
}
}
-void sub_807CC24(void)
+// When the weather is changing, it gradually updates the palettes
+// towards the desired gamma shift.
+static void UpdateWeatherGammaShift(void)
{
- if (gWeatherPtr->unknown_6C0 == gWeatherPtr->unknown_6C1)
+ if (gWeatherPtr->gammaIndex == gWeatherPtr->gammaTargetIndex)
{
- gWeatherPtr->unknown_6C6 = 3;
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;
}
else
{
- if (++gWeatherPtr->unknown_6C3 >= gWeatherPtr->unknown_6C2)
+ if (++gWeatherPtr->gammaStepFrameCounter >= gWeatherPtr->gammaStepDelay)
{
- gWeatherPtr->unknown_6C3 = 0;
- if (gWeatherPtr->unknown_6C0 < gWeatherPtr->unknown_6C1)
- gWeatherPtr->unknown_6C0++;
+ gWeatherPtr->gammaStepFrameCounter = 0;
+ if (gWeatherPtr->gammaIndex < gWeatherPtr->gammaTargetIndex)
+ gWeatherPtr->gammaIndex++;
else
- gWeatherPtr->unknown_6C0--;
- sub_807CEBC(0, 0x20, gWeatherPtr->unknown_6C0);
+ gWeatherPtr->gammaIndex--;
+
+ ApplyGammaShift(0, 32, gWeatherPtr->gammaIndex);
}
}
}
-void sub_807CCAC(void)
+static void FadeInScreenWithWeather(void)
{
if (++gWeatherPtr->unknown_6CB > 1)
gWeatherPtr->unknown_6CA = 0;
+
switch (gWeatherPtr->currWeather)
{
case WEATHER_RAIN_LIGHT:
case WEATHER_RAIN_MED:
case WEATHER_RAIN_HEAVY:
case WEATHER_SNOW:
- case WEATHER_DARK:
- if (sub_807CDC4() == 0)
+ case WEATHER_SHADE:
+ if (FadeInScreen_RainShowShade() == FALSE)
{
- gWeatherPtr->unknown_6C0 = 3;
- gWeatherPtr->unknown_6C6 = 3;
+ gWeatherPtr->gammaIndex = 3;
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;
}
break;
case WEATHER_DROUGHT:
- if (sub_807CE24() == 0)
+ if (FadeInScreen_Drought() == FALSE)
{
- gWeatherPtr->unknown_6C0 = -6;
- gWeatherPtr->unknown_6C6 = 3;
+ gWeatherPtr->gammaIndex = -6;
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;
}
break;
case WEATHER_FOG_1:
- if (sub_807CE7C() == 0)
+ if (FadeInScreen_Fog1() == FALSE)
{
- gWeatherPtr->unknown_6C0 = 0;
- gWeatherPtr->unknown_6C6 = 3;
+ gWeatherPtr->gammaIndex = 0;
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;
}
break;
case WEATHER_ASH:
@@ -426,71 +497,78 @@ void sub_807CCAC(void)
default:
if (!gPaletteFade.active)
{
- gWeatherPtr->unknown_6C0 = gWeatherPtr->unknown_6C1;
- gWeatherPtr->unknown_6C6 = 3;
+ gWeatherPtr->gammaIndex = gWeatherPtr->gammaTargetIndex;
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;
}
break;
}
}
-u8 sub_807CDC4(void)
+bool8 FadeInScreen_RainShowShade(void)
{
- if (gWeatherPtr->unknown_6C7 == 0x10)
- return 0;
- if (++gWeatherPtr->unknown_6C7 >= 0x10)
+ if (gWeatherPtr->fadeScreenCounter == 16)
+ return FALSE;
+
+ if (++gWeatherPtr->fadeScreenCounter >= 16)
{
- sub_807CEBC(0, 0x20, 3);
- gWeatherPtr->unknown_6C7 = 0x10;
- return 0;
+ ApplyGammaShift(0, 32, 3);
+ gWeatherPtr->fadeScreenCounter = 16;
+ return FALSE;
}
- sub_807D1BC(0, 0x20, 3, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4);
- return 1;
+
+ ApplyGammaShiftWithBlend(0, 32, 3, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor);
+ return TRUE;
}
-u8 sub_807CE24(void)
+bool8 FadeInScreen_Drought(void)
{
- if (gWeatherPtr->unknown_6C7 == 0x10)
- return 0;
- if (++gWeatherPtr->unknown_6C7 >= 0x10)
+ if (gWeatherPtr->fadeScreenCounter == 16)
+ return FALSE;
+
+ if (++gWeatherPtr->fadeScreenCounter >= 16)
{
- sub_807CEBC(0, 0x20, -6);
- gWeatherPtr->unknown_6C7 = 0x10;
- return 0;
+ ApplyGammaShift(0, 32, -6);
+ gWeatherPtr->fadeScreenCounter = 16;
+ return FALSE;
}
- sub_807D304(-6, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4);
- return 1;
-}
-u8 sub_807CE7C(void)
-{
- if (gWeatherPtr->unknown_6C7 == 0x10)
- return 0;
- ++gWeatherPtr->unknown_6C7;
- sub_807D424(0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4);
- return 1;
+ ApplyDroughtGammaShiftWithBlend(-6, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor);
+ return TRUE;
}
-void nullsub_39(void)
+bool8 FadeInScreen_Fog1(void)
{
+ if (gWeatherPtr->fadeScreenCounter == 16)
+ return FALSE;
+
+ gWeatherPtr->fadeScreenCounter++;
+ ApplyFogBlend(16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor);
+ return TRUE;
}
-void sub_807CEBC(u8 a, u8 b, s8 c)
+static void DoNothing(void)
+{ }
+
+static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex)
{
- u16 r4;
+ u16 curPalIndex;
u16 palOffset;
- u8 *r6;
+ u8 *gammaTable;
u16 i;
- if (c > 0)
+ if (gammaIndex > 0)
{
- c = c - 1;
- palOffset = a * 16;
- b += a;
- r4 = a;
- while (r4 < b)
+ gammaIndex--;
+ palOffset = startPalIndex * 16;
+ numPalettes += startPalIndex;
+ curPalIndex = startPalIndex;
+
+ // Loop through the speficied palette range and apply necessary gamma shifts to the colors.
+ while (curPalIndex < numPalettes)
{
- if (gUnknown_030006DC[r4] == 0)
+ if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE)
{
+ // No palette change.
CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16));
palOffset += 16;
}
@@ -498,25 +576,27 @@ void sub_807CEBC(u8 a, u8 b, s8 c)
{
u8 r, g, b;
- if (gUnknown_030006DC[r4] == 2 || r4 - 16 == gWeatherPtr->unknown_6D5)
- r6 = gWeatherPtr->unk460[c];
+ if (sPaletteGammaTypes[curPalIndex] == GAMMA_ALT || curPalIndex - 16 == gWeatherPtr->altGammaSpritePalIndex)
+ gammaTable = gWeatherPtr->altGammaShifts[gammaIndex];
else
- r6 = gWeatherPtr->unknown_200[c];
- if (r4 == 16 || r4 > 0x1B)
+ gammaTable = gWeatherPtr->gammaShifts[gammaIndex];
+
+ if (curPalIndex == 16 || curPalIndex > 27)
{
for (i = 0; i < 16; i++)
{
- if (gPlttBufferUnfaded[palOffset] == 0x2D9F)
+ if (gPlttBufferUnfaded[palOffset] == RGB(31, 12, 11))
{
+ // Skip gamma shift for this specific color. (Why?)
palOffset++;
}
else
{
- struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
-
- r = r6[color.r];
- g = r6[color.g];
- b = r6[color.b];
+ // Apply gamma shift to the original color.
+ struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
+ r = gammaTable[baseColor.r];
+ g = gammaTable[baseColor.g];
+ b = gammaTable[baseColor.b];
gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r;
}
}
@@ -525,39 +605,45 @@ void sub_807CEBC(u8 a, u8 b, s8 c)
{
for (i = 0; i < 16; i++)
{
- struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
-
- r = r6[color.r];
- g = r6[color.g];
- b = r6[color.b];
+ // Apply gamma shift to the original color.
+ struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
+ r = gammaTable[baseColor.r];
+ g = gammaTable[baseColor.g];
+ b = gammaTable[baseColor.b];
gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r;
}
}
}
- r4++;
+
+ curPalIndex++;
}
}
- else if (c < 0)
+ else if (gammaIndex < 0)
{
- c = -c - 1;
- palOffset = a * 16;
- b += a;
- r4 = a;
- while (r4 < b)
+ // A negative gammIndex value means that the blending will come from the special Drought weather's palette tables.
+ gammaIndex = -gammaIndex - 1;
+ palOffset = startPalIndex * 16;
+ numPalettes += startPalIndex;
+ curPalIndex = startPalIndex;
+
+ while (curPalIndex < numPalettes)
{
- if (gUnknown_030006DC[r4] == 0)
+ if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE)
{
+ // No palette change.
CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16));
palOffset += 16;
}
else
{
- if (r4 == 16 || r4 > 0x1B)
+ if (curPalIndex == 16 || curPalIndex > 27)
{
for (i = 0; i < 16; i++)
{
- if (gPlttBufferUnfaded[palOffset] != 0x2D9F)
- gPlttBufferFaded[palOffset] = eWeatherPaletteData.data[c][MACRO1(gPlttBufferUnfaded[palOffset])];
+ // Skip gamma shift for this specific color. (Why?)
+ if (gPlttBufferUnfaded[palOffset] != RGB(31, 12, 11))
+ gPlttBufferFaded[palOffset] = eDroughtPaletteData.gammaShiftColors[gammaIndex][MACRO1(gPlttBufferUnfaded[palOffset])];
+
palOffset++;
}
}
@@ -565,93 +651,100 @@ void sub_807CEBC(u8 a, u8 b, s8 c)
{
for (i = 0; i < 16; i++)
{
- gPlttBufferFaded[palOffset] = eWeatherPaletteData.data[c][MACRO1(gPlttBufferUnfaded[palOffset])];
+ gPlttBufferFaded[palOffset] = eDroughtPaletteData.gammaShiftColors[gammaIndex][MACRO1(gPlttBufferUnfaded[palOffset])];
palOffset++;
}
}
}
- r4++;
+
+ curPalIndex++;
}
}
else
{
- CpuFastCopy(gPlttBufferUnfaded + a * 16, gPlttBufferFaded + a * 16, b * 16 * sizeof(u16));
+ // No palette blending.
+ CpuFastCopy(gPlttBufferUnfaded + startPalIndex * 16, gPlttBufferFaded + startPalIndex * 16, numPalettes * 16 * sizeof(u16));
}
}
-void sub_807D1BC(u8 a1, u8 a2, s8 c, u8 d, u16 e)
+static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor)
{
u16 palOffset;
- u16 r4;
+ u16 curPalIndex;
u16 i;
- struct RGBColor color = *(struct RGBColor *)&e;
- u8 r_ = color.r;
- u8 g_ = color.g;
- u8 b_ = color.b;
-
- palOffset = a1 * 16;
- a2 += a1;
- c = c - 1;
- r4 = a1;
- while (r4 < a2)
+ struct RGBColor color = *(struct RGBColor *)&blendColor;
+ u8 rBlend = color.r;
+ u8 gBlend = color.g;
+ u8 bBlend = color.b;
+
+ palOffset = startPalIndex * 16;
+ numPalettes += startPalIndex;
+ gammaIndex--;
+ curPalIndex = startPalIndex;
+
+ while (curPalIndex < numPalettes)
{
- if (gUnknown_030006DC[r4] == 0)
+ if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE)
{
- BlendPalette(palOffset, 16, d, e);
+ // No gamma shift. Simply blend the colors.
+ BlendPalette(palOffset, 16, blendCoeff, blendColor);
palOffset += 16;
}
else
{
- u8 *r5;
+ u8 *gammaTable;
- if (gUnknown_030006DC[r4] == 1)
- r5 = gWeatherPtr->unknown_200[c];
+ if (sPaletteGammaTypes[curPalIndex] == GAMMA_NORMAL)
+ gammaTable = gWeatherPtr->gammaShifts[gammaIndex];
else
- r5 = gWeatherPtr->unk460[c];
+ gammaTable = gWeatherPtr->altGammaShifts[gammaIndex];
for (i = 0; i < 16; i++)
{
- struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
- u8 r = r5[color.r];
- u8 g = r5[color.g];
- u8 b = r5[color.b];
-
- r += ((r_ - r) * d) >> 4;
- g += ((g_ - g) * d) >> 4;
- b += ((b_ - b) * d) >> 4;
+ struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
+ u8 r = gammaTable[baseColor.r];
+ u8 g = gammaTable[baseColor.g];
+ u8 b = gammaTable[baseColor.b];
+
+ // Apply gamma shift and target blend color to the original color.
+ r += ((rBlend - r) * blendCoeff) >> 4;
+ g += ((gBlend - g) * blendCoeff) >> 4;
+ b += ((bBlend - b) * blendCoeff) >> 4;
gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r;
}
}
- r4++;
+
+ curPalIndex++;
}
}
-void sub_807D304(s8 a, u8 coeff, u16 c)
+void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor)
{
struct RGBColor color;
- u8 r_;
- u8 g_;
- u8 b_;
- u16 r4;
+ u8 rBlend;
+ u8 gBlend;
+ u8 bBlend;
+ u16 curPalIndex;
u16 palOffset;
- u16 r12;
+ u16 i;
- a = -a - 1;
- color = *(struct RGBColor *)&c;
- r_ = color.r;
- g_ = color.g;
- b_ = color.b;
+ gammaIndex = -gammaIndex - 1;
+ color = *(struct RGBColor *)&blendColor;
+ rBlend = color.r;
+ gBlend = color.g;
+ bBlend = color.b;
palOffset = 0;
- for (r4 = 0; r4 < 32; r4++)
+ for (curPalIndex = 0; curPalIndex < 32; curPalIndex++)
{
- if (gUnknown_030006DC[r4] == 0)
+ if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE)
{
- BlendPalette(palOffset, 16, coeff, c);
+ // No gamma shift. Simply blend the colors.
+ BlendPalette(palOffset, 16, blendCoeff, blendColor);
palOffset += 16;
}
else
{
- for (r12 = 0; r12 < 16; r12++)
+ for (i = 0; i < 16; i++)
{
u32 offset;
struct RGBColor color1;
@@ -665,14 +758,14 @@ void sub_807D304(s8 a, u8 coeff, u16 c)
b1 = color1.b;
offset = ((b1 & 0x1E) << 7) | ((g1 & 0x1E) << 3) | ((r1 & 0x1E) >> 1);
- color2 = *(struct RGBColor *)&eWeatherPaletteData.data[a][offset];
+ color2 = *(struct RGBColor *)&eDroughtPaletteData.gammaShiftColors[gammaIndex][offset];
r2 = color2.r;
g2 = color2.g;
b2 = color2.b;
- r2 += ((r_ - r2) * coeff) >> 4;
- g2 += ((g_ - g2) * coeff) >> 4;
- b2 += ((b_ - b2) * coeff) >> 4;
+ r2 += ((rBlend - r2) * blendCoeff) >> 4;
+ g2 += ((gBlend - g2) * blendCoeff) >> 4;
+ b2 += ((bBlend - b2) * blendCoeff) >> 4;
gPlttBufferFaded[palOffset++] = (b2 << 10) | (g2 << 5) | r2;
}
@@ -680,33 +773,30 @@ void sub_807D304(s8 a, u8 coeff, u16 c)
}
}
-bool8 sub_807D574(u8);
-
-void sub_807D424(u8 a, u16 b)
+void ApplyFogBlend(u8 blendCoeff, u16 blendColor)
{
struct RGBColor color;
- u8 r_;
- u8 g_;
- u8 b_;
- u16 r4;
-
- BlendPalette(0, 0x100, a, b);
- color = *(struct RGBColor *)&b;
- r_ = color.r;
- g_ = color.g;
- b_ = color.b;
-
- r4 = 16;
- while (r4 < 32)
+ u8 rBlend;
+ u8 gBlend;
+ u8 bBlend;
+ u16 curPalIndex;
+
+ BlendPalette(0, 0x100, blendCoeff, blendColor);
+ color = *(struct RGBColor *)&blendColor;
+ rBlend = color.r;
+ gBlend = color.g;
+ bBlend = color.b;
+
+ for (curPalIndex = 16; curPalIndex < 32; curPalIndex++)
{
- if (sub_807D574(r4))
+ if (LightenSpritePaletteInFog(curPalIndex))
{
- u16 r12 = (r4 + 1) * 16;
- u16 r6 = r4 * 16;
+ u16 palEnd = (curPalIndex + 1) * 16;
+ u16 palOffset = curPalIndex * 16;
- while (r6 < r12)
+ while (palOffset < palEnd)
{
- struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[r6];
+ struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
u8 r = color.r;
u8 g = color.g;
u8 b = color.b;
@@ -715,88 +805,88 @@ void sub_807D424(u8 a, u16 b)
g += ((31 - g) * 3) >> 2;
b += ((28 - b) * 3) >> 2;
- r += ((r_ - r) * a) >> 4;
- g += ((g_ - g) * a) >> 4;
- b += ((b_ - b) * a) >> 4;
+ r += ((rBlend - r) * blendCoeff) >> 4;
+ g += ((gBlend - g) * blendCoeff) >> 4;
+ b += ((bBlend - b) * blendCoeff) >> 4;
- gPlttBufferFaded[r6] = (b << 10) | (g << 5) | r;
- r6++;
+ gPlttBufferFaded[palOffset] = (b << 10) | (g << 5) | r;
+ palOffset++;
}
}
else
{
- BlendPalette(r4 * 16, 16, a, b);
+ BlendPalette(curPalIndex * 16, 16, blendCoeff, blendColor);
}
- r4++;
}
}
-void sub_807D540(u8 a)
+static void MarkFogSpritePalToLighten(u8 paletteIndex)
{
- if (gWeatherPtr->unknown_6FA < 6)
+ if (gWeatherPtr->lightenedFogSpritePalsCount < 6)
{
- gWeatherPtr->unknown_6F4[gWeatherPtr->unknown_6FA] = a;
- gWeatherPtr->unknown_6FA++;
+ gWeatherPtr->lightenedFogSpritePals[gWeatherPtr->lightenedFogSpritePalsCount] = paletteIndex;
+ gWeatherPtr->lightenedFogSpritePalsCount++;
}
}
-bool8 sub_807D574(u8 a)
+static bool8 LightenSpritePaletteInFog(u8 paletteIndex)
{
u16 i;
- for (i = 0; i < gWeatherPtr->unknown_6FA; i++)
+ for (i = 0; i < gWeatherPtr->lightenedFogSpritePalsCount; i++)
{
- if (gWeatherPtr->unknown_6F4[i] == a)
+ if (gWeatherPtr->lightenedFogSpritePals[i] == paletteIndex)
return TRUE;
}
+
return FALSE;
}
-void sub_807D5BC(s8 a)
+void sub_807D5BC(s8 gammaIndex)
{
- if (gWeatherPtr->unknown_6C6 == 3)
+ if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE)
{
- sub_807CEBC(0, 32, a);
- gWeatherPtr->unknown_6C0 = a;
+ ApplyGammaShift(0, 32, gammaIndex);
+ gWeatherPtr->gammaIndex = gammaIndex;
}
}
-void sub_807D5F0(u8 a, u8 b, u8 c)
+void sub_807D5F0(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay)
{
- if (gWeatherPtr->unknown_6C6 == 3)
+ if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE)
{
- gWeatherPtr->unknown_6C6 = 0;
- gWeatherPtr->unknown_6C0 = a;
- gWeatherPtr->unknown_6C1 = b;
- gWeatherPtr->unknown_6C3 = 0;
- gWeatherPtr->unknown_6C2 = c;
- sub_807D5BC(a);
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER;
+ gWeatherPtr->gammaIndex = gammaIndex;
+ gWeatherPtr->gammaTargetIndex = gammaTargetIndex;
+ gWeatherPtr->gammaStepFrameCounter = 0;
+ gWeatherPtr->gammaStepDelay = gammaStepDelay;
+ sub_807D5BC(gammaIndex);
}
}
-void fade_screen(u8 a, u8 delay)
+void FadeScreen(u8 mode, u8 delay)
{
u32 fadeColor;
- u32 r1;
- u32 r2;
+ bool8 fadeOut;
+ bool8 useWeatherPal;
- switch (a)
+ switch (mode)
{
- case 0:
+ case FADE_FROM_BLACK:
fadeColor = 0;
- r1 = 0;
+ fadeOut = FALSE;
break;
- case 2:
+ case FADE_FROM_WHITE:
fadeColor = 0xFFFF;
- r1 = 0;
+ fadeOut = FALSE;
break;
- case 1:
+ case FADE_TO_BLACK:
fadeColor = 0;
- r1 = 1;
+ fadeOut = TRUE;
break;
- case 3:
+ case FADE_TO_WHITE:
fadeColor = 0xFFFF;
- r1 = 1;
+ fadeOut = TRUE;
break;
default:
return;
@@ -809,145 +899,149 @@ void fade_screen(u8 a, u8 delay)
case WEATHER_RAIN_HEAVY:
case WEATHER_SNOW:
case WEATHER_FOG_1:
- case WEATHER_DARK:
+ case WEATHER_SHADE:
case WEATHER_DROUGHT:
- r2 = 1;
+ useWeatherPal = TRUE;
break;
default:
- r2 = 0;
+ useWeatherPal = FALSE;
break;
}
- if (r1 != 0)
+ if (fadeOut)
{
- if (r2 != 0)
+ if (useWeatherPal)
CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400);
+
BeginNormalPaletteFade(0xFFFFFFFF, delay, 0, 16, fadeColor);
- gWeatherPtr->unknown_6C6 = 2;
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT;
}
else
{
- gWeatherPtr->unknown_6C4 = fadeColor;
- if (r2 != 0)
- gWeatherPtr->unknown_6C7 = 0;
+ gWeatherPtr->fadeDestColor = fadeColor;
+ if (useWeatherPal)
+ gWeatherPtr->fadeScreenCounter = 0;
else
BeginNormalPaletteFade(0xFFFFFFFF, delay, 16, 0, fadeColor);
- gWeatherPtr->unknown_6C6 = 1;
+
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN;
gWeatherPtr->unknown_6CA = 1;
gWeatherPtr->unknown_6CB = 0;
Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB);
- gWeatherPtr->unknown_6C8 = 1;
+ gWeatherPtr->readyForInit = TRUE;
}
}
-bool8 sub_807D770(void)
+bool8 IsWeatherNotFadingIn(void)
{
- return gWeatherPtr->unknown_6C6 ^ 1 ? TRUE : FALSE;
+ return (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_IN);
}
-void sub_807D78C(u8 a)
+void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex)
{
- u16 r4 = 16 + a;
+ u16 paletteIndex = 16 + spritePaletteIndex;
u16 i;
- switch (gWeatherPtr->unknown_6C6)
+ switch (gWeatherPtr->palProcessingState)
{
- case 1:
+ case WEATHER_PAL_STATE_SCREEN_FADING_IN:
if (gWeatherPtr->unknown_6CA != 0)
{
if (gWeatherPtr->currWeather == WEATHER_FOG_1)
- sub_807D540(r4);
- r4 *= 16;
+ MarkFogSpritePalToLighten(paletteIndex);
+ paletteIndex *= 16;
for (i = 0; i < 16; i++)
- gPlttBufferFaded[r4 + i] = gWeatherPtr->unknown_6C4;
+ gPlttBufferFaded[paletteIndex + i] = gWeatherPtr->fadeDestColor;
}
break;
- case 2:
- r4 *= 16;
- CpuFastCopy(gPlttBufferFaded + r4, gPlttBufferUnfaded + r4, 32);
- BlendPalette(r4, 16, gPaletteFade.y, gPaletteFade.blendColor);
+ case WEATHER_PAL_STATE_SCREEN_FADING_OUT:
+ paletteIndex *= 16;
+ CpuFastCopy(gPlttBufferFaded + paletteIndex, gPlttBufferUnfaded + paletteIndex, 32);
+ BlendPalette(paletteIndex, 16, gPaletteFade.y, gPaletteFade.blendColor);
break;
+ // WEATHER_PAL_STATE_CHANGING_WEATHER
+ // WEATHER_PAL_STATE_CHANGING_IDLE
default:
if (gWeatherPtr->currWeather != WEATHER_FOG_1)
{
- sub_807CEBC(r4, 1, gWeatherPtr->unknown_6C0);
+ ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex);
}
else
{
- r4 *= 16;
- BlendPalette(r4, 16, 12, 0x73FC);
+ paletteIndex *= 16;
+ BlendPalette(paletteIndex, 16, 12, 0x73FC);
}
break;
}
}
-void sub_807D874(u8 a)
+void ApplyWeatherGammaShiftToPal(u8 paletteIndex)
{
- sub_807CEBC(a, 1, gWeatherPtr->unknown_6C0);
+ ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex);
}
u8 unref_sub_807D894(void)
{
- if (gWeatherPtr->unknown_6C6 == 1)
+ if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_SCREEN_FADING_IN)
return gWeatherPtr->unknown_6CA;
else
return 0;
}
-void sub_807D8C0(const u16 *palette)
+void LoadCustomWeatherSpritePalette(const u16 *palette)
{
- LoadPalette(palette, 0x100 + gWeatherPtr->unknown_6D4 * 16, 32);
- sub_807D78C(gWeatherPtr->unknown_6D4);
+ LoadPalette(palette, 0x100 + gWeatherPtr->weatherPicSpritePalIndex * 16, 32);
+ UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex);
}
-void sub_807D8F0(u8 *a, u8 *b)
+static void LoadDroughtWeatherPalette(u8 *gammaIndexPtr, u8 *b)
{
- u8 r4 = *a;
+ u8 gammaIndex = *gammaIndexPtr;
u16 i;
- if (r4 < 7)
+ if (gammaIndex < 7)
{
- r4--;
- LZ77UnCompWram(sCompressedDroughtPalettes[r4], eWeatherPaletteData.data[r4]);
- if (r4 == 0)
+ gammaIndex--;
+ LZ77UnCompWram(sCompressedDroughtPalettes[gammaIndex], eDroughtPaletteData.gammaShiftColors[gammaIndex]);
+ if (gammaIndex == 0)
{
- eWeatherPaletteData.data[r4][0] = 0x421;
+ eDroughtPaletteData.gammaShiftColors[gammaIndex][0] = RGB(1, 1, 1);
for (i = 1; i < 0x1000; i++)
- eWeatherPaletteData.data[r4][i] += eWeatherPaletteData.data[r4][i - 1];
+ eDroughtPaletteData.gammaShiftColors[gammaIndex][i] += eDroughtPaletteData.gammaShiftColors[gammaIndex][i - 1];
}
else
{
for (i = 0; i < 0x1000; i++)
- eWeatherPaletteData.data[r4][i] += eWeatherPaletteData.data[r4 - 1][i];
+ eDroughtPaletteData.gammaShiftColors[gammaIndex][i] += eDroughtPaletteData.gammaShiftColors[gammaIndex - 1][i];
}
- if (++(*a) == 7)
+ if (++(*gammaIndexPtr) == 7)
{
- *a = 32;
+ *gammaIndexPtr = 32;
*b = 32;
}
}
}
-void sub_807D9A8(void)
+void ResetDroughtWeatherPaletteLoading(void)
{
- gWeatherPtr->unknown_74D = 1;
- gWeatherPtr->unknown_74E = 1;
+ gWeatherPtr->loadDroughtPalsIndex = 1;
+ gWeatherPtr->loadDroughtPalsOffset = 1;
}
-bool8 sub_807D9C8(void)
+bool8 LoadDroughtWeatherPalettes(void)
{
- if (gWeatherPtr->unknown_74D < 32)
+ if (gWeatherPtr->loadDroughtPalsIndex < 32)
{
- sub_807D8F0(&gWeatherPtr->unknown_74D, &gWeatherPtr->unknown_74E);
- if (gWeatherPtr->unknown_74D < 32)
+ LoadDroughtWeatherPalette(&gWeatherPtr->loadDroughtPalsIndex, &gWeatherPtr->loadDroughtPalsOffset);
+ if (gWeatherPtr->loadDroughtPalsIndex < 32)
return TRUE;
}
return FALSE;
}
-void sub_807DA04(s8 a)
+void sub_807DA04(s8 gammaIndex)
{
- sub_807D5BC(-a - 1);
+ sub_807D5BC(-gammaIndex - 1);
}
void sub_807DA14(void)
@@ -1009,8 +1103,8 @@ void Weather_SetTargetBlendCoeffs(u8 eva, u8 evb, int delay)
gWeatherPtr->targetBlendEVA = eva;
gWeatherPtr->targetBlendEVB = evb;
gWeatherPtr->blendDelay = delay;
- gWeatherPtr->unknown_739 = 0;
- gWeatherPtr->unknown_738 = 0;
+ gWeatherPtr->blendFrameCounter = 0;
+ gWeatherPtr->blendUpdateCounter = 0;
}
bool8 Weather_UpdateBlend(void)
@@ -1019,13 +1113,13 @@ bool8 Weather_UpdateBlend(void)
&& gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB)
return TRUE;
- if (++gWeatherPtr->unknown_739 > gWeatherPtr->blendDelay)
+ if (++gWeatherPtr->blendFrameCounter > gWeatherPtr->blendDelay)
{
- gWeatherPtr->unknown_739 = 0;
- gWeatherPtr->unknown_738++;
+ gWeatherPtr->blendFrameCounter = 0;
+ gWeatherPtr->blendUpdateCounter++;
// Update currBlendEVA and currBlendEVB on alternate frames
- if (gWeatherPtr->unknown_738 & 1)
+ if (gWeatherPtr->blendUpdateCounter & 1)
{
if (gWeatherPtr->currBlendEVA < gWeatherPtr->targetBlendEVA)
gWeatherPtr->currBlendEVA++;
@@ -1055,48 +1149,48 @@ void unref_sub_807DCB4(u8 a)
switch (a)
{
case 1:
- SetWeather(1);
+ SetWeather(WEATHER_CLOUDS);
break;
case 2:
- SetWeather(2);
+ SetWeather(WEATHER_SUNNY);
break;
case 3:
- SetWeather(3);
+ SetWeather(WEATHER_RAIN_LIGHT);
break;
case 4:
- SetWeather(4);
+ SetWeather(WEATHER_SNOW);
break;
case 5:
- SetWeather(5);
+ SetWeather(WEATHER_RAIN_MED);
break;
case 6:
- SetWeather(6);
+ SetWeather(WEATHER_FOG_1);
break;
case 7:
- SetWeather(9);
+ SetWeather(WEATHER_FOG_2);
break;
case 8:
- SetWeather(7);
+ SetWeather(WEATHER_ASH);
break;
case 9:
- SetWeather(8);
+ SetWeather(WEATHER_SANDSTORM);
break;
case 10:
- SetWeather(11);
+ SetWeather(WEATHER_SHADE);
break;
}
}
-u8 weather_get_current(void)
+u8 GetCurrentWeather(void)
{
return gWeatherPtr->currWeather;
}
-void SetRainStrengthFromSoundEffect(u16 sndEff)
+void SetRainStrengthFromSoundEffect(u16 soundEffect)
{
- if (gWeatherPtr->unknown_6C6 != 2)
+ if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_OUT)
{
- switch (sndEff)
+ switch (soundEffect)
{
case SE_T_KOAME:
gWeatherPtr->rainStrength = 0;
@@ -1110,7 +1204,8 @@ void SetRainStrengthFromSoundEffect(u16 sndEff)
default:
return;
}
- PlaySE(sndEff);
+
+ PlaySE(soundEffect);
}
}
@@ -1134,29 +1229,171 @@ void PlayRainSoundEffect(void)
}
}
-u8 sub_807DDFC(void)
+u8 IsWeatherChangeComplete(void)
{
- return gWeatherPtr->unknown_6D3;
+ return gWeatherPtr->weatherChangeComplete;
}
-void sub_807DE10(void)
+void SetWeatherScreenFadeOut(void)
{
- gWeatherPtr->unknown_6C6 = 2;
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT;
}
void unref_sub_807DE24(void)
{
- gWeatherPtr->unknown_6C6 = 3;
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;
}
-void sub_807DE38(u8 a)
+void PreservePaletteInWeather(u8 preservedPalIndex)
{
- CpuCopy16(gUnknown_083970C8, gUnknown_0202FF38, 32);
- gUnknown_0202FF38[a] = 0;
- gUnknown_030006DC = gUnknown_0202FF38;
+ CpuCopy16(sBasePaletteGammaTypes, gFieldEffectPaletteGammaTypes, 32);
+ gFieldEffectPaletteGammaTypes[preservedPalIndex] = GAMMA_NONE;
+ sPaletteGammaTypes = gFieldEffectPaletteGammaTypes;
}
-void sub_807DE68(void)
+void ResetPreservedPalettesInWeather(void)
{
- gUnknown_030006DC = gUnknown_083970C8;
+ sPaletteGammaTypes = sBasePaletteGammaTypes;
}
+
+#if DEBUG
+
+__attribute__((naked))
+u8 debug_sub_8085564(void)
+{
+ asm("\
+ push {lr}\n\
+ mov r2, #0x0\n\
+ ldr r0, ._375 @ gMain\n\
+ ldrh r1, [r0, #0x2e]\n\
+ mov r0, #0x80\n\
+ lsl r0, r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._370 @cond_branch\n\
+ ldr r1, ._375 + 4 @ gUnknown_Debug_20301FE\n\
+ ldrb r0, [r1]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r1]\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0xf\n\
+ bne ._371 @cond_branch\n\
+ strb r2, [r1]\n\
+._371:\n\
+ mov r2, #0x1\n\
+._370:\n\
+ ldr r0, ._375 @ gMain\n\
+ ldrh r1, [r0, #0x2e]\n\
+ mov r0, #0x80\n\
+ lsl r0, r0, #0x2\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._372 @cond_branch\n\
+ ldr r1, ._375 + 4 @ gUnknown_Debug_20301FE\n\
+ ldrb r0, [r1]\n\
+ cmp r0, #0\n\
+ beq ._373 @cond_branch\n\
+ sub r0, r0, #0x1\n\
+ b ._374\n\
+._376:\n\
+ .align 2, 0\n\
+._375:\n\
+ .word gMain\n\
+ .word gUnknown_Debug_20301FE\n\
+._373:\n\
+ mov r0, #0xe\n\
+._374:\n\
+ strb r0, [r1]\n\
+ mov r2, #0x1\n\
+._372:\n\
+ cmp r2, #0\n\
+ beq ._377 @cond_branch\n\
+ mov r0, #0x16\n\
+ mov r1, #0x1\n\
+ mov r2, #0x1c\n\
+ mov r3, #0x2\n\
+ bl Menu_BlankWindowRect\n\
+ ldr r1, ._380 @ gDebugText_Weather\n\
+ ldr r0, ._380 + 4 @ gUnknown_Debug_20301FE\n\
+ ldrb r0, [r0]\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ mov r1, #0x17\n\
+ mov r2, #0x1\n\
+ bl Menu_PrintText\n\
+._377:\n\
+ ldr r0, ._380 + 8 @ gMain\n\
+ ldrh r1, [r0, #0x2e]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ bne ._378 @cond_branch\n\
+ mov r0, #0x0\n\
+ b ._379\n\
+._381:\n\
+ .align 2, 0\n\
+._380:\n\
+ .word gDebugText_Weather\n\
+ .word gUnknown_Debug_20301FE\n\
+ .word gMain\n\
+._378:\n\
+ ldr r0, ._382 @ gUnknown_Debug_20301FE\n\
+ ldrb r0, [r0]\n\
+ bl ChangeWeather\n\
+ bl CloseMenu\n\
+ mov r0, #0x1\n\
+._379:\n\
+ pop {r1}\n\
+ bx r1\n\
+._383:\n\
+ .align 2, 0\n\
+._382:\n\
+ .word gUnknown_Debug_20301FE");
+}
+
+__attribute__((naked))
+u8 debug_sub_808560C(void)
+{
+ asm("\
+ push {r4, lr}\n\
+ ldr r4, ._384 @ gUnknown_Debug_20301FE\n\
+ ldr r0, ._384 + 4 @ gWeather\n\
+ mov r1, #0xda\n\
+ lsl r1, r1, #0x3\n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r4]\n\
+ bl Menu_EraseScreen\n\
+ mov r0, #0x16\n\
+ mov r1, #0x1\n\
+ mov r2, #0x1c\n\
+ mov r3, #0x2\n\
+ bl Menu_BlankWindowRect\n\
+ ldr r1, ._384 + 8 @ gDebugText_Weather\n\
+ ldrb r0, [r4]\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ mov r1, #0x17\n\
+ mov r2, #0x1\n\
+ bl Menu_PrintText\n\
+ ldr r1, ._384 + 12 @ gMenuCallback\n\
+ ldr r0, ._384 + 16 @ debug_sub_8085564\n\
+ str r0, [r1]\n\
+ mov r0, #0x0\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1\n\
+._385:\n\
+ .align 2, 0\n\
+._384:\n\
+ .word gUnknown_Debug_20301FE\n\
+ .word gWeather\n\
+ .word gDebugText_Weather\n\
+ .word gMenuCallback\n\
+ .word debug_sub_8085564+1");
+}
+
+#endif
diff --git a/src/field/field_weather_effects.c b/src/field/field_weather_effects.c
index 5a59d6c2a..eff702f8c 100644
--- a/src/field/field_weather_effects.c
+++ b/src/field/field_weather_effects.c
@@ -74,10 +74,7 @@ static const struct SpriteTemplate sCloudSpriteTemplate =
.callback = sub_807E0F4,
};
-extern void sub_807D5BC(s8 a);
-extern void sub_807D8C0(const u16 *palette);
-extern void sub_807D9A8(void);
-extern bool8 sub_807D9C8(void);
+extern void sub_807D5BC(s8 gammaIndex);
extern void sub_807DA14(void);
extern void sub_807DA4C(void);
extern void Weather_SetTargetBlendCoeffs(u8 a, u8 b, int c);
@@ -91,8 +88,8 @@ extern void sub_807D5F0(u8 a, u8 b, u8 c);
void Clouds_InitVars(void)
{
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 0;
+ gWeatherPtr->gammaStepDelay = 20;
gWeatherPtr->weatherGfxLoaded = FALSE;
gWeatherPtr->initStep = 0;
if (gWeatherPtr->cloudSpritesCreated == FALSE)
@@ -159,8 +156,8 @@ bool8 Clouds_Finish(void)
void Weather2_InitVars(void)
{
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 0;
+ gWeatherPtr->gammaStepDelay = 20;
}
void Weather2_InitAll(void)
@@ -184,7 +181,7 @@ void CreateCloudSprites(void)
if (gWeatherPtr->cloudSpritesCreated == TRUE)
return;
LoadSpriteSheet(&sCloudSpriteSheet);
- sub_807D8C0(gUnknown_08397108);
+ LoadCustomWeatherSpritePalette(gUnknown_08397108);
for (i = 0; i < 3; i++)
{
u8 spriteId = CreateSprite(&sCloudSpriteTemplate, 0, 0, 0xFF);
@@ -236,8 +233,8 @@ void Drought_InitVars(void)
{
gWeatherPtr->initStep = 0;
gWeatherPtr->weatherGfxLoaded = FALSE;
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 0;
+ gWeatherPtr->gammaTargetIndex = 0;
+ gWeatherPtr->gammaStepDelay = 0;
}
void Drought_Main(void);
@@ -254,15 +251,15 @@ void Drought_Main(void)
switch (gWeatherPtr->initStep)
{
case 0:
- if (gWeatherPtr->unknown_6C6 != 0)
+ if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_CHANGING_WEATHER)
gWeatherPtr->initStep++;
break;
case 1:
- sub_807D9A8();
+ ResetDroughtWeatherPaletteLoading();
gWeatherPtr->initStep++;
break;
case 2:
- if (sub_807D9C8() == FALSE)
+ if (LoadDroughtWeatherPalettes() == FALSE)
gWeatherPtr->initStep++;
break;
case 3:
@@ -368,8 +365,8 @@ void LightRain_InitVars(void)
gWeatherPtr->unknown_6DB = 8;
gWeatherPtr->unknown_6DC = 0;
gWeatherPtr->unknown_6D9 = 10;
- gWeatherPtr->unknown_6C1 = 3;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 3;
+ gWeatherPtr->gammaStepDelay = 20;
SetRainStrengthFromSoundEffect(SE_T_KOAME);
}
@@ -885,8 +882,8 @@ void Snow_InitVars(void)
{
gWeatherPtr->initStep = 0;
gWeatherPtr->weatherGfxLoaded = FALSE;
- gWeatherPtr->unknown_6C1 = 3;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 3;
+ gWeatherPtr->gammaStepDelay = 20;
gWeatherPtr->unknown_6E5 = 16;
gWeatherPtr->unknown_6E0 = 0;
}
@@ -1074,8 +1071,8 @@ void MedRain_InitVars(void)
gWeatherPtr->unknown_6DB = 4;
gWeatherPtr->unknown_6DC = 0;
gWeatherPtr->unknown_6D9 = 16;
- gWeatherPtr->unknown_6C1 = 3;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 3;
+ gWeatherPtr->gammaStepDelay = 20;
gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment
gWeatherPtr->unknown_6ED = 0;
SetRainStrengthFromSoundEffect(SE_T_AME);
@@ -1102,8 +1099,8 @@ void HeavyRain_InitVars(void)
gWeatherPtr->unknown_6DB = 4;
gWeatherPtr->unknown_6DC = 1;
gWeatherPtr->unknown_6D9 = 24;
- gWeatherPtr->unknown_6C1 = 3;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 3;
+ gWeatherPtr->gammaStepDelay = 20;
gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment
SetRainStrengthFromSoundEffect(SE_T_OOAME);
}
@@ -1139,7 +1136,7 @@ void Rain_Main(void)
gWeatherPtr->initStep++;
break;
case 3:
- if (gWeatherPtr->unknown_6C6 == 0)
+ if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_CHANGING_WEATHER)
break;
gWeatherPtr->initStep = 6;
break;
@@ -1213,7 +1210,7 @@ void Rain_Main(void)
gWeatherPtr->initStep++;
break;
case 14:
- if (gWeatherPtr->unknown_6C6 != 3)
+ if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_IDLE)
break;
gWeatherPtr->unknown_6EA = 1;
gWeatherPtr->initStep = 4;
@@ -1296,8 +1293,8 @@ void Fog1_InitVars(void)
{
gWeatherPtr->initStep = 0;
gWeatherPtr->weatherGfxLoaded = FALSE;
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 0;
+ gWeatherPtr->gammaStepDelay = 20;
if (gWeatherPtr->fog1SpritesCreated == 0)
{
gWeatherPtr->unknown_6F0 = 0;
@@ -1446,8 +1443,8 @@ void Ash_InitVars(void)
{
gWeatherPtr->initStep = 0;
gWeatherPtr->weatherGfxLoaded = FALSE;
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 0;
+ gWeatherPtr->gammaStepDelay = 20;
gWeatherPtr->unknown_6FE = 20;
if (!gWeatherPtr->ashSpritesCreated)
{
@@ -1634,8 +1631,8 @@ void Fog2_InitVars(void)
{
gWeatherPtr->initStep = 0;
gWeatherPtr->weatherGfxLoaded = 0;
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 0;
+ gWeatherPtr->gammaStepDelay = 20;
gWeatherPtr->unknown_6F0 = 0;
gWeatherPtr->unknown_6F2 = 1;
if (gWeatherPtr->fog2SpritesCreated == 0)
@@ -1835,8 +1832,8 @@ void Sandstorm_InitVars(void)
{
gWeatherPtr->initStep = 0;
gWeatherPtr->weatherGfxLoaded = 0;
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 0;
+ gWeatherPtr->gammaStepDelay = 20;
if (gWeatherPtr->sandstormSprites1Created == 0)
{
gWeatherPtr->unknown_704 = gWeatherPtr->unknown_708 = 0;
@@ -2015,7 +2012,7 @@ void CreateSandstormSprites_1(void)
if (!gWeatherPtr->sandstormSprites1Created)
{
LoadSpriteSheet(&sSandstormSpriteSheet);
- sub_807D8C0(gUnknown_08397128);
+ LoadCustomWeatherSpritePalette(gUnknown_08397128);
for (i = 0; i < 20; i++)
{
u8 spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, 0, (i / 5) * 64, 1);
@@ -2113,26 +2110,26 @@ void SandstormSpriteCallback3(struct Sprite *sprite)
}
//------------------------------------------------------------------------------
-// Weather 11
+// Shade
//------------------------------------------------------------------------------
-void Weather11_InitVars(void)
+void Shade_InitVars(void)
{
gWeatherPtr->initStep = 0;
- gWeatherPtr->unknown_6C1 = 3;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 3;
+ gWeatherPtr->gammaStepDelay = 20;
}
-void Weather11_InitAll(void)
+void Shade_InitAll(void)
{
- Weather11_InitVars();
+ Shade_InitVars();
}
-void Weather11_Main(void)
+void Shade_Main(void)
{
}
-bool8 Weather11_Finish(void)
+bool8 Shade_Finish(void)
{
return FALSE;
}
@@ -2322,7 +2319,7 @@ void SetSav1WeatherFromCurrMapHeader(void)
void SetWeather(u32 weather)
{
SetSav1Weather(weather);
- DoWeatherEffect(GetSav1Weather());
+ ChangeWeather(GetSav1Weather());
}
void SetWeather_Unused(u32 weather)
@@ -2333,7 +2330,7 @@ void SetWeather_Unused(u32 weather)
void DoCurrentWeather(void)
{
- DoWeatherEffect(GetSav1Weather());
+ ChangeWeather(GetSav1Weather());
}
void sub_8080750(void)
@@ -2380,5 +2377,5 @@ void UpdateRainCounter(u8 newWeather, u8 oldWeather)
{
if (newWeather != oldWeather
&& (newWeather == WEATHER_RAIN_LIGHT || newWeather == WEATHER_RAIN_MED))
- IncrementGameStat(0x28);
+ IncrementGameStat(GAME_STAT_GOT_RAINED_ON);
}
diff --git a/src/field/fieldmap.c b/src/field/fieldmap.c
index 7a31ae720..7383bb174 100644
--- a/src/field/fieldmap.c
+++ b/src/field/fieldmap.c
@@ -86,18 +86,20 @@ void map_copy_with_padding(u16 *map, u16 width, u16 height)
void sub_80560AC(struct MapHeader *mapHeader)
{
+ // BUG: This results in a null pointer dereference when mapHeader->connections
+ // is NULL, causing count to be assigned a garbage value. This garbage value
+ // just so happens to have the most significant bit set, so it is treated as
+ // negative and the loop below thankfully never executes in this scenario.
+ int count = mapHeader->connections->count;
+ struct MapConnection *connection = mapHeader->connections->connections;
int i;
- struct MapConnection *connection;
- struct MapHeader *cMap;
- u32 offset;
- int count;
- count = mapHeader->connections->count;
- connection = mapHeader->connections->connections;
+
gUnknown_0202E850 = sDummyConnectionFlags;
for (i = 0; i < count; i++, connection++)
{
- cMap = mapconnection_get_mapheader(connection);
- offset = connection->offset;
+ struct MapHeader *cMap = mapconnection_get_mapheader(connection);
+ u32 offset = connection->offset;
+
switch (connection->direction)
{
case CONNECTION_SOUTH:
diff --git a/src/field/fldeff_cut.c b/src/field/fldeff_cut.c
index e4328acfc..5d39b87a9 100644
--- a/src/field/fldeff_cut.c
+++ b/src/field/fldeff_cut.c
@@ -72,6 +72,115 @@ static const struct SpriteTemplate gSpriteTemplate_CutGrass =
.callback = sub_80A2A48,
};
+#if DEBUG
+__attribute__((naked))
+void debug_sub_80AFEE4()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, r8\n"
+ " push {r7}\n"
+ " mov r0, #0x52\n"
+ " bl npc_before_player_of_type\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r0, #0x1\n"
+ " bne ._1 @cond_branch\n"
+ " ldr r1, ._3 @ gLastFieldPokeMenuOpened\n"
+ " mov r0, #0x0\n"
+ " strb r0, [r1]\n"
+ " bl sub_80A2634\n"
+ " b ._8\n"
+ "._4:\n"
+ " .align 2, 0\n"
+ "._3:\n"
+ " .word gLastFieldPokeMenuOpened\n"
+ "._1:\n"
+ " ldr r4, ._9 @ gUnknown_0203923C\n"
+ " add r1, r4, #2\n"
+ " add r0, r4, #0\n"
+ " bl PlayerGetDestCoords\n"
+ " mov r7, #0x0\n"
+ " mov r8, r4\n"
+ "._12:\n"
+ " ldr r1, ._9 + 4 @ 0xffff\n"
+ " add r0, r7, r1\n"
+ " mov r2, r8\n"
+ " ldrh r2, [r2, #0x2]\n"
+ " add r0, r0, r2\n"
+ " mov r6, #0x0\n"
+ " lsl r0, r0, #0x10\n"
+ " asr r5, r0, #0x10\n"
+ "._11:\n"
+ " ldr r1, ._9 + 4 @ 0xffff\n"
+ " add r0, r6, r1\n"
+ " mov r2, r8\n"
+ " ldrh r2, [r2]\n"
+ " add r0, r0, r2\n"
+ " lsl r0, r0, #0x10\n"
+ " asr r4, r0, #0x10\n"
+ " add r0, r4, #0\n"
+ " add r1, r5, #0\n"
+ " bl MapGridGetZCoordAt\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " mov r2, r8\n"
+ " mov r1, #0x4\n"
+ " ldsb r1, [r2, r1]\n"
+ " cmp r0, r1\n"
+ " bne ._7 @cond_branch\n"
+ " add r0, r4, #0\n"
+ " add r1, r5, #0\n"
+ " bl MapGridGetMetatileBehaviorAt\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " add r0, r4, #0\n"
+ " bl MetatileBehavior_IsPokeGrass\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r0, #0x1\n"
+ " beq ._6 @cond_branch\n"
+ " add r0, r4, #0\n"
+ " bl MetatileBehavior_IsAshGrass\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r0, #0x1\n"
+ " bne ._7 @cond_branch\n"
+ "._6:\n"
+ " ldr r1, ._9 + 8 @ gLastFieldPokeMenuOpened\n"
+ " mov r0, #0x0\n"
+ " strb r0, [r1]\n"
+ " bl sub_80A25E8\n"
+ " b ._8\n"
+ "._10:\n"
+ " .align 2, 0\n"
+ "._9:\n"
+ " .word gUnknown_0203923C\n"
+ " .word 0xffff\n"
+ " .word gLastFieldPokeMenuOpened\n"
+ "._7:\n"
+ " add r0, r6, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r6, r0, #0x18\n"
+ " cmp r6, #0x2\n"
+ " bls ._11 @cond_branch\n"
+ " add r0, r7, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r7, r0, #0x18\n"
+ " cmp r7, #0x2\n"
+ " bls ._12 @cond_branch\n"
+ " bl ScriptContext2_Disable\n"
+ "._8:\n"
+ " pop {r3}\n"
+ " mov r8, r3\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "\n"
+ );
+}
+#endif
+
bool8 SetUpFieldMove_Cut(void)
{
s16 x, y;
@@ -122,7 +231,7 @@ bool8 FldEff_UseCutOnGrass(void)
gTasks[taskId].data[8] = (u32)sub_80A2684 >> 16;
gTasks[taskId].data[9] = (u32)sub_80A2684;
- IncrementGameStat(0x12);
+ IncrementGameStat(GAME_STAT_USED_CUT);
return FALSE;
}
@@ -138,7 +247,7 @@ bool8 FldEff_UseCutOnTree(void)
gTasks[taskId].data[8] = (u32)sub_80A2B00 >> 16;
gTasks[taskId].data[9] = (u32)sub_80A2B00;
- IncrementGameStat(0x12);
+ IncrementGameStat(GAME_STAT_USED_CUT);
return FALSE;
}
diff --git a/src/field/fldeff_escalator.c b/src/field/fldeff_escalator.c
new file mode 100644
index 000000000..981233480
--- /dev/null
+++ b/src/field/fldeff_escalator.c
@@ -0,0 +1,132 @@
+#include "global.h"
+#include "task.h"
+#include "fieldmap.h"
+#include "field_camera.h"
+#include "field_player_avatar.h"
+
+extern u8 gUnknown_02038731;
+
+void sub_80B45B4(u8 taskId, const s16 *list, u16 c)
+{
+ s16 r5 = gTasks[taskId].data[4] - 1;
+ s16 r3 = gTasks[taskId].data[5] - 1;
+ s16 r4 = gTasks[taskId].data[1];
+ s16 y;
+ s16 x;
+
+ if (gTasks[taskId].data[2] == 0)
+ {
+ for (y = 0; y < 3; y++)
+ {
+ for (x = 0; x < 3; x++)
+ {
+ s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y);
+
+ if (list[r4] == metatileId)
+ {
+ if (r4 != 2)
+ MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[r4 + 1]);
+ else
+ MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[0]);
+ }
+ }
+ }
+ }
+ else
+ {
+ for (y = 0; y < 3; y++)
+ {
+ for (x = 0; x < 3; x++)
+ {
+ s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y);
+
+ if (list[2 - r4] == metatileId)
+ {
+ if (r4 != 2)
+ MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[1 - r4]);
+ else
+ MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[2]);
+ }
+ }
+ }
+ }
+}
+
+const u16 gUnknown_083CC714[] = {0x284, 0x282, 0x280};
+const u16 gUnknown_083CC71A[] = {0x285, 0x283, 0x281};
+const u16 gUnknown_083CC720[] = {0x28C, 0x28A, 0x288};
+const u16 gUnknown_083CC726[] = {0x28D, 0x28B, 0x289};
+const u16 gUnknown_083CC72C[] = {0x2A0, 0x2A2, 0x2A4};
+const u16 gUnknown_083CC732[] = {0x2A1, 0x2A3, 0x2A5};
+const u16 gUnknown_083CC738[] = {0x2A8, 0x2AA, 0x2AC};
+
+void sub_80B4710(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ data[3] = 1;
+
+ switch (data[0])
+ {
+ case 0:
+ sub_80B45B4(taskId, gUnknown_083CC714, 0);
+ break;
+ case 1:
+ sub_80B45B4(taskId, gUnknown_083CC71A, 0);
+ break;
+ case 2:
+ sub_80B45B4(taskId, gUnknown_083CC720, 0xC00);
+ break;
+ case 3:
+ sub_80B45B4(taskId, gUnknown_083CC726, 0);
+ break;
+ case 4:
+ sub_80B45B4(taskId, gUnknown_083CC72C, 0xC00);
+ break;
+ case 5:
+ sub_80B45B4(taskId, gUnknown_083CC732, 0);
+ break;
+ case 6:
+ sub_80B45B4(taskId, gUnknown_083CC738, 0);
+ break;
+ }
+
+ data[0] = (data[0] + 1) & 7;
+ if (!data[0])
+ {
+ DrawWholeMapView();
+ data[1] = (data[1] + 1) % 3;
+ data[3] = 0;
+ }
+}
+
+u8 sub_80B47D8(u16 var)
+{
+ u8 taskId = CreateTask(sub_80B4710, 0);
+ s16 *data = gTasks[taskId].data;
+
+ PlayerGetDestCoords(&data[4], &data[5]);
+ data[0] = 0;
+ data[1] = 0;
+ data[2] = var;
+ sub_80B4710(taskId);
+ return taskId;
+}
+
+void sub_80B4824(u8 var)
+{
+ gUnknown_02038731 = sub_80B47D8(var);
+}
+
+void sub_80B483C(void)
+{
+ DestroyTask(gUnknown_02038731);
+}
+
+bool8 sub_80B4850(void)
+{
+ if (gTasks[gUnknown_02038731].data[3] == 0 && gTasks[gUnknown_02038731].data[1] == 2)
+ return FALSE;
+ else
+ return TRUE;
+}
diff --git a/src/field/fldeff_flash.c b/src/field/fldeff_flash.c
index 22f170184..8c0f09bd9 100644
--- a/src/field/fldeff_flash.c
+++ b/src/field/fldeff_flash.c
@@ -71,6 +71,36 @@ static const u16 gUnknown_083F809C[] = INCBIN_U16("graphics/misc/83F809C.gbapal"
static const u16 gCaveTransitionTilemap[] = INCBIN_U16("graphics/misc/cave_transition_map.bin.lz");
static const u8 gCaveTransitionTiles[] = INCBIN_U8("graphics/misc/cave_transition.4bpp.lz");
+#if DEBUG
+__attribute__((naked))
+void debug_sub_8122080(void)
+{
+ asm("\
+ push {lr}\n\
+ ldr r0, ._4 @ gMapHeader\n\
+ ldrb r0, [r0, #0x15]\n\
+ cmp r0, #0x1\n\
+ bne ._2 @cond_branch\n\
+ ldr r0, ._4 + 4 @ 0x828\n\
+ bl FlagGet\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._2 @cond_branch\n\
+ bl sub_810CBFC\n\
+ b ._3\n\
+._5:\n\
+ .align 2, 0\n\
+._4:\n\
+ .word gMapHeader\n\
+ .word 0x828\n\
+._2:\n\
+ bl ScriptContext2_Disable\n\
+._3:\n\
+ pop {r0}\n\
+ bx r0");
+}
+#endif
+
bool8 SetUpFieldMove_Flash(void)
{
if (gMapHeader.cave == TRUE && !FlagGet(FLAG_SYS_USE_FLASH))
diff --git a/src/field/fldeff_poison.c b/src/field/fldeff_poison.c
index b0052d59d..52afc2516 100644
--- a/src/field/fldeff_poison.c
+++ b/src/field/fldeff_poison.c
@@ -32,13 +32,13 @@ static void Task_FieldPoisonEffect(u8 taskId)
REG_MOSAIC = (data[1] << 4) | data[1];
}
-void DoFieldPoisonEffect(void)
+void FldeffPoison_Start(void)
{
PlaySE(SE_DOKU);
CreateTask(Task_FieldPoisonEffect, 80);
}
-bool32 FieldPoisonEffectIsRunning(void)
+bool32 FldeffPoison_IsActive(void)
{
return FuncIsActiveTask(Task_FieldPoisonEffect);
}
diff --git a/src/field/fldeff_secretpower.c b/src/field/fldeff_secretpower.c
index bf8e98403..0e91bb55c 100644
--- a/src/field/fldeff_secretpower.c
+++ b/src/field/fldeff_secretpower.c
@@ -243,6 +243,102 @@ void sub_80C6280(void)
}
}
+#if DEBUG
+
+__attribute__((naked))
+void debug_sub_80D93F4()
+{
+ asm("\
+ push {r4, lr}\n\
+ bl sub_80BB63C\n\
+ ldr r0, ._98 @ gSpecialVar_Result\n\
+ ldrh r0, [r0]\n\
+ cmp r0, #0x1\n\
+ beq ._95 @cond_branch\n\
+ bl player_get_direction_lower_nybble\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x2\n\
+ beq ._96 @cond_branch\n\
+._95:\n\
+ bl ScriptContext2_Disable\n\
+ b ._109\n\
+._99:\n\
+ .align 2, 0\n\
+._98:\n\
+ .word gSpecialVar_Result\n\
+._96:\n\
+ ldr r4, ._102 @ gUnknown_0203923C\n\
+ add r1, r4, #2\n\
+ add r0, r4, #0\n\
+ bl GetXYCoordsOneStepInFrontOfPlayer\n\
+ mov r1, #0x0\n\
+ ldsh r0, [r4, r1]\n\
+ mov r2, #0x2\n\
+ ldsh r1, [r4, r2]\n\
+ bl MapGridGetMetatileBehaviorAt\n\
+ lsl r0, r0, #0x18\n\
+ lsr r4, r0, #0x18\n\
+ add r0, r4, #0\n\
+ bl MetatileBehavior_IsSecretBaseCave\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x1\n\
+ bne ._100 @cond_branch\n\
+ bl sub_80C6264\n\
+ ldr r1, ._102 + 4 @ gLastFieldPokeMenuOpened\n\
+ mov r0, #0x0\n\
+ strb r0, [r1]\n\
+ bl sub_80C639C\n\
+ b ._109\n\
+._103:\n\
+ .align 2, 0\n\
+._102:\n\
+ .word gUnknown_0203923C\n\
+ .word gLastFieldPokeMenuOpened\n\
+._100:\n\
+ add r0, r4, #0\n\
+ bl MetatileBehavior_IsSecretBaseTree\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x1\n\
+ bne ._104 @cond_branch\n\
+ bl sub_80C6264\n\
+ ldr r1, ._106 @ gLastFieldPokeMenuOpened\n\
+ mov r0, #0x0\n\
+ strb r0, [r1]\n\
+ bl sub_80C64A8\n\
+ b ._109\n\
+._107:\n\
+ .align 2, 0\n\
+._106:\n\
+ .word gLastFieldPokeMenuOpened\n\
+._104:\n\
+ add r0, r4, #0\n\
+ bl MetatileBehavior_IsSecretBaseShrub\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x1\n\
+ bne ._108 @cond_branch\n\
+ bl sub_80C6264\n\
+ ldr r1, ._110 @ gLastFieldPokeMenuOpened\n\
+ mov r0, #0x0\n\
+ strb r0, [r1]\n\
+ bl sub_80C660C\n\
+ b ._109\n\
+._111:\n\
+ .align 2, 0\n\
+._110:\n\
+ .word gLastFieldPokeMenuOpened\n\
+._108:\n\
+ bl ScriptContext2_Disable\n\
+._109:\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0");
+}
+#endif
+
bool8 SetUpFieldMove_SecretPower(void)
{
u8 behavior;
diff --git a/src/field/fldeff_softboiled.c b/src/field/fldeff_softboiled.c
index a574232a8..3c64ec520 100644
--- a/src/field/fldeff_softboiled.c
+++ b/src/field/fldeff_softboiled.c
@@ -126,7 +126,7 @@ static void sub_8133E74(u8 taskId) {
return;
}
- MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19);
+ Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19);
PrintPartyMenuPromptText(3, 0);
gTasks[taskId].func = HandlePartyMenuSwitchPokemonInput;
}
@@ -142,7 +142,7 @@ static void sub_8133EF8(void) {
sub_806CCE4();
EWRAM_1B000_2.unk261 = 2;
DestroySprite(&gSprites[EWRAM_1000.unk1]);
- MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19);
+ Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19);
PrintPartyMenuPromptText(0, 0);
SwitchTaskToFollowupFunc(EWRAM_1000.unk0);
}
diff --git a/src/field/fldeff_strength.c b/src/field/fldeff_strength.c
index 565ac1651..9f9cd4013 100644
--- a/src/field/fldeff_strength.c
+++ b/src/field/fldeff_strength.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "constants/map_objects.h"
#include "braille_puzzles.h"
#include "field_effect.h"
#include "party_menu.h"
@@ -20,6 +21,28 @@ extern void (*gUnknown_03005CE4)(void);
extern u8 S_UseStrength[];
+#if DEBUG
+void debug_sub_8130318(void)
+{
+ if (ShouldDoBrailleStrengthEffect())
+ {
+ gLastFieldPokeMenuOpened = 0;
+ gSpecialVar_Result = 0;
+ sub_811AA38();
+ }
+ else if (npc_before_player_of_type(MAP_OBJ_GFX_PUSHABLE_BOULDER) == TRUE)
+ {
+ gLastFieldPokeMenuOpened = 0;
+ gSpecialVar_Result = 0;
+ sub_811AA18();
+ }
+ else
+ {
+ ScriptContext2_Disable();
+ }
+}
+#endif
+
bool8 SetUpFieldMove_Strength(void)
{
if (ShouldDoBrailleStrengthEffect())
diff --git a/src/field/item.c b/src/field/item.c
index 66d7d65df..6ff7a7cbe 100644
--- a/src/field/item.c
+++ b/src/field/item.c
@@ -571,7 +571,7 @@ void SwapRegisteredBike(void)
static u16 SanitizeItemId(u16 itemId)
{
- if (itemId > 0x15C)
+ if (itemId >= ARRAY_COUNT(gItems))
return 0;
else
return itemId;
diff --git a/src/field/item_menu.c b/src/field/item_menu.c
index e9b8b24d3..ae1465fbd 100644
--- a/src/field/item_menu.c
+++ b/src/field/item_menu.c
@@ -33,13 +33,13 @@
#include "string_util.h"
#include "task.h"
#include "text.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
+#include "menu_helpers.h"
#include "ewram.h"
// External stuff
extern void gpu_pal_allocator_reset__manage_upper_four(void);
-extern void sub_80F9020(void);
-extern void sub_80F9988();
+extern void SetVerticalScrollIndicatorPriority();
extern void sub_809D104(u16 *, u16, u16, const u8 *, u16, u16, u16, u16);
extern void PauseVerticalScrollIndicator();
extern u8 sub_80F9284(void);
@@ -47,10 +47,10 @@ extern void sub_808B5B4();
extern u8 sub_80F92F4();
extern void sub_80C9C7C(u8);
extern void pal_fill_black(void);
-extern bool8 sub_807D770(void);
+extern bool8 IsWeatherNotFadingIn(void);
extern u8 sub_80F931C();
extern void sub_808A3F8(u8);
-extern void sub_80B3050(void);
+extern void Shop_FadeReturnToMartMenu(void);
extern void sub_80546B8(u8);
extern void sub_804E990(u8);
extern void sub_802E424(u8);
@@ -158,6 +158,9 @@ extern struct PocketScrollState gBagPocketScrollStates[];
extern struct ItemSlot *gCurrentBagPocketItemSlots; // selected pocket item slots
extern const u8 Event_NoRegisteredItem[];
+// TODO: decompile the debug code so we can use static in this file
+#define static
+
extern const struct CompressedSpriteSheet sMaleBagSpriteSheet;
extern const struct CompressedSpriteSheet sFemaleBagSpriteSheet;
extern const struct CompressedSpritePalette sBagSpritePalette;
@@ -286,6 +289,24 @@ static void sub_80A6618(u8);
const struct YesNoFuncTable gUnknown_083C16FC = {sub_80A65AC, sub_80A6618};
+#if DEBUG
+const struct {u16 item; u8 unk;} gUnknown_Debug_083EBC68[12+48] =
+{
+ {ITEM_POKE_BALL, 10},
+ {ITEM_ULTRA_BALL, 15},
+ {ITEM_GREAT_BALL, 20},
+ {ITEM_MASTER_BALL, 25},
+ {ITEM_ACRO_BIKE, 1 },
+ {ITEM_OLD_ROD, 1 },
+ {ITEM_GOOD_ROD, 1 },
+ {ITEM_SUPER_ROD, 1 },
+ {ITEM_POKEBLOCK_CASE, 1 },
+ {ITEM_WAILMER_PAIL, 1 },
+ {ITEM_ITEMFINDER, 1 },
+ {ITEM_NONE, 1 },
+};
+#endif
+
void sub_80A34E8(void);
static bool8 LoadBagGraphicsMultistep(void);
static void sub_80A362C(void);
@@ -368,22 +389,394 @@ static void sub_80A3134(void)
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
-
- {
- const void *src = gBGTilemapBuffers[1];
- void *dst = (void *)(VRAM + 0x2000);
-
- DmaCopy16(3, src, dst, 0x800);
- }
-
- {
- const void *src = gBGTilemapBuffers[2];
- void *dst = (void *)(VRAM + 0x6000);
-
- DmaCopy16(3, src, dst, 0x800);
- }
+ DmaCopy16Defvars(3, gBGTilemapBuffers[1], (void *)(VRAM + 0x2000), 0x800);
+ DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x6000), 0x800);
}
+#if DEBUG
+__attribute__((naked))
+static bool8 SetupBagMultistep(void)
+{
+ asm("\
+ push {r4, r5, lr}\n\
+ add sp, sp, #0xfffffffc\n\
+ ldr r0, ._5 @ gMain\n\
+ ldr r1, ._5 + 4 @ 0x43c\n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x10\n\
+ bls ._3 @cond_branch\n\
+ b ._66\n\
+._3:\n\
+ lsl r0, r0, #0x2\n\
+ ldr r1, ._5 + 8 @ \n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+._6:\n\
+ .align 2, 0\n\
+._5:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+ .word ._7\n\
+._7:\n\
+ .word ._8\n\
+ .word ._9\n\
+ .word ._10\n\
+ .word ._11\n\
+ .word ._12\n\
+ .word ._13\n\
+ .word ._14\n\
+ .word ._15\n\
+ .word ._16\n\
+ .word ._17\n\
+ .word ._18\n\
+ .word ._19\n\
+ .word ._20\n\
+ .word ._21\n\
+ .word ._22\n\
+ .word ._23\n\
+ .word ._24\n\
+._8:\n\
+ bl ClearVideoCallbacks\n\
+ bl sub_80A34E8\n\
+ b ._61\n\
+._9:\n\
+ bl ScanlineEffect_Stop\n\
+ ldr r1, ._27 @ gMain\n\
+ ldr r0, ._27 + 4 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._62\n\
+._28:\n\
+ .align 2, 0\n\
+._27:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._10:\n\
+ bl gpu_pal_allocator_reset__manage_upper_four\n\
+ b ._61\n\
+._11:\n\
+ bl ClearBGTilemapBuffers\n\
+ ldr r0, ._31 @ \n\
+ ldr r1, ._31 + 4 @ \n\
+ add r0, r0, r1\n\
+ mov r1, #0x0\n\
+ strb r1, [r0]\n\
+ b ._61\n\
+._32:\n\
+ .align 2, 0\n\
+._31:\n\
+ .word +0x2000000\n\
+ .word 0x1ffff\n\
+._12:\n\
+ bl ResetPaletteFade\n\
+ ldr r2, ._34 @ gPaletteFade\n\
+ ldrb r0, [r2, #0x8]\n\
+ mov r1, #0x80\n\
+ orr r0, r0, r1\n\
+ strb r0, [r2, #0x8]\n\
+ ldr r1, ._34 + 4 @ gMain\n\
+ ldr r0, ._34 + 8 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._62\n\
+._35:\n\
+ .align 2, 0\n\
+._34:\n\
+ .word gPaletteFade\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._13:\n\
+ bl ResetSpriteData\n\
+ b ._61\n\
+._14:\n\
+ bl LoadBagGraphicsMultistep\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._37 @cond_branch\n\
+ b ._66\n\
+._37:\n\
+ ldr r1, ._40 @ gMain\n\
+ ldr r0, ._40 + 4 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._62\n\
+._41:\n\
+ .align 2, 0\n\
+._40:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._15:\n\
+ ldr r0, ._43 @ gWindowTemplate_81E6DFC\n\
+ bl Text_LoadWindowTemplate\n\
+ b ._61\n\
+._44:\n\
+ .align 2, 0\n\
+._43:\n\
+ .word gWindowTemplate_81E6DFC\n\
+._16:\n\
+ ldr r0, ._46 @ gWindowTemplate_81E6DFC\n\
+ bl MultistepInitMenuWindowBegin\n\
+ ldr r1, ._46 + 4 @ gMain\n\
+ ldr r0, ._46 + 8 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._62\n\
+._47:\n\
+ .align 2, 0\n\
+._46:\n\
+ .word gWindowTemplate_81E6DFC\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._17:\n\
+ bl MultistepInitMenuWindowContinue\n\
+ cmp r0, #0\n\
+ bne ._48 @cond_branch\n\
+ b ._66\n\
+._48:\n\
+ b ._61\n\
+._18:\n\
+ bl ClearVerticalScrollIndicatorPalettes\n\
+ bl LoadScrollIndicatorPalette\n\
+ mov r0, #0x0\n\
+ mov r1, #0xac\n\
+ mov r2, #0xc\n\
+ bl CreateVerticalScrollIndicators\n\
+ mov r0, #0x1\n\
+ mov r1, #0xac\n\
+ mov r2, #0x94\n\
+ bl CreateVerticalScrollIndicators\n\
+ mov r0, #0x2\n\
+ mov r1, #0x1c\n\
+ mov r2, #0x58\n\
+ bl CreateVerticalScrollIndicators\n\
+ mov r0, #0x3\n\
+ mov r1, #0x64\n\
+ mov r2, #0x58\n\
+ bl CreateVerticalScrollIndicators\n\
+ mov r0, #0x0\n\
+ mov r1, #0x2\n\
+ bl SetVerticalScrollIndicatorPriority\n\
+ mov r0, #0x1\n\
+ mov r1, #0x2\n\
+ bl SetVerticalScrollIndicatorPriority\n\
+ mov r0, #0x2\n\
+ mov r1, #0x2\n\
+ bl SetVerticalScrollIndicatorPriority\n\
+ mov r0, #0x3\n\
+ mov r1, #0x2\n\
+ bl SetVerticalScrollIndicatorPriority\n\
+ ldr r0, ._53 @ sReturnLocation\n\
+ ldrb r0, [r0]\n\
+ sub r0, r0, #0x4\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x1\n\
+ bhi ._51 @cond_branch\n\
+ mov r0, #0x2\n\
+ mov r1, #0x1\n\
+ bl SetVerticalScrollIndicators\n\
+ mov r0, #0x3\n\
+ mov r1, #0x1\n\
+ bl SetVerticalScrollIndicators\n\
+._51:\n\
+ ldr r1, ._53 + 4 @ gMain\n\
+ ldr r0, ._53 + 8 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._62\n\
+._54:\n\
+ .align 2, 0\n\
+._53:\n\
+ .word sReturnLocation\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._19:\n\
+ ldr r1, ._56 @ gUnknown_0203855A\n\
+ mov r0, #0x10\n\
+ strb r0, [r1]\n\
+ ldr r4, ._56 + 4 @ gBGTilemapBuffers\n\
+ ldr r5, ._56 + 8 @ sCurrentBagPocket\n\
+ ldrb r1, [r5]\n\
+ add r1, r1, #0x1\n\
+ lsl r1, r1, #0x18\n\
+ lsr r1, r1, #0x18\n\
+ add r0, r4, #0\n\
+ bl sub_80A39B8\n\
+ ldrb r1, [r5]\n\
+ add r0, r4, #0\n\
+ bl DrawPocketIndicatorDots\n\
+ bl UpdateAllBagPockets\n\
+ ldr r4, ._56 + 12 @ gBagPockets\n\
+ ldr r0, [r4, #0x10]\n\
+ ldr r1, [r4, #0x14]\n\
+ bl SortItemSlots\n\
+ ldr r0, [r4, #0x18]\n\
+ ldr r1, [r4, #0x1c]\n\
+ bl SortItemSlots\n\
+ bl sub_80A3D40\n\
+ ldr r1, ._56 + 16 @ gCurrentBagPocketItemSlots\n\
+ mov r0, #0x0\n\
+ ldsb r0, [r5, r0]\n\
+ lsl r0, r0, #0x3\n\
+ add r0, r0, r4\n\
+ ldr r0, [r0]\n\
+ str r0, [r1]\n\
+ bl sub_80A362C\n\
+ b ._61\n\
+._57:\n\
+ .align 2, 0\n\
+._56:\n\
+ .word gUnknown_0203855A\n\
+ .word gBGTilemapBuffers+0x1000\n\
+ .word sCurrentBagPocket\n\
+ .word gBagPockets\n\
+ .word gCurrentBagPocketItemSlots\n\
+._20:\n\
+ ldr r0, ._59 @ 0xffff\n\
+ mov r1, #0x0\n\
+ mov r2, #0x7\n\
+ bl sub_80A48E8\n\
+ ldr r1, ._59 + 4 @ gBagPocketScrollStates\n\
+ ldr r4, ._59 + 8 @ sCurrentBagPocket\n\
+ mov r0, #0x0\n\
+ ldsb r0, [r4, r0]\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r1\n\
+ ldrb r1, [r0, #0x1]\n\
+ ldrb r0, [r0]\n\
+ add r1, r1, r0\n\
+ ldr r0, ._59 + 12 @ gCurrentBagPocketItemSlots\n\
+ ldr r0, [r0]\n\
+ lsl r1, r1, #0x2\n\
+ add r1, r1, r0\n\
+ mov r2, #0x0\n\
+ ldsh r0, [r1, r2]\n\
+ bl ItemListMenu_InitDescription\n\
+ bl ItemListMenu_InitMenu\n\
+ ldr r1, ._59 + 16 @ gUnknown_0203855B\n\
+ ldrb r0, [r4]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r1]\n\
+ ldr r1, ._59 + 20 @ gUnknown_0203855C\n\
+ mov r0, #0x0\n\
+ strb r0, [r1]\n\
+ ldr r1, ._59 + 24 @ gMain\n\
+ ldr r0, ._59 + 28 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._62\n\
+._60:\n\
+ .align 2, 0\n\
+._59:\n\
+ .word 0xffff\n\
+ .word gBagPocketScrollStates\n\
+ .word sCurrentBagPocket\n\
+ .word gCurrentBagPocketItemSlots\n\
+ .word gUnknown_0203855B\n\
+ .word gUnknown_0203855C\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._21:\n\
+ bl CreateBagSprite\n\
+ mov r0, #0x0\n\
+ bl CreateBagPokeballSprite\n\
+ bl sub_80A3740\n\
+ b ._61\n\
+._22:\n\
+ ldr r3, ._63 @ 0x4000208\n\
+ ldrh r2, [r3]\n\
+ mov r0, #0x0\n\
+ strh r0, [r3]\n\
+ ldr r4, ._63 + 4 @ 0x4000200\n\
+ ldrh r0, [r4]\n\
+ mov r1, #0x1\n\
+ orr r0, r0, r1\n\
+ strh r0, [r4]\n\
+ strh r2, [r3]\n\
+ ldr r2, ._63 + 8 @ 0x4000004\n\
+ ldrh r0, [r2]\n\
+ mov r1, #0x8\n\
+ orr r0, r0, r1\n\
+ strh r0, [r2]\n\
+ mov r0, #0x1\n\
+ neg r0, r0\n\
+ mov r1, #0x0\n\
+ str r1, [sp]\n\
+ mov r2, #0x10\n\
+ mov r3, #0x0\n\
+ bl BeginNormalPaletteFade\n\
+ ldr r2, ._63 + 12 @ gPaletteFade\n\
+ ldrb r1, [r2, #0x8]\n\
+ mov r0, #0x7f\n\
+ and r0, r0, r1\n\
+ strb r0, [r2, #0x8]\n\
+ ldr r1, ._63 + 16 @ gMain\n\
+ ldr r0, ._63 + 20 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._62\n\
+._64:\n\
+ .align 2, 0\n\
+._63:\n\
+ .word 0x4000208\n\
+ .word 0x4000200\n\
+ .word 0x4000004\n\
+ .word gPaletteFade\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._23:\n\
+ bl sub_8055870\n\
+ cmp r0, #0x1\n\
+ beq ._66 @cond_branch\n\
+._61:\n\
+ ldr r1, ._67 @ gMain\n\
+ ldr r2, ._67 + 4 @ 0x43c\n\
+ add r1, r1, r2\n\
+._62:\n\
+ ldrb r0, [r1]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r1]\n\
+ b ._66\n\
+._68:\n\
+ .align 2, 0\n\
+._67:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._24:\n\
+ ldr r0, ._71 @ sub_80A3134\n\
+ bl SetVBlankCallback\n\
+ ldr r0, ._71 + 4 @ sub_80A3118\n\
+ bl SetMainCallback2\n\
+ bl sub_80A751C\n\
+ bl sub_80A7630\n\
+ bl sub_80A770C\n\
+ bl sub_80A7828\n\
+ bl sub_80A78B8\n\
+ ldr r0, ._71 + 8 @ gLinkOpen\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x1\n\
+ bne ._69 @cond_branch\n\
+ ldr r0, ._71 + 12 @ 0x600f5e0\n\
+ mov r1, #0x80\n\
+ lsl r1, r1, #0x8\n\
+ ldr r2, ._71 + 16 @ 0x600f800\n\
+ mov r3, #0x0\n\
+ bl debug_sub_8008218\n\
+._69:\n\
+ mov r0, #0x1\n\
+ b ._70\n\
+._72:\n\
+ .align 2, 0\n\
+._71:\n\
+ .word sub_80A3134+1\n\
+ .word sub_80A3118+1\n\
+ .word gLinkOpen\n\
+ .word 0x600f5e0\n\
+ .word 0x600f800\n\
+._66:\n\
+ mov r0, #0x0\n\
+._70:\n\
+ add sp, sp, #0x4\n\
+ pop {r4, r5}\n\
+ pop {r1}\n\
+ bx r1");
+}
+#else
static bool8 SetupBagMultistep(void)
{
u32 index;
@@ -392,12 +785,12 @@ static bool8 SetupBagMultistep(void)
switch (gMain.state)
{
case 0:
- sub_80F9438();
+ ClearVideoCallbacks();
sub_80A34E8();
gMain.state++;
break;
case 1:
- remove_some_task();
+ ScanlineEffect_Stop();
gMain.state++;
break;
case 2:
@@ -405,7 +798,7 @@ static bool8 SetupBagMultistep(void)
gMain.state++;
break;
case 3:
- sub_80F9020();
+ ClearBGTilemapBuffers();
ewramBagSetupStep = 0;
gMain.state++;
break;
@@ -424,11 +817,11 @@ static bool8 SetupBagMultistep(void)
gMain.state++;
break;
case 7:
- SetUpWindowConfig(&gWindowConfig_81E6DFC);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6DFC);
gMain.state++;
break;
case 8:
- MultistepInitMenuWindowBegin(&gWindowConfig_81E6DFC);
+ MultistepInitMenuWindowBegin(&gWindowTemplate_81E6DFC);
gMain.state++;
break;
case 9:
@@ -437,20 +830,20 @@ static bool8 SetupBagMultistep(void)
gMain.state++;
break;
case 10:
- sub_80F944C();
+ ClearVerticalScrollIndicatorPalettes();
LoadScrollIndicatorPalette();
- CreateVerticalScrollIndicators(0, 172, 12);
- CreateVerticalScrollIndicators(1, 172, 148);
- CreateVerticalScrollIndicators(2, 28, 88);
- CreateVerticalScrollIndicators(3, 100, 88);
- sub_80F9988(0, 2);
- sub_80F9988(1, 2);
- sub_80F9988(2, 2);
- sub_80F9988(3, 2);
+ CreateVerticalScrollIndicators(TOP_ARROW, 172, 12);
+ CreateVerticalScrollIndicators(BOTTOM_ARROW, 172, 148);
+ CreateVerticalScrollIndicators(LEFT_ARROW, 28, 88);
+ CreateVerticalScrollIndicators(RIGHT_ARROW, 100, 88);
+ SetVerticalScrollIndicatorPriority(TOP_ARROW, 2);
+ SetVerticalScrollIndicatorPriority(BOTTOM_ARROW, 2);
+ SetVerticalScrollIndicatorPriority(LEFT_ARROW, 2);
+ SetVerticalScrollIndicatorPriority(RIGHT_ARROW, 2);
if (sReturnLocation == RETURN_TO_FIELD_4 || sReturnLocation == RETURN_TO_FIELD_5)
{
- sub_80F979C(2, 1);
- sub_80F979C(3, 1);
+ SetVerticalScrollIndicators(LEFT_ARROW, INVISIBLE);
+ SetVerticalScrollIndicators(RIGHT_ARROW, INVISIBLE);
}
gMain.state++;
break;
@@ -508,6 +901,7 @@ static bool8 SetupBagMultistep(void)
}
return FALSE;
}
+#endif
static bool8 sub_80A34B4(void)
{
@@ -634,6 +1028,79 @@ void ClearBag(void)
ResetBagScrollPositions();
}
+#if DEBUG
+__attribute__((naked))
+void debug_sub_80A3714()
+{
+ asm("\
+ push {r4, r5, r6, lr}\n\
+ add sp, sp, #0xfffffff4\n\
+ mov r5, #0x0\n\
+ ldr r2, ._138 @ gUnknown_Debug_083EBC68\n\
+ mov r1, #0x0\n\
+._134:\n\
+ lsl r0, r5, #0x1\n\
+ add r0, r0, sp\n\
+ strh r1, [r0]\n\
+ add r0, r5, #1\n\
+ lsl r0, r0, #0x10\n\
+ lsr r5, r0, #0x10\n\
+ cmp r5, #0x4\n\
+ bls ._134 @cond_branch\n\
+ mov r5, #0x0\n\
+ ldrh r0, [r2]\n\
+ cmp r0, #0\n\
+ beq ._136 @cond_branch\n\
+ add r6, r2, #0\n\
+._137:\n\
+ lsl r4, r5, #0x2\n\
+ add r4, r4, r6\n\
+ ldrh r0, [r4]\n\
+ bl ItemId_GetPocket\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x8\n\
+ ldr r1, ._138 + 4 @ 0xffff0000\n\
+ add r0, r0, r1\n\
+ lsr r0, r0, #0x10\n\
+ ldr r1, ._138 + 8 @ gBagPockets\n\
+ lsl r2, r0, #0x3\n\
+ add r2, r2, r1\n\
+ lsl r0, r0, #0x1\n\
+ mov r1, sp\n\
+ add r3, r1, r0\n\
+ ldrh r1, [r3]\n\
+ ldr r0, [r2]\n\
+ lsl r1, r1, #0x2\n\
+ add r1, r1, r0\n\
+ ldr r0, [r4]\n\
+ str r0, [r1]\n\
+ ldrh r0, [r3]\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r3]\n\
+ add r0, r5, #1\n\
+ lsl r0, r0, #0x10\n\
+ lsr r5, r0, #0x10\n\
+ cmp r5, #0x3b\n\
+ bhi ._136 @cond_branch\n\
+ lsl r0, r5, #0x2\n\
+ add r0, r0, r6\n\
+ ldrh r0, [r0]\n\
+ cmp r0, #0\n\
+ bne ._137 @cond_branch\n\
+._136:\n\
+ add sp, sp, #0xc\n\
+ pop {r4, r5, r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+._139:\n\
+ .align 2, 0\n\
+._138:\n\
+ .word gUnknown_Debug_083EBC68\n\
+ .word 0xffff0000\n\
+ .word gBagPockets");
+}
+#endif
+
static void sub_80A3740(void)
{
const u16 colors[2] = {RGB(14, 15, 16), RGB_WHITE};
@@ -657,10 +1124,10 @@ static void sub_80A3770(void)
static void sub_80A37C0(u8 taskId)
{
gTasks[taskId].func = sub_80A50C8;
- StartVerticalScrollIndicators(0);
- StartVerticalScrollIndicators(1);
- StartVerticalScrollIndicators(2);
- StartVerticalScrollIndicators(3);
+ StartVerticalScrollIndicators(TOP_ARROW);
+ StartVerticalScrollIndicators(BOTTOM_ARROW);
+ StartVerticalScrollIndicators(LEFT_ARROW);
+ StartVerticalScrollIndicators(RIGHT_ARROW);
}
static void sub_80A37F8(u8 taskId)
@@ -702,8 +1169,8 @@ static void sub_80A37F8(u8 taskId)
sub_80A37C0(FindTaskIdByFunc(sub_80A4F68));
DestroyTask(taskId);
ItemListMenu_InitMenu();
- sub_80F979C(2, 0);
- sub_80F979C(3, 0);
+ SetVerticalScrollIndicators(LEFT_ARROW, VISIBLE);
+ SetVerticalScrollIndicators(RIGHT_ARROW, VISIBLE);
}
}
@@ -1062,7 +1529,7 @@ void sub_80A4164(u8 *dest, u16 value, enum StringConvertMode mode, u8 digits)
void sub_80A418C(u16 value, enum StringConvertMode mode, u8 c, u8 d, u8 digits)
{
sub_80A4164(gStringVar1, value, mode, digits);
- MenuPrint(gStringVar1, c, d);
+ Menu_PrintText(gStringVar1, c, d);
}
static void sub_80A41D4(u8 taskId)
@@ -1112,7 +1579,7 @@ static bool8 sub_80A42B0(u8 itemPos, int b)
return TRUE;
r5 = itemPos * 2 + 2;
sub_8072C74(gStringVar1, gOtherText_CloseBag, 0x78, 0);
- MenuPrint(gStringVar1, 14, r5);
+ Menu_PrintText(gStringVar1, 14, r5);
ptr = gBGTilemapBuffers[2] + 14 + r5 * 32;
ptr[0] = 0x4F;
ptr[1] = 0x4F;
@@ -1121,9 +1588,9 @@ static bool8 sub_80A42B0(u8 itemPos, int b)
if (itemPos == 7)
return TRUE;
if ((b == 1 && r8->unk2 != 0) || b == 2)
- MenuFillWindowRectWithBlankTile(14, r5 + 2, 29, 13);
+ Menu_BlankWindowRect(14, r5 + 2, 29, 13);
else
- MenuFillWindowRectWithBlankTile(14, r5 + 2, 29, 17);
+ Menu_BlankWindowRect(14, r5 + 2, 29, 17);
return TRUE;
}
return FALSE;
@@ -1148,7 +1615,7 @@ static void sub_80A4380(u16 a, int b, int c, int d)
text = sub_8072C74(text, ItemId_GetItem(gCurrentBagPocketItemSlots[r4].itemId)->name, 0x66, 0);
*text++ = CHAR_MULT_SIGN;
sub_8072C14(text, gCurrentBagPocketItemSlots[r4].quantity, 0x78, 1);
- MenuPrint(gStringVar1, 14, r5);
+ Menu_PrintText(gStringVar1, 14, r5);
}
}
@@ -1173,7 +1640,7 @@ static void sub_80A444C(u16 a, int b, int c, int d)
#else
sub_8072C74(text, ItemId_GetItem(gCurrentBagPocketItemSlots[r4].itemId)->name, 0x63, 0);
#endif
- MenuPrint(gStringVar1, 14, r5);
+ Menu_PrintText(gStringVar1, 14, r5);
if (gUnknown_02038558 != 0)
{
if (gCurrentBagPocketItemSlots[r4].itemId == gSaveBlock1.registeredItem)
@@ -1240,7 +1707,7 @@ static void sub_80A4548(u16 a, int b, int c, int d)
moveName = gMoveNames[ItemIdToBattleMoveId(gCurrentBagPocketItemSlots[r4].itemId)];
sub_8072C74(text, moveName, 0x78, 0);
}
- MenuPrint(gStringVar1, 14, sp10);
+ Menu_PrintText(gStringVar1, 14, sp10);
}
}
#else
@@ -1421,7 +1888,7 @@ _080A46AE:\n\
ldr r0, _080A46F8 @ =gStringVar1\n\
movs r1, 0xE\n\
ldr r2, [sp, 0x10]\n\
- bl MenuPrint\n\
+ bl Menu_PrintText\n\
mov r0, r8\n\
adds r0, 0x1\n\
lsls r0, 24\n\
@@ -1482,7 +1949,7 @@ static void sub_80A46FC(u16 a, int b, int c, int d)
text = sub_80A425C(a, text, i);
CopyItemName(gCurrentBagPocketItemSlots[r4].itemId, gStringVar2);
sub_80A41E0(text, gCurrentBagPocketItemSlots[r4].itemId - 0x84, gStringVar2, gCurrentBagPocketItemSlots[r4].quantity, 3);
- MenuPrint(gStringVar1, 14, r5);
+ Menu_PrintText(gStringVar1, 14, r5);
}
}
@@ -1505,14 +1972,14 @@ static void sub_80A47E8(u16 a, int b, int c, int d)
break;
}
if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0)
- sub_80F979C(0, 0);
+ SetVerticalScrollIndicators(TOP_ARROW, VISIBLE);
else
- sub_80F979C(0, 1);
+ SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE);
if ((sReturnLocation != RETURN_TO_FIELD_5 && gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 8 < gBagPocketScrollStates[sCurrentBagPocket].numSlots + 1)
|| (sReturnLocation == RETURN_TO_FIELD_5 && gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 8 < gBagPocketScrollStates[sCurrentBagPocket].numSlots))
- sub_80F979C(1, 0);
+ SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE);
else
- sub_80F979C(1, 1);
+ SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE);
}
static void sub_80A48E8(u16 taskId, int b, int c)
@@ -1540,7 +2007,7 @@ static void ItemListMenu_InitDescription(s16 itemId)
}
if (r5 < 3)
- MenuZeroFillWindowRect(0, 13 + r5 * 2, 13, 20);
+ Menu_EraseWindowRect(0, 13 + r5 * 2, 13, 20);
}
static void ItemListMenu_ChangeDescription(s16 itemId, int b)
@@ -1551,20 +2018,20 @@ static void ItemListMenu_ChangeDescription(s16 itemId, int b)
{
if (b == 0)
{
- MenuZeroFillWindowRect(0, 13, 13, 20);
- MenuPrint_PixelCoords(gOtherText_ReturnTo, 4, 0x68, 0);
+ Menu_EraseWindowRect(0, 13, 13, 20);
+ Menu_PrintTextPixelCoords(gOtherText_ReturnTo, 4, 0x68, 0);
}
else if (b == 1)
{
- MenuPrint_PixelCoords(gUnknown_0840E740[sReturnLocation], 4, 0x78, 0);
+ Menu_PrintTextPixelCoords(gUnknown_0840E740[sReturnLocation], 4, 0x78, 0);
}
}
else
{
if (b == 0)
- MenuZeroFillWindowRect(0, 13, 13, 20);
+ Menu_EraseWindowRect(0, 13, 13, 20);
if (ItemId_CopyDescription(description, itemId, b))
- MenuPrint_PixelCoords(description, 4, 104 + b * 16, 0);
+ Menu_PrintTextPixelCoords(description, 4, 104 + b * 16, 0);
}
}
@@ -1602,9 +2069,9 @@ static void sub_80A4A98(const u8 *text, u32 line)
u8 buffer[100];
if (line == 0)
- MenuZeroFillWindowRect(0, 13, 13, 20);
+ Menu_EraseWindowRect(0, 13, 13, 20);
if (CopyTextLine(buffer, text, line))
- MenuPrint_PixelCoords(buffer, 4, 104 + line * 16, 0);
+ Menu_PrintTextPixelCoords(buffer, 4, 104 + line * 16, 0);
}
static void sub_80A4ADC(u8 taskId)
@@ -1618,7 +2085,7 @@ static void sub_80A4ADC(u8 taskId)
static void sub_80A4B14(s8 a, u8 b)
{
gBagPocketScrollStates[sCurrentBagPocket].scrollTop += a;
- MoveMenuCursor(0);
+ Menu_MoveCursor(0);
sub_80A73C0();
sub_80A763C();
sub_80A4ADC(b);
@@ -1626,7 +2093,7 @@ static void sub_80A4B14(s8 a, u8 b)
static void sub_80A4B58(s8 delta, u8 b)
{
- gBagPocketScrollStates[sCurrentBagPocket].cursorPos = MoveMenuCursor(delta);
+ gBagPocketScrollStates[sCurrentBagPocket].cursorPos = Menu_MoveCursor(delta);
sub_80A73C0();
sub_80A4ADC(b);
}
@@ -1649,7 +2116,7 @@ static void sub_80A4BF0(u16 *a)
if (gUnknown_02038564 == 4)
{
- MenuDrawTextWindow(0, 7, 13, 12);
+ Menu_DrawStdWindowFrame(0, 7, 13, 12);
sub_80A4008(a, 1, 8, 12, 4);
if (sub_80F9344() == TRUE && sReturnLocation == RETURN_TO_FIELD_5)
{
@@ -1665,7 +2132,7 @@ static void sub_80A4BF0(u16 *a)
text = sub_80A4B90(gSpecialVar_ItemId);
else
text = sItemPopupMenuActions[sPopupMenuActionList[i]].text;
- MenuPrint(text, 1 + (i / 2) * 6, 8 + (i % 2) * 2);
+ Menu_PrintText(text, 1 + (i / 2) * 6, 8 + (i % 2) * 2);
}
}
if (sReturnLocation == RETURN_TO_FIELD_5)
@@ -1676,10 +2143,10 @@ static void sub_80A4BF0(u16 *a)
}
else
{
- MenuDrawTextWindow(0, 5, 13, 12);
+ Menu_DrawStdWindowFrame(0, 5, 13, 12);
sub_80A4008(a, 1, 6, 12, 6);
for (i = 0; i < gUnknown_02038564; i++)
- MenuPrint(sItemPopupMenuActions[sPopupMenuActionList[i]].text, 1 + (i / 3) * 6, 6 + (i % 3) * 2);
+ Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[i]].text, 1 + (i / 3) * 6, 6 + (i % 3) * 2);
InitMenu(0, 1, 6, gUnknown_02038564, 0, 1);
sub_8072DCC(0x2F);
}
@@ -1690,7 +2157,7 @@ static void sub_80A4DA4(u16 *a)
{
sub_80A73FC();
sub_80A36B8(a, 0, 6, 13, 6);
- MenuZeroFillWindowRect(0, 5, 13, 12);
+ Menu_EraseWindowRect(0, 5, 13, 12);
sub_80A7590();
}
@@ -1699,7 +2166,7 @@ static void sub_80A4DD8(u8 taskId, u8 b, u8 c, u8 d, u8 e, u8 digits)
gTasks[taskId].data[1] = 1;
gTasks[taskId].data[2] = b + 2;
gTasks[taskId].data[3] = c + 1;
- MenuDrawTextWindow(b, c, b + d, c + e);
+ Menu_DrawStdWindowFrame(b, c, b + d, c + e);
sub_80A4008(gBGTilemapBuffers[1], b + 1, c + 1, d - 1, e - 1);
sub_80A418C(1, 1, b + 2, c + 1, digits);
}
@@ -1707,14 +2174,14 @@ static void sub_80A4DD8(u8 taskId, u8 b, u8 c, u8 d, u8 e, u8 digits)
static void sub_80A4E8C(s8 delta, u8 b)
{
PlaySE(SE_SELECT);
- sub_80F979C(0, 1);
- sub_80F979C(1, 1);
- sub_80F979C(2, 1);
- sub_80F979C(3, 1);
- PauseVerticalScrollIndicator(0);
- PauseVerticalScrollIndicator(1);
- PauseVerticalScrollIndicator(2);
- PauseVerticalScrollIndicator(3);
+ SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE);
+ SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE);
+ SetVerticalScrollIndicators(LEFT_ARROW, INVISIBLE);
+ SetVerticalScrollIndicators(RIGHT_ARROW, INVISIBLE);
+ PauseVerticalScrollIndicator(TOP_ARROW);
+ PauseVerticalScrollIndicator(BOTTOM_ARROW);
+ PauseVerticalScrollIndicator(LEFT_ARROW);
+ PauseVerticalScrollIndicator(RIGHT_ARROW);
ChangePocket(gBGTilemapBuffers[2], delta);
DrawPocketIndicatorDots(gBGTilemapBuffers[2], sCurrentBagPocket);
sub_80A3770();
@@ -1866,10 +2333,10 @@ static void sub_80A50C8(u8 taskId)
gUnknown_02038560 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos;
gSpecialVar_ItemId = gCurrentBagPocketItemSlots[gUnknown_02038560].itemId;
gUnknown_083C16BC[sReturnLocation].onItemSelect(taskId);
- sub_80F98A4(0);
- sub_80F98A4(1);
- sub_80F98A4(2);
- sub_80F98A4(3);
+ StopVerticalScrollIndicators(TOP_ARROW);
+ StopVerticalScrollIndicators(BOTTOM_ARROW);
+ StopVerticalScrollIndicators(LEFT_ARROW);
+ StopVerticalScrollIndicators(RIGHT_ARROW);
sub_80A797C();
}
else
@@ -1901,7 +2368,7 @@ static void sub_80A50C8(u8 taskId)
}
}
-bool8 sub_80A52C4(u8 taskId, u16 b)
+bool8 SellMenu_QuantityRoller(u8 taskId, u16 b)
{
s16 *taskData = gTasks[taskId].data;
@@ -1948,7 +2415,7 @@ static bool8 sub_80A5350(u8 taskId)
{
s16 *taskData = gTasks[taskId].data;
- if (sub_80A52C4(taskId, gCurrentBagPocketItemSlots[gUnknown_02038560].quantity) == TRUE)
+ if (SellMenu_QuantityRoller(taskId, gCurrentBagPocketItemSlots[gUnknown_02038560].quantity) == TRUE)
{
// if (sCurrentBagPocket == BAG_POCKET_BERRIES) Can't get it to match this way
if (sCurrentBagPocket + 1 == BAG_POCKET_BERRIES + 1)
@@ -2539,7 +3006,7 @@ static void sub_80A57C4(void)
r5 = 7;
}
sub_80A4008(gBGTilemapBuffers[1], 7, r5 + 1, 6, gUnknown_02038564 * 2);
- MenuDrawTextWindow(6, r5, 13, gUnknown_02038564 * 2 + 1 + r5);
+ Menu_DrawStdWindowFrame(6, r5, 13, gUnknown_02038564 * 2 + 1 + r5);
sub_80A7834(0, r5);
InitMenu(0, 7, r5 + 1, gUnknown_02038564, 0, 6);
}
@@ -2553,7 +3020,7 @@ static void sub_80A5888(u8 taskId)
if (sPopupMenuSelection != 0)
{
PlaySE(SE_SELECT);
- sPopupMenuSelection = MoveMenuCursor(-1);
+ sPopupMenuSelection = Menu_MoveCursor(-1);
}
}
else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
@@ -2561,7 +3028,7 @@ static void sub_80A5888(u8 taskId)
if (sPopupMenuSelection != gUnknown_02038564 - 1)
{
PlaySE(SE_SELECT);
- sPopupMenuSelection = MoveMenuCursor(1);
+ sPopupMenuSelection = Menu_MoveCursor(1);
}
}
else if (gMain.newKeys & A_BUTTON)
@@ -2690,14 +3157,14 @@ static void sub_80A5C24(u8 taskId)
void CleanUpItemMenuMessage(u8 taskId)
{
sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31);
- MenuZeroFillWindowRect(7, 7, 13, 12);
- MenuZeroFillWindowRect(0, 14, 29, 19);
+ Menu_EraseWindowRect(7, 7, 13, 12);
+ Menu_EraseWindowRect(0, 14, 29, 19);
gTasks[taskId].func = sub_80A5C24;
}
void CleanUpOverworldMessage(u8 taskId)
{
- MenuZeroFillWindowRect(0, 13, 29, 19);
+ Menu_EraseWindowRect(0, 13, 29, 19);
DestroyTask(taskId);
sub_8064E2C();
ScriptContext2_Disable();
@@ -2711,7 +3178,7 @@ void ExecuteItemUseFromBlackPalette(void)
static void Task_CallItemUseOnFieldCallback(u8 taskId)
{
- if (sub_807D770() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
gFieldItemUseCallback(taskId);
}
@@ -2760,7 +3227,7 @@ static void sub_80A5DA0(u16 itemId, u16 quantity)
static void sub_80A5DF8(void)
{
sub_80A4DA4(gBGTilemapBuffers[1]);
- MenuZeroFillWindowRect(7, 6, 11, 13);
+ Menu_EraseWindowRect(7, 6, 11, 13);
sub_80A7528(4);
}
@@ -2857,7 +3324,7 @@ static void sub_80A6024(u8 taskId)
if (gMain.newKeys & A_BUTTON)
{
sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31);
- MenuZeroFillWindowRect(0, 14, 29, 19);
+ Menu_EraseWindowRect(0, 14, 29, 19);
gTasks[taskId].func = sub_80A6000;
}
}
@@ -2963,7 +3430,7 @@ static void sub_80A62D8(void)
gUnknown_02038563 = CreateTask(sub_80A50C8, 0);
}
-void sub_80A6300(void)
+void ItemMenu_LoadSellMenu(void)
{
sReturnLocation = RETURN_TO_SHOP;
SetMainCallback2(sub_80A62D8);
@@ -2971,7 +3438,7 @@ void sub_80A6300(void)
static void OnBagClose_Shop(u8 taskId)
{
- gFieldCallback = sub_80B3050;
+ gFieldCallback = Shop_FadeReturnToMartMenu;
gTasks[taskId].data[8] = (u32)c2_exit_to_overworld_2_switch >> 16;
gTasks[taskId].data[9] = (u32)c2_exit_to_overworld_2_switch;
sub_80A5AE4(taskId);
@@ -3008,7 +3475,7 @@ static void sub_80A640C(u8 taskId)
static void sub_80A6444(u8 taskId)
{
sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31);
- MenuZeroFillWindowRect(0, 14, 29, 19);
+ Menu_EraseWindowRect(0, 14, 29, 19);
gTasks[taskId].func = sub_80A640C;
}
@@ -3016,7 +3483,7 @@ static void sub_80A648C(u8 taskId)
{
gTasks[taskId].func = Task_BuyHowManyDialogueHandleInput;
sub_80A4008(gBGTilemapBuffers[1], 1, 11, 12, 2);
- MenuDrawTextWindow(0, 10, 13, 13);
+ Menu_DrawStdWindowFrame(0, 10, 13, 13);
gTasks[taskId].data[1] = 1;
gTasks[taskId].data[2] = 1;
gTasks[taskId].data[3] = 11;
@@ -3053,7 +3520,7 @@ static void sub_80A6574(u8 taskId)
static void sub_80A65AC(u8 taskId)
{
- MenuZeroFillWindowRect(7, 6, 13, 12);
+ Menu_EraseWindowRect(7, 6, 13, 12);
sub_80A36B8(gBGTilemapBuffers[1], 7, 6, 6, 6);
CopyItemName(gSpecialVar_ItemId, gStringVar2);
StringExpandPlaceholders(gStringVar4, gOtherText_SoldItem);
@@ -3063,7 +3530,7 @@ static void sub_80A65AC(u8 taskId)
static void sub_80A6618(u8 taskId)
{
- MenuZeroFillWindowRect(7, 6, 13, 12);
+ Menu_EraseWindowRect(7, 6, 13, 12);
sub_80A36B8(gBGTilemapBuffers[1], 7, 6, 6, 6);
BuyMenuPrintItemQuantityAndPrice(taskId);
}
@@ -3078,13 +3545,13 @@ static void Task_BuyHowManyDialogueHandleInput(u8 taskId)
{
if (sub_80A5350(taskId) == TRUE)
{
- MenuZeroFillWindowRect(6, 11, 12, 11);
+ Menu_EraseWindowRect(6, 11, 12, 11);
BuyMenuDisplayMessage(gSpecialVar_ItemId, gTasks[taskId].data[1]);
}
else if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
- MenuZeroFillWindowRect(0, 10, 13, 13);
+ Menu_EraseWindowRect(0, 10, 13, 13);
sub_80A36B8(gBGTilemapBuffers[1], 0, 10, 13, 3);
ConvertIntToDecimalStringN(gStringVar1, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * gTasks[taskId].data[1], STR_CONV_MODE_LEFT_ALIGN, 6);
StringExpandPlaceholders(gStringVar4, gOtherText_CanPay);
@@ -3110,8 +3577,8 @@ static void BuyMenuPrintItemQuantityAndPrice(u8 taskId)
{
sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31);
CloseMoneyWindow(0, 0);
- MenuZeroFillWindowRect(0, 4, 13, 13);
- MenuZeroFillWindowRect(0, 14, 29, 19);
+ Menu_EraseWindowRect(0, 4, 13, 13);
+ Menu_EraseWindowRect(0, 14, 29, 19);
gTasks[taskId].func = sub_80A6760;
}
@@ -3229,7 +3696,7 @@ static void sub_80A6A84(u8 taskId)
sub_80A4DA4(gBGTilemapBuffers[1]);
CopyItemName(gSpecialVar_ItemId, gStringVar1);
ConvertIntToDecimalStringN(gStringVar2, taskData[1], STR_CONV_MODE_LEFT_ALIGN, 3);
- MenuZeroFillWindowRect(7, 6, 11, 13);
+ Menu_EraseWindowRect(7, 6, 11, 13);
sub_80A7528(7);
sub_80A3D5C(taskId);
gTasks[taskId].func = sub_80A5E1C;
@@ -3361,16 +3828,16 @@ static void sub_80A6DF0(u16 *a)
{
u8 r6 = (gUnknown_02038564 - 1) * 2;
- MenuDrawTextWindow(7, 9 - r6, 13, 12);
+ Menu_DrawStdWindowFrame(7, 9 - r6, 13, 12);
sub_80A4008(a, 8, 10 - r6, 5, r6 + 2);
if (gUnknown_02038564 == 1)
{
- MenuPrint(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 10);
+ Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 10);
}
else
{
- MenuPrint(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 8);
- MenuPrint(sItemPopupMenuActions[sPopupMenuActionList[1]].text, 8, 10);
+ Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 8);
+ Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[1]].text, 8, 10);
}
InitMenu(0, 8, 10 - r6, gUnknown_02038564, 0, 5);
sub_80A7528(2);
@@ -3383,7 +3850,7 @@ static void sub_80A6EB8(u8 taskId)
if (sPopupMenuSelection == 1)
{
PlaySE(SE_SELECT);
- sPopupMenuSelection = MoveMenuCursor(-1);
+ sPopupMenuSelection = Menu_MoveCursor(-1);
}
}
else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN)
@@ -3391,7 +3858,7 @@ static void sub_80A6EB8(u8 taskId)
if (sPopupMenuSelection + 1 < gUnknown_02038564)
{
PlaySE(SE_SELECT);
- sPopupMenuSelection = MoveMenuCursor(1);
+ sPopupMenuSelection = Menu_MoveCursor(1);
}
}
else if (gMain.newKeys & A_BUTTON)
@@ -3523,8 +3990,8 @@ static void sub_80A7230(u8 taskId)
break;
case 204:
PlaySE(SE_SELECT);
- sub_80F98A4(2);
- sub_80F98A4(3);
+ StopVerticalScrollIndicators(LEFT_ARROW);
+ StopVerticalScrollIndicators(RIGHT_ARROW);
gSpecialVar_ItemId = ITEM_POKE_BALL;
sPopupMenuActionList = gUnknown_083C1708;
gUnknown_02038564 = 2;
@@ -3559,7 +4026,7 @@ static void ItemListMenu_InitMenu(void)
static void sub_80A73C0(void)
{
- sub_814AD7C(0x70, gBagPocketScrollStates[sCurrentBagPocket].cursorPos * 16 + 16);
+ MenuCursor_SetPos814AD7C(0x70, gBagPocketScrollStates[sCurrentBagPocket].cursorPos * 16 + 16);
}
static void sub_80A73F0(void)
@@ -3569,16 +4036,53 @@ static void sub_80A73F0(void)
static void sub_80A73FC(void)
{
- HandleDestroyMenuCursors();
- sub_814AD44();
+ Menu_DestroyCursor();
+ MenuCursor_Destroy814AD44();
}
+#if DEBUG
+__attribute__((naked))
+static void sub_80A740C(void)
+{
+ asm("\
+ push {lr}\n\
+ add sp, sp, #0xfffffffc\n\
+ bl sub_80A75E4\n\
+ bl sub_80A7768\n\
+ bl sub_80A7420\n\
+ ldr r0, ._931 @ gLinkOpen\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x1\n\
+ bne ._930 @cond_branch\n\
+ ldr r0, ._931 + 4 @ gLink\n\
+ ldr r1, ._931 + 8 @ 0xfbd\n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ mov r1, #0x0\n\
+ str r1, [sp]\n\
+ mov r1, #0x1\n\
+ mov r2, #0x1\n\
+ mov r3, #0x2\n\
+ bl debug_sub_8008264\n\
+._930:\n\
+ add sp, sp, #0x4\n\
+ pop {r0}\n\
+ bx r0\n\
+._932:\n\
+ .align 2, 0\n\
+._931:\n\
+ .word gLinkOpen\n\
+ .word gLink\n\
+ .word 0xfbd");
+}
+#else
static void sub_80A740C(void)
{
sub_80A75E4();
sub_80A7768();
sub_80A7420();
}
+#endif
static void sub_80A7420(void)
{
@@ -3669,7 +4173,7 @@ static void sub_80A756C(void)
static void sub_80A7590(void)
{
- MenuZeroFillWindowRect(0, 13, 13, 20);
+ Menu_EraseWindowRect(0, 13, 13, 20);
sub_80A756C();
}
@@ -3748,7 +4252,7 @@ static void sub_80A7694(void)
static void sub_80A76A0(void)
{
- MenuZeroFillWindowRect(14, 2, 29, 18);
+ Menu_EraseWindowRect(14, 2, 29, 18);
sub_80A7678();
}
@@ -3816,7 +4320,7 @@ static void sub_80A7768(void)
const u8 *text = sItemPopupMenuActions[sPopupMenuActionList[r4->unk1 - 1]].text;
int var = r4->unk1 - 1;
- MenuPrint(text, 7, var * 2 + 1 + r4->unk3);
+ Menu_PrintText(text, 7, var * 2 + 1 + r4->unk3);
}
else
{
@@ -3828,7 +4332,7 @@ static void sub_80A7768(void)
else
text = sItemPopupMenuActions[sPopupMenuActionList[r4->unk1 - 1]].text;
var = r4->unk1 - 1;
- MenuPrint(text, (var >> 1) * 6 + 1, (var & 1) * 2 + 8);
+ Menu_PrintText(text, (var >> 1) * 6 + 1, (var & 1) * 2 + 8);
}
if (r4->unk1 == gUnknown_02038564)
{
diff --git a/src/field/item_use.c b/src/field/item_use.c
index e1fdddce0..219ef5080 100644
--- a/src/field/item_use.c
+++ b/src/field/item_use.c
@@ -40,7 +40,7 @@
extern void (*gFieldItemUseCallback)(u8);
extern void (*gFieldCallback)(void);
extern void (*gUnknown_0300485C)(void);
-extern void (*gUnknown_03004AE4)(u8, u16, TaskFunc);
+extern void (*gPokemonItemUseCallback)(u8, u16, TaskFunc);
extern u8 gUnknown_02038561;
extern u8 gLastFieldPokeMenuOpened;
@@ -100,7 +100,7 @@ void ItemMenu_ConfirmNormalFade(u8 var)
void ItemMenu_ConfirmComplexFade(u8 var)
{
ExecuteSwitchToOverworldFromItemUse(var);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
void SetUpItemUseOnFieldCallback(u8 taskId)
@@ -123,7 +123,7 @@ void HandleDeniedItemUseMessage(u8 var1, u8 playerMenuStatus, const u8 *text)
switch (playerMenuStatus)
{
case 0: // Item Menu
- MenuZeroFillWindowRect(0, 13, 13, 20);
+ Menu_EraseWindowRect(0, 13, 13, 20);
DisplayItemMessageOnField(var1, gStringVar4, CleanUpItemMenuMessage, 1);
break;
default: // Field
@@ -259,7 +259,7 @@ void ItemUseOnFieldCB_Rod(u8 taskId)
void ItemUseOutOfBattle_Itemfinder(u8 var)
{
- IncrementGameStat(0x27);
+ IncrementGameStat(GAME_STAT_USED_ITEMFINDER);
gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Itemfinder;
SetUpItemUseOnFieldCallback(var);
}
@@ -312,7 +312,7 @@ void RunItemfinderResults(u8 taskId)
void ExitItemfinder(u8 taskId)
{
- MenuZeroFillWindowRect(0, 14, 29, 19);
+ Menu_EraseWindowRect(0, 14, 29, 19);
sub_8064E2C();
ScriptContext2_Disable();
DestroyTask(taskId);
@@ -744,7 +744,7 @@ void ItemUseOutOfBattle_CoinCase(u8 taskId)
if (!gTasks[taskId].data[2])
{
- MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14);
+ Menu_EraseWindowRect(0, 0xD, 0xD, 0x14);
DisplayItemMessageOnField(taskId, gStringVar4, CleanUpItemMenuMessage, 1);
}
else
@@ -770,7 +770,7 @@ void ItemUseOutOfBattle_SSTicket(u8 taskId)
{
if (gTasks[taskId].data[2] == 0)
{
- MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14);
+ Menu_EraseWindowRect(0, 0xD, 0xD, 0x14);
DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gSpecialVar_ItemId)], sub_80C9BB8, 1);
}
else
@@ -832,7 +832,7 @@ void sub_80C9D98(u8 taskId)
void ItemUseOutOfBattle_Medicine(u8 taskId)
{
- gUnknown_03004AE4 = UseMedicine;
+ gPokemonItemUseCallback = UseMedicine;
sub_80C9D98(taskId);
}
@@ -850,34 +850,34 @@ void ItemUseOutOfBattle_SacredAsh(u8 taskId)
break;
}
}
- gUnknown_03004AE4 = sub_8070048;
+ gPokemonItemUseCallback = sub_8070048;
gUnknown_02038561 = 4;
ItemMenu_ConfirmNormalFade(taskId);
}
void ItemUseOutOfBattle_PPRecovery(u8 taskId)
{
- gUnknown_03004AE4 = DoPPRecoveryItemEffect;
+ gPokemonItemUseCallback = DoPPRecoveryItemEffect;
sub_80C9D98(taskId);
}
void ItemUseOutOfBattle_PPUp(u8 taskId)
{
- gUnknown_03004AE4 = DoPPUpItemEffect;
+ gPokemonItemUseCallback = DoPPUpItemEffect;
sub_80C9D98(taskId);
}
void ItemUseOutOfBattle_RareCandy(u8 taskId)
{
- gUnknown_03004AE4 = DoRareCandyItemEffect;
+ gPokemonItemUseCallback = DoRareCandyItemEffect;
sub_80C9D98(taskId);
}
void ItemUseOutOfBattle_TMHM(u8 taskId)
{
- MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14);
+ Menu_EraseWindowRect(0, 0xD, 0xD, 0x14);
- if (gSpecialVar_ItemId >= ITEM_HM01)
+ if (gSpecialVar_ItemId >= ITEM_HM01_CUT)
DisplayItemMessageOnField(taskId, gOtherText_BootedHM, sub_80C9EE4, 1); // HM
else
DisplayItemMessageOnField(taskId, gOtherText_BootedTM, sub_80C9EE4, 1); // TM
@@ -908,7 +908,7 @@ void sub_80C9F80(u8 var)
void sub_80C9FC0(u8 var)
{
- gUnknown_03004AE4 = TeachMonTMMove;
+ gPokemonItemUseCallback = TeachMonTMMove;
sub_80C9D98(var);
}
@@ -1009,7 +1009,7 @@ void ItemUseOutOfBattle_EscapeRope(u8 taskId)
void ItemUseOutOfBattle_EvolutionStone(u8 var)
{
- gUnknown_03004AE4 = DoEvolutionStoneItemEffect;
+ gPokemonItemUseCallback = DoEvolutionStoneItemEffect;
sub_80C9D98(var);
}
@@ -1022,7 +1022,7 @@ void ItemUseInBattle_PokeBall(u8 var)
}
else
{
- MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14);
+ Menu_EraseWindowRect(0, 0xD, 0xD, 0x14);
DisplayItemMessageOnField(var, gOtherText_BoxIsFull, CleanUpItemMenuMessage, 1);
}
}
@@ -1047,7 +1047,7 @@ void ItemUseInBattle_StatIncrease(u8 taskId)
{
u16 partyId = gBattlePartyID[gBankInMenu];
- MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14);
+ Menu_EraseWindowRect(0, 0xD, 0xD, 0x14);
if (ExecuteTableBasedItemEffect_(&gPlayerParty[partyId], gSpecialVar_ItemId, partyId, 0) != FALSE)
{
@@ -1078,25 +1078,25 @@ void sub_80CA3C0(u8 taskId)
void ItemUseInBattle_Medicine(u8 var)
{
- gUnknown_03004AE4 = UseMedicine;
+ gPokemonItemUseCallback = UseMedicine;
sub_80CA3C0(var);
}
void unref_sub_80CA410(u8 var)
{
- gUnknown_03004AE4 = sub_8070048;
+ gPokemonItemUseCallback = sub_8070048;
sub_80CA3C0(var);
}
void ItemUseInBattle_PPRecovery(u8 var)
{
- gUnknown_03004AE4 = DoPPRecoveryItemEffect;
+ gPokemonItemUseCallback = DoPPRecoveryItemEffect;
sub_80CA3C0(var);
}
void unref_sub_80CA448(u8 var)
{
- MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14);
+ Menu_EraseWindowRect(0, 0xD, 0xD, 0x14);
if (ExecuteTableBasedItemEffect__(0, gSpecialVar_ItemId, 0) == FALSE)
{
@@ -1113,7 +1113,7 @@ void unref_sub_80CA448(u8 var)
void ItemUseInBattle_Escape(u8 taskId)
{
- MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14);
+ Menu_EraseWindowRect(0, 0xD, 0xD, 0x14);
if((gBattleTypeFlags & BATTLE_TYPE_TRAINER) == FALSE)
{
diff --git a/src/field/map_name_popup.c b/src/field/map_name_popup.c
index 2e2dfc72e..49a470cc1 100644
--- a/src/field/map_name_popup.c
+++ b/src/field/map_name_popup.c
@@ -89,8 +89,8 @@ void HideMapNamePopup(void)
{
if (FuncIsActiveTask(Task_MapNamePopup))
{
- MenuLoadTextWindowGraphics();
- MenuZeroFillWindowRect(0, 0, 13, 3);
+ Menu_LoadStdFrameGraphics();
+ Menu_EraseWindowRect(0, 0, 13, 3);
REG_BG0VOFS = 0;
DestroyTask(sTaskId);
}
@@ -100,8 +100,8 @@ void DrawMapNamePopup(void)
{
u8 name[20];
- MenuLoadTextWindowGraphics_OverrideFrameType(0);
+ Menu_LoadStdFrameGraphicsOverrideStyle(0);
GetMapSectionName(name, gMapHeader.regionMapSectionId, 0);
- MenuDrawTextWindow(0, 0, 13, 3);
+ Menu_DrawStdWindowFrame(0, 0, 13, 3);
sub_8072BD8(name, 1, 1, 0x60);
}
diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c
index 4db513f65..b42c50513 100644
--- a/src/field/mauville_man.c
+++ b/src/field/mauville_man.c
@@ -250,7 +250,88 @@ void SetupMauvilleOldMan(void)
sub_80F83D0();
}
-static u8 GetCurrentMauvilleOldMan(void)
+#if DEBUG
+__attribute__((naked))
+void debug_sub_810B32C()
+{
+ asm(
+ " push {r4, lr}\n"
+ " add sp, sp, #0xfffffff8\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r0, #0x4\n"
+ " bhi ._37 @cond_branch\n"
+ " lsl r0, r0, #0x2\n"
+ " ldr r1, ._23 @ \n"
+ " add r0, r0, r1\n"
+ " ldr r0, [r0]\n"
+ " mov pc, r0\n"
+ "._24:\n"
+ " .align 2, 0\n"
+ "._23:\n"
+ " .word ._22\n"
+ "._22:\n"
+ " .word ._25\n"
+ " .word ._26\n"
+ " .word ._27\n"
+ " .word ._28\n"
+ " .word ._29\n"
+ "._25:\n"
+ " bl SetupBard\n"
+ " b ._37\n"
+ "._26:\n"
+ " mov r2, #0x0\n"
+ " ldr r3, ._34 @ gSaveBlock1\n"
+ "._31:\n"
+ " mov r0, sp\n"
+ " add r1, r0, r2\n"
+ " add r0, r2, r3\n"
+ " ldrb r0, [r0]\n"
+ " strb r0, [r1]\n"
+ " add r0, r2, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r2, r0, #0x18\n"
+ " cmp r2, #0x7\n"
+ " bls ._31 @cond_branch\n"
+ " bl SetupHipster\n"
+ " mov r2, #0x0\n"
+ " ldr r3, ._34 @ gSaveBlock1\n"
+ "._32:\n"
+ " add r1, r2, r3\n"
+ " mov r4, sp\n"
+ " add r0, r4, r2\n"
+ " ldrb r0, [r0]\n"
+ " strb r0, [r1]\n"
+ " add r0, r2, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r2, r0, #0x18\n"
+ " cmp r2, #0x7\n"
+ " bls ._32 @cond_branch\n"
+ " b ._37\n"
+ "._35:\n"
+ " .align 2, 0\n"
+ "._34:\n"
+ " .word gSaveBlock1+0x2d8c\n"
+ "._27:\n"
+ " bl SetupTrader\n"
+ " b ._37\n"
+ "._28:\n"
+ " bl SetupStoryteller\n"
+ " b ._37\n"
+ "._29:\n"
+ " bl SetupGiddy\n"
+ "._37:\n"
+ " bl sub_80F83D0\n"
+ " add sp, sp, #0x8\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "\n"
+ );
+}
+#endif
+
+u8 GetCurrentMauvilleOldMan(void)
{
struct MauvilleManCommon *common = &gSaveBlock1.mauvilleMan.common;
@@ -345,7 +426,7 @@ void PrepareSongText(void)
void ScrSpecial_PlayBardSong(void)
{
StartBardSong(gSpecialVar_0x8004);
- MenuDisplayMessageBox();
+ Menu_DisplayDialogueFrame();
ScriptContext1_Stop();
}
@@ -858,8 +939,8 @@ static void Task_BardSong(u8 taskId)
{
case 0: // Initialize song
PrepareSongText();
- InitWindowFromConfig(gMenuWindowPtr, &gWindowConfig_81E6CE4);
- sub_8002EB0(gMenuWindowPtr, gStringVar4, 2, 4, 15);
+ Text_InitWindowWithTemplate(gMenuWindowPtr, &gWindowTemplate_81E6CE4);
+ Text_InitWindow8002EB0(gMenuWindowPtr, gStringVar4, 2, 4, 15);
task->data[1] = 0;
task->data[2] = 0;
task->tCharIndex = 0;
@@ -921,7 +1002,7 @@ static void Task_BardSong(u8 taskId)
}
else if (gStringVar4[task->tCharIndex] == CHAR_SPACE)
{
- sub_8003418(gMenuWindowPtr);
+ Text_PrintWindowSimple(gMenuWindowPtr);
task->tCharIndex++;
task->tState = 2;
task->data[2] = 0;
@@ -941,7 +1022,7 @@ static void Task_BardSong(u8 taskId)
else if (gStringVar4[task->tCharIndex] == CHAR_SONG_WORD_SEPARATOR)
{
gStringVar4[task->tCharIndex] = CHAR_SPACE; // restore it back to a space
- sub_8003418(gMenuWindowPtr);
+ Text_PrintWindowSimple(gMenuWindowPtr);
task->tCharIndex++;
task->data[2] = 0;
}
@@ -950,7 +1031,7 @@ static void Task_BardSong(u8 taskId)
switch (task->data[1])
{
case 0:
- sub_8003418(gMenuWindowPtr);
+ Text_PrintWindowSimple(gMenuWindowPtr);
task->data[1]++;
break;
case 1:
@@ -1219,7 +1300,7 @@ static void PrintStoryList(void)
{
s32 i;
- MenuDrawTextWindow(0, 0, 25, 4 + GetFreeStorySlot() * 2);
+ Menu_DrawStdWindowFrame(0, 0, 25, 4 + GetFreeStorySlot() * 2);
for (i = 0; i < 4; i++)
{
struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller;
@@ -1227,9 +1308,9 @@ static void PrintStoryList(void)
if (stat == 0)
break;
- MenuPrint(GetStoryTitleByStat(stat), 1, 2 + i * 2);
+ Menu_PrintText(GetStoryTitleByStat(stat), 1, 2 + i * 2);
}
- MenuPrint(gPCText_Cancel, 1, 2 + i * 2);
+ Menu_PrintText(gPCText_Cancel, 1, 2 + i * 2);
}
static u8 gUnknown_03000748;
@@ -1247,7 +1328,7 @@ static void Task_StoryListMenu(u8 taskId)
task->data[0]++;
break;
case 1:
- selection = ProcessMenuInput();
+ selection = Menu_ProcessInput();
if (selection == -2)
break;
if (selection == -1 || selection == GetFreeStorySlot())
@@ -1259,8 +1340,8 @@ static void Task_StoryListMenu(u8 taskId)
gSpecialVar_Result = 1;
gUnknown_03000748 = selection;
}
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 25, 12);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 25, 12);
DestroyTask(taskId);
EnableBothScriptContexts();
break;
diff --git a/src/field/menu_helpers.c b/src/field/menu_helpers.c
index e3ef0c790..388d98ec7 100644
--- a/src/field/menu_helpers.c
+++ b/src/field/menu_helpers.c
@@ -18,7 +18,7 @@
static void sub_80F9834(struct Sprite *sprite);
-static EWRAM_DATA u8 gUnknown_020388C0[4] = {0};
+static EWRAM_DATA u8 gVerticalScrollIndicatorIds[4] = {0};
static EWRAM_DATA struct YesNoFuncTable gUnknown_020388C4 = {0};
static TaskFunc gUnknown_0300074C;
@@ -125,7 +125,7 @@ static const struct SpriteTemplate gSpriteTemplate_83E5A00 =
.callback = SpriteCallbackDummy,
};
-void sub_80F9020(void)
+void ClearBGTilemapBuffers(void)
{
memset(&gBGTilemapBuffers[1], 0, 0x800);
memset(&gBGTilemapBuffers[2], 0, 0x800);
@@ -135,7 +135,7 @@ void sub_80F9020(void)
// display message box, fill box with tile if tile is not zero, print string
static void PrintMessage(const u8 *str, u16 tile)
{
- MenuDisplayMessageBox();
+ Menu_DisplayDialogueFrame();
if (tile)
{
sub_80A3FA0(&gBGTilemapBuffers[1][0], 2, 15, 26, 4, tile);
@@ -145,7 +145,7 @@ static void PrintMessage(const u8 *str, u16 tile)
static void sub_80F9090(u8 taskId)
{
- if (MenuUpdateWindowText() == TRUE)
+ if (Menu_UpdateWindowText() == TRUE)
{
gUnknown_0300074C(taskId);
}
@@ -160,7 +160,7 @@ void DisplayItemMessageOnField(u8 taskId, const u8 *str, TaskFunc callback, u16
static void Task_CallYesOrNoCallback(u8 taskId)
{
- switch (ProcessMenuInputNoWrap_())
+ switch (Menu_ProcessInputNoWrap_())
{
case 0:
PlaySE(SE_SELECT);
@@ -196,7 +196,7 @@ static void PrintStringWithPalette(const u8 *str, u8 paletteNum, u8 left, u8 top
StringCopy(gStringVar4, str);
}
- MenuPrint(gStringVar4, left, top);
+ Menu_PrintText(gStringVar4, left, top);
}
// unused
@@ -209,7 +209,7 @@ void PrintNumberWithPalette(s32 value, u8 paletteNum, u8 n, u8 mode, u8 left, u8
}
else
{
- MenuPrint(gStringVar1, left, top);
+ Menu_PrintText(gStringVar1, left, top);
}
}
@@ -296,9 +296,6 @@ bool8 sub_80F9344(void)
void sub_80F9368(void)
{
- u8 *addr;
- u32 size;
-
REG_DISPCNT = 0;
REG_BG3CNT = 0;
REG_BG2CNT = 0;
@@ -312,38 +309,24 @@ void sub_80F9368(void)
REG_BG1VOFS = 0;
REG_BG0HOFS = 0;
REG_BG0VOFS = 0;
-
- addr = (u8 *)VRAM;
- size = 0x18000;
- while (1)
- {
- DmaFill16(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill16(3, 0, addr, size);
- break;
- }
- }
-
+ DmaFill16Large(3, 0, (u8 *)VRAM, 0x18000, 0x1000);
DmaClear32(3, OAM, OAM_SIZE);
DmaClear16(3, PLTT, PLTT_SIZE);
}
-void sub_80F9438(void)
+void ClearVideoCallbacks(void)
{
SetVBlankCallback(NULL);
SetHBlankCallback(NULL);
}
-void sub_80F944C(void)
+void ClearVerticalScrollIndicatorPalettes(void)
{
u8 i;
for (i = 0; i < 4; i++)
{
- gUnknown_020388C0[i] = 0xFF;
+ gVerticalScrollIndicatorIds[i] = 0xFF;
}
FreeSpritePaletteByTag(SCROLL_INDICATOR_PAL_TAG);
@@ -401,92 +384,92 @@ void CreateVerticalScrollIndicators(u8 id, u16 x, u16 y)
switch (id)
{
- case 0:
- if (gUnknown_020388C0[0] == 0xFF)
+ case TOP_ARROW:
+ if (gVerticalScrollIndicatorIds[TOP_ARROW] == 0xFF)
{
- gUnknown_020388C0[0] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0);
- gSprites[gUnknown_020388C0[0]].data[2] = -1;
- if (gUnknown_020388C0[1] != 0xFF)
+ gVerticalScrollIndicatorIds[TOP_ARROW] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0);
+ gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[2] = -1;
+ if (gVerticalScrollIndicatorIds[BOTTOM_ARROW] != 0xFF)
{
- gSprites[gUnknown_020388C0[0]].pos2.y = gSprites[gUnknown_020388C0[1]].pos2.y * -1;
- gSprites[gUnknown_020388C0[0]].data[3] = gSprites[gUnknown_020388C0[1]].data[3];
+ gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].pos2.y = gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].pos2.y * -1;
+ gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[3] = gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[3];
}
else
{
- gSprites[gUnknown_020388C0[0]].data[3] = 0;
+ gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[3] = 0;
}
}
break;
- case 1:
- if (gUnknown_020388C0[1] == 0xFF)
+ case BOTTOM_ARROW:
+ if (gVerticalScrollIndicatorIds[BOTTOM_ARROW] == 0xFF)
{
- gUnknown_020388C0[1] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0);
- gSprites[gUnknown_020388C0[1]].data[2] = 1;
- if (gUnknown_020388C0[0] != 0xFF)
+ gVerticalScrollIndicatorIds[BOTTOM_ARROW] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0);
+ gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[2] = 1;
+ if (gVerticalScrollIndicatorIds[TOP_ARROW] != 0xFF)
{
- gSprites[gUnknown_020388C0[1]].pos2.y = gSprites[gUnknown_020388C0[0]].pos2.y * -1;
- gSprites[gUnknown_020388C0[1]].data[3] = gSprites[gUnknown_020388C0[0]].data[3];
+ gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].pos2.y = gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].pos2.y * -1;
+ gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[3] = gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[3];
}
else
{
- gSprites[gUnknown_020388C0[1]].data[3] = 0;
+ gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[3] = 0;
}
}
break;
- case 2:
- if (gUnknown_020388C0[2] == 0xFF)
+ case LEFT_ARROW:
+ if (gVerticalScrollIndicatorIds[LEFT_ARROW] == 0xFF)
{
- gUnknown_020388C0[2] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0);
- gSprites[gUnknown_020388C0[2]].data[0] = -1;
- if (gUnknown_020388C0[3] != 0xFF)
+ gVerticalScrollIndicatorIds[LEFT_ARROW] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0);
+ gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[0] = -1;
+ if (gVerticalScrollIndicatorIds[RIGHT_ARROW] != 0xFF)
{
- gSprites[gUnknown_020388C0[2]].pos2.x = gSprites[gUnknown_020388C0[3]].pos2.x * -1;
- gSprites[gUnknown_020388C0[2]].data[1] = gSprites[gUnknown_020388C0[3]].data[1];
+ gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].pos2.x = gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].pos2.x * -1;
+ gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[1] = gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[1];
}
else
{
- gSprites[gUnknown_020388C0[2]].data[1] = 0;
+ gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[1] = 0;
}
}
break;
- case 3:
- if (gUnknown_020388C0[3] == 0xFF)
+ case RIGHT_ARROW:
+ if (gVerticalScrollIndicatorIds[RIGHT_ARROW] == 0xFF)
{
- gUnknown_020388C0[3] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0);
- gSprites[gUnknown_020388C0[3]].data[0] = 1;
- if (gUnknown_020388C0[2] != 0xFF)
+ gVerticalScrollIndicatorIds[RIGHT_ARROW] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0);
+ gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[0] = 1;
+ if (gVerticalScrollIndicatorIds[LEFT_ARROW] != 0xFF)
{
- gSprites[gUnknown_020388C0[3]].pos2.x = gSprites[gUnknown_020388C0[2]].pos2.x * -1;
- gSprites[gUnknown_020388C0[3]].data[1] = gSprites[gUnknown_020388C0[2]].data[1];
+ gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].pos2.x = gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].pos2.x * -1;
+ gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[1] = gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[1];
}
else
{
- gSprites[gUnknown_020388C0[3]].data[1] = 0;
+ gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[1] = 0;
}
}
break;
}
- StartSpriteAnim(&gSprites[gUnknown_020388C0[id]], id & 1);
+ StartSpriteAnim(&gSprites[gVerticalScrollIndicatorIds[id]], id & 1);
}
-void sub_80F979C(u8 id, bool8 invisible)
+void SetVerticalScrollIndicators(u8 id, bool8 invisible)
{
- if (id < 4 && gUnknown_020388C0[id] != 0xFF)
+ if (id < 4 && gVerticalScrollIndicatorIds[id] != 0xFF)
{
- gSprites[gUnknown_020388C0[id]].invisible = invisible;
+ gSprites[gVerticalScrollIndicatorIds[id]].invisible = invisible;
}
}
void DestroyVerticalScrollIndicator(u8 id)
{
- if (id < 4 && gUnknown_020388C0[id] != 0xFF)
+ if (id < 4 && gVerticalScrollIndicatorIds[id] != 0xFF)
{
- DestroySprite(&gSprites[gUnknown_020388C0[id]]);
- gUnknown_020388C0[id] = 0xFF;
+ DestroySprite(&gSprites[gVerticalScrollIndicatorIds[id]]);
+ gVerticalScrollIndicatorIds[id] = 0xFF;
}
}
@@ -530,43 +513,43 @@ static void sub_80F9834(struct Sprite *sprite)
}
}
-void sub_80F98A4(u8 id)
+void StopVerticalScrollIndicators(u8 id)
{
- if (gUnknown_020388C0[id] != 0xFF && id < 4)
+ if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4)
{
- gSprites[gUnknown_020388C0[id]].callback = SpriteCallbackDummy;
+ gSprites[gVerticalScrollIndicatorIds[id]].callback = SpriteCallbackDummy;
}
}
void StartVerticalScrollIndicators(u8 id)
{
- if (gUnknown_020388C0[id] != 0xFF && id < 4)
+ if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4)
{
- gSprites[gUnknown_020388C0[id]].callback = sub_80F9834;
+ gSprites[gVerticalScrollIndicatorIds[id]].callback = sub_80F9834;
}
}
-static void sub_80F9914(u8 id)
+static void ResetVerticalScrollIndicators(u8 id)
{
- if (gUnknown_020388C0[id] != 0xFF && id < 4)
+ if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4)
{
- gSprites[gUnknown_020388C0[id]].pos2.x = 0;
- gSprites[gUnknown_020388C0[id]].pos2.y = 0;
- gSprites[gUnknown_020388C0[id]].data[1] = 0;
- gSprites[gUnknown_020388C0[id]].data[3] = 0;
+ gSprites[gVerticalScrollIndicatorIds[id]].pos2.x = 0;
+ gSprites[gVerticalScrollIndicatorIds[id]].pos2.y = 0;
+ gSprites[gVerticalScrollIndicatorIds[id]].data[1] = 0;
+ gSprites[gVerticalScrollIndicatorIds[id]].data[3] = 0;
}
}
void PauseVerticalScrollIndicator(u8 id)
{
- sub_80F98A4(id);
- sub_80F9914(id);
+ StopVerticalScrollIndicators(id);
+ ResetVerticalScrollIndicators(id);
}
-void sub_80F9988(u8 id, u8 priority)
+void SetVerticalScrollIndicatorPriority(u8 id, u8 priority)
{
- if (gUnknown_020388C0[id] != 0xFF && id < 4)
+ if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4)
{
- gSprites[gUnknown_020388C0[id]].oam.priority = priority;
+ gSprites[gVerticalScrollIndicatorIds[id]].oam.priority = priority;
}
}
diff --git a/src/field/money.c b/src/field/money.c
index d0f0ab1f6..3b7268dbc 100644
--- a/src/field/money.c
+++ b/src/field/money.c
@@ -100,6 +100,8 @@ void GetMoneyAmountText(u8 *buffer, u32 amount, u8 arg2)
width = 7;
else if (amount > 99999)
width = 6;
+ // A special sprite is used for 10000 in the decoration
+ // shop, so be sure to account for this.
else if (amount > 10000)
width = 5;
else if (amount > 999)
@@ -143,12 +145,12 @@ void PrintMoneyAmount(u32 amount, u8 size, u8 x, u8 y)
if (stringWidth >= (size + 1) * 8)
{
- MenuPrint(buffer, x, y);
+ Menu_PrintText(buffer, x, y);
}
else
{
int xPlusOne = x + 1;
- MenuPrint_PixelCoords(buffer, (xPlusOne + size) * 8 - stringWidth, y * 8, 1);
+ Menu_PrintTextPixelCoords(buffer, (xPlusOne + size) * 8 - stringWidth, y * 8, 1);
}
}
@@ -175,7 +177,7 @@ void sub_80B7AEC(u32 arg0, u8 left, u8 top)
}
__attribute__((naked))
-void sub_80B7B34(u8 var1, u8 var2, int var3)
+void Draw10000Sprite(u8 var1, u8 var2, int var3)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
@@ -275,7 +277,7 @@ void UpdateMoneyWindow(u32 amount, u8 x, u8 y)
void OpenMoneyWindow(u32 amount, u8 x, u8 y)
{
- MenuDrawTextWindow(x, y, x + 13, y + 3);
+ Menu_DrawStdWindowFrame(x, y, x + 13, y + 3);
UpdateMoneyWindow(amount, x, y);
LoadCompressedObjectPic(gUnknown_083CF584);
@@ -288,7 +290,7 @@ void CloseMoneyWindow(u8 x, u8 y)
{
DestroySpriteAndFreeResources(&gSprites[gUnknown_02038734]);
FreeSpritePaletteByTag(SPRITE_TAG_MONEY);
- MenuZeroFillWindowRect(x, y, x + 13, y + 3);
+ Menu_EraseWindowRect(x, y, x + 13, y + 3);
}
bool8 HasEnoughMoneyFor(void)
diff --git a/src/field/overworld.c b/src/field/overworld.c
index e239daec7..07135080e 100644
--- a/src/field/overworld.c
+++ b/src/field/overworld.c
@@ -25,6 +25,7 @@
#include "link.h"
#include "load_save.h"
#include "main.h"
+#include "m4a.h"
#include "constants/maps.h"
#include "map_name_popup.h"
#include "menu.h"
@@ -47,7 +48,7 @@
#include "tileset_anim.h"
#include "time_events.h"
#include "tv.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "wild_encounter.h"
#ifdef SAPPHIRE
@@ -62,6 +63,7 @@ struct UnkTVStruct
u32 tv_field_4;
};
+extern u8 gUnknown_020297ED;
extern u16 gUnknown_03004898;
extern u16 gUnknown_0300489C;
@@ -142,7 +144,7 @@ const struct UCoords32 gUnknown_0821664C[] =
{ 1, -1},
};
-const struct UnknownTaskStruct gUnknown_08216694 =
+const struct ScanlineEffectParams gUnknown_08216694 =
{
(void *)REG_ADDR_WIN0H,
((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1,
@@ -590,7 +592,7 @@ bool8 sub_80538D0(u16 x, u16 y)
void sub_80538F0(u8 mapGroup, u8 mapNum)
{
- s32 i;
+ s32 paletteIndex;
Overworld_SetWarpDestination(mapGroup, mapNum, -1, -1, -1);
sub_8053F0C();
@@ -611,8 +613,8 @@ void sub_80538F0(u8 mapGroup, u8 mapNum)
sub_8056D38(gMapHeader.mapData);
apply_map_tileset2_palette(gMapHeader.mapData);
- for (i = 6; i < 12; i++)
- sub_807D874(i);
+ for (paletteIndex = 6; paletteIndex < 12; paletteIndex++)
+ ApplyWeatherGammaShiftToPal(paletteIndex);
sub_8072ED0();
UpdateLocationHistoryForRoamer();
@@ -1106,6 +1108,68 @@ u8 sav1_map_get_battletype(void)
return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->battleType;
}
+#if DEBUG
+
+void debug_sub_8076B68(void);
+
+void debug_sub_80589D8(void);
+
+void debug_sub_8058A50(void);
+
+void CB2_InitTestMenu(void)
+{
+ m4aSoundVSyncOff();
+ SetVBlankCallback(NULL);
+ DmaFill32(3, 0, (void *) VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, (void *) PLTT, PLTT_SIZE);
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ ScanlineEffect_Stop();
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4);
+ InitMenuWindow(&gWindowTemplate_81E6CE4);
+ debug_sub_8076B68();
+ BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ REG_IE |= 1;
+ REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP;
+ m4aSoundVSyncOn();
+ SetVBlankCallback(debug_sub_8058A50);
+ m4aSongNumStart(0x19D);
+ SetMainCallback2(debug_sub_80589D8);
+}
+
+void debug_sub_80589D8(void)
+{
+ if (UpdatePaletteFade())
+ return;
+
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+void debug_sub_80589F4(void)
+{
+ if (UpdatePaletteFade())
+ return;
+
+ SetVBlankCallback(NULL);
+
+ DmaFill32(3, 0, (void *) VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, (void *) PLTT, PLTT_SIZE);
+
+ SetMainCallback2(gMain.savedCallback);
+}
+
+void debug_sub_8058A50(void)
+{
+ ProcessSpriteCopyRequests();
+ LoadOam();
+ TransferPlttBuffer();
+}
+
+#endif
+
void ResetSafariZoneFlag_(void)
{
ResetSafariZoneFlag();
@@ -1210,6 +1274,33 @@ void CB2_NewGame(void)
SetMainCallback2(c2_overworld);
}
+#if DEBUG
+
+extern void (*gFieldCallback)(void);
+
+void debug_sub_8058C00(void)
+{
+ FieldClearVBlankHBlankCallbacks();
+ StopMapMusic();
+ ResetSafariZoneFlag_();
+ player_avatar_init_params_reset();
+ PlayTimeCounter_Start();
+ ScriptContext1_Init();
+ ScriptContext2_Disable();
+
+ if (gMain.heldKeys & R_BUTTON)
+ gFieldCallback = ExecuteTruckSequence;
+ else
+ gFieldCallback = sub_8080B60;
+
+ do_load_map_stuff_loop(&gMain.state);
+ SetFieldVBlankCallback();
+ set_callback1(c1_overworld);
+ SetMainCallback2(c2_overworld);
+}
+
+#endif
+
void CB2_WhiteOut(void)
{
u8 val;
@@ -1365,6 +1456,10 @@ void CB2_ContinueSavedGame(void)
{
FieldClearVBlankHBlankCallbacks();
StopMapMusic();
+#if DEBUG
+ if (gMain.heldKeys & R_BUTTON)
+ gUnknown_020297ED = TRUE;
+#endif
ResetSafariZoneFlag_();
LoadSaveblockMapHeader();
LoadSaveblockMapObjScripts();
@@ -1410,7 +1505,7 @@ void VBlankCB_Field(void)
{
LoadOam();
ProcessSpriteCopyRequests();
- sub_8089668();
+ ScanlineEffect_InitHBlankDmaTransfer();
sub_8057A58();
TransferPlttBuffer();
sub_8072E74();
@@ -1422,7 +1517,7 @@ void sub_8054814(void)
if (val)
{
sub_80815E0(val);
- sub_80895F8(gUnknown_08216694);
+ ScanlineEffect_SetParams(gUnknown_08216694);
}
}
@@ -1456,8 +1551,8 @@ bool32 sub_805483C(u8 *a1)
case 4:
sub_8054814();
sub_8054C54();
- SetUpWindowConfig(&gWindowConfig_81E6C3C);
- InitMenuWindow(&gWindowConfig_81E6CE4);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C);
+ InitMenuWindow(&gWindowTemplate_81E6CE4);
(*a1)++;
break;
case 5:
@@ -1522,8 +1617,8 @@ bool32 sub_805493C(u8 *a1, u32 a2)
case 4:
sub_8054814();
sub_8054C54();
- SetUpWindowConfig(&gWindowConfig_81E6C3C);
- InitMenuWindow(&gWindowConfig_81E6CE4);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C);
+ InitMenuWindow(&gWindowTemplate_81E6CE4);
(*a1)++;
break;
case 5:
@@ -1612,8 +1707,8 @@ bool32 sub_8054A9C(u8 *a1)
case 3:
sub_8054814();
sub_8054C54();
- SetUpWindowConfig(&gWindowConfig_81E6C3C);
- InitMenuWindow(&gWindowConfig_81E6CE4);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C);
+ InitMenuWindow(&gWindowTemplate_81E6CE4);
(*a1)++;
break;
case 4:
@@ -1664,29 +1759,12 @@ void do_load_map_stuff_loop(u8 *a1)
void sub_8054BA8(void)
{
- u8 *addr;
- u32 size;
-
REG_DISPCNT = 0;
- remove_some_task();
+ ScanlineEffect_Stop();
DmaClear16(3, PLTT + 2, PLTT_SIZE - 2);
-
- addr = (void *)VRAM;
- size = 0x18000;
- while (1)
- {
- DmaFill16(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill16(3, 0, addr, size);
- break;
- }
- }
-
+ DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000);
ResetOamRange(0, 128);
LoadOam();
}
@@ -1695,8 +1773,8 @@ void sub_8054C2C(void)
{
sub_8054814();
sub_8054C54();
- SetUpWindowConfig(&gWindowConfig_81E6C3C);
- InitMenuWindow(&gWindowConfig_81E6CE4);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C);
+ InitMenuWindow(&gWindowTemplate_81E6CE4);
mapdata_load_assets_to_gpu_and_full_redraw();
}
@@ -1731,7 +1809,7 @@ void sub_8054D4C(u32 a1)
ResetTasks();
ResetSpriteData();
ResetPaletteFade();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
ResetCameraUpdateInfo();
InstallCameraPanAheadCallback();
sub_805C7C4(0);
diff --git a/src/field/party_menu.c b/src/field/party_menu.c
index 9c1150515..66e7e2319 100644
--- a/src/field/party_menu.c
+++ b/src/field/party_menu.c
@@ -32,7 +32,7 @@
#include "string_util.h"
#include "strings.h"
#include "task.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "util.h"
#include "script_pokemon_80F9.h"
#include "ewram.h"
@@ -94,14 +94,21 @@ static void SpriteCB_UpdateHeldItemIconPosition(struct Sprite *sprite);
static void ItemUseMoveMenu_HandleMoveSelection(u8 taskId);
static void ItemUseMoveMenu_HandleCancel(u8 taskId);
static bool8 SetupDefaultPartyMenu(void);
-static void sub_806B4A8(void);
-static void VBlankCB_PartyMenu(void);
-static bool8 LoadPartyMenuGraphics(u8 a);
+/*static*/ void sub_806B4A8(void);
+/*static*/ void VBlankCB_PartyMenu(void);
+/*static*/ bool8 LoadPartyMenuGraphics(u8 a);
static void sub_806BF24(const u8 *a, u8 monIndex, u8 c, u8 d);
static void sub_806BB9C(u8 a);
static void sub_806BBEC(u8 a);
-const u16 TMHMMoves[] = {
+EWRAM_DATA u8 gUnknown_0202E8F4 = 0;
+EWRAM_DATA u8 gUnknown_0202E8F5 = 0;
+EWRAM_DATA u8 gUnknown_0202E8F6 = 0;
+EWRAM_DATA u16 gUnknown_0202E8F8 = 0;
+EWRAM_DATA u8 gPartyMenuType = 0;
+
+const u16 TMHMMoves[] =
+{
MOVE_FOCUS_PUNCH,
MOVE_DRAGON_CLAW,
MOVE_WATER_PULSE,
@@ -458,10 +465,6 @@ struct Unk201FE00
extern u16 gBattleTypeFlags;
extern u8 gTileBuffer[];
-extern u8 gUnknown_0202E8F4;
-extern u8 gUnknown_0202E8F6;
-extern u16 gUnknown_0202E8F8;
-extern u8 gPartyMenuType;
extern u8 gLastFieldPokeMenuOpened;
extern u8 gPlayerPartyCount;
extern s32 gBattleMoveDamage;
@@ -490,9 +493,71 @@ extern const u8 gStatusPal_Icons[];
#define WINDOW_RIGHT (29)
#endif
-
-#ifdef NONMATCHING
-// Main handler for the party menu.
+#if DEBUG
+__attribute__((naked))
+void CB2_PartyMenuMain(void)
+{
+ asm("\
+ push {r4, r5, r6, lr}\n\
+ add sp, sp, #0xfffffffc\n\
+ bl AnimateSprites\n\
+ bl BuildOamBuffer\n\
+ ldr r0, ._3 @ gPartyMenuType\n\
+ ldrb r1, [r0]\n\
+ lsl r0, r1, #0x1\n\
+ add r0, r0, r1\n\
+ lsl r0, r0, #0x4\n\
+ ldr r1, ._3 + 4 @ PartyMonTextSettings\n\
+ add r5, r0, r1\n\
+ mov r6, #0x0\n\
+._1:\n\
+ ldrb r0, [r5]\n\
+ lsl r0, r0, #0x3\n\
+ ldrb r1, [r5, #0x1]\n\
+ lsl r1, r1, #0x3\n\
+ ldr r2, [r5, #0x4]\n\
+ lsl r3, r6, #0x5\n\
+ mov r4, #0x80\n\
+ lsl r4, r4, #0x2\n\
+ orr r3, r3, r4\n\
+ str r3, [sp]\n\
+ mov r3, #0x0\n\
+ bl DrawPartyMenuMonText\n\
+ add r5, r5, #0x8\n\
+ add r6, r6, #0x1\n\
+ cmp r6, #0x5\n\
+ ble ._1 @cond_branch\n\
+ bl RunTasks\n\
+ bl UpdatePaletteFade\n\
+ ldr r0, ._3 + 8 @ gLinkOpen\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x1\n\
+ bne ._2 @cond_branch\n\
+ ldr r0, ._3 + 12 @ gLink\n\
+ ldr r1, ._3 + 16 @ 0xfbd\n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ mov r1, #0x2\n\
+ str r1, [sp]\n\
+ mov r1, #0x1\n\
+ mov r2, #0x1\n\
+ mov r3, #0x2\n\
+ bl debug_sub_8008264\n\
+._2:\n\
+ add sp, sp, #0x4\n\
+ pop {r4, r5, r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+._4:\n\
+ .align 2, 0\n\
+._3:\n\
+ .word gPartyMenuType\n\
+ .word PartyMonTextSettings\n\
+ .word gLinkOpen\n\
+ .word gLink\n\
+ .word 0xfbd");
+}
+#else
void CB2_PartyMenuMain(void)
{
const struct PartyMonTextSettingsStruct *textSettings;
@@ -506,62 +571,18 @@ void CB2_PartyMenuMain(void)
{
// Draw mon name, level, and hp sprites
DrawPartyMenuMonText(
- textSettings[i].xOffset * 8,
- textSettings[i].yOffset * 8,
- textSettings[i].oamSettings,
+ textSettings->xOffset * 8,
+ textSettings->yOffset * 8,
+ textSettings->oamSettings,
0,
(i << 5) | 0x200);
+ textSettings++;
}
RunTasks();
UpdatePaletteFade();
}
-#else
-__attribute__((naked))
-void CB2_PartyMenuMain(void)
-{
- asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- sub sp, 0x4\n\
- bl AnimateSprites\n\
- bl BuildOamBuffer\n\
- ldr r0, _0806AF2C @ =gPartyMenuType\n\
- ldrb r1, [r0]\n\
- lsls r0, r1, 1\n\
- adds r0, r1\n\
- lsls r0, 4\n\
- ldr r1, _0806AF30 @ =PartyMonTextSettings\n\
- adds r5, r0, r1\n\
- movs r6, 0\n\
-_0806AEF8:\n\
- ldrb r0, [r5]\n\
- lsls r0, 3\n\
- ldrb r1, [r5, 0x1]\n\
- lsls r1, 3\n\
- ldr r2, [r5, 0x4]\n\
- lsls r3, r6, 5\n\
- movs r4, 0x80\n\
- lsls r4, 2\n\
- orrs r3, r4\n\
- str r3, [sp]\n\
- movs r3, 0\n\
- bl DrawPartyMenuMonText\n\
- adds r5, 0x8\n\
- adds r6, 0x1\n\
- cmp r6, 0x5\n\
- ble _0806AEF8\n\
- bl RunTasks\n\
- bl UpdatePaletteFade\n\
- add sp, 0x4\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_0806AF2C: .4byte gPartyMenuType\n\
-_0806AF30: .4byte PartyMonTextSettings\n\
- .syntax divided\n");
-}
-#endif // NONMATCHING
+#endif
void VBlankCB_PartyMenu(void)
{
@@ -666,29 +687,432 @@ bool8 SetupDefaultPartyMenu(void)
return FALSE;
}
+#if DEBUG
+__attribute__((naked))
+bool8 InitPartyMenu(void)
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ add sp, sp, #0xfffffff4\n\
+ ldr r0, ._55 @ gMain\n\
+ ldr r1, ._55 + 4 @ 0x43c\n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x11\n\
+ bls ._53 @cond_branch\n\
+ b ._125\n\
+._53:\n\
+ lsl r0, r0, #0x2\n\
+ ldr r1, ._55 + 8 @ \n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+._56:\n\
+ .align 2, 0\n\
+._55:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+ .word ._57\n\
+._57:\n\
+ .word ._58\n\
+ .word ._59\n\
+ .word ._60\n\
+ .word ._61\n\
+ .word ._62\n\
+ .word ._63\n\
+ .word ._64\n\
+ .word ._65\n\
+ .word ._66\n\
+ .word ._67\n\
+ .word ._68\n\
+ .word ._69\n\
+ .word ._70\n\
+ .word ._71\n\
+ .word ._72\n\
+ .word ._73\n\
+ .word ._74\n\
+ .word ._75\n\
+._58:\n\
+ mov r0, #0x0\n\
+ bl SetVBlankCallback\n\
+ mov r3, #0xc0\n\
+ lsl r3, r3, #0x13\n\
+ mov r4, #0xc0\n\
+ lsl r4, r4, #0x9\n\
+ add r2, sp, #0x8\n\
+ mov r8, r2\n\
+ add r2, sp, #0x4\n\
+ mov r6, #0x0\n\
+ ldr r1, ._78 @ 0x40000d4\n\
+ mov r5, #0x80\n\
+ lsl r5, r5, #0x5\n\
+ ldr r7, ._78 + 4 @ 0x81000800\n\
+ mov r0, #0x81\n\
+ lsl r0, r0, #0x18\n\
+ mov ip, r0\n\
+._76:\n\
+ strh r6, [r2]\n\
+ add r0, sp, #0x4\n\
+ str r0, [r1]\n\
+ str r3, [r1, #0x4]\n\
+ str r7, [r1, #0x8]\n\
+ ldr r0, [r1, #0x8]\n\
+ add r3, r3, r5\n\
+ sub r4, r4, r5\n\
+ cmp r4, r5\n\
+ bhi ._76 @cond_branch\n\
+ strh r6, [r2]\n\
+ add r2, sp, #0x4\n\
+ str r2, [r1]\n\
+ str r3, [r1, #0x4]\n\
+ lsr r0, r4, #0x1\n\
+ mov r3, ip\n\
+ orr r0, r0, r3\n\
+ str r0, [r1, #0x8]\n\
+ ldr r0, [r1, #0x8]\n\
+ mov r0, #0xe0\n\
+ lsl r0, r0, #0x13\n\
+ mov r3, #0x80\n\
+ lsl r3, r3, #0x3\n\
+ mov r4, #0x0\n\
+ str r4, [sp, #0x8]\n\
+ ldr r2, ._78 @ 0x40000d4\n\
+ mov r1, r8\n\
+ str r1, [r2]\n\
+ str r0, [r2, #0x4]\n\
+ lsr r0, r3, #0x2\n\
+ mov r1, #0x85\n\
+ lsl r1, r1, #0x18\n\
+ orr r0, r0, r1\n\
+ str r0, [r2, #0x8]\n\
+ ldr r0, [r2, #0x8]\n\
+ mov r1, #0xa0\n\
+ lsl r1, r1, #0x13\n\
+ add r0, sp, #0x4\n\
+ strh r4, [r0]\n\
+ str r0, [r2]\n\
+ str r1, [r2, #0x4]\n\
+ lsr r3, r3, #0x1\n\
+ mov r0, #0x81\n\
+ lsl r0, r0, #0x18\n\
+ orr r3, r3, r0\n\
+ str r3, [r2, #0x8]\n\
+ ldr r0, [r2, #0x8]\n\
+ ldr r2, ._78 + 8 @ gPaletteFade\n\
+ ldrb r0, [r2, #0x8]\n\
+ mov r1, #0x80\n\
+ orr r0, r0, r1\n\
+ strb r0, [r2, #0x8]\n\
+ ldr r1, ._78 + 12 @ gMain\n\
+ ldr r2, ._78 + 16 @ 0x43c\n\
+ add r1, r1, r2\n\
+ b ._122\n\
+._79:\n\
+ .align 2, 0\n\
+._78:\n\
+ .word 0x40000d4\n\
+ .word 0x81000800\n\
+ .word gPaletteFade\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._59:\n\
+ bl ScanlineEffect_Stop\n\
+ b ._115\n\
+._60:\n\
+ bl sub_806B4A8\n\
+ ldr r1, ._82 @ \n\
+ mov r2, #0x99\n\
+ lsl r2, r2, #0x2\n\
+ add r0, r1, r2\n\
+ mov r2, #0x0\n\
+ strh r2, [r0]\n\
+ ldr r3, ._82 + 4 @ \n\
+ add r0, r1, r3\n\
+ strh r2, [r0]\n\
+ mov r0, #0x9a\n\
+ lsl r0, r0, #0x2\n\
+ add r1, r1, r0\n\
+ strh r2, [r1]\n\
+ ldr r1, ._82 + 8 @ \n\
+ ldr r2, ._82 + 12 @ \n\
+ add r1, r1, r2\n\
+ b ._122\n\
+._83:\n\
+ .align 2, 0\n\
+._82:\n\
+ .word +0x201b000\n\
+ .word 0x266\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._61:\n\
+ bl ResetSpriteData\n\
+ b ._115\n\
+._62:\n\
+ ldr r0, ._88 @ \n\
+ mov r1, #0x96\n\
+ lsl r1, r1, #0x2\n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x1\n\
+ beq ._86 @cond_branch\n\
+ cmp r0, #0x5\n\
+ beq ._86 @cond_branch\n\
+ bl ResetTasks\n\
+._86:\n\
+ ldr r1, ._88 + 4 @ \n\
+ ldr r2, ._88 + 8 @ \n\
+ add r1, r1, r2\n\
+ b ._122\n\
+._89:\n\
+ .align 2, 0\n\
+._88:\n\
+ .word +0x201b000\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._63:\n\
+ bl FreeAllSpritePalettes\n\
+ b ._115\n\
+._64:\n\
+ ldr r4, ._92 @ \n\
+ mov r1, #0x97\n\
+ lsl r1, r1, #0x2\n\
+ add r0, r4, r1\n\
+ ldr r0, [r0]\n\
+ mov r1, #0x0\n\
+ bl CreateTask\n\
+ mov r2, #0x98\n\
+ lsl r2, r2, #0x2\n\
+ add r1, r4, r2\n\
+ strb r0, [r1]\n\
+ b ._115\n\
+._93:\n\
+ .align 2, 0\n\
+._92:\n\
+ .word +0x201b000\n\
+._65:\n\
+ ldr r0, ._95 @ gWindowTemplate_81E6C90\n\
+ bl Text_LoadWindowTemplate\n\
+ ldr r1, ._95 + 4 @ gMain\n\
+ ldr r0, ._95 + 8 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._122\n\
+._96:\n\
+ .align 2, 0\n\
+._95:\n\
+ .word gWindowTemplate_81E6C90\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._66:\n\
+ ldr r4, ._98 @ gUnknown_03004210\n\
+ ldr r1, ._98 + 4 @ gWindowTemplate_81E6C90\n\
+ add r0, r4, #0\n\
+ bl Text_InitWindowWithTemplate\n\
+ add r0, r4, #0\n\
+ mov r1, #0x1\n\
+ bl MultistepInitWindowTileData\n\
+ ldr r1, ._98 + 8 @ gMain\n\
+ ldr r2, ._98 + 12 @ 0x43c\n\
+ add r1, r1, r2\n\
+ b ._122\n\
+._99:\n\
+ .align 2, 0\n\
+._98:\n\
+ .word gUnknown_03004210\n\
+ .word gWindowTemplate_81E6C90\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._67:\n\
+ bl MultistepLoadFont\n\
+ cmp r0, #0\n\
+ bne ._100 @cond_branch\n\
+ b ._125\n\
+._100:\n\
+ ldr r0, ._103 @ \n\
+ mov r3, #0x99\n\
+ lsl r3, r3, #0x2\n\
+ add r0, r0, r3\n\
+ mov r1, #0x1\n\
+ strh r1, [r0]\n\
+ ldr r1, ._103 + 4 @ \n\
+ ldr r0, ._103 + 8 @ \n\
+ add r1, r1, r0\n\
+ b ._122\n\
+._104:\n\
+ .align 2, 0\n\
+._103:\n\
+ .word +0x201b000\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._68:\n\
+ ldr r0, ._107 @ \n\
+ mov r1, #0x99\n\
+ lsl r1, r1, #0x2\n\
+ add r4, r0, r1\n\
+ ldrb r0, [r4]\n\
+ bl LoadPartyMenuGraphics\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x1\n\
+ bne ._105 @cond_branch\n\
+ mov r0, #0x0\n\
+ strh r0, [r4]\n\
+ ldr r1, ._107 + 4 @ \n\
+ ldr r2, ._107 + 8 @ \n\
+ add r1, r1, r2\n\
+ b ._122\n\
+._108:\n\
+ .align 2, 0\n\
+._107:\n\
+ .word +0x201b000\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._105:\n\
+ ldrh r0, [r4]\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r4]\n\
+ b ._125\n\
+._69:\n\
+ bl sub_809D51C\n\
+ b ._115\n\
+._70:\n\
+ ldr r2, ._113 @ PartyMenuHandlers\n\
+ ldr r0, ._113 + 4 @ \n\
+ mov r1, #0x96\n\
+ lsl r1, r1, #0x2\n\
+ add r0, r0, r1\n\
+ ldrb r1, [r0]\n\
+ lsl r0, r1, #0x1\n\
+ add r0, r0, r1\n\
+ lsl r0, r0, #0x2\n\
+ add r2, r2, #0x4\n\
+ add r0, r0, r2\n\
+ ldr r0, [r0]\n\
+ bl _call_via_r0\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x1\n\
+ bne ._125 @cond_branch\n\
+ ldr r1, ._113 + 8 @ \n\
+ ldr r2, ._113 + 12 @ \n\
+ add r1, r1, r2\n\
+ b ._122\n\
+._114:\n\
+ .align 2, 0\n\
+._113:\n\
+ .word PartyMenuHandlers\n\
+ .word +0x201b000\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._71:\n\
+ ldr r0, ._116 @ gWindowTemplate_81E6CC8\n\
+ bl MultistepInitMenuWindowBegin\n\
+ b ._115\n\
+._117:\n\
+ .align 2, 0\n\
+._116:\n\
+ .word gWindowTemplate_81E6CC8\n\
+._72:\n\
+ bl MultistepInitMenuWindowContinue\n\
+ cmp r0, #0\n\
+ beq ._125 @cond_branch\n\
+ ldr r1, ._120 @ gMain\n\
+ ldr r0, ._120 + 4 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._122\n\
+._121:\n\
+ .align 2, 0\n\
+._120:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._73:\n\
+ ldr r0, ._123 @ \n\
+ ldr r1, ._123 + 4 @ \n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ mov r1, #0x0\n\
+ bl PrintPartyMenuPromptText\n\
+ ldr r1, ._123 + 8 @ \n\
+ ldr r2, ._123 + 12 @ \n\
+ add r1, r1, r2\n\
+ b ._122\n\
+._124:\n\
+ .align 2, 0\n\
+._123:\n\
+ .word +0x201b000\n\
+ .word 0x259\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._74:\n\
+ mov r0, #0x1\n\
+ neg r0, r0\n\
+ mov r1, #0x0\n\
+ str r1, [sp]\n\
+ mov r2, #0x10\n\
+ mov r3, #0x0\n\
+ bl BeginNormalPaletteFade\n\
+ ldr r2, ._126 @ gPaletteFade\n\
+ ldrb r1, [r2, #0x8]\n\
+ mov r0, #0x7f\n\
+ and r0, r0, r1\n\
+ strb r0, [r2, #0x8]\n\
+._115:\n\
+ ldr r1, ._126 + 4 @ gMain\n\
+ ldr r3, ._126 + 8 @ 0x43c\n\
+ add r1, r1, r3\n\
+._122:\n\
+ ldrb r0, [r1]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r1]\n\
+ b ._125\n\
+._127:\n\
+ .align 2, 0\n\
+._126:\n\
+ .word gPaletteFade\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._75:\n\
+ ldr r0, ._130 @ VBlankCB_PartyMenu\n\
+ bl SetVBlankCallback\n\
+ ldr r0, ._130 + 4 @ gLinkOpen\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x1\n\
+ bne ._128 @cond_branch\n\
+ ldr r0, ._130 + 8 @ 0x600e5e0\n\
+ mov r1, #0x80\n\
+ lsl r1, r1, #0x8\n\
+ ldr r2, ._130 + 12 @ 0x6007800\n\
+ mov r3, #0x2\n\
+ bl debug_sub_8008218\n\
+._128:\n\
+ mov r0, #0x1\n\
+ b ._129\n\
+._131:\n\
+ .align 2, 0\n\
+._130:\n\
+ .word VBlankCB_PartyMenu+1\n\
+ .word gLinkOpen\n\
+ .word 0x600e5e0\n\
+ .word 0x6007800\n\
+._125:\n\
+ mov r0, #0x0\n\
+._129:\n\
+ add sp, sp, #0xc\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r1}\n\
+ bx r1");
+}
+#else
bool8 InitPartyMenu(void)
{
- u8 *addr;
- u32 size;
-
switch (gMain.state)
{
case 0:
SetVBlankCallback(NULL);
- addr = (u8 *)VRAM;
- size = VRAM_SIZE;
- while (1)
- {
- DmaFill16(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill16(3, 0, addr, size);
- break;
- }
- }
-
+ DmaFill16Large(3, 0, (void *)(VRAM + 0x0), VRAM_SIZE, 0x1000);
DmaClear32(3, OAM, OAM_SIZE);
DmaClear16(3, PLTT, PLTT_SIZE);
@@ -696,7 +1120,7 @@ bool8 InitPartyMenu(void)
gMain.state++;
break;
case 1:
- remove_some_task();
+ ScanlineEffect_Stop();
gMain.state++;
break;
case 2:
@@ -727,11 +1151,11 @@ bool8 InitPartyMenu(void)
gMain.state++;
break;
case 7:
- SetUpWindowConfig(&gWindowConfig_81E6C90);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6C90);
gMain.state++;
break;
case 8:
- InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C90);
+ Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C90);
MultistepInitWindowTileData(&gUnknown_03004210, 1);
gMain.state++;
break;
@@ -764,7 +1188,7 @@ bool8 InitPartyMenu(void)
}
break;
case 13:
- MultistepInitMenuWindowBegin(&gWindowConfig_81E6CC8);
+ MultistepInitMenuWindowBegin(&gWindowTemplate_81E6CC8);
gMain.state++;
break;
case 14:
@@ -789,6 +1213,7 @@ bool8 InitPartyMenu(void)
return FALSE;
}
+#endif
void CB2_InitPartyMenu(void)
{
@@ -841,9 +1266,7 @@ void ReDrawPartyMonBackgrounds(void)
{
if (ewram1B000.unk261)
{
- const void *src = gBGTilemapBuffers[2];
- void *dest = (void *)(BG_VRAM + 0x3000);
- DmaCopy16(3, src, dest, 0x800);
+ DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(BG_VRAM + 0x3000), 0x800);
if (ewram1B000.unk261 == 2)
{
@@ -1226,8 +1649,6 @@ void sub_806BBEC(u8 a)
}
}
-#ifdef NONMATCHING
-// The original THUMB is preserving r8 for seemingly no reason. Unsure how to match.
void sub_806BC3C(u8 monIndex, u8 b)
{
u16 *vramPtr = gUnknown_08376918[IsDoubleBattle()][monIndex];
@@ -1240,74 +1661,10 @@ void sub_806BC3C(u8 monIndex, u8 b)
vramPtr[i] = gUnknown_08E9A300[offset] + 0x10C;
vramPtr[i + 0x20] = gUnknown_08E9A300[offset + 0x20] + 0x10C;
}
+
+ // Some dead code was likely optimized out, but the compiler still think r8 was used.
+ asm("":::"r8");
}
-#else
-__attribute__((naked))
-void sub_806BC3C(u8 monIndex, u8 b)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r8\n\
- push {r7}\n\
- adds r4, r0, 0\n\
- adds r5, r1, 0\n\
- lsls r4, 24\n\
- lsrs r4, 24\n\
- lsls r5, 24\n\
- lsrs r5, 24\n\
- ldr r6, _0806BCB0 @ =gUnknown_08376918\n\
- bl IsDoubleBattle\n\
- lsls r4, 2\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- lsls r1, r0, 1\n\
- adds r1, r0\n\
- lsls r1, 3\n\
- adds r4, r1\n\
- adds r4, r6\n\
- ldr r7, [r4]\n\
- movs r6, 0\n\
- adds r0, r5, 0\n\
- movs r1, 0x7\n\
- bl __udivsi3\n\
- lsls r0, 24\n\
- lsrs r4, r0, 19\n\
- ldr r5, _0806BCB4 @ =gUnknown_08E9A300\n\
- movs r0, 0x86\n\
- lsls r0, 1\n\
- adds r3, r0, 0\n\
-_0806BC7C:\n\
- adds r1, r6, r4\n\
- lsls r2, r6, 1\n\
- adds r2, r7\n\
- lsls r0, r1, 1\n\
- adds r0, r5\n\
- ldrh r0, [r0]\n\
- adds r0, r3, r0\n\
- strh r0, [r2]\n\
- adds r2, 0x40\n\
- adds r1, 0x20\n\
- lsls r1, 1\n\
- adds r1, r5\n\
- ldrh r1, [r1]\n\
- adds r0, r3, r1\n\
- strh r0, [r2]\n\
- adds r0, r6, 0x1\n\
- lsls r0, 24\n\
- lsrs r6, r0, 24\n\
- cmp r6, 0x6\n\
- bls _0806BC7C\n\
- pop {r3}\n\
- mov r8, r3\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_0806BCB0: .4byte gUnknown_08376918\n\
-_0806BCB4: .4byte gUnknown_08E9A300\n\
- .syntax divided\n");
-}
-#endif // NONMATCHING
void unref_sub_806BCB8(u8 a)
{
@@ -2790,26 +3147,26 @@ void PrintPartyMenuPromptText(u8 textId, u8 b)
switch (b)
{
case 0:
- MenuDrawTextWindow(0, 16, 23, 19);
+ Menu_DrawStdWindowFrame(0, 16, 23, 19);
break;
case 1:
- MenuDrawTextWindow(0, 16, 19, 19);
+ Menu_DrawStdWindowFrame(0, 16, 19, 19);
break;
case 2:
- MenuDrawTextWindow(0, 16, 22, 19);
+ Menu_DrawStdWindowFrame(0, 16, 22, 19);
break;
case 3:
- MenuDrawTextWindow(0, 16, 18, 19);
+ Menu_DrawStdWindowFrame(0, 16, 18, 19);
break;
}
- MenuPrint(PartyMenuPromptTexts[textId], 1, 17);
+ Menu_PrintText(PartyMenuPromptTexts[textId], 1, 17);
}
}
void sub_806D5A4(void)
{
- MenuZeroFillWindowRect(0, 16, 29, 19);
+ Menu_EraseWindowRect(0, 16, 29, 19);
}
void sub_806D5B8(u8 monIndex)
@@ -2820,7 +3177,7 @@ void sub_806D5B8(u8 monIndex)
u8 right = gUnknown_08376948[IsDoubleBattle()][monIndex].right;
u8 bottom = gUnknown_08376948[IsDoubleBattle()][monIndex].bottom;
- ZeroFillWindowRect(&gUnknown_03004210, left, top, right, bottom);
+ Text_EraseWindowRect(&gUnknown_03004210, left, top, right, bottom);
var1 = 0;
CpuFastSet(&var1, OBJ_VRAM1 + monIndex * 0x400, 0x1000100);
@@ -2834,7 +3191,7 @@ void sub_806D668(u8 monIndex)
u8 right = gUnknown_08376978[IsDoubleBattle()][monIndex].right;
u8 bottom = gUnknown_08376978[IsDoubleBattle()][monIndex].bottom;
- ZeroFillWindowRect(&gUnknown_03004210, left, top, right, bottom);
+ Text_EraseWindowRect(&gUnknown_03004210, left, top, right, bottom);
var1 = 0;
CpuFastSet(&var1, OBJ_VRAM1 + 0x300 + monIndex * 0x400, 0x1000040);
@@ -3427,7 +3784,7 @@ void PartyMenuDoPrintMonNickname(u8 monIndex, int b, const u8 *nameBuffer)
{
u32 var1 = 0;
CpuFastSet(&var1, gTileBuffer, 0x1000100);
- sub_8004E3C((struct WindowConfig *)&gWindowConfig_81E6CAC, gTileBuffer, nameBuffer);
+ Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gTileBuffer, nameBuffer);
CpuFastSet(gTileBuffer, OBJ_VRAM1 + (monIndex * 0x400), 128);
}
@@ -3537,7 +3894,7 @@ void PartyMenuDoPrintLevel(u8 monIndex, u8 menuLayout, u8 level)
var1 = 0;
CpuFastSet(&var1, gUnknown_02039460, 0x1000020);
- sub_8004E3C((struct WindowConfig *)&gWindowConfig_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1);
+ Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1);
CpuFastSet(gUnknown_02039460, OBJ_VRAM1 + 0x200 + (monIndex * 0x400), 32);
}
@@ -3631,7 +3988,7 @@ void PartyMenuDoPrintHP(u8 monIndex, u8 b, u16 currentHP, u16 maxHP)
var = 0;
CpuFastSet(&var, gUnknown_02039460, 0x1000040);
- sub_8004E3C((struct WindowConfig *)&gWindowConfig_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1);
+ Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1);
CpuFastSet(gUnknown_02039460, OBJ_VRAM1 + 0x300 + (monIndex * 0x400), 64);
}
@@ -3781,8 +4138,8 @@ void ClosePartyPopupMenu(u8 index, const struct PartyPopupMenu *menu)
SetPartyPopupMenuOffsets(index, &left, &top, menu);
- MenuZeroFillWindowRect(left, top, left + menu[index].width, menu[index].numChoices * 2 + top + 1);
- HandleDestroyMenuCursors();
+ Menu_EraseWindowRect(left, top, left + menu[index].width, menu[index].numChoices * 2 + top + 1);
+ Menu_DestroyCursor();
}
TaskFunc PartyMenuGetPopupMenuFunc(u8 menuIndex, const struct PartyPopupMenu *menus, const struct MenuAction2 *menuActions, u8 itemIndex)
@@ -3797,7 +4154,7 @@ u8 sub_806E834(const u8 *message, u8 arg1)
gUnknown_0202E8F6 = 1;
- MenuDrawTextWindow(WINDOW_LEFT, 14, WINDOW_RIGHT, 19);
+ Menu_DrawStdWindowFrame(WINDOW_LEFT, 14, WINDOW_RIGHT, 19);
MenuPrintMessage(message, WINDOW_LEFT + 1, 15);
taskId = CreateTask(sub_806E884, 1);
@@ -3808,11 +4165,11 @@ u8 sub_806E834(const u8 *message, u8 arg1)
static void sub_806E884(u8 taskId)
{
- if (MenuUpdateWindowText())
+ if (Menu_UpdateWindowText())
{
gUnknown_0202E8F6 = 0;
if (gTasks[taskId].data[0] == 0)
- MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19);
+ Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19);
DestroyTask(taskId);
}
}
@@ -3902,13 +4259,13 @@ void party_menu_link_mon_held_item_object(u8 taskId)
void PartyMenuTryGiveMonHeldItem_806EACC(u8 taskId)
{
- s8 selection = ProcessMenuInputNoWrap_();
+ s8 selection = Menu_ProcessInputNoWrap_();
if (selection == 0)
{
u16 currentItem;
- MenuZeroFillWindowRect(23, 8, 29, 13);
+ Menu_EraseWindowRect(23, 8, 29, 13);
currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM);
RemoveBagItem(ewram1C000.unk6, 1);
if (AddBagItem(currentItem, 1) == TRUE)
@@ -3937,7 +4294,7 @@ void PartyMenuTryGiveMonHeldItem_806EACC(u8 taskId)
return;
if (selection == -1)
PlaySE(SE_SELECT);
- MenuZeroFillWindowRect(23, 8, 29, 13);
+ Menu_EraseWindowRect(23, 8, 29, 13);
}
gTasks[taskId].func = party_menu_link_mon_held_item_object;
}
@@ -4039,7 +4396,7 @@ void DoTakeMail(u8 taskId, TaskFunc func)
void Task_LoseMailMessage(u8 taskId)
{
- s8 selection = ProcessMenuInputNoWrap_();
+ s8 selection = Menu_ProcessInputNoWrap_();
if (selection == 0)
{
@@ -4052,7 +4409,7 @@ void Task_LoseMailMessage(u8 taskId)
{
sub_806E834(gOtherText_BagFullCannotRemoveItem, 0);
}
- MenuZeroFillWindowRect(23, 8, 29, 13);
+ Menu_EraseWindowRect(23, 8, 29, 13);
gTasks[taskId].func = party_menu_link_mon_held_item_object;
}
else
@@ -4061,8 +4418,8 @@ void Task_LoseMailMessage(u8 taskId)
return;
if (selection == -1)
PlaySE(SE_SELECT);
- MenuZeroFillWindowRect(23, 8, 29, 13);
- MenuZeroFillWindowRect(0, 14, 29, 19);
+ Menu_EraseWindowRect(23, 8, 29, 13);
+ Menu_EraseWindowRect(0, 14, 29, 19);
gTasks[taskId].func = party_menu_link_mon_held_item_object;
}
}
@@ -4078,11 +4435,11 @@ void Task_ConfirmLoseMailMessage(u8 taskId)
void Task_TakeHeldMail(u8 taskId)
{
- s8 selection = ProcessMenuInputNoWrap_();
+ s8 selection = Menu_ProcessInputNoWrap_();
if (selection == 0)
{
- MenuZeroFillWindowRect(23, 8, 29, 13);
+ Menu_EraseWindowRect(23, 8, 29, 13);
if (TakeMailFromMon2(ewram1C000.pokemon) != 0xFF)
sub_806E834(gOtherText_MailWasSent, 0);
else
@@ -4095,7 +4452,7 @@ void Task_TakeHeldMail(u8 taskId)
return;
if (selection == -1)
PlaySE(SE_SELECT);
- MenuZeroFillWindowRect(23, 8, 29, 13);
+ Menu_EraseWindowRect(23, 8, 29, 13);
sub_806E834(gOtherText_MailRemovedMessageLost, 1);
gTasks[taskId].func = Task_ConfirmLoseMailMessage;
}
@@ -4112,7 +4469,7 @@ void Task_ConfirmTakeHeldMail(u8 taskId)
u16 ItemIdToBattleMoveId(u16 item)
{
- u16 machineNumber = item - ITEM_TM01;
+ u16 machineNumber = item - ITEM_TM01_FOCUS_PUNCH;
return TMHMMoves[machineNumber];
}
@@ -4136,6 +4493,10 @@ void TeachMonTMMove(u8 taskId, u16 move, TaskFunc func)
CreateTask(Task_TeamMonTMMove, 5);
}
+#if DEBUG
+extern u8 gUnknown_020297ED;
+#endif
+
void Task_TeamMonTMMove(u8 taskId)
{
GetMonNickname(ewram1C000.pokemon, gStringVar1);
@@ -4150,7 +4511,11 @@ void Task_TeamMonTMMove(u8 taskId)
}
else
{
- if (!CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33))
+ if (
+#if DEBUG
+ !gUnknown_020297ED &&
+#endif
+ !CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33))
{
StringExpandPlaceholders(gStringVar4, gOtherText_NotCompatible);
sub_806E834(gStringVar4, 1);
@@ -4240,11 +4605,11 @@ void sub_806F358(u8 taskId)
void sub_806F390(u8 taskId)
{
- s8 selection = ProcessMenuInputNoWrap_();
+ s8 selection = Menu_ProcessInputNoWrap_();
if (selection == 0)
{
- MenuZeroFillWindowRect(23, 8, 29, 13);
+ Menu_EraseWindowRect(23, 8, 29, 13);
sub_806E834(gOtherText_WhichMoveToForget2, 1);
gTasks[taskId].func = sub_806F44C;
}
@@ -4320,7 +4685,7 @@ void StopTryingToTeachMove_806F588(u8 taskId)
void StopTryingToTeachMove_806F614(u8 taskId)
{
- MenuZeroFillWindowRect(23, 8, 29, 13);
+ Menu_EraseWindowRect(23, 8, 29, 13);
StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]);
StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo);
sub_806E834(gStringVar4, 1);
@@ -4338,11 +4703,11 @@ void StopTryingToTeachMove_806F67C(u8 taskId)
void StopTryingToTeachMove_806F6B4(u8 taskId)
{
- s8 selection = ProcessMenuInputNoWrap_();
+ s8 selection = Menu_ProcessInputNoWrap_();
if (selection == 0)
{
- MenuZeroFillWindowRect(23, 8, 29, 13);
+ Menu_EraseWindowRect(23, 8, 29, 13);
GetMonNickname(ewram1C000.pokemon, gStringVar1);
StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]);
StringExpandPlaceholders(gStringVar4, gOtherText_DidNotLearnMove2);
@@ -4355,7 +4720,7 @@ void StopTryingToTeachMove_806F6B4(u8 taskId)
return;
if (selection == -1)
PlaySE(SE_SELECT);
- MenuZeroFillWindowRect(23, 8, 29, 13);
+ Menu_EraseWindowRect(23, 8, 29, 13);
GetMonNickname(ewram1C000.pokemon, gStringVar1);
StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]);
StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn);
@@ -4706,7 +5071,7 @@ void sub_8070088(u8 taskId)
else
{
gUnknown_0202E8F4 = 1;
- MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19);
+ Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19);
PlaySE(SE_KAIFUKU);
PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5);
task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 9);
@@ -4763,12 +5128,12 @@ void CreateItemUseMoveMenu(u8 partyMonIndex)
u8 i;
r6 = 0;
- MenuDrawTextWindow(19, 10, 29, 19);
+ Menu_DrawStdWindowFrame(19, 10, 29, 19);
for (i = 0; i < 4; i++)
{
u16 move = GetMonData(&gPlayerParty[partyMonIndex], MON_DATA_MOVE1 + i);
- MenuPrint(gMoveNames[move], 20, i * 2 + 11);
+ Menu_PrintText(gMoveNames[move], 20, i * 2 + 11);
if (move != 0)
r6++;
}
@@ -4780,12 +5145,12 @@ void Task_HandleItemUseMoveMenuInput(u8 taskId)
if (gMain.newKeys & DPAD_UP)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(-1);
+ Menu_MoveCursor(-1);
}
else if (gMain.newKeys & DPAD_DOWN)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(1);
+ Menu_MoveCursor(1);
}
else if (gMain.newKeys & A_BUTTON)
{
@@ -4827,17 +5192,17 @@ void DoPPRecoveryItemEffect(u8 taskId, u16 item, TaskFunc c)
void ItemUseMoveMenu_HandleMoveSelection(u8 taskId)
{
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(19, 10, 29, 19);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(19, 10, 29, 19);
sub_806D5A4();
- gTasks[taskId].data[11] = GetMenuCursorPos();
+ gTasks[taskId].data[11] = Menu_GetCursorPos();
DoRecoverPP(taskId);
}
void ItemUseMoveMenu_HandleCancel(u8 taskId)
{
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(19, 10, 29, 19);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(19, 10, 29, 19);
if (gMain.inBattle)
gTasks[ewram1C000.unk4].func = HandleBattlePartyMenu;
else
@@ -4880,7 +5245,8 @@ void DoPPUpItemEffect(u8 taskId, u16 b, TaskFunc c)
gMain.newKeys = 0;
}
-static const u8 *const StatNames[] = {
+static const u8 *const StatNames[] =
+{
gOtherText_HP,
gOtherText_Attack,
gOtherText_Defense,
@@ -4889,7 +5255,8 @@ static const u8 *const StatNames[] = {
gOtherText_Speed,
};
-static const u8 StatDataTypes[] = {
+static const u8 StatDataTypes[] =
+{
MON_DATA_MAX_HP,
MON_DATA_ATK,
MON_DATA_DEF,
@@ -4897,6 +5264,17 @@ static const u8 StatDataTypes[] = {
MON_DATA_SPDEF,
MON_DATA_SPEED,
};
+
+#if DEBUG
+
+const u8 gUnknown_Debug_839B6CE[] = {0x40, 0, 0, 0, 0x44, 0, 0xFF, 0, 0, 0};
+
+const u8 gUnknown_Debug_839B6D8[] = _(
+ "{STR_VAR_1}かい じっこう\n"
+ "{STR_VAR_2}たんいじかん しょうひ");
+
+#endif
+
void DoRareCandyItemEffect(u8 taskId, u16 b, TaskFunc c)
{
u8 i;
@@ -4966,7 +5344,7 @@ void PrintStatGrowthsInLevelUpWindow(u8 taskId)
{
u8 i;
- MenuDrawTextWindow(11, 0, 29, 7);
+ Menu_DrawStdWindowFrame(11, 0, 29, 7);
for (i = 0; i < NUM_STATS; i++)
{
@@ -4982,12 +5360,12 @@ void PrintStatGrowthsInLevelUpWindow(u8 taskId)
x = (i / 3) * 9 + 11;
y = ((i % 3) << 1) + 1;
- MenuPrint_PixelCoords(StatNames[i], (x + 1) * 8, y * 8, 1);
+ Menu_PrintTextPixelCoords(StatNames[i], (x + 1) * 8, y * 8, 1);
if (i == 2)
- MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0);
+ Menu_PrintTextPixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0);
else
- MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1);
+ Menu_PrintTextPixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1);
gStringVar1[0] = EXT_CTRL_CODE_BEGIN;
gStringVar1[1] = 0x14;
@@ -4995,7 +5373,7 @@ void PrintStatGrowthsInLevelUpWindow(u8 taskId)
ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.statGrowths[i], 1, 2);
- MenuPrint_PixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0);
+ Menu_PrintTextPixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0);
}
}
#elif GERMAN
@@ -5011,7 +5389,7 @@ void PrintStatGrowthsInLevelUpWindow(u8 taskId) {
movs r1, 0\n\
movs r2, 0x1D\n\
movs r3, 0x7\n\
- bl MenuDrawTextWindow\n\
+ bl Menu_DrawStdWindowFrame\n\
movs r7, 0\n\
ldr r0, _0807092C @ =gStringVar1\n\
mov r10, r0\n\
@@ -5095,7 +5473,7 @@ _0807086C:\n\
mov r0, r10\n\
adds r1, r4, 0\n\
adds r2, r5, 0\n\
- bl MenuPrint\n\
+ bl Menu_PrintText\n\
adds r0, r7, 0x1\n\
lsls r0, 24\n\
lsrs r7, r0, 24\n\
@@ -5142,7 +5520,7 @@ void PrintNewStatsInLevelUpWindow(u8 taskId)
gStringVar1[2] = 0x06;
ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.statGrowths[newStatIndex], 1, 3);
- MenuPrint_PixelCoords(gStringVar1, (x + 6) * 8 + 6, y * 8, 0);
+ Menu_PrintTextPixelCoords(gStringVar1, (x + 6) * 8 + 6, y * 8, 0);
}
}
@@ -5184,7 +5562,7 @@ void Task_RareCandy3(u8 taskId)
u16 learnedMove;
u16 evolutionSpecies;
- MenuZeroFillWindowRect(11, 0, 29, 7);
+ Menu_EraseWindowRect(11, 0, 29, 7);
learnedMove = MonTryLearningNewMove(ewram1C000.pokemon, TRUE);
ewram1B000.unk282 = 1;
@@ -5628,9 +6006,13 @@ _08070F8A:\n\
}
#endif // NONMATCHING
+
+// Maybe this goes in start_menu.c
+#if !DEBUG
void unref_sub_8070F90(void)
{
FlagSet(FLAG_SYS_POKEDEX_GET);
FlagSet(FLAG_SYS_POKEMON_GET);
FlagSet(FLAG_SYS_POKENAV_GET);
}
+#endif
diff --git a/src/field/pc_screen_effect.c b/src/field/pc_screen_effect.c
index 364fca0aa..dcc3bc9c9 100644
--- a/src/field/pc_screen_effect.c
+++ b/src/field/pc_screen_effect.c
@@ -2,18 +2,7 @@
#include "main.h"
#include "palette.h"
#include "sprite.h"
-
-struct UnkStruct
-{
- /*0x00*/ u16 tileTag;
- /*0x02*/ u16 paletteTag;
- /*0x04*/ u16 unk04;
- /*0x06*/ u16 unk06;
- /*0x08*/ u16 unk08;
- /*0x0A*/ u16 unk0A;
- /*0x0C*/ s16 unk0C;
- /*0x10*/ u32 selectedPalettes;
-};
+#include "pc_screen_effect.h"
void sub_80C603C(void);
void sub_80C6078(void);
@@ -30,7 +19,7 @@ extern const u16 gUnknownPal_083D18EC[16];
extern const u8 gUnknownGfx_083D190C[128];
-extern struct UnkStruct *gUnknown_020387EC;
+EWRAM_DATA struct PCScreenEffectStruct *gUnknown_020387EC = NULL;
const struct SpriteSheet gUnknown_083D1898 = { gUnknownGfx_083D190C, sizeof(gUnknownGfx_083D190C), 0 };
@@ -58,7 +47,7 @@ const struct SpriteTemplate gSpriteTemplate_83D18C0 =
sub_80C6130,
};
-void sub_80C5CD4(struct UnkStruct *unkStruct)
+void sub_80C5CD4(struct PCScreenEffectStruct *unkStruct)
{
u16 i;
diff --git a/src/field/player_pc.c b/src/field/player_pc.c
index 4fef09386..27427ecaa 100644
--- a/src/field/player_pc.c
+++ b/src/field/player_pc.c
@@ -29,9 +29,9 @@ extern void DestroyVerticalScrollIndicator(u8);
extern void PauseVerticalScrollIndicator(u8);
extern void LoadScrollIndicatorPalette(void);
extern void ClearMailStruct(struct MailStruct *);
-extern u8 sub_807D770(void);
+extern u8 IsWeatherNotFadingIn(void);
extern void sub_808B020(void);
-extern void sub_80F944C(void);
+extern void ClearVerticalScrollIndicatorPalettes(void);
static EWRAM_DATA const u8 *gPcItemMenuOptionOrder = NULL;
@@ -217,8 +217,8 @@ void PlayerPC(void)
static void InitPlayerPCMenu(u8 taskId)
{
- MenuDrawTextWindow(0, 0, 10, gPcItemMenuOptionsNum * 2 + 1);
- PrintMenuItemsReordered(1, 1, gPcItemMenuOptionsNum, sPlayerPCMenuActions, gPcItemMenuOptionOrder);
+ Menu_DrawStdWindowFrame(0, 0, 10, gPcItemMenuOptionsNum * 2 + 1);
+ Menu_PrintItemsReordered(1, 1, gPcItemMenuOptionsNum, sPlayerPCMenuActions, gPcItemMenuOptionOrder);
InitMenu(0, 1, 1, gPcItemMenuOptionsNum, 0, 9);
TASK.FUNC = PlayerPCProcessMenuInput;
}
@@ -228,22 +228,22 @@ static void PlayerPCProcessMenuInput(u8 taskId)
if (gMain.newAndRepeatedKeys & DPAD_UP)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(-1);
+ Menu_MoveCursor(-1);
}
else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(1);
+ Menu_MoveCursor(1);
}
else if (gMain.newKeys & A_BUTTON)
{
- HandleDestroyMenuCursors();
+ Menu_DestroyCursor();
PlaySE(SE_SELECT);
- sPlayerPCMenuActions[gPcItemMenuOptionOrder[GetMenuCursorPos()]].func(taskId);
+ sPlayerPCMenuActions[gPcItemMenuOptionOrder[Menu_GetCursorPos()]].func(taskId);
}
else if (gMain.newKeys & B_BUTTON)
{
- HandleDestroyMenuCursors();
+ Menu_DestroyCursor();
PlaySE(SE_SELECT);
sPlayerPCMenuActions[gPcItemMenuOptionsNum[gPcItemMenuOptionOrder - 1]].func(taskId); // run EXIT.
}
@@ -262,7 +262,7 @@ static void PlayerPC_ItemStorage(u8 taskId)
static void PlayerPC_Mailbox(u8 taskId)
{
- MenuZeroFillWindowRect(0, 0, 10, 9);
+ Menu_EraseWindowRect(0, 0, 10, 9);
eMailboxInfo.count = GetMailboxMailCount();
if (eMailboxInfo.count == 0)
@@ -280,7 +280,7 @@ static void PlayerPC_Mailbox(u8 taskId)
static void PlayerPC_Decoration(u8 var)
{
- MenuZeroFillWindowRect(0, 0, 10, 9);
+ Menu_EraseWindowRect(0, 0, 10, 9);
DoPlayerPCDecoration(var);
}
@@ -288,7 +288,7 @@ static void PlayerPC_TurnOff(u8 taskId)
{
if (gPcItemMenuOptionsNum == 4) // if the option count is 4, we are at the bedroom PC and not player PC, so do gender specific handling.
{
- MenuZeroFillWindowRect(0, 0, 0x1D, 0x13);
+ Menu_EraseWindowRect(0, 0, 0x1D, 0x13);
if (gSaveBlock2.playerGender == MALE)
ScriptContext1_SetupScript(gBrendanHouse_TurnPCOff);
@@ -297,7 +297,7 @@ static void PlayerPC_TurnOff(u8 taskId)
}
else
{
- MenuZeroFillWindowRect(0, 0, 10, 9);
+ Menu_EraseWindowRect(0, 0, 10, 9);
EnableBothScriptContexts();
}
DestroyTask(taskId);
@@ -305,17 +305,17 @@ static void PlayerPC_TurnOff(u8 taskId)
static void InitItemStorageMenu(u8 var)
{
- MenuZeroFillWindowRect(0, 0, 10, 9);
- MenuDrawTextWindow(0, 0, 11, 9);
- PrintMenuItems(1, 1, 4, (struct MenuAction *)gPCText_ItemPCOptionsText);
+ Menu_EraseWindowRect(0, 0, 10, 9);
+ Menu_DrawStdWindowFrame(0, 0, 11, 9);
+ Menu_PrintItems(1, 1, 4, (struct MenuAction *)gPCText_ItemPCOptionsText);
InitMenu(0, 1, 1, 4, var, 10);
ItemStorageMenuPrint(gPCText_OptionDescList[var]);
}
static void ItemStorageMenuPrint(const u8 *textPtr)
{
- MenuFillWindowRectWithBlankTile(2, 15, 27, 18);
- MenuPrint(textPtr, 2, 15);
+ Menu_BlankWindowRect(2, 15, 27, 18);
+ Menu_PrintText(textPtr, 2, 15);
}
static void ItemStorageMenuProcessInput(u8 var)
@@ -323,23 +323,23 @@ static void ItemStorageMenuProcessInput(u8 var)
if (gMain.newAndRepeatedKeys & DPAD_UP)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(-1);
- ItemStorageMenuPrint(gPCText_OptionDescList[GetMenuCursorPos()]);
+ Menu_MoveCursor(-1);
+ ItemStorageMenuPrint(gPCText_OptionDescList[Menu_GetCursorPos()]);
}
else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(1);
- ItemStorageMenuPrint(gPCText_OptionDescList[GetMenuCursorPos()]);
+ Menu_MoveCursor(1);
+ ItemStorageMenuPrint(gPCText_OptionDescList[Menu_GetCursorPos()]);
}
else if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
- gPCText_ItemPCOptionsText[GetMenuCursorPos()].func(var);
+ gPCText_ItemPCOptionsText[Menu_GetCursorPos()].func(var);
}
else if (gMain.newKeys & B_BUTTON)
{
- HandleDestroyMenuCursors();
+ Menu_DestroyCursor();
PlaySE(SE_SELECT);
gPCText_ItemPCOptionsText[ITEMPC_MENU_EXIT].func(var);
}
@@ -357,18 +357,18 @@ static void Task_ItemStorage_Deposit(u8 taskId)
static void ItemStorage_Deposit(u8 taskId)
{
TASK.FUNC = Task_ItemStorage_Deposit;
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
static void ItemStorage_HandleReturnToProcessInput(u8 taskId)
{
- if (sub_807D770() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
TASK.FUNC = ItemStorageMenuProcessInput;
}
void ItemStorage_ReturnToMenuAfterDeposit(void)
{
- MenuDisplayMessageBox();
+ Menu_DisplayDialogueFrame();
InitItemStorageMenu(ITEMPC_MENU_DEPOSIT);
CreateTask(ItemStorage_HandleReturnToProcessInput, 0);
pal_fill_black();
@@ -378,13 +378,13 @@ static void ItemStorage_Withdraw(u8 taskId)
{
s16 *data = TASK.data;
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 11, 9);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 11, 9);
NUM_ITEMS = CountUsedPCItemSlots();
if (NUM_ITEMS != 0)
{
- MenuZeroFillWindowRect(0, 14, 29, 19);
+ Menu_EraseWindowRect(0, 14, 29, 19);
CURRENT_ITEM_STORAGE_MENU = ITEMPC_MENU_WITHDRAW;
PAGE_INDEX = 0;
ITEMS_ABOVE_TOP = 0;
@@ -400,13 +400,13 @@ static void ItemStorage_Toss(u8 taskId)
{
s16 *data = TASK.data;
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 11, 9);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 11, 9);
NUM_ITEMS = CountUsedPCItemSlots();
if (NUM_ITEMS)
{
- MenuZeroFillWindowRect(0, 14, 29, 19);
+ Menu_EraseWindowRect(0, 14, 29, 19);
CURRENT_ITEM_STORAGE_MENU = ITEMPC_MENU_TOSS;
PAGE_INDEX = 0;
ITEMS_ABOVE_TOP = 0;
@@ -420,8 +420,8 @@ static void ItemStorage_Toss(u8 taskId)
static void ItemStorage_Exit(u8 var)
{
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 11, 9);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 11, 9);
ReshowPlayerPC(var);
}
@@ -450,7 +450,7 @@ static void ItemStorage_ProcessInput(u8 taskId)
if(PAGE_INDEX != 0) // did the cursor move physically upwards?
{
PlaySE(SE_SELECT);
- PAGE_INDEX = MoveMenuCursor(-1);
+ PAGE_INDEX = Menu_MoveCursor(-1);
trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX;
if (SWITCH_MODE_ACTIVE == FALSE) // are we not currently switching items?
{
@@ -474,7 +474,7 @@ static void ItemStorage_ProcessInput(u8 taskId)
ItemStorage_DrawBothListAndDescription(taskId);
if (SWITCH_MODE_ACTIVE != FALSE)
- MoveMenuCursor(0); // don't move the cursor. it's at the top of the page index, but not the true index.
+ Menu_MoveCursor(0); // don't move the cursor. it's at the top of the page index, but not the true index.
}
}
else if(gMain.newAndRepeatedKeys & DPAD_DOWN) // _0813A306
@@ -482,7 +482,7 @@ static void ItemStorage_ProcessInput(u8 taskId)
if(PAGE_INDEX != NUM_PAGE_ITEMS - 1)
{
PlaySE(SE_SELECT);
- PAGE_INDEX = MoveMenuCursor(1);
+ PAGE_INDEX = Menu_MoveCursor(1);
trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX;
if(SWITCH_MODE_ACTIVE != FALSE)
@@ -500,7 +500,7 @@ static void ItemStorage_ProcessInput(u8 taskId)
ItemStorage_DrawBothListAndDescription(taskId);
if (SWITCH_MODE_ACTIVE != FALSE)
- MoveMenuCursor(0);
+ Menu_MoveCursor(0);
}
}
else if(gMain.newKeys & SELECT_BUTTON) // _0813A3A0
@@ -549,7 +549,7 @@ static void ItemStorage_ProcessInput(u8 taskId)
PlaySE(SE_SELECT);
if(SWITCH_MODE_ACTIVE == FALSE)
{
- HandleDestroyMenuCursors();
+ Menu_DestroyCursor();
ItemStorage_GoBackToPlayerPCMenu(taskId);
}
else
@@ -563,10 +563,10 @@ static void ItemStorage_ProcessInput(u8 taskId)
static void ItemStorage_GoBackToPlayerPCMenu(u8 taskId)
{
BuyMenuFreeMemory();
- DestroyVerticalScrollIndicator(0);
- DestroyVerticalScrollIndicator(1);
- MenuZeroFillWindowRect(0, 0, 29, 19);
- MenuDisplayMessageBox();
+ DestroyVerticalScrollIndicator(TOP_ARROW);
+ DestroyVerticalScrollIndicator(BOTTOM_ARROW);
+ Menu_EraseWindowRect(0, 0, 29, 19);
+ Menu_DisplayDialogueFrame();
InitItemStorageMenu(TASK.CURRENT_ITEM_STORAGE_MENU);
TASK.FUNC = ItemStorageMenuProcessInput;
}
@@ -576,8 +576,8 @@ static void ItemStorage_DoItemAction(u8 taskId)
s16 *data = TASK.data;
u8 trueIndex = PAGE_INDEX + ITEMS_ABOVE_TOP;
- PauseVerticalScrollIndicator(0);
- PauseVerticalScrollIndicator(1); // PauseVerticalScrollIndicator
+ PauseVerticalScrollIndicator(TOP_ARROW);
+ PauseVerticalScrollIndicator(BOTTOM_ARROW);
if(CURRENT_ITEM_STORAGE_MENU == ITEMPC_MENU_WITHDRAW)
{
@@ -603,7 +603,7 @@ static void ItemStorage_DoItemAction(u8 taskId)
ItemStorage_PrintItemPcResponse(ITEMPC_HOW_MANY_TO_TOSS);
}
NUM_QUANTITY_ROLLER = 1;
- MenuDrawTextWindow(6, 8, 13, 11);
+ Menu_DrawStdWindowFrame(6, 8, 13, 11);
sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3);
TASK.FUNC = ItemStorage_HandleQuantityRolling;
}
@@ -652,7 +652,7 @@ static void ItemStorage_HandleQuantityRolling(u8 taskId)
else if(gMain.newKeys & A_BUTTON) // confirm quantity.
{
PlaySE(SE_SELECT);
- MenuZeroFillWindowRect(6, 6, 0xD, 0xB);
+ Menu_EraseWindowRect(6, 6, 0xD, 0xB);
if(CURRENT_ITEM_STORAGE_MENU == ITEMPC_MENU_WITHDRAW)
ItemStorage_DoItemWithdraw(taskId);
@@ -662,9 +662,9 @@ static void ItemStorage_HandleQuantityRolling(u8 taskId)
else if(gMain.newKeys & B_BUTTON) // cancel quantity.
{
PlaySE(SE_SELECT);
- MenuZeroFillWindowRect(6, 6, 0xD, 0xB);
- StartVerticalScrollIndicators(0);
- StartVerticalScrollIndicators(1);
+ Menu_EraseWindowRect(6, 6, 0xD, 0xB);
+ StartVerticalScrollIndicators(TOP_ARROW);
+ StartVerticalScrollIndicators(BOTTOM_ARROW);
ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); // why not use trueIndex?
TASK.FUNC = ItemStorage_ProcessInput;
}
@@ -713,7 +713,7 @@ static void ItemStorage_DoItemToss(u8 taskId)
static void ItemStorage_ResumeInputFromYesToss(u8 taskId)
{
- MenuZeroFillWindowRect(0x6, 0x6, 0xD, 0xB);
+ Menu_EraseWindowRect(0x6, 0x6, 0xD, 0xB);
ItemStorage_PrintItemPcResponse(ITEMPC_THREW_AWAY_ITEM);
TASK.FUNC = ItemStorage_HandleRemoveItem;
}
@@ -722,10 +722,10 @@ static void ItemStorage_ResumeInputFromNoToss(u8 taskId)
{
s16 *data = TASK.data;
- MenuZeroFillWindowRect(0x6, 0x6, 0xD, 0xB);
+ Menu_EraseWindowRect(0x6, 0x6, 0xD, 0xB);
InitMenu(0, 16, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD);
- StartVerticalScrollIndicators(0);
- StartVerticalScrollIndicators(1);
+ StartVerticalScrollIndicators(TOP_ARROW);
+ StartVerticalScrollIndicators(BOTTOM_ARROW);
ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId);
TASK.FUNC = ItemStorage_ProcessInput;
}
@@ -757,17 +757,17 @@ static void ItemStorage_WaitPressHandleResumeProcessInput(u8 taskId)
if(gMain.newKeys & A_BUTTON || gMain.newKeys == B_BUTTON)
{
ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId);
- StartVerticalScrollIndicators(0);
- StartVerticalScrollIndicators(1);
+ StartVerticalScrollIndicators(TOP_ARROW);
+ StartVerticalScrollIndicators(BOTTOM_ARROW);
TASK.FUNC = ItemStorage_ProcessInput;
}
}
static void ItemStorage_HandleResumeProcessInput(u8 taskId)
{
- MenuZeroFillWindowRect(0x6, 0x6, 0xD, 0xB);
- StartVerticalScrollIndicators(0);
- StartVerticalScrollIndicators(1);
+ Menu_EraseWindowRect(0x6, 0x6, 0xD, 0xB);
+ StartVerticalScrollIndicators(TOP_ARROW);
+ StartVerticalScrollIndicators(BOTTOM_ARROW);
ItemStorage_DrawBothListAndDescription(taskId);
TASK.FUNC = ItemStorage_ProcessInput;
}
@@ -817,14 +817,14 @@ static void ItemStorage_DrawItemQuantity(u16 arg1, enum StringConvertMode arg2,
sub_80A4164(gStringVar1, arg1, arg2, arg4);
if(isSwapSelected != FALSE)
- MenuPrint(gSelectedItemQuantityFormatText, 0x1A, arg3);
+ Menu_PrintText(gSelectedItemQuantityFormatText, 0x1A, arg3);
else
- MenuPrint(gNonSelectedItemQuantityFormatText, 0x1A, arg3);
+ Menu_PrintText(gNonSelectedItemQuantityFormatText, 0x1A, arg3);
}
static void ItemStorage_DrawItemVoidQuantity(u8 var)
{
- MenuPrint(gUnknown_08406330, 0x19, var);
+ Menu_PrintText(gUnknown_08406330, 0x19, var);
}
static void ItemStorage_DrawItemName(struct ItemSlot *itemSlot, u8 var, int isSwapSelected)
@@ -832,9 +832,9 @@ static void ItemStorage_DrawItemName(struct ItemSlot *itemSlot, u8 var, int isSw
CopyItemName(itemSlot->itemId, gStringVar1);
if(isSwapSelected != FALSE)
- MenuPrint(gSelectedItemFormattedText, 16, var);
+ Menu_PrintText(gSelectedItemFormattedText, 16, var);
else
- MenuPrint(gNonSelectedItemFormattedText, 16, var);
+ Menu_PrintText(gNonSelectedItemFormattedText, 16, var);
}
static void ItemStorage_DrawNormalItemEntry(struct ItemSlot *itemSlot, u8 var, int var2)
@@ -853,7 +853,7 @@ static void ItemStorage_DrawTMHMEntry(struct ItemSlot *itemSlot, u8 var, int var
{
ItemStorage_DrawItemName(itemSlot, var, var2);
- if(itemSlot->itemId < ITEM_HM01)
+ if(itemSlot->itemId < ITEM_HM01_CUT)
ItemStorage_DrawItemQuantity(itemSlot->quantity, STR_CONV_MODE_RIGHT_ALIGN, var, 3, var2);
else
ItemStorage_DrawItemVoidQuantity(var); // HMs do not have a quantity.
@@ -866,61 +866,51 @@ static void ItemStorage_DrawItemList(u8 taskId)
u16 i;
u16 yCoord = 0;
- // r5 is i and is unsigned 16-bit.
-
- for(i = ITEMS_ABOVE_TOP; i < ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS; i++)
+ for (i = ITEMS_ABOVE_TOP; i < ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS; i++)
{
yCoord = (i - ITEMS_ABOVE_TOP) * 2;
- if(i != NUM_ITEMS)
+ if (i == NUM_ITEMS)
+ {
+ sub_8072A18(gOtherText_CancelNoTerminator, 0x80, (yCoord + 2) * 8, 0x68, 1);
+ break;
+ }
+ else
{
tempArg = 0;
- if(SWITCH_MODE_ACTIVE != FALSE && i == SWAP_ITEM_INDEX)
+ if (SWITCH_MODE_ACTIVE != FALSE && i == SWAP_ITEM_INDEX)
tempArg = 1;
- switch(GetPocketByItemId(gSaveBlock1.pcItems[i].itemId) - 1)
+ switch (GetPocketByItemId(gSaveBlock1.pcItems[i].itemId) - 1)
{
- case 0:
- case 1:
- case 3:
- ItemStorage_DrawNormalItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg);
- break;
- case 4:
- ItemStorage_DrawKeyItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg);
- break;
- case 2:
- ItemStorage_DrawTMHMEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg);
- break;
+ case 0:
+ case 1:
+ case 3:
+ ItemStorage_DrawNormalItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg);
+ break;
+ case 4:
+ ItemStorage_DrawKeyItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg);
+ break;
+ case 2:
+ ItemStorage_DrawTMHMEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg);
+ break;
}
}
- else
- {
- goto weirdCase; // what???
- }
}
-beforeLabel:
- if(i - ITEMS_ABOVE_TOP < 8)
- MenuFillWindowRectWithBlankTile(16, yCoord + 4, 0x1C, 0x12);
+ if (i - ITEMS_ABOVE_TOP < 8)
+ Menu_BlankWindowRect(16, yCoord + 4, 0x1C, 0x12);
- switch(ITEMS_ABOVE_TOP)
- {
- default:
- CreateVerticalScrollIndicators(0, 0xB8, 8);
- break;
-weirdCase:
- sub_8072A18(gOtherText_CancelNoTerminator, 0x80, (yCoord + 2) * 8, 0x68, 1);
- goto beforeLabel;
- case 0:
- DestroyVerticalScrollIndicator(0);
- break;
- }
+ if (ITEMS_ABOVE_TOP != 0)
+ CreateVerticalScrollIndicators(TOP_ARROW, 0xB8, 8);
+ else
+ DestroyVerticalScrollIndicator(TOP_ARROW);
- if(ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS <= NUM_ITEMS)
- CreateVerticalScrollIndicators(1, 0xB8, 0x98);
+ if (ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS <= NUM_ITEMS)
+ CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xB8, 0x98);
else
- DestroyVerticalScrollIndicator(1);
+ DestroyVerticalScrollIndicator(BOTTOM_ARROW);
}
static void ItemStorage_PrintItemPcResponse(u16 itemId)
@@ -984,14 +974,14 @@ static void ItemStorage_GoBackToItemPCMenu(u8 taskId, u8 var)
{
s16 *data = TASK.data;
- sub_80F944C();
+ ClearVerticalScrollIndicatorPalettes();
LoadScrollIndicatorPalette();
ItemStorage_LoadPalette();
- MenuDrawTextWindow(0xF, 0, 0x1D, 0x13);
- MenuDrawTextWindow(0, 0xC, 0xE, 0x13);
- MenuDrawTextWindow(0, 0, 0xB, 3);
+ Menu_DrawStdWindowFrame(0xF, 0, 0x1D, 0x13);
+ Menu_DrawStdWindowFrame(0, 0xC, 0xE, 0x13);
+ Menu_DrawStdWindowFrame(0, 0, 0xB, 3);
ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[0].itemId);
- MenuPrint(gPCText_ItemPCOptionsText[var].text, 1, 1);
+ Menu_PrintText(gPCText_ItemPCOptionsText[var].text, 1, 1);
ItemStorage_DrawItemList(taskId);
InitMenu(0, 0x10, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD);
}
@@ -1039,68 +1029,50 @@ static void Mailbox_UpdateMailList(void)
}
}
-// WWHHHHHYYYYYYYY SOMEBODY PLEASE FIX THIS
static void Mailbox_DrawMailList(u8 taskId) // taskId is unused
{
u16 yCoord = 0;
- u16 i = eMailboxInfo.itemsAbove;
- register struct MailboxStruct *tempMailbox asm("r1") = &eMailboxInfo;
- register struct MailboxStruct *mailbox asm("r6");
+ u16 i;
- if(i < i + tempMailbox->pageItems)
+ for (i = eMailboxInfo.itemsAbove; i < eMailboxInfo.itemsAbove + eMailboxInfo.pageItems; i++)
{
- mailbox = tempMailbox;
- goto forJump;
- for(; i < mailbox->itemsAbove + mailbox->pageItems; i++)
- {
- forJump:
- yCoord = (i - mailbox->itemsAbove) * 2;
- MenuFillWindowRectWithBlankTile(0x15, yCoord + 2, 0x1C, yCoord + 3);
-
- if(i != mailbox->count)
+ yCoord = (i - eMailboxInfo.itemsAbove) * 2;
+ Menu_BlankWindowRect(0x15, yCoord + 2, 0x1C, yCoord + 3);
+ if (i == eMailboxInfo.count)
{
- StringCopy(gStringVar1, gSaveBlock1.mail[i + 6].playerName);
- SanitizeNameString(gStringVar1);
- MenuPrint(gStringVar1, 0x15, yCoord + 2);
+ Menu_PrintText(gOtherText_CancelNoTerminator, 0x15, yCoord + 2);
+ break;
}
else
{
- goto weirdCase; // again, what???
+ StringCopy(gStringVar1, gSaveBlock1.mail[i + 6].playerName);
+ SanitizeNameString(gStringVar1);
+ Menu_PrintText(gStringVar1, 0x15, yCoord + 2);
}
}
- }
-beforeLabel:
- if(i - eMailboxInfo.itemsAbove != 8)
- MenuFillWindowRectWithBlankTile(0x15, yCoord + 4, 0x1C, 0x12);
+ if (i - eMailboxInfo.itemsAbove != 8)
+ Menu_BlankWindowRect(0x15, yCoord + 4, 0x1C, 0x12);
- switch(eMailboxInfo.itemsAbove)
- {
- default:
- CreateVerticalScrollIndicators(0, 0xC8, 8);
- break;
-weirdCase:
- MenuPrint(gOtherText_CancelNoTerminator, 0x15, yCoord + 2);
- goto beforeLabel;
- case 0:
- DestroyVerticalScrollIndicator(0);
- break;
- }
+ if (eMailboxInfo.itemsAbove != 0)
+ CreateVerticalScrollIndicators(TOP_ARROW, 0xC8, 8);
+ else
+ DestroyVerticalScrollIndicator(TOP_ARROW);
- if(eMailboxInfo.itemsAbove + eMailboxInfo.pageItems <= eMailboxInfo.count)
- CreateVerticalScrollIndicators(1, 0xC8, 0x98);
+ if (eMailboxInfo.itemsAbove + eMailboxInfo.pageItems <= eMailboxInfo.count)
+ CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xC8, 0x98);
else
- DestroyVerticalScrollIndicator(1);
+ DestroyVerticalScrollIndicator(BOTTOM_ARROW);
}
static void Mailbox_DrawMailboxMenu(u8 taskId)
{
- sub_80F944C();
+ ClearVerticalScrollIndicatorPalettes();
LoadScrollIndicatorPalette();
- MenuZeroFillWindowRect(0, 0, 0x1D, 0x13);
- MenuDrawTextWindow(0, 0, 0x8, 0x3);
- MenuPrint(gPCText_Mailbox, 1, 1);
- MenuDrawTextWindow(0x14, 0, 0x1D, 0x13);
+ Menu_EraseWindowRect(0, 0, 0x1D, 0x13);
+ Menu_DrawStdWindowFrame(0, 0, 0x8, 0x3);
+ Menu_PrintText(gPCText_Mailbox, 1, 1);
+ Menu_DrawStdWindowFrame(0x14, 0, 0x1D, 0x13);
Mailbox_DrawMailList(taskId);
InitMenu(0, 0x15, 2, eMailboxInfo.pageItems, eMailboxInfo.cursorPos, 8);
}
@@ -1115,7 +1087,7 @@ static void Mailbox_ProcessInput(u8 taskId)
if(eMailboxInfo.cursorPos != 0)
{
PlaySE(SE_SELECT);
- eMailboxInfo.cursorPos = MoveMenuCursor(-1);
+ eMailboxInfo.cursorPos = Menu_MoveCursor(-1);
}
else if(eMailboxInfo.itemsAbove != 0)
{
@@ -1129,7 +1101,7 @@ static void Mailbox_ProcessInput(u8 taskId)
if(eMailboxInfo.cursorPos != eMailboxInfo.pageItems - 1)
{
PlaySE(SE_SELECT);
- eMailboxInfo.cursorPos = MoveMenuCursor(1);
+ eMailboxInfo.cursorPos = Menu_MoveCursor(1);
}
else if(eMailboxInfo.itemsAbove + eMailboxInfo.cursorPos != eMailboxInfo.count)
{
@@ -1140,7 +1112,7 @@ static void Mailbox_ProcessInput(u8 taskId)
}
else if(gMain.newKeys & A_BUTTON)
{
- HandleDestroyMenuCursors();
+ Menu_DestroyCursor();
PlaySE(SE_SELECT);
if(eMailboxInfo.itemsAbove + eMailboxInfo.cursorPos == eMailboxInfo.count)
@@ -1155,7 +1127,7 @@ static void Mailbox_ProcessInput(u8 taskId)
}
else if(gMain.newKeys & B_BUTTON)
{
- HandleDestroyMenuCursors();
+ Menu_DestroyCursor();
PlaySE(SE_SELECT);
Mailbox_TurnOff(taskId);
}
@@ -1165,13 +1137,13 @@ static void Mailbox_ProcessInput(u8 taskId)
static void Mailbox_CloseScrollIndicators(void)
{
BuyMenuFreeMemory();
- DestroyVerticalScrollIndicator(0);
- DestroyVerticalScrollIndicator(1);
+ DestroyVerticalScrollIndicator(TOP_ARROW);
+ DestroyVerticalScrollIndicator(BOTTOM_ARROW);
}
static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId)
{
- MenuZeroFillWindowRect(0, 0, 0x1D, 0x13);
+ Menu_EraseWindowRect(0, 0, 0x1D, 0x13);
StringCopy(gStringVar1, gSaveBlock1.mail[eMailboxInfo.itemsAbove + 6 + eMailboxInfo.cursorPos].playerName);
SanitizeNameString(gStringVar1);
StringExpandPlaceholders(gStringVar4, gOtherText_WhatWillYouDoMail);
@@ -1180,7 +1152,7 @@ static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId)
static void Mailbox_ReturnToPlayerPC(u8 taskId)
{
- MenuZeroFillWindowRect(0, 0, 0x1D, 0x13);
+ Menu_EraseWindowRect(0, 0, 0x1D, 0x13);
ReshowPlayerPC(taskId);
}
@@ -1192,8 +1164,8 @@ static void Mailbox_TurnOff(u8 taskId)
static void Mailbox_PrintMailOptions(u8 taskId) // Mailbox_PrintMailOptions
{
- MenuDrawTextWindow(0, 0, 0xC, 0x9);
- PrintMenuItems(1, 1, 4, (struct MenuAction *)gMailboxMailOptions);
+ Menu_DrawStdWindowFrame(0, 0, 0xC, 0x9);
+ Menu_PrintItems(1, 1, 4, (struct MenuAction *)gMailboxMailOptions);
InitMenu(0, 1, 1, 4, 0, 0xB);
TASK.FUNC = Mailbox_MailOptionsProcessInput;
}
@@ -1203,17 +1175,17 @@ static void Mailbox_MailOptionsProcessInput(u8 taskId)
if(gMain.newAndRepeatedKeys & DPAD_UP)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(-1);
+ Menu_MoveCursor(-1);
}
else if(gMain.newAndRepeatedKeys & DPAD_DOWN)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(1);
+ Menu_MoveCursor(1);
}
else if(gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
- gMailboxMailOptions[GetMenuCursorPos()].func(taskId);
+ gMailboxMailOptions[Menu_GetCursorPos()].func(taskId);
}
else if(gMain.newKeys & B_BUTTON)
{
@@ -1224,7 +1196,7 @@ static void Mailbox_MailOptionsProcessInput(u8 taskId)
static void Mailbox_DoMailRead(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
TASK.FUNC = Mailbox_FadeAndReadMail;
}
@@ -1239,7 +1211,7 @@ static void Mailbox_FadeAndReadMail(u8 taskId)
static void Mailbox_HandleReturnToProcessInput(u8 taskId) // Mailbox_HandleReturnToProcessInput
{
- if(sub_807D770() == TRUE) // is black fade finished? why not gPaletteFade.active?
+ if (IsWeatherNotFadingIn() == TRUE) // is black fade finished? why not gPaletteFade.active?
TASK.FUNC = Mailbox_ProcessInput;
}
@@ -1259,9 +1231,9 @@ static const u8 gHighlightedMoveToBagFormatText[] = _("{COLOR RED}{STR_VAR_1}");
static void Mailbox_MoveToBag(u8 taskId)
{
- HandleDestroyMenuCursors();
+ Menu_DestroyCursor();
StringCopy(gStringVar1, gOtherText_MoveToBag);
- MenuPrint(gHighlightedMoveToBagFormatText, 1, 3); // gHighlightedMoveToBagFormatText
+ Menu_PrintText(gHighlightedMoveToBagFormatText, 1, 3); // gHighlightedMoveToBagFormatText
DisplayItemMessageOnField(taskId, gOtherText_MessageWillBeLost, Mailbox_DrawYesNoBeforeMove, 0);
}
@@ -1275,7 +1247,7 @@ static void Mailbox_DoMailMoveToBag(u8 taskId)
{
struct MailStruct *mail = &gSaveBlock1.mail[eMailboxInfo.itemsAbove + 6 + eMailboxInfo.cursorPos];
- MenuZeroFillWindowRect(0x14, 8, 0x1A, 0xD);
+ Menu_EraseWindowRect(0x14, 8, 0x1A, 0xD);
if(AddBagItem(mail->itemId, 1) == FALSE)
{
@@ -1298,7 +1270,7 @@ static void Mailbox_DoMailMoveToBag(u8 taskId)
static void Mailbox_ReturnToInputAfterNo(u8 taskId) // Mailbox_ReturnToInputAfterNo
{
- MenuZeroFillWindowRect(0x14, 0x8, 0x1A, 0xD);
+ Menu_EraseWindowRect(0x14, 0x8, 0x1A, 0xD);
Mailbox_DrawMailMenuAndDoProcessInput(taskId);
}
@@ -1308,7 +1280,7 @@ static void Mailbox_Give(u8 taskId)
Mailbox_NoPokemonForMail(taskId); // cannot be reached normally
else
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
TASK.FUNC = Mailbox_DoGiveMailPokeMenu;
}
}
@@ -1353,8 +1325,8 @@ static void Mailbox_NoPokemonForMail(u8 taskId)
static void Mailbox_Cancel(u8 taskId)
{
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 0xC, 0x9);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 0xC, 0x9);
Mailbox_DrawMailMenuAndDoProcessInput(taskId);
}
diff --git a/src/field/pokeblock.c b/src/field/pokeblock.c
index 640d4731f..b4be44aa2 100644
--- a/src/field/pokeblock.c
+++ b/src/field/pokeblock.c
@@ -1,14 +1,10 @@
-//
-
-//
-
#include "global.h"
#include "overworld.h"
#include "sprite.h"
#include "script.h"
#include "strings.h"
#include "task.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "text.h"
#include "main.h"
#include "menu.h"
@@ -95,7 +91,8 @@ static const u8 *gUnknown_03000758;
#define GFX_TAG_POKEBLOCK_CASE 14800
-const s8 gPokeblockFlavorCompatibilityTable[] = {
+const s8 gPokeblockFlavorCompatibilityTable[] =
+{
// Cool, Beauty, Cute, Smart, Tough
0, 0, 0, 0, 0, // Hardy
1, 0, 0, 0, -1, // Lonely
@@ -124,14 +121,16 @@ const s8 gPokeblockFlavorCompatibilityTable[] = {
0, 0, 0, 0, 0 // Quirky
};
-void (*const gUnknown_083F7EA8[])(void) = {
+void (*const gUnknown_083F7EA8[])(void) =
+{
sub_80A5B40,
c2_exit_to_overworld_2_switch,
sub_802E424,
c2_exit_to_overworld_2_switch
};
-const u8 *const gPokeblockNames[] = {
+const u8 *const gPokeblockNames[] =
+{
NULL,
ContestStatsText_RedPokeBlock,
ContestStatsText_BluePokeBlock,
@@ -149,7 +148,8 @@ const u8 *const gPokeblockNames[] = {
ContestStatsText_GoldPokeBlock
};
-const struct MenuAction2 gUnknown_083F7EF4[] = {
+const struct MenuAction2 gUnknown_083F7EF4[] =
+{
{OtherText_Use, sub_810C508},
{OtherText_Toss, sub_810C5C0},
{gOtherText_CancelNoTerminator, sub_810C748},
@@ -165,21 +165,25 @@ const struct YesNoFuncTable gUnknown_083F7F24 = {sub_810C610, sub_810C668};
const u8 UnreferencedData_083F7F2C[] = {0x16, 0x17, 0x18, 0x21, 0x2f};
-const struct OamData gOamData_83F7F34 = {
+const struct OamData gOamData_83F7F34 =
+{
.size = 3,
.priority = 2
};
-const union AnimCmd gSpriteAnim_83F7F3C[] = {
+const union AnimCmd gSpriteAnim_83F7F3C[] =
+{
ANIMCMD_FRAME(.imageValue = 0, .duration = 0),
ANIMCMD_END
};
-const union AnimCmd *const gSpriteAnimTable_83F7F44[] = {
+const union AnimCmd *const gSpriteAnimTable_83F7F44[] =
+{
gSpriteAnim_83F7F3C
};
-const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] = {
+const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] =
+{
AFFINEANIMCMD_FRAME(0, 0, -2, 2),
AFFINEANIMCMD_FRAME(0, 0, 2, 4),
AFFINEANIMCMD_FRAME(0, 0, -2, 4),
@@ -187,22 +191,26 @@ const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] = {
AFFINEANIMCMD_END
};
-const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7F70[] = {
+const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7F70[] =
+{
gSpriteAffineAnim_83F7F48
};
-const struct CompressedSpriteSheet gUnknown_083F7F74 = {
+const struct CompressedSpriteSheet gUnknown_083F7F74 =
+{
gMenuPokeblockDevice_Gfx,
0x800,
GFX_TAG_POKEBLOCK_CASE
};
-const struct CompressedSpritePalette gUnknown_083F7F7C = {
+const struct CompressedSpritePalette gUnknown_083F7F7C =
+{
gMenuPokeblockDevice_Pal,
GFX_TAG_POKEBLOCK_CASE
};
-const struct SpriteTemplate gSpriteTemplate_83F7F84 = {
+const struct SpriteTemplate gSpriteTemplate_83F7F84 =
+{
GFX_TAG_POKEBLOCK_CASE,
GFX_TAG_POKEBLOCK_CASE,
&gOamData_83F7F34,
@@ -212,12 +220,25 @@ const struct SpriteTemplate gSpriteTemplate_83F7F84 = {
SpriteCallbackDummy
};
-const struct Pokeblock gUnknown_083F7F9C[] = {
- { PBLOCK_CLR_RED, 20, 0, 0, 0, 0, 20},
- { PBLOCK_CLR_BLUE, 0, 20, 0, 0, 0, 20},
- { PBLOCK_CLR_PINK, 0, 0, 20, 0, 0, 20},
- { PBLOCK_CLR_GREEN, 0, 0, 0, 20, 0, 20},
- { PBLOCK_CLR_YELLOW, 0, 0, 0, 0, 20, 20}
+const struct Pokeblock gUnknown_083F7F9C[] =
+{
+ { PBLOCK_CLR_RED, 20, 0, 0, 0, 0, 20 },
+ { PBLOCK_CLR_BLUE, 0, 20, 0, 0, 0, 20 },
+ { PBLOCK_CLR_PINK, 0, 0, 20, 0, 0, 20 },
+ { PBLOCK_CLR_GREEN, 0, 0, 0, 20, 0, 20 },
+ { PBLOCK_CLR_YELLOW, 0, 0, 0, 0, 20, 20 },
+#if DEBUG
+ { PBLOCK_CLR_PURPLE, 20, 0, 20, 0, 0, 20 },
+ { PBLOCK_CLR_INDIGO, 0, 20, 0, 20, 0, 20 },
+ { PBLOCK_CLR_BROWN, 0, 0, 20, 0, 20, 20 },
+ { PBLOCK_CLR_LITEBLUE, 20, 0, 0, 20, 0, 20 },
+ { PBLOCK_CLR_OLIVE, 0, 20, 0, 0, 20, 20 },
+ { PBLOCK_CLR_GRAY, 0, 2, 0, 2, 2, 0 },
+ { PBLOCK_CLR_BLACK, 3, 3, 3, 4, 3, 0 },
+ { PBLOCK_CLR_WHITE, 1, 1, 1, 1, 1, 1 },
+ { PBLOCK_CLR_GOLD, 20, 0, 0, 0, 0, 20 },
+ { 0 },
+#endif
};
// text
@@ -232,14 +253,10 @@ static void sub_810B674(void)
static void sub_810B68C(void)
{
- u16 *src;
- vu16 *dest;
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
- src = gBGTilemapBuffers[2];
- dest = (vu16 *)(VRAM + 0x7800);
- DmaCopy16(3, src, dest, sizeof gBGTilemapBuffers[2]);
+ DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x7800), sizeof gBGTilemapBuffers[2]);
}
static bool8 sub_810B6C0(void)
@@ -248,14 +265,14 @@ static bool8 sub_810B6C0(void)
switch (gMain.state)
{
case 0:
- sub_80F9438();
+ ClearVideoCallbacks();
sub_80F9368();
REG_BG2CNT = BGCNT_SCREENBASE(15) | BGCNT_CHARBASE(2) | BGCNT_PRIORITY(2);
REG_BLDCNT = 0;
gMain.state++;
break;
case 1:
- remove_some_task();
+ ScanlineEffect_Stop();
gMain.state++;
break;
case 2:
@@ -275,15 +292,15 @@ static bool8 sub_810B6C0(void)
gMain.state++;
break;
case 5:
- SetUpWindowConfig(&gWindowConfig_81E6E34);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6E34);
gMain.state++;
break;
case 6:
- SetUpWindowConfig(&gWindowConfig_81E6E50);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6E50);
gMain.state++;
break;
case 7:
- MultistepInitMenuWindowBegin(&gWindowConfig_81E6E34);
+ MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E34);
gMain.state++;
break;
case 8:
@@ -293,7 +310,7 @@ static bool8 sub_810B6C0(void)
}
break;
case 9:
- MultistepInitMenuWindowBegin(&gWindowConfig_81E6E50);
+ MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E50);
gMain.state++;
break;
case 10:
@@ -310,10 +327,10 @@ static bool8 sub_810B6C0(void)
}
break;
case 12:
- sub_80F944C();
+ ClearVerticalScrollIndicatorPalettes();
LoadScrollIndicatorPalette();
- CreateVerticalScrollIndicators(0, 0xb0, 0x08);
- CreateVerticalScrollIndicators(1, 0xb0, 0x98);
+ CreateVerticalScrollIndicators(TOP_ARROW, 0xb0, 0x08);
+ CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xb0, 0x98);
gMain.state++;
break;
case 13:
@@ -432,31 +449,30 @@ void OpenPokeblockCaseOnFeeder(void)
SetMainCallback2(sub_810B96C);
}
-#ifdef DEBUG
+#if DEBUG
void debug_sub_8120F98(void)
{
u8 i;
- for (i=0; i<40 && gUnknown_083F7F9C[i].color != 0; i++)
- {
+
+ for (i = 0; i < 40 && gUnknown_083F7F9C[i].color != 0; i++)
gSaveBlock1.pokeblocks[i] = gUnknown_083F7F9C[i];
- }
}
#endif
static void sub_810BB0C(void)
{
- BasicInitMenuWindow(&gWindowConfig_81E6E34);
+ BasicInitMenuWindow(&gWindowTemplate_81E6E34);
sub_8072BD8(ItemId_GetItem(ITEM_POKEBLOCK_CASE)->name, 2, 1, 0x48);
}
static void sub_810BB30(void)
{
- BasicInitMenuWindow(&gWindowConfig_81E6E34);
- MenuPrint(gContestStatsText_Spicy, 2, 13);
- MenuPrint(gContestStatsText_Dry, 2, 15);
- MenuPrint(gContestStatsText_Sweet, 2, 17);
- MenuPrint(gContestStatsText_Bitter, 8, 13);
- MenuPrint(gContestStatsText_Sour, 8, 15);
+ BasicInitMenuWindow(&gWindowTemplate_81E6E34);
+ Menu_PrintText(gContestStatsText_Spicy, 2, 13);
+ Menu_PrintText(gContestStatsText_Dry, 2, 15);
+ Menu_PrintText(gContestStatsText_Sweet, 2, 17);
+ Menu_PrintText(gContestStatsText_Bitter, 8, 13);
+ Menu_PrintText(gContestStatsText_Sour, 8, 15);
}
static void sub_810BB88(u8 a0)
@@ -464,17 +480,17 @@ static void sub_810BB88(u8 a0)
u8 i;
u8 y;
u8 *buf;
- BasicInitMenuWindow(&gWindowConfig_81E6E34);
+ BasicInitMenuWindow(&gWindowTemplate_81E6E34);
for (i=a0; i<=a0+8; i++)
{
y = (i - a0) << 1;
if (i == gUnknown_02039248.unk2)
{
buf = sub_8072C74(gStringVar1, gContestStatsText_StowCase, 0x78, 0);
- MenuPrint(gStringVar1, 15, y + 1);
+ Menu_PrintText(gStringVar1, 15, y + 1);
if (i != a0 + 8)
{
- MenuZeroFillWindowRect(15, y + 3, 29, 18);
+ Menu_EraseWindowRect(15, y + 3, 29, 18);
}
break;
}
@@ -484,7 +500,7 @@ static void sub_810BB88(u8 a0)
buf[2] = 0x06;
buf += 3;
ConvertIntToDecimalStringN(buf, sub_810C9B0(&gSaveBlock1.pokeblocks[i]), STR_CONV_MODE_RIGHT_ALIGN, 3);
- MenuPrint(gStringVar1, 15, y + 1);
+ Menu_PrintText(gStringVar1, 15, y + 1);
}
}
@@ -560,19 +576,19 @@ static void sub_810BDAC(bool8 flag)
}
if (gUnknown_02039248.unk1)
{
- sub_80F979C(0, 0);
+ SetVerticalScrollIndicators(TOP_ARROW, VISIBLE);
}
else
{
- sub_80F979C(0, 1);
+ SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE);
}
if (gUnknown_02039248.unk2 > gUnknown_02039248.unk3 && gUnknown_02039248.unk1 + gUnknown_02039248.unk3 != gUnknown_02039248.unk2)
{
- sub_80F979C(1, 0);
+ SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE);
}
else
{
- sub_80F979C(1, 1);
+ SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE);
}
for (i=0; i<5; i++)
{
@@ -596,15 +612,15 @@ static void sub_810BDAC(bool8 flag)
gBGTilemapBuffers[2][v0 + 32] = 15;
}
}
- BasicInitMenuWindow(&gWindowConfig_81E6E34);
+ BasicInitMenuWindow(&gWindowTemplate_81E6E34);
if (gUnknown_02039248.unk0 + gUnknown_02039248.unk1 != gUnknown_02039248.unk2)
{
sub_8072C14(gStringVar1, sub_810C9E8(&gSaveBlock1.pokeblocks[gUnknown_02039248.unk0 + gUnknown_02039248.unk1]), 16, 1);
- MenuPrint(gStringVar1, 11, 17);
+ Menu_PrintText(gStringVar1, 11, 17);
}
else
{
- MenuZeroFillWindowRect(11, 17, 12, 18);
+ Menu_EraseWindowRect(11, 17, 12, 18);
}
}
@@ -776,8 +792,8 @@ static void sub_810C23C(u8 taskId)
static void sub_810C2B0(void)
{
- DestroyVerticalScrollIndicator(0);
- DestroyVerticalScrollIndicator(1);
+ DestroyVerticalScrollIndicator(TOP_ARROW);
+ DestroyVerticalScrollIndicator(BOTTOM_ARROW);
BuyMenuFreeMemory();
}
@@ -810,11 +826,11 @@ static void sub_810C368(u8 taskId)
int v0 = 0;
if (gUnknown_02039244 > 1)
v0 = 2;
- sub_80F98A4(0);
- sub_80F98A4(1);
- BasicInitMenuWindow(&gWindowConfig_81E6E50);
- MenuDrawTextWindow(7, v0 + 4, 13, 11);
- PrintMenuItemsReordered(8, v0 + 5, gUnknown_0203924C, gUnknown_083F7EF4, gUnknown_03000758);
+ StopVerticalScrollIndicators(TOP_ARROW);
+ StopVerticalScrollIndicators(BOTTOM_ARROW);
+ BasicInitMenuWindow(&gWindowTemplate_81E6E50);
+ Menu_DrawStdWindowFrame(7, v0 + 4, 13, 11);
+ Menu_PrintItemsReordered(8, v0 + 5, gUnknown_0203924C, gUnknown_083F7EF4, gUnknown_03000758);
InitMenu(0, 8, v0 + 5, gUnknown_0203924C, 0, 5);
gSpecialVar_ItemId = gUnknown_02039248.unk0 + gUnknown_02039248.unk1;
gTasks[taskId].func = sub_810C40C;
@@ -824,24 +840,24 @@ static void sub_810C40C(u8 taskId)
{
if (gMain.newAndRepeatedKeys & DPAD_UP)
{
- if (GetMenuCursorPos())
+ if (Menu_GetCursorPos())
{
PlaySE(SE_SELECT);
- MoveMenuCursor(-1);
+ Menu_MoveCursor(-1);
}
}
else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
{
- if (GetMenuCursorPos() != gUnknown_0203924C - 1)
+ if (Menu_GetCursorPos() != gUnknown_0203924C - 1)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(+1);
+ Menu_MoveCursor(+1);
}
}
else if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
- gUnknown_083F7EF4[gUnknown_03000758[GetMenuCursorPos()]].func(taskId);
+ gUnknown_083F7EF4[gUnknown_03000758[Menu_GetCursorPos()]].func(taskId);
}
else if (gMain.newKeys & B_BUTTON)
{
@@ -868,9 +884,9 @@ static void sub_810C508(u8 taskId)
static void sub_810C540(u8 taskId)
{
- BasicInitMenuWindow(&gWindowConfig_81E6E50);
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(7, 4, 13, 11);
+ BasicInitMenuWindow(&gWindowTemplate_81E6E50);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(7, 4, 13, 11);
StringCopy(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[gUnknown_02039248.unk0 + gUnknown_02039248.unk1].color]);
StringExpandPlaceholders(gStringVar4, gContestStatsText_ThrowAwayPrompt);
DisplayItemMessageOnField(taskId, gStringVar4, sub_810C5EC, 0);
@@ -878,7 +894,7 @@ static void sub_810C540(u8 taskId)
static void sub_810C5C0(u8 taskId)
{
- sub_80F979C(1, 1);
+ SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE);
gTasks[taskId].func = sub_810C540;
}
@@ -890,7 +906,7 @@ static void sub_810C5EC(u8 taskId)
static void sub_810C610(u8 taskId)
{
- MenuZeroFillWindowRect(7, 6, 13, 11);
+ Menu_EraseWindowRect(7, 6, 13, 11);
PokeblockClearIfExists((gUnknown_02039248.unk0 + gUnknown_02039248.unk1));
StringExpandPlaceholders(gStringVar4, gContestStatsText_WasThrownAway);
DisplayItemMessageOnField(taskId, gStringVar4, sub_810C704, 0);
@@ -900,15 +916,15 @@ static void sub_810C610(u8 taskId)
static void sub_810C668(u8 taskId)
{
- StartVerticalScrollIndicators(0);
- StartVerticalScrollIndicators(1);
+ StartVerticalScrollIndicators(TOP_ARROW);
+ StartVerticalScrollIndicators(BOTTOM_ARROW);
if (gUnknown_02039248.unk2 > gUnknown_02039248.unk3 && gUnknown_02039248.unk1 + gUnknown_02039248.unk3 != gUnknown_02039248.unk2)
{
- sub_80F979C(1, 0);
+ SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE);
}
- BasicInitMenuWindow(&gWindowConfig_81E6E50);
- MenuZeroFillWindowRect(7, 6, 13, 11);
- MenuZeroFillWindowRect(0, 14, 29, 19);
+ BasicInitMenuWindow(&gWindowTemplate_81E6E50);
+ Menu_EraseWindowRect(7, 6, 13, 11);
+ Menu_EraseWindowRect(0, 14, 29, 19);
gTasks[taskId].func = sub_810BF7C;
}
@@ -922,18 +938,18 @@ static void sub_810C6DC(u8 taskId)
static void sub_810C704(u8 taskId)
{
- BasicInitMenuWindow(&gWindowConfig_81E6E34);
+ BasicInitMenuWindow(&gWindowTemplate_81E6E34);
sub_810BC84(gUnknown_02039248.unk1);
- sub_80F979C(1, 1);
+ SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE);
gTasks[taskId].func = sub_810C6DC;
}
static void sub_810C748(u8 taskId)
{
- StartVerticalScrollIndicators(0);
- StartVerticalScrollIndicators(1);
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(7, 4, 13, 11);
+ StartVerticalScrollIndicators(TOP_ARROW);
+ StartVerticalScrollIndicators(BOTTOM_ARROW);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(7, 4, 13, 11);
gTasks[taskId].func = sub_810BF7C;
}
diff --git a/src/field/pokedex_area_screen.c b/src/field/pokedex_area_screen.c
new file mode 100644
index 000000000..67ca276c4
--- /dev/null
+++ b/src/field/pokedex_area_screen.c
@@ -0,0 +1,20 @@
+
+// Includes
+#include "global.h"
+
+// Static type declarations
+
+// Static RAM declarations
+
+EWRAM_DATA u16 gUnknown_02039260 = 0;
+EWRAM_DATA u16 gUnknown_02039262 = 0;
+EWRAM_DATA u16 gUnknown_02039264 = 0;
+EWRAM_DATA u16 gUnknown_02039266 = 0;
+EWRAM_DATA u16 gUnknown_02039268 = 0;
+EWRAM_DATA u16 gUnknown_0203926A = 0;
+
+// Static ROM declarations
+
+// .rodata
+
+// .text
diff --git a/src/field/pokenav.c b/src/field/pokenav.c
new file mode 100644
index 000000000..f57a98df6
--- /dev/null
+++ b/src/field/pokenav.c
@@ -0,0 +1,16 @@
+
+// Includes
+#include "global.h"
+
+// Static type declarations
+
+// Static RAM declarations
+
+EWRAM_DATA u8 gUnknown_020388B0[4] = {};
+EWRAM_DATA u16 gUnknown_020388B4 = 0;
+
+// Static ROM declarations
+
+// .rodata
+
+// .text
diff --git a/src/field/region_map.c b/src/field/region_map.c
index 07e77e389..7bfda1a81 100644
--- a/src/field/region_map.c
+++ b/src/field/region_map.c
@@ -280,7 +280,7 @@ static u16 sub_80FB9C0(u16);
static void sub_80FBA18(void);
static bool8 sub_80FBAA0(u16);
void CreateRegionMapCursor(u16, u16);
-static void sub_80FBCA0(void);
+void sub_80FBCA0(void);
static void sub_80FBDF8(void);
static void sub_80FBE24(void);
static void SpriteCB_PlayerIconZoomedOut(struct Sprite *);
@@ -288,8 +288,8 @@ static void UpdateIconBlink(struct Sprite *);
static void SpriteCB_PlayerIconZoomedIn(struct Sprite *);
const u8 *GetMapSectionName(u8 *, u16, u16);
static void VBlankCB_FlyRegionMap(void);
-static void CB2_FlyRegionMap(void);
-static void sub_80FC244(void (*func)(void));
+void CB2_FlyRegionMap(void);
+void sub_80FC244(void (*func)(void));
static void PrintFlyTargetName(void);
static void CreateFlyTargetGraphics(void);
static void CreateCityTownFlyTargetIcons(void);
@@ -297,7 +297,7 @@ static void CreateSpecialAreaFlyTargetIcons(void);
static void SpriteCB_FlyTargetIcons(struct Sprite *);
static void sub_80FC5B4(void);
static void sub_80FC600(void);
-static void sub_80FC69C(void);
+void sub_80FC69C(void);
void InitRegionMap(struct RegionMap *regionMap, bool8 zoomed)
{
@@ -1127,7 +1127,7 @@ void CreateRegionMapCursor(u16 tileTag, u16 paletteTag)
}
}
-static void sub_80FBCA0(void)
+void sub_80FBCA0(void)
{
if (gRegionMap->cursorSprite != NULL)
{
@@ -1420,7 +1420,7 @@ struct UnknownStruct4
static const u8 *const sEverGrandeCityAreaNames[] = {OtherText_PokeLeague, OtherText_PokeCenter};
-static const struct UnknownStruct4 sUnknown_083E79C0[1] =
+const struct UnknownStruct4 gUnknown_083E79C0[1] =
{
{sEverGrandeCityAreaNames, MAPSEC_EVER_GRANDE_CITY, FLAG_SYS_POKEMON_LEAGUE_FLY},
};
@@ -1540,11 +1540,11 @@ void CB2_InitFlyRegionMap(void)
FreeAllSpritePalettes();
break;
case 1:
- SetUpWindowConfig(&gWindowConfig_81E7224);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E7224);
break;
case 2:
- InitMenuWindow(&gWindowConfig_81E7224);
- MenuZeroFillScreen();
+ InitMenuWindow(&gWindowTemplate_81E7224);
+ Menu_EraseScreen();
break;
case 3:
InitRegionMap(&ewram0_3.regionMap, 0);
@@ -1562,7 +1562,7 @@ void CB2_InitFlyRegionMap(void)
break;
case 6:
LoadPalette(sFlyRegionMapFrame_Pal, 16, 32);
- MenuPrint_PixelCoords(gOtherText_FlyToWhere, 1, 0x90, 1);
+ Menu_PrintTextPixelCoords(gOtherText_FlyToWhere, 1, 0x90, 1);
break;
case 7:
CreateFlyTargetGraphics();
@@ -1591,14 +1591,14 @@ static void VBlankCB_FlyRegionMap(void)
TransferPlttBuffer();
}
-static void CB2_FlyRegionMap(void)
+void CB2_FlyRegionMap(void)
{
ewram0_3.unk0();
AnimateSprites();
BuildOamBuffer();
}
-static void sub_80FC244(void (*func)(void))
+void sub_80FC244(void (*func)(void))
{
ewram0_3.unk0 = func;
ewram0_3.unk4 = 0;
@@ -1608,39 +1608,38 @@ static void PrintFlyTargetName(void)
{
if (ewram0_3.regionMap.unk16 == 2 || ewram0_3.regionMap.unk16 == 4)
{
- u16 i = 0;
- int zero;
+ u16 i;
+ bool32 drawFrameDisabled = FALSE;
- for (i = 0; i < ARRAY_COUNT(sUnknown_083E79C0); i++)
+ for (i = 0; i < ARRAY_COUNT(gUnknown_083E79C0); i++)
{
- const struct UnknownStruct4 *r4 = &sUnknown_083E79C0[i];
+ const struct UnknownStruct4 *r4 = &gUnknown_083E79C0[i];
if (ewram0_3.regionMap.mapSectionId == r4->mapSectionId)
{
if (FlagGet(r4->flag))
{
- MenuDrawTextWindow(16, 14, 29, 19);
- MenuPrint(ewram0_3.regionMap.mapSectionName, 17, 15);
+ Menu_DrawStdWindowFrame(16, 14, 29, 19);
+ Menu_PrintText(ewram0_3.regionMap.mapSectionName, 17, 15);
MenuPrint_RightAligned(r4->unk0[ewram0_3.regionMap.everGrandeCityArea], 29, 17);
return;
}
break;
}
}
- // This check is always true, but somehow the compiler still performed it.
- asm("mov %0, #0\n":"=r"(zero)); // zero = 0
- if (zero == 0)
+
+ if (!drawFrameDisabled)
{
- MenuDrawTextWindow(16, 16, 29, 19);
- MenuPrint(ewram0_3.regionMap.mapSectionName, 17, 17);
- MenuZeroFillWindowRect(16, 14, 29, 15);
+ Menu_DrawStdWindowFrame(16, 16, 29, 19);
+ Menu_PrintText(ewram0_3.regionMap.mapSectionName, 17, 17);
+ Menu_EraseWindowRect(16, 14, 29, 15);
}
}
else
{
- MenuDrawTextWindow(16, 16, 29, 19);
- MenuPrint(ewramBlankMapName, 17, 17);
- MenuZeroFillWindowRect(16, 14, 29, 15);
+ Menu_DrawStdWindowFrame(16, 16, 29, 19);
+ Menu_PrintText(ewramBlankMapName, 17, 17);
+ Menu_EraseWindowRect(16, 14, 29, 15);
}
}
@@ -1796,7 +1795,7 @@ static void sub_80FC600(void)
}
}
-static void sub_80FC69C(void)
+void sub_80FC69C(void)
{
switch (ewram0_3.unk4)
{
diff --git a/src/field/roamer.c b/src/field/roamer.c
index 2eb26ef9d..6ed5b6c89 100644
--- a/src/field/roamer.c
+++ b/src/field/roamer.c
@@ -1,7 +1,9 @@
#include "global.h"
+#include "debug.h"
#include "roamer.h"
#include "pokemon.h"
#include "random.h"
+#include "region_map.h"
#include "constants/species.h"
#ifdef SAPPHIRE
@@ -224,3 +226,20 @@ void GetRoamerLocation(u8 *mapGroup, u8 *mapNum)
*mapGroup = sRoamerLocation[MAP_GRP];
*mapNum = sRoamerLocation[MAP_NUM];
}
+
+#if DEBUG
+void debug_sub_814A714(void)
+{
+ if (gSaveBlock1.location.mapGroup == 0)
+ {
+ CreateInitialRoamerMon();
+ sRoamerLocation[0] = 0;
+ sRoamerLocation[1] = gSaveBlock1.location.mapNum;
+ }
+}
+
+void debug_sub_814A73C(u8* str)
+{
+ GetMapSectionName(str, sRoamerLocation[1], 0);
+}
+#endif
diff --git a/src/field/safari_zone.c b/src/field/safari_zone.c
index e9ca3a9f9..f371b08b3 100644
--- a/src/field/safari_zone.c
+++ b/src/field/safari_zone.c
@@ -26,7 +26,7 @@ static void DecrementFeederStepCounters(void);
extern u8 gBattleOutcome;
EWRAM_DATA u8 gNumSafariBalls = 0;
-EWRAM_DATA static u16 gSafariZoneStepCounter = 0;
+EWRAM_DATA u16 gSafariZoneStepCounter = 0;
EWRAM_DATA static struct PokeblockFeeder gPokeblockFeeders[NUM_POKEBLOCK_FEEDERS] = {0};
extern void (*gFieldCallback)(void);
@@ -56,7 +56,7 @@ void ResetSafariZoneFlag(void)
void EnterSafariMode(void)
{
- IncrementGameStat(0x11);
+ IncrementGameStat(GAME_STAT_ENTERED_SAFARI_ZONE);
SetSafariZoneFlag();
ClearAllPokeblockFeeders();
gNumSafariBalls = 30;
diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c
index 05a909e81..bc5cd0b1d 100644
--- a/src/field/scrcmd.c
+++ b/src/field/scrcmd.c
@@ -626,7 +626,7 @@ bool8 IsPaletteNotActive(void)
bool8 ScrCmd_fadescreen(struct ScriptContext *ctx)
{
- fade_screen(ScriptReadByte(ctx), 0);
+ FadeScreen(ScriptReadByte(ctx), 0);
SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
@@ -636,7 +636,7 @@ bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx)
u8 duration = ScriptReadByte(ctx);
u8 delay = ScriptReadByte(ctx);
- fade_screen(duration, delay);
+ FadeScreen(duration, delay);
SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
@@ -1333,7 +1333,7 @@ bool8 ScrCmd_drawbox(struct ScriptContext *ctx)
u8 right = ScriptReadByte(ctx);
u8 bottom = ScriptReadByte(ctx);
- MenuDrawTextWindow(left, top, right, bottom);
+ Menu_DrawStdWindowFrame(left, top, right, bottom);
return FALSE;
}
@@ -1363,7 +1363,7 @@ bool8 ScrCmd_erasebox(struct ScriptContext *ctx)
u8 right = ScriptReadByte(ctx);
u8 bottom = ScriptReadByte(ctx);
- MenuZeroFillWindowRect(left, top, right, bottom);
+ Menu_EraseWindowRect(left, top, right, bottom);
return FALSE;
}
@@ -1428,8 +1428,8 @@ bool8 ScrCmd_braillemessage(struct ScriptContext *ctx)
u8 v6 = ptr[4];
u8 v7 = ptr[5];
StringBraille(gStringVar4, ptr + 6);
- MenuDrawTextWindow(v2, v3, v4, v5);
- MenuPrint(gStringVar4, v6, v7);
+ Menu_DrawStdWindowFrame(v2, v3, v4, v5);
+ Menu_PrintText(gStringVar4, v6, v7);
return FALSE;
}
@@ -1755,7 +1755,7 @@ bool8 ScrCmd_pokemart(struct ScriptContext *ctx)
{
void *ptr = (void *)ScriptReadWord(ctx);
- CreatePokemartMenu(ptr);
+ Shop_CreatePokemartMenu(ptr);
ScriptContext1_Stop();
return TRUE;
}
@@ -1764,7 +1764,7 @@ bool8 ScrCmd_pokemartdecoration(struct ScriptContext *ctx)
{
void *ptr = (void *)ScriptReadWord(ctx);
- CreateDecorationShop1Menu(ptr);
+ Shop_CreateDecorationShop1Menu(ptr);
ScriptContext1_Stop();
return TRUE;
}
@@ -1773,7 +1773,7 @@ bool8 ScrCmd_pokemartdecoration2(struct ScriptContext *ctx)
{
void *ptr = (void *)ScriptReadWord(ctx);
- CreateDecorationShop2Menu(ptr);
+ Shop_CreateDecorationShop2Menu(ptr);
ScriptContext1_Stop();
return TRUE;
}
diff --git a/src/field/script_menu.c b/src/field/script_menu.c
index 9f3ab75cc..9d901a03c 100644
--- a/src/field/script_menu.c
+++ b/src/field/script_menu.c
@@ -622,7 +622,7 @@ bool8 ScriptMenu_MultichoiceWithDefault(u8 left, u8 top, u8 multichoiceId, u8 ig
static u16 GetStringWidthInTilesForScriptMenu(const u8 *str)
{
// each tile on screen is 8x8, so it needs the number of tiles and not pixels, hence the division by 8.
- return (GetStringWidthGivenWindowConfig((struct WindowConfig *)&gWindowConfig_81E6CE4, str) + 7) / 8;
+ return (Text_GetStringWidthFromWindowTemplate((struct WindowTemplate *)&gWindowTemplate_81E6CE4, str) + 7) / 8;
}
static void DrawMultichoiceMenu(u8 left, u8 top, u8 count, const struct MenuAction *list, u8 ignoreBPress, u8 cursorPos)
@@ -651,8 +651,8 @@ static void DrawMultichoiceMenu(u8 left, u8 top, u8 count, const struct MenuActi
bottom = top + (2 * count + 1);
- MenuDrawTextWindow(left, top, right, bottom);
- PrintMenuItems(left + 1, top + 1, count, list);
+ Menu_DrawStdWindowFrame(left, top, right, bottom);
+ Menu_PrintItems(left + 1, top + 1, count, list);
InitMenu(0, left + 1, top + 1, count, cursorPos, right - left - 1);
StartScriptMenuTask(left, top, right, bottom, ignoreBPress, count);
}
@@ -687,9 +687,9 @@ static void Task_HandleMultichoiceInput(u8 taskId)
if (!gPaletteFade.active)
{
if (!gTasks[taskId].tDoWrap)
- selection = ProcessMenuInputNoWrap();
+ selection = Menu_ProcessInputNoWrap();
else
- selection = ProcessMenuInput();
+ selection = Menu_ProcessInput();
if (selection != -2)
{
@@ -704,8 +704,8 @@ static void Task_HandleMultichoiceInput(u8 taskId)
{
gSpecialVar_Result = selection;
}
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom);
DestroyTask(taskId);
EnableBothScriptContexts();
}
@@ -745,7 +745,7 @@ static void sub_80B53B4(u8 left, u8 top, u8 count, const struct MenuAction *list
right = (right + left) + 2;
bottom = top + (2 * count + 1);
- PrintMenuItems(left, top, count, list);
+ Menu_PrintItems(left, top, count, list);
InitMenu(0, left, top, count, 0, right - left - 1);
StartScriptMenuTask(left, top, right, bottom, ignoreBPress, count);
}
@@ -788,7 +788,7 @@ static void Task_HandleYesNoInput(u8 taskId)
return;
}
- switch (ProcessMenuInputNoWrap())
+ switch (Menu_ProcessInputNoWrap())
{
case -2:
return;
@@ -805,7 +805,7 @@ static void Task_HandleYesNoInput(u8 taskId)
left = gTasks[taskId].tLeft;
top = gTasks[taskId].tTop;
- MenuZeroFillWindowRect(left, top, left + 6, top + 5);
+ Menu_EraseWindowRect(left, top, left + 6, top + 5);
DestroyTask(taskId);
EnableBothScriptContexts();
}
@@ -839,7 +839,7 @@ bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPr
bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 3 + top;
}
- width = sub_807288C(columnCount);
+ width = Menu_GetColumnXCoord(columnCount);
gTasks[taskId].tLeft = left;
gTasks[taskId].tTop = top;
gTasks[taskId].tRight = width + left + 2;
@@ -851,7 +851,7 @@ bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPr
static void Task_HandleMultichoiceGridInput(u8 taskId)
{
- s8 selection = sub_80727CC();
+ s8 selection = Menu_ProcessInputGridLayout();
if (selection != -2)
{
@@ -866,8 +866,8 @@ static void Task_HandleMultichoiceGridInput(u8 taskId)
{
gSpecialVar_Result = selection;
}
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom);
DestroyTask(taskId);
EnableBothScriptContexts();
}
@@ -909,23 +909,23 @@ void ScriptMenu_CreatePCMenu(void)
if (FlagGet(FLAG_SYS_GAME_CLEAR)) // player has cleared game?
{
numChoices = 4;
- MenuDrawTextWindow(0, 0, width + 2, 9);
- MenuPrint(gPCText_HallOfFame, 1, 5);
- MenuPrint(gPCText_LogOff, 1, 7);
+ Menu_DrawStdWindowFrame(0, 0, width + 2, 9);
+ Menu_PrintText(gPCText_HallOfFame, 1, 5);
+ Menu_PrintText(gPCText_LogOff, 1, 7);
}
else
{
numChoices = 3;
- MenuDrawTextWindow(0, 0, width + 2, 7);
- MenuPrint(gPCText_LogOff, 1, 5);
+ Menu_DrawStdWindowFrame(0, 0, width + 2, 7);
+ Menu_PrintText(gPCText_LogOff, 1, 5);
}
if (FlagGet(FLAG_SYS_PC_LANETTE)) // player met lanette?
- MenuPrint(gPCText_LanettesPC, 1, 1);
+ Menu_PrintText(gPCText_LanettesPC, 1, 1);
else
- MenuPrint(gPCText_SomeonesPC, 1, 1);
+ Menu_PrintText(gPCText_SomeonesPC, 1, 1);
- MenuPrint(gPCText_PlayersPC, 1, 3);
+ Menu_PrintText(gPCText_PlayersPC, 1, 3);
InitMenu(0, 1, 1, numChoices, 0, width + 1);
StartScriptMenuTask(0, 0, width + 2, 2 * numChoices + 1, 0, numChoices);
}
@@ -1008,15 +1008,15 @@ _080B57B4:\n\
movs r0, 0\n\
movs r1, 0\n\
movs r3, 0x9\n\
- bl MenuDrawTextWindow\n\
+ bl Menu_DrawStdWindowFrame\n\
ldr r0, _080B57F8 @ =gPCText_HallOfFame\n\
movs r1, 0x1\n\
movs r2, 0x5\n\
- bl MenuPrint\n\
+ bl Menu_PrintText\n\
ldr r0, _080B57F0 @ =gPCText_LogOff\n\
movs r1, 0x1\n\
movs r2, 0x7\n\
- bl MenuPrint\n\
+ bl Menu_PrintText\n\
b _080B5818\n\
.align 2, 0\n\
_080B57E8: .4byte gPCText_SomeonesPC\n\
@@ -1032,11 +1032,11 @@ _080B57FC:\n\
movs r0, 0\n\
movs r1, 0\n\
movs r3, 0x7\n\
- bl MenuDrawTextWindow\n\
+ bl Menu_DrawStdWindowFrame\n\
ldr r0, _080B5834 @ =gPCText_LogOff\n\
movs r1, 0x1\n\
movs r2, 0x5\n\
- bl MenuPrint\n\
+ bl Menu_PrintText\n\
_080B5818:\n\
adds r6, r4, 0\n\
ldr r0, _080B5838 @ =0x0000084b\n\
@@ -1047,7 +1047,7 @@ _080B5818:\n\
ldr r0, _080B583C @ =gPCText_LanettesPC\n\
movs r1, 0x1\n\
movs r2, 0x1\n\
- bl MenuPrint\n\
+ bl Menu_PrintText\n\
b _080B584A\n\
.align 2, 0\n\
_080B5834: .4byte gPCText_LogOff\n\
@@ -1057,12 +1057,12 @@ _080B5840:\n\
ldr r0, _080B5888 @ =gPCText_SomeonesPC\n\
movs r1, 0x1\n\
movs r2, 0x1\n\
- bl MenuPrint\n\
+ bl Menu_PrintText\n\
_080B584A:\n\
ldr r0, _080B588C @ =gPCText_PlayersPC\n\
movs r1, 0x1\n\
movs r2, 0x3\n\
- bl MenuPrint\n\
+ bl Menu_PrintText\n\
movs r4, 0\n\
str r4, [sp]\n\
adds r0, r5, 0x1\n\
@@ -1096,8 +1096,8 @@ _080B588C: .4byte gPCText_PlayersPC\n\
void ScriptMenu_DisplayPCStartupPrompt(void)
{
- MenuDisplayMessageBox();
- MenuPrint(gPCText_WhichPCShouldBeAccessed, 2, 15);
+ Menu_DisplayDialogueFrame();
+ Menu_PrintText(gPCText_WhichPCShouldBeAccessed, 2, 15);
}
#define tState data[0]
@@ -1122,7 +1122,7 @@ static void Task_PokemonPicWindow(u8 taskId)
task->tState++;
break;
case 3:
- MenuZeroFillWindowRect(task->tWindowX, task->tWindowY, task->tWindowX + 9, task->tWindowY + 10);
+ Menu_EraseWindowRect(task->tWindowX, task->tWindowY, task->tWindowX + 9, task->tWindowY + 10);
DestroyTask(taskId);
break;
}
@@ -1139,7 +1139,7 @@ bool8 ScriptMenu_ShowPokemonPic(u16 species, u8 x, u8 y)
}
else
{
- MenuDrawTextWindow(x, y, x + 9, y + 10);
+ Menu_DrawStdWindowFrame(x, y, x + 9, y + 10);
taskId = CreateTask(Task_PokemonPicWindow, 0x50);
gTasks[taskId].tState = 0;
gTasks[taskId].tMonSpecies = species;
diff --git a/src/field/secret_base.c b/src/field/secret_base.c
index 2e4138a3b..8b67a2cd9 100644
--- a/src/field/secret_base.c
+++ b/src/field/secret_base.c
@@ -51,7 +51,7 @@ static void Task_SecretBasePC_Registry(u8 taskId);
extern u8 gUnknown_0815F399[];
extern u8 gUnknown_0815F49A[];
-extern u8 gUnknown_020387DC;
+EWRAM_DATA u8 gUnknown_020387DC = 0;
const struct
{
@@ -348,7 +348,7 @@ void sub_80BBA48(u8 taskid)
void sub_80BBAF0(void)
{
CreateTask(sub_80BBA48, 0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1);
}
@@ -362,7 +362,7 @@ bool8 sub_80BBB24(void)
void sub_80BBB50(u8 taskid)
{
FieldObjectTurn(&(gMapObjects[gPlayerAvatar.mapObjectId]), 2);
- if (sub_807D770() == 1) {
+ if (IsWeatherNotFadingIn() == 1) {
EnableBothScriptContexts();
DestroyTask(taskid);
}
@@ -397,7 +397,7 @@ void sub_80BBC78(void)
{
u8 taskid = CreateTask(sub_80BBBEC, 0);
gTasks[taskid].data[0] = 0;
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
bool8 CurrentMapIsSecretBase(void)
@@ -534,7 +534,7 @@ void sub_80BC074(u8 taskid)
void sub_80BC0F8(void) {
CreateTask(sub_80BC074, 0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
void sub_80BC114(void) {
@@ -895,7 +895,7 @@ void Task_SecretBasePC_Registry(u8 taskId)
s16 *taskData;
ScriptContext2_Enable();
- sub_80F944C();
+ ClearVerticalScrollIndicatorPalettes();
LoadScrollIndicatorPalette();
taskData = gTasks[taskId].data;
@@ -913,7 +913,7 @@ void Task_SecretBasePC_Registry(u8 taskId)
taskData[1] = 0;
taskData[2] = 0;
- MenuZeroFillWindowRect(0, 0, 29, 19);
+ Menu_EraseWindowRect(0, 0, 29, 19);
sub_80BC7D8(taskId);
gTasks[taskId].func = sub_80BC824;
@@ -948,8 +948,8 @@ void sub_80BC6B0(u8 taskId)
if (sub_80BC268(i) == TRUE)
{
sub_80BC190(gStringVar1, i);
- MenuFillWindowRectWithBlankTile(18, 2 * n + 2, 28, 2 * n + 3);
- MenuPrint(gStringVar1, 18, 2 * n + 2);
+ Menu_BlankWindowRect(18, 2 * n + 2, 28, 2 * n + 3);
+ Menu_PrintText(gStringVar1, 18, 2 * n + 2);
if (++n == 8)
break;
}
@@ -957,25 +957,25 @@ void sub_80BC6B0(u8 taskId)
if (n < 8)
{
- MenuFillWindowRectWithBlankTile(18, 2 * n + 2, 28, 2 * n + 3);
- MenuPrint(gUnknownText_Exit, 18, 2 * n + 2);
- DestroyVerticalScrollIndicator(1);
+ Menu_BlankWindowRect(18, 2 * n + 2, 28, 2 * n + 3);
+ Menu_PrintText(gUnknownText_Exit, 18, 2 * n + 2);
+ DestroyVerticalScrollIndicator(BOTTOM_ARROW);
if (n != 7)
- MenuFillWindowRectWithBlankTile(18, ((n << 25) + (1 << 26)) >> 24, 28, 18); // the shifts are needed to match
+ Menu_BlankWindowRect(18, ((n << 25) + (1 << 26)) >> 24, 28, 18); // the shifts are needed to match
}
else
- CreateVerticalScrollIndicators(1, 0xbc, 0x98);
+ CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xbc, 0x98);
if (taskData[2] == 0)
- DestroyVerticalScrollIndicator(0);
+ DestroyVerticalScrollIndicator(TOP_ARROW);
else
- CreateVerticalScrollIndicators(0, 0xbc, 0x08);
+ CreateVerticalScrollIndicators(TOP_ARROW, 0xbc, 0x08);
}
void sub_80BC7D8(u8 taskId)
{
u16 *taskData = gTasks[taskId].data;
- MenuDrawTextWindow(17, 0, 29, 19);
+ Menu_DrawStdWindowFrame(17, 0, 29, 19);
InitMenu(0, 18, 2, taskData[3] + 1, taskData[1], 11);
sub_80BC6B0(taskId);
@@ -990,7 +990,7 @@ void sub_80BC824(u8 taskId)
if (taskData[1])
{
PlaySE(5);
- taskData[1] = MoveMenuCursor(-1);
+ taskData[1] = Menu_MoveCursor(-1);
}
else if (taskData[2])
{
@@ -1013,7 +1013,7 @@ void sub_80BC824(u8 taskId)
else
{
PlaySE(5);
- taskData[1] = MoveMenuCursor(1);
+ taskData[1] = Menu_MoveCursor(1);
}
}
else if (gMain.newKeys & A_BUTTON)
@@ -1021,13 +1021,13 @@ void sub_80BC824(u8 taskId)
PlaySE(5);
if (taskData[1] + taskData[2] == taskData[0])
{
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 29, 19);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 29, 19);
sub_80BCC54(taskId);
}
else
{
- HandleDestroyMenuCursors();
+ Menu_DestroyCursor();
taskData[4] = sub_80BC948(taskData[1] + taskData[2]);
sub_80BC980(taskId);
}
@@ -1035,8 +1035,8 @@ void sub_80BC824(u8 taskId)
else if (gMain.newKeys & B_BUTTON)
{
PlaySE(5);
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 29, 19);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 29, 19);
sub_80BCC54(taskId);
}
}
@@ -1064,10 +1064,10 @@ u8 sub_80BC948(u8 a)
void sub_80BC980(u8 taskId)
{
- PauseVerticalScrollIndicator(0);
- PauseVerticalScrollIndicator(1);
- MenuDrawTextWindow(1, 0, 12, 5);
- PrintMenuItems(2, 1, 2, (const struct MenuAction *)gUnknown_083D13D4);
+ PauseVerticalScrollIndicator(TOP_ARROW);
+ PauseVerticalScrollIndicator(BOTTOM_ARROW);
+ Menu_DrawStdWindowFrame(1, 0, 12, 5);
+ Menu_PrintItems(2, 1, 2, (const struct MenuAction *)gUnknown_083D13D4);
InitMenu(0, 2, 1, 2, 0, 10);
gTasks[taskId].func = sub_80BC9E4;
}
@@ -1076,24 +1076,24 @@ void sub_80BC9E4(u8 taskId)
{
if (gMain.newAndRepeatedKeys & DPAD_UP)
{
- if (GetMenuCursorPos())
+ if (Menu_GetCursorPos())
{
PlaySE(5);
- MoveMenuCursor(-1);
+ Menu_MoveCursor(-1);
}
}
else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
{
- if (GetMenuCursorPos() != 1)
+ if (Menu_GetCursorPos() != 1)
{
PlaySE(5);
- MoveMenuCursor(1);
+ Menu_MoveCursor(1);
}
}
else if (gMain.newKeys & A_BUTTON)
{
PlaySE(5);
- gUnknown_083D13D4[GetMenuCursorPos()].func(taskId);
+ gUnknown_083D13D4[Menu_GetCursorPos()].func(taskId);
}
else if (gMain.newKeys & B_BUTTON)
{
@@ -1106,10 +1106,10 @@ void sub_80BCA84(u8 taskId)
{
s16 *taskData = gTasks[taskId].data;
- DestroyVerticalScrollIndicator(0);
- DestroyVerticalScrollIndicator(1);
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 29, 19);
+ DestroyVerticalScrollIndicator(TOP_ARROW);
+ DestroyVerticalScrollIndicator(BOTTOM_ARROW);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 29, 19);
sub_80BC190(gStringVar1, taskData[4]);
StringExpandPlaceholders(gStringVar4, gOtherText_OkayToDeleteFromRegistry);
@@ -1126,7 +1126,7 @@ void sub_80BCB10(u8 taskId)
{
s16 *taskData = gTasks[taskId].data;
- MenuZeroFillWindowRect(0, 0, 29, 19);
+ Menu_EraseWindowRect(0, 0, 29, 19);
gSaveBlock1.secretBases[taskData[4]].sbr_field_1_6 = 0;
taskData[0]--;
@@ -1147,13 +1147,13 @@ void sub_80BCB10(u8 taskId)
void sub_80BCB90(u8 taskId)
{
- MenuZeroFillWindowRect(20, 8, 26, 13);
+ Menu_EraseWindowRect(20, 8, 26, 13);
DisplayItemMessageOnField(taskId, gOtherText_RegisteredDataDeleted, sub_80BCB10, 0);
}
void sub_80BCBC0(u8 taskId)
{
- MenuZeroFillWindowRect(0, 0, 29, 19);
+ Menu_EraseWindowRect(0, 0, 29, 19);
sub_80BC7D8(taskId);
gTasks[taskId].func = sub_80BC824;
@@ -1164,9 +1164,9 @@ void sub_80BCBF8(u8 taskId)
s16 *taskData = gTasks[taskId].data;
InitMenu(0, 18, 2, taskData[3] + 1, taskData[1], 11);
- MenuZeroFillWindowRect(1, 0, 12, 5);
- StartVerticalScrollIndicators(0);
- StartVerticalScrollIndicators(1);
+ Menu_EraseWindowRect(1, 0, 12, 5);
+ StartVerticalScrollIndicators(TOP_ARROW);
+ StartVerticalScrollIndicators(BOTTOM_ARROW);
gTasks[taskId].func = sub_80BC824;
}
@@ -1176,8 +1176,8 @@ void sub_80BCC54(u8 taskId)
u16 curBaseIndex = VarGet(VAR_CURRENT_SECRET_BASE);
BuyMenuFreeMemory();
- DestroyVerticalScrollIndicator(0);
- DestroyVerticalScrollIndicator(1);
+ DestroyVerticalScrollIndicator(TOP_ARROW);
+ DestroyVerticalScrollIndicator(BOTTOM_ARROW);
if (curBaseIndex == 0)
{
@@ -1648,6 +1648,178 @@ void sub_80BD610(struct SecretBaseRecord *basesA, struct SecretBaseRecord *bases
sub_80BD328(basesC, 0);
}
+#if DEBUG
+__attribute__((naked))
+void sub_80BD674(void *playerRecords, u32 size, u8 c)
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ add r6, r0, #0\n\
+ add r5, r1, #0\n\
+ lsl r2, r2, #0x18\n\
+ lsr r7, r2, #0x18\n\
+ ldr r0, ._503 @ gUnknown_020297ED\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ bne ._498 @cond_branch\n\
+ mov r0, #0x60\n\
+ bl FlagGet\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._498 @cond_branch\n\
+ b ._520\n\
+._498:\n\
+ bl GetLinkPlayerCount\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x2\n\
+ beq ._500 @cond_branch\n\
+ cmp r0, #0x3\n\
+ beq ._501 @cond_branch\n\
+ b ._505\n\
+._504:\n\
+ .align 2, 0\n\
+._503:\n\
+ .word gUnknown_020297ED\n\
+._500:\n\
+ lsl r4, r5, #0x1\n\
+ add r0, r6, r4\n\
+ mov r1, #0x0\n\
+ add r2, r5, #0\n\
+ bl memset\n\
+ add r4, r4, r5\n\
+ add r4, r6, r4\n\
+ add r0, r4, #0\n\
+ mov r1, #0x0\n\
+ add r2, r5, #0\n\
+ bl memset\n\
+ b ._505\n\
+._501:\n\
+ lsl r0, r5, #0x1\n\
+ add r0, r0, r5\n\
+ add r0, r6, r0\n\
+ mov r1, #0x0\n\
+ add r2, r5, #0\n\
+ bl memset\n\
+._505:\n\
+ cmp r7, #0x1\n\
+ beq ._506 @cond_branch\n\
+ cmp r7, #0x1\n\
+ bgt ._507 @cond_branch\n\
+ cmp r7, #0\n\
+ beq ._508 @cond_branch\n\
+ b ._515\n\
+._507:\n\
+ cmp r7, #0x2\n\
+ beq ._510 @cond_branch\n\
+ cmp r7, #0x3\n\
+ beq ._511 @cond_branch\n\
+ b ._515\n\
+._508:\n\
+ add r0, r6, r5\n\
+ lsl r2, r5, #0x1\n\
+ add r1, r6, r2\n\
+ add r2, r2, r5\n\
+ add r2, r6, r2\n\
+ bl sub_80BD610\n\
+ b ._515\n\
+._506:\n\
+ lsl r1, r5, #0x1\n\
+ add r0, r6, r1\n\
+ add r1, r1, r5\n\
+ add r1, r6, r1\n\
+ add r2, r6, #0\n\
+ bl sub_80BD610\n\
+ b ._515\n\
+._510:\n\
+ lsl r0, r5, #0x1\n\
+ add r0, r0, r5\n\
+ add r0, r6, r0\n\
+ add r2, r6, r5\n\
+ add r1, r6, #0\n\
+ bl sub_80BD610\n\
+ b ._515\n\
+._511:\n\
+ add r1, r6, r5\n\
+ lsl r2, r5, #0x1\n\
+ add r2, r6, r2\n\
+ add r0, r6, #0\n\
+ bl sub_80BD610\n\
+._515:\n\
+ mov r3, #0x1\n\
+ ldr r6, ._521 @ gSaveBlock1\n\
+ mov r5, #0x10\n\
+ neg r5, r5\n\
+ ldr r4, ._521 + 4 @ 0x1a09\n\
+._517:\n\
+ lsl r0, r3, #0x2\n\
+ add r0, r0, r3\n\
+ lsl r0, r0, #0x5\n\
+ add r0, r0, r6\n\
+ add r2, r0, r4\n\
+ ldrb r1, [r2]\n\
+ lsl r0, r1, #0x1c\n\
+ lsr r0, r0, #0x1c\n\
+ cmp r0, #0x1\n\
+ bne ._516 @cond_branch\n\
+ mov r0, #0x3f\n\
+ and r0, r0, r1\n\
+ mov r1, #0x40\n\
+ orr r0, r0, r1\n\
+ and r0, r0, r5\n\
+ strb r0, [r2]\n\
+._516:\n\
+ add r0, r3, #1\n\
+ lsl r0, r0, #0x10\n\
+ lsr r3, r0, #0x10\n\
+ cmp r3, #0x13\n\
+ bls ._517 @cond_branch\n\
+ bl sub_80BD280\n\
+ mov r3, #0x1\n\
+ ldr r4, ._521 @ gSaveBlock1\n\
+ ldr r6, ._521 + 4 @ 0x1a09\n\
+ add r7, r4, #0\n\
+ mov r5, #0x3f\n\
+._519:\n\
+ lsl r0, r3, #0x2\n\
+ add r0, r0, r3\n\
+ lsl r0, r0, #0x5\n\
+ add r0, r0, r4\n\
+ add r2, r0, r6\n\
+ ldrb r1, [r2]\n\
+ lsr r0, r1, #0x6\n\
+ cmp r0, #0x2\n\
+ bne ._518 @cond_branch\n\
+ add r0, r5, #0\n\
+ and r0, r0, r1\n\
+ strb r0, [r2]\n\
+._518:\n\
+ add r0, r3, #1\n\
+ lsl r0, r0, #0x10\n\
+ lsr r3, r0, #0x10\n\
+ cmp r3, #0x13\n\
+ bls ._519 @cond_branch\n\
+ ldr r0, ._521 + 8 @ 0x1a16\n\
+ add r2, r7, r0\n\
+ ldrh r1, [r2]\n\
+ ldr r0, ._521 + 12 @ 0xffff\n\
+ cmp r1, r0\n\
+ beq ._520 @cond_branch\n\
+ add r0, r1, #1\n\
+ strh r0, [r2]\n\
+._520:\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+._522:\n\
+ .align 2, 0\n\
+._521:\n\
+ .word gSaveBlock1\n\
+ .word 0x1a09\n\
+ .word 0x1a16\n\
+ .word 0xffff");
+}
+#else
void sub_80BD674(void *playerRecords, u32 size, u8 c)
{
if (FlagGet(FLAG_RECEIVED_SECRET_POWER))
@@ -1706,3 +1878,4 @@ void sub_80BD674(void *playerRecords, u32 size, u8 c)
}
}
}
+#endif
diff --git a/src/field/shop.c b/src/field/shop.c
index 23d668fc7..fdee31178 100644
--- a/src/field/shop.c
+++ b/src/field/shop.c
@@ -15,7 +15,7 @@
#include "strings.h"
#include "task.h"
#include "tv.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "field_map_obj.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
@@ -28,54 +28,66 @@
#include "field_camera.h"
#include "ewram.h"
-extern bool8 sub_80A52C4(u8, u8);
+extern bool8 SellMenu_QuantityRoller(u8, u8);
extern u8 gBuyMenuFrame_Gfx[];
extern u16 gBuyMenuFrame_Tilemap[];
extern u16 gMenuMoneyPal[16];
-void sub_80B39D0(int var1, int var2, bool32 hasControlCode);
-void sub_80B3A70(void);
-void sub_80B4378(u8);
-void sub_80B43F0(u8);
-void Task_ExitBuyMenu(u8);
-void sub_80B4470(u8);
-void sub_80B2EFC(u8 taskId);
-void sub_80B2F30(u8 taskId);
-void HandleShopMenuQuit(u8 taskId);
-void sub_80B3BF4(u8 taskId);
-void sub_80B3D7C(u8 taskId);
+static void Shop_DisplayPriceInList(int firstItemId, int lastItemId, bool32 hasControlCode);
+static void Shop_PrintItemDescText(void);
+static void Task_ReturnToBuyMenu(u8);
+static void Task_ExitBuyMenu(u8);
+static void Task_ExitBuyMenuDoFade(u8);
+static void Task_UpdatePurchaseHistory(u8);
+static void Task_HandleShopMenuBuy(u8 taskId);
+static void Task_HandleShopMenuSell(u8 taskId);
+static void Task_HandleShopMenuQuit(u8 taskId);
+static void Task_DoItemPurchase(u8 taskId);
+static void Task_CancelItemPurchase(u8 taskId);
+static void Task_DoBuySellMenu(u8);
+static void Shop_FadeAndRunBuySellCallback(u8);
+static void BuyMenuDrawGraphics(void);
+static void sub_80B3240(void);
+static void DrawFirstMartScrollIndicators(void);
+static void Shop_DrawViewport(void);
+static void Shop_InitMenus(int, int);
+static void Shop_PrintItemDesc(void);
+static void Shop_DoCursorAction(u8);
+static void Shop_LoadViewportObjects(void);
+static void Shop_AnimViewportObjects(void);
// iwram
static struct MartInfo gMartInfo;
// ewram
EWRAM_DATA u32 gMartTotalCost = 0;
-EWRAM_DATA s16 gUnknown_020386A4[16][4] = {0};
-EWRAM_DATA struct ItemSlot gUnknown_02038724[3] = {0}; // tv.c uses this, so it cant be static
-EWRAM_DATA u8 gUnknown_02038730 = 0;
-EWRAM_DATA u8 gUnknown_02038731 = 0;
+EWRAM_DATA s16 gMartViewportObjects[16][4] = {0};
+EWRAM_DATA struct ItemSlot gMartPurchaseHistory[3] = {0};
+EWRAM_DATA u8 gMartPurchaseHistoryId = 0;
+
+EWRAM_DATA u8 gUnknown_02038731 = 0; // This really should be in fldeff_escalator, but being in a new file aligns the ewram, which doesnt match the ROM.
// rodata
static const struct MenuAction2 sBuySellQuitMenuActions[] =
{
- { MartText_Buy, sub_80B2EFC },
- { MartText_Sell, sub_80B2F30 },
- { MartText_Quit2, HandleShopMenuQuit },
+ { MartText_Buy, Task_HandleShopMenuBuy },
+ { MartText_Sell, Task_HandleShopMenuSell },
+ { MartText_Quit2, Task_HandleShopMenuQuit },
};
-static const u8 gUnknown_083CC6E8[] = {0, 1, 2}; // BUY SELL EXIT
-static const u8 gUnknown_083CC6EB[] = {0, 2}; // BUY EXIT
+static const u8 gMartBuySellOptionList[] = {SHOP_BUY, SHOP_SELL, SHOP_EXIT};
+static const u8 gMartBuyNoSellOptionList[] = {SHOP_BUY, SHOP_EXIT};
static const u16 gUnusedMartArray[] = {0x2, 0x3, 0x4, 0xD, 0x121, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x0, 0x0};
-static const struct YesNoFuncTable gUnknown_083CC708[] =
+static const struct YesNoFuncTable sShopPurchaseYesNoFuncs[] =
{
- sub_80B3BF4,
- sub_80B3D7C
+ Task_DoItemPurchase,
+ Task_CancelItemPurchase
};
-u8 CreateShopMenu(u8 martType)
+static u8 CreateShopMenu(u8 martType)
{
ScriptContext2_Enable();
gMartInfo.martType = martType;
@@ -84,26 +96,26 @@ u8 CreateShopMenu(u8 martType)
if (martType == MART_TYPE_0)
{
gMartInfo.numChoices = 2;
- MenuDrawTextWindow(0, 0, 10, 7);
- PrintMenuItemsReordered(1, 1, 3, sBuySellQuitMenuActions, gUnknown_083CC6E8);
+ Menu_DrawStdWindowFrame(0, 0, 10, 7);
+ Menu_PrintItemsReordered(1, 1, 3, sBuySellQuitMenuActions, gMartBuySellOptionList);
}
else
{
gMartInfo.numChoices = 1;
- MenuDrawTextWindow(0, 0, 10, 5);
- PrintMenuItemsReordered(1, 1, 2, sBuySellQuitMenuActions, gUnknown_083CC6EB);
+ Menu_DrawStdWindowFrame(0, 0, 10, 5);
+ Menu_PrintItemsReordered(1, 1, 2, sBuySellQuitMenuActions, gMartBuyNoSellOptionList);
}
InitMenu(0, 1, 1, gMartInfo.numChoices + 1, 0, 9); // add 1 for cancel
- return CreateTask(sub_80B2E38, 8);
+ return CreateTask(Task_DoBuySellMenu, 8);
}
-void SetShopMenuCallback(void *callbackPtr)
+static void SetShopMenuCallback(void *callbackPtr)
{
gMartInfo.callback = callbackPtr;
}
-void SetShopItemsForSale(u16 *items)
+static void SetShopItemsForSale(u16 *items)
{
u16 i = 0;
@@ -117,16 +129,16 @@ void SetShopItemsForSale(u16 *items)
}
}
-void sub_80B2E38(u8 var)
+static void Task_DoBuySellMenu(u8 taskId)
{
- const u8 local = var;
+ const u8 taskIdConst = taskId; // why is a local const needed to match?
if (gMain.newAndRepeatedKeys & DPAD_UP)
{
if (gMartInfo.cursor) // can move cursor up?
{
PlaySE(SE_SELECT);
- gMartInfo.cursor = MoveMenuCursor(-1);
+ gMartInfo.cursor = Menu_MoveCursor(-1);
}
}
else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
@@ -134,7 +146,7 @@ void sub_80B2E38(u8 var)
if (gMartInfo.cursor != gMartInfo.numChoices) // can move cursor down?
{
PlaySE(SE_SELECT);
- gMartInfo.cursor = MoveMenuCursor(1);
+ gMartInfo.cursor = Menu_MoveCursor(1);
}
}
else if (gMain.newKeys & A_BUTTON)
@@ -142,40 +154,40 @@ void sub_80B2E38(u8 var)
PlaySE(SE_SELECT);
if (gMartInfo.martType == MART_TYPE_0)
{
- sBuySellQuitMenuActions[gUnknown_083CC6E8[gMartInfo.cursor]].func(local);
+ sBuySellQuitMenuActions[gMartBuySellOptionList[gMartInfo.cursor]].func(taskIdConst);
}
else
{
- sBuySellQuitMenuActions[gUnknown_083CC6EB[gMartInfo.cursor]].func(local);
+ sBuySellQuitMenuActions[gMartBuyNoSellOptionList[gMartInfo.cursor]].func(taskIdConst);
}
}
else if (gMain.newKeys & B_BUTTON)
{
PlaySE(SE_SELECT);
- HandleShopMenuQuit(local);
+ Task_HandleShopMenuQuit(taskIdConst);
}
}
-void sub_80B2EFC(u8 taskId)
+static void Task_HandleShopMenuBuy(u8 taskId)
{
gTasks[taskId].data[8] = (u32)BuyMenuDrawGraphics >> 16;
gTasks[taskId].data[9] = (u32)BuyMenuDrawGraphics;
- gTasks[taskId].func = sub_80B2FA0;
- fade_screen(1, 0);
+ gTasks[taskId].func = Shop_FadeAndRunBuySellCallback;
+ FadeScreen(1, 0);
}
-void sub_80B2F30(u8 taskId)
+static void Task_HandleShopMenuSell(u8 taskId)
{
- gTasks[taskId].data[8] = (u32)sub_80A6300 >> 16;
- gTasks[taskId].data[9] = (u32)sub_80A6300;
- gTasks[taskId].func = sub_80B2FA0;
- fade_screen(1, 0);
+ gTasks[taskId].data[8] = (u32)ItemMenu_LoadSellMenu >> 16;
+ gTasks[taskId].data[9] = (u32)ItemMenu_LoadSellMenu;
+ gTasks[taskId].func = Shop_FadeAndRunBuySellCallback;
+ FadeScreen(1, 0);
}
-void HandleShopMenuQuit(u8 taskId)
+static void Task_HandleShopMenuQuit(u8 taskId)
{
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 11, 8);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 11, 8);
sub_80BE3BC();
ScriptContext2_Disable();
DestroyTask(taskId);
@@ -184,7 +196,7 @@ void HandleShopMenuQuit(u8 taskId)
gMartInfo.callback(); // run the callback if it exists.
}
-void sub_80B2FA0(u8 taskId)
+static void Shop_FadeAndRunBuySellCallback(u8 taskId)
{
if (!gPaletteFade.active)
{
@@ -193,15 +205,15 @@ void sub_80B2FA0(u8 taskId)
}
}
-void ReturnToShopMenuAfterExitingSellMenu(u8 taskId)
+static void ReturnToShopMenuAfterExitingSellMenu(u8 taskId)
{
CreateShopMenu(gMartInfo.martType);
DestroyTask(taskId);
}
-void Task_ExitSellMenu(u8 taskId)
+static void Task_ReturnToMartMenu(u8 taskId)
{
- if (sub_807D770() == 1)
+ if (IsWeatherNotFadingIn() == 1)
{
if (gMartInfo.martType == MART_TYPE_2)
DisplayItemMessageOnField(taskId, gOtherText_CanIHelpYou, ReturnToShopMenuAfterExitingSellMenu, 0);
@@ -210,23 +222,24 @@ void Task_ExitSellMenu(u8 taskId)
}
}
-void sub_80B3050(void)
+void Shop_FadeReturnToMartMenu(void)
{
pal_fill_black();
- CreateTask(Task_ExitSellMenu, 0x8);
+ CreateTask(Task_ReturnToMartMenu, 0x8);
}
-void sub_80B3068(u8 taskId)
+void Shop_RunExitSellMenuTask(u8 taskId)
{
- Task_ExitSellMenu(taskId);
+ Task_ReturnToMartMenu(taskId);
}
-void unref_sub_80B3078(u8 taskId)
+// unused
+void Shop_LoadExitSellMenuTask(u8 taskId)
{
- gTasks[taskId].func = Task_ExitSellMenu;
+ gTasks[taskId].func = Task_ReturnToMartMenu;
}
-void sub_80B3094(void)
+static void MainCB2(void)
{
AnimateSprites();
BuildOamBuffer();
@@ -234,50 +247,43 @@ void sub_80B3094(void)
UpdatePaletteFade();
}
-void sub_80B30AC(void)
+static void VBlankCB(void)
{
- void *addr;
- void *addr2;
- void *addr3;
- u16 *tempArr;
- u16 *tempArr2;
- u16 *tempArr3;
-
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
-
- // temp vars needed to match for some dumb reason
- tempArr = gBGTilemapBuffers[1];
- addr = (void *)(VRAM + 0xE800);
- DmaCopy16(3, tempArr, addr, 0x800);
- tempArr2 = gBGTilemapBuffers[2];
- addr2 = (void *)(VRAM + 0xE000);
- DmaCopy16(3, tempArr2, addr2, 0x800);
- tempArr3 = gBGTilemapBuffers[3];
- addr3 = (void *)(VRAM + 0xF000);
- DmaCopy16(3, tempArr3, addr3, 0x800);
+ DmaCopy16Defvars(3, gBGTilemapBuffers[1], (void *)(VRAM + 0xE800), 0x800);
+ DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0xE000), 0x800);
+ DmaCopy16Defvars(3, gBGTilemapBuffers[3], (void *)(VRAM + 0xF000), 0x800);
}
-// this function is fugly. pls fix
-void BuyMenuDrawGraphics(void)
+static void BuyMenuDrawGraphics(void)
{
- void *addr;
- register u16 zero2 asm("r5");
-
- sub_80F9438();
- remove_some_task();
- REG_BG1HOFS = (zero2 = 0);
- REG_BG1VOFS = zero2;
- REG_BG2HOFS = zero2;
- REG_BG2VOFS = zero2;
- REG_BG3HOFS = zero2;
- REG_BG3VOFS = zero2;
+ ClearVideoCallbacks();
+ ScanlineEffect_Stop();
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
gPaletteFade.bufferTransferDisabled = 1;
- addr = (void*)OAM;
- {
- register const u32 zero asm("r6") = 0;
- DmaFill32(3, zero, addr, OAM_SIZE);
+
+ /*
+ THEORY: This seemingly useless loop is required in order to match this
+ function without hacks. The reason is because it alters the 0 optimization
+ of a later assignment into using 2 different 0s instead of the same register.
+ It is speculated that at some point Game Freak insert an artificial
+ breakpoint here in order to look at the contents of OAM before it is cleared,
+ possibly because a programmer made a mistake in shop.c which corrupted its
+ contents. There may have been a macro here which at one point idled on the
+ while(1) but was changed to 0 for release due to a define somewhere. A
+ while(0) also matches, but it is more correct to use do {} while(0) as it
+ was a fix to prevent compiler warnings on older compilers.
+ */
+ do {} while(0);
+
+ DmaFill32Defvars(3, 0, (void*)OAM, OAM_SIZE);
LZDecompressVram(gBuyMenuFrame_Gfx, (void*)(VRAM + 0x7C00));
LZDecompressWram(gBuyMenuFrame_Tilemap, ewram18000_2);
LoadCompressedPalette(gMenuMoneyPal, 0xC0, sizeof(gMenuMoneyPal));
@@ -285,74 +291,74 @@ void BuyMenuDrawGraphics(void)
ResetPaletteFade();
ResetSpriteData();
ResetTasks();
- SetUpWindowConfig(&gWindowConfig_81E6DFC);
- InitMenuWindow(&gWindowConfig_81E6DFC);
- BuyMenuDrawMapGraphics();
- gMartInfo.cursor = zero;
- gMartInfo.choicesAbove = zero2;
- MenuZeroFillWindowRect(0, 0, 0x20, 0x20);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6DFC);
+ InitMenuWindow(&gWindowTemplate_81E6DFC);
+ Shop_DrawViewport();
+ gMartInfo.cursor = 0;
+ gMartInfo.choicesAbove = 0;
+ Menu_EraseWindowRect(0, 0, 0x20, 0x20);
OpenMoneyWindow(gSaveBlock1.money, 0, 0);
- sub_80B3764(0, 7);
- sub_80B37EC();
- sub_80B3270();
- CreateTask(sub_80B40E8, 0x8);
+ Shop_InitMenus(0, 7);
+ Shop_PrintItemDesc();
+ DrawFirstMartScrollIndicators();
+ CreateTask(Shop_DoCursorAction, 0x8);
sub_80B3240();
- asm("":::"r4"); // what??
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, zero);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
gPaletteFade.bufferTransferDisabled = 0;
- SetVBlankCallback(sub_80B30AC);
- SetMainCallback2(sub_80B3094);
- }
+ SetVBlankCallback(VBlankCB);
+ SetMainCallback2(MainCB2);
}
-void sub_80B3240(void)
+static void sub_80B3240(void)
{
- u16 tempArr[2] = {0x41EE, 0x7FFF};
+ u16 colors[2] = {RGB(14, 15, 16), RGB_WHITE};
- LoadPalette(&tempArr[1], 0xD1, 2);
- LoadPalette(&tempArr[0], 0xD8, 2);
+ LoadPalette(&colors[1], 0xD1, sizeof colors[1]);
+ LoadPalette(&colors[0], 0xD8, sizeof colors[0]);
}
-void sub_80B3270(void)
+static void DrawFirstMartScrollIndicators(void)
{
- sub_80F944C();
+ ClearVerticalScrollIndicatorPalettes();
if (gMartInfo.itemCount > 7)
{
- CreateVerticalScrollIndicators(0, 172, 12);
- CreateVerticalScrollIndicators(1, 172, 148);
- sub_80F979C(0, 1);
+ CreateVerticalScrollIndicators(TOP_ARROW, 172, 12);
+ CreateVerticalScrollIndicators(BOTTOM_ARROW, 172, 148);
+ SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE);
}
}
-void sub_80B32A4(void)
+static void Shop_TryDrawVerticalScrollIndicators(void)
{
if (gMartInfo.choicesAbove == 0)
- sub_80F979C(0, 1);
+ SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE);
else
- sub_80F979C(0, 0);
+ SetVerticalScrollIndicators(TOP_ARROW, VISIBLE);
if (gMartInfo.choicesAbove + 7 >= gMartInfo.itemCount)
- sub_80F979C(1, 1);
+ SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE);
else
- sub_80F979C(1, 0);
+ SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE);
}
-void sub_80B32EC(u16 *array, s16 offset1, s16 offset2)
+// what is the point of this function? the tiles always get overwritten by BuyMenuDrawTextboxBG.
+static void BuyMenuDrawTextboxBG_Old(u16 *array, s16 offset1, s16 offset2)
{
array[offset1 + offset2] = 0xC3E1;
array[offset1 + offset2 + 1] = 0xC3E1;
}
-void BuyMenuDrawMapMetatileLayer(u16 *array, s16 offset1, s16 offset2, u16 *array2)
+static void BuyMenuDrawMapMetatileLayer(u16 *array, s16 offset1, s16 offset2, u16 *array2)
{
- array[offset1 + offset2] = array2[0];
- array[offset1 + offset2 + 1] = array2[1];
- array[offset1 + offset2 + 32] = array2[2];
- array[offset1 + offset2 + 33] = array2[3];
+ // This function draws a whole 2x2 metatile.
+ array[offset1 + offset2] = array2[0]; // top left
+ array[offset1 + offset2 + 1] = array2[1]; // top right
+ array[offset1 + offset2 + 32] = array2[2]; // bottom left
+ array[offset1 + offset2 + 33] = array2[3]; // bottom right
}
-void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s32 var4)
+static void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s32 var4)
{
u8 tempVar4 = var4;
s16 offset1 = var1 * 2;
@@ -375,7 +381,8 @@ void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s32 var4)
}
}
-void sub_80B33D0(s16 var1, int var2, u16 *var3)
+// used to draw the border tiles around the viewport.
+static void BuyMenuDrawMapPartialMetatile(s16 var1, int var2, u16 *var3)
{
s16 offset1 = var1 * 2;
s16 offset2 = (var2 * 0x40) + 0x40;
@@ -384,7 +391,7 @@ void sub_80B33D0(s16 var1, int var2, u16 *var3)
BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3 + 4);
}
-void sub_80B3420(void)
+static void Shop_DrawViewportTiles(void)
{
s16 facingX;
s16 facingY;
@@ -413,26 +420,26 @@ void sub_80B3420(void)
else
{
if (metatileId < 512)
- sub_80B33D0(x, y, (u16 *)gMapHeader.mapData->primaryTileset->metatiles + metatileId * 8);
+ BuyMenuDrawMapPartialMetatile(x, y, (u16 *)gMapHeader.mapData->primaryTileset->metatiles + metatileId * 8);
else
- sub_80B33D0(x, y, (u16 *)gMapHeader.mapData->secondaryTileset->metatiles + (metatileId - 512) * 8);
+ BuyMenuDrawMapPartialMetatile(x, y, (u16 *)gMapHeader.mapData->secondaryTileset->metatiles + (metatileId - 512) * 8);
}
if (y == 0 && x != 0 && x != 6)
- sub_80B32EC(gBGTilemapBuffers[1], x * 2, 64);
+ BuyMenuDrawTextboxBG_Old(gBGTilemapBuffers[1], x * 2, 64);
}
}
}
-void BuyMenuDrawMapGraphics(void)
+static void Shop_DrawViewport(void)
{
- sub_80F9020();
- sub_80B356C();
- sub_80B368C();
- sub_80B3420();
+ ClearBGTilemapBuffers();
+ Shop_LoadViewportObjects();
+ Shop_AnimViewportObjects();
+ Shop_DrawViewportTiles();
}
-void sub_80B356C(void)
+static void Shop_LoadViewportObjects(void)
{
s16 facingX;
s16 facingY;
@@ -444,7 +451,7 @@ void sub_80B356C(void)
GetXYCoordsOneStepInFrontOfPlayer(&facingX, &facingY);
playerHeight = PlayerGetZCoord();
for (y = 0; y < 16; y++)
- gUnknown_020386A4[y][MAP_OBJ_ID] = 16;
+ gMartViewportObjects[y][MAP_OBJ_ID] = 16;
for (y = 0; y < 5; y++)
{
for (x = 0; x < 7; x++)
@@ -453,43 +460,43 @@ void sub_80B356C(void)
if (mapObjId != 16)
{
- gUnknown_020386A4[r8][MAP_OBJ_ID] = mapObjId;
- gUnknown_020386A4[r8][X_COORD] = x;
- gUnknown_020386A4[r8][Y_COORD] = y;
+ gMartViewportObjects[r8][MAP_OBJ_ID] = mapObjId;
+ gMartViewportObjects[r8][X_COORD] = x;
+ gMartViewportObjects[r8][Y_COORD] = y;
if (gMapObjects[mapObjId].mapobj_unk_18 == 1)
- gUnknown_020386A4[r8][ANIM_NUM] = 0;
+ gMartViewportObjects[r8][ANIM_NUM] = 0;
if (gMapObjects[mapObjId].mapobj_unk_18 == 2)
- gUnknown_020386A4[r8][ANIM_NUM] = 1;
+ gMartViewportObjects[r8][ANIM_NUM] = 1;
if (gMapObjects[mapObjId].mapobj_unk_18 == 3)
- gUnknown_020386A4[r8][ANIM_NUM] = 2;
+ gMartViewportObjects[r8][ANIM_NUM] = 2;
if (gMapObjects[mapObjId].mapobj_unk_18 == 4)
- gUnknown_020386A4[r8][ANIM_NUM] = 3;
+ gMartViewportObjects[r8][ANIM_NUM] = 3;
r8++;
}
}
}
}
-void sub_80B368C(void)
+static void Shop_AnimViewportObjects(void)
{
u8 i;
for (i = 0; i < 16; i++) // max objects?
{
- if (gUnknown_020386A4[i][MAP_OBJ_ID] == 16)
+ if (gMartViewportObjects[i][MAP_OBJ_ID] == 16)
continue;
StartSpriteAnim(&gSprites[AddPseudoFieldObject(
- gMapObjects[gUnknown_020386A4[i][MAP_OBJ_ID]].graphicsId,
+ gMapObjects[gMartViewportObjects[i][MAP_OBJ_ID]].graphicsId,
SpriteCallbackDummy,
- (u16)gUnknown_020386A4[i][X_COORD] * 16 + 8,
- (u16)gUnknown_020386A4[i][Y_COORD] * 16 + 32,
+ (u16)gMartViewportObjects[i][X_COORD] * 16 + 8,
+ (u16)gMartViewportObjects[i][Y_COORD] * 16 + 32,
2)],
- gUnknown_020386A4[i][ANIM_NUM]);
+ gMartViewportObjects[i][ANIM_NUM]);
}
}
-void sub_80B3720(void)
+static void BuyMenuDrawTextboxBG(void)
{
s16 i;
@@ -500,14 +507,15 @@ void sub_80B3720(void)
}
}
-void sub_80B3764(int var1, int var2)
+static void Shop_InitMenus(int firstItemId, int lastItemId)
{
- sub_80B3720();
- sub_80B39D0(var1, var2, 0);
+ BuyMenuDrawTextboxBG();
+ Shop_DisplayPriceInList(firstItemId, lastItemId, 0);
InitMenu(0, 0xE, 0x2, 0x8, gMartInfo.cursor, 0xF);
}
-void sub_80B379C(void)
+// after printing the item quantity and price, restore the textbox tiles before the Yes/No prompt.
+static void BuyMenuDrawTextboxBG_Restore(void)
{
u16 i, j;
@@ -516,27 +524,29 @@ void sub_80B379C(void)
gBGTilemapBuffers[1][32 * (i + 12) + j] = ewram18300[32 * i + j] + 0xC3E0;
}
-void sub_80B37EC(void)
+static void Shop_PrintItemDesc(void)
{
- sub_80B3A70();
+ Shop_PrintItemDescText();
}
-void sub_80B37F8(u8 taskId)
+#define tItemCount data[1]
+
+static void Shop_DisplayPriceInCheckoutWindow(u8 taskId)
{
u16 itemListIndex = gMartInfo.choicesAbove + gMartInfo.cursor;
u16 itemId = gMartInfo.itemList[itemListIndex];
u32 price = (ItemId_GetPrice(itemId) >> GetPriceReduction(1));
- PrintMoneyAmount(gTasks[taskId].data[1] * price, 6, 6, 11);
+ PrintMoneyAmount(gTasks[taskId].tItemCount * price, 6, 6, 11);
gStringVar1[0] = EXT_CTRL_CODE_BEGIN;
gStringVar1[1] = 0x14;
gStringVar1[2] = 0x6;
- ConvertIntToDecimalStringN(&gStringVar1[3], gTasks[taskId].data[1], 1, 2);
- MenuPrint(gOtherText_xString1, 1, 11);
+ ConvertIntToDecimalStringN(&gStringVar1[3], gTasks[taskId].tItemCount, 1, 2);
+ Menu_PrintText(gOtherText_xString1, 1, 11);
sub_80A3FA0(gBGTilemapBuffers[1], 1, 11, 12, 2, 0xC3E1);
}
-void sub_80B389C(u16 itemId, u8 var2, bool32 hasControlCode)
+static void Shop_DisplayNormalPriceInList(u16 itemId, u8 var2, bool32 hasControlCode)
{
u8 *stringPtr = gStringVar1;
@@ -557,10 +567,10 @@ void sub_80B389C(u16 itemId, u8 var2, bool32 hasControlCode)
stringPtr = &gStringVar1[3];
GetMoneyAmountText(stringPtr, (ItemId_GetPrice(itemId) >> GetPriceReduction(1)), 0x4);
- MenuPrint_PixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 1);
+ Menu_PrintTextPixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 1);
}
-void sub_80B3930(u16 itemId, u8 var2, bool32 hasControlCode)
+static void Shop_DisplayDecorationPriceInList(u16 itemId, u8 var2, bool32 hasControlCode)
{
u8 *stringPtr = gStringVar1;
@@ -579,37 +589,40 @@ void sub_80B3930(u16 itemId, u8 var2, bool32 hasControlCode)
if (hasControlCode != FALSE)
stringPtr = &gStringVar1[3];
+ // some names are the maximum string length for a shop item. Because there is no room for
+ // a 6 character price (including the currency), a sprite is instead used for anything that
+ // is the maximum decoration price in order to fit it on screen.
if (gDecorations[itemId].price == 10000)
{
- sub_80B7B34(0x19, var2, hasControlCode); // huh???
+ Draw10000Sprite(0x19, var2, hasControlCode);
}
else
{
GetMoneyAmountText(stringPtr, gDecorations[itemId].price, 0x4);
- MenuPrint_PixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 0x1);
+ Menu_PrintTextPixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 0x1);
}
}
-void sub_80B39D0(int var1, int var2, bool32 hasControlCode)
+static void Shop_DisplayPriceInList(int firstItemId, int lastItemId, bool32 hasControlCode)
{
u8 i;
- for (i = var1; i <= var2 && gMartInfo.choicesAbove + i < gMartInfo.itemCount; i++)
+ for (i = firstItemId; i <= lastItemId && gMartInfo.choicesAbove + i < gMartInfo.itemCount; i++)
{
if (gMartInfo.martType == MART_TYPE_0)
- sub_80B389C(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode);
+ Shop_DisplayNormalPriceInList(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode);
else
- sub_80B3930(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode);
+ Shop_DisplayDecorationPriceInList(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode);
}
if (i != 8 && gMartInfo.choicesAbove + i == gMartInfo.itemCount)
{
- MenuFillWindowRectWithBlankTile(0xE, (i << 1) + 2, 0x1C, (i << 1) + 3);
- MenuPrint(gOtherText_CancelNoTerminator, 0xE, (i << 1) + 2);
+ Menu_BlankWindowRect(0xE, (i << 1) + 2, 0x1C, (i << 1) + 3);
+ Menu_PrintText(gOtherText_CancelNoTerminator, 0xE, (i << 1) + 2);
}
}
-void sub_80B3A70(void)
+static void Shop_PrintItemDescText(void)
{
if (gMartInfo.choicesAbove + gMartInfo.cursor != gMartInfo.itemCount)
{
@@ -628,121 +641,122 @@ void sub_80B3A70(void)
}
}
-void sub_80B3AEC(u8 taskId)
+static void Shop_DoPremierBallCheck(u8 taskId)
{
if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON)
{
- sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0); // huh???
+ Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0);
PlaySE(SE_SELECT);
- if (gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] == ITEM_POKE_BALL && gTasks[taskId].data[1] >= 10 && AddBagItem(ITEM_PREMIER_BALL, 1) == TRUE)
- DisplayItemMessageOnField(taskId, gOtherText_FreePremierBall, sub_80B4378, 0xC3E1);
+ if (gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] == ITEM_POKE_BALL && gTasks[taskId].tItemCount >= 10 && AddBagItem(ITEM_PREMIER_BALL, 1) == TRUE)
+ DisplayItemMessageOnField(taskId, gOtherText_FreePremierBall, Task_ReturnToBuyMenu, 0xC3E1);
else
- sub_80B4378(taskId);
+ Task_ReturnToBuyMenu(taskId);
}
}
-void sub_80B3B80(u8 taskId)
+static void Shop_DoItemTransaction(u8 taskId)
{
- IncrementGameStat(0x26);
+ IncrementGameStat(GAME_STAT_SHOPPED);
RemoveMoney(&gSaveBlock1.money, gMartTotalCost);
PlaySE(SE_REGI);
UpdateMoneyWindow(gSaveBlock1.money, 0, 0);
- gTasks[taskId].func = sub_80B3AEC;
+ gTasks[taskId].func = Shop_DoPremierBallCheck;
}
-void sub_80B3BD0(u8 taskId)
+static void Shop_DoPricePrintAndReturnToBuyMenu(u8 taskId)
{
- sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0); // same thing as above?
- sub_80B4378(taskId);
+ Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0);
+ Task_ReturnToBuyMenu(taskId);
}
-void sub_80B3BF4(u8 taskId)
+static void Task_DoItemPurchase(u8 taskId)
{
- MenuZeroFillWindowRect(0x7, 0x8, 0xD, 0xD);
+ Menu_EraseWindowRect(0x7, 0x8, 0xD, 0xD);
sub_80A3FA0(gBGTilemapBuffers[1], 8, 9, 4, 4, 0);
- sub_80B379C();
- sub_80B3420();
+ BuyMenuDrawTextboxBG_Restore();
+ Shop_DrawViewportTiles();
if (IsEnoughMoney(gSaveBlock1.money, gMartTotalCost))
{
if (gMartInfo.martType == MART_TYPE_0)
{
- if (AddBagItem(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gTasks[taskId].data[1]))
+ if (AddBagItem(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gTasks[taskId].tItemCount))
{
- DisplayItemMessageOnField(taskId, gOtherText_HereYouGo, sub_80B3B80, 0xC3E1);
- sub_80B4470(taskId);
+ DisplayItemMessageOnField(taskId, gOtherText_HereYouGo, Shop_DoItemTransaction, 0xC3E1);
+ Task_UpdatePurchaseHistory(taskId);
}
else
- DisplayItemMessageOnField(taskId, gOtherText_NoRoomFor, sub_80B3BD0, 0xC3E1);
+ DisplayItemMessageOnField(taskId, gOtherText_NoRoomFor, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1);
}
else // a normal mart is only type 0, so types 1 and 2 are decoration marts.
{
if (IsThereStorageSpaceForDecoration(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]))
{
if (gMartInfo.martType == MART_TYPE_1)
- DisplayItemMessageOnField(taskId, gOtherText_HereYouGo2, sub_80B3B80, 0xC3E1);
+ DisplayItemMessageOnField(taskId, gOtherText_HereYouGo2, Shop_DoItemTransaction, 0xC3E1);
else
- DisplayItemMessageOnField(taskId, gOtherText_HereYouGo3, sub_80B3B80, 0xC3E1);
+ DisplayItemMessageOnField(taskId, gOtherText_HereYouGo3, Shop_DoItemTransaction, 0xC3E1);
}
else
{
StringExpandPlaceholders(gStringVar4, gOtherText_SpaceForIsFull);
- DisplayItemMessageOnField(taskId, gStringVar4, sub_80B3BD0, 0xC3E1);
+ DisplayItemMessageOnField(taskId, gStringVar4, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1);
}
}
}
else
- DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, sub_80B3BD0, 0xC3E1);
+ DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1);
}
-void sub_80B3D38(u8 taskId)
+static void Shop_DoYesNoPurchase(u8 taskId)
{
DisplayYesNoMenu(7, 8, 1);
sub_80A3FA0(gBGTilemapBuffers[1], 8, 9, 4, 4, 0xC3E1);
- DoYesNoFuncWithChoice(taskId, gUnknown_083CC708);
+ DoYesNoFuncWithChoice(taskId, sShopPurchaseYesNoFuncs);
}
-void sub_80B3D7C(u8 taskId)
+static void Task_CancelItemPurchase(u8 taskId)
{
- sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0);
- MenuZeroFillWindowRect(0x7, 0x8, 0xD, 0xD);
+ Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0);
+ Menu_EraseWindowRect(0x7, 0x8, 0xD, 0xD);
sub_80A3FA0(gBGTilemapBuffers[1], 0x8, 0x9, 0x4, 0x4, 0);
- sub_80B4378(taskId);
+ Task_ReturnToBuyMenu(taskId);
}
-void sub_80B3DC8(u8 taskId)
+static void Shop_PrintPrice(u8 taskId)
{
- if (sub_80A52C4(taskId, gMartInfo.curItemCount) == TRUE)
- sub_80B37F8(taskId);
+ if (SellMenu_QuantityRoller(taskId, gMartInfo.curItemCount) == TRUE)
+ Shop_DisplayPriceInCheckoutWindow(taskId);
if (gMain.newKeys & A_BUTTON)
{
- gMartTotalCost = (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)) * gTasks[taskId].data[1]; // set total cost of your purchase.
- MenuZeroFillWindowRect(0, 0xA, 0xD, 0xD);
+ gMartTotalCost = (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)) * gTasks[taskId].tItemCount; // set total cost of your purchase.
+ Menu_EraseWindowRect(0, 0xA, 0xD, 0xD);
sub_80A3FA0(gBGTilemapBuffers[1], 0x1, 0xB, 0xC, 0x2, 0);
- sub_80B379C();
- sub_80B3420();
+ BuyMenuDrawTextboxBG_Restore();
+ Shop_DrawViewportTiles();
CopyItemName(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gStringVar1);
- ConvertIntToDecimalStringN(gStringVar2, gTasks[taskId].data[1], 0, 0x2);
+ ConvertIntToDecimalStringN(gStringVar2, gTasks[taskId].tItemCount, 0, 0x2);
ConvertIntToDecimalStringN(gStringVar3, gMartTotalCost, 0, 0x8);
StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe);
- DisplayItemMessageOnField(taskId, gStringVar4, sub_80B3D38, 0xC3E1);
+ DisplayItemMessageOnField(taskId, gStringVar4, Shop_DoYesNoPurchase, 0xC3E1);
}
else if (gMain.newKeys & B_BUTTON)
{
- sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0);
- sub_80B4378(taskId);
+ Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0);
+ Task_ReturnToBuyMenu(taskId);
}
}
-void sub_80B3EFC(u8 taskId)
+// set the item count in the mart info to the maximum allowed by the player's budget.
+static void Shop_UpdateCurItemCountToMax(u8 taskId)
{
u16 var;
- gTasks[taskId].data[1] = 1;
- MenuDrawTextWindow(0, 0xA, 0xD, 0xD);
- sub_80B37F8(taskId);
+ gTasks[taskId].tItemCount = 1;
+ Menu_DrawStdWindowFrame(0, 0xA, 0xD, 0xD);
+ Shop_DisplayPriceInCheckoutWindow(taskId);
var = gSaveBlock1.money / (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1));
if (var > 99)
@@ -750,11 +764,11 @@ void sub_80B3EFC(u8 taskId)
else
gMartInfo.curItemCount = var;
- gTasks[taskId].func = sub_80B3DC8;
+ gTasks[taskId].func = Shop_PrintPrice;
}
#ifdef NONMATCHING
-void sub_80B3F88(void)
+static void Shop_MoveItemListUp(void)
{
u16 *r1;
u16 *r2;
@@ -796,7 +810,7 @@ void sub_80B3F88(void)
}
#else
__attribute__((naked))
-void sub_80B3F88(void)
+static void Shop_MoveItemListUp(void)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
@@ -891,7 +905,7 @@ _080B4038: .4byte 0xfffffc40\n\
#endif
#ifdef NONMATCHING
-void sub_80B403C(void)
+static void Shop_MoveItemListDown(void)
{
u16 *r1;
u16 *r2;
@@ -935,7 +949,7 @@ void sub_80B403C(void)
}
#else
__attribute__((naked))
-void sub_80B403C(void)
+static void Shop_MoveItemListDown(void)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
@@ -1028,7 +1042,7 @@ _080B40E4: .4byte 0x800000f0\n\
}
#endif
-void sub_80B40E8(u8 taskId) // Mart_DoCursorAction
+static void Shop_DoCursorAction(u8 taskId)
{
if (!gPaletteFade.active)
{
@@ -1041,16 +1055,16 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction
PlaySE(SE_SELECT);
gMartInfo.choicesAbove--; // since cursor is at the top and there are choices above the top, scroll the menu up by updating choicesAbove.
- sub_80B3F88();
- sub_80B39D0(0, 0, 0);
- sub_80B3A70();
- sub_80B32A4();
+ Shop_MoveItemListUp();
+ Shop_DisplayPriceInList(0, 0, 0);
+ Shop_PrintItemDescText();
+ Shop_TryDrawVerticalScrollIndicators();
}
else // if the cursor is not 0, choicesAbove cannot be updated yet since the cursor is at the top of the menu, so update cursor.
{
PlaySE(SE_SELECT);
- gMartInfo.cursor = MoveMenuCursor(-1); // move cursor up
- sub_80B3A70();
+ gMartInfo.cursor = Menu_MoveCursor(-1); // move cursor up
+ Shop_PrintItemDescText();
}
}
else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) // only down can be pressed
@@ -1062,16 +1076,16 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction
PlaySE(SE_SELECT);
gMartInfo.choicesAbove++;
- sub_80B403C();
- sub_80B39D0(7, 7, 0);
- sub_80B3A70();
- sub_80B32A4();
+ Shop_MoveItemListDown();
+ Shop_DisplayPriceInList(7, 7, 0);
+ Shop_PrintItemDescText();
+ Shop_TryDrawVerticalScrollIndicators();
}
else if (gMartInfo.cursor != gMartInfo.itemCount)
{
PlaySE(SE_SELECT);
- gMartInfo.cursor = MoveMenuCursor(1);
- sub_80B3A70();
+ gMartInfo.cursor = Menu_MoveCursor(1);
+ Shop_PrintItemDescText();
}
}
else if (gMain.newKeys & A_BUTTON)
@@ -1080,25 +1094,25 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction
if (gMartInfo.choicesAbove + gMartInfo.cursor != gMartInfo.itemCount) // did you not hit CANCEL?
{
- PauseVerticalScrollIndicator(0);
- PauseVerticalScrollIndicator(1);
- sub_80F979C(1, 1);
- sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 1);
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0xC, 0xD, 0x13);
+ PauseVerticalScrollIndicator(TOP_ARROW);
+ PauseVerticalScrollIndicator(BOTTOM_ARROW);
+ SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE);
+ Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 1);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0xC, 0xD, 0x13);
if (gMartInfo.martType == MART_TYPE_0)
{
gMartTotalCost = (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)); // set 1x price
if (!IsEnoughMoney(gSaveBlock1.money, gMartTotalCost))
{
- DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, sub_80B3BD0, 0xC3E1); // tail merge
+ DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); // tail merge
}
else // _080B42BA
{
CopyItemName(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gStringVar1);
StringExpandPlaceholders(gStringVar4, gOtherText_HowManyYouWant);
- DisplayItemMessageOnField(taskId, gStringVar4, sub_80B3EFC, 0xC3E1);
+ DisplayItemMessageOnField(taskId, gStringVar4, Shop_UpdateCurItemCountToMax, 0xC3E1);
}
}
else // _080B428C
@@ -1107,7 +1121,7 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction
if (!IsEnoughMoney(gSaveBlock1.money, gMartTotalCost))
{
- DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, sub_80B3BD0, 0xC3E1); // tail merge
+ DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); // tail merge
}
else
{
@@ -1122,43 +1136,43 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction
{
StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe3);
}
- DisplayItemMessageOnField(taskId, gStringVar4, sub_80B3D38, 0xC3E1);
+ DisplayItemMessageOnField(taskId, gStringVar4, Shop_DoYesNoPurchase, 0xC3E1);
}
}
}
else
- sub_80B43F0(taskId);
+ Task_ExitBuyMenu(taskId);
}
else if (gMain.newKeys & B_BUTTON) // go back to buy/sell/exit menu
{
PlaySE(SE_SELECT);
- sub_80B43F0(taskId);
+ Task_ExitBuyMenu(taskId);
}
}
}
-void sub_80B4378(u8 taskId)
+static void Task_ReturnToBuyMenu(u8 taskId)
{
- MenuZeroFillWindowRect(0, 0xE, 0x1D, 0x13);
- MenuZeroFillWindowRect(0, 0xA, 0xD, 0xD);
+ Menu_EraseWindowRect(0, 0xE, 0x1D, 0x13);
+ Menu_EraseWindowRect(0, 0xA, 0xD, 0xD);
sub_80A3FA0(gBGTilemapBuffers[1], 0x1, 0xB, 0xC, 0x2, 0);
- sub_80B3420();
- sub_80B3764(6, 7);
- sub_80B37EC();
- StartVerticalScrollIndicators(0);
- StartVerticalScrollIndicators(1);
- sub_80B32A4();
- gTasks[taskId].func = sub_80B40E8;
+ Shop_DrawViewportTiles();
+ Shop_InitMenus(6, 7);
+ Shop_PrintItemDesc();
+ StartVerticalScrollIndicators(TOP_ARROW);
+ StartVerticalScrollIndicators(BOTTOM_ARROW);
+ Shop_TryDrawVerticalScrollIndicators();
+ gTasks[taskId].func = Shop_DoCursorAction;
}
-void sub_80B43F0(u8 taskId)
+static void Task_ExitBuyMenu(u8 taskId)
{
- gFieldCallback = sub_80B3050;
+ gFieldCallback = Shop_FadeReturnToMartMenu;
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
- gTasks[taskId].func = Task_ExitBuyMenu;
+ gTasks[taskId].func = Task_ExitBuyMenuDoFade;
}
-void Task_ExitBuyMenu(u8 taskId)
+static void Task_ExitBuyMenuDoFade(u8 taskId)
{
if (!gPaletteFade.active)
{
@@ -1169,38 +1183,41 @@ void Task_ExitBuyMenu(u8 taskId)
}
}
-void sub_80B4470(u8 taskId)
+// Task_UpdatePurchaseHistory
+static void Task_UpdatePurchaseHistory(u8 taskId)
{
u16 i;
for (i = 0; i < 3; i++)
{
- if (gUnknown_02038724[i].itemId == gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]
- && gUnknown_02038724[i].quantity != 0)
+ if (gMartPurchaseHistory[i].itemId == gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]
+ && gMartPurchaseHistory[i].quantity != 0)
{
- if (gUnknown_02038724[i].quantity + gTasks[taskId].data[1] > 255)
- gUnknown_02038724[i].quantity = 255;
+ if (gMartPurchaseHistory[i].quantity + gTasks[taskId].tItemCount > 255)
+ gMartPurchaseHistory[i].quantity = 255;
else
- gUnknown_02038724[i].quantity += gTasks[taskId].data[1];
+ gMartPurchaseHistory[i].quantity += gTasks[taskId].tItemCount;
return;
}
}
- if (gUnknown_02038730 < 3)
+ if (gMartPurchaseHistoryId < 3)
{
- gUnknown_02038724[gUnknown_02038730].itemId = gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor];
- gUnknown_02038724[gUnknown_02038730].quantity = gTasks[taskId].data[1];
- gUnknown_02038730++;
+ gMartPurchaseHistory[gMartPurchaseHistoryId].itemId = gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor];
+ gMartPurchaseHistory[gMartPurchaseHistoryId].quantity = gTasks[taskId].tItemCount;
+ gMartPurchaseHistoryId++;
}
}
-void ClearItemPurchases(void)
+#undef tItemCount
+
+static void ClearItemPurchases(void)
{
- gUnknown_02038730 = 0;
- ClearItemSlots(gUnknown_02038724, 3);
+ gMartPurchaseHistoryId = 0;
+ ClearItemSlots(gMartPurchaseHistory, 3);
}
-void CreatePokemartMenu(u16 *itemList)
+void Shop_CreatePokemartMenu(u16 *itemList)
{
CreateShopMenu(MART_TYPE_0);
SetShopItemsForSale(itemList);
@@ -1208,141 +1225,37 @@ void CreatePokemartMenu(u16 *itemList)
SetShopMenuCallback(EnableBothScriptContexts);
}
-void CreateDecorationShop1Menu(u16 *itemList)
+void Shop_CreateDecorationShop1Menu(u16 *itemList)
{
CreateShopMenu(MART_TYPE_1);
SetShopItemsForSale(itemList);
SetShopMenuCallback(EnableBothScriptContexts);
}
-void CreateDecorationShop2Menu(u16 *itemList)
+void Shop_CreateDecorationShop2Menu(u16 *itemList)
{
CreateShopMenu(MART_TYPE_2);
SetShopItemsForSale(itemList);
SetShopMenuCallback(EnableBothScriptContexts);
}
-void sub_80B45B4(u8 taskId, const s16 *list, u16 c)
-{
- s16 r5 = gTasks[taskId].data[4] - 1;
- s16 r3 = gTasks[taskId].data[5] - 1;
- s16 r4 = gTasks[taskId].data[1];
- s16 y;
- s16 x;
-
- if (gTasks[taskId].data[2] == 0)
- {
- for (y = 0; y < 3; y++)
- {
- for (x = 0; x < 3; x++)
- {
- s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y);
-
- if (list[r4] == metatileId)
- {
- if (r4 != 2)
- MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[r4 + 1]);
- else
- MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[0]);
- }
- }
- }
- }
- else
- {
- for (y = 0; y < 3; y++)
- {
- for (x = 0; x < 3; x++)
- {
- s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y);
-
- if (list[2 - r4] == metatileId)
- {
- if (r4 != 2)
- MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[1 - r4]);
- else
- MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[2]);
- }
- }
- }
- }
-}
-
-static const u16 gUnknown_083CC714[] = {0x284, 0x282, 0x280};
-static const u16 gUnknown_083CC71A[] = {0x285, 0x283, 0x281};
-static const u16 gUnknown_083CC720[] = {0x28C, 0x28A, 0x288};
-static const u16 gUnknown_083CC726[] = {0x28D, 0x28B, 0x289};
-static const u16 gUnknown_083CC72C[] = {0x2A0, 0x2A2, 0x2A4};
-static const u16 gUnknown_083CC732[] = {0x2A1, 0x2A3, 0x2A5};
-static const u16 gUnknown_083CC738[] = {0x2A8, 0x2AA, 0x2AC};
-
-void sub_80B4710(u8 taskId)
-{
- s16 *data = gTasks[taskId].data;
-
- data[3] = 1;
-
- switch (data[0])
- {
- case 0:
- sub_80B45B4(taskId, gUnknown_083CC714, 0);
- break;
- case 1:
- sub_80B45B4(taskId, gUnknown_083CC71A, 0);
- break;
- case 2:
- sub_80B45B4(taskId, gUnknown_083CC720, 0xC00);
- break;
- case 3:
- sub_80B45B4(taskId, gUnknown_083CC726, 0);
- break;
- case 4:
- sub_80B45B4(taskId, gUnknown_083CC72C, 0xC00);
- break;
- case 5:
- sub_80B45B4(taskId, gUnknown_083CC732, 0);
- break;
- case 6:
- sub_80B45B4(taskId, gUnknown_083CC738, 0);
- break;
- }
-
- data[0] = (data[0] + 1) & 7;
- if (!data[0])
- {
- DrawWholeMapView();
- data[1] = (data[1] + 1) % 3;
- data[3] = 0;
- }
-}
-
-u8 sub_80B47D8(u16 var)
-{
- u8 taskId = CreateTask(sub_80B4710, 0);
- s16 *data = gTasks[taskId].data;
-
- PlayerGetDestCoords(&data[4], &data[5]);
- data[0] = 0;
- data[1] = 0;
- data[2] = var;
- sub_80B4710(taskId);
- return taskId;
-}
-
-void sub_80B4824(u8 var)
-{
- gUnknown_02038731 = sub_80B47D8(var);
-}
-
-void sub_80B483C(void)
-{
- DestroyTask(gUnknown_02038731);
-}
-
-bool8 sub_80B4850(void)
-{
- if (gTasks[gUnknown_02038731].data[3] == 0 && gTasks[gUnknown_02038731].data[1] == 2)
- return FALSE;
- else
- return TRUE;
+#if DEBUG
+__attribute__((naked))
+void debug_sub_80C2818(void)
+{
+ asm("\
+ push {lr}\n\
+ mov r0, #0x0\n\
+ bl CreateShopMenu\n\
+ ldr r0, ._290 @ gMartBuyNoSellOptionList\n\
+ bl SetShopItemsForSale\n\
+ mov r0, #0x0\n\
+ bl SetShopMenuCallback\n\
+ pop {r0}\n\
+ bx r0\n\
+._291:\n\
+ .align 2, 0\n\
+._290:\n\
+ .word gMartBuyNoSellOptionList+0x3");
}
+#endif
diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c
index 89ec68b0a..2c97c146d 100644
--- a/src/field/slot_machine.c
+++ b/src/field/slot_machine.c
@@ -1,49 +1,4036 @@
#include "global.h"
+#include "constants/songs.h"
+#include "strings2.h"
+#include "overworld.h"
+#include "menu_cursor.h"
+#include "field_effect.h"
+#include "random.h"
+#include "sound.h"
+#include "main.h"
#include "slot_machine.h"
#include "decompress.h"
+#include "trig.h"
+#include "graphics.h"
#include "palette.h"
-#include "task.h"
+#include "util.h"
+#include "text.h"
+#include "menu.h"
#include "ewram.h"
-struct UnkStruct2000000 {
- /*0x00*/ u8 filler00[61];
- /*0x3D*/ u8 unk3D;
-};
-
-struct UnkStruct1 {
+struct UnkStruct1
+{
/*0x00*/ u8 unk00;
/*0x01*/ u8 unk01;
/*0x02*/ s16 unk02;
};
-extern struct UnkStruct1 *gUnknown_083ED048[];
-extern const u16 gPalette_83EDE24[];
-
-extern const u8 gSlotMachine_Gfx[];
#if ENGLISH
#define SLOTMACHINE_GFX_TILES 233
#elif GERMAN
#define SLOTMACHINE_GFX_TILES 236
#endif
-extern const u16 gUnknown_08E95A18[];
+// TODO: figure out which functions are static and which are not.
+#define static
+
+static void CB2_SlotMachineSetup(void);
+static void CB2_SlotMachineLoop(void);
+static void PlaySlotMachine_Internal(u8 arg0, MainCallback cb);
+static void SlotMachineDummyTask(u8 taskId);
+static void SlotMachineSetup_0_0(void);
+static void SlotMachineSetup_6_2(void);
+static void SlotMachineSetup_1_0(void);
+static void SlotMachineSetup_2_0(void);
+static void SlotMachineSetup_2_1(void);
+static void SlotMachineSetup_0_1(void);
+static void SlotMachineSetup_3_0(void);
+static void SlotMachineSetup_4_0(void);
+static void SlotMachineSetup_5_0(void);
+static void SlotMachineSetup_6_0(void);
+static void SlotMachineSetup_6_1(void);
+static void sub_8101D04(void);
+static void sub_8101D24(u8 taskId);
+static bool8 sub_8101D5C(struct Task *task);
+static bool8 sub_8101D8C(struct Task *task);
+static bool8 sub_8101DB0(struct Task *task);
+static bool8 sub_8101DF4(struct Task *task);
+static bool8 sub_8101E10(struct Task *task);
+static bool8 sub_8101E3C(struct Task *task);
+static bool8 sub_8101F44(struct Task *task);
+static bool8 sub_8101F60(struct Task *task);
+static bool8 sub_8101F88(struct Task *task);
+static bool8 sub_8101FA4(struct Task *task);
+static bool8 sub_8102008(struct Task *task);
+static bool8 sub_8102034(struct Task *task);
+static bool8 sub_8102058(struct Task *task);
+static bool8 sub_8102090(struct Task *task);
+bool8 sub_81020C8(struct Task *task);
+static bool8 sub_81021E0(struct Task *task);
+static bool8 sub_81021FC(struct Task *task);
+static bool8 sub_8102264(struct Task *task);
+static bool8 sub_81022A0(struct Task *task);
+static bool8 sub_81022CC(struct Task *task);
+static bool8 sub_81022F0(struct Task *task);
+static bool8 sub_8102318(struct Task *task);
+static bool8 sub_8102344(struct Task *task);
+static bool8 sub_810239C(struct Task *task);
+static bool8 sub_81023B8(struct Task *task);
+static bool8 sub_81023E0(struct Task *task);
+static bool8 sub_81023FC(struct Task *task);
+static bool8 sub_8102424(struct Task *task);
+static bool8 sub_8102460(struct Task *task);
+static bool8 debug_sub_8116E74(struct Task *);
+static void sub_8102484(void);
+static void sub_81024F0(void);
+static bool8 sub_8102540(void);
+static u8 sub_8102578(void);
+static u16 dp15_jump_random_unknown(void);
+static u8 sub_81025BC(void);
+static void CheckMatch(void);
+static void CheckMatch_CenterRow(void);
+static void CheckMatch_TopAndBottom(void);
+static void CheckMatch_Diagonals(void);
+static u8 GetMatchFromSymbolsInRow(u8 c1, u8 c2, u8 c3);
+static void sub_8102A24(void);
+static void sub_8102A64(u8 taskId);
+static bool8 sub_8102A44(void);
+static bool8 sub_8102A9C(struct Task *task);
+static bool8 sub_8102AD0(struct Task *task);
+static bool8 sub_8102B80(struct Task *task);
+static u8 GetTagOfReelSymbolOnScreenAtPos(u8 x, s16 y);
+static void sub_8102DA8(void);
+static void sub_8102DEC(u8 a0);
+static void sub_8102E1C(u8 a0);
+static bool8 sub_8102E40(u8 a0);
+static void sub_8102E68(u8 taskId);
+static bool8 sub_8102EA0(struct Task *task);
+static bool8 sub_8102EA4(struct Task *task);
+static bool8 sub_8102EC0(struct Task *task);
+static bool8 sub_8102F4C(struct Task *task);
+static bool8 sub_8103008(struct Task *task);
+static bool8 sub_810305C(void);
+static bool8 sub_8103154(u8 a0, u8 a1);
+static bool8 sub_81031B4(u8 a0, u8 a1);
+static bool8 sub_81032C0(void);
+static bool8 sub_81032E8(void);
+static bool8 sub_810333C(void);
+static bool8 sub_81033DC(void);
+static bool8 sub_810341C(u8 a0);
+static bool8 sub_810347C(u8 a0);
+static void sub_81034F4(void);
+static void sub_8103540(void);
+static void sub_8103564(void);
+static void j5_08111E84(void);
+static void sub_8103668(void);
+static void sub_810380C(void);
+static void sub_8103830(void);
+static void sub_8103910(void);
+static void sub_8103A78(void);
+static void sub_8103C14(u8 a0);
+static void sub_8103C48(u8 taskId);
+static void sub_8103D50(u8 a0);
+static void sub_8103C78(struct Task *task, u8 taskId);
+static void sub_8103CAC(struct Task *task, u8 taskId);
+static void sub_8103CC8(struct Task *task, u8 taskId);
+static void sub_8103D8C(u8 a0);
+static void sub_8103DC8(void);
+static void sub_8103E04(u8 a0);
+static bool8 sub_8103E38(void);
+static bool8 sub_8103E7C(void);
+static bool8 sub_8103EAC(u8 spriteId);
+static void sub_8103EE4(struct Sprite *sprite);
+static void sub_8103F70(void);
+static bool8 sub_8103FA0(void);
+static void sub_8103FE8(u8 taskId);
+static void sub_8104048(void);
+static void sub_8104064(u8 pikaPower);
+static bool8 sub_81040C8(void);
+static void sub_81040E8(u8 taskId);
+static void nullsub_68(struct Task *task);
+static void sub_810411C(struct Task *task);
+static void sub_8104144(struct Task *task);
+static void sub_81041AC(struct Task *task);
+static void sub_810421C(struct Task *task);
+static void sub_810423C(u8 pikaPower);
+static void sub_810430C(void);
+static bool8 sub_810432C(void);
+static void sub_810434C(u8 taskId);
+static void sub_810437C(struct Task *task);
+static void sub_81043EC(struct Task *task);
+static void sub_8104468(struct Task *task);
+static void sub_8104498(struct Task *task);
+static void sub_8104548(struct Task *task);
+static void sub_8104598(struct Task *task);
+static void sub_81045CC(struct Task *task);
+static void sub_810463C(struct Task *task);
+static void sub_81046C0(struct Task *task);
+static void sub_8104764(struct Task *task);
+static void sub_8104794(struct Task *task);
+static void sub_81047EC(struct Task *task);
+static void sub_8104860(struct Task *task);
+static void sub_81048A8(struct Task *task);
+static void sub_81048CC(struct Task *task);
+static void sub_8104940(struct Task *task);
+static void sub_81049C8(struct Task *task);
+static void sub_81049F8(struct Task *task);
+static void sub_8104A40(s16 a0, s16 a1);
+static void sub_8104A88(s16 a0);
+static void sub_8104AB8(u8 a0);
+static bool8 sub_8104AEC(void);
+static void sub_8104B0C(u8 taskId);
+static void sub_8104B3C(struct Task *task);
+static void sub_8104B60(struct Task *task);
+static void sub_8104B80(struct Task *task);
+static void sub_8104BC8(struct Task *task);
+static void sub_8104BFC(struct Task *task);
+static void sub_8104C44(struct Task *task);
+static void sub_8104C5C(void);
+static void sub_8104CAC(u8 arg0);
+static bool8 sub_8104E18(void);
+static void nullsub_69(struct Task *task);
+static void sub_8104E74(u8 taskId);
+static void sub_8104EA8(void);
+static void sub_8104F8C(void);
+static void sub_8104FF4(s16 x, s16 y, u8 a2, s16 a3);
+static void sub_81050C4(void);
+static void sub_8105100(void);
+static void sub_810514C(void);
+static void sub_81051C0(void);
+static void sub_8105284(void);
+static void sub_81052EC(void);
+static void sub_81053A0(void);
+static void sub_810545C(void);
+static void sub_81054B8(void);
+static void sub_8105524(void);
+static void sub_8105554(void);
+static void sub_8105578(void);
+static void sub_8105688(s16 a0);
+static void sub_81056C0(void);
+static void sub_81056F0(void);
+static void sub_81057E8(s16 a0);
+static void sub_8105804(void);
+static void sub_8105854(void);
+static void sub_81058A0(void);
+static void sub_81058C4(void);
+static void sub_81059B8(void);
+static void sub_81059E8(void);
+static bool8 sub_8105ACC(void);
+static void sub_8105AEC(void);
+static u8 sub_8105B1C(s16 x, s16 y);
+static void sub_8105B88(u8 spriteId);
+static u8 sub_8105BF8(u8 templateIdx, SpriteCallback callback, s16 x, s16 y, s16 a4);
+static void sub_81063C0(void);
+static void sub_8106404(void);
+static void sub_8106448(void);
+static void sub_81064B8(void);
+static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4);
+static void sub_81065DC(void);
+
+#if DEBUG
+__attribute__((section(".bss"))) u8 unk_debug_bss_1_0 = 0;
+__attribute__((section(".bss"))) u8 unk_debug_bss_1_1 = 0;
+__attribute__((section(".bss"))) u8 unk_debug_bss_1_2 = 0;
+__attribute__((section(".bss"))) u8 unk_debug_bss_1_3 = 0;
+__attribute__((section(".bss"))) u8 unk_debug_bss_1_4 = 0;
+__attribute__((section(".bss"))) u32 unk_debug_bss_1_8 = 0;
+#endif
+
+static const struct UnkStruct1 *const gUnknown_083ED048[];
+static const u16 gPalette_83EDE24[];
+static const u8 gUnknown_083ECD04[][3];
+static const u8 gUnknown_083ECE3A[];
+static const u16 gUnknown_083ECE42[];
+static const u16 gUnknown_083ECE48[];
+
+void PlaySlotMachine(u8 arg0, MainCallback cb)
+{
+#if DEBUG
+ unk_debug_bss_1_1 = 0;
+#endif
+ PlaySlotMachine_Internal(arg0, cb);
+ SetMainCallback2(CB2_SlotMachineSetup);
+}
+
+#if DEBUG
+void debug_sub_811609C(u8 a, void (*func)(void))
+{
+ unk_debug_bss_1_1 = 1;
+ PlaySlotMachine_Internal(a, func);
+ SetMainCallback2(CB2_SlotMachineSetup);
+}
+#endif
+
+static void CB2_SlotMachineSetup(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SlotMachineSetup_0_0();
+ SlotMachineSetup_0_1();
+ gMain.state++;
+ break;
+ case 1:
+ SlotMachineSetup_1_0();
+ gMain.state++;
+ break;
+ case 2:
+ SlotMachineSetup_2_0();
+ SlotMachineSetup_2_1();
+ gMain.state++;
+ break;
+ case 3:
+ SlotMachineSetup_3_0();
+ gMain.state++;
+ break;
+ case 4:
+ SlotMachineSetup_4_0();
+ gMain.state++;
+ break;
+ case 5:
+ SlotMachineSetup_5_0();
+ gMain.state++;
+ break;
+ case 6:
+ SlotMachineSetup_6_0();
+ SlotMachineSetup_6_1();
+ SlotMachineSetup_6_2();
+ SetMainCallback2(CB2_SlotMachineLoop);
+ break;
+ }
+}
+
+static void CB2_SlotMachineLoop(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void SlotMachine_VBlankCallback(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ REG_WIN0H = eSlotMachine->win0h;
+ REG_WIN0V = eSlotMachine->win0v;
+ REG_WININ = eSlotMachine->winIn;
+ REG_WINOUT = eSlotMachine->winOut;
+}
+
+static void PlaySlotMachine_Internal(u8 arg0, MainCallback cb)
+{
+ struct Task *task = gTasks + CreateTask(SlotMachineDummyTask, 0xFF);
+ task->data[0] = arg0;
+ StoreWordInTwoHalfwords(task->data + 1, (intptr_t)cb);
+}
+
+static void sub_81019EC(void)
+{
+ struct Task *task = gTasks + FindTaskIdByFunc(SlotMachineDummyTask);
+ eSlotMachine->unk01 = task->data[0];
+ LoadWordFromTwoHalfwords((u16 *)(task->data + 1), (u32 *)&eSlotMachine->prevMainCb);
+}
+
+static void SlotMachineDummyTask(u8 taskId)
+{
+}
+
+static void SlotMachineSetup_0_0(void)
+{
+ SetVBlankCallback(NULL);
+ SetHBlankCallback(NULL);
+ REG_DISPCNT = 0;
+}
+
+static void SlotMachineSetup_6_2(void)
+{
+ u16 imeBak;
+ SetVBlankCallback(SlotMachine_VBlankCallback);
+ imeBak = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = imeBak;
+ REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
+ REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON;
+}
+
+static void SlotMachineSetup_1_0(void)
+{
+ DmaClearLarge16(3, (u16 *)(BG_VRAM), BG_VRAM_SIZE, 0x1000);
+}
+
+static void SlotMachineSetup_2_0(void)
+{
+ DmaClear16(3, (u16 *)OAM, OAM_SIZE);
+}
+
+static void SlotMachineSetup_2_1(void)
+{
+ REG_BG0CNT = 0;
+ REG_BG1CNT = 0;
+ REG_BG2CNT = 0;
+ REG_BG3CNT = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_SCREENBASE(31) | BGCNT_CHARBASE(2);
+ REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(28);
+ REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(29);
+ REG_BG3CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(30);
+ REG_WININ = 0x3f;
+ REG_WINOUT = 0x3f;
+ REG_BLDCNT = BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_OBJ;
+ REG_BLDALPHA = 0x809;
+}
+
+static const s16 gUnknown_083ECCF8[][2];
+
+#if DEBUG
+__attribute__((naked))
+static void SlotMachineSetup_0_1(void)
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ mov r7, sl\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5, r6, r7}\n\
+ bl sub_81019EC\n\
+ ldr r5, ._43 @ \n\
+ mov r4, #0x0\n\
+ strb r4, [r5]\n\
+ strb r4, [r5, #0x2]\n\
+ bl Random\n\
+ mov r1, #0x1\n\
+ and r1, r1, r0\n\
+ strb r1, [r5, #0x3]\n\
+ strb r4, [r5, #0x4]\n\
+ mov r0, #0x0\n\
+ strh r4, [r5, #0x8]\n\
+ strb r0, [r5, #0xa]\n\
+ strb r0, [r5, #0xb]\n\
+ ldr r0, ._43 + 4 @ \n\
+ ldr r1, ._43 + 8 @ \n\
+ add r0, r0, r1\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r5, #0xc]\n\
+ strh r4, [r5, #0xe]\n\
+ strh r4, [r5, #0x10]\n\
+ strh r4, [r5, #0x12]\n\
+ strh r4, [r5, #0x18]\n\
+ mov r0, #0x8\n\
+ strh r0, [r5, #0x1a]\n\
+ add r1, r5, #0\n\
+ add r1, r1, #0x58\n\
+ mov r0, #0xf0\n\
+ strh r0, [r1]\n\
+ add r1, r1, #0x2\n\
+ mov r0, #0xa0\n\
+ strh r0, [r1]\n\
+ add r0, r5, #0\n\
+ add r0, r0, #0x5c\n\
+ mov r1, #0x3f\n\
+ strh r1, [r0]\n\
+ add r0, r0, #0x2\n\
+ strh r1, [r0]\n\
+ bl GetCurrentMapMusic\n\
+ add r1, r5, #0\n\
+ add r1, r1, #0x60\n\
+ strh r0, [r1]\n\
+ mov r7, #0x0\n\
+ add r6, r5, #0\n\
+ ldr r2, ._43 + 12 @ \n\
+ mov sl, r2\n\
+ mov r0, #0x1c\n\
+ add r0, r0, r6\n\
+ mov r9, r0\n\
+._41:\n\
+ lsl r5, r7, #0x1\n\
+ mov r1, #0x22\n\
+ add r1, r1, r6\n\
+ mov r8, r1\n\
+ add r1, r5, r1\n\
+ mov r0, #0x0\n\
+ strh r0, [r1]\n\
+ add r4, r6, #0\n\
+ add r4, r4, #0x28\n\
+ add r4, r5, r4\n\
+ ldrb r0, [r6, #0x3]\n\
+ lsl r0, r0, #0x1\n\
+ lsl r1, r7, #0x2\n\
+ add r0, r0, r1\n\
+ add r0, r0, sl\n\
+ mov r2, #0x0\n\
+ ldsh r0, [r0, r2]\n\
+ mov r1, #0x15\n\
+ bl __modsi3\n\
+ strh r0, [r4]\n\
+ add r5, r5, r9\n\
+ mov r1, #0x0\n\
+ ldsh r0, [r4, r1]\n\
+ lsl r1, r0, #0x1\n\
+ add r1, r1, r0\n\
+ lsl r1, r1, #0x3\n\
+ mov r2, #0xfc\n\
+ lsl r2, r2, #0x1\n\
+ add r0, r2, #0\n\
+ sub r0, r0, r1\n\
+ strh r0, [r5]\n\
+ mov r1, #0x0\n\
+ ldsh r0, [r5, r1]\n\
+ add r1, r2, #0\n\
+ bl __modsi3\n\
+ strh r0, [r5]\n\
+ add r0, r7, #1\n\
+ lsl r0, r0, #0x18\n\
+ lsr r7, r0, #0x18\n\
+ cmp r7, #0x2\n\
+ bls ._41 @cond_branch\n\
+ bl debug_sub_811B5D0\n\
+ ldr r0, ._43 + 16 @ \n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._42 @cond_branch\n\
+ mov r1, r8\n\
+ sub r1, r1, #0x22\n\
+ mov r0, #0xfa\n\
+ lsl r0, r0, #0x2\n\
+ strh r0, [r1, #0xc]\n\
+._42:\n\
+ pop {r3, r4, r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov sl, r5\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+._44:\n\
+ .align 2, 0\n\
+._43:\n\
+ .word +0x2000000\n\
+ .word gSaveBlock1\n\
+ .word 0x494\n\
+ .word gUnknown_083ECCF8\n\
+ .word unk_debug_bss_1_1");
+}
+#else
+static void SlotMachineSetup_0_1(void)
+{
+ u8 i;
+
+ sub_81019EC();
+ eSlotMachine->state = 0;
+ eSlotMachine->pikaPower = 0;
+ eSlotMachine->unk03 = Random() & 1;
+ eSlotMachine->unk04 = 0;
+ eSlotMachine->matchedSymbols = 0;
+ eSlotMachine->unk0A = 0;
+ eSlotMachine->unk0B = 0;
+ eSlotMachine->coins = gSaveBlock1.coins;
+ eSlotMachine->payout = 0;
+ eSlotMachine->unk10 = 0;
+ eSlotMachine->bet = 0;
+ eSlotMachine->unk18 = 0;
+ eSlotMachine->unk1A = 8;
+ eSlotMachine->win0h = 0xf0;
+ eSlotMachine->win0v = 0xa0;
+ eSlotMachine->winIn = 0x3f;
+ eSlotMachine->winOut = 0x3f;
+ eSlotMachine->backupMapMusic = GetCurrentMapMusic();
+ for (i = 0; i < 3; i++)
+ {
+ eSlotMachine->unk22[i] = 0;
+ eSlotMachine->reelPositions[i] = gUnknown_083ECCF8[i][eSlotMachine->unk03] % 21;
+ eSlotMachine->unk1C[i] = 0x1f8 - eSlotMachine->reelPositions[i] * 24;
+ eSlotMachine->unk1C[i] %= 0x1f8;
+ }
+}
+#endif
+
+static void SlotMachineSetup_3_0(void)
+{
+ Text_LoadWindowTemplate(&gWindowTemplate_81E7128);
+ InitMenuWindow(&gWindowTemplate_81E7128);
+}
+
+static void SlotMachineSetup_4_0(void)
+{
+ ResetPaletteFade();
+ ResetSpriteData();
+ gOamLimit = 128;
+ FreeAllSpritePalettes();
+ ResetTasks();
+}
+
+static void SlotMachineSetup_5_0(void)
+{
+ sub_8106448();
+ sub_81064B8();
+ sub_81063C0();
+}
+
+static void SlotMachineSetup_6_0(void)
+{
+ sub_8104EA8();
+ sub_8104F8C();
+ sub_8103DC8();
+ sub_81050C4();
+}
+
+static void SlotMachineSetup_6_1(void)
+{
+ sub_8104048();
+ sub_8102DA8();
+ sub_8104C5C();
+ sub_8101D04();
+}
+
+static void sub_8101D04(void)
+{
+ sub_8101D24(CreateTask(sub_8101D24, 0));
+}
+
+static bool8 (*const gUnknown_083ECAAC[])(struct Task *task) =
+{
+ sub_8101D5C,
+ sub_8101D8C,
+ sub_8101DB0,
+ sub_8101DF4,
+ sub_8101E10,
+ sub_8101E3C,
+ sub_8101F44,
+ sub_8101F60,
+ sub_8101F88,
+ sub_8101FA4,
+ sub_8102008,
+ sub_8102034,
+ sub_8102058,
+ sub_8102090,
+ sub_81020C8,
+ sub_81021E0,
+ sub_81021FC,
+ sub_8102264,
+ sub_81022A0,
+ sub_81022CC,
+ sub_81022F0,
+ sub_8102318,
+ sub_8102344,
+ sub_810239C,
+ sub_81023B8,
+ sub_81023E0,
+ sub_81023FC,
+ sub_8102424,
+ sub_8102460,
+#if DEBUG
+ debug_sub_8116E74,
+#endif
+};
+
+static void sub_8101D24(u8 taskId)
+{
+ while (gUnknown_083ECAAC[eSlotMachine->state](gTasks + taskId));
+}
+
+static bool8 sub_8101D5C(struct Task *task)
+{
+ BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ sub_810423C(eSlotMachine->pikaPower);
+ eSlotMachine->state++;
+ return FALSE;
+}
+
+static bool8 sub_8101D8C(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ eSlotMachine->state++;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8101DB0(struct Task *task)
+{
+ eSlotMachine->payout = 0;
+ eSlotMachine->bet = 0;
+ eSlotMachine->unk18 = 0;
+ eSlotMachine->unk04 &= 0xc0;
+ eSlotMachine->state = 4;
+ if (eSlotMachine->coins <= 0)
+ {
+ eSlotMachine->state = 25;
+ }
+ else if (eSlotMachine->unk0A)
+ {
+ eSlotMachine->state = 3;
+ sub_8104CAC(4);
+ }
+ return TRUE;
+}
+
+static bool8 sub_8101DF4(struct Task *task)
+{
+ if (sub_8104E18())
+ {
+ eSlotMachine->state = 4;
+ }
+ return FALSE;
+}
+
+#if DEBUG
+__attribute__((naked))
+static bool8 sub_8101E10(struct Task *task)
+{
+ asm("\
+ push {lr}\n\
+ mov r0, #0x0\n\
+ bl sub_8104CAC\n\
+ ldr r2, ._70 @ \n\
+ mov r0, #0x5\n\
+ strb r0, [r2]\n\
+ ldr r0, ._70 + 4 @ \n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._67 @cond_branch\n\
+ ldr r0, ._70 + 8 @ \n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ bne ._69 @cond_branch\n\
+._67:\n\
+ mov r0, #0xc\n\
+ ldsh r1, [r2, r0]\n\
+ ldr r0, ._70 + 12 @ \n\
+ cmp r1, r0\n\
+ ble ._69 @cond_branch\n\
+ mov r0, #0x17\n\
+ strb r0, [r2]\n\
+._69:\n\
+ mov r0, #0x1\n\
+ pop {r1}\n\
+ bx r1\n\
+._71:\n\
+ .align 2, 0\n\
+._70:\n\
+ .word +0x2000000\n\
+ .word unk_debug_bss_1_1\n\
+ .word unk_debug_bss_1_4\n\
+ .word 0x270e");
+}
+#else
+static bool8 sub_8101E10(struct Task *task)
+{
+ sub_8104CAC(0);
+ eSlotMachine->state = 5;
+ if (eSlotMachine->coins >= 9999)
+ {
+ eSlotMachine->state = 23;
+ }
+ return TRUE;
+}
+#endif
+
+#if DEBUG
+__attribute__((naked))
+static bool8 sub_8101E3C(struct Task *task)
+{
+ asm("\
+ push {r4, r5, lr}\n\
+ ldr r0, ._77 @ unk_debug_bss_1_1\n\
+ ldrb r1, [r0]\n\
+ add r3, r0, #0\n\
+ ldr r5, ._77 + 4 @ gMain\n\
+ cmp r1, #0\n\
+ beq ._76 @cond_branch\n\
+ ldr r2, ._77 + 8 @ unk_debug_bss_1_4\n\
+ ldrb r0, [r2]\n\
+ cmp r0, #0\n\
+ beq ._76 @cond_branch\n\
+ ldr r4, ._77 + 12 @ \n\
+ mov r1, #0xc\n\
+ ldsh r0, [r4, r1]\n\
+ cmp r0, #0x3\n\
+ ble ._74 @cond_branch\n\
+ ldrh r1, [r5, #0x2c]\n\
+ mov r0, #0x2\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._75 @cond_branch\n\
+._74:\n\
+ mov r0, #0x0\n\
+ strb r0, [r2]\n\
+ b ._76\n\
+._78:\n\
+ .align 2, 0\n\
+._77:\n\
+ .word unk_debug_bss_1_1\n\
+ .word gMain\n\
+ .word unk_debug_bss_1_4\n\
+ .word +0x2000000\n\
+._75:\n\
+ mov r0, #0x0\n\
+ bl sub_8103D50\n\
+ mov r0, #0x1\n\
+ bl sub_8103D50\n\
+ mov r0, #0x2\n\
+ bl sub_8103D50\n\
+ ldrh r0, [r4, #0xc]\n\
+ sub r0, r0, #0x3\n\
+ strh r0, [r4, #0xc]\n\
+ mov r0, #0x3\n\
+ strh r0, [r4, #0x12]\n\
+ mov r0, #0x9\n\
+ strb r0, [r4]\n\
+ b ._102\n\
+._76:\n\
+ ldrb r0, [r3]\n\
+ cmp r0, #0\n\
+ beq ._81 @cond_branch\n\
+ ldrh r1, [r5, #0x2e]\n\
+ mov r0, #0x8\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._81 @cond_branch\n\
+ bl debug_sub_811B620\n\
+ ldr r1, ._83 @ \n\
+ mov r0, #0x1d\n\
+ strb r0, [r1]\n\
+ b ._102\n\
+._84:\n\
+ .align 2, 0\n\
+._83:\n\
+ .word +0x2000000\n\
+._81:\n\
+ ldrh r1, [r5, #0x2e]\n\
+ mov r0, #0x4\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._85 @cond_branch\n\
+ mov r0, #0x0\n\
+ bl sub_8104AB8\n\
+ ldr r1, ._87 @ \n\
+ mov r0, #0x8\n\
+ strb r0, [r1]\n\
+ b ._102\n\
+._88:\n\
+ .align 2, 0\n\
+._87:\n\
+ .word +0x2000000\n\
+._85:\n\
+ mov r0, #0x80\n\
+ lsl r0, r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._89 @cond_branch\n\
+ ldr r2, ._94 @ \n\
+ mov r3, #0xc\n\
+ ldsh r0, [r2, r3]\n\
+ sub r0, r0, #0x3\n\
+ mov r3, #0x12\n\
+ ldsh r1, [r2, r3]\n\
+ add r0, r0, r1\n\
+ cmp r0, #0\n\
+ blt ._90 @cond_branch\n\
+ ldrh r4, [r2, #0x12]\n\
+ add r0, r1, #0\n\
+ cmp r0, #0x2\n\
+ bgt ._91 @cond_branch\n\
+._92:\n\
+ lsl r0, r4, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ bl sub_8103D50\n\
+ lsl r0, r4, #0x10\n\
+ mov r2, #0x80\n\
+ lsl r2, r2, #0x9\n\
+ add r0, r0, r2\n\
+ lsr r4, r0, #0x10\n\
+ asr r0, r0, #0x10\n\
+ cmp r0, #0x2\n\
+ ble ._92 @cond_branch\n\
+._91:\n\
+ ldr r1, ._94 @ \n\
+ ldrh r0, [r1, #0xc]\n\
+ sub r0, r0, #0x3\n\
+ ldrh r3, [r1, #0x12]\n\
+ add r0, r0, r3\n\
+ strh r0, [r1, #0xc]\n\
+ mov r0, #0x3\n\
+ strh r0, [r1, #0x12]\n\
+ mov r0, #0x9\n\
+ strb r0, [r1]\n\
+ mov r0, #0x5f\n\
+ bl PlaySE\n\
+ b ._102\n\
+._95:\n\
+ .align 2, 0\n\
+._94:\n\
+ .word +0x2000000\n\
+._90:\n\
+ mov r0, #0x6\n\
+ b ._96\n\
+._89:\n\
+ mov r0, #0x80\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._98 @cond_branch\n\
+ ldr r4, ._103 @ \n\
+ mov r1, #0xc\n\
+ ldsh r0, [r4, r1]\n\
+ cmp r0, #0\n\
+ beq ._98 @cond_branch\n\
+ mov r0, #0x5f\n\
+ bl PlaySE\n\
+ ldrb r0, [r4, #0x12]\n\
+ bl sub_8103D50\n\
+ ldrh r0, [r4, #0xc]\n\
+ sub r0, r0, #0x1\n\
+ strh r0, [r4, #0xc]\n\
+ ldrh r0, [r4, #0x12]\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r4, #0x12]\n\
+._98:\n\
+ ldr r0, ._103 @ \n\
+ mov r2, #0x12\n\
+ ldsh r1, [r0, r2]\n\
+ add r2, r0, #0\n\
+ ldr r5, ._103 + 4 @ \n\
+ cmp r1, #0x2\n\
+ bgt ._99 @cond_branch\n\
+ cmp r1, #0\n\
+ beq ._101 @cond_branch\n\
+ ldrh r1, [r5, #0x2e]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._101 @cond_branch\n\
+._99:\n\
+ mov r0, #0x9\n\
+ strb r0, [r2]\n\
+._101:\n\
+ ldrh r1, [r5, #0x2e]\n\
+ mov r0, #0x2\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._102 @cond_branch\n\
+ mov r0, #0x15\n\
+._96:\n\
+ strb r0, [r2]\n\
+._102:\n\
+ mov r0, #0x0\n\
+ pop {r4, r5}\n\
+ pop {r1}\n\
+ bx r1\n\
+._104:\n\
+ .align 2, 0\n\
+._103:\n\
+ .word +0x2000000\n\
+ .word gMain");
+}
+#else
+static bool8 sub_8101E3C(struct Task *task)
+{
+ s16 i;
+
+ if (gMain.newKeys & SELECT_BUTTON)
+ {
+ sub_8104AB8(0);
+ eSlotMachine->state = 8;
+ }
+ else if (gMain.newKeys & R_BUTTON)
+ {
+ if (eSlotMachine->coins - (3 - eSlotMachine->bet) >= 0)
+ {
+ for (i = eSlotMachine->bet; i < 3; i++)
+ {
+ sub_8103D50(i);
+ }
+ eSlotMachine->coins -= (3 - eSlotMachine->bet);
+ eSlotMachine->bet = 3;
+ eSlotMachine->state = 9;
+ PlaySE(SE_REGI);
+ }
+ else
+ {
+ eSlotMachine->state = 6;
+ }
+ }
+ else
+ {
+ if (gMain.newKeys & DPAD_DOWN && eSlotMachine->coins != 0)
+ {
+ PlaySE(SE_REGI);
+ sub_8103D50(eSlotMachine->bet);
+ eSlotMachine->coins--;
+ eSlotMachine->bet++;
+ }
+ if (eSlotMachine->bet >= 3 || (eSlotMachine->bet != 0 && gMain.newKeys & A_BUTTON))
+ {
+ eSlotMachine->state = 9;
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ eSlotMachine->state = 21;
+ }
+ }
+ return FALSE;
+}
+#endif
+
+static void sub_8101F2C(const u8 *str)
+{
+ Menu_DisplayDialogueFrame();
+ Menu_PrintText(str, 2, 15);
+}
+
+static bool8 sub_8101F44(struct Task *task)
+{
+ sub_8101F2C(gOtherText_DontHaveThreeCoins);
+ eSlotMachine->state = 7;
+ return FALSE;
+}
+
+static bool8 sub_8101F60(struct Task *task)
+{
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ Menu_EraseScreen();
+ eSlotMachine->state = 5;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8101F88(struct Task *task)
+{
+ if (sub_8104AEC())
+ {
+ eSlotMachine->state = 5;
+ }
+ return FALSE;
+}
+
+#if DEBUG
+__attribute__((naked))
+static bool8 sub_8101FA4(struct Task *task)
+{
+ asm("\
+ push {r4, lr}\n\
+ add r4, r0, #0\n\
+ bl sub_8102484\n\
+ bl sub_8104DA4\n\
+ mov r0, #0x0\n\
+ bl sub_8102DEC\n\
+ mov r0, #0x1\n\
+ bl sub_8102DEC\n\
+ mov r0, #0x2\n\
+ bl sub_8102DEC\n\
+ mov r0, #0x0\n\
+ strh r0, [r4, #0x8]\n\
+ ldr r4, ._115 @ \n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x20\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._113 @cond_branch\n\
+ bl sub_810430C\n\
+ mov r0, #0xa\n\
+ b ._114\n\
+._116:\n\
+ .align 2, 0\n\
+._115:\n\
+ .word +0x2000000\n\
+._113:\n\
+ mov r0, #0x1\n\
+ bl sub_8104CAC\n\
+ mov r0, #0xb\n\
+._114:\n\
+ strb r0, [r4]\n\
+ ldr r4, ._119 @ \n\
+ mov r0, #0x8\n\
+ strh r0, [r4, #0x1a]\n\
+ ldrb r0, [r4, #0xa]\n\
+ cmp r0, #0\n\
+ beq ._117 @cond_branch\n\
+ bl dp15_jump_random_unknown\n\
+ strh r0, [r4, #0x1a]\n\
+._117:\n\
+ ldr r0, ._119 + 4 @ \n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._118 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x68\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._118:\n\
+ mov r0, #0x0\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1\n\
+._120:\n\
+ .align 2, 0\n\
+._119:\n\
+ .word +0x2000000\n\
+ .word unk_debug_bss_1_1");
+}
+#else
+static bool8 sub_8101FA4(struct Task *task)
+{
+ sub_8102484();
+ sub_8104DA4();
+ sub_8102DEC(0);
+ sub_8102DEC(1);
+ sub_8102DEC(2);
+ task->data[0] = 0;
+ if (eSlotMachine->unk04 & 0x20)
+ {
+ sub_810430C();
+ eSlotMachine->state = 10;
+ }
+ else
+ {
+ sub_8104CAC(1);
+ eSlotMachine->state = 11;
+ }
+ eSlotMachine->unk1A = 8;
+ if (eSlotMachine->unk0A)
+ {
+ eSlotMachine->unk1A = dp15_jump_random_unknown();
+ }
+ return FALSE;
+}
+#endif
+
+static bool8 sub_8102008(struct Task *task)
+{
+ if (sub_810432C())
+ {
+ sub_8104CAC(1);
+ eSlotMachine->unk04 &= 0xDF;
+ eSlotMachine->state = 11;
+ }
+ return FALSE;
+}
+
+#if DEBUG
+__attribute__((naked))
+static bool8 sub_8102034(struct Task *task)
+{
+ asm("\
+ push {r4, lr}\n\
+ ldrh r1, [r0, #0x8]\n\
+ add r1, r1, #0x1\n\
+ strh r1, [r0, #0x8]\n\
+ lsl r1, r1, #0x10\n\
+ asr r1, r1, #0x10\n\
+ cmp r1, #0x1d\n\
+ ble ._124 @cond_branch\n\
+ ldr r0, ._127 @ unk_debug_bss_1_1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._126 @cond_branch\n\
+ ldr r0, ._127 + 4 @ unk_debug_bss_1_4\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._126 @cond_branch\n\
+ ldr r4, ._127 + 8 @ unk_debug_bss_1_8\n\
+ bl Random\n\
+ mov r1, #0x1f\n\
+ and r1, r1, r0\n\
+ add r1, r1, #0x1\n\
+ str r1, [r4]\n\
+._126:\n\
+ bl sub_81024F0\n\
+ ldr r1, ._127 + 12 @ \n\
+ mov r0, #0xc\n\
+ strb r0, [r1]\n\
+._124:\n\
+ mov r0, #0x0\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1\n\
+._128:\n\
+ .align 2, 0\n\
+._127:\n\
+ .word unk_debug_bss_1_1\n\
+ .word unk_debug_bss_1_4\n\
+ .word unk_debug_bss_1_8\n\
+ .word +0x2000000");
+}
+#else
+static bool8 sub_8102034(struct Task *task)
+{
+ if (++task->data[0] >= 30)
+ {
+ sub_81024F0();
+ eSlotMachine->state = 12;
+ }
+ return FALSE;
+}
+#endif
+
+#if DEBUG
+__attribute__((naked))
+static bool8 sub_8102058(struct Task *task)
+{
+ asm("\
+ push {r4, r5, lr}\n\
+ ldr r0, ._133 @ unk_debug_bss_1_1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._130 @cond_branch\n\
+ ldr r0, ._133 + 4 @ unk_debug_bss_1_4\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._130 @cond_branch\n\
+ ldr r5, ._133 + 8 @ unk_debug_bss_1_8\n\
+ ldr r0, [r5]\n\
+ sub r0, r0, #0x1\n\
+ str r0, [r5]\n\
+ cmp r0, #0\n\
+ bne ._135 @cond_branch\n\
+ mov r0, #0x18\n\
+ bl PlaySE\n\
+ ldr r4, ._133 + 12 @ \n\
+ ldrb r0, [r4, #0x18]\n\
+ bl sub_8102E1C\n\
+ ldrb r0, [r4, #0x18]\n\
+ bl sub_8103C14\n\
+ bl Random\n\
+ mov r1, #0x1f\n\
+ and r1, r1, r0\n\
+ add r1, r1, #0x1\n\
+ str r1, [r5]\n\
+ b ._132\n\
+._134:\n\
+ .align 2, 0\n\
+._133:\n\
+ .word unk_debug_bss_1_1\n\
+ .word unk_debug_bss_1_4\n\
+ .word unk_debug_bss_1_8\n\
+ .word +0x2000000\n\
+._130:\n\
+ ldr r0, ._136 @ gMain\n\
+ ldrh r1, [r0, #0x2e]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._135 @cond_branch\n\
+ mov r0, #0x18\n\
+ bl PlaySE\n\
+ ldr r4, ._136 + 4 @ \n\
+ ldrb r0, [r4, #0x18]\n\
+ bl sub_8102E1C\n\
+ ldrb r0, [r4, #0x18]\n\
+ bl sub_8103C14\n\
+._132:\n\
+ mov r0, #0xd\n\
+ strb r0, [r4]\n\
+._135:\n\
+ mov r0, #0x0\n\
+ pop {r4, r5}\n\
+ pop {r1}\n\
+ bx r1\n\
+._137:\n\
+ .align 2, 0\n\
+._136:\n\
+ .word gMain\n\
+ .word +0x2000000");
+}
+#else
+static bool8 sub_8102058(struct Task *task)
+{
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_JYUNI);
+ sub_8102E1C(eSlotMachine->unk18);
+ sub_8103C14(eSlotMachine->unk18);
+ eSlotMachine->state = 13;
+ }
+ return FALSE;
+}
+#endif
+
+#if DEBUG
+__attribute__((naked))
+static bool8 sub_8102090(struct Task *task)
+{
+ asm("\
+ push {r4, lr}\n\
+ ldr r4, ._146 @ \n\
+ ldrb r0, [r4, #0x18]\n\
+ bl sub_8102E40\n\
+ lsl r0, r0, #0x18\n\
+ lsr r2, r0, #0x18\n\
+ cmp r2, #0\n\
+ bne ._138 @cond_branch\n\
+ ldrh r0, [r4, #0x18]\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r4, #0x18]\n\
+ mov r1, #0xc\n\
+ strb r1, [r4]\n\
+ lsl r0, r0, #0x10\n\
+ asr r0, r0, #0x10\n\
+ cmp r0, #0x2\n\
+ ble ._161 @cond_branch\n\
+ mov r0, #0xe\n\
+ strb r0, [r4]\n\
+ ldr r0, ._146 + 4 @ \n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x8\n\
+ beq ._140 @cond_branch\n\
+ cmp r0, #0x8\n\
+ bgt ._141 @cond_branch\n\
+ cmp r0, #0x2\n\
+ beq ._142 @cond_branch\n\
+ cmp r0, #0x2\n\
+ bgt ._143 @cond_branch\n\
+ cmp r0, #0x1\n\
+ beq ._144 @cond_branch\n\
+ b ._161\n\
+._147:\n\
+ .align 2, 0\n\
+._146:\n\
+ .word +0x2000000\n\
+ .word unk_debug_bss_1_0\n\
+._143:\n\
+ cmp r0, #0x4\n\
+ beq ._148 @cond_branch\n\
+ b ._161\n\
+._141:\n\
+ cmp r0, #0x40\n\
+ beq ._150 @cond_branch\n\
+ cmp r0, #0x40\n\
+ bgt ._151 @cond_branch\n\
+ cmp r0, #0x10\n\
+ beq ._152 @cond_branch\n\
+ b ._161\n\
+._151:\n\
+ cmp r0, #0x80\n\
+ beq ._154 @cond_branch\n\
+ b ._161\n\
+._142:\n\
+ mov r0, #0x14\n\
+ strh r0, [r4, #0x28]\n\
+ strh r0, [r4, #0x2a]\n\
+ mov r0, #0x12\n\
+ b ._160\n\
+._144:\n\
+ mov r0, #0x14\n\
+ strh r0, [r4, #0x28]\n\
+ strh r0, [r4, #0x2a]\n\
+ mov r0, #0x12\n\
+ b ._160\n\
+._148:\n\
+ mov r0, #0x3\n\
+ strh r0, [r4, #0x28]\n\
+ mov r0, #0x1\n\
+ strh r0, [r4, #0x2a]\n\
+ mov r0, #0x2\n\
+ b ._160\n\
+._140:\n\
+ strh r2, [r4, #0x28]\n\
+ mov r0, #0x2\n\
+ strh r0, [r4, #0x2a]\n\
+ mov r0, #0x3\n\
+ b ._160\n\
+._152:\n\
+ mov r0, #0x2\n\
+ strh r0, [r4, #0x28]\n\
+ mov r0, #0x5\n\
+ strh r0, [r4, #0x2a]\n\
+ mov r0, #0x14\n\
+ b ._160\n\
+._150:\n\
+ mov r0, #0x13\n\
+ strh r0, [r4, #0x28]\n\
+ strh r0, [r4, #0x2a]\n\
+ strh r2, [r4, #0x2c]\n\
+ b ._161\n\
+._154:\n\
+ mov r0, #0x13\n\
+ strh r0, [r4, #0x28]\n\
+ strh r0, [r4, #0x2a]\n\
+._160:\n\
+ strh r0, [r4, #0x2c]\n\
+._161:\n\
+ mov r0, #0x1\n\
+ b ._162\n\
+._138:\n\
+ mov r0, #0x0\n\
+._162:\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1");
+}
+#else
+static bool8 sub_8102090(struct Task *task)
+{
+ if (!sub_8102E40(eSlotMachine->unk18))
+ {
+ eSlotMachine->unk18++;
+ eSlotMachine->state = 12;
+ if (eSlotMachine->unk18 > 2)
+ {
+ eSlotMachine->state = 14;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+#endif
+
+#if DEBUG
+__attribute__((naked))
+bool8 sub_81020C8(struct Task *task)
+{
+ asm("\
+ push {r4, lr}\n\
+ ldr r4, ._165 @ \n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0xc0\n\
+ and r0, r0, r1\n\
+ strb r0, [r4, #0x4]\n\
+ bl CheckMatch\n\
+ ldrb r0, [r4, #0xa]\n\
+ cmp r0, #0\n\
+ beq ._163 @cond_branch\n\
+ sub r0, r0, #0x1\n\
+ strb r0, [r4, #0xa]\n\
+ ldrb r0, [r4, #0xb]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r4, #0xb]\n\
+ b ._164\n\
+._166:\n\
+ .align 2, 0\n\
+._165:\n\
+ .word +0x2000000\n\
+._163:\n\
+ bl debug_sub_811B894\n\
+._164:\n\
+ ldr r4, ._171 @ \n\
+ ldrh r0, [r4, #0x8]\n\
+ cmp r0, #0\n\
+ beq ._167 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x6c\n\
+ mov r2, #0xe\n\
+ ldsh r1, [r4, r2]\n\
+ bl debug_sub_811B5B4\n\
+ mov r0, #0xf\n\
+ strb r0, [r4]\n\
+ bl sub_8102A24\n\
+ bl sub_8103F70\n\
+ ldrh r0, [r4, #0x10]\n\
+ ldrh r1, [r4, #0xe]\n\
+ sub r0, r0, r1\n\
+ strh r0, [r4, #0x10]\n\
+ lsl r0, r0, #0x10\n\
+ cmp r0, #0\n\
+ bge ._168 @cond_branch\n\
+ mov r0, #0x0\n\
+ strh r0, [r4, #0x10]\n\
+._168:\n\
+ ldrh r1, [r4, #0x8]\n\
+ mov r0, #0xc0\n\
+ lsl r0, r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._169 @cond_branch\n\
+ ldr r0, ._171 + 4 @ \n\
+ bl PlayFanfare\n\
+ mov r0, #0x6\n\
+ bl sub_8104CAC\n\
+ b ._174\n\
+._172:\n\
+ .align 2, 0\n\
+._171:\n\
+ .word +0x2000000\n\
+ .word 0x185\n\
+._169:\n\
+ mov r0, #0x40\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._173 @cond_branch\n\
+ ldr r0, ._175 @ 0x185\n\
+ bl PlayFanfare\n\
+ mov r0, #0x5\n\
+ bl sub_8104CAC\n\
+ b ._174\n\
+._176:\n\
+ .align 2, 0\n\
+._175:\n\
+ .word 0x185\n\
+._173:\n\
+ mov r0, #0xc3\n\
+ lsl r0, r0, #0x1\n\
+ bl PlayFanfare\n\
+ mov r0, #0x2\n\
+ bl sub_8104CAC\n\
+._174:\n\
+ ldr r1, ._183 @ \n\
+ ldrh r3, [r1, #0x8]\n\
+ mov r0, #0xe0\n\
+ lsl r0, r0, #0x1\n\
+ and r0, r0, r3\n\
+ add r2, r1, #0\n\
+ cmp r0, #0\n\
+ beq ._179 @cond_branch\n\
+ ldrb r1, [r2, #0x4]\n\
+ mov r0, #0x3f\n\
+ and r0, r0, r1\n\
+ mov r1, #0x0\n\
+ strb r0, [r2, #0x4]\n\
+ mov r0, #0xc0\n\
+ lsl r0, r0, #0x1\n\
+ and r0, r0, r3\n\
+ cmp r0, #0\n\
+ beq ._179 @cond_branch\n\
+ strb r1, [r2, #0xa]\n\
+ strb r1, [r2, #0xb]\n\
+ strb r1, [r2, #0x3]\n\
+ mov r0, #0x80\n\
+ lsl r0, r0, #0x1\n\
+ and r0, r0, r3\n\
+ cmp r0, #0\n\
+ beq ._179 @cond_branch\n\
+ mov r0, #0x1\n\
+ strb r0, [r2, #0x3]\n\
+._179:\n\
+ ldrh r1, [r2, #0x8]\n\
+ mov r0, #0x20\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._185 @cond_branch\n\
+ ldrb r0, [r2, #0x2]\n\
+ cmp r0, #0xf\n\
+ bhi ._185 @cond_branch\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r2, #0x2]\n\
+ ldrb r0, [r2, #0x2]\n\
+ bl sub_8104064\n\
+ b ._185\n\
+._184:\n\
+ .align 2, 0\n\
+._183:\n\
+ .word +0x2000000\n\
+._167:\n\
+ mov r0, #0x3\n\
+ bl sub_8104CAC\n\
+ mov r0, #0x14\n\
+ strb r0, [r4]\n\
+ ldrh r0, [r4, #0x12]\n\
+ ldrh r1, [r4, #0x10]\n\
+ add r0, r0, r1\n\
+ strh r0, [r4, #0x10]\n\
+ lsl r0, r0, #0x10\n\
+ asr r0, r0, #0x10\n\
+ ldr r1, ._186 @ 0x270f\n\
+ cmp r0, r1\n\
+ ble ._185 @cond_branch\n\
+ strh r1, [r4, #0x10]\n\
+._185:\n\
+ mov r0, #0x0\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1\n\
+._187:\n\
+ .align 2, 0\n\
+._186:\n\
+ .word 0x270f");
+}
+#else
+bool8 sub_81020C8(struct Task *task)
+{
+ eSlotMachine->unk04 &= 0xc0;
+ CheckMatch();
+ if (eSlotMachine->unk0A)
+ {
+ eSlotMachine->unk0A--;
+ eSlotMachine->unk0B++;
+ }
+ if (eSlotMachine->matchedSymbols)
+ {
+ eSlotMachine->state = 15;
+ sub_8102A24();
+ sub_8103F70();
+ if ((eSlotMachine->unk10 -= eSlotMachine->payout) < 0)
+ {
+ eSlotMachine->unk10 = 0;
+ }
+ if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED)))
+ {
+ PlayFanfare(BGM_ME_B_BIG);
+ sub_8104CAC(6);
+ }
+ else if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_777_MIXED))
+ {
+ PlayFanfare(BGM_ME_B_BIG);
+ sub_8104CAC(5);
+ }
+ else
+ {
+ PlayFanfare(BGM_ME_B_SMALL);
+ sub_8104CAC(2);
+ }
+ if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_MIXED) | (1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED)))
+ {
+ eSlotMachine->unk04 &= 0x3f;
+ if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED)))
+ {
+ eSlotMachine->unk0A = 0;
+ eSlotMachine->unk0B = 0;
+ eSlotMachine->unk03 = 0;
+ if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_777_BLUE))
+ {
+ eSlotMachine->unk03 = 1;
+ }
+ }
+ }
+ if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_POWER) && eSlotMachine->pikaPower < 16)
+ {
+ eSlotMachine->pikaPower++;
+ sub_8104064(eSlotMachine->pikaPower);
+ }
+ }
+ else
+ {
+ sub_8104CAC(3);
+ eSlotMachine->state = 20;
+ if ((eSlotMachine->unk10 += eSlotMachine->bet) > 9999)
+ {
+ eSlotMachine->unk10 = 9999;
+ }
+ }
+ return FALSE;
+}
+#endif
+
+static bool8 sub_81021E0(struct Task *task)
+{
+ if (sub_8102A44())
+ {
+ eSlotMachine->state = 16;
+ }
+ return FALSE;
+}
+
+static bool8 sub_81021FC(struct Task *task)
+{
+ if (sub_8103FA0())
+ {
+ eSlotMachine->state = 19;
+ if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_RED) | (1 << SLOT_MACHINE_MATCHED_777_BLUE)))
+ {
+ IncrementGameStat(GAME_STAT_SLOT_JACKPOTS);
+ }
+ if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY))
+ {
+ eSlotMachine->unk18 = 0;
+ eSlotMachine->state = 9;
+ }
+ if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_POWER))
+ {
+ eSlotMachine->state = 17;
+ }
+ if (eSlotMachine->unk0A && eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY))
+ {
+ sub_8104CAC(4);
+ eSlotMachine->state = 18;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 sub_8102264(struct Task *task)
+{
+ if (!sub_81040C8())
+ {
+ eSlotMachine->state = 19;
+ if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY))
+ {
+ eSlotMachine->state = 9;
+ if (eSlotMachine->unk0A)
+ {
+ sub_8104CAC(4);
+ eSlotMachine->state = 18;
+ }
+ }
+ }
+ return FALSE;
+}
+
+static bool8 sub_81022A0(struct Task *task)
+{
+ if (sub_8104E18())
+ {
+ eSlotMachine->state = 19;
+ if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY))
+ {
+ eSlotMachine->state = 9;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 sub_81022CC(struct Task *task)
+{
+ sub_8103D8C(0);
+ sub_8103D8C(1);
+ sub_8103D8C(2);
+ eSlotMachine->state = 2;
+ return FALSE;
+}
+
+static bool8 sub_81022F0(struct Task *task)
+{
+ if (++task->data[1] > 64)
+ {
+ task->data[1] = 0;
+ eSlotMachine->state = 19;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8102318(struct Task *task)
+{
+ sub_8101F2C(gOtherText_QuitGamePrompt);
+ DisplayYesNoMenu(21, 7, 1);
+ sub_814AB84();
+ eSlotMachine->state = 22;
+ return FALSE;
+}
+
+static bool8 sub_8102344(struct Task *task)
+{
+ s8 input = Menu_ProcessInputNoWrap_();
+ if (input == 0)
+ {
+ Menu_EraseScreen();
+ sub_8103D8C(0);
+ sub_8103D8C(1);
+ sub_8103D8C(2);
+ eSlotMachine->coins += eSlotMachine->bet;
+ eSlotMachine->state = 27;
+ }
+ else if (input == 1 || input == -1)
+ {
+ Menu_EraseScreen();
+ eSlotMachine->state = 5;
+ }
+ return FALSE;
+}
+
+static bool8 sub_810239C(struct Task *task)
+{
+ sub_8101F2C(gOtherText_MaxCoins);
+ eSlotMachine->state = 24;
+ return FALSE;
+}
+
+static bool8 sub_81023B8(struct Task *task)
+{
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ Menu_EraseScreen();
+ eSlotMachine->state = 5;
+ }
+ return FALSE;
+}
+
+static bool8 sub_81023E0(struct Task *task)
+{
+ sub_8101F2C(gOtherText_OutOfCoins);
+ eSlotMachine->state = 26;
+ return FALSE;
+}
+
+static bool8 sub_81023FC(struct Task *task)
+{
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ Menu_EraseScreen();
+ eSlotMachine->state = 27;
+ }
+ return FALSE;
+}
+
+#if DEBUG
+__attribute__((naked))
+static bool8 sub_8102424(struct Task *task)
+{
+ asm("\
+ push {lr}\n\
+ add sp, sp, #0xfffffffc\n\
+ ldr r0, ._234 @ unk_debug_bss_1_1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ bne ._233 @cond_branch\n\
+ ldr r0, ._234 + 4 @ gSaveBlock1\n\
+ ldr r1, ._234 + 8 @ \n\
+ ldrh r1, [r1, #0xc]\n\
+ ldr r2, ._234 + 12 @ \n\
+ add r0, r0, r2\n\
+ strh r1, [r0]\n\
+._233:\n\
+ mov r0, #0x1\n\
+ neg r0, r0\n\
+ mov r1, #0x0\n\
+ str r1, [sp]\n\
+ mov r2, #0x0\n\
+ mov r3, #0x10\n\
+ bl BeginNormalPaletteFade\n\
+ ldr r1, ._234 + 8 @ \n\
+ ldrb r0, [r1]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r1]\n\
+ mov r0, #0x0\n\
+ add sp, sp, #0x4\n\
+ pop {r1}\n\
+ bx r1\n\
+._235:\n\
+ .align 2, 0\n\
+._234:\n\
+ .word unk_debug_bss_1_1\n\
+ .word gSaveBlock1\n\
+ .word +0x2000000\n\
+ .word 0x494");
+}
+#else
+static bool8 sub_8102424(struct Task *task)
+{
+ gSaveBlock1.coins = eSlotMachine->coins;
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ eSlotMachine->state++;
+ return FALSE;
+}
+#endif
+
+static bool8 sub_8102460(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(eSlotMachine->prevMainCb);
+ }
+ return FALSE;
+}
+
+#if DEBUG
+__attribute__((naked))
+static bool8 debug_sub_8116E74(struct Task *task)
+{
+ asm("\
+ push {lr}\n\
+ bl debug_sub_811B634\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._239 @cond_branch\n\
+ ldr r1, ._240 @ \n\
+ mov r0, #0x5\n\
+ strb r0, [r1]\n\
+._239:\n\
+ mov r0, #0x0\n\
+ pop {r1}\n\
+ bx r1\n\
+._241:\n\
+ .align 2, 0\n\
+._240:\n\
+ .word +0x2000000");
+}
+#endif
+
+#if DEBUG
+__attribute__((naked))
+static void sub_8102484(void)
+{
+ asm("\
+ push {r4, r5, r6, lr}\n\
+ ldr r0, ._256 @ \n\
+ ldrb r2, [r0, #0xa]\n\
+ add r4, r0, #0\n\
+ cmp r2, #0\n\
+ beq ._242 @cond_branch\n\
+ b ._270\n\
+._242:\n\
+ ldr r0, ._256 + 4 @ \n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._245 @cond_branch\n\
+ ldr r3, ._256 + 8 @ \n\
+ ldrb r0, [r3]\n\
+ cmp r0, #0\n\
+ beq ._245 @cond_branch\n\
+ ldr r0, ._256 + 12 @ \n\
+ ldrb r1, [r0]\n\
+ strb r1, [r4, #0x4]\n\
+ strb r2, [r3]\n\
+ strb r2, [r0]\n\
+ mov r0, #0x80\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._246 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x88\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._246:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x40\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._247 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x84\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._247:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x20\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._248 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x8c\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._248:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x10\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._249 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x80\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._249:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x8\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._250 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x7c\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._250:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x4\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._251 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x78\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._251:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._252 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x74\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._252:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x2\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ bne ._253 @cond_branch\n\
+ b ._270\n\
+._253:\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x70\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+ b ._270\n\
+._257:\n\
+ .align 2, 0\n\
+._256:\n\
+ .word +0x2000000\n\
+ .word unk_debug_bss_1_1\n\
+ .word unk_debug_bss_1_2\n\
+ .word unk_debug_bss_1_3\n\
+._245:\n\
+ add r5, r4, #0\n\
+ ldrb r1, [r5, #0x4]\n\
+ mov r0, #0xc0\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ bne ._270 @cond_branch\n\
+ bl sub_8102540\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._260 @cond_branch\n\
+ bl sub_8102578\n\
+ lsl r0, r0, #0x18\n\
+ lsr r6, r0, #0x18\n\
+ cmp r6, #0x3\n\
+ beq ._260 @cond_branch\n\
+ ldr r1, ._271 @ gUnknown_083ECE42\n\
+ lsl r0, r6, #0x1\n\
+ add r0, r0, r1\n\
+ ldrb r1, [r0]\n\
+ ldrb r0, [r5, #0x4]\n\
+ orr r0, r0, r1\n\
+ strb r0, [r5, #0x4]\n\
+ mov r1, #0x80\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._261 @cond_branch\n\
+ add r0, r5, #0\n\
+ add r0, r0, #0x88\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._261:\n\
+ ldrb r1, [r5, #0x4]\n\
+ mov r0, #0x40\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._262 @cond_branch\n\
+ add r0, r5, #0\n\
+ add r0, r0, #0x84\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._262:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x20\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._263 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x8c\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._263:\n\
+ cmp r6, #0x1\n\
+ bne ._270 @cond_branch\n\
+._260:\n\
+ bl sub_81025BC\n\
+ lsl r0, r0, #0x18\n\
+ lsr r6, r0, #0x18\n\
+ cmp r6, #0x5\n\
+ beq ._270 @cond_branch\n\
+ ldr r4, ._271 + 4 @ \n\
+ ldr r1, ._271 + 8 @ \n\
+ lsl r0, r6, #0x1\n\
+ add r0, r0, r1\n\
+ ldrb r1, [r0]\n\
+ ldrb r0, [r4, #0x4]\n\
+ orr r0, r0, r1\n\
+ strb r0, [r4, #0x4]\n\
+ mov r1, #0x10\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._266 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x80\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._266:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x8\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._267 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x7c\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._267:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x4\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._268 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x78\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._268:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._269 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x74\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._269:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x2\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._270 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x70\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._270:\n\
+ pop {r4, r5, r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+._272:\n\
+ .align 2, 0\n\
+._271:\n\
+ .word gUnknown_083ECE42\n\
+ .word +0x2000000\n\
+ .word gUnknown_083ECE48");
+}
+#else
+static void sub_8102484(void)
+{
+ u8 r3;
+
+ if (eSlotMachine->unk0A == 0 && !(eSlotMachine->unk04 & 0xc0))
+ {
+ if (sub_8102540())
+ {
+ r3 = sub_8102578();
+ if (r3 != 3)
+ {
+ eSlotMachine->unk04 |= gUnknown_083ECE42[r3];
+ if (r3 != 1)
+ {
+ return;
+ }
+ }
+ }
+ r3 = sub_81025BC();
+ if (r3 != 5)
+ {
+ eSlotMachine->unk04 |= gUnknown_083ECE48[r3];
+ }
+ }
+}
+#endif
+
+static void sub_81024F0(void)
+{
+ eSlotMachine->unk06 = 0;
+ if (eSlotMachine->unk04)
+ {
+ eSlotMachine->unk06 = 1;
+ }
+}
+
+static u8 sub_810250C(u8 a0)
+{
+ u8 i;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (a0 & 1)
+ {
+ return gUnknown_083ECE3A[i];
+ }
+ a0 >>= 1;
+ }
+ return 0;
+}
+
+static bool8 sub_8102540(void)
+{
+ u8 rval = Random();
+ if (gUnknown_083ECD04[eSlotMachine->unk01][eSlotMachine->bet - 1] > rval)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static const u8 gUnknown_083ECD16[][6];
+
+static u8 sub_8102578(void)
+{
+ s16 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ s16 rval = Random() & 0xff;
+ s16 value = gUnknown_083ECD16[i][eSlotMachine->unk01];
+ if (value > rval)
+ {
+ break;
+ }
+ }
+ return i;
+}
+
+static const u8 gUnknown_083ECD28[][6];
+
+static u8 sub_81025BC(void)
+{
+ s16 i;
+
+ for (i = 0; i < 5; i++)
+ {
+ s16 rval = Random() & 0xff;
+ s16 r3 = gUnknown_083ECD28[i][eSlotMachine->unk01];
+ if (i == 0 && eSlotMachine->unk03 == 1)
+ {
+ r3 += 10;
+ if (r3 > 0x100)
+ {
+ r3 = 0x100;
+ }
+ }
+ else if (i == 4 && eSlotMachine->unk03 == 1)
+ {
+ r3 -= 10;
+ if (r3 < 0)
+ {
+ r3 = 0;
+ }
+ }
+ if (r3 > rval)
+ {
+ break;
+ }
+ }
+ return i;
+}
+
+static const u8 gUnknown_083ECD46[][17];
+static const u8 gUnknown_083ECDAC[][17];
+
+static u8 sub_810264C(u8 a0)
+{
+ if (eSlotMachine->unk03 == 0)
+ {
+ return gUnknown_083ECD46[a0][eSlotMachine->pikaPower];
+ }
+ return gUnknown_083ECDAC[a0][eSlotMachine->pikaPower];
+}
+
+static void sub_8102680(void)
+{
+ u8 rval;
+ s16 i;
+
+ eSlotMachine->unk05 = 0;
+ rval = Random();
+ if (rval < sub_810264C(0))
+ {
+ return;
+ }
+ for (i = 5; i > 0; i--)
+ {
+ rval = Random();
+ if (rval < sub_810264C(i))
+ {
+ break;
+ }
+ }
+ eSlotMachine->unk05 = i;
+}
+
+static const u16 gUnknown_083ECE12[];
+
+static bool8 sub_81026DC(u16 a0)
+{
+ u16 rval = Random() & 0xff;
+ if (rval < gUnknown_083ECE12[a0])
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static const u16 gUnknown_083ECE1C[][2];
+static const u16 gUnknown_083ECE30[];
+
+static u16 dp15_jump_random_unknown(void)
+{
+ u8 r4 = 0;
+ u8 rval;
+ u8 value;
+ if (eSlotMachine->unk10 >= 300)
+ {
+ r4 = 4;
+ }
+ else if (eSlotMachine->unk10 >= 250)
+ {
+ r4 = 3;
+ }
+ else if (eSlotMachine->unk10 >= 200)
+ {
+ r4 = 2;
+ }
+ else if (eSlotMachine->unk10 >= 150)
+ {
+ r4 = 1;
+ }
+ rval = Random() % 100;
+ value = gUnknown_083ECE1C[r4][0];
+ if (rval < value)
+ {
+ return 4;
+ }
+ rval = Random() % 100;
+ value = gUnknown_083ECE1C[r4][1] + gUnknown_083ECE30[eSlotMachine->unk0B];
+ if (rval < value)
+ {
+ return 2;
+ }
+ return 8;
+}
+
+static void CheckMatch(void)
+{
+ eSlotMachine->matchedSymbols = 0;
+ CheckMatch_CenterRow();
+ if (eSlotMachine->bet > 1)
+ {
+ CheckMatch_TopAndBottom();
+ }
+ if (eSlotMachine->bet > 2)
+ {
+ CheckMatch_Diagonals();
+ }
+}
+
+static const u16 sSlotMatchFlags[];
+static const u16 sSlotPayouts[];
+
+static void CheckMatch_CenterRow(void)
+{
+ u8 c1, c2, c3, match;
+
+ c1 = GetTagOfReelSymbolOnScreenAtPos(0, 2);
+ c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2);
+ c3 = GetTagOfReelSymbolOnScreenAtPos(2, 2);
+ match = GetMatchFromSymbolsInRow(c1, c2, c3);
+ if (match != SLOT_MACHINE_MATCHED_NONE)
+ {
+ eSlotMachine->payout += sSlotPayouts[match];
+ eSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
+ sub_8103E04(0);
+ }
+}
+
+static void CheckMatch_TopAndBottom(void)
+{
+ u8 c1, c2, c3, match;
+
+ c1 = GetTagOfReelSymbolOnScreenAtPos(0, 1);
+ c2 = GetTagOfReelSymbolOnScreenAtPos(1, 1);
+ c3 = GetTagOfReelSymbolOnScreenAtPos(2, 1);
+ match = GetMatchFromSymbolsInRow(c1, c2, c3);
+ if (match != SLOT_MACHINE_MATCHED_NONE)
+ {
+ if (match == SLOT_MACHINE_MATCHED_1CHERRY)
+ {
+ match = SLOT_MACHINE_MATCHED_2CHERRY;
+ }
+ eSlotMachine->payout += sSlotPayouts[match];
+ eSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
+ sub_8103E04(1);
+ }
+ c1 = GetTagOfReelSymbolOnScreenAtPos(0, 3);
+ c2 = GetTagOfReelSymbolOnScreenAtPos(1, 3);
+ c3 = GetTagOfReelSymbolOnScreenAtPos(2, 3);
+ match = GetMatchFromSymbolsInRow(c1, c2, c3);
+ if (match != SLOT_MACHINE_MATCHED_NONE)
+ {
+ if (match == SLOT_MACHINE_MATCHED_1CHERRY)
+ {
+ match = SLOT_MACHINE_MATCHED_2CHERRY;
+ }
+ eSlotMachine->payout += sSlotPayouts[match];
+ eSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
+ sub_8103E04(2);
+ }
+}
+
+static void CheckMatch_Diagonals(void)
+{
+ u8 c1, c2, c3, match;
+
+ c1 = GetTagOfReelSymbolOnScreenAtPos(0, 1);
+ c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2);
+ c3 = GetTagOfReelSymbolOnScreenAtPos(2, 3);
+ match = GetMatchFromSymbolsInRow(c1, c2, c3);
+ if (match != SLOT_MACHINE_MATCHED_NONE)
+ {
+ if (match != SLOT_MACHINE_MATCHED_1CHERRY)
+ {
+ eSlotMachine->payout += sSlotPayouts[match];
+ eSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
+ }
+ sub_8103E04(3);
+ }
+ c1 = GetTagOfReelSymbolOnScreenAtPos(0, 3);
+ c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2);
+ c3 = GetTagOfReelSymbolOnScreenAtPos(2, 1);
+ match = GetMatchFromSymbolsInRow(c1, c2, c3);
+ if (match != SLOT_MACHINE_MATCHED_NONE)
+ {
+ if (match != SLOT_MACHINE_MATCHED_1CHERRY)
+ {
+ eSlotMachine->payout += sSlotPayouts[match];
+ eSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
+ }
+ sub_8103E04(4);
+ }
+}
+
+static const u8 sSym2Match[];
+
+static u8 GetMatchFromSymbolsInRow(u8 c1, u8 c2, u8 c3)
+{
+ if (c1 == c2 && c1 == c3)
+ {
+ return sSym2Match[c1];
+ }
+ if (c1 == SLOT_MACHINE_TAG_7_RED && c2 == SLOT_MACHINE_TAG_7_RED && c3 == SLOT_MACHINE_TAG_7_BLUE)
+ {
+ return SLOT_MACHINE_MATCHED_777_MIXED;
+ }
+ if (c1 == SLOT_MACHINE_TAG_7_BLUE && c2 == SLOT_MACHINE_TAG_7_BLUE && c3 == SLOT_MACHINE_TAG_7_RED)
+ {
+ return SLOT_MACHINE_MATCHED_777_MIXED;
+ }
+ if (c1 == SLOT_MACHINE_TAG_CHERRY)
+ {
+ return SLOT_MACHINE_MATCHED_1CHERRY;
+ }
+ return SLOT_MACHINE_MATCHED_NONE;
+}
+
+static void sub_8102A24(void)
+{
+ sub_8102A64(CreateTask(sub_8102A64, 4));
+}
+
+static bool8 sub_8102A44(void)
+{
+ if (FindTaskIdByFunc(sub_8102A64) == 0xff)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 (*const gUnknown_083ECB20[])(struct Task *task) = {
+ sub_8102A9C,
+ sub_8102AD0,
+ sub_8102B80
+};
+
+static void sub_8102A64(u8 taskId)
+{
+ while (gUnknown_083ECB20[gTasks[taskId].data[0]](gTasks + taskId));
+}
+
+static bool8 sub_8102A9C(struct Task *task)
+{
+ if (sub_8103E38())
+ {
+ task->data[0]++;
+ if (eSlotMachine->payout == 0)
+ {
+ task->data[0] = 2;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 sub_8102AD0(struct Task *task)
+{
+ if (!task->data[1]--)
+ {
+ if (IsFanfareTaskInactive())
+ {
+ PlaySE(SE_PIN);
+ }
+ eSlotMachine->payout--;
+ if (eSlotMachine->coins < 9999)
+ {
+ eSlotMachine->coins++;
+ }
+ task->data[1] = 8;
+ if (gMain.heldKeys & A_BUTTON)
+ {
+ task->data[1] = 4;
+ }
+ }
+ if (IsFanfareTaskInactive() && gMain.newKeys & START_BUTTON)
+ {
+ PlaySE(SE_PIN);
+ eSlotMachine->coins += eSlotMachine->payout;
+ if (eSlotMachine->coins > 9999)
+ {
+ eSlotMachine->coins = 9999;
+ }
+ eSlotMachine->payout = 0;
+ }
+ if (eSlotMachine->payout == 0)
+ {
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8102B80(struct Task *task)
+{
+ if (sub_8103E7C())
+ {
+ DestroyTask(FindTaskIdByFunc(sub_8102A64));
+ }
+ return FALSE;
+}
+
+static const u8 sReelSymbols[][21];
+
+static u8 GetTagOfReelSymbolOnScreenAtPos(u8 x, s16 y)
+{
+ s16 offset = (eSlotMachine->reelPositions[x] + y) % 21;
+ if (offset < 0)
+ {
+ offset += 21;
+ }
+ return sReelSymbols[x][offset];
+}
+
+static u8 GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(u8 x, s16 y)
+{
+ s16 r6 = 0;
+ if ((eSlotMachine->unk1C[x]) % 24)
+ r6 = -1;
+ return GetTagOfReelSymbolOnScreenAtPos(x, y + r6);
+}
+
+static const u8 gUnknown_083ECCF1[];
+
+static u8 sub_8102C48(s16 a0)
+{
+ s16 r1 = (eSlotMachine->unk16 + a0) % 6;
+ if (r1 < 0)
+ r1 += 6;
+ return gUnknown_083ECCF1[r1];
+}
+
+static void sub_8102C84(u8 a0, s16 a1)
+{
+ eSlotMachine->unk1C[a0] += a1;
+ eSlotMachine->unk1C[a0] %= 504;
+ eSlotMachine->reelPositions[a0] = 21 - eSlotMachine->unk1C[a0] / 24;
+}
+
+static s16 sub_8102CCC(u8 a0, s16 a1)
+{
+ s16 r1 = eSlotMachine->unk1C[a0] % 24;
+ if (r1 != 0)
+ {
+ if (r1 < a1)
+ a1 = r1;
+ sub_8102C84(a0, a1);
+ r1 = eSlotMachine->unk1C[a0] % 24;
+ }
+ return r1;
+}
+
+static void sub_8102D28(s16 a0)
+{
+ eSlotMachine->unk14 += a0;
+ eSlotMachine->unk14 %= 120;
+ eSlotMachine->unk16 = 6 - eSlotMachine->unk14 / 20;
+}
+
+static s16 sub_8102D5C(s16 a0)
+{
+ s16 r1 = eSlotMachine->unk14 % 20;
+ if (r1 != 0)
+ {
+ if (r1 < a0)
+ a0 = r1;
+ sub_8102D28(a0);
+ r1 = eSlotMachine->unk14 % 20;
+ }
+ return r1;
+}
+
+static void sub_8102DA8(void)
+{
+ u8 i;
+ for (i = 0; i < 3; i++)
+ {
+ u8 taskId = CreateTask(sub_8102E68, 2);
+ gTasks[taskId].data[15] = i;
+ eSlotMachine->reelTasks[i] = taskId;
+ sub_8102E68(taskId);
+ }
+}
+
+static void sub_8102DEC(u8 a0)
+{
+ gTasks[eSlotMachine->reelTasks[a0]].data[0] = 1;
+ gTasks[eSlotMachine->reelTasks[a0]].data[14] = 1;
+}
+
+static void sub_8102E1C(u8 a0)
+{
+ gTasks[eSlotMachine->reelTasks[a0]].data[0] = 2;
+}
+
+static bool8 sub_8102E40(u8 a0)
+{
+ return gTasks[eSlotMachine->reelTasks[a0]].data[14];
+}
+
+static bool8 (*const gUnknown_083ECB2C[])(struct Task *task) = {
+ sub_8102EA0,
+ sub_8102EA4,
+ sub_8102EC0,
+ sub_8102F4C,
+ sub_8103008
+};
+
+static void sub_8102E68(u8 taskId)
+{
+ while (gUnknown_083ECB2C[gTasks[taskId].data[0]](gTasks + taskId));
+}
+
+static bool8 sub_8102EA0(struct Task *task)
+{
+ return FALSE;
+}
+
+static bool8 sub_8102EA4(struct Task *task)
+{
+ sub_8102C84(task->data[15], eSlotMachine->unk1A);
+ return FALSE;
+}
+
+static bool8 (*const gUnknown_083ECB40[])(void) = {
+ sub_810305C,
+ sub_81032C0,
+ sub_81033DC
+};
+static void (*const gUnknown_083ECB4C[])(void) = {
+ sub_81034F4,
+ sub_8103540,
+ sub_810380C
+};
+
+static bool8 sub_8102EC0(struct Task *task)
+{
+ task->data[0]++;
+ eSlotMachine->unk34[task->data[15]] = 0;
+ eSlotMachine->unk2E[task->data[15]] = 0;
+ if (eSlotMachine->unk0A == 0 && (eSlotMachine->unk04 == 0 || eSlotMachine->unk06 == 0 || !gUnknown_083ECB40[task->data[15]]()))
+ {
+ eSlotMachine->unk06 = 0;
+ gUnknown_083ECB4C[task->data[15]]();
+ }
+ task->data[1] = eSlotMachine->unk2E[task->data[15]];
+ return TRUE;
+}
+
+static bool8 sub_8102F4C(struct Task *task)
+{
+ u16 sp[] = {2, 4, 4, 4, 8};
+ s16 r2 = eSlotMachine->unk1C[task->data[15]] % 24;
+ if (r2 != 0)
+ {
+ r2 = sub_8102CCC(task->data[15], eSlotMachine->unk1A);
+ }
+ else if (eSlotMachine->unk2E[task->data[15]])
+ {
+ eSlotMachine->unk2E[task->data[15]]--;
+ sub_8102C84(task->data[15], eSlotMachine->unk1A);
+ r2 = eSlotMachine->unk1C[task->data[15]] % 24;
+ }
+ if (r2 == 0 && eSlotMachine->unk2E[task->data[15]] == 0)
+ {
+ task->data[0]++;
+ task->data[1] = sp[task->data[1]];
+ task->data[2] = 0;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8103008(struct Task *task)
+{
+ eSlotMachine->unk22[task->data[15]] = task->data[1];
+ task->data[1] = -task->data[1];
+ task->data[2]++;
+ if ((task->data[2] & 0x3) == 0)
+ {
+ task->data[1] >>= 1;
+ }
+ if (task->data[1] == 0)
+ {
+ task->data[0] = 0;
+ task->data[14] = 0;
+ eSlotMachine->unk22[task->data[15]] = 0;
+ }
+ return FALSE;
+}
+
+static bool8 (*const gUnknown_083ECB64[])(u8 a0, u8 a1) = {
+ sub_8103154,
+ sub_81031B4,
+ sub_81031B4
+};
+
+static bool8 sub_810305C(void)
+{
+ u8 r3 = sub_810250C(eSlotMachine->unk04);
+ u8 r5 = r3;
+ if (eSlotMachine->unk04 & 0xc0)
+ {
+ r5 = 0;
+ r3 = 1;
+ }
+ return gUnknown_083ECB64[eSlotMachine->bet - 1](r5, r3);
+}
+
+static bool8 sub_81030A4(s16 y, u8 tag1, u8 tag2)
+{
+ u8 tag = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, y);
+ if (tag == tag1 || tag == tag2)
+ {
+ eSlotMachine->unk07 = tag;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 sub_81030E0(s16 y)
+{
+ if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 1 - y) == 4 || GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - y) == 4 || GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 3 - y) == 4)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8103134(void)
+{
+ if (eSlotMachine->unk04 & 0xc2)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8103154(u8 a0, u8 a1)
+{
+ s16 i;
+
+ for (i = 0; i < 5; i++)
+ {
+ if (sub_81030A4(2 - i, a0, a1))
+ {
+ eSlotMachine->unk34[0] = 2;
+ eSlotMachine->unk2E[0] = i;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 sub_81031B4(u8 tag1, u8 tag2)
+{
+ s16 i;
+ bool8 r6 = sub_8103134();
+ if (r6 || !sub_81030E0(0))
+ {
+ for (i = 1; i < 4; i++)
+ {
+ if (sub_81030A4(i, tag1, tag2))
+ {
+ eSlotMachine->unk34[0] = i;
+ eSlotMachine->unk2E[0] = 0;
+ return TRUE;
+ }
+ }
+ }
+ for (i = 1; i < 5; i++)
+ {
+ bool8 r7 = r6;
+ if (r7 || !sub_81030E0(i))
+ {
+ if (sub_81030A4(1 - i, tag1, tag2))
+ {
+ if (i == 1 && (r7 || !sub_81030E0(3)))
+ {
+ eSlotMachine->unk34[0] = 3;
+ eSlotMachine->unk2E[0] = 3;
+ return TRUE;
+ }
+ if (i < 4 && (r7 || !sub_81030E0(i + 1)))
+ {
+ eSlotMachine->unk34[0] = 2;
+ eSlotMachine->unk2E[0] = i + 1;
+ return TRUE;
+ }
+ eSlotMachine->unk34[0] = 1;
+ eSlotMachine->unk2E[0] = i;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+static bool8 (*const gUnknown_083ECB70[])(void) = {
+ sub_81032E8,
+ sub_81032E8,
+ sub_810333C
+};
+
+static bool8 sub_81032C0(void)
+{
+ return gUnknown_083ECB70[eSlotMachine->bet - 1]();
+}
+
+static bool8 sub_81032E8(void)
+{
+ s16 i;
+ s16 unk34_0 = eSlotMachine->unk34[0];
+
+ for (i = 0; i < 5; i++)
+ {
+ if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, unk34_0 - i) == eSlotMachine->unk07)
+ {
+ eSlotMachine->unk34[1] = unk34_0;
+ eSlotMachine->unk2E[1] = i;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 sub_810333C(void)
+{
+ s16 i;
+ if (sub_81032E8())
+ {
+ if (eSlotMachine->unk34[0] != 2 && eSlotMachine->unk2E[1] > 1 && eSlotMachine->unk2E[1] != 4)
+ {
+ for (i = 0; i < 5; i++)
+ {
+ if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i) == eSlotMachine->unk07)
+ {
+ eSlotMachine->unk34[1] = 2;
+ eSlotMachine->unk2E[1] = i;
+ break;
+ }
+ }
+ }
+ return TRUE;
+ }
+ if (eSlotMachine->unk34[0] != 2)
+ {
+ for (i = 0; i < 5; i++)
+ {
+ if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i) == eSlotMachine->unk07)
+ {
+ eSlotMachine->unk34[1] = 2;
+ eSlotMachine->unk2E[1] = i;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+static bool8 (*const gUnknown_083ECB7C[])(u8 a0) = {
+ sub_810341C,
+ sub_810341C,
+ sub_810347C
+};
+
+static bool8 sub_81033DC(void)
+{
+ u8 r3 = eSlotMachine->unk07;
+ if (eSlotMachine->unk04 & 0x40)
+ {
+ r3 = 0;
+ if (eSlotMachine->unk07 == 0)
+ {
+ r3 = 1;
+ }
+ }
+ return gUnknown_083ECB7C[eSlotMachine->bet - 1](r3);
+}
+
+static bool8 sub_810341C(u8 a0)
+{
+ s16 i;
+ s16 unk34_1 = eSlotMachine->unk34[1];
+
+ for (i = 0; i < 5; i++)
+ {
+ if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, unk34_1 - i) == a0)
+ {
+ eSlotMachine->unk34[2] = unk34_1;
+ eSlotMachine->unk2E[2] = i;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 sub_810347C(u8 a0)
+{
+ s16 i;
+ s16 r8;
+ if (eSlotMachine->unk34[0] == eSlotMachine->unk34[1])
+ {
+ return sub_810341C(a0);
+ }
+ r8 = 1;
+ if (eSlotMachine->unk34[0] == 1)
+ {
+ r8 = 3;
+ }
+ for (i = 0; i < 5; i++)
+ {
+ if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, r8 - i) == a0)
+ {
+ eSlotMachine->unk2E[2] = i;
+ eSlotMachine->unk34[2] = r8;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static void sub_81034F4(void)
+{
+ s16 i;
+ for (i = 0; sub_81030E0(i); i++);
+ eSlotMachine->unk2E[0] = i;
+}
+
+static bool8 sub_8103520(u8 *a0)
+{
+ if (*a0 == 0)
+ {
+ *a0 = 1;
+ return TRUE;
+ }
+ if (*a0 == 1)
+ {
+ *a0 = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void (*const gUnknown_083ECB88[])(void) = {
+ sub_8103564,
+ j5_08111E84,
+ sub_8103668
+};
+
+static void sub_8103540(void)
+{
+ gUnknown_083ECB88[eSlotMachine->bet - 1]();
+}
+
+static void sub_8103564(void)
+{
+ if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80)
+ {
+ u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - eSlotMachine->unk2E[0]);
+ if (sub_8103520(&sp0))
+ {
+ s16 i;
+ for (i = 0; i < 5; i++)
+ {
+ if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i))
+ {
+ eSlotMachine->unk34[1] = 2;
+ eSlotMachine->unk2E[1] = i;
+ break;
+ }
+ }
+ }
+ }
+}
+
+static void j5_08111E84(void)
+{
+ if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80)
+ {
+ u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]);
+ if (sub_8103520(&sp0))
+ {
+ s16 i;
+ for (i = 0; i < 5; i++)
+ {
+ if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[0] - i))
+ {
+ eSlotMachine->unk34[1] = eSlotMachine->unk34[0];
+ eSlotMachine->unk2E[1] = i;
+ break;
+ }
+ }
+ }
+ }
+}
+
+static void sub_8103668(void)
+{
+ s16 i;
+ s16 j;
+ if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80)
+ {
+ if (eSlotMachine->unk34[0] == 2)
+ {
+ j5_08111E84();
+ }
+ else
+ {
+ u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]);
+ if (sub_8103520(&sp0))
+ {
+ j = 2;
+ if (eSlotMachine->unk34[0] == 3)
+ j = 3;
+ for (i = 0; i < 2; i++, j--)
+ {
+ if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, j))
+ {
+ eSlotMachine->unk34[1] = j;
+ eSlotMachine->unk2E[1] = 0;
+ return;
+ }
+ }
+ for (j = 1; j < 5; j++)
+ {
+ if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[0] - j))
+ {
+ if (eSlotMachine->unk34[0] == 1)
+ {
+ if (j < 3)
+ {
+ eSlotMachine->unk34[1] = 2;
+ eSlotMachine->unk2E[1] = j + 1;
+ }
+ else
+ {
+ eSlotMachine->unk34[1] = 1;
+ eSlotMachine->unk2E[1] = j;
+ }
+ }
+ else
+ {
+ if (j < 3)
+ {
+ eSlotMachine->unk34[1] = 3;
+ eSlotMachine->unk2E[1] = j;
+ }
+ else
+ {
+ eSlotMachine->unk34[1] = 2;
+ eSlotMachine->unk2E[1] = j - 1;
+ }
+ }
+ return;
+ }
+ }
+ }
+ }
+ }
+}
+
+static bool8 sub_8103764(u8 a0, u8 a1)
+{
+ if ((a0 == 0 && a1 == 1) || (a0 == 1 && a1 == 0))
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 sub_810378C(u8 a0, u8 a1, u8 a2)
+{
+ if ((a0 == 0 && a1 == 1 && a2 == 0) || (a0 == 1 && a1 == 0 && a2 == 1))
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 sub_81037BC(u8 a0, u8 a1, u8 a2)
+{
+ if ((a0 == 0 && a1 == 1 && a2 == 0) ||
+ (a0 == 1 && a1 == 0 && a2 == 1) ||
+ (a0 == 0 && a1 == 0 && a2 == 1) ||
+ (a0 == 1 && a1 == 1 && a2 == 0) ||
+ (a0 == a1 && a0 == a2))
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static void (*const gUnknown_083ECB94[])(void) = {
+ sub_8103830,
+ sub_8103910,
+ sub_8103A78
+};
+
+static void sub_810380C(void)
+{
+ gUnknown_083ECB94[eSlotMachine->bet - 1]();
+}
+
+static void sub_8103830(void)
+{
+ s16 i = 0;
+ u8 r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - eSlotMachine->unk2E[0]);
+ u8 r1 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]);
+ if (r5 == r1)
+ {
+ while (1)
+ {
+ u8 r0;
+ if (!(r5 == (r0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i)) || (r5 == 0 && r0 == 1) || (r5 == 1 && r0 == 0)))
+ {
+ break;
+ }
+ i++;
+ }
+ }
+ else if (sub_8103764(r5, r1))
+ {
+ if (eSlotMachine->unk04 & 0x80)
+ {
+ for (i = 0; i < 5; i++)
+ {
+ if (r5 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i))
+ {
+ eSlotMachine->unk2E[2] = i;
+ return;
+ }
+ }
+ }
+ i = 0;
+ while (1)
+ {
+ if (r5 != GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i))
+ {
+ break;
+ }
+ i++;
+ }
+ }
+ eSlotMachine->unk2E[2] = i;
+}
-extern u16 gUnknown_08E95AB8[];
-extern u16 gUnknown_08E95FB8[];
+static void sub_8103910(void)
+{
+ s16 sp0 = 0;
+ s16 i;
+ u8 r7;
+ u8 r6;
+ u8 r4;
+
+ if (eSlotMachine->unk34[1] != 0 && eSlotMachine->unk34[0] == eSlotMachine->unk34[1] && eSlotMachine->unk04 & 0x80)
+ {
+ r7 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]);
+ r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[1] - eSlotMachine->unk2E[1]);
+ if (sub_8103764(r7, r6))
+ {
+ for (i = 0; i < 5; i++)
+ {
+ r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, eSlotMachine->unk34[1] - i);
+ if (r7 == r4)
+ {
+ sp0 = i;
+ break;
+ }
+ }
+ }
+ }
+ while (1)
+ {
+ s16 r8;
+ for (i = 1, r8 = 0; i < 4; i++)
+ {
+ r7 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, i - eSlotMachine->unk2E[0]);
+ r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, i - eSlotMachine->unk2E[1]);
+ r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, i - sp0);
+ if (!sub_81037BC(r7, r6, r4) && (!sub_810378C(r7, r6, r4) || !(eSlotMachine->unk04 & 0x80)))
+ {
+ r8++;
+ break;
+ }
+ }
+ if (r8 == 0)
+ {
+ break;
+ }
+ sp0++;
+ }
+ eSlotMachine->unk2E[2] = sp0;
+}
+
+static void sub_8103A78(void)
+{
+ u8 r6;
+ u8 r5;
+ u8 r4;
+ s16 r8;
+ s16 i;
+
+ sub_8103910();
+ if (eSlotMachine->unk34[1] != 0 && eSlotMachine->unk34[0] != eSlotMachine->unk34[1] && eSlotMachine->unk04 & 0x80)
+ {
+ r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]);
+ r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[1] - eSlotMachine->unk2E[1]);
+ if (sub_8103764(r6, r5))
+ {
+ r8 = 1;
+ if (eSlotMachine->unk34[0] == 1)
+ r8 = 3;
+ for (i = 0; i < 5; i++)
+ {
+ r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, r8 - (eSlotMachine->unk2E[2] + i));
+ if (r6 == r4)
+ {
+ eSlotMachine->unk2E[2] += i;
+ break;
+ }
+ }
+ }
+ }
+ while (1)
+ {
+ r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 1 - eSlotMachine->unk2E[0]);
+ r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]);
+ r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 3 - eSlotMachine->unk2E[2]);
+ if (sub_81037BC(r6, r5, r4) || (sub_810378C(r6, r5, r4) && eSlotMachine->unk04 & 0x80))
+ break;
+ eSlotMachine->unk2E[2]++;
+ }
+ while (1)
+ {
+ r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 3 - eSlotMachine->unk2E[0]);
+ r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]);
+ r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 1 - eSlotMachine->unk2E[2]);
+ if (sub_81037BC(r6, r5, r4) || (sub_810378C(r6, r5, r4) && eSlotMachine->unk04 & 0x80))
+ break;
+ eSlotMachine->unk2E[2]++;
+ }
+}
+
+static void sub_8103C14(u8 a0)
+{
+ u8 taskId = CreateTask(sub_8103C48, 5);
+ gTasks[taskId].data[15] = a0;
+ sub_8103C48(taskId);
+}
+
+static void (*const gUnknown_083ECBA0[])(struct Task *task, u8 taskId) = {
+ sub_8103C78,
+ sub_8103CAC,
+ sub_8103CC8
+};
+
+static void sub_8103C48(u8 taskId)
+{
+ gUnknown_083ECBA0[gTasks[taskId].data[0]](gTasks + taskId, taskId);
+}
+
+static const s16 gUnknown_083ECBAC[] = {5, 10, 15};
+
+static void sub_8103C78(struct Task *task, u8 taskId)
+{
+ sub_81065A8(gUnknown_083ECBAC[task->data[15]], 0x62, 0x63, 0x72, 0x73);
+ task->data[0]++;
+}
+
+static void sub_8103CAC(struct Task *task, u8 taskId)
+{
+ if (++task->data[1] > 11)
+ task->data[0]++;
+}
+
+static void sub_8103CC8(struct Task *task, u8 taskId)
+{
+ sub_81065A8(gUnknown_083ECBAC[task->data[15]], 0x42, 0x43, 0x52, 0x53);
+ DestroyTask(taskId);
+}
+
+static const u16 *const gUnknown_083EDD08[];
+static const u16 *const gUnknown_083EDD1C[];
+static const u8 gUnknown_083EDD30[];
+
+static void sub_8103D00(u8 a0)
+{
+ LoadPalette(gUnknown_083EDD08[a0], gUnknown_083EDD30[a0], 2);
+}
+
+static void sub_8103D28(u8 a0)
+{
+ LoadPalette(gUnknown_083EDD1C[a0], gUnknown_083EDD30[a0], 2);
+}
+
+static const u8 gUnknown_083EDD35[][2];
+static const u8 gUnknown_083EDD3B[];
+
+static void sub_8103D50(u8 a0)
+{
+ u8 i;
+ for (i = 0; i < gUnknown_083EDD3B[a0]; i++)
+ {
+ sub_8103D00(gUnknown_083EDD35[a0][i]);
+ }
+}
+
+static void sub_8103D8C(u8 a0)
+{
+ u8 i;
+ for (i = 0; i < gUnknown_083EDD3B[a0]; i++)
+ {
+ sub_8103D28(gUnknown_083EDD35[a0][i]);
+ }
+}
+
+static void sub_8103DC8(void)
+{
+ u8 i;
+ for (i = 0; i < 5; i++)
+ {
+ u8 spriteId = CreateInvisibleSprite(sub_8103EE4);
+ gSprites[spriteId].data[0] = i;
+ eSlotMachine->unk44[i] = spriteId;
+ }
+}
+
+static void sub_8103E04(u8 a0)
+{
+ struct Sprite *sprite = gSprites + eSlotMachine->unk44[a0];
+ sprite->data[1] = 1;
+ sprite->data[2] = 4;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ sprite->data[5] = 2;
+ sprite->data[7] = 0;
+}
+
+static bool8 sub_8103E38(void)
+{
+ u8 i;
+ for (i = 0; i < 5; i++)
+ {
+ struct Sprite *sprite = gSprites + eSlotMachine->unk44[i];
+ if (sprite->data[1] && sprite->data[2])
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static bool8 sub_8103E7C(void)
+{
+ u8 i;
+ for (i = 0; i < 5; i++)
+ {
+ if (!sub_8103EAC(eSlotMachine->unk44[i]))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static bool8 sub_8103EAC(u8 spriteId)
+{
+ struct Sprite *sprite = gSprites + spriteId;
+ if (!sprite->data[1])
+ return TRUE;
+ if (sprite->data[7])
+ sprite->data[1] = 0;
+ return sprite->data[7];
+}
+
+static void sub_8103EE4(struct Sprite *sprite)
+{
+ s16 r4;
+ if (sprite->data[1])
+ {
+ if (!sprite->data[3]--)
+ {
+ sprite->data[7] = 0;
+ sprite->data[3] = 1;
+ sprite->data[4] += sprite->data[5];
+ r4 = 4;
+ if (sprite->data[2])
+ r4 = 8;
+ if (sprite->data[4] <= 0)
+ {
+ sprite->data[7] = 1;
+ sprite->data[5] = -sprite->data[5];
+ if (sprite->data[2])
+ sprite->data[2]--;
+ }
+ else if (sprite->data[4] >= r4)
+ sprite->data[5] = -sprite->data[5];
+ if (sprite->data[2])
+ sprite->data[3] <<= 1;
+ }
+ MultiplyPaletteRGBComponents(gUnknown_083EDD30[sprite->data[0]], sprite->data[4], sprite->data[4], sprite->data[4]);
+ }
+}
+
+static void sub_8103F70(void)
+{
+ u8 taskId = CreateTask(sub_8103FE8, 6);
+ gTasks[taskId].data[3] = 1;
+ sub_8103FE8(taskId);
+}
+
+static const u16 *const gUnknown_083EDDA0[];
+static const u16 *const gUnknown_083EDDAC;
+
+static bool8 sub_8103FA0(void)
+{
+ u8 taskId = FindTaskIdByFunc(sub_8103FE8);
+ if (!gTasks[taskId].data[2])
+ {
+ DestroyTask(taskId);
+ LoadPalette(gUnknown_083EDDAC, 0x10, 0x20);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_8103FE8(u8 taskId)
+{
+ struct Task *task = gTasks + taskId;
+ if (!task->data[1]--)
+ {
+ task->data[1] = 4;
+ task->data[2] += task->data[3];
+ if (task->data[2] == 0 || task->data[2] == 2)
+ {
+ task->data[3] = -task->data[3];
+ }
+ }
+ LoadPalette(gUnknown_083EDDA0[task->data[2]], 0x10, 0x20);
+}
+
+static void sub_8104048(void)
+{
+ eSlotMachine->unk3E = CreateTask(sub_81040E8, 8);
+}
+
+static void sub_8104064(u8 pikaPower)
+{
+ struct Task *task = gTasks + eSlotMachine->unk3E;
+ sub_810421C(task);
+ task->data[0] = 1;
+ task->data[1]++;
+ task->data[15] = 1;
+}
+
+static void sub_8104098(void)
+{
+ struct Task *task = gTasks + eSlotMachine->unk3E;
+ sub_810421C(task);
+ task->data[0] = 3;
+ task->data[15] = 1;
+}
+
+static bool8 sub_81040C8(void)
+{
+ return gTasks[eSlotMachine->unk3E].data[15];
+}
+
+static void (*const gUnknown_083ECBB4[])(struct Task *task) = {
+ nullsub_68,
+ sub_810411C,
+ sub_8104144,
+ sub_81041AC
+};
+
+static void sub_81040E8(u8 taskId)
+{
+ gUnknown_083ECBB4[gTasks[taskId].data[0]](gTasks + taskId);
+}
+
+static void nullsub_68(struct Task *task)
+{
+
+}
+
+static void sub_810411C(struct Task *task)
+{
+ task->data[2] = sub_8105B1C((task->data[1] << 3) + 20, 20);
+ task->data[0]++;
+}
+
+static const u16 gUnknown_083ECBC4[][2] = {
+ {0x9e, 0x6e},
+ {0x9f, 0x6f},
+ {0xaf, 0x7f}
+};
+
+static void sub_8104144(struct Task *task)
+{
+ u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29);
+ if (gSprites[task->data[2]].data[7])
+ {
+ s16 r2 = task->data[1] + 2;
+ u8 r0 = 0;
+ if (task->data[1] == 1)
+ r0 = 1;
+ else if (task->data[1] == 16)
+ r0 = 2;
+ vaddr[r2 + 0x40] = gUnknown_083ECBC4[r0][0];
+ sub_8105B88(task->data[2]);
+ task->data[0] = 0;
+ task->data[15] = 0;
+ }
+}
+
+static void sub_81041AC(struct Task *task)
+{
+ u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29);
+ s16 r4 = task->data[1] + 2;
+ u8 r2 = 0;
+ if (task->data[1] == 1)
+ r2 = 1;
+ else if (task->data[1] == 16)
+ r2 = 2;
+ if (task->data[2] == 0)
+ {
+ vaddr[r4 + 0x40] = gUnknown_083ECBC4[r2][1];
+ task->data[1]--;
+ }
+ if (++task->data[2] >= 20)
+ task->data[2] = 0;
+ if (task->data[1] == 0)
+ {
+ task->data[0] = 0;
+ task->data[15] = 0;
+ }
+}
+
+static void sub_810421C(struct Task *task)
+{
+ u8 i;
+
+ for (i = 2; i < 16; i++)
+ task->data[i] = 0;
+}
+
+static void sub_810423C(u8 pikaPower)
+{
+ s16 i;
+ u8 r3;
+ s16 r2 = 3;
+ u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29);
+ for (i = 0; i < pikaPower; i++, r2++)
+ {
+ r3 = 0;
+ if (i == 0)
+ r3 = 1;
+ else if (i == 15)
+ r3 = 2;
+ vaddr[r2 + 0x40] = gUnknown_083ECBC4[r3][0];
+ }
+ for (; i < 16; i++, r2++)
+ {
+ r3 = 0;
+ if (i == 0)
+ r3 = 1;
+ else if (i == 15)
+ r3 = 2;
+ vaddr[r2 + 0x40] = gUnknown_083ECBC4[r3][1];
+ }
+ gTasks[eSlotMachine->unk3E].data[1] = pikaPower;
+}
+
+static void sub_810430C(void)
+{
+ u8 taskId = CreateTask(sub_810434C, 7);
+ sub_810434C(taskId);
+}
+
+static bool8 sub_810432C(void)
+{
+ if (FindTaskIdByFunc(sub_810434C) == 0xFF)
+ return TRUE;
+ return FALSE;
+}
+
+static void (*const gUnknown_083ECBD0[])(struct Task *task) = {
+ sub_810437C,
+ sub_81043EC,
+ sub_8104468,
+ sub_8104498,
+ sub_8104548,
+ sub_8104598,
+ sub_81045CC,
+ sub_810463C,
+ sub_81046C0,
+ sub_8104764,
+ sub_8104794,
+ sub_81047EC,
+ sub_8104860,
+ sub_81048A8,
+ sub_81048CC,
+ sub_8104940,
+ sub_81049C8,
+ sub_8104794,
+ sub_81049F8
+};
+
+static void sub_810434C(u8 taskId)
+{
+ gUnknown_083ECBD0[gTasks[taskId].data[0]](gTasks + taskId);
+}
+
+static void sub_810437C(struct Task *task)
+{
+ eSlotMachine->unk0A = 0;
+ eSlotMachine->unk14 = 0;
+ eSlotMachine->unk16 = 0;
+ task->data[0]++;
+ task->data[1] = 0;
+ task->data[2] = 30;
+ task->data[4] = 1280;
+ gSpriteCoordOffsetX = 0;
+ gSpriteCoordOffsetY = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ sub_8104A40(30, 0);
+ sub_81051C0();
+ sub_8105100();
+ sub_81052EC();
+ sub_81053A0();
+ sub_810545C();
+ sub_8102680();
+ StopMapMusic();
+ PlayNewMapMusic(BGM_BD_TIME);
+}
+
+static void sub_81043EC(struct Task *task)
+{
+ s16 r3;
+ gSpriteCoordOffsetX -= 8;
+ task->data[1] += 8;
+ r3 = ((task->data[1] + 240) & 0xff) >> 3;
+ REG_BG1HOFS = task->data[1] & 0x1ff;
+ if (r3 != task->data[2] && task->data[3] <= 18)
+ {
+ task->data[2] = r3;
+ task->data[3] = task->data[1] >> 3;
+ sub_8104A40(r3, task->data[3]);
+ }
+ if (task->data[1] >= 200)
+ {
+ task->data[0]++;
+ task->data[3] = 0;
+ }
+ sub_8102D28(task->data[4] >> 8);
+}
+
+static void sub_8104468(struct Task *task)
+{
+ sub_8102D28(task->data[4] >> 8);
+ if (++task->data[5] >= 60)
+ {
+ task->data[0]++;
+ sub_8105578();
+ sub_81056F0();
+ }
+}
+
+static void sub_8104498(struct Task *task)
+{
+ int r5;
+ u8 sp0[] = {1, 1, 2, 2};
+ s16 sp4[] = {0x40, 0x30, 0x18, 0x08};
+ s16 spC[] = {10, 8, 6, 4};
+
+ sub_8102D28(task->data[4] >> 8);
+ task->data[4] -= 4;
+ r5 = 4 - (task->data[4] >> 8);
+ sub_8105688(sp4[r5]);
+ sub_81057E8(spC[r5]);
+ StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, sp0[r5]);
+ if (task->data[4] <= 0x100)
+ {
+ task->data[0]++;
+ task->data[4] = 0x100;
+ task->data[5] = 0;
+ }
+}
+
+static void sub_8104548(struct Task *task)
+{
+ sub_8102D28(task->data[4] >> 8);
+ if (++task->data[5] >= 80)
+ {
+ task->data[0]++;
+ task->data[5] = 0;
+ sub_81057E8(2);
+ StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 3);
+ }
+}
+
+static void sub_8104598(struct Task *task)
+{
+ sub_8102D28(task->data[4] >> 8);
+ task->data[4] = (u8)task->data[4] + 0x80;
+ if (++task->data[5] >= 80)
+ {
+ task->data[0]++;
+ task->data[5] = 0;
+ }
+}
+
+static void sub_81045CC(struct Task *task)
+{
+ sub_8102D28(task->data[4] >> 8);
+ task->data[4] = (u8)task->data[4] + 0x40;
+ if (++task->data[5] >= 40)
+ {
+ task->data[5] = 0;
+ if (eSlotMachine->unk05)
+ {
+ if (eSlotMachine->unk0A <= task->data[6])
+ {
+ task->data[0]++;
+ }
+ }
+ else if (task->data[6] > 3)
+ {
+ task->data[0]++;
+ }
+ else if (sub_81026DC(task->data[6]))
+ {
+ task->data[0] = 14;
+ }
+ task->data[6]++;
+ }
+}
+
+static void sub_810463C(struct Task *task)
+{
+ s16 r5 = eSlotMachine->unk14 % 20;
+ if (r5)
+ {
+ r5 = sub_8102D5C(task->data[4] >> 8);
+ task->data[4] = (u8)task->data[4] + 0x40;
+ }
+ else if (sub_8102C48(1) != eSlotMachine->unk05)
+ {
+ sub_8102D28(task->data[4] >> 8);
+ r5 = eSlotMachine->unk14 % 20;
+ task->data[4] = (u8)task->data[4] + 0x40;
+ }
+ if (r5 == 0 && sub_8102C48(1) == eSlotMachine->unk05)
+ {
+ task->data[4] = 0;
+ task->data[0]++;
+ }
+}
+
+static void sub_81046C0(struct Task *task)
+{
+ if (++task->data[4] >= 60)
+ {
+ StopMapMusic();
+ sub_81056C0();
+ sub_8105804();
+ task->data[0]++;
+ if(eSlotMachine->unk05 == 0)
+ {
+ task->data[4] = 0xa0;
+ StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 5);
+ PlayFanfare(BGM_ME_ZANNEN);
+ }
+ else
+ {
+ task->data[4] = 0xc0;
+ StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 4);
+ gSprites[eSlotMachine->unk3F].animCmdIndex = 0;
+ if (eSlotMachine->pikaPower)
+ {
+ sub_8104098();
+ eSlotMachine->pikaPower = 0;
+ }
+ PlayFanfare(BGM_ME_B_SMALL);
+ }
+ }
+}
+
+static void sub_8104764(struct Task *task)
+{
+ if ((task->data[4] == 0 || --task->data[4] == 0) && !sub_81040C8())
+ {
+ task->data[0]++;
+ }
+}
+
+static void sub_8104794(struct Task *task)
+{
+ s16 r4;
+ gSpriteCoordOffsetX -= 8;
+ task->data[1] += 8;
+ task->data[3] += 8;
+ r4 = ((task->data[1] - 8) & 0xff) >> 3;
+ REG_BG1HOFS = task->data[1] & 0x1ff;
+ if (task->data[3] >> 3 <= 25)
+ {
+ sub_8104A88(r4);
+ }
+ else
+ {
+ task->data[0]++;
+ }
+}
+
+static void sub_81047EC(struct Task *task)
+{
+ eSlotMachine->unk0B = 0;
+ eSlotMachine->unk0A = eSlotMachine->unk05;
+ gSpriteCoordOffsetX = 0;
+ REG_BG1HOFS = 0;
+ eSlotMachine->unk1A = 8;
+ sub_810514C();
+ sub_81054B8();
+ sub_8105524();
+ PlayNewMapMusic(eSlotMachine->backupMapMusic);
+ if (eSlotMachine->unk0A == 0)
+ {
+ DestroyTask(FindTaskIdByFunc(sub_810434C));
+ }
+ else
+ {
+ sub_8104CAC(4);
+ task->data[1] = dp15_jump_random_unknown();
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[0]++;
+ }
+}
+
+static void sub_8104860(struct Task *task)
+{
+ if (eSlotMachine->unk1A == task->data[1])
+ {
+ task->data[0]++;
+ }
+ else if (eSlotMachine->unk1C[0] % 24 == 0 && (++task->data[2]& 0x07) == 0)
+ {
+ eSlotMachine->unk1A >>= 1;
+ }
+}
+
+static void sub_81048A8(struct Task *task)
+{
+ if (sub_8104E18())
+ {
+ DestroyTask(FindTaskIdByFunc(sub_810434C));
+ }
+}
+
+static void sub_81048CC(struct Task *task)
+{
+ sub_81054B8();
+ sub_81056C0();
+ sub_8105804();
+ sub_8105854();
+ gSprites[eSlotMachine->unk4E[0]].invisible = TRUE;
+ StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 5);
+ task->data[0]++;
+ task->data[4] = 4;
+ task->data[5] = 0;
+ StopMapMusic();
+ PlayFanfare(BGM_ME_ZANNEN);
+ PlaySE(SE_W153);
+}
+
+static void sub_8104940(struct Task *task)
+{
+ gSpriteCoordOffsetY = task->data[4];
+ REG_BG1VOFS = task->data[4];
+ if (task->data[5] & 0x01)
+ task->data[4] = -task->data[4];
+ if ((++task->data[5] & 0x1f) == 0)
+ task->data[4] >>= 1;
+ if (task->data[4] == 0)
+ {
+ sub_81058A0();
+ sub_81058C4();
+ sub_8105284();
+ sub_81059E8();
+ gSprites[eSlotMachine->unk4E[0]].invisible = FALSE;
+ task->data[0]++;
+ task->data[5] = 0;
+ }
+}
+
+static void sub_81049C8(struct Task *task)
+{
+ gSpriteCoordOffsetY = 0;
+ REG_BG1VOFS = 0;
+ if (sub_8105ACC())
+ {
+ task->data[0]++;
+ sub_8105AEC();
+ }
+}
+
+static void sub_81049F8(struct Task *task)
+{
+ gSpriteCoordOffsetX = 0;
+ REG_BG1HOFS = 0;
+ PlayNewMapMusic(eSlotMachine->backupMapMusic);
+ sub_810514C();
+ sub_8105554();
+ sub_8105524();
+ sub_81059B8();
+ DestroyTask(FindTaskIdByFunc(sub_810434C));
+}
+
+static const u16 sReelTimeWindowTilemap[];
+
+static void sub_8104A40(s16 a0, s16 a1)
+{
+ s16 i;
+
+ for (i = 4; i < 15; i++)
+ {
+ u16 tile = sReelTimeWindowTilemap[a1 + (i - 4) * 20];
+ ((u16 *)BG_SCREEN_ADDR(28))[32 * i + a0] = tile;
+ }
+}
+
+static void sub_8104A88(s16 a0)
+{
+ s16 i;
+
+ for (i = 4; i < 15; i++)
+ {
+ ((u16 *)BG_SCREEN_ADDR(28))[32 * i + a0] = 0;
+ }
+}
+
+static void sub_8104AB8(u8 a0)
+{
+ u8 taskId = CreateTask(sub_8104B0C, 1);
+ gTasks[taskId].data[1] = a0;
+ sub_8104B0C(taskId);
+}
+
+static bool8 sub_8104AEC(void)
+{
+ if (FindTaskIdByFunc(sub_8104B0C) == 0xFF)
+ return TRUE;
+ return FALSE;
+}
+
+static void (*const gUnknown_083ECC30[])(struct Task *task) = {
+ sub_8104B3C,
+ sub_8104B60,
+ sub_8104B80,
+ sub_8104B60,
+ sub_8104BC8,
+ sub_8104B60,
+ sub_8104BFC,
+ sub_8104B60,
+ sub_8104C44
+};
+
+static void sub_8104B0C(u8 taskId)
+{
+ gUnknown_083ECC30[gTasks[taskId].data[0]](gTasks + taskId);
+}
+
+static void sub_8104B3C(struct Task *task)
+{
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ task->data[0]++;
+}
+
+static void sub_8104B60(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ task->data[0]++;
+ }
+}
+
+static void sub_8104B80(struct Task *task)
+{
+ sub_8104DA4();
+ sub_81065DC();
+ BasicInitMenuWindow(&gWindowTemplate_81E7144);
+ Menu_PrintTextPixelCoords(gOtherText_ReelTime, 10, 32, 1);
+ BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ task->data[0]++;
+}
+
+static void sub_8104BC8(struct Task *task)
+{
+ if (gMain.newKeys & (B_BUTTON | SELECT_BUTTON))
+ {
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ task->data[0]++;
+ }
+}
+
+static void sub_8104BFC(struct Task *task)
+{
+ Menu_EraseScreen();
+ BasicInitMenuWindow(&gWindowTemplate_81E7128);
+ sub_81064B8();
+ sub_8104CAC(task->data[1]);
+ sub_810423C(eSlotMachine->pikaPower);
+ BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ task->data[0]++;
+}
+
+static void sub_8104C44(struct Task *task)
+{
+ DestroyTask(FindTaskIdByFunc(sub_8104B0C));
+}
+
+static void sub_8104C5C(void)
+{
+ u8 i;
+ struct Task *task;
+ i = CreateTask(sub_8104E74, 3);
+ eSlotMachine->unk3D = i;
+ task = gTasks + i;
+ task->data[1] = -1;
+ for (i = 4; i < 16; i++)
+ {
+ task->data[i] = MAX_SPRITES;
+ }
+}
static void LoadSlotMachineWheelOverlay(void);
-void sub_8104CAC(u8 arg0) {
+static void sub_8104CAC(u8 arg0)
+{
u8 i;
struct Task *task;
sub_8104DA4();
- task = &gTasks[ewram0_8->unk3D];
+ task = gTasks + eSlotMachine->unk3D;
task->data[1] = arg0;
- i = 0;
- while (gUnknown_083ED048[arg0][i].unk00 != 0xFF)
+ for (i = 0; gUnknown_083ED048[arg0][i].unk00 != 0xFF; i++)
{
u8 spriteId;
spriteId = sub_8105BB4(
@@ -55,44 +4042,1039 @@ void sub_8104CAC(u8 arg0) {
#ifdef GERMAN
if (arg0 == 5 && i <= 2)
- {
gSprites[spriteId].invisible = TRUE;
- }
#endif
+ }
+}
+
+static void sub_8104D30(u8 a0, SpriteCallback a1, s16 a2, s16 a3, s16 a4)
+{
+ u8 i;
+ struct Task *task = gTasks + eSlotMachine->unk3D;
+ for (i = 4; i < 16; i++)
+ {
+ if (task->data[i] == MAX_SPRITES)
+ {
+ task->data[i] = sub_8105BF8(a0, a1, a2, a3, a4);
+ break;
+ }
+ }
+}
+
+static void (*const gUnknown_083ED064[])(void);
+
+void sub_8104DA4(void)
+{
+ u8 i;
+ struct Task *task = gTasks + eSlotMachine->unk3D;
+ if ((u16)task->data[1] != 0xFFFF)
+ gUnknown_083ED064[task->data[1]]();
+ for (i = 4; i < 16; i++)
+ {
+ if (task->data[i] != MAX_SPRITES)
+ {
+ DestroySprite(gSprites + task->data[i]);
+ task->data[i] = MAX_SPRITES;
+ }
+ }
+}
+
+static bool8 sub_8104E18(void)
+{
+ u8 i;
+ struct Task *task = gTasks + eSlotMachine->unk3D;
+ for (i = 4; i < 16; i++)
+ {
+ if (task->data[i] != MAX_SPRITES)
+ {
+ if (gSprites[task->data[i]].data[7])
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+static void (*const gUnknown_083ECC54[])(struct Task *task) = {
+ nullsub_69
+};
+
+static void sub_8104E74(u8 taskId)
+{
+ gUnknown_083ECC54[gTasks[taskId].data[0]](gTasks + taskId);
+}
+
+static void nullsub_69(struct Task *task)
+{
+
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED414;
+
+static void sub_8104EA8(void)
+{
+ s16 i;
+ s16 j;
+ s16 x;
+ for (i = 0, x = 0x30; i < 3; i++, x += 0x28)
+ {
+ for (j = 0; j < 120; j += 24)
+ {
+ struct Sprite *sprite = gSprites + CreateSprite(&gSpriteTemplate_83ED414, x, 0, 14);
+ sprite->oam.priority = 3;
+ sprite->data[0] = i;
+ sprite->data[1] = j;
+ sprite->data[3] = -1;
+ }
+ }
+}
+
+static void sub_8104F18(struct Sprite *sprite)
+{
+ sprite->data[2] = eSlotMachine->unk1C[sprite->data[0]] + sprite->data[1];
+ sprite->data[2] %= 120;
+ sprite->pos1.y = eSlotMachine->unk22[sprite->data[0]] + 28 + sprite->data[2];
+ sprite->sheetTileStart = GetSpriteTileStartByTag(GetTagOfReelSymbolOnScreenAtPos(sprite->data[0], sprite->data[2] / 24));
+ SetSpriteSheetFrameTileNum(sprite);
+}
+
+static void sub_8104F8C(void)
+{
+ s16 i;
+ s16 x;
+ for (x = 203, i = 1; i < 10000; i *= 10, x -= 7)
+ {
+ sub_8104FF4(x, 23, 0, i);
+ }
+ for (x = 235, i = 1; i < 10000; i *= 10, x -= 7)
+ {
+ sub_8104FF4(x, 23, 1, i);
+ }
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED42C;
- i += 1;
+static void sub_8104FF4(s16 x, s16 y, u8 a2, s16 a3)
+{
+ struct Sprite *sprite = gSprites + CreateSprite(&gSpriteTemplate_83ED42C, x, y, 13);
+ sprite->oam.priority = 2;
+ sprite->data[0] = a2;
+ sprite->data[1] = a3;
+ sprite->data[2] = a3 * 10;
+ sprite->data[3] = -1;
+}
+
+static void sub_810506C(struct Sprite *sprite)
+{
+ u16 tag = eSlotMachine->coins;
+ if (sprite->data[0])
+ tag = eSlotMachine->payout;
+ if (sprite->data[3] != tag)
+ {
+ sprite->data[3] = tag;
+ tag %= (u16)sprite->data[2];
+ tag /= (u16)sprite->data[1];
+ tag += 7;
+ sprite->sheetTileStart = GetSpriteTileStartByTag(tag);
+ SetSpriteSheetFrameTileNum(sprite);
}
}
-asm(".section .text_b");
+static const struct SpriteTemplate gSpriteTemplate_83ED444;
+static const struct SubspriteTable gSubspriteTables_83ED704[];
-void sub_8106448(void) {
- u32 offsetRead, offsetWrite;
- u32 size;
+static void sub_81050C4(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED444, 0x58, 0x48, 15);
+ gSprites[spriteId].oam.priority = 3;
+ SetSubspriteTables(gSprites + spriteId, gSubspriteTables_83ED704);
+}
- LZDecompressWram(gSlotMachine_Gfx, ewram10000_2);
+static const struct SpriteTemplate gSpriteTemplate_83ED45C;
- offsetRead = (u32)ewram10000_2;
- offsetWrite = BG_VRAM;
- size = SLOTMACHINE_GFX_TILES * 32;
- while (TRUE)
+static void sub_8105100(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED45C, 0x118, 0x50, 1);
+ gSprites[spriteId].oam.priority = 1;
+ gSprites[spriteId].coordOffsetEnabled = TRUE;
+ eSlotMachine->unk3F = spriteId;
+}
+
+static void sub_810514C(void)
+{
+ DestroySprite(gSprites + eSlotMachine->unk3F);
+}
+
+static void sub_8105170(struct Sprite *sprite)
+{
+ sprite->pos2.y = sprite->pos2.x = 0;
+ if (sprite->animNum == 4)
{
- DmaCopy16(3, offsetRead, (void *) (offsetWrite), 0x1000);
- offsetRead += 0x1000;
- offsetWrite += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
+ sprite->pos2.y = sprite->pos2.x = 8;
+ if ((sprite->animCmdIndex != 0 && sprite->animDelayCounter != 0) || (sprite->animCmdIndex == 0 && sprite->animDelayCounter == 0))
{
- DmaCopy16(3, offsetRead, (void *) (offsetWrite), size);
+ sprite->pos2.y = -8;
+ }
+ }
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED474;
+static const struct SpriteTemplate gSpriteTemplate_83ED48C;
+static const struct SubspriteTable gSubspriteTables_83ED73C[];
+static const struct SubspriteTable gSubspriteTables_83ED75C[];
+
+static void sub_81051C0(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED474, 0x170, 0x34, 7);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->oam.priority = 1;
+ sprite->coordOffsetEnabled = TRUE;
+ SetSubspriteTables(sprite, gSubspriteTables_83ED73C);
+ eSlotMachine->unk49[0] = spriteId;
+
+ spriteId = CreateSprite(&gSpriteTemplate_83ED48C, 0x170, 0x54, 7);
+ sprite = gSprites + spriteId;
+ sprite->oam.priority = 1;
+ sprite->coordOffsetEnabled = TRUE;
+ SetSubspriteTables(sprite, gSubspriteTables_83ED75C);
+ eSlotMachine->unk49[1] = spriteId;
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED4A4;
+static const struct SubspriteTable gSubspriteTables_83ED78C[];
+
+static void sub_8105284(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4A4, 0xa8 - gSpriteCoordOffsetX, 0x50, 7);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->oam.priority = 1;
+ sprite->coordOffsetEnabled = TRUE;
+ SetSubspriteTables(sprite, gSubspriteTables_83ED78C);
+ eSlotMachine->unk42 = spriteId;
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED4BC;
+
+static void sub_81052EC(void)
+{
+ u8 i;
+ s16 r5;
+ for (i = 0, r5 = 0; i < 3; i++, r5 += 20)
+ {
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4BC, 0x170, 0x00, 10);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->oam.priority = 1;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->data[7] = r5;
+ eSlotMachine->unk4B[i] = spriteId;
+ }
+}
+
+static void sub_810535C(struct Sprite *sprite)
+{
+ s16 r0 = (u16)(eSlotMachine->unk14 + sprite->data[7]);
+ r0 %= 40;
+ sprite->pos1.y = r0 + 59;
+ StartSpriteAnimIfDifferent(sprite, sub_8102C48(r0 / 20));
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED4D4;
+static const struct SubspriteTable gSubspriteTables_83ED7B4[];
+
+static void sub_81053A0(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4D4, 0x170, 0x64, 9);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = 1;
+ SetSubspriteTables(sprite, gSubspriteTables_83ED7B4);
+ eSlotMachine->unk4E[0] = spriteId;
+
+ spriteId = CreateSprite(&gSpriteTemplate_83ED4D4, 0x120, 0x68, 4);
+ sprite = gSprites + spriteId;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = 1;
+ SetSubspriteTables(sprite, gSubspriteTables_83ED7B4);
+ eSlotMachine->unk4E[1] = spriteId;
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED4EC;
+static const struct SubspriteTable gSubspriteTables_83ED7D4[];
+
+static void sub_810545C(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4EC, 0x170, 0x4c, 11);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = 1;
+ SetSubspriteTables(sprite, gSubspriteTables_83ED7D4);
+ eSlotMachine->unk40 = spriteId;
+}
+
+static void sub_81054B8(void)
+{
+ u8 i;
+
+ DestroySprite(gSprites + eSlotMachine->unk40);
+ for (i = 0; i < 2; i++)
+ {
+ DestroySprite(gSprites + eSlotMachine->unk49[i]);
+ }
+ for (i = 0; i < 3; i++)
+ {
+ DestroySprite(gSprites + eSlotMachine->unk4B[i]);
+ }
+}
+
+static void sub_8105524(void)
+{
+ u8 i;
+ for (i = 0; i < 2; i++)
+ {
+ DestroySprite(gSprites + eSlotMachine->unk4E[i]);
+ }
+}
+
+static void sub_8105554(void)
+{
+ DestroySprite(gSprites + eSlotMachine->unk42);
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED504;
+
+static void sub_8105578(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED504, 0x98, 0x20, 5);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->oam.priority = 1;
+ sprite->hFlip = TRUE;
+ eSlotMachine->unk50[0] = spriteId;
+ sprite->data[0] = 8;
+ sprite->data[1] = -1;
+ sprite->data[2] = -1;
+ sprite->data[7] = 0x20;
+
+ spriteId = CreateSprite(&gSpriteTemplate_83ED504, 0xb8, 0x20, 5);
+ sprite = gSprites + spriteId;
+ sprite->oam.priority = 1;
+ eSlotMachine->unk50[1] = spriteId;
+ sprite->data[1] = 1;
+ sprite->data[2] = -1;
+ sprite->data[7] = 0x20;
+}
+
+static void sub_810562C(struct Sprite *sprite)
+{
+ if (sprite->data[0] != 0)
+ {
+ sprite->data[0]--;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->invisible = TRUE;
+ }
+ else
+ {
+ sprite->invisible = FALSE;
+ sprite->pos2.x += sprite->data[1];
+ sprite->pos2.y += sprite->data[2];
+ if (++sprite->data[3] >= 8)
+ {
+ sprite->data[0] = sprite->data[7];
+ sprite->data[3] = 0;
+ }
+ }
+}
+
+static void sub_8105688(s16 a0)
+{
+ gSprites[eSlotMachine->unk50[0]].data[7] = a0;
+ gSprites[eSlotMachine->unk50[1]].data[7] = a0;
+}
+
+static void sub_81056C0(void)
+{
+ u8 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ DestroySprite(gSprites + eSlotMachine->unk50[i]);
+ }
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED51C;
+
+static void sub_81056F0(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED51C, 0x48, 0x50, 3);
+ gSprites[spriteId].oam.priority = 1;
+ gSprites[spriteId].data[0] = 1;
+ gSprites[spriteId].data[5] = 0;
+ gSprites[spriteId].data[6] = 16;
+ gSprites[spriteId].data[7] = 8;
+ eSlotMachine->unk52[0] = spriteId;
+
+ spriteId = CreateSprite(&gSpriteTemplate_83ED51C, 0x68, 0x50, 3);
+ gSprites[spriteId].oam.priority = 1;
+ gSprites[spriteId].hFlip = TRUE;
+ eSlotMachine->unk52[1] = spriteId;
+}
+
+static const u8 gUnknown_083ECC58[2]; // don't remove this until decompiled through gUnknown_083ECCF8
+
+static void sub_8105784(struct Sprite *sprite)
+{
+ u8 sp[] = {16, 0};
+ if (sprite->data[0] && --sprite->data[6] <= 0)
+ {
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(7) << 4) + 0x103, sp[sprite->data[5]], sp[sprite->data[5]], sp[sprite->data[5]]);
+ ++sprite->data[5];
+ sprite->data[5] &= 1;
+ sprite->data[6] = sprite->data[7];
+ }
+}
+
+static void sub_81057E8(s16 a0)
+{
+ gSprites[eSlotMachine->unk52[0]].data[7] = a0;
+}
+
+static void sub_8105804(void)
+{
+ u8 i;
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(7) << 4) + 0x103, 0, 0, 0);
+ for (i = 0; i < 2; i++)
+ {
+ DestroySprite(gSprites + eSlotMachine->unk52[i]);
+ }
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED534;
+
+static void sub_8105854(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED534, 0xa8, 0x50, 6);
+ gSprites[spriteId].oam.priority = 1;
+ eSlotMachine->unk41 = spriteId;
+}
+
+static void sub_8105894(struct Sprite *sprite)
+{
+ sprite->pos2.y = gSpriteCoordOffsetY;
+}
+
+static void sub_81058A0(void)
+{
+ DestroySprite(gSprites + eSlotMachine->unk41);
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED54C;
+
+static void sub_81058C4(void)
+{
+ u8 i;
+ u16 sp[] = {0x0, 0x40, 0x80, 0xC0};
+ for (i = 0; i < 4; i++)
+ {
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED54C, 0x50 - gSpriteCoordOffsetX, 0x44, 0);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->oam.priority = 1;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->data[0] = sp[i];
+ eSlotMachine->unk54[i] = spriteId;
+ }
+}
+
+static void sub_810594C(struct Sprite *sprite)
+{
+ sprite->data[0] -= 2;
+ sprite->data[0] &= 0xff;
+ sprite->pos2.x = Cos(sprite->data[0], 20);
+ sprite->pos2.y = Sin(sprite->data[0], 6);
+ sprite->subpriority = 0;
+ if (sprite->data[0] >= 0x80)
+ {
+ sprite->subpriority = 2;
+ }
+ if (++sprite->data[1] >= 16)
+ {
+ sprite->hFlip ^= 1;
+ sprite->data[1] = 0;
+ }
+}
+
+static void sub_81059B8(void)
+{
+ u8 i;
+ for (i = 0; i < 4; i++)
+ {
+ DestroySprite(gSprites + eSlotMachine->unk54[i]);
+ }
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED564;
+
+static void sub_81059E8(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED564, 0xa8, 0x3c, 8);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->oam.priority = 1;
+ sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ InitSpriteAffineAnim(sprite);
+ eSlotMachine->unk43 = spriteId;
+}
+
+static void sub_8105A38(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ if (sprite->affineAnimEnded)
+ sprite->data[0]++;
+ }
+ else if (sprite->data[0] == 1)
+ {
+ sprite->invisible ^= 1;
+ if (++sprite->data[2] >= 24)
+ {
+ sprite->data[0]++;
+ sprite->data[2] = 0;
+ }
+ }
+ else
+ {
+ sprite->invisible = TRUE;
+ if (++sprite->data[2] >= 16)
+ sprite->data[7] = 1;
+ }
+ sprite->data[1] &= 0xff;
+ sprite->data[1] += 16;
+ sprite->pos2.y -= (sprite->data[1] >> 8);
+}
+
+u8 sub_8105ACC(void)
+{
+ return gSprites[eSlotMachine->unk43].data[7];
+}
+
+static void sub_8105AEC(void)
+{
+ struct Sprite *sprite = gSprites + eSlotMachine->unk43;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ DestroySprite(sprite);
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED6CC;
+
+static u8 sub_8105B1C(s16 x, s16 y)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED6CC, x, y, 12);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->oam.priority = 2;
+ sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ InitSpriteAffineAnim(sprite);
+ return spriteId;
+}
+
+static void sub_8105B70(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded)
+ sprite->data[7] = 1;
+}
+
+static void sub_8105B88(u8 spriteId)
+{
+ struct Sprite *sprite = gSprites + spriteId;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ DestroySprite(sprite);
+}
+
+static const s16 gUnknown_083ECE7E[][2];
+static const SpriteCallback gUnknown_083ECF0C[];
+
+u8 sub_8105BB4(u8 templateIdx, u8 cbAndCoordsIdx, s16 a2)
+{
+ return sub_8105BF8(templateIdx, gUnknown_083ECF0C[cbAndCoordsIdx], gUnknown_083ECE7E[cbAndCoordsIdx][0], gUnknown_083ECE7E[cbAndCoordsIdx][1], a2);
+}
+
+static const struct SpriteTemplate *const gUnknown_083EDB5C[];
+static const struct SubspriteTable *const gUnknown_083EDBC4[];
+
+static u8 sub_8105BF8(u8 templateIdx, SpriteCallback callback, s16 x, s16 y, s16 a4)
+{
+ u8 spriteId = CreateSprite(gUnknown_083EDB5C[templateIdx], x, y, 16);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->oam.priority = 3;
+ sprite->callback = callback;
+ sprite->data[6] = a4;
+ sprite->data[7] = 1;
+ if (gUnknown_083EDBC4[templateIdx])
+ SetSubspriteTables(sprite, gUnknown_083EDBC4[templateIdx]);
+ return spriteId;
+}
+
+static void sub_8105C64(struct Sprite *sprite)
+{
+ sprite->data[7] = 0;
+}
+
+static void sub_8105C6C(struct Sprite *sprite)
+{
+ s16 sp0[] = {4, -4, 4, -4};
+ s16 sp8[] = {4, 4, -4, -4};
+
+ if (sprite->data[1]++ >= 16)
+ {
+ sprite->subspriteTableNum ^= 1;
+ sprite->data[1] = 0;
+ }
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ if (sprite->subspriteTableNum != 0)
+ {
+ sprite->pos2.x = sp0[sprite->data[6]];
+ sprite->pos2.y = sp8[sprite->data[6]];
+ }
+}
+
+static void sub_8105CF0(struct Sprite *sprite)
+{
+ sprite->hFlip = TRUE;
+ sub_8105C6C(sprite);
+}
+
+static void sub_8105D08(struct Sprite *sprite)
+{
+ sprite->vFlip = TRUE;
+ sub_8105C6C(sprite);
+}
+
+static void sub_8105D20(struct Sprite *sprite)
+{
+ sprite->hFlip = TRUE;
+ sprite->vFlip = TRUE;
+ sub_8105C6C(sprite);
+}
+
+static void sub_8105D3C(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos1.x += 4;
+ if (sprite->pos1.x >= 0xd0)
+ {
+ sprite->pos1.x = 0xd0;
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (++sprite->data[1] > 90)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sprite->pos1.x += 4;
+ if (sprite->pos1.x >= 0x110)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ case 3:
+ sprite->data[7] = 0;
+ break;
+ }
+}
+
+static void sub_8105DA4(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos1.x -= 4;
+ if (sprite->pos1.x <= 0xd0)
+ {
+ sprite->pos1.x = 0xd0;
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (++sprite->data[1] > 90)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sprite->pos1.x -= 4;
+ if (sprite->pos1.x <= 0x90)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ case 3:
+ sprite->data[7] = 0;
+ break;
+ }
+}
+
+static void sub_8105E08(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ StartSpriteAnim(sprite, eSlotMachine->unk0A - 1);
+ sprite->data[0]++;
+ // fallthrough
+ case 1:
+ if (++sprite->data[1] >= 4)
+ {
+ sprite->data[0]++;
+ sprite->data[1] = 0;
+ }
+ break;
+ case 2:
+ sprite->pos1.x += 4;
+ if (sprite->pos1.x >= 0xd0)
+ {
+ sprite->pos1.x = 0xd0;
+ sprite->data[0]++;
+ }
+ break;
+ case 3:
+ if (++sprite->data[1] > 90)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ case 4:
+ sprite->pos1.x += 4;
+ if (sprite->pos1.x >= 0xf8)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ case 5:
+ sprite->data[7] = 0;
+ break;
+ }
+}
+
+static void sub_8105EB4(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->animPaused = TRUE;
+ sprite->data[0]++;
+ // fallthrough
+ case 1:
+ sprite->pos1.y += 8;
+ if (sprite->pos1.y >= 0x70)
+ {
+ sprite->pos1.y = 0x70;
+ sprite->data[1] = 16;
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ if (sprite->data[2] == 0)
+ {
+ sprite->pos1.y -= sprite->data[1];
+ sprite->data[1] = -sprite->data[1];
+ if (++sprite->data[3] >= 2)
+ {
+ sprite->data[1] >>= 2;
+ sprite->data[3] = 0;
+ if (sprite->data[1] == 0)
+ {
+ sprite->data[0]++;
+ sprite->data[7] = 0;
+ sprite->animPaused = FALSE;
+ }
+ }
+ }
+ sprite->data[2]++;
+ sprite->data[2] &= 0x07;
+ break;
+ }
+}
+
+static void sub_8105F54(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (++sprite->data[1] > 8)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ sprite->pos1.y += 2;
+ if (sprite->pos1.y >= 0x30)
+ {
+ sprite->pos1.y = 0x30;
+ sprite->data[0]++;
+ sprite->data[7] = 0;
+ }
+ break;
+ }
+}
+
+static void sub_8105F9C(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->invisible = TRUE;
+ if (++sprite->data[1] > 0x20)
+ {
+ sprite->data[0]++;
+ sprite->data[1] = 5;
+ sprite->oam.mosaic = TRUE;
+ sprite->invisible = FALSE;
+ StartSpriteAnim(sprite, 1);
+ REG_MOSAIC = ((sprite->data[1] << 4) | sprite->data[1]) << 8;
+ }
+ break;
+ case 1:
+ sprite->data[1] -= (sprite->data[2] >> 8);
+ if (sprite->data[1] < 0)
+ {
+ sprite->data[1] = 0;
+ }
+ REG_MOSAIC = ((sprite->data[1] << 4) | sprite->data[1]) << 8;
+ sprite->data[2] &= 0xff;
+ sprite->data[2] += 0x80;
+ if (sprite->data[1] == 0)
+ {
+ sprite->data[0]++;
+ sprite->data[7] = 0;
+ sprite->oam.mosaic = FALSE;
+ StartSpriteAnim(sprite, 0);
+ }
break;
+ }
+}
+
+static const u16 *const gUnknown_083EDE10[];
+
+static void sub_8106058(struct Sprite *sprite)
+{
+ if (sprite->data[1] < 3)
+ {
+ LoadPalette(gUnknown_083EDE10[sprite->data[1]], (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20);
+ if (++sprite->data[2] >= 4)
+ {
+ sprite->data[1]++;
+ sprite->data[2] = 0;
}
}
+ else
+ {
+ LoadPalette(gUnknown_083EDE10[sprite->data[1]], (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20);
+ if (++sprite->data[2] >= 25)
+ {
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ }
+ }
+ StartSpriteAnimIfDifferent(sprite, 1);
+ sprite->data[7] = 0;
+}
+
+static void sub_81060FC(struct Sprite *sprite)
+{
+ s16 sp00[] = {0, -40, 0, 0, 48, 0, 24, 0};
+ s16 sp10[] = {-32, 0, -32, -48, 0, -48, 0, -48};
+ s16 sp20[] = {16, 12, 16, 0, 0, 4, 8, 8};
+
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos2.x = sp00[sprite->data[6]];
+ sprite->pos2.y = sp10[sprite->data[6]];
+ sprite->data[1] = sp20[sprite->data[6]];
+ sprite->data[0]++;
+ // fallthrough
+ case 1:
+ if (sprite->data[1]-- == 0)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ if (sprite->pos2.x > 0)
+ {
+ sprite->pos2.x -= 4;
+ }
+ else if (sprite->pos2.x < 0)
+ {
+ sprite->pos2.x += 4;
+ }
+ if (sprite->pos2.y > 0)
+ {
+ sprite->pos2.y -= 4;
+ }
+ else if (sprite->pos2.y < 0)
+ {
+ sprite->pos2.y += 4;
+ }
+ if (sprite->pos2.x == 0 && sprite->pos2.y == 0)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ }
+}
+
+static void sub_81061C8(struct Sprite *sprite)
+{
+ s16 sp0[] = {160, 192, 224, 104, 80, 64, 48, 24};
+
+ if (sprite->data[0] == 0)
+ {
+ sprite->data[0]++;
+ sprite->data[1] = 12;
+ }
+ sprite->pos2.x = Cos(sp0[sprite->data[6]], sprite->data[1]);
+ sprite->pos2.y = Sin(sp0[sprite->data[6]], sprite->data[1]);
+ if (sprite->data[1])
+ {
+ sprite->data[1]--;
+ }
+}
+
+static void sub_8106230(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ eSlotMachine->winIn = 0x2f;
+ eSlotMachine->winOut = 0x3f;
+ eSlotMachine->win0v = 0x2088;
+ sprite->invisible = TRUE;
+ sprite->data[0]++;
+ // fallthrough
+ case 1:
+ sprite->data[1] += 2;
+ sprite->data[2] = sprite->data[1] + 0xb0;
+ sprite->data[3] = 0xf0 - sprite->data[1];
+ if (sprite->data[2] > 0xd0)
+ {
+ sprite->data[2] = 0xd0;
+ }
+ if (sprite->data[3] < 0xd0)
+ {
+ sprite->data[3] = 0xd0;
+ }
+ eSlotMachine->win0h = (sprite->data[2] << 8) | sprite->data[3];
+ if (sprite->data[1] > 0x33)
+ {
+ sprite->data[0]++;
+ eSlotMachine->winIn = 0x3f;
+ }
+ break;
+ case 2:
+ if (eSlotMachine->bet == 0)
+ {
+ break;
+ }
+ sub_8104D30(5, SpriteCallbackDummy, 0xd0, 0x74, 0);
+ eSlotMachine->win0h = 0xc0e0;
+ eSlotMachine->win0v = 0x6880;
+ eSlotMachine->winIn = 0x2f;
+ sprite->data[0]++;
+ sprite->data[1] = 0;
+ // fallthrough
+ case 3:
+ sprite->data[1] += 2;
+ sprite->data[2] = sprite->data[1] + 0xc0;
+ sprite->data[3] = 0xe0 - sprite->data[1];
+ if (sprite->data[2] > 0xd0)
+ {
+ sprite->data[2] = 0xd0;
+ }
+ if (sprite->data[3] < 0xd0)
+ {
+ sprite->data[3] = 0xd0;
+ }
+ eSlotMachine->win0h = (sprite->data[2] << 8) | sprite->data[3];
+ if (sprite->data[1] > 0x0f)
+ {
+ sprite->data[0]++;
+ eSlotMachine->winIn = 0x3f;
+ }
+ break;
+ }
+}
+
+static void nullsub_70(void)
+{
+
+}
+
+static void sub_8106364(void)
+{
+ REG_MOSAIC = 0;
+}
+
+static const u16 *const gUnknown_083EDE20;
+
+static void sub_8106370(void)
+{
+ LoadPalette(gUnknown_083EDE20, (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20);
+}
+
+static void sub_810639C(void)
+{
+ eSlotMachine->win0h = 0xf0;
+ eSlotMachine->win0v = 0xa0;
+ eSlotMachine->winIn = 0x3f;
+ eSlotMachine->winOut = 0x3f;
+}
+
+static const u8 sReelTimeGfx[];
+static const struct SpriteSheet sSlotMachineSpriteSheets[];
+static const struct SpritePalette gSlotMachineSpritePalettes[];
+
+static void sub_81063C0(void)
+{
+ sub_8106404();
+ LZDecompressWram(gSlotMachineReelTimeLights_Gfx, eSlotMachineGfxBuffer);
+ LZDecompressWram(sReelTimeGfx, eSlotMachineReelTimeGfxBuffer);
+ LoadSpriteSheets(sSlotMachineSpriteSheets);
+ LoadSpritePalettes(gSlotMachineSpritePalettes);
+}
+
+static const u8 *const gUnknown_083EDCE4;
+static const struct SpriteSheet gUnknown_083EDCDC;
+
+static void sub_8106404(void)
+{
+ u8 *dest = eSlotMachineGfxBuffer;
+ u8 i = 0;
+ const struct SpriteSheet *sheet = &gUnknown_083EDCDC;
+ const u8 *src = gUnknown_083EDCE4;
+ for (i = 0; i < 0x40; i++)
+ {
+ u8 j;
+ for (j = 0; j < 0x20; j++, dest++)
+ {
+ *dest = src[j];
+ }
+ }
+ LoadSpriteSheet(sheet);
+}
+
+static void sub_8106448(void) {
+ LZDecompressWram(gSlotMachine_Gfx, eSlotMachineGfxBuffer);
+
+ DmaCopyLarge16(3, eSlotMachineGfxBuffer, BG_VRAM, SLOTMACHINE_GFX_TILES * 32, 0x1000);
LoadPalette(gUnknown_08E95A18, 0, 160);
LoadPalette(gPalette_83EDE24, 208, 32);
}
-void sub_81064B8(void) {
+static void sub_81064B8(void) {
CpuCopy16(gUnknown_08E95AB8, BG_SCREEN_ADDR(29), 20 * 32 * 2);
LoadSlotMachineWheelOverlay();
}
@@ -123,7 +5105,7 @@ static void LoadSlotMachineWheelOverlay(void) {
}
}
-void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) {
+static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) {
u16 *vram = BG_SCREEN_ADDR(29);
vram[15 * 32 + arg0] = arg1;
@@ -132,7 +5114,8 @@ void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) {
vram[16 * 32 + 1 + arg0] = arg4;
}
-void sub_81065DC(void) {
+static void sub_81065DC(void)
+{
s16 y, x;
u16 *screen;
@@ -147,3 +5130,2699 @@ void sub_81065DC(void) {
}
}
}
+
+#if DEBUG
+__attribute__((naked))
+void debug_sub_811B1C4()
+{
+ asm(
+ " ldr r1, .__1_\n"
+ " ldrb r0, [r1]\n"
+ " mov r3, #0x2\n"
+ " orr r0, r0, r3\n"
+ " strb r0, [r1]\n"
+ " ldr r2, .__1_ + 4\n"
+ " ldrb r1, [r2]\n"
+ " mov r0, #0x2\n"
+ " eor r1, r1, r0\n"
+ " neg r0, r1\n"
+ " orr r0, r0, r1\n"
+ " asr r0, r0, #0x1f\n"
+ " and r0, r0, r3\n"
+ " strb r0, [r2]\n"
+ " bx lr\n"
+ ".__2_:\n"
+ " .align 2, 0\n"
+ ".__1_:\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word unk_debug_bss_1_0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B1EC()
+{
+ asm(
+ " ldr r2, .__3\n"
+ " ldrb r0, [r2]\n"
+ " mov r1, #0x1\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r2]\n"
+ " ldr r2, .__3 + 4\n"
+ " ldrb r0, [r2]\n"
+ " mov r1, #0x1\n"
+ " eor r0, r0, r1\n"
+ " neg r0, r0\n"
+ " lsr r0, r0, #0x1f\n"
+ " strb r0, [r2]\n"
+ " bx lr\n"
+ ".__4:\n"
+ " .align 2, 0\n"
+ ".__3:\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word unk_debug_bss_1_0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B210()
+{
+ asm(
+ " ldr r1, .__5\n"
+ " ldrb r0, [r1]\n"
+ " mov r3, #0x4\n"
+ " orr r0, r0, r3\n"
+ " strb r0, [r1]\n"
+ " ldr r2, .__5 + 4\n"
+ " ldrb r1, [r2]\n"
+ " mov r0, #0x4\n"
+ " eor r1, r1, r0\n"
+ " neg r0, r1\n"
+ " orr r0, r0, r1\n"
+ " asr r0, r0, #0x1f\n"
+ " and r0, r0, r3\n"
+ " strb r0, [r2]\n"
+ " bx lr\n"
+ ".__6:\n"
+ " .align 2, 0\n"
+ ".__5:\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word unk_debug_bss_1_0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B238()
+{
+ asm(
+ " ldr r1, .__7\n"
+ " ldrb r0, [r1]\n"
+ " mov r3, #0x8\n"
+ " orr r0, r0, r3\n"
+ " strb r0, [r1]\n"
+ " ldr r2, .__7 + 4\n"
+ " ldrb r1, [r2]\n"
+ " mov r0, #0x8\n"
+ " eor r1, r1, r0\n"
+ " neg r0, r1\n"
+ " orr r0, r0, r1\n"
+ " asr r0, r0, #0x1f\n"
+ " and r0, r0, r3\n"
+ " strb r0, [r2]\n"
+ " bx lr\n"
+ ".__8:\n"
+ " .align 2, 0\n"
+ ".__7:\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word unk_debug_bss_1_0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B260()
+{
+ asm(
+ " ldr r1, .__9\n"
+ " ldrb r0, [r1]\n"
+ " mov r3, #0x10\n"
+ " orr r0, r0, r3\n"
+ " strb r0, [r1]\n"
+ " ldr r2, .__9 + 4\n"
+ " ldrb r1, [r2]\n"
+ " mov r0, #0x10\n"
+ " eor r1, r1, r0\n"
+ " neg r0, r1\n"
+ " orr r0, r0, r1\n"
+ " asr r0, r0, #0x1f\n"
+ " and r0, r0, r3\n"
+ " strb r0, [r2]\n"
+ " bx lr\n"
+ ".__10:\n"
+ " .align 2, 0\n"
+ ".__9:\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word unk_debug_bss_1_0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B288()
+{
+ asm(
+ " ldr r1, .__11\n"
+ " ldrb r0, [r1]\n"
+ " mov r3, #0x40\n"
+ " orr r0, r0, r3\n"
+ " strb r0, [r1]\n"
+ " ldr r2, .__11 + 4\n"
+ " ldrb r1, [r2]\n"
+ " mov r0, #0x40\n"
+ " eor r1, r1, r0\n"
+ " neg r0, r1\n"
+ " orr r0, r0, r1\n"
+ " asr r0, r0, #0x1f\n"
+ " and r0, r0, r3\n"
+ " strb r0, [r2]\n"
+ " bx lr\n"
+ ".__12:\n"
+ " .align 2, 0\n"
+ ".__11:\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word unk_debug_bss_1_0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B2B0()
+{
+ asm(
+ " ldr r1, .__13\n"
+ " ldrb r0, [r1]\n"
+ " mov r3, #0x80\n"
+ " orr r0, r0, r3\n"
+ " strb r0, [r1]\n"
+ " ldr r2, .__13 + 4\n"
+ " ldrb r1, [r2]\n"
+ " mov r0, #0x80\n"
+ " eor r1, r1, r0\n"
+ " neg r0, r1\n"
+ " orr r0, r0, r1\n"
+ " asr r0, r0, #0x1f\n"
+ " and r0, r0, r3\n"
+ " strb r0, [r2]\n"
+ " bx lr\n"
+ ".__14:\n"
+ " .align 2, 0\n"
+ ".__13:\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word unk_debug_bss_1_0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B2D8()
+{
+ asm(
+ " ldr r0, .__15\n"
+ " ldrb r1, [r0]\n"
+ " mov r2, #0x20\n"
+ " orr r1, r1, r2\n"
+ " strb r1, [r0]\n"
+ " bx lr\n"
+ ".__16:\n"
+ " .align 2, 0\n"
+ ".__15:\n"
+ " .word unk_debug_bss_1_3\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B2E8()
+{
+ asm(
+ " push {lr}\n"
+ " add sp, sp, #0xfffffffc\n"
+ " ldr r0, .__17\n"
+ " ldrb r1, [r0, #0x1]\n"
+ " add r1, r1, #0x1\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x1\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x6\n"
+ " mov r2, #0x1\n"
+ " bl Menu_PrintText\n"
+ " add sp, sp, #0x4\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ ".__18:\n"
+ " .align 2, 0\n"
+ ".__17:\n"
+ " .word +0x2000000\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B310()
+{
+ asm(
+ " push {r4, lr}\n"
+ " add sp, sp, #0xfffffff8\n"
+ " ldr r0, .__21\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x1\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 4\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x3\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 8\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x5\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 12\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x7\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 16\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x9\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 20\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 24\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0xd\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 28\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 32\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x11\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 36\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0x1\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 40\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0x3\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 44\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0x5\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 48\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0x7\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 52\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0x9\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 56\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 60\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0xd\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 64\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 68\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0x11\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 72\n"
+ " ldrb r0, [r0, #0x3]\n"
+ " cmp r0, #0\n"
+ " bne .__19 @cond_branch\n"
+ " ldr r0, .__21 + 76\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x9\n"
+ " bl Menu_PrintText\n"
+ " b .__20\n"
+ ".__22:\n"
+ " .align 2, 0\n"
+ ".__21:\n"
+ " .word Str_841B1C4\n"
+ " .word Str_841B1CB\n"
+ " .word Str_841B1D4\n"
+ " .word Str_841B1DB\n"
+ " .word Str_841B1E2\n"
+ " .word Str_841B1E8\n"
+ " .word Str_841B1F3\n"
+ " .word Str_841B202\n"
+ " .word Str_841B24C\n"
+ " .word Str_841B211\n"
+ " .word Str_841B219\n"
+ " .word Str_841B220\n"
+ " .word Str_841B227\n"
+ " .word Str_841B22E\n"
+ " .word Str_841B235\n"
+ " .word Str_841B23B\n"
+ " .word Str_841B23F\n"
+ " .word Str_841B243\n"
+ " .word +0x2000000\n"
+ " .word Str_841B246\n"
+ ".__19:\n"
+ " ldr r0, .__30\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x9\n"
+ " bl Menu_PrintText\n"
+ ".__20:\n"
+ " ldr r4, .__30 + 4\n"
+ " ldr r1, [r4, #0x68]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x3\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, [r4, #0x6c]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x5\n"
+ " bl Menu_PrintText\n"
+ " mov r0, #0x10\n"
+ " ldsh r1, [r4, r0]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x7\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, [r4, #0x70]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0x3\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, [r4, #0x74]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0x5\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, [r4, #0x78]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0x7\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, [r4, #0x7c]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0x9\n"
+ " bl Menu_PrintText\n"
+ " add r0, r4, #0\n"
+ " add r0, r0, #0x80\n"
+ " ldr r1, [r0]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ " add r0, r4, #0\n"
+ " add r0, r0, #0x84\n"
+ " ldr r1, [r0]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0xd\n"
+ " bl Menu_PrintText\n"
+ " add r0, r4, #0\n"
+ " add r0, r0, #0x88\n"
+ " ldr r1, [r0]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " add r0, r4, #0\n"
+ " add r0, r0, #0x8c\n"
+ " ldr r1, [r0]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0x11\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, .__30 + 8\n"
+ " ldrb r0, [r1]\n"
+ " cmp r0, #0\n"
+ " beq .__23 @cond_branch\n"
+ " mov r2, #0x0\n"
+ " cmp r0, #0x8\n"
+ " beq .__24 @cond_branch\n"
+ " cmp r0, #0x8\n"
+ " bgt .__25 @cond_branch\n"
+ " cmp r0, #0x2\n"
+ " beq .__26 @cond_branch\n"
+ " cmp r0, #0x2\n"
+ " bgt .__27 @cond_branch\n"
+ " cmp r0, #0x1\n"
+ " beq .__28 @cond_branch\n"
+ " b .__45\n"
+ ".__31:\n"
+ " .align 2, 0\n"
+ ".__30:\n"
+ " .word Str_841B249\n"
+ " .word +0x2000000\n"
+ " .word unk_debug_bss_1_0\n"
+ ".__27:\n"
+ " cmp r0, #0x4\n"
+ " beq .__32 @cond_branch\n"
+ " b .__45\n"
+ ".__25:\n"
+ " cmp r0, #0x40\n"
+ " beq .__34 @cond_branch\n"
+ " cmp r0, #0x40\n"
+ " bgt .__35 @cond_branch\n"
+ " cmp r0, #0x10\n"
+ " beq .__36 @cond_branch\n"
+ " b .__45\n"
+ ".__35:\n"
+ " cmp r0, #0x80\n"
+ " beq .__38 @cond_branch\n"
+ " b .__45\n"
+ ".__26:\n"
+ " mov r2, #0x3\n"
+ " b .__45\n"
+ ".__28:\n"
+ " mov r2, #0x5\n"
+ " b .__45\n"
+ ".__32:\n"
+ " mov r2, #0x7\n"
+ " b .__45\n"
+ ".__24:\n"
+ " mov r2, #0x9\n"
+ " b .__45\n"
+ ".__36:\n"
+ " mov r2, #0xb\n"
+ " b .__45\n"
+ ".__34:\n"
+ " mov r2, #0xd\n"
+ " b .__45\n"
+ ".__38:\n"
+ " mov r2, #0xf\n"
+ ".__45:\n"
+ " ldr r0, .__46\n"
+ " mov r1, #0x17\n"
+ " bl Menu_PrintText\n"
+ ".__23:\n"
+ " bl debug_sub_811B2E8\n"
+ " add sp, sp, #0x8\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ ".__47:\n"
+ " .align 2, 0\n"
+ ".__46:\n"
+ " .word Str_841B26D\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B5B4()
+{
+ asm(
+ " push {lr}\n"
+ " add r2, r0, #0\n"
+ " ldr r0, [r2]\n"
+ " add r0, r0, r1\n"
+ " str r0, [r2]\n"
+ " ldr r1, .__49\n"
+ " cmp r0, r1\n"
+ " ble .__48 @cond_branch\n"
+ " str r1, [r2]\n"
+ ".__48:\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ ".__50:\n"
+ " .align 2, 0\n"
+ ".__49:\n"
+ " .word 0x270f\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B5D0()
+{
+ asm(
+ " ldr r0, .__51\n"
+ " mov r1, #0x0\n"
+ " strb r1, [r0]\n"
+ " ldr r0, .__51 + 4\n"
+ " strb r1, [r0]\n"
+ " ldr r0, .__51 + 8\n"
+ " strb r1, [r0]\n"
+ " ldr r0, .__51 + 12\n"
+ " strb r1, [r0]\n"
+ " ldr r2, .__51 + 16\n"
+ " mov r0, #0x0\n"
+ " str r0, [r2, #0x68]\n"
+ " str r0, [r2, #0x6c]\n"
+ " str r0, [r2, #0x70]\n"
+ " str r0, [r2, #0x74]\n"
+ " str r0, [r2, #0x78]\n"
+ " str r0, [r2, #0x7c]\n"
+ " add r1, r2, #0\n"
+ " add r1, r1, #0x80\n"
+ " str r0, [r1]\n"
+ " add r1, r1, #0x4\n"
+ " str r0, [r1]\n"
+ " add r1, r1, #0x4\n"
+ " str r0, [r1]\n"
+ " add r1, r1, #0x4\n"
+ " str r0, [r1]\n"
+ " add r1, r1, #0x4\n"
+ " str r0, [r1]\n"
+ " bx lr\n"
+ ".__52:\n"
+ " .align 2, 0\n"
+ ".__51:\n"
+ " .word unk_debug_bss_1_0\n"
+ " .word unk_debug_bss_1_2\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word unk_debug_bss_1_4\n"
+ " .word +0x2000000\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B620()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, .__53\n"
+ " mov r1, #0x0\n"
+ " bl CreateTask\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ ".__54:\n"
+ " .align 2, 0\n"
+ ".__53:\n"
+ " .word debug_sub_811B654+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B634()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, .__57\n"
+ " bl FindTaskIdByFunc\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r0, #0xff\n"
+ " beq .__55 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " b .__56\n"
+ ".__58:\n"
+ " .align 2, 0\n"
+ ".__57:\n"
+ " .word debug_sub_811B654+1\n"
+ ".__55:\n"
+ " mov r0, #0x1\n"
+ ".__56:\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B654()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " add sp, sp, #0xfffffff8\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r6, r0, #0x18\n"
+ " lsl r0, r6, #0x2\n"
+ " add r0, r0, r6\n"
+ " lsl r0, r0, #0x3\n"
+ " ldr r1, .__63\n"
+ " add r5, r0, r1\n"
+ " mov r0, #0x8\n"
+ " ldsh r1, [r5, r0]\n"
+ " cmp r1, #0x1\n"
+ " beq .__59 @cond_branch\n"
+ " cmp r1, #0x1\n"
+ " bgt .__60 @cond_branch\n"
+ " cmp r1, #0\n"
+ " beq .__61 @cond_branch\n"
+ " b .__116\n"
+ ".__64:\n"
+ " .align 2, 0\n"
+ ".__63:\n"
+ " .word gTasks\n"
+ ".__60:\n"
+ " cmp r1, #0x2\n"
+ " bne .__65 @cond_branch\n"
+ " b .__66\n"
+ ".__65:\n"
+ " cmp r1, #0x3\n"
+ " bne .__67 @cond_branch\n"
+ " b .__68\n"
+ ".__67:\n"
+ " b .__116\n"
+ ".__61:\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x0\n"
+ " mov r2, #0x18\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " bl debug_sub_811B310\n"
+ " ldrh r0, [r5, #0x8]\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r5, #0x8]\n"
+ " b .__116\n"
+ ".__59:\n"
+ " ldr r7, .__76\n"
+ " ldrh r2, [r7, #0x2e]\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r2\n"
+ " cmp r0, #0\n"
+ " beq .__71 @cond_branch\n"
+ " b .__94\n"
+ ".__71:\n"
+ " mov r0, #0x20\n"
+ " and r0, r0, r2\n"
+ " lsl r0, r0, #0x10\n"
+ " lsr r3, r0, #0x10\n"
+ " cmp r3, #0\n"
+ " beq .__73 @cond_branch\n"
+ " ldr r1, .__76 + 4\n"
+ " ldrb r0, [r1, #0x1]\n"
+ " sub r0, r0, #0x1\n"
+ " strb r0, [r1, #0x1]\n"
+ " lsl r0, r0, #0x18\n"
+ " cmp r0, #0\n"
+ " bge .__79 @cond_branch\n"
+ " mov r0, #0x5\n"
+ " strb r0, [r1, #0x1]\n"
+ " b .__79\n"
+ ".__77:\n"
+ " .align 2, 0\n"
+ ".__76:\n"
+ " .word gMain\n"
+ " .word +0x2000000\n"
+ ".__73:\n"
+ " mov r0, #0x10\n"
+ " and r0, r0, r2\n"
+ " cmp r0, #0\n"
+ " beq .__78 @cond_branch\n"
+ " ldr r1, .__81\n"
+ " ldrb r0, [r1, #0x1]\n"
+ " add r0, r0, #0x1\n"
+ " strb r0, [r1, #0x1]\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r0, #0x5\n"
+ " bls .__79 @cond_branch\n"
+ " strb r3, [r1, #0x1]\n"
+ ".__79:\n"
+ " bl debug_sub_811B2E8\n"
+ " b .__116\n"
+ ".__82:\n"
+ " .align 2, 0\n"
+ ".__81:\n"
+ " .word +0x2000000\n"
+ ".__78:\n"
+ " and r1, r1, r2\n"
+ " lsl r0, r1, #0x10\n"
+ " lsr r4, r0, #0x10\n"
+ " cmp r4, #0\n"
+ " beq .__83 @cond_branch\n"
+ " mov r0, #0x3\n"
+ " strh r0, [r5, #0x8]\n"
+ " bl Menu_EraseScreen\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x0\n"
+ " mov r2, #0x9\n"
+ " mov r3, #0x5\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r0, .__85\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x1\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__85 + 4\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x3\n"
+ " bl Menu_PrintText\n"
+ " b .__116\n"
+ ".__86:\n"
+ " .align 2, 0\n"
+ ".__85:\n"
+ " .word Str_841B25C\n"
+ " .word Str_841B264\n"
+ ".__83:\n"
+ " mov r0, #0x4\n"
+ " and r0, r0, r2\n"
+ " cmp r0, #0\n"
+ " beq .__87 @cond_branch\n"
+ " ldr r0, .__91\n"
+ " strb r4, [r0]\n"
+ " ldr r0, .__91 + 4\n"
+ " strb r4, [r0]\n"
+ " bl Menu_EraseScreen\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x0\n"
+ " mov r2, #0xa\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r0, .__91 + 8\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x1\n"
+ " bl Menu_PrintText\n"
+ " ldr r3, .__91 + 12\n"
+ " mov r0, #0x2\n"
+ " mov r1, #0x3\n"
+ " mov r2, #0x8\n"
+ " bl Menu_PrintItems\n"
+ " str r4, [sp]\n"
+ " mov r0, #0x9\n"
+ " str r0, [sp, #0x4]\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x3\n"
+ " mov r3, #0x8\n"
+ " bl InitMenu\n"
+ " ldrh r0, [r5, #0x8]\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r5, #0x8]\n"
+ ".__87:\n"
+ " ldrh r1, [r7, #0x2e]\n"
+ " mov r0, #0x8\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " bne .__88 @cond_branch\n"
+ " b .__116\n"
+ ".__88:\n"
+ " ldr r1, .__91 + 16\n"
+ " mov r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " b .__94\n"
+ ".__92:\n"
+ " .align 2, 0\n"
+ ".__91:\n"
+ " .word unk_debug_bss_1_2\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word Str_841B254\n"
+ " .word _841B270\n"
+ " .word unk_debug_bss_1_4\n"
+ ".__66:\n"
+ " bl Menu_ProcessInput\n"
+ " lsl r0, r0, #0x18\n"
+ " asr r2, r0, #0x18\n"
+ " mov r0, #0x2\n"
+ " neg r0, r0\n"
+ " cmp r2, r0\n"
+ " beq .__116 @cond_branch\n"
+ " add r0, r0, #0x1\n"
+ " cmp r2, r0\n"
+ " beq .__94 @cond_branch\n"
+ " ldr r1, .__96\n"
+ " mov r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " ldr r0, .__96 + 4\n"
+ " lsl r1, r2, #0x3\n"
+ " add r0, r0, #0x4\n"
+ " add r1, r1, r0\n"
+ " ldr r0, [r1]\n"
+ " bl _call_via_r0\n"
+ ".__94:\n"
+ " bl Menu_EraseScreen\n"
+ " add r0, r6, #0\n"
+ " bl DestroyTask\n"
+ " b .__116\n"
+ ".__97:\n"
+ " .align 2, 0\n"
+ ".__96:\n"
+ " .word unk_debug_bss_1_2\n"
+ " .word _841B270\n"
+ ".__68:\n"
+ " ldr r2, .__100\n"
+ " ldrh r1, [r2, #0x30]\n"
+ " mov r0, #0x80\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq .__98 @cond_branch\n"
+ " ldr r2, .__100 + 4\n"
+ " ldrh r0, [r2, #0xc]\n"
+ " add r0, r0, #0x64\n"
+ " b .__99\n"
+ ".__101:\n"
+ " .align 2, 0\n"
+ ".__100:\n"
+ " .word gMain\n"
+ " .word +0x2000000\n"
+ ".__98:\n"
+ " mov r0, #0x40\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq .__102 @cond_branch\n"
+ " ldr r1, .__104\n"
+ " ldrh r0, [r1, #0xc]\n"
+ " sub r0, r0, #0x64\n"
+ " b .__103\n"
+ ".__105:\n"
+ " .align 2, 0\n"
+ ".__104:\n"
+ " .word +0x2000000\n"
+ ".__102:\n"
+ " mov r0, #0x20\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq .__106 @cond_branch\n"
+ " ldr r1, .__109\n"
+ " ldr r2, .__109 + 4\n"
+ " add r0, r2, #0\n"
+ " ldrh r2, [r1, #0xc]\n"
+ " add r0, r0, r2\n"
+ ".__103:\n"
+ " strh r0, [r1, #0xc]\n"
+ " lsl r0, r0, #0x10\n"
+ " cmp r0, #0\n"
+ " bgt .__116 @cond_branch\n"
+ " ldr r0, .__109 + 8\n"
+ " strh r0, [r1, #0xc]\n"
+ " b .__116\n"
+ ".__110:\n"
+ " .align 2, 0\n"
+ ".__109:\n"
+ " .word +0x2000000\n"
+ " .word 0xfffffc18\n"
+ " .word 0x270f\n"
+ ".__106:\n"
+ " mov r0, #0x10\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq .__111 @cond_branch\n"
+ " ldr r2, .__114\n"
+ " mov r1, #0xfa\n"
+ " lsl r1, r1, #0x2\n"
+ " add r0, r1, #0\n"
+ " ldrh r1, [r2, #0xc]\n"
+ " add r0, r0, r1\n"
+ ".__99:\n"
+ " strh r0, [r2, #0xc]\n"
+ " lsl r0, r0, #0x10\n"
+ " asr r0, r0, #0x10\n"
+ " ldr r1, .__114 + 4\n"
+ " cmp r0, r1\n"
+ " ble .__116 @cond_branch\n"
+ " strh r1, [r2, #0xc]\n"
+ " b .__116\n"
+ ".__115:\n"
+ " .align 2, 0\n"
+ ".__114:\n"
+ " .word +0x2000000\n"
+ " .word 0x270f\n"
+ ".__111:\n"
+ " ldrh r1, [r2, #0x2e]\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq .__116 @cond_branch\n"
+ " bl Menu_EraseScreen\n"
+ " add r0, r6, #0\n"
+ " bl DestroyTask\n"
+ ".__116:\n"
+ " add sp, sp, #0x8\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B894()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, sl\n"
+ " mov r6, r9\n"
+ " mov r5, r8\n"
+ " push {r5, r6, r7}\n"
+ " add sp, sp, #0xfffffffc\n"
+ " ldr r1, .__122\n"
+ " ldrh r2, [r1, #0x8]\n"
+ " mov r0, #0xc0\n"
+ " lsl r0, r0, #0x1\n"
+ " and r0, r0, r2\n"
+ " add r4, r1, #0\n"
+ " cmp r0, #0\n"
+ " beq .__117 @cond_branch\n"
+ " add r1, r1, #0x90\n"
+ " ldr r0, [r1]\n"
+ " add r0, r0, #0x1\n"
+ " str r0, [r1]\n"
+ " ldr r2, .__122 + 4\n"
+ " cmp r0, r2\n"
+ " ble .__118 @cond_branch\n"
+ " str r2, [r1]\n"
+ ".__118:\n"
+ " add r0, r4, #0\n"
+ " add r0, r0, #0x88\n"
+ " ldr r1, [r1]\n"
+ " ldr r0, [r0]\n"
+ " cmp r1, r0\n"
+ " beq .__119 @cond_branch\n"
+ " ldr r0, .__122 + 8\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, .__122 + 12\n"
+ " mov r0, #0x0\n"
+ " strb r0, [r1]\n"
+ ".__119:\n"
+ " ldrb r1, [r4, #0x4]\n"
+ " mov r0, #0x80\n"
+ " and r0, r0, r1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " cmp r4, #0\n"
+ " bne .__126 @cond_branch\n"
+ " ldr r0, .__122 + 16\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0x11\n"
+ " b .__121\n"
+ ".__123:\n"
+ " .align 2, 0\n"
+ ".__122:\n"
+ " .word +0x2000000\n"
+ " .word 0x270f\n"
+ " .word Str_841B2B0\n"
+ " .word unk_debug_bss_1_4\n"
+ " .word Str_841B2D3\n"
+ ".__117:\n"
+ " lsl r0, r2, #0x10\n"
+ " cmp r0, #0\n"
+ " beq .__127 @cond_branch\n"
+ " ldrb r1, [r4, #0x4]\n"
+ " mov r0, #0x80\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq .__126 @cond_branch\n"
+ " mov r4, #0x3\n"
+ " and r4, r4, r2\n"
+ " cmp r4, #0\n"
+ " bne .__126 @cond_branch\n"
+ " ldr r0, .__163\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0x2\n"
+ ".__121:\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__163 + 4\n"
+ " strb r4, [r0]\n"
+ ".__126:\n"
+ " ldr r0, .__163 + 8\n"
+ " ldrh r1, [r0, #0x8]\n"
+ " add r4, r0, #0\n"
+ " cmp r1, #0\n"
+ " beq .__127 @cond_branch\n"
+ " b .__162\n"
+ ".__127:\n"
+ " mov r1, #0x12\n"
+ " ldsh r0, [r4, r1]\n"
+ " cmp r0, #0x3\n"
+ " beq .__129 @cond_branch\n"
+ " b .__162\n"
+ ".__129:\n"
+ " ldrb r1, [r4, #0x4]\n"
+ " mov r0, #0x80\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq .__131 @cond_branch\n"
+ " b .__162\n"
+ ".__131:\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x1\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r7, r0, #0x18\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x2\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " str r0, [sp]\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x3\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r6, r0, #0x18\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0x1\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " mov r9, r0\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0x2\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0x3\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " mov sl, r0\n"
+ " mov r0, #0x2\n"
+ " mov r1, #0x1\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r5, r0, #0x18\n"
+ " mov r0, #0x2\n"
+ " mov r1, #0x2\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " mov r8, r0\n"
+ " mov r0, #0x2\n"
+ " mov r1, #0x3\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r7, #0\n"
+ " bne .__134 @cond_branch\n"
+ " mov r1, r9\n"
+ " cmp r1, #0x1\n"
+ " bne .__134 @cond_branch\n"
+ " cmp r5, #0\n"
+ " beq .__159 @cond_branch\n"
+ ".__134:\n"
+ " ldr r1, [sp]\n"
+ " cmp r1, #0\n"
+ " bne .__137 @cond_branch\n"
+ " cmp r4, #0x1\n"
+ " bne .__137 @cond_branch\n"
+ " mov r1, r8\n"
+ " cmp r1, #0\n"
+ " beq .__159 @cond_branch\n"
+ ".__137:\n"
+ " cmp r6, #0\n"
+ " bne .__140 @cond_branch\n"
+ " mov r1, sl\n"
+ " cmp r1, #0x1\n"
+ " bne .__140 @cond_branch\n"
+ " cmp r0, #0\n"
+ " beq .__159 @cond_branch\n"
+ ".__140:\n"
+ " cmp r7, #0\n"
+ " bne .__143 @cond_branch\n"
+ " cmp r4, #0x1\n"
+ " bne .__143 @cond_branch\n"
+ " cmp r0, #0\n"
+ " beq .__159 @cond_branch\n"
+ ".__143:\n"
+ " cmp r6, #0\n"
+ " bne .__146 @cond_branch\n"
+ " cmp r4, #0x1\n"
+ " bne .__146 @cond_branch\n"
+ " cmp r5, #0\n"
+ " beq .__159 @cond_branch\n"
+ ".__146:\n"
+ " cmp r7, #0x1\n"
+ " bne .__149 @cond_branch\n"
+ " mov r1, r9\n"
+ " cmp r1, #0\n"
+ " bne .__149 @cond_branch\n"
+ " cmp r5, #0x1\n"
+ " beq .__159 @cond_branch\n"
+ ".__149:\n"
+ " ldr r1, [sp]\n"
+ " cmp r1, #0x1\n"
+ " bne .__152 @cond_branch\n"
+ " cmp r4, #0\n"
+ " bne .__152 @cond_branch\n"
+ " mov r1, r8\n"
+ " cmp r1, #0x1\n"
+ " beq .__159 @cond_branch\n"
+ ".__152:\n"
+ " cmp r6, #0x1\n"
+ " bne .__155 @cond_branch\n"
+ " mov r1, sl\n"
+ " cmp r1, #0\n"
+ " bne .__155 @cond_branch\n"
+ " cmp r0, #0x1\n"
+ " beq .__159 @cond_branch\n"
+ ".__155:\n"
+ " cmp r7, #0x1\n"
+ " bne .__158 @cond_branch\n"
+ " cmp r4, #0\n"
+ " bne .__158 @cond_branch\n"
+ " cmp r0, #0x1\n"
+ " beq .__159 @cond_branch\n"
+ ".__158:\n"
+ " cmp r6, #0x1\n"
+ " bne .__162 @cond_branch\n"
+ " cmp r4, #0\n"
+ " bne .__162 @cond_branch\n"
+ " cmp r5, #0x1\n"
+ " bne .__162 @cond_branch\n"
+ ".__159:\n"
+ " ldr r0, .__163 + 12\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0x0\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, .__163 + 4\n"
+ " mov r0, #0x0\n"
+ " strb r0, [r1]\n"
+ ".__162:\n"
+ " add sp, sp, #0x4\n"
+ " pop {r3, r4, r5}\n"
+ " mov r8, r3\n"
+ " mov r9, r4\n"
+ " mov sl, r5\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ ".__164:\n"
+ " .align 2, 0\n"
+ ".__163:\n"
+ " .word Str_841B2E4\n"
+ " .word unk_debug_bss_1_4\n"
+ " .word +0x2000000\n"
+ " .word Str_841B2BF\n"
+ "\n"
+ );
+}
+#endif
+
+static const u8 sReelSymbols[][21] =
+{
+ {
+ SLOT_MACHINE_TAG_7_RED,
+ SLOT_MACHINE_TAG_CHERRY,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_7_BLUE,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_CHERRY,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_7_RED,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_7_BLUE,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_REPLAY
+ }, {
+ SLOT_MACHINE_TAG_7_RED,
+ SLOT_MACHINE_TAG_CHERRY,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_CHERRY,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_7_BLUE,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_CHERRY,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_CHERRY,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_CHERRY
+ }, {
+ SLOT_MACHINE_TAG_7_RED,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_7_BLUE,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_CHERRY
+ }
+};
+
+static const u8 gUnknown_083ECCF1[] = {
+ 1, 0, 5, 4, 3, 2
+};
+
+static const s16 gUnknown_083ECCF8[][2] = {
+ {0, 6},
+ {0, 10},
+ {0, 2}
+};
+
+static const u8 gUnknown_083ECD04[][3] = {
+ {1, 1, 12},
+ {1, 1, 14},
+ {2, 2, 14},
+ {2, 2, 14},
+ {2, 3, 16},
+ {3, 3, 16}
+};
+
+static const u8 gUnknown_083ECD16[][6] = {
+ {25, 25, 30, 40, 40, 50},
+ {25, 25, 30, 30, 35, 35},
+ {25, 25, 30, 25, 25, 30}
+};
+
+static const u8 gUnknown_083ECD28[][6] = {
+ {20, 25, 25, 20, 25, 25},
+ {12, 15, 15, 18, 19, 22},
+ {25, 25, 25, 30, 30, 40},
+ {25, 25, 20, 20, 15, 15},
+ {40, 40, 35, 35, 40, 40}
+};
+
+static const u8 gUnknown_083ECD46[][17] = {
+ {243, 243, 243, 80, 80, 80, 80, 40, 40, 40, 40, 40, 40, 5, 5, 5, 5},
+ { 5, 5, 5, 150, 150, 150, 150, 130, 130, 130, 130, 130, 130, 100, 100, 100, 5},
+ { 4, 4, 4, 20, 20, 20, 20, 80, 80, 80, 80, 80, 80, 100, 100, 100, 40},
+ { 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 45, 45, 45, 100},
+ { 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 100},
+ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6}
+};
+
+static const u8 gUnknown_083ECDAC[][17] = {
+ { 243, 243, 243, 200, 200, 200, 200, 160, 160, 160, 160, 160, 160, 70, 70, 70, 5},
+ { 5, 5, 5, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 2, 2, 2, 6},
+ { 4, 4, 4, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 40, 40, 40, 35},
+ { 2, 2, 2, 3, 3, 3, 3, 30, 30, 30, 30, 30, 30, 100, 100, 100, 50},
+ { 1, 1, 1, 2, 2, 2, 2, 30, 30, 30, 30, 30, 30, 40, 40, 40, 100},
+ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 60}
+};
+
+static const u16 gUnknown_083ECE12[] = {
+ 0x80, 0xaf, 0xc8, 0xe1, 0x100
+};
+
+static const u16 gUnknown_083ECE1C[][2] = {
+ {10, 5},
+ {10, 10},
+ {10, 15},
+ {10, 25},
+ {10, 35}
+};
+
+static const u16 gUnknown_083ECE30[] = {
+ 0, 5, 10, 15, 20
+};
+
+
+static const u8 gUnknown_083ECE3A[] = {
+ 6, 4, 3, 2, 5, 0, 0, 0
+};
+
+static const u16 gUnknown_083ECE42[] = {
+ 0x80, 0x20, 0x40
+};
+
+static const u16 gUnknown_083ECE48[] = {
+ 0x10, 0x08, 0x04, 0x02, 0x01
+};
+
+static const u8 sSym2Match[] = {
+ SLOT_MACHINE_MATCHED_777_RED,
+ SLOT_MACHINE_MATCHED_777_BLUE,
+ SLOT_MACHINE_MATCHED_AZURILL,
+ SLOT_MACHINE_MATCHED_LOTAD,
+ SLOT_MACHINE_MATCHED_1CHERRY,
+ SLOT_MACHINE_MATCHED_POWER,
+ SLOT_MACHINE_MATCHED_REPLAY
+};
+
+static const u16 sSlotMatchFlags[] = {
+ 1 << SLOT_MACHINE_MATCHED_1CHERRY,
+ 1 << SLOT_MACHINE_MATCHED_2CHERRY,
+ 1 << SLOT_MACHINE_MATCHED_REPLAY,
+ 1 << SLOT_MACHINE_MATCHED_LOTAD,
+ 1 << SLOT_MACHINE_MATCHED_AZURILL,
+ 1 << SLOT_MACHINE_MATCHED_POWER,
+ 1 << SLOT_MACHINE_MATCHED_777_MIXED,
+ 1 << SLOT_MACHINE_MATCHED_777_RED,
+ 1 << SLOT_MACHINE_MATCHED_777_BLUE
+};
+
+static const u16 sSlotPayouts[] = {
+ 2, 4, 0, 6, 12, 3, 90, 300, 300
+};
+
+static const s16 gUnknown_083ECE7E[][2] = {
+ { 0xd0, 0x38},
+ { 0xb8, 0x00},
+ { 0xc8, 0x08},
+ { 0xd8, 0x10},
+ { 0xe8, 0x18},
+ { 0xd0, 0x48},
+ { 0xd0, 0x08},
+ { 0xd0, 0x40},
+ { 0xd0, 0x38},
+ { 0xc0, 0x58},
+ { 0xe0, 0x58},
+ { 0xc0, 0x78},
+ { 0xe0, 0x78},
+ { 0x90, 0x38},
+ {0x110, 0x58},
+ { 0xa8, 0x70},
+ { 0xd0, 0x54},
+ { 0xd0, 0x70},
+ { 0xbc, 0x34},
+ { 0xd0, 0x34},
+ { 0xe4, 0x34},
+ { 0xb8, 0x48},
+ { 0xc4, 0x48},
+ { 0xd0, 0x48},
+ { 0xdc, 0x48},
+ { 0xe8, 0x48},
+ { 0xbc, 0x34},
+ { 0xd0, 0x34},
+ { 0xe4, 0x34},
+ { 0xb8, 0x48},
+ { 0xc4, 0x48},
+ { 0xd0, 0x48},
+ { 0xdc, 0x48},
+ { 0xe8, 0x48},
+ { 0x00, 0x00}
+};
+
+static const SpriteCallback gUnknown_083ECF0C[] = {
+ sub_8105C64,
+ sub_8105F54,
+ sub_8105F54,
+ sub_8105F54,
+ sub_8105F54,
+ sub_8105F9C,
+ sub_8105EB4,
+ sub_8105C64,
+ sub_8105C64,
+ sub_8105C6C,
+ sub_8105CF0,
+ sub_8105D08,
+ sub_8105D20,
+ sub_8105D3C,
+ sub_8105DA4,
+ sub_8105E08,
+ sub_8105C64,
+ sub_8106058,
+ sub_81060FC,
+ sub_81060FC,
+ sub_81060FC,
+ sub_81060FC,
+ sub_81060FC,
+ sub_81060FC,
+ sub_81060FC,
+ sub_81060FC,
+ sub_81061C8,
+ sub_81061C8,
+ sub_81061C8,
+ sub_81061C8,
+ sub_81061C8,
+ sub_81061C8,
+ sub_81061C8,
+ sub_81061C8,
+ sub_8106230
+};
+
+static const struct UnkStruct1 Unknown_83ECF98[] = {
+ {25, 34, 0},
+ {2, 0, 0},
+ {9, 16, 0},
+ {255, 0, 0}
+};
+
+static const struct UnkStruct1 Unknown_83ECFA8[] = {
+ {10, 1, 0},
+ {11, 2, 0},
+ {12, 3, 0},
+ {13, 4, 0},
+ {5, 5, 0},
+ {8, 6, 0},
+ {255, 0, 0}
+};
+
+static const struct UnkStruct1 Unknown_83ECFC4[] = {
+ {3, 7, 0},
+ {8, 17, 0},
+ {255, 0, 0}
+};
+
+static const struct UnkStruct1 Unknown_83ECFD0[] = {
+ {4, 8, 0},
+ {6, 9, 0},
+ {6, 10, 1},
+ {6, 11, 2},
+ {6, 12, 3},
+ {255, 0, 0}
+};
+
+static const struct UnkStruct1 Unknown_83ECFE8[] = {
+ {0, 13, 0},
+ {1, 14, 0},
+ {7, 15, 0},
+ {255, 0, 0}
+};
+
+static const struct UnkStruct1 Unknown_83ECFF8[] = {
+ {19, 26, 0},
+ {20, 27, 1},
+ {21, 28, 2},
+ {14, 29, 3},
+ {15, 30, 4},
+ {16, 31, 5},
+ {17, 32, 6},
+ {18, 33, 7},
+ {8, 17, 0},
+ {255, 0, 0}
+};
+
+static const struct UnkStruct1 Unknown_83ED020[] = {
+ {22, 18, 0},
+ {23, 19, 1},
+ {24, 20, 2},
+ {14, 21, 3},
+ {15, 22, 4},
+ {16, 23, 5},
+ {17, 24, 6},
+ {18, 25, 7},
+ {8, 17, 0},
+ {255, 0, 0}
+};
+
+static const struct UnkStruct1 *const gUnknown_083ED048[] = {
+ Unknown_83ECF98,
+ Unknown_83ECFA8,
+ Unknown_83ECFC4,
+ Unknown_83ECFD0,
+ Unknown_83ECFE8,
+ Unknown_83ED020,
+ Unknown_83ECFF8
+};
+
+static void (*const gUnknown_083ED064[])(void) = {
+ sub_810639C,
+ sub_8106364,
+ sub_8106370,
+ nullsub_70,
+ nullsub_70,
+ sub_8106370,
+ sub_8106370
+};
+
+
+static const struct OamData gOamData_83ED080 = {
+ .y = 0x0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_SQUARE,
+ .x = 0x0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0x0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData gOamData_83ED088 = {
+ .y = 0x0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_V_RECTANGLE,
+ .x = 0x0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0x0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData gOamData_83ED090 = {
+ .y = 0x0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_SQUARE,
+ .x = 0x0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0x0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData gOamData_83ED098 = {
+ .y = 0x0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_V_RECTANGLE,
+ .x = 0x0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0x0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData gOamData_83ED0A0 = {
+ .y = 0x0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_SQUARE,
+ .x = 0x0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0x0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData gOamData_83ED0A8 = {
+ .y = 0x0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_V_RECTANGLE,
+ .x = 0x0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0x0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData gOamData_83ED0B0 = {
+ .y = 0x0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_H_RECTANGLE,
+ .x = 0x0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0x0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData gOamData_83ED0B8 = {
+ .y = 0x0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_SQUARE,
+ .x = 0x0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0x0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED0C0[] = {
+ {eSlotMachineReelTimeGfxBuffer + 0x0000, 0x800},
+ {eSlotMachineReelTimeGfxBuffer + 0x0800, 0x800},
+ {eSlotMachineReelTimeGfxBuffer + 0x1000, 0x800},
+ {eSlotMachineReelTimeGfxBuffer + 0x1800, 0x800},
+ {eSlotMachineReelTimeGfxBuffer + 0x2000, 0x800}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED0E8[] = {
+ {eSlotMachineReelTimeGfxBuffer + 0x2800, 0x300}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED0F0[] = {
+ {eSlotMachineReelTimeGfxBuffer + 0x2B00, 0x500}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED0F8[] = {
+ {eSlotMachineReelTimeGfxBuffer + 0x3000, 0x600}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED100[] = {
+ {gSpriteImage_8E988E8, 0x80},
+ {gSpriteImage_8E98968, 0x80},
+ {gSpriteImage_8E989E8, 0x80},
+ {gSpriteImage_8E98A68, 0x80},
+ {gSpriteImage_8E98AE8, 0x80},
+ {gSpriteImage_8E98B68, 0x80}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED130[] = {
+ {gSpriteImage_8E991E8, 0x200}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED138[] = {
+ {gSpriteImage_8E99808, 0x40}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED140[] = {
+ {gSpriteImage_8E98BE8, 0x100},
+ {gSpriteImage_8E98CE8, 0x100}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED150[] = {
+ {gSpriteImage_8E993E8, 0x400}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED158[] = {
+ {gSpriteImage_8E98DE8, 0x200},
+ {gSpriteImage_8E98FE8, 0x200}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED168[] = {
+ {gSpriteImage_8E98848, 0x20}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED170[] = {
+ {gSpriteImage_8E98868, 0x80}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED178[] = {
+ {eSlotMachineGfxBuffer + 0x0000, 0x600}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED180[] = {
+ {eSlotMachineGfxBuffer + 0x0600, 0x200}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED188[] = {
+ {eSlotMachineGfxBuffer + 0x0800, 0x200}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED190[] = {
+ {eSlotMachineGfxBuffer + 0x0A00, 0x200}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED198[] = {
+ {eSlotMachineGfxBuffer + 0x0C00, 0x300}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED1A0[] = {
+ {eSlotMachineGfxBuffer + 0x1000, 0x400}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED1A8[] = {
+ {eSlotMachineGfxBuffer + 0x1400, 0x200}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED1B0[] = {
+ {eSlotMachineGfxBuffer + 0x1600, 0x300}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED1B8[] = {
+ {eSlotMachineGfxBuffer + 0x1900, 0x300}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED1C0[] = {
+ {eSlotMachineGfxBuffer + 0x1C00, 0x200},
+ {eSlotMachineGfxBuffer + 0x1E00, 0x200},
+ {eSlotMachineGfxBuffer + 0x1E00, 0x200} // is this a typo?
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED1D8[] = {
+ {eSlotMachineGfxBuffer + 0x2000, 0x280}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED1E0[] = {
+ {eSlotMachineGfxBuffer + 0x2280, 0x80},
+ {eSlotMachineGfxBuffer + 0x2300, 0x80},
+ {eSlotMachineGfxBuffer + 0x2380, 0x80},
+ {eSlotMachineGfxBuffer + 0x2400, 0x80},
+ {eSlotMachineGfxBuffer + 0x2480, 0x80}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED208[] = {
+ {eSlotMachineGfxBuffer + 0x2600, 0x480},
+ {eSlotMachineGfxBuffer + 0x2A80, 0x480}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED218[] = {
+ {eSlotMachineGfxBuffer + 0x2F00, 0x180},
+ {eSlotMachineGfxBuffer + 0x3080, 0x180}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED228[] = {
+ {gSpriteImage_8E98828, 0x20}
+};
+
+static const union AnimCmd gSpriteAnim_83ED230[] = {
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED238[] = {
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED240[] = {
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED248[] = {
+ ANIMCMD_FRAME(1, 16),
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED254[] = {
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED260[] = {
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED26C[] = {
+ ANIMCMD_FRAME(2, 32),
+ ANIMCMD_FRAME(3, 32),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED278[] = {
+ ANIMCMD_FRAME(4, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED280[] = {
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED288[] = {
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED290[] = {
+ ANIMCMD_FRAME(2, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED298[] = {
+ ANIMCMD_FRAME(3, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED2A0[] = {
+ ANIMCMD_FRAME(4, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED2A8[] = {
+ ANIMCMD_FRAME(5, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED2B0[] = {
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED2BC[] = {
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_FRAME(1, 16),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED2C8[] = {
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_FRAME(1, 30),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED2D4[] = {
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED2DC[] = {
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_FRAME(1, 30),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED2E8[] = {
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_FRAME(1, 16),
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_FRAME(1, 16, .hFlip = TRUE),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED2FC[] = {
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED304[] = {
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED30C[] = {
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED314[] = {
+ ANIMCMD_FRAME(2, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED31C[] = {
+ ANIMCMD_FRAME(3, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED324[] = {
+ ANIMCMD_FRAME(4, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED32C[] = {
+ gSpriteAnim_83ED230
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED330[] = {
+ gSpriteAnim_83ED238
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED334[] = {
+ gSpriteAnim_83ED240,
+ gSpriteAnim_83ED248,
+ gSpriteAnim_83ED254,
+ gSpriteAnim_83ED260,
+ gSpriteAnim_83ED26C,
+ gSpriteAnim_83ED278
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED34C[] = {
+ gSpriteAnim_83ED280,
+ gSpriteAnim_83ED288,
+ gSpriteAnim_83ED290,
+ gSpriteAnim_83ED298,
+ gSpriteAnim_83ED2A0,
+ gSpriteAnim_83ED2A8
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED364[] = {
+ gSpriteAnim_83ED2B0
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED368[] = {
+ gSpriteAnim_83ED2BC
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED36C[] = {
+ gSpriteAnim_83ED2C8,
+ gSpriteAnim_83ED2D4
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED374[] = {
+ gSpriteAnim_83ED2DC
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED378[] = {
+ gSpriteAnim_83ED2E8,
+ gSpriteAnim_83ED2FC
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED380[] = {
+ gSpriteAnim_83ED304,
+ gSpriteAnim_83ED30C,
+ gSpriteAnim_83ED314,
+ gSpriteAnim_83ED31C,
+ gSpriteAnim_83ED324
+};
+
+static const union AffineAnimCmd gSpriteAffineAnim_83ED394[] = {
+ AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0),
+ AFFINEANIMCMD_LOOP(0),
+ AFFINEANIMCMD_FRAME(0x1, 0x1, 0, 1),
+ AFFINEANIMCMD_LOOP(255),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const gSpriteAffineAnimTable_83ED3BC[] = {
+ gSpriteAffineAnim_83ED394
+};
+
+static const union AffineAnimCmd gSpriteAffineAnim_83ED3C0[] = {
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 32),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 6, 32),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 4),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 4),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const gSpriteAffineAnimTable_83ED410[] = {
+ gSpriteAffineAnim_83ED3C0
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED414 = {
+ 0, 0, &gOamData_83ED0A0, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, sub_8104F18
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED42C = {
+ 7, 4, &gOamData_83ED088, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, sub_810506C
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED444 = {
+ 17, 0, &gOamData_83ED0B8, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED45C = {
+ 0xFFFF, 1, &gOamData_83ED0B8, gSpriteAnimTable_83ED334, gSpriteImageTable_83ED0C0, gDummySpriteAffineAnimTable, sub_8105170
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED474 = {
+ 0xFFFF, 2, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0E8, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED48C = {
+ 0xFFFF, 3, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0F0, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED4A4 = {
+ 0xFFFF, 3, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0F8, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED4BC = {
+ 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED34C, gSpriteImageTable_83ED100, gDummySpriteAffineAnimTable, sub_810535C
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED4D4 = {
+ 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED130, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED4EC = {
+ 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED138, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED504 = {
+ 0xFFFF, 4, &gOamData_83ED098, gSpriteAnimTable_83ED364, gSpriteImageTable_83ED140, gDummySpriteAffineAnimTable, sub_810562C
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED51C = {
+ 0xFFFF, 7, &gOamData_83ED0A8, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED150, gDummySpriteAffineAnimTable, sub_8105784
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED534 = {
+ 0xFFFF, 5, &gOamData_83ED0A0, gSpriteAnimTable_83ED368, gSpriteImageTable_83ED158, gDummySpriteAffineAnimTable, sub_8105894
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED54C = {
+ 0xFFFF, 4, &gOamData_83ED080, gSpriteAnimTable_83ED330, gSpriteImageTable_83ED168, gDummySpriteAffineAnimTable, sub_810594C
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED564 = {
+ 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED170, gSpriteAffineAnimTable_83ED3BC, sub_8105A38
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED57C = {
+ 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED178, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED594 = {
+ 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED180, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED5AC = {
+ 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED188, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED5C4 = {
+ 18, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED190, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED5DC = {
+ 0xFFFF, 6, &gOamData_83ED0B0, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED198, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED5F4 = {
+ 0xFFFF, 6, &gOamData_83ED0B0, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1A0, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED60C = {
+ 19, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1A8, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED624 = {
+ 20, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1B0, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED63C = {
+ 21, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1B8, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED654 = {
+ 0xFFFF, 6, &gOamData_83ED0A0, gSpriteAnimTable_83ED36C, gSpriteImageTable_83ED1C0, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED66C = {
+ 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1D8, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED684 = {
+ 0xFFFF, 6, &gOamData_83ED090, gSpriteAnimTable_83ED380, gSpriteImageTable_83ED1E0, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED69C = {
+ 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED378, gSpriteImageTable_83ED208, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED6B4 = {
+ 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED374, gSpriteImageTable_83ED218, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED6CC = {
+ 0xFFFF, 4, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED228, gSpriteAffineAnimTable_83ED410, sub_8105B70
+};
+
+static const struct Subsprite gSubspriteTable_83ED6E4[] = {
+ {-64, -64, ST_OAM_SQUARE, 3, 0x0, 3},
+ {0, -64, ST_OAM_SQUARE, 3, 0x0, 3},
+ {-64, 0, ST_OAM_SQUARE, 3, 0x0, 3},
+ {0, 0, ST_OAM_SQUARE, 3, 0x0, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED704[] = {
+ {4, gSubspriteTable_83ED6E4}
+};
+
+static const struct Subsprite gSubspriteTable_83ED70C[] = {
+ {-32, -12, ST_OAM_H_RECTANGLE, 1, 0x0, 1},
+ {0, -12, ST_OAM_H_RECTANGLE, 1, 0x4, 1},
+ {-32, -4, ST_OAM_H_RECTANGLE, 1, 0x8, 1},
+ {0, -4, ST_OAM_H_RECTANGLE, 1, 0xc, 1},
+ {-32, 4, ST_OAM_H_RECTANGLE, 1, 0x10, 1},
+ {0, 4, ST_OAM_H_RECTANGLE, 1, 0x14, 1}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED73C[] = {
+ {6, gSubspriteTable_83ED70C}
+};
+
+static const struct Subsprite gSubspriteTable_83ED744[] = {
+ {-32, -20, ST_OAM_H_RECTANGLE, 3, 0x0, 1},
+ {-32, 12, ST_OAM_H_RECTANGLE, 1, 0x20, 1},
+ {0, 12, ST_OAM_H_RECTANGLE, 1, 0x24, 1}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED75C[] = {
+ {3, gSubspriteTable_83ED744}
+};
+
+static const struct Subsprite gSubspriteTable_83ED764[] = {
+ {-32, -24, ST_OAM_H_RECTANGLE, 3, 0x0, 1},
+ {-32, 8, ST_OAM_H_RECTANGLE, 1, 0x20, 1},
+ {0, 8, ST_OAM_H_RECTANGLE, 1, 0x24, 1},
+ {-32, 16, ST_OAM_H_RECTANGLE, 1, 0x28, 1},
+ {0, 16, ST_OAM_H_RECTANGLE, 1, 0x2c, 1}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED78C[] = {
+ {5, gSubspriteTable_83ED764}
+};
+
+static const struct Subsprite gSubspriteTable_83ED794[] = {
+ {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 1},
+ {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 1},
+ {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 1},
+ {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 1}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED7B4[] = {
+ {4, gSubspriteTable_83ED794}
+};
+
+static const struct Subsprite gSubspriteTable_83ED7BC[] = {
+ {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 1},
+ {-8, -4, ST_OAM_H_RECTANGLE, 0, 0x0, 1},
+ {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x0, 1}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED7D4[] = {
+ {3, gSubspriteTable_83ED7BC}
+};
+
+static const struct Subsprite gSubspriteTable_83ED7DC[] = {
+ {-32, -24, ST_OAM_H_RECTANGLE, 3, 0x0, 3},
+ {-32, 8, ST_OAM_H_RECTANGLE, 1, 0x20, 3},
+ {0, 8, ST_OAM_H_RECTANGLE, 1, 0x24, 3},
+ {-32, 16, ST_OAM_H_RECTANGLE, 1, 0x28, 3},
+ {0, 16, ST_OAM_H_RECTANGLE, 1, 0x2c, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED804[] = {
+ {5, gSubspriteTable_83ED7DC}
+};
+
+static const struct Subsprite gSubspriteTable_83ED80C[] = {
+ {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3},
+ {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3},
+ {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3},
+ {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED82C[] = {
+ {4, gSubspriteTable_83ED80C}
+};
+
+static const struct Subsprite gSubspriteTable_83ED834[] = {
+ {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3},
+ {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3},
+ {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3},
+ {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED854[] = {
+ {4, gSubspriteTable_83ED834}
+};
+
+static const struct Subsprite gSubspriteTable_83ED85C[] = {
+ {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3},
+ {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3},
+ {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3},
+ {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED87C[] = {
+ {4, gSubspriteTable_83ED85C}
+};
+
+static const struct Subsprite gSubspriteTable_83ED884[] = {
+ {-32, -12, ST_OAM_H_RECTANGLE, 1, 0x0, 3},
+ {0, -12, ST_OAM_H_RECTANGLE, 1, 0x4, 3},
+ {-32, -4, ST_OAM_H_RECTANGLE, 1, 0x8, 3},
+ {0, -4, ST_OAM_H_RECTANGLE, 1, 0xc, 3},
+ {-32, 4, ST_OAM_H_RECTANGLE, 1, 0x10, 3},
+ {0, 4, ST_OAM_H_RECTANGLE, 1, 0x14, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED8B4[] = {
+ {6, gSubspriteTable_83ED884}
+};
+
+static const struct Subsprite gSubspriteTable_83ED8BC[] = {
+ {-16, -16, ST_OAM_SQUARE, 2, 0x0, 3}
+};
+
+static const struct Subsprite gSubspriteTable_83ED8C4[] = {
+ {-8, -8, ST_OAM_SQUARE, 1, 0x10, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED8CC[] = {
+ {1, gSubspriteTable_83ED8BC},
+ {1, gSubspriteTable_83ED8C4}
+};
+
+static const struct Subsprite gSubspriteTable_83ED8DC[] = {
+ {-24, -24, ST_OAM_H_RECTANGLE, 1, 0x0, 3},
+ {8, -24, ST_OAM_H_RECTANGLE, 0, 0x4, 3},
+ {-24, -16, ST_OAM_H_RECTANGLE, 1, 0x6, 3},
+ {8, -16, ST_OAM_H_RECTANGLE, 0, 0xa, 3},
+ {-24, -8, ST_OAM_H_RECTANGLE, 1, 0xc, 3},
+ {8, -8, ST_OAM_H_RECTANGLE, 0, 0x10, 3},
+ {-24, 0, ST_OAM_H_RECTANGLE, 1, 0x12, 3},
+ {8, 0, ST_OAM_H_RECTANGLE, 0, 0x16, 3},
+ {-24, 8, ST_OAM_H_RECTANGLE, 1, 0x18, 3},
+ {8, 8, ST_OAM_H_RECTANGLE, 0, 0x1c, 3},
+ {-24, 16, ST_OAM_H_RECTANGLE, 1, 0x1e, 3},
+ {8, 16, ST_OAM_H_RECTANGLE, 0, 0x22, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED93C[] = {
+ 12, gSubspriteTable_83ED8DC
+};
+
+static const struct Subsprite gSubspriteTable_83ED944[] = {
+ {-16, -12, ST_OAM_H_RECTANGLE, 2, 0x0, 3},
+ {-16, 4, ST_OAM_H_RECTANGLE, 0, 0x8, 3},
+ {0, 4, ST_OAM_H_RECTANGLE, 0, 0xa, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED95C[] = {
+ {3, gSubspriteTable_83ED944}
+};
+
+static const struct Subsprite gSubspriteTable_83ED964[] = {
+ {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x0, 3},
+ {-8, 0, ST_OAM_H_RECTANGLE, 0, 0x8, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED974[] = {
+ {2, gSubspriteTable_83ED964}
+};
+
+static const struct Subsprite gSubspriteTable_83ED97C[] = {
+ {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x2, 3},
+ {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xa, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED98C[] = {
+ {2, gSubspriteTable_83ED97C}
+};
+
+static const struct Subsprite gSubspriteTable_83ED994[] = {
+ {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x4, 3},
+ {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xc, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED9A4[] = {
+ {2, gSubspriteTable_83ED994}
+};
+
+static const struct Subsprite gSubspriteTable_83ED9AC[] = {
+ {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x6, 3},
+ {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xe, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED9BC[] = {
+ {2, gSubspriteTable_83ED9AC}
+};
+
+static const struct Subsprite gSubspriteTable_83ED9C4[] = {
+ {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x0, 3},
+ {-8, 0, ST_OAM_H_RECTANGLE, 0, 0x8, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED9D4[] = {
+ {2, gSubspriteTable_83ED9C4}
+};
+
+static const struct Subsprite gSubspriteTable_83ED9DC[] = {
+ {-4, -8, ST_OAM_SQUARE, 0, 0x2, 3},
+ {-4, 0, ST_OAM_SQUARE, 0, 0xa, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED9EC[] = {
+ {2, gSubspriteTable_83ED9DC}
+};
+
+static const struct Subsprite gSubspriteTable_83ED9F4[] = {
+ {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x3, 3},
+ {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xb, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDA04[] = {
+ {2, gSubspriteTable_83ED9F4}
+};
+
+static const struct Subsprite gSubspriteTable_83EDA0C[] = {
+ {-4, -8, ST_OAM_SQUARE, 0, 0x5, 3},
+ {-4, 0, ST_OAM_SQUARE, 0, 0xd, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDA1C[] = {
+ {2, gSubspriteTable_83EDA0C}
+};
+
+static const struct Subsprite gSubspriteTable_83EDA24[] = {
+ {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x6, 3},
+ {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xe, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDA34[] = {
+ {2, gSubspriteTable_83EDA24}
+};
+
+static const struct Subsprite gSubspriteTable_83EDA3C[] = {
+ {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 3},
+ {4, -12, ST_OAM_SQUARE, 0, 0x2, 3},
+ {-12, -4, ST_OAM_H_RECTANGLE, 0, 0x8, 3},
+ {4, -4, ST_OAM_SQUARE, 0, 0xa, 3},
+ {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x10, 3},
+ {4, 4, ST_OAM_SQUARE, 0, 0x12, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDA6C[] = {
+ {6, gSubspriteTable_83EDA3C}
+};
+
+static const struct Subsprite gSubspriteTable_83EDA74[] = {
+ {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x3, 3},
+ {-8, -4, ST_OAM_H_RECTANGLE, 0, 0xb, 3},
+ {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x13, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDA8C[] = {
+ {3, gSubspriteTable_83EDA74}
+};
+
+static const struct Subsprite gSubspriteTable_83EDA94[] = {
+ {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x5, 3},
+ {4, -12, ST_OAM_SQUARE, 0, 0x7, 3},
+ {-12, -4, ST_OAM_H_RECTANGLE, 0, 0xd, 3},
+ {4, -4, ST_OAM_SQUARE, 0, 0xf, 3},
+ {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x15, 3},
+ {4, 4, ST_OAM_SQUARE, 0, 0x17, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDAC4[] = {
+ {6, gSubspriteTable_83EDA94}
+};
+
+static const struct Subsprite gSubspriteTable_83EDACC[] = {
+ {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 3},
+ {4, -12, ST_OAM_SQUARE, 0, 0x2, 3},
+ {-12, -4, ST_OAM_H_RECTANGLE, 0, 0x8, 3},
+ {4, -4, ST_OAM_SQUARE, 0, 0xa, 3},
+ {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x10, 3},
+ {4, 4, ST_OAM_SQUARE, 0, 0x12, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDAFC[] = {
+ {6, gSubspriteTable_83EDACC}
+};
+
+static const struct Subsprite gSubspriteTable_83EDB04[] = {
+ {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x3, 3},
+ {-8, -4, ST_OAM_H_RECTANGLE, 0, 0xb, 3},
+ {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x13, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDB1C[] = {
+ {3, gSubspriteTable_83EDB04}
+};
+
+static const struct Subsprite gSubspriteTable_83EDB24[] = {
+ {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x5, 3},
+ {4, -12, ST_OAM_SQUARE, 0, 0x7, 3},
+ {-12, -4, ST_OAM_H_RECTANGLE, 0, 0xd, 3},
+ {4, -4, ST_OAM_SQUARE, 0, 0xf, 3},
+ {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x15, 3},
+ {4, 4, ST_OAM_SQUARE, 0, 0x17, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDB54[] = {
+ {6, gSubspriteTable_83EDB24}
+};
+
+static const struct SpriteTemplate *const gUnknown_083EDB5C[] = {
+ &gSpriteTemplate_83ED57C,
+ &gSpriteTemplate_83ED594,
+ &gSpriteTemplate_83ED5AC,
+ &gSpriteTemplate_83ED5DC,
+ &gSpriteTemplate_83ED5F4,
+ &gSpriteTemplate_83ED654,
+ &gSpriteTemplate_83ED66C,
+ &gSpriteTemplate_83ED684,
+ &gSpriteTemplate_83ED69C,
+ &gSpriteTemplate_83ED6B4,
+ &gSpriteTemplate_83ED5C4,
+ &gSpriteTemplate_83ED5C4,
+ &gSpriteTemplate_83ED5C4,
+ &gSpriteTemplate_83ED5C4,
+ &gSpriteTemplate_83ED60C,
+ &gSpriteTemplate_83ED60C,
+ &gSpriteTemplate_83ED60C,
+ &gSpriteTemplate_83ED60C,
+ &gSpriteTemplate_83ED60C,
+ &gSpriteTemplate_83ED624,
+ &gSpriteTemplate_83ED624,
+ &gSpriteTemplate_83ED624,
+ &gSpriteTemplate_83ED63C,
+ &gSpriteTemplate_83ED63C,
+ &gSpriteTemplate_83ED63C,
+ &gDummySpriteTemplate
+};
+
+static const struct SubspriteTable *const gUnknown_083EDBC4[] = {
+ gSubspriteTables_83ED804,
+ gSubspriteTables_83ED82C,
+ gSubspriteTables_83ED854,
+ gSubspriteTables_83ED8B4,
+ NULL,
+ NULL,
+ gSubspriteTables_83ED8CC,
+ NULL,
+ gSubspriteTables_83ED93C,
+ gSubspriteTables_83ED95C,
+ gSubspriteTables_83ED974,
+ gSubspriteTables_83ED98C,
+ gSubspriteTables_83ED9A4,
+ gSubspriteTables_83ED9BC,
+ gSubspriteTables_83ED9D4,
+ gSubspriteTables_83ED9EC,
+ gSubspriteTables_83EDA04,
+ gSubspriteTables_83EDA1C,
+ gSubspriteTables_83EDA34,
+ gSubspriteTables_83EDA6C,
+ gSubspriteTables_83EDA8C,
+ gSubspriteTables_83EDAC4,
+ gSubspriteTables_83EDAFC,
+ gSubspriteTables_83EDB1C,
+ gSubspriteTables_83EDB54,
+ NULL
+};
+
+static const struct SpriteSheet sSlotMachineSpriteSheets[] = {
+ {gSlotMachineReelSymbol1Tiles, 0x200, 0},
+ {gSlotMachineReelSymbol2Tiles, 0x200, 1},
+ {gSlotMachineReelSymbol3Tiles, 0x200, 2},
+ {gSlotMachineReelSymbol4Tiles, 0x200, 3},
+ {gSlotMachineReelSymbol5Tiles, 0x200, 4},
+ {gSlotMachineReelSymbol6Tiles, 0x200, 5},
+ {gSlotMachineReelSymbol7Tiles, 0x200, 6},
+ {gSlotMachineNumber0Tiles, 0x40, 7},
+ {gSlotMachineNumber1Tiles, 0x40, 8},
+ {gSlotMachineNumber2Tiles, 0x40, 9},
+ {gSlotMachineNumber3Tiles, 0x40, 10},
+ {gSlotMachineNumber4Tiles, 0x40, 11},
+ {gSlotMachineNumber5Tiles, 0x40, 12},
+ {gSlotMachineNumber6Tiles, 0x40, 13},
+ {gSlotMachineNumber7Tiles, 0x40, 14},
+ {gSlotMachineNumber8Tiles, 0x40, 15},
+ {gSlotMachineNumber9Tiles, 0x40, 16},
+ {eSlotMachineGfxBuffer + 0x0A00, 0x200, 18},
+ {eSlotMachineGfxBuffer + 0x1400, 0x200, 19},
+ {eSlotMachineGfxBuffer + 0x1600, 0x300, 20},
+ {eSlotMachineGfxBuffer + 0x1900, 0x300, 21},
+ {}
+};
+
+static const struct SpriteSheet gUnknown_083EDCDC = {
+ eSlotMachineGfxBuffer + 0x0000, 0x800, 17
+};
+
+static const u8 *const gUnknown_083EDCE4 = gUnknownPalette_08E997E8;
+
+#ifdef SAPPHIRE
+static const u16 UnknownPalette_83EDCE8[] = INCBIN_U16("graphics/unknown/sapphire_83EDD40.gbapal");
+#elif defined(RUBY)
+static const u16 UnknownPalette_83EDCE8[] = INCBIN_U16("graphics/unknown/ruby_83EDCE8.gbapal");
+#endif // RS
+
+static const u16 *const gUnknown_083EDD08[] = {
+ UnknownPalette_83EDCE8 + 10,
+ UnknownPalette_83EDCE8 + 11,
+ UnknownPalette_83EDCE8 + 12,
+ UnknownPalette_83EDCE8 + 13,
+ UnknownPalette_83EDCE8 + 14
+};
+
+static const u16 *const gUnknown_083EDD1C[] = {
+ gUnknown_08E95A18 + 74,
+ gUnknown_08E95A18 + 75,
+ gUnknown_08E95A18 + 76,
+ gUnknown_08E95A18 + 77,
+ gUnknown_08E95A18 + 78
+};
+
+static const u8 gUnknown_083EDD30[] = {
+ 0x4a, 0x4b, 0x4c, 0x4e, 0x4d
+};
+
+static const u8 gUnknown_083EDD35[][2] = {
+ {0, 0},
+ {1, 2},
+ {3, 4}
+};
+static const u8 gUnknown_083EDD3B[] = {1, 2, 2};
+
+#ifdef SAPPHIRE
+static const u16 Unknown_83EDD3E[] = INCBIN_U16("graphics/unknown/sapphire_83EDD96.gbapal");
+static const u16 Unknown_83EDD5E[] = INCBIN_U16("graphics/unknown/sapphire_83EDDB6.gbapal");
+static const u16 Unknown_83EDD7E[] = INCBIN_U16("graphics/unknown/sapphire_83EDDD6.gbapal");
+#elif defined (RUBY)
+static const u16 Unknown_83EDD3E[] = INCBIN_U16("graphics/unknown/ruby_83EDD3E.gbapal");
+static const u16 Unknown_83EDD5E[] = INCBIN_U16("graphics/unknown/ruby_83EDD5E.gbapal");
+static const u16 Unknown_83EDD7E[] = INCBIN_U16("graphics/unknown/ruby_83EDD7E.gbapal");
+#endif // RS
+
+static const u16 *const gUnknown_083EDDA0[] = {
+ Unknown_83EDD3E,
+ Unknown_83EDD5E,
+ Unknown_83EDD7E
+};
+
+static const u16 *const gUnknown_083EDDAC = gUnknown_08E95A18 + 16;
+
+static const u16 Palette_83EDDB0[] = INCBIN_U16("graphics/slot_machine/83EDDB0.gbapal");
+static const u16 Palette_83EDDD0[] = INCBIN_U16("graphics/slot_machine/83EDDD0.gbapal");
+static const u16 Palette_83EDDF0[] = INCBIN_U16("graphics/slot_machine/83EDDF0.gbapal");
+
+static const u16 *const gUnknown_083EDE10[] = {
+ Palette_83EDDB0,
+ Palette_83EDDD0,
+ Palette_83EDDF0,
+ gSlotMachineSpritePalette6
+};
+
+static const u16 *const gUnknown_083EDE20 = gSlotMachineSpritePalette6;
+
+static const u16 gPalette_83EDE24[] = INCBIN_U16("graphics/slot_machine/83EDE24_pal.bin");
+
+static const struct SpritePalette gSlotMachineSpritePalettes[] = {
+ {gSlotMachineSpritePalette0, 0},
+ {gSlotMachineSpritePalette1, 1},
+ {gSlotMachineSpritePalette2, 2},
+ {gSlotMachineSpritePalette3, 3},
+ {gSlotMachineSpritePalette4, 4},
+ {gSlotMachineSpritePalette5, 5},
+ {gSlotMachineSpritePalette6, 6},
+ {gSlotMachineSpritePalette4, 7},
+ {}
+};
+
+static const u8 sReelTimeGfx[] = INCBIN_U8("graphics/slot_machine/reel_time.4bpp.lz");
+
+static const u16 sReelTimeWindowTilemap[] = INCBIN_U16("graphics/slot_machine/reel_time_window_map.bin");
+
+#if DEBUG
+
+const u8 Str_841B1C4[] = _("SETTEI");
+const u8 Str_841B1CB[] = _("MAWASITA");
+const u8 Str_841B1D4[] = _("MODOSI");
+const u8 Str_841B1DB[] = _("NOMARE");
+const u8 Str_841B1E2[] = _("MAE 7");
+const u8 Str_841B1E8[] = _("LR  HENKOU");
+const u8 Str_841B1F3[] = _("START  JIDOUSU");
+const u8 Str_841B202[] = _("SELECT  SETTEI");
+const u8 Str_841B211[] = _("TYUHSEN");
+const u8 Str_841B219[] = _("CHERRY");
+const u8 Str_841B220[] = _("REPLAY");
+const u8 Str_841B227[] = _("HASUBO");
+const u8 Str_841B22E[] = _("RURIRI");
+const u8 Str_841B235[] = _("INAZU");
+const u8 Str_841B23B[] = _("REG");
+const u8 Str_841B23F[] = _("BIG");
+const u8 Str_841B243[] = _("BD");
+const u8 Str_841B246[] = _("R7");
+const u8 Str_841B249[] = _("B7");
+const u8 Str_841B24C[] = _("A  COIN");
+const u8 Str_841B254[] = _("TYUHSEN");
+const u8 Str_841B25C[] = _("UD  100");
+const u8 Str_841B264[] = _("LR  1000");
+const u8 Str_841B26D[] = _("×");
+
+// Is this MenuAction2? I'm not sure.
+const struct {const u8 *text; void (*func)();} _841B270[] =
+{
+ {Str_841B219, debug_sub_811B1C4},
+ {Str_841B220, debug_sub_811B1EC},
+ {Str_841B227, debug_sub_811B210},
+ {Str_841B22E, debug_sub_811B238},
+ {Str_841B235, debug_sub_811B260},
+ {Str_841B23B, debug_sub_811B288},
+ {Str_841B23F, debug_sub_811B2B0},
+ {Str_841B243, debug_sub_811B2D8},
+};
+
+const u8 Str_841B2B0[] = _("·カウントエラーがおきました");
+const u8 Str_841B2BF[] = _("·リールそうさで エラーが おきました");
+const u8 Str_841B2D3[] = _("·フラグオフエラーが おきました");
+const u8 Str_841B2E4[] = _("·ボーナスこやくの エラーが おきました");
+
+#endif
diff --git a/src/field/start_menu.c b/src/field/start_menu.c
index dccf1714e..4904f4a80 100644
--- a/src/field/start_menu.c
+++ b/src/field/start_menu.c
@@ -28,7 +28,7 @@
#include "strings2.h"
#include "task.h"
#include "trainer_card.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
//Menu actions
enum {
@@ -44,6 +44,11 @@ enum {
MENU_ACTION_PLAYER_LINK
};
+#if DEBUG
+static u32 _debugStartMenu_0 __attribute__((unused));
+static u32 _debugStartMenu_1 __attribute__((unused));
+#endif
+
static u8 (*saveDialogCallback)(void);
static u8 saveDialogTimer; //Number of frames to keep the window on screen after save was completed
static bool8 savingComplete;
@@ -54,7 +59,7 @@ extern u16 gSpecialVar_Result;
extern u8 gUnknown_03004860;
-u8 (*gCallback_03004AE8)(void);
+u8 (*gMenuCallback)(void);
EWRAM_DATA static u8 sStartMenuCursorPos = 0;
EWRAM_DATA static u8 sNumStartMenuActions = 0;
@@ -132,6 +137,304 @@ static bool32 sub_80719FC(u8 *ptr);
static void sub_8071B54(void);
static void Task_8071B64(u8 taskId);
+#if DEBUG
+__attribute__((naked))
+void debug_sub_8075C30()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " bl debug_sub_8075D9C\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_8075C40()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, sl\n"
+ " mov r6, r9\n"
+ " mov r5, r8\n"
+ " push {r5, r6, r7}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " lsl r0, r4, #0x2\n"
+ " add r0, r0, r4\n"
+ " lsl r0, r0, #0x3\n"
+ " ldr r1, ._5 @ gTasks\n"
+ " add r5, r0, r1\n"
+ " mov r1, #0x0\n"
+ " ldsh r0, [r5, r1]\n"
+ " cmp r0, #0x1\n"
+ " beq ._1 @cond_branch\n"
+ " cmp r0, #0x1\n"
+ " bgt ._2 @cond_branch\n"
+ " cmp r0, #0\n"
+ " beq ._3 @cond_branch\n"
+ " b ._18\n"
+ "._6:\n"
+ " .align 2, 0\n"
+ "._5:\n"
+ " .word gTasks+0x8\n"
+ "._2:\n"
+ " cmp r0, #0x2\n"
+ " beq ._7 @cond_branch\n"
+ " cmp r0, #0x3\n"
+ " beq ._8 @cond_branch\n"
+ " b ._18\n"
+ "._3:\n"
+ " bl m4aSoundVSyncOff\n"
+ " b ._12\n"
+ "._1:\n"
+ " ldr r1, ._13 @ 0x4000208\n"
+ " ldrh r0, [r1]\n"
+ " mov sl, r0\n"
+ " mov r0, #0x0\n"
+ " strh r0, [r1]\n"
+ " ldr r1, ._13 + 4 @ 0x4000108\n"
+ " strh r0, [r1]\n"
+ " mov r0, #0x83\n"
+ " lsl r0, r0, #0x10\n"
+ " str r0, [r1]\n"
+ " ldr r4, ._13 + 8 @ 0xc34f\n"
+ " mov r9, r4\n"
+ " ldr r2, ._13 + 12 @ 0x40000b0\n"
+ " ldr r0, ._13 + 16 @ gScanlineEffectRegBuffers\n"
+ " mov ip, r0\n"
+ " ldr r1, ._13 + 20 @ 0xc5ff\n"
+ " mov r8, r1\n"
+ " ldr r7, ._13 + 24 @ 0x7fff\n"
+ " mov r3, r9\n"
+ " add r3, r3, #0x1\n"
+ " ldr r6, ._13 + 28 @ 0x4000040\n"
+ " ldr r4, ._13 + 32 @ 0xa2600001\n"
+ "._11:\n"
+ " mov r0, ip\n"
+ " str r0, [r2]\n"
+ " str r6, [r2, #0x4]\n"
+ " str r4, [r2, #0x8]\n"
+ " ldr r0, [r2, #0x8]\n"
+ " ldrh r1, [r2, #0xa]\n"
+ " mov r0, r8\n"
+ " and r0, r0, r1\n"
+ " strh r0, [r2, #0xa]\n"
+ " ldrh r1, [r2, #0xa]\n"
+ " add r0, r7, #0\n"
+ " and r0, r0, r1\n"
+ " strh r0, [r2, #0xa]\n"
+ " ldrh r0, [r2, #0xa]\n"
+ " sub r3, r3, #0x1\n"
+ " cmp r3, #0\n"
+ " bne ._11 @cond_branch\n"
+ " mov r3, r9\n"
+ " add r3, r3, #0x1\n"
+ " ldr r0, ._13 + 36 @ 0x400010a\n"
+ " mov r2, #0x0\n"
+ " strh r2, [r0]\n"
+ " ldr r1, ._13 + 4 @ 0x4000108\n"
+ " ldrh r0, [r1]\n"
+ " ldr r4, ._13 + 40 @ _debugStartMenu_0\n"
+ " str r0, [r4]\n"
+ " strh r2, [r1]\n"
+ " ldr r0, ._13 @ 0x4000208\n"
+ " mov r1, sl\n"
+ " strh r1, [r0]\n"
+ " ldr r4, ._13 + 44 @ _debugStartMenu_1\n"
+ " str r3, [r4]\n"
+ " bl m4aSoundVSyncOn\n"
+ " b ._12\n"
+ "._14:\n"
+ " .align 2, 0\n"
+ "._13:\n"
+ " .word 0x4000208\n"
+ " .word 0x4000108\n"
+ " .word 0xc34f\n"
+ " .word 0x40000b0\n"
+ " .word gScanlineEffectRegBuffers\n"
+ " .word 0xc5ff\n"
+ " .word 0x7fff\n"
+ " .word 0x4000040\n"
+ " .word 0xa2600001\n"
+ " .word 0x400010a\n"
+ " .word _debugStartMenu_0\n"
+ " .word _debugStartMenu_1\n"
+ "._7:\n"
+ " mov r0, #0x15\n"
+ " bl PlaySE\n"
+ " ldr r0, ._16 @ gStringVar1\n"
+ " ldr r1, ._16 + 4 @ _debugStartMenu_1\n"
+ " ldr r1, [r1]\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0x8\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " ldr r0, ._16 + 8 @ gStringVar2\n"
+ " ldr r1, ._16 + 12 @ _debugStartMenu_0\n"
+ " ldr r1, [r1]\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0x8\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " bl Menu_DisplayDialogueFrame\n"
+ " ldr r0, ._16 + 16 @ gUnknown_Debug_839B6D8\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ "._12:\n"
+ " ldrh r0, [r5]\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r5]\n"
+ " b ._18\n"
+ "._17:\n"
+ " .align 2, 0\n"
+ "._16:\n"
+ " .word gStringVar1\n"
+ " .word _debugStartMenu_1\n"
+ " .word gStringVar2\n"
+ " .word _debugStartMenu_0\n"
+ " .word gUnknown_Debug_839B6D8\n"
+ "._8:\n"
+ " ldr r0, ._19 @ gMain\n"
+ " ldrh r1, [r0, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._18 @cond_branch\n"
+ " bl Menu_EraseScreen\n"
+ " bl ScriptContext2_Disable\n"
+ " add r0, r4, #0\n"
+ " bl DestroyTask\n"
+ "._18:\n"
+ " pop {r3, r4, r5}\n"
+ " mov r8, r3\n"
+ " mov r9, r4\n"
+ " mov sl, r5\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._20:\n"
+ " .align 2, 0\n"
+ "._19:\n"
+ " .word gMain\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_8075D9C()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._21 @ debug_sub_8075C40\n"
+ " mov r1, #0xa\n"
+ " bl CreateTask\n"
+ " bl ScriptContext2_Enable\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._22:\n"
+ " .align 2, 0\n"
+ "._21:\n"
+ " .word debug_sub_8075C40+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_8075DB4()
+{
+ asm(
+ " push {r4, r5, r6, lr}\n"
+ " add r6, r0, #0\n"
+ " add r5, r1, #0\n"
+ " add r4, r2, #0\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0x4d\n"
+ " bl __umodsi3\n"
+ " strb r0, [r6, #0x1]\n"
+ " add r1, r6, #0\n"
+ " add r1, r1, #0xc\n"
+ " add r0, r4, #0\n"
+ " bl write_word_to_mem\n"
+ " add r0, r6, #4\n"
+ " add r1, r5, #0\n"
+ " bl StringCopy8\n"
+ " mov r3, #0x7\n"
+ " mov r4, #0x0\n"
+ " ldr r0, ._25 @ gSaveBlock1\n"
+ " ldr r1, ._25 + 4 @ 0x2b28\n"
+ " add r5, r0, r1\n"
+ " add r2, r6, #0\n"
+ " add r2, r2, #0x10\n"
+ " add r1, r6, #0\n"
+ " add r1, r1, #0x1c\n"
+ "._23:\n"
+ " ldrh r0, [r5]\n"
+ " strh r0, [r2]\n"
+ " strh r3, [r1]\n"
+ " add r0, r3, #6\n"
+ " strh r0, [r1, #0xc]\n"
+ " add r3, r3, #0x1\n"
+ " add r5, r5, #0x2\n"
+ " add r2, r2, #0x2\n"
+ " add r1, r1, #0x2\n"
+ " add r4, r4, #0x1\n"
+ " cmp r4, #0x5\n"
+ " ble ._23 @cond_branch\n"
+ " mov r4, #0x0\n"
+ "._24:\n"
+ " mov r0, #0x64\n"
+ " mul r0, r0, r4\n"
+ " ldr r1, ._25 + 8 @ gPlayerParty\n"
+ " add r0, r0, r1\n"
+ " mov r1, #0x2c\n"
+ " mul r1, r1, r4\n"
+ " add r1, r1, #0x34\n"
+ " add r1, r6, r1\n"
+ " bl sub_803AF78\n"
+ " add r4, r4, #0x1\n"
+ " cmp r4, #0x2\n"
+ " ble ._24 @cond_branch\n"
+ " add r0, r6, #0\n"
+ " bl SetEReaderTrainerChecksum\n"
+ " pop {r4, r5, r6}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._26:\n"
+ " .align 2, 0\n"
+ "._25:\n"
+ " .word gSaveBlock1\n"
+ " .word 0x2b28\n"
+ " .word gPlayerParty\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void unref_sub_8070F90()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._27 @ 0x801\n"
+ " bl FlagSet\n"
+ " mov r0, #0x80\n"
+ " lsl r0, r0, #0x4\n"
+ " bl FlagSet\n"
+ " ldr r0, ._27 + 4 @ 0x802\n"
+ " bl FlagSet\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._28:\n"
+ " .align 2, 0\n"
+ "._27:\n"
+ " .word 0x801\n"
+ " .word 0x802\n"
+ "\n"
+ );
+}
+#endif
static void BuildStartMenuActions(void)
{
@@ -193,8 +496,8 @@ static void BuildStartMenuActions_Link(void)
static void DisplaySafariBallsWindow(void)
{
sub_8072C44(gStringVar1, gNumSafariBalls, 12, 1);
- MenuDrawTextWindow(0, 0, 10, 5);
- MenuPrint(gOtherText_SafariStock, 1, 1);
+ Menu_DrawStdWindowFrame(0, 0, 10, 5);
+ Menu_PrintText(gOtherText_SafariStock, 1, 1);
}
//Prints n menu items starting at *index
@@ -204,7 +507,7 @@ static bool32 PrintStartMenuItemsMultistep(s16 *index, u32 n)
do
{
- MenuPrint(sStartMenuItems[sCurrentStartMenuActions[_index]].text, 23, 2 + _index * 2);
+ Menu_PrintText(sStartMenuItems[sCurrentStartMenuActions[_index]].text, 23, 2 + _index * 2);
_index++;
if (_index >= sNumStartMenuActions)
{
@@ -226,7 +529,7 @@ static bool32 InitStartMenuMultistep(s16 *step, s16 *index)
(*step)++;
break;
case 2:
- MenuDrawTextWindow(22, 0, 29, sNumStartMenuActions * 2 + 3);
+ Menu_DrawStdWindowFrame(22, 0, 29, sNumStartMenuActions * 2 + 3);
*index = 0;
(*step)++;
break;
@@ -271,7 +574,7 @@ void CreateStartMenuTask(void (*func)(u8))
{
u8 taskId;
- InitMenuWindow(&gWindowConfig_81E6CE4);
+ InitMenuWindow(&gWindowTemplate_81E6CE4);
taskId = CreateTask(Task_StartMenu, 0x50);
SetTaskFuncWithFollowupFunc(taskId, Task_StartMenu, func);
}
@@ -283,11 +586,11 @@ void sub_80712B4(u8 taskId)
switch (task->data[0])
{
case 0:
- gCallback_03004AE8 = StartMenu_InputProcessCallback;
+ gMenuCallback = StartMenu_InputProcessCallback;
task->data[0]++;
break;
case 1:
- if (gCallback_03004AE8() == 1)
+ if (gMenuCallback() == 1)
DestroyTask(taskId);
break;
}
@@ -310,12 +613,12 @@ static u8 StartMenu_InputProcessCallback(void)
if (gMain.newKeys & DPAD_UP)
{
PlaySE(SE_SELECT);
- sStartMenuCursorPos = MoveMenuCursor(-1);
+ sStartMenuCursorPos = Menu_MoveCursor(-1);
}
if (gMain.newKeys & DPAD_DOWN)
{
PlaySE(SE_SELECT);
- sStartMenuCursorPos = MoveMenuCursor(1);
+ sStartMenuCursorPos = Menu_MoveCursor(1);
}
if (gMain.newKeys & A_BUTTON)
{
@@ -325,11 +628,11 @@ static u8 StartMenu_InputProcessCallback(void)
if (GetNationalPokedexCount(0) == 0)
return 0;
}
- gCallback_03004AE8 = sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func;
- if (gCallback_03004AE8 != StartMenu_SaveCallback &&
- gCallback_03004AE8 != StartMenu_ExitCallback &&
- gCallback_03004AE8 != StartMenu_RetireCallback)
- fade_screen(1, 0);
+ gMenuCallback = sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func;
+ if (gMenuCallback != StartMenu_SaveCallback &&
+ gMenuCallback != StartMenu_ExitCallback &&
+ gMenuCallback != StartMenu_RetireCallback)
+ FadeScreen(1, 0);
return 0;
}
if (gMain.newKeys & (START_BUTTON | B_BUTTON))
@@ -345,7 +648,7 @@ static u8 StartMenu_PokedexCallback(void)
{
if (!gPaletteFade.active)
{
- IncrementGameStat(0x29);
+ IncrementGameStat(GAME_STAT_CHECKED_POKEDEX);
PlayRainSoundEffect();
SetMainCallback2(CB2_InitPokedex);
return 1;
@@ -395,7 +698,7 @@ static u8 StartMenu_PlayerCallback(void)
if (!gPaletteFade.active)
{
PlayRainSoundEffect();
- sub_8093110(sub_805469C);
+ TrainerCard_ShowPlayerCard(sub_805469C);
return 1;
}
return 0;
@@ -404,8 +707,8 @@ static u8 StartMenu_PlayerCallback(void)
//When player selects SAVE
static u8 StartMenu_SaveCallback(void)
{
- HandleDestroyMenuCursors();
- gCallback_03004AE8 = SaveCallback1;
+ Menu_DestroyCursor();
+ gMenuCallback = SaveCallback1;
return 0;
}
@@ -443,7 +746,7 @@ static u8 StartMenu_PlayerLinkCallback(void)
if (!gPaletteFade.active)
{
PlayRainSoundEffect();
- sub_8093130(gUnknown_03004860, sub_805469C);
+ TrainerCard_ShowLinkCard(gUnknown_03004860, sub_805469C);
return 1;
}
return 0;
@@ -461,7 +764,7 @@ enum
static u8 SaveCallback1(void)
{
sub_807160C();
- gCallback_03004AE8 = SaveCallback2;
+ gMenuCallback = SaveCallback2;
return FALSE;
}
@@ -473,13 +776,13 @@ static u8 SaveCallback2(void)
return FALSE;
case SAVE_CANCELED:
//Go back to start menu
- MenuZeroFillScreen();
+ Menu_EraseScreen();
InitStartMenu();
- gCallback_03004AE8 = StartMenu_InputProcessCallback;
+ gMenuCallback = StartMenu_InputProcessCallback;
return FALSE;
case SAVE_SUCCESS:
case SAVE_ERROR:
- MenuZeroFillScreen();
+ Menu_EraseScreen();
sub_8064E2C();
ScriptContext2_Disable();
return TRUE;
@@ -498,7 +801,7 @@ static u8 RunSaveDialogCallback(void)
{
if (savingComplete)
{
- if (!MenuUpdateWindowText())
+ if (!Menu_UpdateWindowText())
return 0;
}
savingComplete = FALSE;
@@ -514,7 +817,7 @@ void ScrSpecial_DoSaveDialog(void)
static void DisplaySaveMessageWithCallback(const u8 *ptr, u8 (*func)(void))
{
StringExpandPlaceholders(gStringVar4, ptr);
- MenuDisplayMessageBox();
+ Menu_DisplayDialogueFrame();
MenuPrintMessageDefaultCoords(gStringVar4);
savingComplete = TRUE;
saveDialogCallback = func;
@@ -547,7 +850,7 @@ static void sub_8071700(void)
static void HideSaveDialog(void)
{
- MenuZeroFillWindowRect(20, 8, 26, 13);
+ Menu_EraseWindowRect(20, 8, 26, 13);
}
static void SaveDialogStartTimeout(void)
@@ -579,7 +882,7 @@ static bool8 SaveDialogCheckForTimeoutAndKeypress(void)
static u8 SaveDialogCB_DisplayConfirmMessage(void)
{
- MenuZeroFillScreen();
+ Menu_EraseScreen();
HandleDrawSaveWindowInfo(0, 0);
DisplaySaveMessageWithCallback(gSaveText_WouldYouLikeToSave, SaveDialogCB_DisplayConfirmYesNoMenu);
return SAVE_IN_PROGRESS;
@@ -594,7 +897,7 @@ static u8 SaveDialogCB_DisplayConfirmYesNoMenu(void)
static u8 SaveDialogCB_ProcessConfirmYesNoMenu(void)
{
- switch (ProcessMenuInputNoWrap_())
+ switch (Menu_ProcessInputNoWrap_())
{
case 0: //YES
HideSaveDialog();
@@ -640,7 +943,7 @@ static u8 SaveDialogCB_DisplayOverwriteYesNoMenu(void)
static u8 SaveDialogCB_ProcessOverwriteYesNoMenu(void)
{
- switch (ProcessMenuInputNoWrap_())
+ switch (Menu_ProcessInputNoWrap_())
{
case 0: //YES
HideSaveDialog();
@@ -664,20 +967,20 @@ static u8 SaveDialogCB_DisplaySavingMessage(void)
static u8 SaveDialogCB_DoSave(void)
{
- bool8 saveSucceeded;
+ u8 saveStatus;
- IncrementGameStat(0);
+ IncrementGameStat(GAME_STAT_SAVED_GAME);
if (gDifferentSaveFile == TRUE)
{
- saveSucceeded = TrySavingData(DIFFERENT_FILE_SAVE);
+ saveStatus = Save_WriteData(SAVE_OVERWRITE_DIFFERENT_FILE);
gDifferentSaveFile = FALSE;
}
else
{
- saveSucceeded = TrySavingData(NORMAL_SAVE);
+ saveStatus = Save_WriteData(SAVE_NORMAL);
}
- if (saveSucceeded == TRUE)
+ if (saveStatus == SAVE_STATUS_OK)
{
//"(Player) saved the game."
DisplaySaveMessageWithCallback(gSaveText_PlayerSavedTheGame, SaveDialogCB_SaveSuccess);
@@ -694,7 +997,7 @@ static u8 SaveDialogCB_DoSave(void)
static u8 SaveDialogCB_SaveSuccess(void)
{
- if (MenuUpdateWindowText())
+ if (Menu_UpdateWindowText())
{
PlaySE(SE_SAVE);
saveDialogCallback = SaveDialogCB_ReturnSuccess;
@@ -715,7 +1018,7 @@ static u8 SaveDialogCB_ReturnSuccess(void)
static u8 SaveDialogCB_SaveError(void)
{
- if (MenuUpdateWindowText())
+ if (Menu_UpdateWindowText())
{
PlaySE(SE_BOO);
saveDialogCallback = SaveDialogCB_ReturnError;
@@ -744,38 +1047,21 @@ static bool32 sub_80719FC(u8 *step)
switch (*step)
{
case 0:
- {
- u8 *addr;
- u32 size;
-
REG_DISPCNT = 0;
SetVBlankCallback(NULL);
- remove_some_task();
+ ScanlineEffect_Stop();
DmaClear16(3, PLTT, PLTT_SIZE);
- addr = (void *)VRAM;
- size = 0x18000;
- while (1)
- {
- DmaFill16(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill16(3, 0, addr, size);
- break;
- }
- }
+ DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000);
break;
- }
case 1:
ResetSpriteData();
ResetTasks();
ResetPaletteFade();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
break;
case 2:
- SetUpWindowConfig(&gWindowConfig_81E6CE4);
- InitMenuWindow(&gWindowConfig_81E6CE4);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4);
+ InitMenuWindow(&gWindowTemplate_81E6CE4);
REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON;
break;
case 3:
@@ -821,8 +1107,8 @@ static void Task_8071B64(u8 taskId)
switch (*step)
{
case 0:
- MenuDisplayMessageBox();
- MenuPrint(gSystemText_Saving, 2, 15);
+ Menu_DisplayDialogueFrame();
+ Menu_PrintText(gSystemText_Saving, 2, 15);
BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
(*step)++;
break;
diff --git a/src/field/starter_choose.c b/src/field/starter_choose.c
index 701d4087a..418488774 100644
--- a/src/field/starter_choose.c
+++ b/src/field/starter_choose.c
@@ -14,7 +14,7 @@
#include "strings.h"
#include "task.h"
#include "trig.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
extern u16 gSpecialVar_Result;
extern struct SpriteTemplate gUnknown_02024E8C;
@@ -285,7 +285,7 @@ void CB2_ChooseStarter(void)
LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM);
LZ77UnCompVram(&gBirchBagTilemap, (void *)(VRAM + 0x3000));
LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800));
- remove_some_task();
+ ScanlineEffect_Stop();
ResetTasks();
ResetSpriteData();
ResetPaletteFade();
@@ -294,8 +294,8 @@ void CB2_ChooseStarter(void)
LoadCompressedObjectPic(&gUnknown_083F7794[0]);
LoadCompressedObjectPic(&gUnknown_083F77A4[0]);
LoadSpritePalettes(gUnknown_083F77B4);
- SetUpWindowConfig(&gWindowConfig_81E6C3C);
- InitMenuWindow(&gWindowConfig_81E6CE4);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C);
+ InitMenuWindow(&gWindowTemplate_81E6CE4);
BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
savedIme = REG_IME;
@@ -355,8 +355,8 @@ static void MainCallback2(void)
static void Task_StarterChoose1(u8 taskId)
{
CreateStarterPokemonLabel(0xFF, gTasks[taskId].tStarterSelection);
- MenuDrawTextWindow(2, 14, 27, 19);
- MenuPrint(gOtherText_BirchInTrouble, 3, 15);
+ Menu_DrawStdWindowFrame(2, 14, 27, 19);
+ Menu_PrintText(gOtherText_BirchInTrouble, 3, 15);
gTasks[taskId].func = Task_StarterChoose2;
}
@@ -368,7 +368,7 @@ static void Task_StarterChoose2(u8 taskId)
{
u8 spriteId;
- MenuZeroFillWindowRect(
+ Menu_EraseWindowRect(
gStarterChoose_LabelCoords[selection][0],
gStarterChoose_LabelCoords[selection][1],
gStarterChoose_LabelCoords[selection][0] + 13,
@@ -424,9 +424,9 @@ static void Task_StarterChoose3(u8 taskId)
static void Task_StarterChoose4(u8 taskId)
{
PlayCry1(GetStarterPokemon(gTasks[taskId].tStarterSelection), 0);
- MenuDrawTextWindow(2, 14, 27, 19);
+ Menu_DrawStdWindowFrame(2, 14, 27, 19);
//"Do you choose this POKEMON?"
- MenuPrint(gOtherText_DoYouChoosePoke, 3, 15);
+ Menu_PrintText(gOtherText_DoYouChoosePoke, 3, 15);
DisplayYesNoMenu(21, 7, 1);
gTasks[taskId].func = Task_StarterChoose5;
}
@@ -435,7 +435,7 @@ static void Task_StarterChoose5(u8 taskId)
{
u8 spriteId;
- switch (ProcessMenuInputNoWrap_())
+ switch (Menu_ProcessInputNoWrap_())
{
case 0: // YES
//Return the starter choice and exit.
@@ -445,7 +445,7 @@ static void Task_StarterChoose5(u8 taskId)
case 1: // NO
case -1: // B button
PlaySE(SE_SELECT);
- MenuZeroFillWindowRect(21, 7, 27, 12);
+ Menu_EraseWindowRect(21, 7, 27, 12);
spriteId = gTasks[taskId].tPkmnSpriteId;
FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[spriteId].oam.paletteNum));
@@ -498,7 +498,7 @@ static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection)
if (prevSelection != 0xFF)
{
//Remove the old Pokemon label
- MenuZeroFillWindowRect(
+ Menu_EraseWindowRect(
gStarterChoose_LabelCoords[prevSelection][0],
gStarterChoose_LabelCoords[prevSelection][1],
gStarterChoose_LabelCoords[prevSelection][0] + 13,
@@ -527,7 +527,7 @@ static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection)
//Copy POKEMON string to label
StringCopy(labelText + dstIndex, gOtherText_Poke);
- MenuPrint(
+ Menu_PrintText(
labelText,
gStarterChoose_LabelCoords[selection][0],
gStarterChoose_LabelCoords[selection][1]);
@@ -535,7 +535,7 @@ static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection)
//Copy Pokemon name to label
sub_8072C74(labelText + 5, gSpeciesNames[species], 0x6B, 1);
- MenuPrint(
+ Menu_PrintText(
labelText,
gStarterChoose_LabelCoords[selection][0],
gStarterChoose_LabelCoords[selection][1] + 2);
@@ -574,7 +574,7 @@ static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection)
adds r3, r1, 0x3\n\
lsls r3, 24\n\
lsrs r3, 24\n\
- bl MenuZeroFillWindowRect\n\
+ bl Menu_EraseWindowRect\n\
ldr r0, _0810A964 @ =0x04000040\n\
movs r1, 0\n\
strh r1, [r0]\n\
@@ -649,7 +649,7 @@ _0810A8CA:\n\
mov r0, sp\n\
adds r1, r4, 0\n\
adds r2, r5, 0\n\
- bl MenuPrint\n\
+ bl Menu_PrintText\n\
mov r0, sp\n\
movs r1, 0\n\
movs r2, 0xF\n\
@@ -669,7 +669,7 @@ _0810A8CA:\n\
lsrs r2, 24\n\
mov r0, sp\n\
adds r1, r4, 0\n\
- bl MenuPrint\n\
+ bl Menu_PrintText\n\
lsls r0, r4, 3\n\
adds r0, 0x4\n\
lsls r0, 24\n\
diff --git a/src/field/trader.c b/src/field/trader.c
index 61cb0b4a2..885557d5a 100644
--- a/src/field/trader.c
+++ b/src/field/trader.c
@@ -100,7 +100,7 @@ void CreateAvailableDecorationsMenu(u8 taskId)
}
}
- MenuDrawTextWindow(0, 1, 12, numChoices * 2 + 2);
+ Menu_DrawStdWindowFrame(0, 1, 12, numChoices * 2 + 2);
for (i = 0; i < 4; i++)
{
@@ -108,18 +108,18 @@ void CreateAvailableDecorationsMenu(u8 taskId)
{
if (trader->unk1[i] > DECOR_REGISTEEL_DOLL)
{
- MenuPrint(gOtherText_FiveQuestionsAndSlash, 1, numDecorations * 2 + 2);
+ Menu_PrintText(gOtherText_FiveQuestions, 1, numDecorations * 2 + 2);
}
else
{
- MenuPrint(gDecorations[trader->unk1[i]].name, 1, numDecorations * 2 + 2);
+ Menu_PrintText(gDecorations[trader->unk1[i]].name, 1, numDecorations * 2 + 2);
}
numDecorations++;
}
}
- MenuPrint(gOtherText_CancelNoTerminator, 1, numDecorations * 2 + 2);
+ Menu_PrintText(gOtherText_CancelNoTerminator, 1, numDecorations * 2 + 2);
InitMenu(0, 1, 2, numChoices, 0, 11);
gTasks[taskId].data[1] = numDecorations;
}
@@ -135,8 +135,8 @@ void sub_8109B34(u8 taskId, u8 decorationId)
gSpecialVar_0x8004 = decorationId;
}
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 1, 12, 12);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 1, 12, 12);
DestroyTask(taskId);
EnableBothScriptContexts();
}
@@ -148,17 +148,17 @@ void Task_HandleGetDecorationMenuInput(u8 taskId)
if (gMain.newKeys & DPAD_UP)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(-1);
+ Menu_MoveCursor(-1);
}
else if (gMain.newKeys & DPAD_DOWN)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(1);
+ Menu_MoveCursor(1);
}
else if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
- gSpecialVar_0x8005 = GetMenuCursorPos();
+ gSpecialVar_0x8005 = Menu_GetCursorPos();
if (gTasks[taskId].data[1] == gSpecialVar_0x8005)
{
sub_8109B34(taskId, 0);
@@ -215,10 +215,10 @@ void ScrSpecial_TraderMenuGiveDecoration(void)
void sub_8109D04(u8 taskId)
{
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 29, 19);
- DestroyVerticalScrollIndicator(0);
- DestroyVerticalScrollIndicator(1);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 29, 19);
+ DestroyVerticalScrollIndicator(TOP_ARROW);
+ DestroyVerticalScrollIndicator(BOTTOM_ARROW);
sub_80F9520(gUnknown_020388F7, 8);
BuyMenuFreeMemory();
if (sub_80FEFA4() == TRUE)
@@ -237,8 +237,8 @@ void sub_8109D04(u8 taskId)
void sub_8109DAC(u8 taskId)
{
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(0, 0, 29, 19);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 29, 19);
gSpecialVar_0x8006 = 0;
DestroyTask(taskId);
EnableBothScriptContexts();
diff --git a/src/field/tv.c b/src/field/tv.c
index d7a75a709..8bd36bb9c 100644
--- a/src/field/tv.c
+++ b/src/field/tv.c
@@ -47,8 +47,6 @@ struct UnkTvStruct
s8 var0;
};
-extern u8 gUnknown_0300430A[11];
-
struct OutbreakPokemon
{
/*0x00*/ u16 species;
@@ -64,7 +62,7 @@ struct TVSaleItem {
extern u8 gUnknown_02038694;
-extern struct TVSaleItem gUnknown_02038724[3];
+extern struct TVSaleItem gMartPurchaseHistory[3];
struct UnkTvStruct gUnknown_03005D38;
@@ -811,7 +809,7 @@ u8 sub_80BDEAC(u8 *a0)
return lang;
}
-void sub_80BDEC8(void)
+void PutPokemonTodayCaughtOnAir(void)
{
u8 i;
u16 total;
@@ -864,7 +862,7 @@ void sub_80BDEC8(void)
sub_80BE138((TVShow *)pokemonToday);
pokemonToday->language = GAME_LANGUAGE;
pokemonToday->language2 = sub_80BDEAC(pokemonToday->nickname);
- StripExtCtrlCodes(pokemonToday->nickname);
+ Text_StripExtCtrlCodes(pokemonToday->nickname);
}
}
}
@@ -966,7 +964,7 @@ void InterviewAfter_BravoTrainerPokemonProfile(void)
sub_80BE160((TVShow *)bravoTrainerNew);
bravoTrainerNew->language = GAME_LANGUAGE;
bravoTrainerNew->var1f = sub_80BDEAC(bravoTrainerNew->pokemonNickname);
- StripExtCtrlCodes(bravoTrainerNew->pokemonNickname);
+ Text_StripExtCtrlCodes(bravoTrainerNew->pokemonNickname);
}
}
@@ -1032,7 +1030,7 @@ void sub_80BE3BC(void)
if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_SMART_SHOPPER) != 1)
{
sub_80BF20C();
- if (gUnknown_02038724[0].item_amount >= 20)
+ if (gMartPurchaseHistory[0].item_amount >= 20)
{
struct TVShowSmartShopper *smartShopper = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].smartshopperShow;
@@ -1041,8 +1039,8 @@ void sub_80BE3BC(void)
smartShopper->shopLocation = gMapHeader.regionMapSectionId;
for (i=0; i<3; i++)
{
- smartShopper->itemIds[i] = gUnknown_02038724[i].item_id;
- smartShopper->itemAmounts[i] = gUnknown_02038724[i].item_amount;
+ smartShopper->itemIds[i] = gMartPurchaseHistory[i].item_id;
+ smartShopper->itemAmounts[i] = gMartPurchaseHistory[i].item_amount;
}
smartShopper->priceReduced = GetPriceReduction(1);
StringCopy(smartShopper->playerName, gSaveBlock2.playerName);
@@ -1075,7 +1073,7 @@ void sub_80BE478(void)
sub_80BE160((TVShow *)nameRaterShow);
nameRaterShow->language = GAME_LANGUAGE;
nameRaterShow->pokemonNameLanguage = sub_80BDEAC(nameRaterShow->pokemonName);
- StripExtCtrlCodes(nameRaterShow->pokemonName);
+ Text_StripExtCtrlCodes(nameRaterShow->pokemonName);
}
}
@@ -1138,7 +1136,7 @@ void InterviewAfter_PkmnFanClubOpinions(void)
sub_80BE160((TVShow *)fanclubOpinions);
fanclubOpinions->language = GAME_LANGUAGE;
fanclubOpinions->var0E = sub_80BDEAC(fanclubOpinions->var10);
- StripExtCtrlCodes(fanclubOpinions->var10);
+ Text_StripExtCtrlCodes(fanclubOpinions->var10);
}
void InterviewAfter_DummyShow4(void)
@@ -1646,14 +1644,14 @@ void sub_80BF20C(void)
{
for (j = i + 1; j < 3; j++)
{
- if (gUnknown_02038724[i].item_amount < gUnknown_02038724[j].item_amount)
+ if (gMartPurchaseHistory[i].item_amount < gMartPurchaseHistory[j].item_amount)
{
- tmpId = gUnknown_02038724[i].item_id;
- tmpAmount = gUnknown_02038724[i].item_amount;
- gUnknown_02038724[i].item_id = gUnknown_02038724[j].item_id;
- gUnknown_02038724[i].item_amount = gUnknown_02038724[j].item_amount;
- gUnknown_02038724[j].item_id = tmpId;
- gUnknown_02038724[j].item_amount = tmpAmount;
+ tmpId = gMartPurchaseHistory[i].item_id;
+ tmpAmount = gMartPurchaseHistory[i].item_amount;
+ gMartPurchaseHistory[i].item_id = gMartPurchaseHistory[j].item_id;
+ gMartPurchaseHistory[i].item_amount = gMartPurchaseHistory[j].item_amount;
+ gMartPurchaseHistory[j].item_id = tmpId;
+ gMartPurchaseHistory[j].item_amount = tmpAmount;
}
}
}
diff --git a/src/field/use_pokeblock.c b/src/field/use_pokeblock.c
index 7253ac901..8ea93aab8 100644
--- a/src/field/use_pokeblock.c
+++ b/src/field/use_pokeblock.c
@@ -104,7 +104,6 @@ static EWRAM_DATA struct Pokeblock *gUnknown_0203930C = NULL;
EWRAM_DATA u8 gPokeblockMonID = 0;
EWRAM_DATA s16 gPokeblockGain = 0;
-extern u16 gKeyRepeatStartDelay;
extern u16 gSpecialVar_ItemId; // FIXME: remove after merge of #349 Pokeblock
static void launch_c3_walk_stairs_and_run_once(void (*const)(void));
@@ -117,7 +116,7 @@ static void sub_81365A0(void);
static void sub_81365C8(void);
static void sub_8136638(void);
static void sub_81368A4(void);
-void sub_8089668(void);
+void ScanlineEffect_InitHBlankDmaTransfer(void);
static void sub_8136B44(void);
static u8 sub_81370E4(u8);
static void sub_8136BB8(void);
@@ -194,7 +193,7 @@ static void sub_8136264(void)
ProcessSpriteCopyRequests();
TransferPlttBuffer();
sub_80F5CDC(6);
- sub_8089668();
+ ScanlineEffect_InitHBlankDmaTransfer();
}
static void launch_c3_walk_stairs_and_run_once(void (*const func)(void))
@@ -228,11 +227,11 @@ static void sub_8136294(void)
gUnknown_02039304->unk50++;
break;
case 3:
- SetUpWindowConfig(&gWindowConfig_81E7080);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E7080);
gUnknown_02039304->unk50++;
break;
case 4:
- MultistepInitMenuWindowBegin(&gWindowConfig_81E7080);
+ MultistepInitMenuWindowBegin(&gWindowTemplate_81E7080);
gUnknown_02039304->unk50++;
break;
case 5:
@@ -610,28 +609,28 @@ static void sub_8136BB8(void)
GetMonData(&gPlayerParty[sub_81370A4(gUnknown_083DFEC4->unk87DC)], MON_DATA_NICKNAME, gUnknown_02039304->stringBuffer);
StringGetEnd10(gUnknown_02039304->stringBuffer);
StringAppend(gUnknown_02039304->stringBuffer, gOtherText_GetsAPokeBlock);
- BasicInitMenuWindow(&gWindowConfig_81E709C);
- MenuDrawTextWindow(0, 16, 29, 19);
- MenuPrint(gUnknown_02039304->stringBuffer, 1, 17);
+ BasicInitMenuWindow(&gWindowTemplate_81E709C);
+ Menu_DrawStdWindowFrame(0, 16, 29, 19);
+ Menu_PrintText(gUnknown_02039304->stringBuffer, 1, 17);
DisplayYesNoMenu(23, 10, 1);
- MoveMenuCursor(0);
+ Menu_MoveCursor(0);
}
static s8 sub_8136C40(void)
{
- s8 retval = ProcessMenuInputNoWrap();
+ s8 retval = Menu_ProcessInputNoWrap();
if ((u8)(retval + 1) < 3)
{
- MenuZeroFillScreen();
- BasicInitMenuWindow(&gWindowConfig_81E7080);
+ Menu_EraseScreen();
+ BasicInitMenuWindow(&gWindowTemplate_81E7080);
}
return retval;
}
static void sub_8136C6C(void)
{
- BasicInitMenuWindow(&gWindowConfig_81E709C);
- MenuDrawTextWindow(0, 16, 29, 19);
+ BasicInitMenuWindow(&gWindowTemplate_81E709C);
+ Menu_DrawStdWindowFrame(0, 16, 29, 19);
for (gUnknown_02039304->unk53 = 0; gUnknown_02039304->unk53 < 5 && gUnknown_02039304->unk61[gUnknown_02039304->unk53] == 0; gUnknown_02039304->unk53++);
if (gUnknown_02039304->unk53 < 5)
{
@@ -667,21 +666,21 @@ static bool8 sub_8136D00(void)
static void sub_8136D60(void)
{
- BasicInitMenuWindow(&gWindowConfig_81E709C);
- MenuDrawTextWindow(0, 16, 29, 19);
- MenuPrint(gOtherText_WontEat, 1, 17);
+ BasicInitMenuWindow(&gWindowTemplate_81E709C);
+ Menu_DrawStdWindowFrame(0, 16, 29, 19);
+ Menu_PrintText(gOtherText_WontEat, 1, 17);
}
static void sub_8136D8C(void)
{
- MenuZeroFillScreen();
- BasicInitMenuWindow(&gWindowConfig_81E7080);
+ Menu_EraseScreen();
+ BasicInitMenuWindow(&gWindowTemplate_81E7080);
}
static void Pokeblock_MenuWindowTextPrint(const u8 *message)
{
- MenuDrawTextWindow(0, 16, 29, 19);
- MenuPrint(message, 1, 17);
+ Menu_DrawStdWindowFrame(0, 16, 29, 19);
+ Menu_PrintText(message, 1, 17);
}
#ifdef NONMATCHING
diff --git a/src/field/wallclock.c b/src/field/wallclock.c
index 2892d09f9..1f743a61a 100644
--- a/src/field/wallclock.c
+++ b/src/field/wallclock.c
@@ -10,7 +10,7 @@
#include "strings2.h"
#include "task.h"
#include "trig.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
extern u16 gSpecialVar_0x8004;
extern u8 gMiscClock_Gfx[];
@@ -190,10 +190,7 @@ static void WallClockVblankCallback(void)
static void LoadWallClockGraphics(void)
{
- u8 *addr;
- u32 size;
-
- SetVBlankCallback(0);
+ SetVBlankCallback(NULL);
REG_DISPCNT = 0;
REG_BG3CNT = 0;
REG_BG2CNT = 0;
@@ -208,19 +205,7 @@ static void LoadWallClockGraphics(void)
REG_BG0HOFS = 0;
REG_BG0VOFS = 0;
- addr = (void *)VRAM;
- size = 0x18000;
- while (1)
- {
- DmaFill16(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill16(3, 0, addr, size);
- break;
- }
- }
+ DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000);
DmaClear32(3, OAM, OAM_SIZE);
DmaClear16(3, PLTT, PLTT_SIZE);
@@ -229,15 +214,15 @@ static void LoadWallClockGraphics(void)
LoadPalette(gMiscClockMale_Pal, 0, 32);
else
LoadPalette(gMiscClockFemale_Pal, 0, 32);
- remove_some_task();
+ ScanlineEffect_Stop();
ResetTasks();
ResetSpriteData();
ResetPaletteFade();
FreeAllSpritePalettes();
LoadCompressedObjectPic(&gUnknown_083F7A90[0]);
LoadSpritePalettes(gUnknown_083F7AA0);
- SetUpWindowConfig(&gWindowConfig_81E6C3C);
- InitMenuWindow(&gWindowConfig_81E6CE4);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C);
+ InitMenuWindow(&gWindowTemplate_81E6CE4);
}
static void WallClockInit(void)
@@ -414,10 +399,10 @@ static void Task_SetClock2(u8 taskId)
//Ask player "Is this the correct time?"
static void Task_SetClock3(u8 taskId)
{
- MenuDrawTextWindow(2, 16, 27, 19);
- MenuPrint(gOtherText_CorrectTimePrompt, 3, 17);
- MenuDrawTextWindow(23, 8, 29, 13);
- PrintMenuItems(24, 9, 2, gMenuYesNoItems);
+ Menu_DrawStdWindowFrame(2, 16, 27, 19);
+ Menu_PrintText(gOtherText_CorrectTimePrompt, 3, 17);
+ Menu_DrawStdWindowFrame(23, 8, 29, 13);
+ Menu_PrintItems(24, 9, 2, gMenuYesNoItems);
InitMenu(0, 24, 9, 2, 1, 5);
gTasks[taskId].func = Task_SetClock4;
}
@@ -425,7 +410,7 @@ static void Task_SetClock3(u8 taskId)
//Get menu selection
static void Task_SetClock4(u8 taskId)
{
- switch (ProcessMenuInputNoWrap_())
+ switch (Menu_ProcessInputNoWrap_())
{
case 0: //YES
PlaySE(SE_SELECT);
@@ -433,10 +418,10 @@ static void Task_SetClock4(u8 taskId)
return;
case -1: //B button
case 1: //NO
- HandleDestroyMenuCursors();
+ Menu_DestroyCursor();
PlaySE(SE_SELECT);
- MenuZeroFillWindowRect(23, 8, 29, 13);
- MenuZeroFillWindowRect(2, 16, 27, 19);
+ Menu_EraseWindowRect(23, 8, 29, 13);
+ Menu_EraseWindowRect(2, 16, 27, 19);
gTasks[taskId].func = Task_SetClock2; //Go back and let player adjust clock
}
}
diff --git a/src/field/wild_encounter.c b/src/field/wild_encounter.c
index 4bf83cad8..19778e29b 100644
--- a/src/field/wild_encounter.c
+++ b/src/field/wild_encounter.c
@@ -3698,13 +3698,13 @@ const u16 gRoute119WaterTileData[] =
extern u16 gSpecialVar_Result;
extern u8 S_RepelWoreOff[];
-EWRAM_DATA static u8 sWildEncountersDisabled = 0;
+EWRAM_DATA u8 sWildEncountersDisabled = 0;
EWRAM_DATA static u32 sFeebasRngValue = 0;
#define NUM_FEEBAS_SPOTS 6
-static u16 FeebasRandom(void);
-static void FeebasSeedRng(u16 seed);
+u16 FeebasRandom(void);
+void FeebasSeedRng(u16 seed);
static bool8 IsWildLevelAllowedByRepel(u8 level);
static void ApplyFluteEncounterRateMod(u32 *encRate);
@@ -3791,17 +3791,30 @@ static bool8 CheckFeebas(void)
return FALSE;
}
-static u16 FeebasRandom(void)
+u16 FeebasRandom(void)
{
sFeebasRngValue = 12345 + 0x41C64E6D * sFeebasRngValue;
return sFeebasRngValue >> 16;
}
-static void FeebasSeedRng(u16 seed)
+void FeebasSeedRng(u16 seed)
{
sFeebasRngValue = seed;
}
+#if DEBUG
+u16 debug_sub_8092344(u8 arg0)
+{
+ if (arg0 == 0)
+ return 131;
+ if (arg0 == 1)
+ return 167;
+ if (arg0 == 2)
+ return 149;
+ return 0;
+}
+#endif
+
static u8 ChooseWildMonIndex_Land(void)
{
u8 rand = Random() % 100;
@@ -4042,6 +4055,24 @@ static bool8 DoWildEncounterRateDiceRoll(u16 encounterRate)
return FALSE;
}
+#if DEBUG
+u16 debug_sub_809283C(u16 attempts)
+{
+ u16 retval = 0;
+ u16 i = 0;
+
+ while (i < attempts)
+ {
+ if (DoWildEncounterRateDiceRoll(320) == TRUE)
+ retval++;
+
+ i++;
+ }
+
+ return retval;
+}
+#endif
+
static bool8 DoWildEncounterTest(u32 encounterRate, bool8 ignoreAbility)
{
encounterRate *= 16;
@@ -4254,7 +4285,7 @@ void FishingWildEncounter(u8 rod)
gWildMonHeaders[GetCurrentMapWildMonHeader()].fishingMonsInfo,
rod);
}
- IncrementGameStat(12);
+ IncrementGameStat(GAME_STAT_FISHING_CAPTURES);
sub_80BEA50(species);
BattleSetup_StartWildBattle();
}