Merge branch 'master' into decompile_battle1
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
#include "item.h"
|
||||
#include "constants/items.h"
|
||||
#include "constants/hold_effects.h"
|
||||
#include "constants/trainers.h"
|
||||
#include "link.h"
|
||||
#include "bg.h"
|
||||
#include "dma3.h"
|
||||
@@ -38,7 +39,6 @@
|
||||
#include "pokedex.h"
|
||||
#include "constants/abilities.h"
|
||||
#include "constants/moves.h"
|
||||
#include "trainer_classes.h"
|
||||
#include "evolution_scene.h"
|
||||
#include "roamer.h"
|
||||
#include "tv.h"
|
||||
@@ -185,7 +185,7 @@ extern void sub_80356D0(void);
|
||||
extern void GetFrontierTrainerName(u8* dst, u16 trainerId); // battle tower
|
||||
extern void sub_8166188(void); // battle tower, sets link battle mons level but why?
|
||||
extern void sub_8165B88(u8* dst, u16 trainerId); // battle tower, gets language
|
||||
extern void sub_81DB4DC(u8* dst, u8 arg2); //
|
||||
extern void PadNameString(u8* dst, u8 arg2); //
|
||||
extern void sub_81B9150(void);
|
||||
extern void sub_800AC34(void);
|
||||
extern void sub_80B3AF8(u8 taskId); // cable club
|
||||
@@ -415,7 +415,7 @@ static void CB2_InitBattleInternal(void)
|
||||
|
||||
gBattleTerrain = BattleSetup_GetTerrainId();
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
|
||||
gBattleTerrain = BATTLE_TERRAIN_INSIDE;
|
||||
gBattleTerrain = BATTLE_TERRAIN_BUILDING;
|
||||
|
||||
sub_80356D0();
|
||||
LoadBattleTextboxAndBackground();
|
||||
@@ -1140,7 +1140,7 @@ static void sub_80379F8(u8 arrayIdPlus)
|
||||
gUnknown_02022FF8[i].gender = GetMonGender(&gPlayerParty[arrayIdPlus + i]);
|
||||
StripExtCtrlCodes(gUnknown_02022FF8[i].nickname);
|
||||
if (GetMonData(&gPlayerParty[arrayIdPlus + i], MON_DATA_LANGUAGE) != LANGUAGE_JAPANESE)
|
||||
sub_81DB4DC(gUnknown_02022FF8[i].nickname, 0);
|
||||
PadNameString(gUnknown_02022FF8[i].nickname, CHAR_SPACE);
|
||||
}
|
||||
memcpy(gUnknown_02023058, gUnknown_02022FF8, sizeof(gUnknown_02022FF8));
|
||||
}
|
||||
@@ -1718,7 +1718,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
|
||||
{
|
||||
const struct TrainerMonNoItemDefaultMoves *partyData = gTrainers[trainerNum].party.NoItemDefaultMoves;
|
||||
|
||||
for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
|
||||
for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++)
|
||||
nameHash += gSpeciesNames[partyData[i].species][j];
|
||||
|
||||
personalityValue += nameHash << 8;
|
||||
@@ -1726,11 +1726,11 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
|
||||
CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);
|
||||
break;
|
||||
}
|
||||
case PARTY_FLAG_CUSTOM_MOVES:
|
||||
case F_TRAINER_PARTY_CUSTOM_MOVESET:
|
||||
{
|
||||
const struct TrainerMonNoItemCustomMoves *partyData = gTrainers[trainerNum].party.NoItemCustomMoves;
|
||||
|
||||
for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
|
||||
for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++)
|
||||
nameHash += gSpeciesNames[partyData[i].species][j];
|
||||
|
||||
personalityValue += nameHash << 8;
|
||||
@@ -1744,11 +1744,11 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PARTY_FLAG_HAS_ITEM:
|
||||
case F_TRAINER_PARTY_HELD_ITEM:
|
||||
{
|
||||
const struct TrainerMonItemDefaultMoves *partyData = gTrainers[trainerNum].party.ItemDefaultMoves;
|
||||
|
||||
for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
|
||||
for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++)
|
||||
nameHash += gSpeciesNames[partyData[i].species][j];
|
||||
|
||||
personalityValue += nameHash << 8;
|
||||
@@ -1758,11 +1758,11 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
|
||||
SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem);
|
||||
break;
|
||||
}
|
||||
case PARTY_FLAG_CUSTOM_MOVES | PARTY_FLAG_HAS_ITEM:
|
||||
case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM:
|
||||
{
|
||||
const struct TrainerMonItemCustomMoves *partyData = gTrainers[trainerNum].party.ItemCustomMoves;
|
||||
|
||||
for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
|
||||
for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++)
|
||||
nameHash += gSpeciesNames[partyData[i].species][j];
|
||||
|
||||
personalityValue += nameHash << 8;
|
||||
@@ -4749,19 +4749,19 @@ static void HandleEndTurn_BattleWon(void)
|
||||
|
||||
switch (gTrainers[gTrainerBattleOpponent_A].trainerClass)
|
||||
{
|
||||
case CLASS_ELITE_FOUR:
|
||||
case CLASS_CHAMPION:
|
||||
case TRAINER_CLASS_ELITE_FOUR:
|
||||
case TRAINER_CLASS_CHAMPION:
|
||||
PlayBGM(BGM_KACHI5);
|
||||
break;
|
||||
case CLASS_TEAM_AQUA:
|
||||
case CLASS_TEAM_MAGMA:
|
||||
case CLASS_AQUA_ADMIN:
|
||||
case CLASS_AQUA_LEADER:
|
||||
case CLASS_MAGMA_ADMIN:
|
||||
case CLASS_MAGMA_LEADER:
|
||||
case TRAINER_CLASS_TEAM_AQUA:
|
||||
case TRAINER_CLASS_TEAM_MAGMA:
|
||||
case TRAINER_CLASS_AQUA_ADMIN:
|
||||
case TRAINER_CLASS_AQUA_LEADER:
|
||||
case TRAINER_CLASS_MAGMA_ADMIN:
|
||||
case TRAINER_CLASS_MAGMA_LEADER:
|
||||
PlayBGM(BGM_KACHI4);
|
||||
break;
|
||||
case CLASS_LEADER:
|
||||
case TRAINER_CLASS_LEADER:
|
||||
PlayBGM(BGM_KACHI3);
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include "window.h"
|
||||
#include "palette.h"
|
||||
#include "battle_controllers.h"
|
||||
#include "battle_setup.h"
|
||||
|
||||
extern u16 gLastUsedItem;
|
||||
extern u8 gLastUsedAbility;
|
||||
@@ -54,8 +55,6 @@ extern void sub_81D5554(u8 *txtPtr, u16 trainerId); // pokenav
|
||||
extern void GetEreaderTrainerName(u8 *txtPtr);
|
||||
extern void sub_81A36D0(u8 arg0, u16 trainerId); // battle_frontier_2
|
||||
extern void sub_81D572C(u8 arg0, u16 trainerId); // pokenav
|
||||
extern const u8* GetTrainer1LoseText(void); // battle_setup
|
||||
extern const u8* GetTrainer2LoseText(void); // battle_setup
|
||||
extern void GetFrontierTrainerName(u8 *dst, u16 trainerId);
|
||||
extern s32 GetStringCenterAlignXOffsetWithLetterSpacing(u8 fontId, const u8 *str, s32 totalWidth, s16 letterSpacing);
|
||||
extern u8 GetTextSpeedInRecordedBattle(void);
|
||||
@@ -2068,7 +2067,7 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
|
||||
}
|
||||
else
|
||||
{
|
||||
toCpy = GetTrainer1LoseText();
|
||||
toCpy = GetTrainerALoseText();
|
||||
}
|
||||
break;
|
||||
case B_TXT_TRAINER1_WIN_TEXT: // trainerA win text
|
||||
@@ -2165,7 +2164,7 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
|
||||
}
|
||||
else
|
||||
{
|
||||
toCpy = GetTrainer2LoseText();
|
||||
toCpy = GetTrainerBLoseText();
|
||||
}
|
||||
break;
|
||||
case B_TXT_TRAINER2_WIN_TEXT:
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "battle_interface.h"
|
||||
#include "constants/species.h"
|
||||
#include "constants/songs.h"
|
||||
#include "constants/trainers.h"
|
||||
#include "text.h"
|
||||
#include "sound.h"
|
||||
#include "pokedex.h"
|
||||
@@ -6236,19 +6237,19 @@ static u32 GetTrainerMoneyToGive(u16 trainerId)
|
||||
lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl;
|
||||
}
|
||||
break;
|
||||
case PARTY_FLAG_CUSTOM_MOVES:
|
||||
case F_TRAINER_PARTY_CUSTOM_MOVESET:
|
||||
{
|
||||
const struct TrainerMonNoItemCustomMoves *party = gTrainers[trainerId].party.NoItemCustomMoves;
|
||||
lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl;
|
||||
}
|
||||
break;
|
||||
case PARTY_FLAG_HAS_ITEM:
|
||||
case F_TRAINER_PARTY_HELD_ITEM:
|
||||
{
|
||||
const struct TrainerMonItemDefaultMoves *party = gTrainers[trainerId].party.ItemDefaultMoves;
|
||||
lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl;
|
||||
}
|
||||
break;
|
||||
case PARTY_FLAG_CUSTOM_MOVES | PARTY_FLAG_HAS_ITEM:
|
||||
case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM:
|
||||
{
|
||||
const struct TrainerMonItemCustomMoves *party = gTrainers[trainerId].party.ItemCustomMoves;
|
||||
lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl;
|
||||
@@ -10334,7 +10335,7 @@ static void atkE4_getsecretpowereffect(void)
|
||||
case BATTLE_TERRAIN_POND:
|
||||
gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_SPD_MINUS_1;
|
||||
break;
|
||||
case BATTLE_TERRAIN_ROCK:
|
||||
case BATTLE_TERRAIN_MOUNTAIN:
|
||||
gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_CONFUSION;
|
||||
break;
|
||||
case BATTLE_TERRAIN_CAVE:
|
||||
|
||||
1884
src/battle_setup.c
Normal file
1884
src/battle_setup.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -2444,7 +2444,7 @@ static void CB2_HandleBlenderEndGame(void)
|
||||
sBerryBlenderData->gameEndState++;
|
||||
break;
|
||||
case 10:
|
||||
switch (sub_8198C58())
|
||||
switch (ProcessMenuInputNoWrap_())
|
||||
{
|
||||
case 1:
|
||||
case -1:
|
||||
|
||||
@@ -88,7 +88,7 @@ static void Task_DoClearSaveDataScreenYesNo(u8 taskId)
|
||||
|
||||
static void Task_ClearSaveDataScreenYesNoChoice(u8 taskId)
|
||||
{
|
||||
switch(sub_8198C58())
|
||||
switch(ProcessMenuInputNoWrap_())
|
||||
{
|
||||
case 0:
|
||||
FillWindowPixelBuffer(0, 17);
|
||||
|
||||
93
src/clock.c
Normal file
93
src/clock.c
Normal file
@@ -0,0 +1,93 @@
|
||||
#include "global.h"
|
||||
#include "rom6.h"
|
||||
#include "event_data.h"
|
||||
#include "rtc.h"
|
||||
#include "lottery_corner.h"
|
||||
#include "dewford_trend.h"
|
||||
#include "tv.h"
|
||||
#include "field_screen.h"
|
||||
#include "berry.h"
|
||||
#include "main.h"
|
||||
#include "overworld.h"
|
||||
#include "wallclock.h"
|
||||
|
||||
// static types
|
||||
|
||||
// static declarations
|
||||
|
||||
static void UpdatePerDay(struct Time *localTime);
|
||||
static void UpdatePerMinute(struct Time *localTime);
|
||||
|
||||
// rodata
|
||||
|
||||
// text
|
||||
|
||||
static void InitTimeBasedEvents(void)
|
||||
{
|
||||
FlagSet(FLAG_SYS_CLOCK_SET);
|
||||
RtcCalcLocalTime();
|
||||
gSaveBlock2Ptr->lastBerryTreeUpdate = gLocalTime;
|
||||
VarSet(VAR_DAYS, gLocalTime.days);
|
||||
}
|
||||
|
||||
void DoTimeBasedEvents(void)
|
||||
{
|
||||
if (FlagGet(FLAG_SYS_CLOCK_SET) && !sub_813B9C0())
|
||||
{
|
||||
RtcCalcLocalTime();
|
||||
UpdatePerDay(&gLocalTime);
|
||||
UpdatePerMinute(&gLocalTime);
|
||||
}
|
||||
}
|
||||
|
||||
static void UpdatePerDay(struct Time *localTime)
|
||||
{
|
||||
u16 *days = GetVarPointer(VAR_DAYS);
|
||||
u16 daysSince;
|
||||
|
||||
if (*days != localTime->days && *days <= localTime->days)
|
||||
{
|
||||
daysSince = localTime->days - *days;
|
||||
ClearUpperFlags();
|
||||
UpdateDewfordTrendPerDay(daysSince);
|
||||
UpdateTVShowsPerDay(daysSince);
|
||||
UpdateWeatherPerDay(daysSince);
|
||||
UpdatePartyPokerusTime(daysSince);
|
||||
UpdateMirageRnd(daysSince);
|
||||
UpdateBirchState(daysSince);
|
||||
UpdateFrontierManiac(daysSince);
|
||||
UpdateFrontierGambler(daysSince);
|
||||
SetShoalItemFlag(daysSince);
|
||||
SetRandomLotteryNumber(daysSince);
|
||||
*days = localTime->days;
|
||||
}
|
||||
}
|
||||
|
||||
static void UpdatePerMinute(struct Time *localTime)
|
||||
{
|
||||
struct Time difference;
|
||||
int minutes;
|
||||
|
||||
CalcTimeDifference(&difference, &gSaveBlock2Ptr->lastBerryTreeUpdate, localTime);
|
||||
minutes = 24 * 60 * difference.days + 60 * difference.hours + difference.minutes;
|
||||
if (minutes != 0)
|
||||
{
|
||||
if (minutes >= 0)
|
||||
{
|
||||
BerryTreeTimeUpdate(minutes);
|
||||
gSaveBlock2Ptr->lastBerryTreeUpdate = *localTime;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void ReturnFromStartWallClock(void)
|
||||
{
|
||||
InitTimeBasedEvents();
|
||||
SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
|
||||
}
|
||||
|
||||
void StartWallClock(void)
|
||||
{
|
||||
SetMainCallback2(Cb2_StartWallClock);
|
||||
gMain.savedCallback = ReturnFromStartWallClock;
|
||||
}
|
||||
@@ -58,7 +58,7 @@ extern const u8 gText_HatchedFromEgg[];
|
||||
extern const u8 gText_NickHatchPrompt[];
|
||||
|
||||
extern u8 sav1_map_get_name(void);
|
||||
extern s8 sub_8198C58(void);
|
||||
extern s8 ProcessMenuInputNoWrap_(void);
|
||||
extern void TVShowConvertInternationalString(u8* str1, u8* str2, u8);
|
||||
extern void sub_806A068(u16, u8);
|
||||
extern void fade_screen(u8, u8);
|
||||
@@ -669,7 +669,7 @@ static void CB2_EggHatch_1(void)
|
||||
}
|
||||
break;
|
||||
case 10:
|
||||
switch (sub_8198C58())
|
||||
switch (ProcessMenuInputNoWrap_())
|
||||
{
|
||||
case 0:
|
||||
GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar3);
|
||||
|
||||
@@ -1168,7 +1168,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
switch (sub_8198C58())
|
||||
switch (ProcessMenuInputNoWrap_())
|
||||
{
|
||||
case 0:
|
||||
sEvoCursorPos = 0;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "global.h"
|
||||
#include "global.h"
|
||||
#include "gba/flash_internal.h"
|
||||
#include "load_save.h"
|
||||
#include "main.h"
|
||||
@@ -28,7 +28,7 @@ struct LoadedSaveData
|
||||
/*0x00F0*/ struct ItemSlot pokeBalls[16];
|
||||
/*0x0130*/ struct ItemSlot TMsHMs[64];
|
||||
/*0x0230*/ struct ItemSlot berries[46];
|
||||
/*0x02E8*/ struct MailStruct mail[16];
|
||||
/*0x02E8*/ struct MailStruct mail[MAIL_COUNT];
|
||||
};
|
||||
|
||||
EWRAM_DATA struct SaveBlock2 gSaveblock2 = {0};
|
||||
@@ -330,7 +330,7 @@ void LoadSerializedGame(void)
|
||||
void copy_bags_and_unk_data_from_save_blocks(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
// load player items.
|
||||
for (i = 0; i < 30; i++)
|
||||
gLoadedSaveData.items[i] = gSaveBlock1Ptr->bagPocket_Items[i];
|
||||
|
||||
414
src/mail.c
414
src/mail.c
@@ -1,4 +1,5 @@
|
||||
#include "global.h"
|
||||
#include "mail.h"
|
||||
#include "constants/items.h"
|
||||
#include "main.h"
|
||||
#include "overworld.h"
|
||||
@@ -18,117 +19,6 @@
|
||||
#include "constants/species.h"
|
||||
#include "malloc.h"
|
||||
#include "easy_chat.h"
|
||||
#include "mail_data.h"
|
||||
#include "mail.h"
|
||||
|
||||
// Static type declarations
|
||||
|
||||
struct UnkMailStruct
|
||||
{
|
||||
u32 numEasyChatWords:2;
|
||||
u32 xOffset:6;
|
||||
u32 lineHeight:8;
|
||||
};
|
||||
|
||||
struct MailLayout
|
||||
{
|
||||
u8 numSubStructs;
|
||||
u8 signatureYPos;
|
||||
u8 signatureWidth;
|
||||
u8 wordsXPos;
|
||||
u8 wordsYPos;
|
||||
const struct UnkMailStruct *var8;
|
||||
};
|
||||
|
||||
struct MailGraphics
|
||||
{
|
||||
const u16 *palette;
|
||||
const u8 *tiles;
|
||||
const u8 *tileMap;
|
||||
u16 var0C;
|
||||
u16 var0E;
|
||||
u16 color10;
|
||||
u16 color12;
|
||||
};
|
||||
|
||||
// Static RAM declarations
|
||||
|
||||
static EWRAM_DATA struct
|
||||
{
|
||||
/*0x0000*/ u8 strbuf[8][64];
|
||||
/*0x0200*/ u8 playerName[12];
|
||||
/*0x020C*/ MainCallback callback;
|
||||
/*0x0210*/ MainCallback callback2;
|
||||
/*0x0214*/ struct MailStruct *mail;
|
||||
/*0x0218*/ bool8 flag;
|
||||
/*0x0219*/ u8 signatureWidth;
|
||||
/*0x021a*/ u8 mailType;
|
||||
/*0x021b*/ u8 animsActive;
|
||||
/*0x021c*/ u8 monIconSprite;
|
||||
/*0x021d*/ u8 language;
|
||||
/*0x021e*/ bool8 playerIsSender;
|
||||
/*0x0220*/ void (*parserSingle)(u8 *dest, u16 word);
|
||||
/*0x0224*/ void (*parserMultiple)(u8 *dest, const u16 *src, u16 length1, u16 length2);
|
||||
/*0x0228*/ const struct MailLayout *layout;
|
||||
/*0x022c*/ u8 bg1TilemapBuffer[0x1000];
|
||||
/*0x122c*/ u8 bg2TilemapBuffer[0x1000];
|
||||
} *gUnknown_0203A134 = NULL;
|
||||
|
||||
// Static ROM declarations
|
||||
|
||||
void sub_81219F0(void);
|
||||
void sub_8121A1C(void);
|
||||
void sub_8121B1C(void);
|
||||
void sub_8121C50(void);
|
||||
void sub_8121C64(void);
|
||||
void sub_8121C98(void);
|
||||
void sub_8121CC0(void);
|
||||
void sub_8121D00(void);
|
||||
|
||||
// .rodata
|
||||
|
||||
const struct BgTemplate gUnknown_0859F290[] = {
|
||||
{
|
||||
.bg = 0,
|
||||
.charBaseIndex = 2,
|
||||
.mapBaseIndex = 31,
|
||||
.priority = 0
|
||||
}, {
|
||||
.bg = 1,
|
||||
.charBaseIndex = 0,
|
||||
.mapBaseIndex = 30,
|
||||
.priority = 1
|
||||
}, {
|
||||
.bg = 2,
|
||||
.charBaseIndex = 0,
|
||||
.mapBaseIndex = 29,
|
||||
.priority = 2
|
||||
}
|
||||
};
|
||||
|
||||
const struct WindowTemplate gUnknown_0859F29C[] = {
|
||||
{
|
||||
.priority = 0,
|
||||
.tilemapLeft = 2,
|
||||
.tilemapTop = 3,
|
||||
.width = 26,
|
||||
.height = 15,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 1
|
||||
},
|
||||
DUMMY_WIN_TEMPLATE
|
||||
};
|
||||
|
||||
const u8 gUnknown_0859F2AC[] = {
|
||||
0,
|
||||
10,
|
||||
11
|
||||
};
|
||||
|
||||
const u16 gUnknown_0859F2B0[][2] = {
|
||||
{ 0x6ACD, 0x51A5 },
|
||||
{ 0x45FC, 0x38D4 }
|
||||
};
|
||||
|
||||
extern const u16 gUnknown_08DBE818[];
|
||||
extern const u16 gUnknown_08DBE838[];
|
||||
@@ -167,7 +57,118 @@ extern const u8 gUnknown_08DC04E8[];
|
||||
extern const u8 gUnknown_08DBF904[];
|
||||
extern const u8 gUnknown_08DC0600[];
|
||||
|
||||
const struct MailGraphics gUnknown_0859F2B8[] = {
|
||||
// Static type declarations
|
||||
|
||||
struct UnkMailStruct
|
||||
{
|
||||
u32 numEasyChatWords:2;
|
||||
u32 xOffset:6;
|
||||
u32 lineHeight:8;
|
||||
};
|
||||
|
||||
struct MailLayout
|
||||
{
|
||||
u8 numSubStructs;
|
||||
u8 signatureYPos;
|
||||
u8 signatureWidth;
|
||||
u8 wordsXPos;
|
||||
u8 wordsYPos;
|
||||
const struct UnkMailStruct *var8;
|
||||
};
|
||||
|
||||
struct MailGraphics
|
||||
{
|
||||
const u16 *palette;
|
||||
const u8 *tiles;
|
||||
const u8 *tileMap;
|
||||
u16 var0C;
|
||||
u16 var0E;
|
||||
u16 color10;
|
||||
u16 color12;
|
||||
};
|
||||
|
||||
struct MailRead
|
||||
{
|
||||
/*0x0000*/ u8 strbuf[8][64];
|
||||
/*0x0200*/ u8 playerName[12];
|
||||
/*0x020C*/ MainCallback callback;
|
||||
/*0x0210*/ MainCallback callback2;
|
||||
/*0x0214*/ struct MailStruct *mail;
|
||||
/*0x0218*/ bool8 flag;
|
||||
/*0x0219*/ u8 signatureWidth;
|
||||
/*0x021a*/ u8 mailType;
|
||||
/*0x021b*/ u8 animsActive;
|
||||
/*0x021c*/ u8 monIconSprite;
|
||||
/*0x021d*/ u8 language;
|
||||
/*0x021e*/ bool8 playerIsSender;
|
||||
/*0x0220*/ void (*parserSingle)(u8 *dest, u16 word);
|
||||
/*0x0224*/ void (*parserMultiple)(u8 *dest, const u16 *src, u16 length1, u16 length2);
|
||||
/*0x0228*/ const struct MailLayout *layout;
|
||||
/*0x022c*/ u8 bg1TilemapBuffer[0x1000];
|
||||
/*0x122c*/ u8 bg2TilemapBuffer[0x1000];
|
||||
};
|
||||
|
||||
// Static RAM declarations
|
||||
|
||||
static EWRAM_DATA struct MailRead *sMailRead = NULL;
|
||||
|
||||
// Static ROM declarations
|
||||
|
||||
static void CB2_InitMailRead(void);
|
||||
static void sub_8121A1C(void);
|
||||
static void sub_8121B1C(void);
|
||||
static void VBlankCB_MailRead(void);
|
||||
static void CB2_MailRead(void);
|
||||
static void CB2_WaitForPaletteExitOnKeyPress(void);
|
||||
static void CB2_ExitOnKeyPress(void);
|
||||
static void CB2_ExitMailReadFreeVars(void);
|
||||
|
||||
// .rodata
|
||||
|
||||
static const struct BgTemplate sUnknown_0859F290[] = {
|
||||
{
|
||||
.bg = 0,
|
||||
.charBaseIndex = 2,
|
||||
.mapBaseIndex = 31,
|
||||
.priority = 0
|
||||
}, {
|
||||
.bg = 1,
|
||||
.charBaseIndex = 0,
|
||||
.mapBaseIndex = 30,
|
||||
.priority = 1
|
||||
}, {
|
||||
.bg = 2,
|
||||
.charBaseIndex = 0,
|
||||
.mapBaseIndex = 29,
|
||||
.priority = 2
|
||||
}
|
||||
};
|
||||
|
||||
static const struct WindowTemplate sUnknown_0859F29C[] = {
|
||||
{
|
||||
.priority = 0,
|
||||
.tilemapLeft = 2,
|
||||
.tilemapTop = 3,
|
||||
.width = 26,
|
||||
.height = 15,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 1
|
||||
},
|
||||
DUMMY_WIN_TEMPLATE
|
||||
};
|
||||
|
||||
static const u8 sUnknown_0859F2AC[] = {
|
||||
0,
|
||||
10,
|
||||
11
|
||||
};
|
||||
|
||||
static const u16 sUnknown_0859F2B0[][2] = {
|
||||
{ 0x6ACD, 0x51A5 },
|
||||
{ 0x45FC, 0x38D4 }
|
||||
};
|
||||
|
||||
static const struct MailGraphics sUnknown_0859F2B8[] = {
|
||||
{
|
||||
gUnknown_08DBE818, gUnknown_08DBE998, gUnknown_08DBFBA4, 0x02c0, 0x0000, 0x294a, 0x6739
|
||||
}, {
|
||||
@@ -195,13 +196,13 @@ const struct MailGraphics gUnknown_0859F2B8[] = {
|
||||
}
|
||||
};
|
||||
|
||||
const struct UnkMailStruct Unknown_0859F3A8[] = {
|
||||
static const struct UnkMailStruct Unknown_0859F3A8[] = {
|
||||
{ .numEasyChatWords = 3, .lineHeight = 16 },
|
||||
{ .numEasyChatWords = 3, .lineHeight = 16 },
|
||||
{ .numEasyChatWords = 3, .lineHeight = 16 }
|
||||
};
|
||||
|
||||
const struct MailLayout gUnknown_0859F3B4[] = {
|
||||
static const struct MailLayout sUnknown_0859F3B4[] = {
|
||||
{ 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 },
|
||||
{ 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 },
|
||||
{ 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 },
|
||||
@@ -216,7 +217,7 @@ const struct MailLayout gUnknown_0859F3B4[] = {
|
||||
{ 0x03, 0x00, 0x00, 0x02, 0x00, Unknown_0859F3A8 }
|
||||
};
|
||||
|
||||
const struct UnkMailStruct Unknown_0859F444[] = {
|
||||
static const struct UnkMailStruct Unknown_0859F444[] = {
|
||||
{ .numEasyChatWords = 2, .lineHeight = 16 },
|
||||
{ .numEasyChatWords = 2, .lineHeight = 16 },
|
||||
{ .numEasyChatWords = 2, .lineHeight = 16 },
|
||||
@@ -224,7 +225,7 @@ const struct UnkMailStruct Unknown_0859F444[] = {
|
||||
{ .numEasyChatWords = 1, .lineHeight = 16 }
|
||||
};
|
||||
|
||||
const struct MailLayout gUnknown_0859F458[] = {
|
||||
static const struct MailLayout sUnknown_0859F458[] = {
|
||||
{ 0x05, 0x07, 0x58, 0x0b, 0x1e, Unknown_0859F444 },
|
||||
{ 0x05, 0x0a, 0x60, 0x09, 0x1e, Unknown_0859F444 },
|
||||
{ 0x05, 0x0c, 0x68, 0x05, 0x1e, Unknown_0859F444 },
|
||||
@@ -241,23 +242,23 @@ const struct MailLayout gUnknown_0859F458[] = {
|
||||
|
||||
// What the heck are these meant to be? Call them u16 for now.
|
||||
|
||||
const u16 Unknown_0859F4E8[] = {
|
||||
static const u16 Unknown_0859F4E8[] = {
|
||||
0x00, 0x4000, 0x00, 0x00
|
||||
};
|
||||
|
||||
const u16 Unknown_0859F4F0[] = {
|
||||
static const u16 Unknown_0859F4F0[] = {
|
||||
0x00, 0x00, -1, 0x00
|
||||
};
|
||||
|
||||
const u16 Unknown_0859F4F8[] = {
|
||||
static const u16 Unknown_0859F4F8[] = {
|
||||
0x04, 0x00, -1, 0x00
|
||||
};
|
||||
|
||||
const u16 Unknown_0859F500[] = {
|
||||
static const u16 Unknown_0859F500[] = {
|
||||
0x00, 0x40, -1, 0x00
|
||||
};
|
||||
|
||||
const u16 *const gUnknown_0859F508[] = {
|
||||
static const u16 *const sUnknown_0859F508[] = {
|
||||
Unknown_0859F4F0,
|
||||
Unknown_0859F4F8,
|
||||
Unknown_0859F500
|
||||
@@ -265,60 +266,62 @@ const u16 *const gUnknown_0859F508[] = {
|
||||
|
||||
// .text
|
||||
|
||||
void sub_8121478(struct MailStruct *mail, MainCallback callback, bool8 flag) {
|
||||
void ReadMail(struct MailStruct *mail, void (*callback)(void), bool8 flag)
|
||||
{
|
||||
u16 buffer[2];
|
||||
u16 species;
|
||||
|
||||
gUnknown_0203A134 = calloc(1, sizeof(*gUnknown_0203A134));
|
||||
gUnknown_0203A134->language = LANGUAGE_ENGLISH;
|
||||
gUnknown_0203A134->playerIsSender = TRUE;
|
||||
gUnknown_0203A134->parserSingle = CopyEasyChatWord;
|
||||
gUnknown_0203A134->parserMultiple = ConvertEasyChatWordsToString;
|
||||
if (mail->itemId >= ITEM_ORANGE_MAIL && mail->itemId <= ITEM_RETRO_MAIL) {
|
||||
gUnknown_0203A134->mailType = mail->itemId - ITEM_ORANGE_MAIL;
|
||||
sMailRead = calloc(1, sizeof(*sMailRead));
|
||||
sMailRead->language = LANGUAGE_ENGLISH;
|
||||
sMailRead->playerIsSender = TRUE;
|
||||
sMailRead->parserSingle = CopyEasyChatWord;
|
||||
sMailRead->parserMultiple = ConvertEasyChatWordsToString;
|
||||
if (IS_ITEM_MAIL(mail->itemId))
|
||||
{
|
||||
sMailRead->mailType = mail->itemId - ITEM_ORANGE_MAIL;
|
||||
}
|
||||
else
|
||||
{
|
||||
gUnknown_0203A134->mailType = 0;
|
||||
sMailRead->mailType = 0;
|
||||
flag = FALSE;
|
||||
}
|
||||
switch (gUnknown_0203A134->playerIsSender)
|
||||
switch (sMailRead->playerIsSender)
|
||||
{
|
||||
case FALSE:
|
||||
default:
|
||||
gUnknown_0203A134->layout = &gUnknown_0859F3B4[gUnknown_0203A134->mailType];
|
||||
sMailRead->layout = &sUnknown_0859F3B4[sMailRead->mailType];
|
||||
break;
|
||||
case TRUE:
|
||||
gUnknown_0203A134->layout = &gUnknown_0859F458[gUnknown_0203A134->mailType];
|
||||
sMailRead->layout = &sUnknown_0859F458[sMailRead->mailType];
|
||||
break;
|
||||
}
|
||||
species = sub_80D45E8(mail->species, buffer);
|
||||
species = MailSpeciesToSpecies(mail->species, buffer);
|
||||
if (species >= SPECIES_BULBASAUR && species < NUM_SPECIES)
|
||||
{
|
||||
switch (gUnknown_0203A134->mailType)
|
||||
switch (sMailRead->mailType)
|
||||
{
|
||||
default:
|
||||
gUnknown_0203A134->animsActive = 0;
|
||||
sMailRead->animsActive = 0;
|
||||
break;
|
||||
case ITEM_BEAD_MAIL - ITEM_ORANGE_MAIL:
|
||||
gUnknown_0203A134->animsActive = 1;
|
||||
sMailRead->animsActive = 1;
|
||||
break;
|
||||
case ITEM_DREAM_MAIL - ITEM_ORANGE_MAIL:
|
||||
gUnknown_0203A134->animsActive = 2;
|
||||
sMailRead->animsActive = 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
gUnknown_0203A134->animsActive = 0;
|
||||
sMailRead->animsActive = 0;
|
||||
}
|
||||
gUnknown_0203A134->mail = mail;
|
||||
gUnknown_0203A134->callback = callback;
|
||||
gUnknown_0203A134->flag = flag;
|
||||
SetMainCallback2(sub_81219F0);
|
||||
sMailRead->mail = mail;
|
||||
sMailRead->callback = callback;
|
||||
sMailRead->flag = flag;
|
||||
SetMainCallback2(CB2_InitMailRead);
|
||||
}
|
||||
|
||||
bool8 sub_81215EC(void)
|
||||
static bool8 MailReadBuildGraphics(void)
|
||||
{
|
||||
u16 icon;
|
||||
|
||||
@@ -352,21 +355,21 @@ bool8 sub_81215EC(void)
|
||||
SetGpuReg(REG_OFFSET_BG2HOFS, 0x0000);
|
||||
SetGpuReg(REG_OFFSET_BG3HOFS, 0x0000);
|
||||
SetGpuReg(REG_OFFSET_BG3VOFS, 0x0000);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0x0000);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0x0000);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0x0000);
|
||||
break;
|
||||
case 6:
|
||||
ResetBgsAndClearDma3BusyFlags(0);
|
||||
InitBgsFromTemplates(0, gUnknown_0859F290, 3);
|
||||
SetBgTilemapBuffer(1, gUnknown_0203A134->bg1TilemapBuffer);
|
||||
SetBgTilemapBuffer(2, gUnknown_0203A134->bg2TilemapBuffer);
|
||||
InitBgsFromTemplates(0, sUnknown_0859F290, 3);
|
||||
SetBgTilemapBuffer(1, sMailRead->bg1TilemapBuffer);
|
||||
SetBgTilemapBuffer(2, sMailRead->bg2TilemapBuffer);
|
||||
break;
|
||||
case 7:
|
||||
InitWindows(gUnknown_0859F29C);
|
||||
InitWindows(sUnknown_0859F29C);
|
||||
DeactivateAllTextPrinters();
|
||||
break;
|
||||
case 8:
|
||||
decompress_and_copy_tile_data_to_vram(1, gUnknown_0859F2B8[gUnknown_0203A134->mailType].tiles, 0, 0, 0);
|
||||
decompress_and_copy_tile_data_to_vram(1, sUnknown_0859F2B8[sMailRead->mailType].tiles, 0, 0, 0);
|
||||
break;
|
||||
case 9:
|
||||
if (free_temp_tile_data_buffers_if_possible())
|
||||
@@ -377,7 +380,7 @@ bool8 sub_81215EC(void)
|
||||
case 10:
|
||||
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(2, 1, 0, 0, 30, 20);
|
||||
CopyToBgTilemapBuffer(1, gUnknown_0859F2B8[gUnknown_0203A134->mailType].tileMap, 0, 0);
|
||||
CopyToBgTilemapBuffer(1, sUnknown_0859F2B8[sMailRead->mailType].tileMap, 0, 0);
|
||||
break;
|
||||
case 11:
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
@@ -386,24 +389,24 @@ bool8 sub_81215EC(void)
|
||||
break;
|
||||
case 12:
|
||||
LoadPalette(GetOverworldTextboxPalettePtr(), 240, 32);
|
||||
gPlttBufferUnfaded[250] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color10;
|
||||
gPlttBufferFaded[250] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color10;
|
||||
gPlttBufferUnfaded[251] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color12;
|
||||
gPlttBufferFaded[251] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color12;
|
||||
LoadPalette(gUnknown_0859F2B8[gUnknown_0203A134->mailType].palette, 0, 32);
|
||||
gPlttBufferUnfaded[10] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0];
|
||||
gPlttBufferFaded[10] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0];
|
||||
gPlttBufferUnfaded[11] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1];
|
||||
gPlttBufferFaded[11] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1];
|
||||
gPlttBufferUnfaded[250] = sUnknown_0859F2B8[sMailRead->mailType].color10;
|
||||
gPlttBufferFaded[250] = sUnknown_0859F2B8[sMailRead->mailType].color10;
|
||||
gPlttBufferUnfaded[251] = sUnknown_0859F2B8[sMailRead->mailType].color12;
|
||||
gPlttBufferFaded[251] = sUnknown_0859F2B8[sMailRead->mailType].color12;
|
||||
LoadPalette(sUnknown_0859F2B8[sMailRead->mailType].palette, 0, 32);
|
||||
gPlttBufferUnfaded[10] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0];
|
||||
gPlttBufferFaded[10] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0];
|
||||
gPlttBufferUnfaded[11] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1];
|
||||
gPlttBufferFaded[11] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1];
|
||||
break;
|
||||
case 13:
|
||||
if (gUnknown_0203A134->flag)
|
||||
if (sMailRead->flag)
|
||||
{
|
||||
sub_8121A1C();
|
||||
}
|
||||
break;
|
||||
case 14:
|
||||
if (gUnknown_0203A134->flag)
|
||||
if (sMailRead->flag)
|
||||
{
|
||||
sub_8121B1C();
|
||||
RunTextPrinters();
|
||||
@@ -416,20 +419,20 @@ bool8 sub_81215EC(void)
|
||||
}
|
||||
break;
|
||||
case 16:
|
||||
SetVBlankCallback(sub_8121C50);
|
||||
SetVBlankCallback(VBlankCB_MailRead);
|
||||
gPaletteFade.bufferTransferDisabled = TRUE;
|
||||
break;
|
||||
case 17:
|
||||
icon = sub_80D2E84(gUnknown_0203A134->mail->species);
|
||||
switch (gUnknown_0203A134->animsActive)
|
||||
icon = sub_80D2E84(sMailRead->mail->species);
|
||||
switch (sMailRead->animsActive)
|
||||
{
|
||||
case 1:
|
||||
sub_80D2F68(icon);
|
||||
gUnknown_0203A134->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x60, 0x80, 0, 0);
|
||||
sMailRead->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x60, 0x80, 0, 0);
|
||||
break;
|
||||
case 2:
|
||||
sub_80D2F68(icon);
|
||||
gUnknown_0203A134->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x28, 0x80, 0, 0);
|
||||
sMailRead->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x28, 0x80, 0, 0);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -440,53 +443,53 @@ bool8 sub_81215EC(void)
|
||||
ShowBg(2);
|
||||
BeginNormalPaletteFade(-1, 0, 16, 0, 0);
|
||||
gPaletteFade.bufferTransferDisabled = FALSE;
|
||||
gUnknown_0203A134->callback2 = sub_8121C98;
|
||||
sMailRead->callback2 = CB2_WaitForPaletteExitOnKeyPress;
|
||||
return TRUE;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
gMain.state ++;
|
||||
gMain.state++;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void sub_81219F0(void)
|
||||
static void CB2_InitMailRead(void)
|
||||
{
|
||||
do
|
||||
{
|
||||
if (sub_81215EC() == TRUE)
|
||||
if (MailReadBuildGraphics() == TRUE)
|
||||
{
|
||||
SetMainCallback2(sub_8121C64);
|
||||
SetMainCallback2(CB2_MailRead);
|
||||
break;
|
||||
}
|
||||
} while (sub_81221AC() != TRUE);
|
||||
}
|
||||
|
||||
void sub_8121A1C(void)
|
||||
static void sub_8121A1C(void)
|
||||
{
|
||||
u16 i;
|
||||
u8 total;
|
||||
u8 *ptr;
|
||||
|
||||
total = 0;
|
||||
for (i = 0; i < gUnknown_0203A134->layout->numSubStructs; i ++)
|
||||
for (i = 0; i < sMailRead->layout->numSubStructs; i ++)
|
||||
{
|
||||
ConvertEasyChatWordsToString(gUnknown_0203A134->strbuf[i], &gUnknown_0203A134->mail->words[total], gUnknown_0203A134->layout->var8[i].numEasyChatWords, 1);
|
||||
total += gUnknown_0203A134->layout->var8[i].numEasyChatWords;
|
||||
ConvertEasyChatWordsToString(sMailRead->strbuf[i], &sMailRead->mail->words[total], sMailRead->layout->var8[i].numEasyChatWords, 1);
|
||||
total += sMailRead->layout->var8[i].numEasyChatWords;
|
||||
}
|
||||
ptr = StringCopy(gUnknown_0203A134->playerName, gUnknown_0203A134->mail->playerName);
|
||||
if (!gUnknown_0203A134->playerIsSender)
|
||||
ptr = StringCopy(sMailRead->playerName, sMailRead->mail->playerName);
|
||||
if (!sMailRead->playerIsSender)
|
||||
{
|
||||
StringCopy(ptr, gText_FromSpace);
|
||||
gUnknown_0203A134->signatureWidth = gUnknown_0203A134->layout->signatureWidth - (StringLength(gUnknown_0203A134->playerName) * 8 - 0x60);
|
||||
sMailRead->signatureWidth = sMailRead->layout->signatureWidth - (StringLength(sMailRead->playerName) * 8 - 0x60);
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_81DB52C(gUnknown_0203A134->playerName);
|
||||
gUnknown_0203A134->signatureWidth = gUnknown_0203A134->layout->signatureWidth;
|
||||
sub_81DB52C(sMailRead->playerName);
|
||||
sMailRead->signatureWidth = sMailRead->layout->signatureWidth;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8121B1C(void)
|
||||
static void sub_8121B1C(void)
|
||||
{
|
||||
u16 i;
|
||||
u8 strbuf[0x20];
|
||||
@@ -500,77 +503,76 @@ void sub_8121B1C(void)
|
||||
PutWindowTilemap(1);
|
||||
FillWindowPixelBuffer(0, 0);
|
||||
FillWindowPixelBuffer(1, 0);
|
||||
for (i = 0; i < gUnknown_0203A134->layout->numSubStructs; i ++)
|
||||
for (i = 0; i < sMailRead->layout->numSubStructs; i ++)
|
||||
{
|
||||
if (gUnknown_0203A134->strbuf[i][0] == EOS || gUnknown_0203A134->strbuf[i][0] == CHAR_SPACE)
|
||||
if (sMailRead->strbuf[i][0] == EOS || sMailRead->strbuf[i][0] == CHAR_SPACE)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
box_print(0, 1, gUnknown_0203A134->layout->var8[i].xOffset + gUnknown_0203A134->layout->wordsYPos, y + gUnknown_0203A134->layout->wordsXPos, gUnknown_0859F2AC, 0, gUnknown_0203A134->strbuf[i]);
|
||||
y += gUnknown_0203A134->layout->var8[i].lineHeight;
|
||||
box_print(0, 1, sMailRead->layout->var8[i].xOffset + sMailRead->layout->wordsYPos, y + sMailRead->layout->wordsXPos, sUnknown_0859F2AC, 0, sMailRead->strbuf[i]);
|
||||
y += sMailRead->layout->var8[i].lineHeight;
|
||||
}
|
||||
bufptr = StringCopy(strbuf, gText_FromSpace);
|
||||
StringCopy(bufptr, gUnknown_0203A134->playerName);
|
||||
box_x = GetStringCenterAlignXOffset(1, strbuf, gUnknown_0203A134->signatureWidth) + 0x68;
|
||||
box_y = gUnknown_0203A134->layout->signatureYPos + 0x58;
|
||||
box_print(0, 1, box_x, box_y, gUnknown_0859F2AC, 0, strbuf);
|
||||
StringCopy(bufptr, sMailRead->playerName);
|
||||
box_x = GetStringCenterAlignXOffset(1, strbuf, sMailRead->signatureWidth) + 0x68;
|
||||
box_y = sMailRead->layout->signatureYPos + 0x58;
|
||||
box_print(0, 1, box_x, box_y, sUnknown_0859F2AC, 0, strbuf);
|
||||
CopyWindowToVram(0, 3);
|
||||
CopyWindowToVram(1, 3);
|
||||
}
|
||||
|
||||
void sub_8121C50(void)
|
||||
static void VBlankCB_MailRead(void)
|
||||
{
|
||||
LoadOam();
|
||||
ProcessSpriteCopyRequests();
|
||||
TransferPlttBuffer();
|
||||
}
|
||||
|
||||
void sub_8121C64(void)
|
||||
static void CB2_MailRead(void)
|
||||
{
|
||||
if (gUnknown_0203A134->animsActive != 0)
|
||||
if (sMailRead->animsActive != 0)
|
||||
{
|
||||
AnimateSprites();
|
||||
BuildOamBuffer();
|
||||
}
|
||||
gUnknown_0203A134->callback2();
|
||||
sMailRead->callback2();
|
||||
}
|
||||
|
||||
void sub_8121C98(void)
|
||||
static void CB2_WaitForPaletteExitOnKeyPress(void)
|
||||
{
|
||||
if (!UpdatePaletteFade())
|
||||
{
|
||||
gUnknown_0203A134->callback2 = sub_8121CC0;
|
||||
sMailRead->callback2 = CB2_ExitOnKeyPress;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8121CC0(void)
|
||||
static void CB2_ExitOnKeyPress(void)
|
||||
{
|
||||
if (gMain.newKeys & (A_BUTTON | B_BUTTON))
|
||||
{
|
||||
BeginNormalPaletteFade(-1, 0, 0, 16, 0);
|
||||
gUnknown_0203A134->callback2 = sub_8121D00;
|
||||
sMailRead->callback2 = CB2_ExitMailReadFreeVars;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8121D00(void)
|
||||
static void CB2_ExitMailReadFreeVars(void)
|
||||
{
|
||||
if (!UpdatePaletteFade())
|
||||
{
|
||||
SetMainCallback2(gUnknown_0203A134->callback);
|
||||
switch (gUnknown_0203A134->animsActive)
|
||||
SetMainCallback2(sMailRead->callback);
|
||||
switch (sMailRead->animsActive)
|
||||
{
|
||||
case 1:
|
||||
case 2:
|
||||
sub_80D2FF0(sub_80D2E84(gUnknown_0203A134->mail->species));
|
||||
sub_80D2EF8(&gSprites[gUnknown_0203A134->monIconSprite]);
|
||||
sub_80D2FF0(sub_80D2E84(sMailRead->mail->species));
|
||||
sub_80D2EF8(&gSprites[sMailRead->monIconSprite]);
|
||||
}
|
||||
memset(gUnknown_0203A134, 0, sizeof(*gUnknown_0203A134));
|
||||
memset(sMailRead, 0, sizeof(*sMailRead));
|
||||
ResetPaletteFade();
|
||||
UnsetBgTilemapBuffer(0);
|
||||
UnsetBgTilemapBuffer(1);
|
||||
ResetBgsAndClearDma3BusyFlags(0);
|
||||
FreeAllWindowBuffers();
|
||||
free(gUnknown_0203A134);
|
||||
gUnknown_0203A134 = NULL;
|
||||
FREE_AND_SET_NULL(sMailRead);
|
||||
}
|
||||
}
|
||||
|
||||
203
src/mail_data.c
Normal file
203
src/mail_data.c
Normal file
@@ -0,0 +1,203 @@
|
||||
#include "global.h"
|
||||
#include "mail.h"
|
||||
#include "constants/items.h"
|
||||
#include "pokemon.h"
|
||||
#include "pokemon_icon.h"
|
||||
#include "constants/species.h"
|
||||
#include "text.h"
|
||||
#include "international_string_util.h"
|
||||
|
||||
void ClearMailData(void)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
for (i = 0; i < MAIL_COUNT; i++)
|
||||
ClearMailStruct(&gSaveBlock1Ptr->mail[i]);
|
||||
}
|
||||
|
||||
void ClearMailStruct(struct MailStruct *mail)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < MAIL_WORDS_COUNT; i++)
|
||||
mail->words[i] = 0xFFFF;
|
||||
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH; i++)
|
||||
mail->playerName[i] = EOS;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
mail->trainerId[i] = 0;
|
||||
|
||||
mail->species = SPECIES_BULBASAUR;
|
||||
mail->itemId = ITEM_NONE;
|
||||
}
|
||||
|
||||
bool8 MonHasMail(struct Pokemon *mon)
|
||||
{
|
||||
u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM);
|
||||
if (ItemIsMail(heldItem) && GetMonData(mon, MON_DATA_MAIL) != 0xFF)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
u8 GiveMailToMon(struct Pokemon *mon, u16 itemId)
|
||||
{
|
||||
u8 heldItem[2];
|
||||
u8 id, i;
|
||||
u16 species;
|
||||
u32 personality;
|
||||
|
||||
heldItem[0] = itemId;
|
||||
heldItem[1] = itemId >> 8;
|
||||
|
||||
for (id = 0; id < PARTY_SIZE; id++)
|
||||
{
|
||||
if (gSaveBlock1Ptr->mail[id].itemId == 0)
|
||||
{
|
||||
for (i = 0; i < MAIL_WORDS_COUNT; i++)
|
||||
gSaveBlock1Ptr->mail[id].words[i] = 0xFFFF;
|
||||
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH - 1; i++)
|
||||
gSaveBlock1Ptr->mail[id].playerName[i] = gSaveBlock2Ptr->playerName[i];
|
||||
gSaveBlock1Ptr->mail[id].playerName[i] = EOS;
|
||||
PadNameString(gSaveBlock1Ptr->mail[id].playerName, CHAR_SPACE);
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
gSaveBlock1Ptr->mail[id].trainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
|
||||
|
||||
species = GetBoxMonData(&mon->box, MON_DATA_SPECIES);
|
||||
personality = GetBoxMonData(&mon->box, MON_DATA_PERSONALITY);
|
||||
gSaveBlock1Ptr->mail[id].species = SpeciesToMailSpecies(species, personality);
|
||||
gSaveBlock1Ptr->mail[id].itemId = itemId;
|
||||
SetMonData(mon, MON_DATA_MAIL, &id);
|
||||
SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);
|
||||
return id;
|
||||
}
|
||||
}
|
||||
|
||||
return 0xFF;
|
||||
}
|
||||
|
||||
u16 SpeciesToMailSpecies(u16 species, u32 personality)
|
||||
{
|
||||
if (species == SPECIES_UNOWN)
|
||||
{
|
||||
u32 species = GetUnownLetterByPersonality(personality) + 30000;
|
||||
return species;
|
||||
}
|
||||
|
||||
return species;
|
||||
}
|
||||
|
||||
u16 MailSpeciesToSpecies(u16 mailSpecies, u16 *buffer)
|
||||
{
|
||||
u16 result;
|
||||
|
||||
if (mailSpecies >= 30000 && mailSpecies < (30000 + UNOWN_FORM_COUNT))
|
||||
{
|
||||
result = SPECIES_UNOWN;
|
||||
*buffer = mailSpecies - 30000;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = mailSpecies;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
u8 GiveMailToMon2(struct Pokemon *mon, struct MailStruct *mail)
|
||||
{
|
||||
u8 heldItem[2];
|
||||
u16 itemId = mail->itemId;
|
||||
u8 mailId = GiveMailToMon(mon, itemId);
|
||||
|
||||
if (mailId == 0xFF)
|
||||
return 0xFF;
|
||||
|
||||
gSaveBlock1Ptr->mail[mailId] = *mail;
|
||||
|
||||
SetMonData(mon, MON_DATA_MAIL, &mailId);
|
||||
|
||||
heldItem[0] = itemId;
|
||||
heldItem[1] = itemId >> 8;
|
||||
|
||||
SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);
|
||||
|
||||
return mailId;
|
||||
}
|
||||
|
||||
static bool32 DummyMailFunc(void)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void TakeMailFromMon(struct Pokemon *mon)
|
||||
{
|
||||
u8 heldItem[2];
|
||||
u8 mailId;
|
||||
|
||||
if (MonHasMail(mon))
|
||||
{
|
||||
mailId = GetMonData(mon, MON_DATA_MAIL);
|
||||
gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE;
|
||||
mailId = 0xFF;
|
||||
heldItem[0] = ITEM_NONE;
|
||||
heldItem[1] = ITEM_NONE << 8;
|
||||
SetMonData(mon, MON_DATA_MAIL, &mailId);
|
||||
SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);
|
||||
}
|
||||
}
|
||||
|
||||
void ClearMailItemId(u8 mailId)
|
||||
{
|
||||
gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE;
|
||||
}
|
||||
|
||||
u8 TakeMailFromMon2(struct Pokemon *mon)
|
||||
{
|
||||
u8 i;
|
||||
u8 newHeldItem[2];
|
||||
u8 newMailId;
|
||||
|
||||
newHeldItem[0] = ITEM_NONE;
|
||||
newHeldItem[1] = ITEM_NONE << 8;
|
||||
newMailId = 0xFF;
|
||||
|
||||
for (i = PARTY_SIZE; i < MAIL_COUNT; i++)
|
||||
{
|
||||
if (gSaveBlock1Ptr->mail[i].itemId == ITEM_NONE)
|
||||
{
|
||||
memcpy(&gSaveBlock1Ptr->mail[i], &gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)], sizeof(struct MailStruct));
|
||||
gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)].itemId = ITEM_NONE;
|
||||
SetMonData(mon, MON_DATA_MAIL, &newMailId);
|
||||
SetMonData(mon, MON_DATA_HELD_ITEM, newHeldItem);
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return 0xFF;
|
||||
}
|
||||
|
||||
bool8 ItemIsMail(u16 itemId)
|
||||
{
|
||||
switch (itemId)
|
||||
{
|
||||
case ITEM_ORANGE_MAIL:
|
||||
case ITEM_HARBOR_MAIL:
|
||||
case ITEM_GLITTER_MAIL:
|
||||
case ITEM_MECH_MAIL:
|
||||
case ITEM_WOOD_MAIL:
|
||||
case ITEM_WAVE_MAIL:
|
||||
case ITEM_BEAD_MAIL:
|
||||
case ITEM_SHADOW_MAIL:
|
||||
case ITEM_TROPIC_MAIL:
|
||||
case ITEM_DREAM_MAIL:
|
||||
case ITEM_FAB_MAIL:
|
||||
case ITEM_RETRO_MAIL:
|
||||
return TRUE;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
@@ -1155,7 +1155,7 @@ u8 GetMonsStateToDoubles_2(void)
|
||||
s32 aliveCount = 0;
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < 6; i++)
|
||||
for (i = 0; i < PARTY_SIZE; i++)
|
||||
{
|
||||
u32 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL);
|
||||
if (species != SPECIES_EGG && species != SPECIES_NONE
|
||||
|
||||
@@ -11,8 +11,7 @@
|
||||
#include "link.h"
|
||||
#include "constants/hold_effects.h"
|
||||
#include "random.h"
|
||||
#include "trainer_classes.h"
|
||||
#include "trainer_ids.h"
|
||||
#include "constants/trainers.h"
|
||||
#include "constants/songs.h"
|
||||
#include "sound.h"
|
||||
#include "m4a.h"
|
||||
@@ -692,9 +691,9 @@ void AdjustFriendship(struct Pokemon *mon, u8 event)
|
||||
if ((event != 5 || !(Random() & 1))
|
||||
&& (event != 3
|
||||
|| ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)
|
||||
&& (gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_ELITE_FOUR
|
||||
|| gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_LEADER
|
||||
|| gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_CHAMPION))))
|
||||
&& (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR
|
||||
|| gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER
|
||||
|| gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION))))
|
||||
{
|
||||
s8 mod = gUnknown_08329ECE[event][friendshipLevel];
|
||||
if (mod > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP)
|
||||
@@ -1146,55 +1145,57 @@ void ClearBattleMonForms(void)
|
||||
u16 GetBattleBGM(void)
|
||||
{
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON)
|
||||
return 0x1E0;
|
||||
return BGM_BATTLE34;
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_REGI)
|
||||
return 0x1DF;
|
||||
return BGM_BATTLE36;
|
||||
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
|
||||
return 0x1DC;
|
||||
return BGM_BATTLE20;
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
|
||||
{
|
||||
u8 trainerClass;
|
||||
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
|
||||
trainerClass = GetFrontierOpponentClass(gTrainerBattleOpponent_A);
|
||||
else if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
|
||||
trainerClass = CLASS_EXPERT;
|
||||
trainerClass = TRAINER_CLASS_EXPERT;
|
||||
else
|
||||
trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
|
||||
|
||||
switch (trainerClass)
|
||||
{
|
||||
case CLASS_AQUA_LEADER:
|
||||
case CLASS_MAGMA_LEADER:
|
||||
return 0x1E3;
|
||||
case CLASS_TEAM_AQUA:
|
||||
case CLASS_TEAM_MAGMA:
|
||||
case CLASS_AQUA_ADMIN:
|
||||
case CLASS_MAGMA_ADMIN:
|
||||
return 0x1DB;
|
||||
case CLASS_LEADER:
|
||||
return 0x1DD;
|
||||
case CLASS_CHAMPION:
|
||||
return 0x1DE;
|
||||
case CLASS_PKMN_TRAINER_RIVAL:
|
||||
case TRAINER_CLASS_AQUA_LEADER:
|
||||
case TRAINER_CLASS_MAGMA_LEADER:
|
||||
return BGM_BATTLE30;
|
||||
case TRAINER_CLASS_TEAM_AQUA:
|
||||
case TRAINER_CLASS_TEAM_MAGMA:
|
||||
case TRAINER_CLASS_AQUA_ADMIN:
|
||||
case TRAINER_CLASS_MAGMA_ADMIN:
|
||||
return BGM_BATTLE31;
|
||||
case TRAINER_CLASS_LEADER:
|
||||
return BGM_BATTLE32;
|
||||
case TRAINER_CLASS_CHAMPION:
|
||||
return BGM_BATTLE33;
|
||||
case TRAINER_CLASS_PKMN_TRAINER_3:
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
|
||||
return 0x1E1;
|
||||
return BGM_BATTLE35;
|
||||
if (!StringCompare(gTrainers[gTrainerBattleOpponent_A].trainerName, gText_BattleWallyName))
|
||||
return 0x1DC;
|
||||
return 0x1E1;
|
||||
case CLASS_ELITE_FOUR:
|
||||
return 0x1E2;
|
||||
case CLASS_SALON_MAIDEN:
|
||||
case CLASS_DOME_ACE:
|
||||
case CLASS_PALACE_MAVEN:
|
||||
case CLASS_ARENA_TYCOON:
|
||||
case CLASS_FACTORY_HEAD:
|
||||
case CLASS_PIKE_QUEEN:
|
||||
case CLASS_PYRAMID_KING:
|
||||
return 0x1D7;
|
||||
return BGM_BATTLE20;
|
||||
return BGM_BATTLE35;
|
||||
case TRAINER_CLASS_ELITE_FOUR:
|
||||
return BGM_BATTLE38;
|
||||
case TRAINER_CLASS_SALON_MAIDEN:
|
||||
case TRAINER_CLASS_DOME_ACE:
|
||||
case TRAINER_CLASS_PALACE_MAVEN:
|
||||
case TRAINER_CLASS_ARENA_TYCOON:
|
||||
case TRAINER_CLASS_FACTORY_HEAD:
|
||||
case TRAINER_CLASS_PIKE_QUEEN:
|
||||
case TRAINER_CLASS_PYRAMID_KING:
|
||||
return BGM_BATTLE_FRONTIER_BRAIN;
|
||||
default:
|
||||
return 0x1DC;
|
||||
return BGM_BATTLE20;
|
||||
}
|
||||
}
|
||||
return 0x1DA;
|
||||
return BGM_BATTLE27;
|
||||
}
|
||||
|
||||
void PlayBattleBGM(void)
|
||||
@@ -1396,7 +1397,7 @@ static s32 GetWildMonTableIdInAlteringCave(u16 species)
|
||||
|
||||
void SetWildMonHeldItem(void)
|
||||
{
|
||||
if (!(gBattleTypeFlags & (BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER | BATTLE_TYPE_PYRAMID | BATTLE_TYPE_x100000)))
|
||||
if (!(gBattleTypeFlags & (BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER | BATTLE_TYPE_PYRAMID | BATTLE_TYPE_PIKE)))
|
||||
{
|
||||
u16 rnd = Random() % 100;
|
||||
u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0);
|
||||
@@ -1462,12 +1463,14 @@ bool8 IsShinyOtIdPersonality(u32 otId, u32 personality)
|
||||
return retVal;
|
||||
}
|
||||
|
||||
const u8* GetTrainerPartnerName(void)
|
||||
const u8 *GetTrainerPartnerName(void)
|
||||
{
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
|
||||
{
|
||||
if (gPartnerTrainerId == STEVEN_PARTNER_ID)
|
||||
return gTrainers[TRAINER_ID_STEVEN].trainerName;
|
||||
{
|
||||
return gTrainers[TRAINER_STEVEN].trainerName;
|
||||
}
|
||||
else
|
||||
{
|
||||
GetFrontierTrainerName(gStringVar1, gPartnerTrainerId);
|
||||
@@ -1682,14 +1685,14 @@ void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality)
|
||||
}
|
||||
}
|
||||
|
||||
const u8* GetTrainerClassNameFromId(u16 trainerId)
|
||||
const u8 *GetTrainerClassNameFromId(u16 trainerId)
|
||||
{
|
||||
if (trainerId > NO_OF_TRAINERS)
|
||||
trainerId = 0;
|
||||
return gTrainerClassNames[gTrainers[trainerId].trainerClass];
|
||||
}
|
||||
|
||||
const u8* GetTrainerNameFromId(u16 trainerId)
|
||||
const u8 *GetTrainerNameFromId(u16 trainerId)
|
||||
{
|
||||
if (trainerId > NO_OF_TRAINERS)
|
||||
trainerId = 0;
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
| BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_ROAMER | BATTLE_TYPE_EREADER_TRAINER \
|
||||
| BATTLE_TYPE_KYOGRE_GROUDON | BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI \
|
||||
| BATTLE_TYPE_RECORDED | BATTLE_TYPE_x4000000 | BATTLE_TYPE_SECRET_BASE \
|
||||
| BATTLE_TYPE_GROUDON | BATTLE_TYPE_KYORGE | BATTLE_TYPE_RAYQUAZA))
|
||||
| BATTLE_TYPE_GROUDON | BATTLE_TYPE_KYOGRE | BATTLE_TYPE_RAYQUAZA))
|
||||
|
||||
extern u32 gBattleTypeFlags;
|
||||
extern u16 gTrainerBattleOpponent_A;
|
||||
|
||||
@@ -105,7 +105,7 @@ void SafariZoneRetirePrompt(void)
|
||||
ScriptContext1_SetupScript(EventScript_2A4B6F);
|
||||
}
|
||||
|
||||
void sub_80FC190(void)
|
||||
void CB2_EndSafariBattle(void)
|
||||
{
|
||||
sSafariZoneFleedMons += gBattleResults.field_1F;
|
||||
if (gBattleOutcome == BATTLE_CAUGHT)
|
||||
|
||||
32
src/scrcmd.c
32
src/scrcmd.c
@@ -656,7 +656,7 @@ bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx)
|
||||
bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx)
|
||||
{
|
||||
u8 mode = ScriptReadByte(ctx);
|
||||
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case 1:
|
||||
@@ -1445,7 +1445,7 @@ bool8 ScrCmd_drawboxtext(struct ScriptContext *ctx)
|
||||
u8 top = ScriptReadByte(ctx);
|
||||
u8 multichoiceId = ScriptReadByte(ctx);
|
||||
u8 ignoreBPress = ScriptReadByte(ctx);
|
||||
|
||||
|
||||
/*if (Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE)
|
||||
{
|
||||
ScriptContext1_Stop();
|
||||
@@ -1501,31 +1501,31 @@ bool8 ScrCmd_braillemessage(struct ScriptContext *ctx)
|
||||
u8 y;
|
||||
|
||||
StringExpandPlaceholders(gStringVar4, ptr + 6);
|
||||
|
||||
|
||||
width = GetStringWidth(6, gStringVar4, -1) / 8;
|
||||
|
||||
|
||||
if (width > 0x1C)
|
||||
width = 0x1C;
|
||||
|
||||
|
||||
for (i = 0, height = 4; gStringVar4[i] != 0xFF;)
|
||||
{
|
||||
if (gStringVar4[i++] == 0xFE)
|
||||
height += 3;
|
||||
}
|
||||
|
||||
|
||||
if (height > 0x12)
|
||||
height = 0x12;
|
||||
|
||||
|
||||
x = width + 2;
|
||||
temp1 = (0x1E - x) / 2;
|
||||
x = temp1 + 1;
|
||||
temp1 = ((x - temp1 - 1) * 8 + 3);
|
||||
|
||||
|
||||
y = height + 2;
|
||||
temp2 = (0x14 - y) / 2;
|
||||
y = temp2 + 2;
|
||||
temp2 = ((y - temp2 - 1) * 8);
|
||||
|
||||
|
||||
sub_8198A50(&template1, 0, x, y, width, height, 0xF, 0x1);
|
||||
template2 = template1;
|
||||
gUnknown_03000F30 = AddWindow(&template2);
|
||||
@@ -1924,7 +1924,7 @@ bool8 ScrCmd_hidemoneybox(struct ScriptContext *ctx)
|
||||
{
|
||||
/*u8 x = ScriptReadByte(ctx);
|
||||
u8 y = ScriptReadByte(ctx);*/
|
||||
|
||||
|
||||
HideMoneyBox();
|
||||
return FALSE;
|
||||
}
|
||||
@@ -1979,13 +1979,13 @@ bool8 ScrCmd_dotrainerbattle(struct ScriptContext *ctx)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool8 ScrCmd_ontrainerbattleend(struct ScriptContext *ctx)
|
||||
bool8 ScrCmd_gotopostbattlescript(struct ScriptContext *ctx)
|
||||
{
|
||||
ctx->scriptPtr = BattleSetup_GetScriptAddrAfterBattle();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 ScrCmd_ontrainerbattleendgoto(struct ScriptContext *ctx)
|
||||
bool8 ScrCmd_gotobeatenscript(struct ScriptContext *ctx)
|
||||
{
|
||||
ctx->scriptPtr = BattleSetup_GetTrainerPostBattleScript();
|
||||
return FALSE;
|
||||
@@ -1995,7 +1995,7 @@ bool8 ScrCmd_checktrainerflag(struct ScriptContext *ctx)
|
||||
{
|
||||
u16 index = VarGet(ScriptReadHalfword(ctx));
|
||||
|
||||
ctx->comparisonResult = HasTrainerAlreadyBeenFought(index);
|
||||
ctx->comparisonResult = HasTrainerBeenFought(index);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -2003,7 +2003,7 @@ bool8 ScrCmd_settrainerflag(struct ScriptContext *ctx)
|
||||
{
|
||||
u16 index = VarGet(ScriptReadHalfword(ctx));
|
||||
|
||||
trainer_flag_set(index);
|
||||
SetTrainerFlag(index);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -2011,7 +2011,7 @@ bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx)
|
||||
{
|
||||
u16 index = VarGet(ScriptReadHalfword(ctx));
|
||||
|
||||
trainer_flag_clear(index);
|
||||
ClearTrainerFlag(index);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -2374,7 +2374,7 @@ bool8 ScrCmd_checkmonobedience(struct ScriptContext *ctx)
|
||||
bool8 ScrCmd_cmdCF(struct ScriptContext *ctx)
|
||||
{
|
||||
const u8* v1 = sub_8099244();
|
||||
|
||||
|
||||
if (v1)
|
||||
{
|
||||
((u8*)gUnknown_020375C0) = ctx->scriptPtr;
|
||||
|
||||
@@ -1283,7 +1283,7 @@ u8 sub_80EA20C(u8 secretBaseRecordId)
|
||||
return (gSaveBlock1Ptr->secretBases[secretBaseRecordId].trainerId[0] % 5) + (gSaveBlock1Ptr->secretBases[secretBaseRecordId].gender * 5);
|
||||
}
|
||||
|
||||
const u8 *sub_80EA250(void)
|
||||
const u8 *GetSecretBaseTrainerLoseText(void)
|
||||
{
|
||||
u8 param;
|
||||
|
||||
|
||||
@@ -265,7 +265,7 @@ static void Task_StarterChoose5(u8 taskId)
|
||||
{
|
||||
u8 spriteId;
|
||||
|
||||
switch (sub_8198C58())
|
||||
switch (ProcessMenuInputNoWrap_())
|
||||
{
|
||||
case 0: // YES
|
||||
// Return the starter choice and exit.
|
||||
|
||||
68
src/trainer_see.c
Normal file
68
src/trainer_see.c
Normal file
@@ -0,0 +1,68 @@
|
||||
#include "global.h"
|
||||
#include "trainer_see.h"
|
||||
#include "battle_setup.h"
|
||||
|
||||
extern u8 gApproachingTrainerId;
|
||||
extern u8 gNoOfApproachingTrainers;
|
||||
extern u8 gUnknown_030060AC;
|
||||
extern u16 gUnknown_03006080;
|
||||
|
||||
// this file's functions
|
||||
u8 CheckIfTrainerWantsBattle(u8 mapObjectId);
|
||||
|
||||
bool8 CheckForTrainersWantingBattle(void)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
gNoOfApproachingTrainers = 0;
|
||||
gApproachingTrainerId = 0;
|
||||
|
||||
for (i = 0; i < MAP_OBJECTS_COUNT; i++)
|
||||
{
|
||||
u8 retVal;
|
||||
|
||||
if (!gMapObjects[i].active)
|
||||
continue;
|
||||
if (gMapObjects[i].trainerType != 1 && gMapObjects[i].trainerType != 3)
|
||||
continue;
|
||||
|
||||
retVal = CheckIfTrainerWantsBattle(i);
|
||||
if (retVal == 2)
|
||||
break; // two trainers have been found
|
||||
|
||||
if (retVal == 0) // no trainers
|
||||
continue;
|
||||
|
||||
if (gNoOfApproachingTrainers > 1)
|
||||
break;
|
||||
if (GetMonsStateToDoubles_2() != 0) // one trainer found and cant have a double battle
|
||||
break;
|
||||
}
|
||||
|
||||
if (gNoOfApproachingTrainers == 1)
|
||||
{
|
||||
ResetTrainerOpponentIds();
|
||||
ConfigureAndSetUpOneTrainerBattle(gApproachingTrainers[gNoOfApproachingTrainers - 1].mapObjectId,
|
||||
gApproachingTrainers[gNoOfApproachingTrainers - 1].trainerScriptPtr);
|
||||
gUnknown_030060AC = 1;
|
||||
return TRUE;
|
||||
}
|
||||
else if (gNoOfApproachingTrainers == 2)
|
||||
{
|
||||
ResetTrainerOpponentIds();
|
||||
for (i = 0; i < gNoOfApproachingTrainers; i++, gApproachingTrainerId++)
|
||||
{
|
||||
ConfigureTwoTrainersBattle(gApproachingTrainers[i].mapObjectId,
|
||||
gApproachingTrainers[i].trainerScriptPtr);
|
||||
}
|
||||
SetUpTwoTrainersBattle();
|
||||
gApproachingTrainerId = 0;
|
||||
gUnknown_030060AC = 1;
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
gUnknown_030060AC = 0;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
2
src/tv.c
2
src/tv.c
@@ -1793,7 +1793,7 @@ void EndMassOutbreak(void)
|
||||
gSaveBlock1Ptr->outbreakDaysLeft = 0;
|
||||
}
|
||||
|
||||
void sub_80ED888(u16 days)
|
||||
void UpdateTVShowsPerDay(u16 days)
|
||||
{
|
||||
|
||||
sub_80ED8B4(days);
|
||||
|
||||
1057
src/wallclock.c
Normal file
1057
src/wallclock.c
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user