Merge branch 'master' into doc-ttower
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -831,9 +831,9 @@ void sub_802F6A8(void)
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
|
||||
{
|
||||
if (gWirelessCommType == 0)
|
||||
sub_800AAC0();
|
||||
Link_TryStartSend5FFF();
|
||||
else
|
||||
sub_800AB9C();
|
||||
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
|
||||
gBattlerControllerFuncs[gActiveBattler] = sub_802F610;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -35,7 +35,7 @@ void HandleLinkBattleSetup(void)
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
|
||||
{
|
||||
if (gWirelessCommType)
|
||||
sub_800B1F4();
|
||||
SetWirelessCommType1();
|
||||
if (!gReceivedRemoteLinkPlayers)
|
||||
OpenLink();
|
||||
CreateTask(sub_8081A90, 0);
|
||||
@@ -491,7 +491,7 @@ void sub_800DD28(void)
|
||||
|
||||
if (gReceivedRemoteLinkPlayers && (gBattleTypeFlags & BATTLE_TYPE_20) && (gLinkPlayers[0].linkType == 0x2211))
|
||||
{
|
||||
sub_80FBB4C();
|
||||
LinkRfu_DestroyIdleTask();
|
||||
for (i = 0; i < GetLinkPlayerCount(); ++i)
|
||||
{
|
||||
if (GetBlockReceivedStatus() & gBitTable[i])
|
||||
|
||||
+7
-6
@@ -50,6 +50,7 @@
|
||||
#include "cable_club.h"
|
||||
#include "constants/abilities.h"
|
||||
#include "constants/battle_move_effects.h"
|
||||
#include "constants/battle_setup.h"
|
||||
#include "constants/hold_effects.h"
|
||||
#include "constants/items.h"
|
||||
#include "constants/moves.h"
|
||||
@@ -1151,9 +1152,9 @@ static void CB2_PreInitMultiBattle(void)
|
||||
{
|
||||
++gBattleCommunication[MULTIUSE_STATE];
|
||||
if (gWirelessCommType)
|
||||
sub_800AB9C();
|
||||
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
|
||||
else
|
||||
sub_800AAC0();
|
||||
Link_TryStartSend5FFF();
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
@@ -3716,12 +3717,12 @@ static void HandleEndTurn_BattleLost(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && ScrSpecial_GetTrainerBattleMode() == 9)
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && ScrSpecial_GetTrainerBattleMode() == TRAINER_BATTLE_EARLY_RIVAL)
|
||||
{
|
||||
if (sub_80803D8() & 1)
|
||||
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
|
||||
if (GetRivalBattleFlags() & RIVAL_BATTLE_HEAL_AFTER)
|
||||
gBattleCommunication[MULTISTRING_CHOOSER] = 1; // Dont do white out text
|
||||
else
|
||||
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
|
||||
gBattleCommunication[MULTISTRING_CHOOSER] = 2; // Do white out text
|
||||
gBattlerAttacker = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
|
||||
}
|
||||
else
|
||||
|
||||
+13
-14
@@ -78,7 +78,7 @@ static EWRAM_DATA u8 *sTrainerVictorySpeech = NULL;
|
||||
static EWRAM_DATA u8 *sTrainerCannotBattleSpeech = NULL;
|
||||
static EWRAM_DATA u8 *sTrainerBattleEndScript = NULL;
|
||||
static EWRAM_DATA u8 *sTrainerABattleScriptRetAddr = NULL;
|
||||
static EWRAM_DATA u16 gUnknown_20386CC = 0;
|
||||
static EWRAM_DATA u16 sRivalBattleFlags = 0;
|
||||
|
||||
static const u8 sBattleTransitionTable_Wild[][2] =
|
||||
{
|
||||
@@ -148,11 +148,11 @@ static const struct TrainerBattleParameter sOrdinaryNoIntroBattleParams[] =
|
||||
{&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},
|
||||
};
|
||||
|
||||
static const struct TrainerBattleParameter sTutorialBattleParams[] =
|
||||
static const struct TrainerBattleParameter sEarlyRivalBattleParams[] =
|
||||
{
|
||||
{&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
|
||||
{&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT},
|
||||
{&gUnknown_20386CC, TRAINER_PARAM_LOAD_VAL_16BIT},
|
||||
{&sRivalBattleFlags, TRAINER_PARAM_LOAD_VAL_16BIT},
|
||||
{&sTrainerAIntroSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
|
||||
{&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
|
||||
{&sTrainerVictorySpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
|
||||
@@ -706,7 +706,7 @@ static void InitTrainerBattleVariables(void)
|
||||
sTrainerCannotBattleSpeech = NULL;
|
||||
sTrainerBattleEndScript = NULL;
|
||||
sTrainerABattleScriptRetAddr = NULL;
|
||||
gUnknown_20386CC = 0;
|
||||
sRivalBattleFlags = 0;
|
||||
}
|
||||
|
||||
static inline void SetU8(void *ptr, u8 value)
|
||||
@@ -808,8 +808,8 @@ const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data)
|
||||
SetMapVarsToTrainer();
|
||||
gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A);
|
||||
return EventScript_TryDoRematchBattle;
|
||||
case TRAINER_BATTLE_TUTORIAL:
|
||||
TrainerBattleLoadArgs(sTutorialBattleParams, data);
|
||||
case TRAINER_BATTLE_EARLY_RIVAL:
|
||||
TrainerBattleLoadArgs(sEarlyRivalBattleParams, data);
|
||||
return EventScript_DoTrainerBattle;
|
||||
default:
|
||||
TrainerBattleLoadArgs(sOrdinaryBattleParams, data);
|
||||
@@ -846,9 +846,9 @@ u8 ScrSpecial_GetTrainerBattleMode(void)
|
||||
return sTrainerBattleMode;
|
||||
}
|
||||
|
||||
u16 sub_80803D8(void)
|
||||
u16 GetRivalBattleFlags(void)
|
||||
{
|
||||
return gUnknown_20386CC;
|
||||
return sRivalBattleFlags;
|
||||
}
|
||||
|
||||
u16 ScrSpecial_HasTrainerBeenFought(void)
|
||||
@@ -885,8 +885,7 @@ void ClearTrainerFlag(u16 trainerId)
|
||||
void BattleSetup_StartTrainerBattle(void)
|
||||
{
|
||||
gBattleTypeFlags = BATTLE_TYPE_TRAINER;
|
||||
if (ScrSpecial_GetTrainerBattleMode() == TRAINER_BATTLE_TUTORIAL
|
||||
&& sub_80803D8() & 3)
|
||||
if (ScrSpecial_GetTrainerBattleMode() == TRAINER_BATTLE_EARLY_RIVAL && GetRivalBattleFlags() & RIVAL_BATTLE_TUTORIAL)
|
||||
gBattleTypeFlags |= BATTLE_TYPE_FIRST_BATTLE;
|
||||
gMain.savedCallback = CB2_EndTrainerBattle;
|
||||
DoTrainerBattle();
|
||||
@@ -895,12 +894,12 @@ void BattleSetup_StartTrainerBattle(void)
|
||||
|
||||
static void CB2_EndTrainerBattle(void)
|
||||
{
|
||||
if (sTrainerBattleMode == TRAINER_BATTLE_TUTORIAL)
|
||||
if (sTrainerBattleMode == TRAINER_BATTLE_EARLY_RIVAL)
|
||||
{
|
||||
if (IsPlayerDefeated(gBattleOutcome) == TRUE)
|
||||
{
|
||||
gSpecialVar_Result = 1;
|
||||
if (gUnknown_20386CC & 1)
|
||||
gSpecialVar_Result = TRUE;
|
||||
if (sRivalBattleFlags & RIVAL_BATTLE_HEAL_AFTER)
|
||||
{
|
||||
HealPlayerParty();
|
||||
}
|
||||
@@ -915,7 +914,7 @@ static void CB2_EndTrainerBattle(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
gSpecialVar_Result = 0;
|
||||
gSpecialVar_Result = FALSE;
|
||||
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
|
||||
SetBattledTrainerFlag();
|
||||
sub_81139BC();
|
||||
|
||||
+3
-27
@@ -1,44 +1,34 @@
|
||||
#include "global.h"
|
||||
#include "pokemon.h"
|
||||
#include "gflib.h"
|
||||
#include "battle.h"
|
||||
#include "daycare.h"
|
||||
#include "string_util.h"
|
||||
#include "constants/species.h"
|
||||
#include "constants/items.h"
|
||||
#include "mail_data.h"
|
||||
#include "pokemon_storage_system.h"
|
||||
#include "event_data.h"
|
||||
#include "random.h"
|
||||
#include "main.h"
|
||||
#include "constants/moves.h"
|
||||
#include "text.h"
|
||||
#include "menu.h"
|
||||
#include "new_menu_helpers.h"
|
||||
#include "script.h"
|
||||
#include "strings.h"
|
||||
#include "task.h"
|
||||
#include "window.h"
|
||||
#include "party_menu.h"
|
||||
#include "list_menu.h"
|
||||
#include "overworld.h"
|
||||
#include "pokedex.h"
|
||||
#include "decompress.h"
|
||||
#include "palette.h"
|
||||
#include "sound.h"
|
||||
#include "constants/songs.h"
|
||||
#include "text_window.h"
|
||||
#include "trig.h"
|
||||
#include "malloc.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "bg.h"
|
||||
#include "m4a.h"
|
||||
#include "graphics.h"
|
||||
#include "scanline_effect.h"
|
||||
#include "naming_screen.h"
|
||||
#include "help_system.h"
|
||||
#include "field_fadetransition.h"
|
||||
#include "trade.h"
|
||||
#include "constants/daycare.h"
|
||||
#include "constants/pokemon.h"
|
||||
#include "constants/region_map.h"
|
||||
|
||||
// Combination of RSE's Day-Care (re-used on Four Island), FRLG's Day-Care, and egg_hatch.c
|
||||
@@ -60,20 +50,6 @@ struct EggHatchData
|
||||
u8 textColor[3];
|
||||
};
|
||||
|
||||
extern const u8 gText_MaleSymbol4[];
|
||||
extern const u8 gText_FemaleSymbol4[];
|
||||
extern const u8 gText_GenderlessSymbol[];
|
||||
extern const u8 gText_Lv[];
|
||||
extern const u8 gDaycareText_GetAlongVeryWell[];
|
||||
extern const u8 gDaycareText_GetAlong[];
|
||||
extern const u8 gDaycareText_DontLikeOther[];
|
||||
extern const u8 gDaycareText_PlayOther[];
|
||||
extern const u8 gExpandedPlaceholder_Empty[];
|
||||
|
||||
extern const u32 gUnknown_826601C[]; // tilemap gameboy circle
|
||||
extern const u8 gText_HatchedFromEgg[];
|
||||
extern const u8 gText_NickHatchPrompt[];
|
||||
|
||||
// this file's functions
|
||||
static void ClearDaycareMonMail(struct DayCareMail *mail);
|
||||
static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *daycare);
|
||||
@@ -638,7 +614,7 @@ static void ClearDaycareMonMail(struct DayCareMail *mail)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH/* + 1*/; i++)
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)
|
||||
mail->OT_name[i] = 0;
|
||||
for (i = 0; i < POKEMON_NAME_LENGTH + 1; i++)
|
||||
mail->monName[i] = 0;
|
||||
|
||||
@@ -0,0 +1,449 @@
|
||||
#include "global.h"
|
||||
#include "malloc.h"
|
||||
#include "decompress.h"
|
||||
#include "digit_obj_util.h"
|
||||
#include "main.h"
|
||||
#include "battle.h"
|
||||
|
||||
struct DigitPrinterAlloc
|
||||
{
|
||||
u32 count;
|
||||
struct DigitPrinter
|
||||
{
|
||||
bool8 isActive;
|
||||
u8 firstOamId;
|
||||
u8 strConvMode;
|
||||
u8 oamCount;
|
||||
u8 palTagIndex;
|
||||
u8 size;
|
||||
u8 shape;
|
||||
u8 priority;
|
||||
u8 xDelta;
|
||||
u8 tilesPerImage;
|
||||
u16 tileStart;
|
||||
s16 x;
|
||||
s16 y;
|
||||
u16 tileTag;
|
||||
u16 palTag;
|
||||
u32 pow10;
|
||||
s32 lastPrinted;
|
||||
} *array;
|
||||
};
|
||||
|
||||
// this file's functions
|
||||
static u8 GetFirstOamId(u8 oamCount);
|
||||
static void CopyWorkToOam(struct DigitPrinter *objWork);
|
||||
static void DrawNumObjsLeadingZeros(struct DigitPrinter *objWork, s32 num, bool32 sign);
|
||||
static void DrawNumObjsMinusInFront(struct DigitPrinter *objWork, s32 num, bool32 sign);
|
||||
static void DrawNumObjsMinusInBack(struct DigitPrinter *objWork, s32 num, bool32 sign);
|
||||
static bool32 SharesTileWithAnyActive(u32 id);
|
||||
static bool32 SharesPalWithAnyActive(u32 id);
|
||||
static u8 GetTilesPerImage(u32 shape, u32 size);
|
||||
|
||||
// ewram
|
||||
static EWRAM_DATA struct DigitPrinterAlloc *sOamWork = {0};
|
||||
|
||||
// const rom data
|
||||
static const u8 sTilesPerImage[4][4] =
|
||||
{
|
||||
[ST_OAM_SQUARE] = {
|
||||
[ST_OAM_SIZE_0] = 0x01, // SPRITE_SIZE_8x8
|
||||
[ST_OAM_SIZE_1] = 0x04, // SPRITE_SIZE_16x16
|
||||
[ST_OAM_SIZE_2] = 0x10, // SPRITE_SIZE_32x32
|
||||
[ST_OAM_SIZE_3] = 0x40 // SPRITE_SIZE_64x64
|
||||
},
|
||||
[ST_OAM_H_RECTANGLE] = {
|
||||
[ST_OAM_SIZE_0] = 0x02, // SPRITE_SIZE_16x8
|
||||
[ST_OAM_SIZE_1] = 0x04, // SPRITE_SIZE_32x8
|
||||
[ST_OAM_SIZE_2] = 0x08, // SPRITE_SIZE_32x16
|
||||
[ST_OAM_SIZE_3] = 0x20 // SPRITE_SIZE_64x32
|
||||
},
|
||||
[ST_OAM_V_RECTANGLE] = {
|
||||
[ST_OAM_SIZE_0] = 0x02, // SPRITE_SIZE_8x16
|
||||
[ST_OAM_SIZE_1] = 0x04, // SPRITE_SIZE_8x32
|
||||
[ST_OAM_SIZE_2] = 0x08, // SPRITE_SIZE_16x32
|
||||
[ST_OAM_SIZE_3] = 0x20 // SPRITE_SIZE_32x64
|
||||
}
|
||||
};
|
||||
|
||||
// code
|
||||
bool32 DigitObjUtil_Init(u32 count)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
if (sOamWork != NULL)
|
||||
DigitObjUtil_Teardown();
|
||||
|
||||
sOamWork = Alloc(sizeof(*sOamWork));
|
||||
if (sOamWork == NULL)
|
||||
return FALSE;
|
||||
|
||||
sOamWork->array = Alloc(sizeof(struct DigitPrinter) * count);
|
||||
if (sOamWork->array == NULL)
|
||||
{
|
||||
Free(sOamWork);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
sOamWork->count = count;
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
sOamWork->array[i].isActive = FALSE;
|
||||
sOamWork->array[i].firstOamId = 0xFF;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void DigitObjUtil_Teardown(void)
|
||||
{
|
||||
if (sOamWork != NULL)
|
||||
{
|
||||
if (sOamWork->array != NULL)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < sOamWork->count; i++)
|
||||
DigitObjUtil_DeletePrinter(i);
|
||||
|
||||
Free(sOamWork->array);
|
||||
}
|
||||
|
||||
FREE_AND_SET_NULL(sOamWork);
|
||||
}
|
||||
}
|
||||
|
||||
bool32 DigitObjUtil_CreatePrinter(u32 id, s32 num, const struct DigitObjUtilTemplate *template)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
if (sOamWork == NULL)
|
||||
return FALSE;
|
||||
if (sOamWork->array[id].isActive)
|
||||
return FALSE;
|
||||
|
||||
sOamWork->array[id].firstOamId = GetFirstOamId(template->oamCount);
|
||||
if (sOamWork->array[id].firstOamId == 0xFF)
|
||||
return FALSE;
|
||||
|
||||
sOamWork->array[id].tileStart = GetSpriteTileStartByTag(template->spriteSheet->tag);
|
||||
if (sOamWork->array[id].tileStart == 0xFFFF)
|
||||
{
|
||||
if (template->spriteSheet->size != 0)
|
||||
{
|
||||
sOamWork->array[id].tileStart = LoadSpriteSheet(template->spriteSheet);
|
||||
}
|
||||
else
|
||||
{
|
||||
struct CompressedSpriteSheet compObjectPic;
|
||||
|
||||
compObjectPic = *(struct CompressedSpriteSheet*)(template->spriteSheet);
|
||||
compObjectPic.size = GetDecompressedDataSize(template->spriteSheet->data);
|
||||
sOamWork->array[id].tileStart = LoadCompressedSpriteSheet(&compObjectPic);
|
||||
}
|
||||
|
||||
if (sOamWork->array[id].tileStart == 0xFFFF)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
sOamWork->array[id].palTagIndex = IndexOfSpritePaletteTag(template->spritePal->tag);
|
||||
if (sOamWork->array[id].palTagIndex == 0xFF)
|
||||
sOamWork->array[id].palTagIndex = LoadSpritePalette(template->spritePal);
|
||||
|
||||
sOamWork->array[id].strConvMode = template->strConvMode;
|
||||
sOamWork->array[id].oamCount = template->oamCount;
|
||||
sOamWork->array[id].x = template->x;
|
||||
sOamWork->array[id].y = template->y;
|
||||
sOamWork->array[id].shape = template->shape;
|
||||
sOamWork->array[id].size = template->size;
|
||||
sOamWork->array[id].priority = template->priority;
|
||||
sOamWork->array[id].xDelta = template->xDelta;
|
||||
sOamWork->array[id].tilesPerImage = GetTilesPerImage(template->shape, template->size);
|
||||
sOamWork->array[id].tileTag = template->spriteSheet->tag;
|
||||
sOamWork->array[id].palTag = template->spritePal->tag;
|
||||
sOamWork->array[id].isActive = TRUE;
|
||||
|
||||
// Decimal left shift
|
||||
sOamWork->array[id].pow10 = 1;
|
||||
for (i = 1; i < template->oamCount; i++)
|
||||
sOamWork->array[id].pow10 *= 10;
|
||||
|
||||
CopyWorkToOam(&sOamWork->array[id]);
|
||||
DigitObjUtil_PrintNumOn(id, num);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void CopyWorkToOam(struct DigitPrinter *objWork)
|
||||
{
|
||||
u32 i;
|
||||
u32 oamId = objWork->firstOamId;
|
||||
u32 x = objWork->x;
|
||||
u32 oamCount = objWork->oamCount + 1;
|
||||
|
||||
CpuFill16(0, &gMain.oamBuffer[oamId], sizeof(struct OamData) * oamCount);
|
||||
for (i = 0, oamId = objWork->firstOamId; i < oamCount; i++, oamId++)
|
||||
{
|
||||
gMain.oamBuffer[oamId].y = objWork->y;
|
||||
gMain.oamBuffer[oamId].x = x;
|
||||
gMain.oamBuffer[oamId].shape = objWork->shape;
|
||||
gMain.oamBuffer[oamId].size = objWork->size;
|
||||
gMain.oamBuffer[oamId].tileNum = objWork->tileStart;
|
||||
gMain.oamBuffer[oamId].priority = objWork->priority;
|
||||
gMain.oamBuffer[oamId].paletteNum = objWork->palTagIndex;
|
||||
|
||||
x += objWork->xDelta;
|
||||
}
|
||||
|
||||
oamId--;
|
||||
gMain.oamBuffer[oamId].x = objWork->x - objWork->xDelta;
|
||||
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
|
||||
gMain.oamBuffer[oamId].tileNum = objWork->tileStart + (objWork->tilesPerImage * 10);
|
||||
}
|
||||
|
||||
void DigitObjUtil_PrintNumOn(u32 id, s32 num)
|
||||
{
|
||||
bool32 sign;
|
||||
|
||||
if (sOamWork == NULL)
|
||||
return;
|
||||
if (!sOamWork->array[id].isActive)
|
||||
return;
|
||||
|
||||
sOamWork->array[id].lastPrinted = num;
|
||||
if (num < 0)
|
||||
{
|
||||
sign = TRUE;
|
||||
num *= -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
sign = FALSE;
|
||||
}
|
||||
|
||||
switch (sOamWork->array[id].strConvMode)
|
||||
{
|
||||
case 0:
|
||||
default:
|
||||
DrawNumObjsLeadingZeros(&sOamWork->array[id], num, sign);
|
||||
break;
|
||||
case 1:
|
||||
DrawNumObjsMinusInFront(&sOamWork->array[id], num, sign);
|
||||
break;
|
||||
case 2:
|
||||
DrawNumObjsMinusInBack(&sOamWork->array[id], num, sign);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void DrawNumObjsLeadingZeros(struct DigitPrinter *objWork, s32 num, bool32 sign)
|
||||
{
|
||||
u32 pow10 = objWork->pow10;
|
||||
u32 oamId = objWork->firstOamId;
|
||||
|
||||
while (pow10 != 0)
|
||||
{
|
||||
u32 digit = num / pow10;
|
||||
num -= (digit * pow10);
|
||||
pow10 /= 10;
|
||||
|
||||
gMain.oamBuffer[oamId].tileNum = (digit * objWork->tilesPerImage) + objWork->tileStart;
|
||||
oamId++;
|
||||
}
|
||||
|
||||
if (sign)
|
||||
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
|
||||
else
|
||||
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
|
||||
}
|
||||
|
||||
static void DrawNumObjsMinusInFront(struct DigitPrinter *objWork, s32 num, bool32 sign)
|
||||
{
|
||||
u32 pow10 = objWork->pow10;
|
||||
static int oamId;
|
||||
static int curDigit;
|
||||
static int firstDigit;
|
||||
|
||||
oamId = objWork->firstOamId;
|
||||
curDigit = 0;
|
||||
firstDigit = -1;
|
||||
|
||||
while (pow10 != 0)
|
||||
{
|
||||
u32 digit = num / pow10;
|
||||
num -= (digit * pow10);
|
||||
pow10 /= 10;
|
||||
|
||||
if (digit != 0 || firstDigit != -1 || pow10 == 0)
|
||||
{
|
||||
gMain.oamBuffer[oamId].tileNum = (digit * objWork->tilesPerImage) + objWork->tileStart;
|
||||
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
|
||||
|
||||
if (firstDigit == -1)
|
||||
firstDigit = curDigit;
|
||||
}
|
||||
else
|
||||
{
|
||||
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
|
||||
}
|
||||
|
||||
oamId++;
|
||||
curDigit++;
|
||||
}
|
||||
|
||||
if (sign)
|
||||
{
|
||||
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
|
||||
gMain.oamBuffer[oamId].x = objWork->x + ((firstDigit - 1) * objWork->xDelta);
|
||||
}
|
||||
else
|
||||
{
|
||||
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
|
||||
}
|
||||
}
|
||||
|
||||
static void DrawNumObjsMinusInBack(struct DigitPrinter *objWork, s32 num, bool32 sign)
|
||||
{
|
||||
u32 pow10 = objWork->pow10;
|
||||
u32 oamId = objWork->firstOamId;
|
||||
u32 printingDigits = 0;
|
||||
s32 nsprites = 0;
|
||||
|
||||
while (pow10 != 0)
|
||||
{
|
||||
u32 digit = num / pow10;
|
||||
num -= (digit * pow10);
|
||||
pow10 /= 10;
|
||||
|
||||
if (digit != 0 || printingDigits != 0 || pow10 == 0)
|
||||
{
|
||||
printingDigits = 1;
|
||||
gMain.oamBuffer[oamId].tileNum = (digit * objWork->tilesPerImage) + objWork->tileStart;
|
||||
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
|
||||
|
||||
oamId++;
|
||||
nsprites++;
|
||||
}
|
||||
}
|
||||
|
||||
while (nsprites < objWork->oamCount)
|
||||
{
|
||||
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
|
||||
oamId++;
|
||||
nsprites++;
|
||||
}
|
||||
|
||||
if (sign)
|
||||
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
|
||||
else
|
||||
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
|
||||
}
|
||||
|
||||
void DigitObjUtil_DeletePrinter(u32 id)
|
||||
{
|
||||
s32 oamId, oamCount, i;
|
||||
|
||||
if (sOamWork == NULL)
|
||||
return;
|
||||
if (!sOamWork->array[id].isActive)
|
||||
return;
|
||||
|
||||
oamCount = sOamWork->array[id].oamCount + 1;
|
||||
oamId = sOamWork->array[id].firstOamId;
|
||||
|
||||
for (i = 0; i < oamCount; i++, oamId++)
|
||||
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
|
||||
|
||||
if (!SharesTileWithAnyActive(id))
|
||||
FreeSpriteTilesByTag(sOamWork->array[id].tileTag);
|
||||
if (!SharesPalWithAnyActive(id))
|
||||
FreeSpritePaletteByTag(sOamWork->array[id].palTag);
|
||||
|
||||
sOamWork->array[id].isActive = FALSE;
|
||||
}
|
||||
|
||||
void DigitObjUtil_HideOrShow(u32 id, bool32 hide)
|
||||
{
|
||||
s32 oamId, oamCount, i;
|
||||
|
||||
if (sOamWork == NULL)
|
||||
return;
|
||||
if (!sOamWork->array[id].isActive)
|
||||
return;
|
||||
|
||||
oamCount = sOamWork->array[id].oamCount + 1;
|
||||
oamId = sOamWork->array[id].firstOamId;
|
||||
if (hide)
|
||||
{
|
||||
for (i = 0; i < oamCount; i++, oamId++)
|
||||
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < oamCount; i++, oamId++)
|
||||
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
|
||||
|
||||
DigitObjUtil_PrintNumOn(id, sOamWork->array[id].lastPrinted);
|
||||
}
|
||||
}
|
||||
|
||||
static u8 GetFirstOamId(u8 oamCount)
|
||||
{
|
||||
u32 i;
|
||||
u16 firstOamId = 64;
|
||||
|
||||
for (i = 0; i < sOamWork->count; i++)
|
||||
{
|
||||
if (!sOamWork->array[i].isActive)
|
||||
{
|
||||
if (sOamWork->array[i].firstOamId != 0xFF && sOamWork->array[i].oamCount <= oamCount)
|
||||
return sOamWork->array[i].firstOamId;
|
||||
}
|
||||
else
|
||||
{
|
||||
firstOamId += 1 + sOamWork->array[i].oamCount;
|
||||
}
|
||||
}
|
||||
|
||||
if (firstOamId + oamCount + 1 > 128)
|
||||
return 0xFF;
|
||||
else
|
||||
return firstOamId;
|
||||
}
|
||||
|
||||
static bool32 SharesTileWithAnyActive(u32 id)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < sOamWork->count; i++)
|
||||
{
|
||||
if (sOamWork->array[i].isActive && i != id
|
||||
&& sOamWork->array[i].tileTag == sOamWork->array[id].tileTag)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool32 SharesPalWithAnyActive(u32 id)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < sOamWork->count; i++)
|
||||
{
|
||||
if (sOamWork->array[i].isActive && i != id
|
||||
&& sOamWork->array[i].palTag == sOamWork->array[id].palTag)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static u8 GetTilesPerImage(u32 shape, u32 size)
|
||||
{
|
||||
return sTilesPerImage[shape][size];
|
||||
}
|
||||
@@ -7,7 +7,7 @@ void sub_815A5BC(s32 a0)
|
||||
struct Padded_U8 data[2];
|
||||
data[0].value = 1;
|
||||
data[1].value = a0;
|
||||
sub_80F9E2C(data);
|
||||
RfuPrepareSend0x2f00(data);
|
||||
}
|
||||
|
||||
u8 sub_815A5E8(s32 a0)
|
||||
|
||||
@@ -2,16 +2,89 @@
|
||||
#include "text.h"
|
||||
#include "dynamic_placeholder_text_util.h"
|
||||
#include "string_util.h"
|
||||
#include "constants/object_events.h"
|
||||
|
||||
static EWRAM_DATA const u8 *sStringPointers[8] = {0};
|
||||
|
||||
static const u8 sTextColorTable[] =
|
||||
{
|
||||
0, 0, 0, 16, 17, 17, 17, 16, 16, 0, 0, 17, 1, 0, 17, 16,
|
||||
0, 16, 16, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0,
|
||||
17, 1, 0, 0, 0, 16, 17, 0, 16, 16, 16, 0, 1, 0, 51, 51,
|
||||
51, 51, 51, 51, 51, 51, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34,
|
||||
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 50,
|
||||
// [LOW_NYBBLE / 2] = 0xXY, // HIGH_NYBBLE
|
||||
[OBJECT_EVENT_GFX_RED_NORMAL / 2] = 0x00, // OBJECT_EVENT_GFX_RED_BIKE
|
||||
[OBJECT_EVENT_GFX_RED_RUN / 2] = 0x00, // OBJECT_EVENT_GFX_RED_ITEM
|
||||
[OBJECT_EVENT_GFX_RED_FISH / 2] = 0x00, // OBJECT_EVENT_GFX_RED_ITEM_COPY
|
||||
[OBJECT_EVENT_GFX_RED_VS_SEEKER / 2] = 0x10, // OBJECT_EVENT_GFX_GREEN_NORMAL
|
||||
[OBJECT_EVENT_GFX_GREEN_BIKE / 2] = 0x11, // OBJECT_EVENT_GFX_GREEN_RUN
|
||||
[OBJECT_EVENT_GFX_GREEN_ITEM / 2] = 0x11, // OBJECT_EVENT_GFX_GREEN_FISH
|
||||
[OBJECT_EVENT_GFX_GREEN_ITEM_COPY / 2] = 0x11, // OBJECT_EVENT_GFX_GREEN_VS_SEEKER
|
||||
[OBJECT_EVENT_GFX_RS_BRENDAN / 2] = 0x10, // OBJECT_EVENT_GFX_RS_MAY
|
||||
[OBJECT_EVENT_GFX_LITTLE_BOY / 2] = 0x10, // OBJECT_EVENT_GFX_LITTLE_GIRL
|
||||
[OBJECT_EVENT_GFX_YOUNGSTER / 2] = 0x00, // OBJECT_EVENT_GFX_BOY
|
||||
[OBJECT_EVENT_GFX_BUG_CATCHER / 2] = 0x00, // OBJECT_EVENT_GFX_SITTING_BOY
|
||||
[OBJECT_EVENT_GFX_LASS / 2] = 0x11, // OBJECT_EVENT_GFX_WOMAN_1
|
||||
[OBJECT_EVENT_GFX_BATTLE_GIRL / 2] = 0x01, // OBJECT_EVENT_GFX_MAN
|
||||
[OBJECT_EVENT_GFX_ROCKER / 2] = 0x00, // OBJECT_EVENT_GFX_FAT_MAN
|
||||
[OBJECT_EVENT_GFX_WOMAN_2 / 2] = 0x11, // OBJECT_EVENT_GFX_BEAUTY
|
||||
[OBJECT_EVENT_GFX_BALDING_MAN / 2] = 0x10, // OBJECT_EVENT_GFX_WOMAN_3
|
||||
[OBJECT_EVENT_GFX_OLD_MAN_1 / 2] = 0x00, // OBJECT_EVENT_GFX_OLD_MAN_2
|
||||
[OBJECT_EVENT_GFX_OLD_MAN_LYING_DOWN / 2] = 0x10, // OBJECT_EVENT_GFX_OLD_WOMAN
|
||||
[OBJECT_EVENT_GFX_TUBER_M_1 / 2] = 0x10, // OBJECT_EVENT_GFX_TUBER_F
|
||||
[OBJECT_EVENT_GFX_TUBER_M_2 / 2] = 0x00, // OBJECT_EVENT_GFX_CAMPER
|
||||
[OBJECT_EVENT_GFX_PICNICKER / 2] = 0x01, // OBJECT_EVENT_GFX_COOLTRAINER_M
|
||||
[OBJECT_EVENT_GFX_COOLTRAINER_F / 2] = 0x01, // OBJECT_EVENT_GFX_SWIMMER_M_WATER
|
||||
[OBJECT_EVENT_GFX_SWIMMER_F_WATER / 2] = 0x01, // OBJECT_EVENT_GFX_SWIMMER_M_LAND
|
||||
[OBJECT_EVENT_GFX_SWIMMER_F_LAND / 2] = 0x01, // OBJECT_EVENT_GFX_WORKER_M
|
||||
[OBJECT_EVENT_GFX_WORKER_F / 2] = 0x01, // OBJECT_EVENT_GFX_ROCKET_M
|
||||
[OBJECT_EVENT_GFX_ROCKET_F / 2] = 0x01, // OBJECT_EVENT_GFX_GBA_KID
|
||||
[OBJECT_EVENT_GFX_SUPER_NERD / 2] = 0x00, // OBJECT_EVENT_GFX_BIKER
|
||||
[OBJECT_EVENT_GFX_BLACKBELT / 2] = 0x00, // OBJECT_EVENT_GFX_SCIENTIST
|
||||
[OBJECT_EVENT_GFX_HIKER / 2] = 0x00, // OBJECT_EVENT_GFX_FISHER
|
||||
[OBJECT_EVENT_GFX_CHANNELER / 2] = 0x01, // OBJECT_EVENT_GFX_CHEF
|
||||
[OBJECT_EVENT_GFX_POLICEMAN / 2] = 0x00, // OBJECT_EVENT_GFX_GENTLEMAN
|
||||
[OBJECT_EVENT_GFX_SAILOR / 2] = 0x00, // OBJECT_EVENT_GFX_CAPTAIN
|
||||
[OBJECT_EVENT_GFX_NURSE / 2] = 0x11, // OBJECT_EVENT_GFX_CABLE_CLUB_RECEPTIONIST
|
||||
[OBJECT_EVENT_GFX_UNION_ROOM_RECEPTIONIST / 2] = 0x01, // OBJECT_EVENT_GFX_UNUSED_MALE_RECEPTIONIST
|
||||
[OBJECT_EVENT_GFX_CLERK / 2] = 0x00, // OBJECT_EVENT_GFX_MG_DELIVERYMAN
|
||||
[OBJECT_EVENT_GFX_TRAINER_TOWER_DUDE / 2] = 0x00, // OBJECT_EVENT_GFX_PROF_OAK
|
||||
[OBJECT_EVENT_GFX_BLUE / 2] = 0x00, // OBJECT_EVENT_GFX_BILL
|
||||
[OBJECT_EVENT_GFX_LANCE / 2] = 0x10, // OBJECT_EVENT_GFX_AGATHA
|
||||
[OBJECT_EVENT_GFX_DAISY / 2] = 0x11, // OBJECT_EVENT_GFX_LORELEI
|
||||
[OBJECT_EVENT_GFX_MR_FUJI / 2] = 0x00, // OBJECT_EVENT_GFX_BRUNO
|
||||
[OBJECT_EVENT_GFX_BROCK / 2] = 0x10, // OBJECT_EVENT_GFX_MISTY
|
||||
[OBJECT_EVENT_GFX_LT_SURGE / 2] = 0x10, // OBJECT_EVENT_GFX_ERIKA
|
||||
[OBJECT_EVENT_GFX_KOGA / 2] = 0x10, // OBJECT_EVENT_GFX_SABRINA
|
||||
[OBJECT_EVENT_GFX_BLAINE / 2] = 0x00, // OBJECT_EVENT_GFX_GIOVANNI
|
||||
[OBJECT_EVENT_GFX_MOM / 2] = 0x01, // OBJECT_EVENT_GFX_CELIO
|
||||
[OBJECT_EVENT_GFX_TEACHY_TV_HOST / 2] = 0x00, // OBJECT_EVENT_GFX_GYM_GUY
|
||||
[OBJECT_EVENT_GFX_ITEM_BALL / 2] = 0x33, // OBJECT_EVENT_GFX_TOWN_MAP
|
||||
[OBJECT_EVENT_GFX_POKEDEX / 2] = 0x33, // OBJECT_EVENT_GFX_CUT_TREE
|
||||
[OBJECT_EVENT_GFX_ROCK_SMASH_ROCK / 2] = 0x33, // OBJECT_EVENT_GFX_STRENGTH_BOULDER
|
||||
[OBJECT_EVENT_GFX_FOSSIL / 2] = 0x33, // OBJECT_EVENT_GFX_RUBY
|
||||
[OBJECT_EVENT_GFX_SAPPHIRE / 2] = 0x33, // OBJECT_EVENT_GFX_OLD_AMBER
|
||||
[OBJECT_EVENT_GFX_GYM_SIGN / 2] = 0x33, // OBJECT_EVENT_GFX_SIGN
|
||||
[OBJECT_EVENT_GFX_TRAINER_TIPS / 2] = 0x33, // OBJECT_EVENT_GFX_CLIPBOARD
|
||||
[OBJECT_EVENT_GFX_METEORITE / 2] = 0x33, // OBJECT_EVENT_GFX_LAPRAS_DOLL
|
||||
[OBJECT_EVENT_GFX_SEAGALLOP / 2] = 0x23, // OBJECT_EVENT_GFX_SNORLAX
|
||||
[OBJECT_EVENT_GFX_SPEAROW / 2] = 0x22, // OBJECT_EVENT_GFX_CUBONE
|
||||
[OBJECT_EVENT_GFX_POLIWRATH / 2] = 0x22, // OBJECT_EVENT_GFX_CLEFAIRY
|
||||
[OBJECT_EVENT_GFX_PIDGEOT / 2] = 0x22, // OBJECT_EVENT_GFX_JIGGLYPUFF
|
||||
[OBJECT_EVENT_GFX_PIDGEY / 2] = 0x22, // OBJECT_EVENT_GFX_CHANSEY
|
||||
[OBJECT_EVENT_GFX_OMANYTE / 2] = 0x22, // OBJECT_EVENT_GFX_KANGASKHAN
|
||||
[OBJECT_EVENT_GFX_PIKACHU / 2] = 0x22, // OBJECT_EVENT_GFX_PSYDUCK
|
||||
[OBJECT_EVENT_GFX_NIDORAN_F / 2] = 0x22, // OBJECT_EVENT_GFX_NIDORAN_M
|
||||
[OBJECT_EVENT_GFX_NIDORINO / 2] = 0x22, // OBJECT_EVENT_GFX_MEOWTH
|
||||
[OBJECT_EVENT_GFX_SEEL / 2] = 0x22, // OBJECT_EVENT_GFX_VOLTORB
|
||||
[OBJECT_EVENT_GFX_SLOWPOKE / 2] = 0x22, // OBJECT_EVENT_GFX_SLOWBRO
|
||||
[OBJECT_EVENT_GFX_MACHOP / 2] = 0x22, // OBJECT_EVENT_GFX_WIGGLYTUFF
|
||||
[OBJECT_EVENT_GFX_DODUO / 2] = 0x22, // OBJECT_EVENT_GFX_FEAROW
|
||||
[OBJECT_EVENT_GFX_MACHOKE / 2] = 0x22, // OBJECT_EVENT_GFX_LAPRAS
|
||||
[OBJECT_EVENT_GFX_ZAPDOS / 2] = 0x22, // OBJECT_EVENT_GFX_MOLTRES
|
||||
[OBJECT_EVENT_GFX_ARTICUNO / 2] = 0x22, // OBJECT_EVENT_GFX_MEWTWO
|
||||
[OBJECT_EVENT_GFX_MEW / 2] = 0x22, // OBJECT_EVENT_GFX_ENTEI
|
||||
[OBJECT_EVENT_GFX_SUICUNE / 2] = 0x22, // OBJECT_EVENT_GFX_RAIKOU
|
||||
[OBJECT_EVENT_GFX_LUGIA / 2] = 0x22, // OBJECT_EVENT_GFX_HO_OH
|
||||
[OBJECT_EVENT_GFX_CELEBI / 2] = 0x22, // OBJECT_EVENT_GFX_KABUTO
|
||||
[OBJECT_EVENT_GFX_DEOXYS_D / 2] = 0x22, // OBJECT_EVENT_GFX_DEOXYS_A
|
||||
[OBJECT_EVENT_GFX_DEOXYS_N / 2] = 0x32, // OBJECT_EVENT_GFX_SS_ANNE
|
||||
};
|
||||
|
||||
void DynamicPlaceholderTextUtil_Reset(void)
|
||||
@@ -63,7 +136,7 @@ u8 GetColorFromTextColorTable(u16 graphicId)
|
||||
u32 test = graphicId >> 1;
|
||||
u32 shift = (graphicId & 1) << 2;
|
||||
|
||||
if (test > 0x4B)
|
||||
if (test >= NELEMS(sTextColorTable))
|
||||
return 3;
|
||||
else
|
||||
return (sTextColorTable[graphicId >> 1] >> shift) & 0xF;
|
||||
|
||||
+84
-75
@@ -1,25 +1,18 @@
|
||||
#include "global.h"
|
||||
#include "link.h"
|
||||
#include "unk_815c27c.h"
|
||||
|
||||
enum {
|
||||
EREADER_XFR_STATE_INIT,
|
||||
EREADER_XFR_STATE_HANDSHAKE,
|
||||
EREADER_XFR_STATE_START,
|
||||
EREADER_XFR_STATE_TRANSFER,
|
||||
};
|
||||
#include "ereader_helpers.h"
|
||||
|
||||
struct SendRecvMgr
|
||||
{
|
||||
u8 sendOrRecv;
|
||||
u8 state;
|
||||
u8 field_02;
|
||||
u8 field_03;
|
||||
u8 field_04;
|
||||
u32 * dataptr;
|
||||
int cursor;
|
||||
int size;
|
||||
u32 checksum;
|
||||
u8 master_slave; // 0: clock slave; 1: clock master
|
||||
u8 state; // EREADER_XFR_STATE_*
|
||||
u8 xferState; // EREADER_XFER_*
|
||||
u8 checksumResult; // EREADER_CHECKSUM_*
|
||||
u8 cancellationReason; // EREADER_CANCEL_*
|
||||
u32 * dataptr; // Payload source or destination
|
||||
int cursor; // Index of the next word
|
||||
int size; // Last word index
|
||||
u32 checksum; // Validation checksum
|
||||
};
|
||||
|
||||
static bool16 DetermineSendRecvState(u8);
|
||||
@@ -39,10 +32,9 @@ static u16 sSavedIme;
|
||||
static u16 sSavedIe;
|
||||
static u16 sSavedTm3Cnt;
|
||||
static u16 sSavedSioCnt;
|
||||
static u16 sSavedSioCnt;
|
||||
static u16 sSavedRCnt;
|
||||
|
||||
int EReader_Send(size_t r6, const void * r5)
|
||||
int EReader_Send(size_t size, const void * src)
|
||||
{
|
||||
int result;
|
||||
EReaderHelper_SaveRegsState();
|
||||
@@ -53,18 +45,18 @@ int EReader_Send(size_t r6, const void * r5)
|
||||
if (TEST_BUTTON(sJoyNew, B_BUTTON))
|
||||
gShouldAdvanceLinkState = 2;
|
||||
|
||||
sSendRecvStatus = EReaderHandleTransfer(1, r6, r5, NULL);
|
||||
if ((sSendRecvStatus & 0x13) == 0x10)
|
||||
sSendRecvStatus = EReaderHandleTransfer(1, size, src, NULL);
|
||||
if ((sSendRecvStatus & 0x13) == 0x10) // checksum OK and xfer off
|
||||
{
|
||||
result = 0;
|
||||
break;
|
||||
}
|
||||
else if (sSendRecvStatus & 8)
|
||||
else if (sSendRecvStatus & 8) // cancelled by player
|
||||
{
|
||||
result = 1;
|
||||
break;
|
||||
}
|
||||
else if (sSendRecvStatus & 4)
|
||||
else if (sSendRecvStatus & 4) // timed out
|
||||
{
|
||||
result = 2;
|
||||
break;
|
||||
@@ -81,7 +73,7 @@ int EReader_Send(size_t r6, const void * r5)
|
||||
return result;
|
||||
}
|
||||
|
||||
int EReader_Recv(void * r5)
|
||||
int EReader_Recv(void * dest)
|
||||
{
|
||||
int result;
|
||||
EReaderHelper_SaveRegsState();
|
||||
@@ -92,18 +84,18 @@ int EReader_Recv(void * r5)
|
||||
if (TEST_BUTTON(sJoyNew, B_BUTTON))
|
||||
gShouldAdvanceLinkState = 2;
|
||||
|
||||
sSendRecvStatus = EReaderHandleTransfer(0, 0, NULL, r5);
|
||||
if ((sSendRecvStatus & 0x13) == 0x10)
|
||||
sSendRecvStatus = EReaderHandleTransfer(0, 0, NULL, dest);
|
||||
if ((sSendRecvStatus & 0x13) == 0x10) // checksum OK and xfer off
|
||||
{
|
||||
result = 0;
|
||||
break;
|
||||
}
|
||||
else if (sSendRecvStatus & 8)
|
||||
else if (sSendRecvStatus & 8) // cancelled by player
|
||||
{
|
||||
result = 1;
|
||||
break;
|
||||
}
|
||||
else if (sSendRecvStatus & 4)
|
||||
else if (sSendRecvStatus & 4) // timed out
|
||||
{
|
||||
result = 2;
|
||||
break;
|
||||
@@ -159,92 +151,98 @@ u16 EReaderHandleTransfer(u8 mode, size_t size, const void * data, void * recvBu
|
||||
{
|
||||
switch (sSendRecvMgr.state)
|
||||
{
|
||||
case 0:
|
||||
case EREADER_XFR_STATE_INIT:
|
||||
OpenSerialMulti();
|
||||
sSendRecvMgr.field_02 = 1;
|
||||
sSendRecvMgr.state = 1;
|
||||
sSendRecvMgr.xferState = EREADER_XFER_EXE;
|
||||
sSendRecvMgr.state = EREADER_XFR_STATE_HANDSHAKE;
|
||||
break;
|
||||
case 1:
|
||||
case EREADER_XFR_STATE_HANDSHAKE:
|
||||
if (DetermineSendRecvState(mode))
|
||||
EnableSio();
|
||||
if (gShouldAdvanceLinkState == 2)
|
||||
{
|
||||
sSendRecvMgr.field_04 = 2;
|
||||
sSendRecvMgr.state = 6;
|
||||
sSendRecvMgr.cancellationReason = EREADER_CANCEL_KEY;
|
||||
sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
|
||||
}
|
||||
// Progression is handled by the serial callback
|
||||
break;
|
||||
case 2:
|
||||
case EREADER_XFR_STATE_START:
|
||||
OpenSerial32();
|
||||
SetUpTransferManager(size, data, recvBuffer);
|
||||
sSendRecvMgr.state = 3;
|
||||
sSendRecvMgr.state = EREADER_XFR_STATE_TRANSFER;
|
||||
// fallthrough
|
||||
case 3:
|
||||
case EREADER_XFR_STATE_TRANSFER:
|
||||
if (gShouldAdvanceLinkState == 2)
|
||||
{
|
||||
sSendRecvMgr.field_04 = 2;
|
||||
sSendRecvMgr.state = 6;
|
||||
sSendRecvMgr.cancellationReason = EREADER_CANCEL_KEY;
|
||||
sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
sCounter1++;
|
||||
sCounter2++;
|
||||
if (sSendRecvMgr.sendOrRecv == 0 && sCounter2 > 60)
|
||||
if (sSendRecvMgr.master_slave == 0 && sCounter2 > 60)
|
||||
{
|
||||
sSendRecvMgr.field_04 = 1;
|
||||
sSendRecvMgr.state = 6;
|
||||
sSendRecvMgr.cancellationReason = EREADER_CANCEL_TIMEOUT;
|
||||
sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
|
||||
}
|
||||
if (sSendRecvMgr.field_02 != 2)
|
||||
if (sSendRecvMgr.xferState != EREADER_XFER_CHK)
|
||||
{
|
||||
if (sSendRecvMgr.sendOrRecv != 0 && sCounter1 > 2)
|
||||
if (sSendRecvMgr.master_slave != 0 && sCounter1 > 2)
|
||||
{
|
||||
EnableSio();
|
||||
sSendRecvMgr.field_02 = 2;
|
||||
sSendRecvMgr.xferState = EREADER_XFER_CHK;
|
||||
}
|
||||
else
|
||||
{
|
||||
EnableSio();
|
||||
sSendRecvMgr.field_02 = 2;
|
||||
sSendRecvMgr.xferState = EREADER_XFER_CHK;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Progression is handled by the serial callback
|
||||
break;
|
||||
case 4:
|
||||
case EREADER_XFR_STATE_TRANSFER_DONE:
|
||||
OpenSerialMulti();
|
||||
sSendRecvMgr.state = 5;
|
||||
sSendRecvMgr.state = EREADER_XFR_STATE_CHECKSUM;
|
||||
break;
|
||||
case 5:
|
||||
if (sSendRecvMgr.sendOrRecv == 1 && sCounter1 > 2)
|
||||
case EREADER_XFR_STATE_CHECKSUM:
|
||||
if (sSendRecvMgr.master_slave == 1 && sCounter1 > 2)
|
||||
EnableSio();
|
||||
if (++sCounter1 > 60)
|
||||
{
|
||||
sSendRecvMgr.field_04 = 1;
|
||||
sSendRecvMgr.state = 6;
|
||||
sSendRecvMgr.cancellationReason = EREADER_CANCEL_TIMEOUT;
|
||||
sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
if (sSendRecvMgr.field_02 != 0)
|
||||
// Progression is handled by the serial callback
|
||||
case EREADER_XFR_STATE_DONE:
|
||||
if (sSendRecvMgr.xferState != 0)
|
||||
{
|
||||
CloseSerial();
|
||||
sSendRecvMgr.field_02 = 0;
|
||||
sSendRecvMgr.xferState = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return sSendRecvMgr.field_02 | (sSendRecvMgr.field_04 << 2) | (sSendRecvMgr.field_03 << 4);
|
||||
return
|
||||
(sSendRecvMgr.xferState << EREADER_XFER_SHIFT)
|
||||
| (sSendRecvMgr.cancellationReason << EREADER_CANCEL_SHIFT)
|
||||
| (sSendRecvMgr.checksumResult << EREADER_CHECKSUM_SHIFT);
|
||||
}
|
||||
|
||||
static bool16 DetermineSendRecvState(u8 mode)
|
||||
{
|
||||
bool16 resp;
|
||||
if ((*(vu32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SI | SIO_MULTI_SD)) == SIO_MULTI_SD && mode)
|
||||
resp = sSendRecvMgr.sendOrRecv = TRUE;
|
||||
resp = sSendRecvMgr.master_slave = TRUE;
|
||||
else
|
||||
resp = sSendRecvMgr.sendOrRecv = FALSE;
|
||||
resp = sSendRecvMgr.master_slave = FALSE;
|
||||
return resp;
|
||||
}
|
||||
|
||||
static void SetUpTransferManager(size_t size, const void * data, void * recvBuffer)
|
||||
{
|
||||
if (sSendRecvMgr.sendOrRecv)
|
||||
if (sSendRecvMgr.master_slave)
|
||||
{
|
||||
REG_SIOCNT |= SIO_38400_BPS;
|
||||
sSendRecvMgr.dataptr = (void *)data;
|
||||
@@ -284,7 +282,7 @@ void EReaderHelper_SerialCallback(void)
|
||||
|
||||
switch (sSendRecvMgr.state)
|
||||
{
|
||||
case 1:
|
||||
case EREADER_XFR_STATE_HANDSHAKE:
|
||||
REG_SIOMLT_SEND = 0xCCD0;
|
||||
*(u64 *)recv = REG_SIOMLT_RECV;
|
||||
for (i = 0, cnt1 = 0, cnt2 = 0; i < 4; i++)
|
||||
@@ -295,14 +293,17 @@ void EReaderHelper_SerialCallback(void)
|
||||
cnt2++;
|
||||
}
|
||||
if (cnt1 == 2 && cnt2 == 0)
|
||||
sSendRecvMgr.state = 2;
|
||||
sSendRecvMgr.state = EREADER_XFR_STATE_START;
|
||||
break;
|
||||
case 3:
|
||||
// Progression is handled by software
|
||||
case EREADER_XFR_STATE_TRANSFER:
|
||||
recv32 = REG_SIODATA32;
|
||||
if (sSendRecvMgr.cursor == 0 && sSendRecvMgr.sendOrRecv == 0)
|
||||
// The first value sent by the EReader is the payload size
|
||||
if (sSendRecvMgr.cursor == 0 && sSendRecvMgr.master_slave == 0)
|
||||
sSendRecvMgr.size = recv32 / 4 + 1;
|
||||
if (sSendRecvMgr.sendOrRecv == 1)
|
||||
if (sSendRecvMgr.master_slave == 1)
|
||||
{
|
||||
// Send mode
|
||||
if (sSendRecvMgr.cursor < sSendRecvMgr.size)
|
||||
{
|
||||
REG_SIODATA32 = sSendRecvMgr.dataptr[sSendRecvMgr.cursor];
|
||||
@@ -313,43 +314,51 @@ void EReaderHelper_SerialCallback(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
// Receive mode
|
||||
if (sSendRecvMgr.cursor > 0 && sSendRecvMgr.cursor < sSendRecvMgr.size + 1)
|
||||
{
|
||||
// Receive next word
|
||||
sSendRecvMgr.dataptr[sSendRecvMgr.cursor - 1] = recv32;
|
||||
sSendRecvMgr.checksum += recv32;
|
||||
}
|
||||
else if (sSendRecvMgr.cursor != 0)
|
||||
{
|
||||
// Reached the end, test the received checksum
|
||||
if (sSendRecvMgr.checksum == recv32)
|
||||
sSendRecvMgr.field_03 = 1;
|
||||
sSendRecvMgr.checksumResult = EREADER_CHECKSUM_OK;
|
||||
else
|
||||
sSendRecvMgr.field_03 = 2;
|
||||
sSendRecvMgr.checksumResult = EREADER_CHECKSUM_ERR;
|
||||
}
|
||||
sCounter2 = 0;
|
||||
}
|
||||
sSendRecvMgr.cursor++;
|
||||
if (sSendRecvMgr.cursor < sSendRecvMgr.size + 2)
|
||||
{
|
||||
if (sSendRecvMgr.sendOrRecv != 0)
|
||||
if (sSendRecvMgr.master_slave != 0)
|
||||
// Clock master; start timer
|
||||
REG_TM3CNT_H |= TIMER_ENABLE;
|
||||
else
|
||||
// Clock slave; reset
|
||||
EnableSio();
|
||||
}
|
||||
else
|
||||
{
|
||||
sSendRecvMgr.state = 4;
|
||||
sSendRecvMgr.state = EREADER_XFR_STATE_TRANSFER_DONE;
|
||||
sCounter1 = 0;
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
if (sSendRecvMgr.sendOrRecv == 0)
|
||||
REG_SIODATA8 = sSendRecvMgr.field_03;
|
||||
// Progression is handled by the software
|
||||
case EREADER_XFR_STATE_CHECKSUM:
|
||||
if (sSendRecvMgr.master_slave == 0)
|
||||
// Clock slave
|
||||
REG_SIODATA8 = sSendRecvMgr.checksumResult;
|
||||
*(vu64 *)recv = REG_SIOMLT_RECV;
|
||||
if (recv[1] == 1 || recv[1] == 2)
|
||||
if (recv[1] == EREADER_CHECKSUM_OK || recv[1] == EREADER_CHECKSUM_ERR)
|
||||
{
|
||||
if (sSendRecvMgr.sendOrRecv == 1)
|
||||
sSendRecvMgr.field_03 = recv[1];
|
||||
sSendRecvMgr.state = 6;
|
||||
if (sSendRecvMgr.master_slave == 1)
|
||||
// EReader has (in)validated the payload
|
||||
sSendRecvMgr.checksumResult = recv[1];
|
||||
sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
+2
-2
@@ -118,7 +118,7 @@ bool32 IsMysteryGiftEnabled(void)
|
||||
return FlagGet(FLAG_SYS_MYSTERY_GIFT_ENABLED);
|
||||
}
|
||||
|
||||
void sub_806E2D0(void)
|
||||
void ResetMysteryEventFlags(void)
|
||||
{
|
||||
FlagClear(FLAG_MYSTERY_EVENT_DONE);
|
||||
FlagClear(FLAG_0x3D9);
|
||||
@@ -138,7 +138,7 @@ void sub_806E2D0(void)
|
||||
FlagClear(FLAG_0x3E7);
|
||||
}
|
||||
|
||||
void sub_806E370(void)
|
||||
void ResetMysteryEventVars(void)
|
||||
{
|
||||
VarSet(VAR_EVENT_PICHU_SLOT, 0);
|
||||
VarSet(VAR_0x40B6, 0);
|
||||
|
||||
@@ -0,0 +1,653 @@
|
||||
#include "global.h"
|
||||
#include "event_object_80688E4.h"
|
||||
#include "event_object_movement.h"
|
||||
#include "field_effect.h"
|
||||
#include "field_ground_effect.h"
|
||||
|
||||
// This is part of evobjmv.c (see assert statement in DoObjectUnionRoomWarpYDisplacement).
|
||||
|
||||
static void DoObjectUnionRoomWarpYDisplacement(struct Sprite * sprite);
|
||||
|
||||
bool8 FreezeObjectEvent(struct ObjectEvent * objectEvent)
|
||||
{
|
||||
if (objectEvent->heldMovementActive || objectEvent->frozen)
|
||||
return TRUE;
|
||||
objectEvent->frozen = TRUE;
|
||||
objectEvent->spriteAnimPausedBackup = gSprites[objectEvent->spriteId].animPaused;
|
||||
objectEvent->spriteAffineAnimPausedBackup = gSprites[objectEvent->spriteId].affineAnimPaused;
|
||||
gSprites[objectEvent->spriteId].animPaused = TRUE;
|
||||
gSprites[objectEvent->spriteId].affineAnimPaused = TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void FreezeObjectEvents(void)
|
||||
{
|
||||
u8 i;
|
||||
for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
|
||||
{
|
||||
if (gObjectEvents[i].active && i != gPlayerAvatar.objectEventId)
|
||||
FreezeObjectEvent(&gObjectEvents[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void FreezeObjectEventsExceptOne(u8 noFreeze)
|
||||
{
|
||||
u8 i;
|
||||
for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
|
||||
{
|
||||
if (i != noFreeze && gObjectEvents[i].active && i != gPlayerAvatar.objectEventId)
|
||||
FreezeObjectEvent(&gObjectEvents[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void UnfreezeObjectEvent(struct ObjectEvent * objectEvent)
|
||||
{
|
||||
if (objectEvent->active && objectEvent->frozen)
|
||||
{
|
||||
objectEvent->frozen = FALSE;
|
||||
gSprites[objectEvent->spriteId].animPaused = objectEvent->spriteAnimPausedBackup;
|
||||
gSprites[objectEvent->spriteId].affineAnimPaused = objectEvent->spriteAffineAnimPausedBackup;
|
||||
}
|
||||
}
|
||||
|
||||
void UnfreezeObjectEvents(void)
|
||||
{
|
||||
u8 i;
|
||||
for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
|
||||
{
|
||||
if (gObjectEvents[i].active)
|
||||
UnfreezeObjectEvent(&gObjectEvents[i]);
|
||||
}
|
||||
}
|
||||
|
||||
#define tObjectEventId data[0]
|
||||
#define tZCoord data[1]
|
||||
#define tInvisible data[2]
|
||||
|
||||
#define tDirection data[3]
|
||||
#define tSpeed data[4]
|
||||
#define tStepNo data[5]
|
||||
|
||||
static void little_step(struct Sprite * sprite, u8 direction)
|
||||
{
|
||||
sprite->pos1.x += gUnknown_83A64C8[direction].x;
|
||||
sprite->pos1.y += gUnknown_83A64C8[direction].y;
|
||||
}
|
||||
|
||||
static void double_little_steps(struct Sprite * sprite, u8 direction)
|
||||
{
|
||||
sprite->pos1.x += 2 * gUnknown_83A64C8[direction].x;
|
||||
sprite->pos1.y += 2 * gUnknown_83A64C8[direction].y;
|
||||
}
|
||||
|
||||
static void triple_little_steps(struct Sprite * sprite, u8 direction)
|
||||
{
|
||||
sprite->pos1.x += 2 * gUnknown_83A64C8[direction].x + gUnknown_83A64C8[direction].x;
|
||||
sprite->pos1.y += 2 * gUnknown_83A64C8[direction].y + gUnknown_83A64C8[direction].y;
|
||||
}
|
||||
|
||||
static void quad_little_steps(struct Sprite * sprite, u8 direction)
|
||||
{
|
||||
sprite->pos1.x += 4 * gUnknown_83A64C8[direction].x;
|
||||
sprite->pos1.y += 4 * gUnknown_83A64C8[direction].y;
|
||||
}
|
||||
|
||||
static void oct_little_steps(struct Sprite * sprite, u8 direction)
|
||||
{
|
||||
sprite->pos1.x += 8 * gUnknown_83A64C8[direction].x;
|
||||
sprite->pos1.y += 8 * gUnknown_83A64C8[direction].y;
|
||||
}
|
||||
|
||||
void oamt_npc_ministep_reset(struct Sprite * sprite, u8 direction, u8 speed)
|
||||
{
|
||||
sprite->tDirection = direction;
|
||||
sprite->tSpeed = speed;
|
||||
sprite->tStepNo = 0;
|
||||
}
|
||||
|
||||
typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 direction);
|
||||
|
||||
static const SpriteStepFunc sSpeed0[] = {
|
||||
little_step,
|
||||
little_step,
|
||||
little_step,
|
||||
little_step,
|
||||
little_step,
|
||||
little_step,
|
||||
little_step,
|
||||
little_step,
|
||||
little_step,
|
||||
little_step,
|
||||
little_step,
|
||||
little_step,
|
||||
little_step,
|
||||
little_step,
|
||||
little_step,
|
||||
little_step
|
||||
};
|
||||
|
||||
static const SpriteStepFunc sSpeed1[] = {
|
||||
double_little_steps,
|
||||
double_little_steps,
|
||||
double_little_steps,
|
||||
double_little_steps,
|
||||
double_little_steps,
|
||||
double_little_steps,
|
||||
double_little_steps,
|
||||
double_little_steps
|
||||
};
|
||||
|
||||
static const SpriteStepFunc sSpeed2[] = {
|
||||
double_little_steps,
|
||||
triple_little_steps,
|
||||
triple_little_steps,
|
||||
double_little_steps,
|
||||
triple_little_steps,
|
||||
triple_little_steps
|
||||
};
|
||||
|
||||
static const SpriteStepFunc sSpeed3[] = {
|
||||
quad_little_steps,
|
||||
quad_little_steps,
|
||||
quad_little_steps,
|
||||
quad_little_steps
|
||||
};
|
||||
|
||||
static const SpriteStepFunc sSpeed4[] = {
|
||||
oct_little_steps,
|
||||
oct_little_steps
|
||||
};
|
||||
|
||||
static const SpriteStepFunc *const sSpriteStepFuncsBySpeed[] = {
|
||||
sSpeed0,
|
||||
sSpeed1,
|
||||
sSpeed2,
|
||||
sSpeed3,
|
||||
sSpeed4
|
||||
};
|
||||
|
||||
static const s16 sSpriteStepCountsBySpeed[] = {
|
||||
NELEMS(sSpeed0),
|
||||
NELEMS(sSpeed1),
|
||||
NELEMS(sSpeed2),
|
||||
NELEMS(sSpeed3),
|
||||
NELEMS(sSpeed4)
|
||||
};
|
||||
|
||||
bool8 obj_npc_ministep(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->tStepNo >= sSpriteStepCountsBySpeed[sprite->tSpeed])
|
||||
return FALSE;
|
||||
|
||||
sSpriteStepFuncsBySpeed[sprite->tSpeed][sprite->tStepNo](sprite, sprite->tDirection);
|
||||
|
||||
sprite->tStepNo++;
|
||||
|
||||
if (sprite->tStepNo < sSpriteStepCountsBySpeed[sprite->tSpeed])
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#undef tStepNo
|
||||
#undef tSpeed
|
||||
#undef tDirection
|
||||
|
||||
#define tDirection data[3]
|
||||
#define tDelay data[4]
|
||||
#define tStepNo data[5]
|
||||
|
||||
void sub_8068BBC(struct Sprite *sprite, u8 direction)
|
||||
{
|
||||
sprite->tDirection = direction;
|
||||
sprite->tDelay = 0;
|
||||
sprite->tStepNo = 0;
|
||||
}
|
||||
|
||||
bool8 sub_8068BCC(struct Sprite *sprite)
|
||||
{
|
||||
if (!(sprite->tDelay & 1))
|
||||
{
|
||||
little_step(sprite, sprite->tDirection);
|
||||
sprite->tStepNo++;
|
||||
}
|
||||
|
||||
sprite->tDelay++;
|
||||
|
||||
if (sprite->tStepNo > 15)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void sub_8068C08(struct Sprite *sprite, u8 direction)
|
||||
{
|
||||
sprite->tDirection = direction;
|
||||
sprite->tDelay = 0;
|
||||
sprite->tStepNo = 0;
|
||||
}
|
||||
|
||||
bool8 sub_8068C18(struct Sprite *sprite)
|
||||
{
|
||||
if (++sprite->tDelay < 3)
|
||||
{
|
||||
little_step(sprite, sprite->tDirection);
|
||||
sprite->tStepNo++;
|
||||
}
|
||||
else
|
||||
sprite->tDelay = 0;
|
||||
|
||||
if (sprite->tStepNo > 15)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void sub_8068C58(struct Sprite *sprite, u8 direction)
|
||||
{
|
||||
sprite->tDirection = direction;
|
||||
sprite->tDelay = 0;
|
||||
sprite->tStepNo = 0;
|
||||
}
|
||||
|
||||
bool8 sub_8068C68(struct Sprite *sprite)
|
||||
{
|
||||
if (++sprite->tDelay > 9)
|
||||
{
|
||||
sprite->tDelay = 0;
|
||||
little_step(sprite, sprite->tDirection);
|
||||
sprite->tStepNo++;
|
||||
}
|
||||
|
||||
if (sprite->tStepNo > 15)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void sub_8068CA4(struct Sprite *sprite, u8 direction)
|
||||
{
|
||||
sprite->tDirection = direction;
|
||||
sprite->tDelay = 0;
|
||||
sprite->tStepNo = 0;
|
||||
}
|
||||
|
||||
bool8 sub_8068CB4(struct Sprite *sprite)
|
||||
{
|
||||
if ((++sprite->tDelay) & 1)
|
||||
{
|
||||
little_step(sprite, sprite->tDirection);
|
||||
sprite->tStepNo++;
|
||||
}
|
||||
else
|
||||
{
|
||||
double_little_steps(sprite, sprite->tDirection);
|
||||
sprite->tStepNo += 2;
|
||||
}
|
||||
|
||||
if (sprite->tStepNo > 15)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#undef tStepNo
|
||||
#undef tDelay
|
||||
#undef tDirection
|
||||
|
||||
#define tDirection data[3]
|
||||
#define tJumpSpeed data[4]
|
||||
#define tJumpHeight data[5]
|
||||
#define tStepNo data[6]
|
||||
|
||||
static const s8 sJumpHeight12[] = {
|
||||
-4, -6, -8, -10, -11, -12, -12, -12, -11, -10, -9, -8, -6, -4, 0, 0
|
||||
};
|
||||
|
||||
static const s8 sJumpHeight6[] = {
|
||||
0, -2, -3, -4, -5, -6, -6, -6, -5, -5, -4, -3, -2, 0, 0, 0
|
||||
};
|
||||
|
||||
static const s8 sJumpHeight10[] = {
|
||||
-2, -4, -6, -8, -9, -10, -10, -10, -9, -8, -6, -5, -3, -2, 0, 0
|
||||
};
|
||||
|
||||
static const s8 *const sYDisplacementPtrs[] = {
|
||||
sJumpHeight12,
|
||||
sJumpHeight6,
|
||||
sJumpHeight10
|
||||
};
|
||||
|
||||
static s16 GetJumpYDisplacement(s16 stepno, u8 jumpno)
|
||||
{
|
||||
return sYDisplacementPtrs[jumpno][stepno];
|
||||
}
|
||||
|
||||
void sub_8068D1C(struct Sprite *sprite, u8 direction, u8 speed, u8 height)
|
||||
{
|
||||
sprite->tDirection = direction;
|
||||
sprite->tJumpSpeed = speed;
|
||||
sprite->tJumpHeight = height;
|
||||
sprite->tStepNo = 0;
|
||||
}
|
||||
|
||||
u8 sub_8068D3C(struct Sprite *sprite)
|
||||
{
|
||||
s16 duration[3] = {0x10, 0x10, 0x20};
|
||||
u8 shifts[3] = {0, 0, 1};
|
||||
u8 jumpPhase = 0;
|
||||
|
||||
if (sprite->tJumpSpeed != 0)
|
||||
little_step(sprite, sprite->tDirection);
|
||||
|
||||
sprite->pos2.y = GetJumpYDisplacement(sprite->tStepNo >> shifts[sprite->tJumpSpeed], sprite->tJumpHeight);
|
||||
|
||||
sprite->tStepNo++;
|
||||
|
||||
if (sprite->tStepNo == (duration[sprite->tJumpSpeed] >> 1))
|
||||
jumpPhase = 1;
|
||||
|
||||
if (sprite->tStepNo >= duration[sprite->tJumpSpeed])
|
||||
{
|
||||
sprite->pos2.y = 0;
|
||||
jumpPhase = -1;
|
||||
}
|
||||
|
||||
return jumpPhase;
|
||||
}
|
||||
|
||||
u8 sub_8068DC4(struct Sprite *sprite)
|
||||
{
|
||||
s16 duration[3] = {0x20, 0x20, 0x40};
|
||||
u8 shifts[3] = {1, 1, 2};
|
||||
u8 jumpPhase = 0;
|
||||
|
||||
if (sprite->tJumpSpeed != 0 && !(sprite->tStepNo & 1))
|
||||
little_step(sprite, sprite->tDirection);
|
||||
|
||||
sprite->pos2.y = GetJumpYDisplacement(sprite->tStepNo >> shifts[sprite->tJumpSpeed], sprite->tJumpHeight);
|
||||
|
||||
sprite->tStepNo++;
|
||||
|
||||
if (sprite->tStepNo == (duration[sprite->tJumpSpeed] >> 1))
|
||||
jumpPhase = 1;
|
||||
|
||||
if (sprite->tStepNo >= duration[sprite->tJumpSpeed])
|
||||
{
|
||||
sprite->pos2.y = 0;
|
||||
jumpPhase = -1;
|
||||
}
|
||||
|
||||
return jumpPhase;
|
||||
}
|
||||
|
||||
#undef tStepNo
|
||||
#undef tJumpHeight
|
||||
#undef tJumpSpeed
|
||||
#undef tDirection
|
||||
|
||||
#define tDelay data[3]
|
||||
|
||||
void SetObjectEventStepTimer(struct Sprite *sprite, s16 delay)
|
||||
{
|
||||
sprite->tDelay = delay;
|
||||
}
|
||||
|
||||
bool8 RunObjectEventStepTimer(struct Sprite *sprite)
|
||||
{
|
||||
sprite->tDelay--;
|
||||
|
||||
if (sprite->tDelay == 0)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#undef tDelay
|
||||
|
||||
void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 animNum, u8 animCmdIndex)
|
||||
{
|
||||
sprite->animNum = animNum;
|
||||
sprite->animPaused = FALSE;
|
||||
SeekSpriteAnim(sprite, animCmdIndex);
|
||||
}
|
||||
|
||||
bool8 SpriteAnimEnded(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->animEnded)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void UpdateObjectEventSpriteVisibility(struct Sprite *sprite, bool8 invisible)
|
||||
{
|
||||
u16 x, y;
|
||||
s16 x2, y2;
|
||||
|
||||
sprite->invisible = invisible;
|
||||
|
||||
if (sprite->coordOffsetEnabled)
|
||||
{
|
||||
x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX;
|
||||
y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY;
|
||||
}
|
||||
else
|
||||
{
|
||||
x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
|
||||
y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
|
||||
}
|
||||
|
||||
x2 = x - (sprite->centerToCornerVecX >> 1);
|
||||
y2 = y - (sprite->centerToCornerVecY >> 1);
|
||||
|
||||
if ((s16)x > 255 || x2 < -16)
|
||||
sprite->invisible = TRUE;
|
||||
if ((s16)y > 175 || y2 < -16)
|
||||
sprite->invisible = TRUE;
|
||||
}
|
||||
|
||||
void UpdateObjectEventSpriteSubpriorityAndVisibility(struct Sprite *sprite)
|
||||
{
|
||||
DoObjectUnionRoomWarpYDisplacement(sprite);
|
||||
SetObjectSubpriorityByZCoord(sprite->tZCoord, sprite, 1);
|
||||
UpdateObjectEventSpriteVisibility(sprite, sprite->tInvisible);
|
||||
}
|
||||
|
||||
void sub_8068FD0(void)
|
||||
{
|
||||
s32 i;
|
||||
for (i = 0; i < MAX_SPRITES; i++)
|
||||
{
|
||||
struct Sprite *sprite = &gSprites[i];
|
||||
if (sprite->inUse && sprite->callback == UpdateObjectEventSpriteSubpriorityAndVisibility)
|
||||
{
|
||||
DestroySprite(sprite);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define tUnionRoomWarpAnimNo data[3]
|
||||
#define tUnionRoomWarpAnimState data[4]
|
||||
|
||||
static int GetObjectEventSpriteId(u8 objectEventId)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < MAX_SPRITES; i++)
|
||||
{
|
||||
struct Sprite *sprite = &gSprites[i];
|
||||
if (sprite->inUse && sprite->callback == UpdateObjectEventSpriteSubpriorityAndVisibility && (u8)sprite->tObjectEventId == objectEventId)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return MAX_SPRITES;
|
||||
}
|
||||
|
||||
void TurnObjectEvent(u8 objectEventId, u8 direction)
|
||||
{
|
||||
u8 animNum;
|
||||
u8 spriteId = GetObjectEventSpriteId(objectEventId);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
{
|
||||
struct Sprite *sprite = &gSprites[spriteId];
|
||||
StartSpriteAnim(sprite, ObjectEventDirectionToImageAnimId(direction));
|
||||
}
|
||||
}
|
||||
|
||||
void RfuUnionObjectSetFacingDirection(u8 objectEventId, u8 direction)
|
||||
{
|
||||
u8 animNum;
|
||||
int spriteId = GetObjectEventSpriteId(objectEventId);
|
||||
u16 baseBlock;
|
||||
if (spriteId != MAX_SPRITES)
|
||||
{
|
||||
struct Sprite *sprite = &gSprites[spriteId];
|
||||
const struct ObjectEventGraphicsInfo * info = GetObjectEventGraphicsInfo(direction);
|
||||
baseBlock = sprite->oam.tileNum;
|
||||
sprite->oam = *info->oam;
|
||||
sprite->oam.tileNum = baseBlock;
|
||||
sprite->oam.paletteNum = info->paletteSlot;
|
||||
sprite->images = info->images;
|
||||
if (info->subspriteTables == NULL)
|
||||
{
|
||||
sprite->subspriteTables = NULL;
|
||||
sprite->subspriteTableNum = 0;
|
||||
sprite->subspriteMode = SUBSPRITES_OFF;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetSubspriteTables(sprite, info->subspriteTables);
|
||||
sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;
|
||||
}
|
||||
StartSpriteAnim(sprite, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void RfuUnionObjectToggleInvisibility(u8 objectEventId, bool32 invisible)
|
||||
{
|
||||
u8 spriteId = GetObjectEventSpriteId(objectEventId);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
{
|
||||
if (invisible)
|
||||
gSprites[spriteId].tInvisible = TRUE;
|
||||
else
|
||||
gSprites[spriteId].tInvisible = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
bool32 RfuUnionObjectIsInvisible(u8 objectEventId)
|
||||
{
|
||||
u8 spriteId = GetObjectEventSpriteId(objectEventId);
|
||||
if (spriteId == MAX_SPRITES)
|
||||
return FALSE;
|
||||
return gSprites[spriteId].tInvisible == TRUE;
|
||||
}
|
||||
|
||||
void RfuUnionObjectStartWarp(u8 objectEventId, u8 animNo)
|
||||
{
|
||||
u8 spriteId = GetObjectEventSpriteId(objectEventId);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
{
|
||||
gSprites[spriteId].tUnionRoomWarpAnimNo = animNo;
|
||||
gSprites[spriteId].tUnionRoomWarpAnimState = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void DoObjectUnionRoomWarpYDisplacementUpwards(struct Sprite * sprite)
|
||||
{
|
||||
switch (sprite->tUnionRoomWarpAnimState)
|
||||
{
|
||||
case 0:
|
||||
sprite->pos2.y = 0;
|
||||
sprite->tUnionRoomWarpAnimState++;
|
||||
// fallthrough
|
||||
case 1:
|
||||
if ((sprite->pos2.y -= 8) == -160)
|
||||
{
|
||||
sprite->pos2.y = 0;
|
||||
sprite->tInvisible = 1;
|
||||
sprite->tUnionRoomWarpAnimNo = 0;
|
||||
sprite->tUnionRoomWarpAnimState = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void DoObjectUnionRoomWarpYDisplacementDownwards(struct Sprite * sprite)
|
||||
{
|
||||
switch (sprite->tUnionRoomWarpAnimState)
|
||||
{
|
||||
case 0:
|
||||
sprite->pos2.y = -160;
|
||||
sprite->tUnionRoomWarpAnimState++;
|
||||
// fallthrough
|
||||
case 1:
|
||||
if ((sprite->pos2.y += 8) == 0)
|
||||
{
|
||||
sprite->tUnionRoomWarpAnimNo = 0;
|
||||
sprite->tUnionRoomWarpAnimState = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void DoObjectUnionRoomWarpYDisplacement(struct Sprite * sprite)
|
||||
{
|
||||
switch (sprite->tUnionRoomWarpAnimNo)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
DoObjectUnionRoomWarpYDisplacementDownwards(sprite);
|
||||
break;
|
||||
case 2:
|
||||
DoObjectUnionRoomWarpYDisplacementUpwards(sprite);
|
||||
break;
|
||||
default:
|
||||
sprite->tUnionRoomWarpAnimNo = 0;
|
||||
AGB_ASSERT_EX(0, ABSPATH("evobjmv.c"), 13331);
|
||||
}
|
||||
}
|
||||
|
||||
bool32 RfuUnionObjectIsWarping(u8 objectEventId)
|
||||
{
|
||||
u8 spriteId = GetObjectEventSpriteId(objectEventId);
|
||||
if (spriteId == MAX_SPRITES)
|
||||
return FALSE;
|
||||
if (gSprites[spriteId].tUnionRoomWarpAnimNo)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#undef tUnionRoomWarpAnimState
|
||||
#undef tUnionRoomWarpAnimNo
|
||||
#undef tInvisible
|
||||
#undef tZCoord
|
||||
#undef tObjectEventId
|
||||
|
||||
u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct ObjectEvent * objectEvent)
|
||||
{
|
||||
ObjectEventGetLocalIdAndMap(objectEvent, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
|
||||
return FieldEffectStart(fieldEffectId);
|
||||
}
|
||||
|
||||
void DoShadowFieldEffect(struct ObjectEvent *objectEvent)
|
||||
{
|
||||
if (!objectEvent->hasShadow)
|
||||
{
|
||||
objectEvent->hasShadow = TRUE;
|
||||
oe_exec_and_other_stuff(FLDEFF_SHADOW, objectEvent);
|
||||
}
|
||||
}
|
||||
|
||||
void DoRippleFieldEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||
{
|
||||
const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);
|
||||
gFieldEffectArguments[0] = sprite->pos1.x;
|
||||
gFieldEffectArguments[1] = sprite->pos1.y + (graphicsInfo->height >> 1) - 2;
|
||||
gFieldEffectArguments[2] = 151;
|
||||
gFieldEffectArguments[3] = 3;
|
||||
FieldEffectStart(FLDEFF_RIPPLE);
|
||||
}
|
||||
@@ -51,7 +51,7 @@ void sub_80695CC(u8 taskId)
|
||||
task->data[0] = 1;
|
||||
}
|
||||
|
||||
if (task->data[1] == 0 && !gObjectEvents[gSelectedObjectEvent].mapobj_bit_1)
|
||||
if (task->data[1] == 0 && !gObjectEvents[gSelectedObjectEvent].singleMovementActive)
|
||||
{
|
||||
FreezeObjectEvent(&gObjectEvents[gSelectedObjectEvent]);
|
||||
task->data[1] = 1;
|
||||
@@ -78,7 +78,7 @@ void LockSelectedObjectEvent(void)
|
||||
|
||||
FreezeObjectEventsExceptOne(gSelectedObjectEvent);
|
||||
taskId = CreateTask(sub_80695CC, 80);
|
||||
if (!gObjectEvents[gSelectedObjectEvent].mapobj_bit_1)
|
||||
if (!gObjectEvents[gSelectedObjectEvent].singleMovementActive)
|
||||
{
|
||||
FreezeObjectEvent(&gObjectEvents[gSelectedObjectEvent]);
|
||||
gTasks[taskId].data[1] = 1;
|
||||
@@ -93,7 +93,7 @@ void sub_80696C0(void)
|
||||
UnfreezeObjectEvents();
|
||||
}
|
||||
|
||||
void sub_80696F0(void)
|
||||
void UnionRoom_UnlockPlayerAndChatPartner(void)
|
||||
{
|
||||
u8 objectEventId;
|
||||
if (gObjectEvents[gSelectedObjectEvent].active)
|
||||
|
||||
+1
-1
@@ -33,7 +33,7 @@
|
||||
#define SPRITETAG_QUESTION_MARK 1001
|
||||
#define SPRITETAG_SPINNING_POKEBALL 1002
|
||||
#define SPRITETAG_SCROLL_INDICATORS 1004
|
||||
#define SPRITETAG_DAISY 1006
|
||||
#define SPRITETAG_DAISY 1006 // TODO: Investigate, seems to be used for other NPCs (e.g. Fan Club Chairman)
|
||||
#define SPRITETAG_FUJI 1007
|
||||
#define SPRITETAG_OAK 1008
|
||||
#define SPRITETAG_BILL 1009
|
||||
|
||||
@@ -206,7 +206,7 @@ static void sub_807DDF0(u8 taskId)
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
sub_800AB9C();
|
||||
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
|
||||
task->data[0]++;
|
||||
break;
|
||||
case 1:
|
||||
@@ -227,7 +227,7 @@ static void sub_807DDF0(u8 taskId)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_807DE58(void)
|
||||
void FieldCB_ReturnToFieldWirelessLink(void)
|
||||
{
|
||||
ScriptContext2_Enable();
|
||||
Overworld_PlaySpecialMapMusic();
|
||||
@@ -632,7 +632,7 @@ static void sub_807E5EC(u8 taskId)
|
||||
break;
|
||||
case 2:
|
||||
WarpIntoMap();
|
||||
SetMainCallback2(sub_8056788);
|
||||
SetMainCallback2(CB2_ReturnToFieldCableClub);
|
||||
DestroyTask(taskId);
|
||||
break;
|
||||
}
|
||||
@@ -662,7 +662,7 @@ static void sub_807E678(u8 taskId)
|
||||
case 1:
|
||||
if (!sub_807E40C() && BGMusicStopped())
|
||||
{
|
||||
sub_800AAC0();
|
||||
Link_TryStartSend5FFF();
|
||||
data[0]++;
|
||||
}
|
||||
break;
|
||||
@@ -850,7 +850,7 @@ static void sub_807EAC4(s16 a0, s16 a1, s16 *a2, s16 *a3, s16 *a4)
|
||||
(*a4)++;
|
||||
playerSpr->pos2.x = *a2 >> 5;
|
||||
playerSpr->pos2.y = *a3 >> 5;
|
||||
if (playerObj->mapobj_bit_7)
|
||||
if (playerObj->heldMovementFinished)
|
||||
{
|
||||
ObjectEventForceSetSpecialAnim(playerObj, GetStepInPlaceDelay16AnimId(GetPlayerFacingDirection()));
|
||||
}
|
||||
|
||||
+124
-1
@@ -5,11 +5,34 @@
|
||||
#include "scanline_effect.h"
|
||||
#include "script.h"
|
||||
#include "task.h"
|
||||
#include "window.h"
|
||||
#include "strings.h"
|
||||
#include "string_util.h"
|
||||
#include "menu.h"
|
||||
#include "heal_location.h"
|
||||
#include "new_menu_helpers.h"
|
||||
#include "event_object_movement.h"
|
||||
#include "field_fadetransition.h"
|
||||
#include "event_scripts.h"
|
||||
|
||||
static const u16 sFlashLevelPixelRadii[] = {
|
||||
0x00c8, 0x0048, 0x0038, 0x0028, 0x0018, 0x0000
|
||||
0x00c8, 0x0048, 0x0038, 0x0028, 0x0018
|
||||
};
|
||||
|
||||
const s32 gMaxFlashLevel = NELEMS(sFlashLevelPixelRadii) - 1;
|
||||
|
||||
static const struct WindowTemplate gUnknown_83C68E4 = {
|
||||
.bg = 0,
|
||||
.tilemapLeft = 0,
|
||||
.tilemapTop = 5,
|
||||
.width = 30,
|
||||
.height = 11,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 1,
|
||||
};
|
||||
|
||||
static const u8 gUnknown_83C68EC[] = { TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY };
|
||||
|
||||
static void Task_EnableScriptAfterMusicFade(u8 taskId);
|
||||
static void Task_BarnDoorWipeChild(u8 taskId);
|
||||
|
||||
@@ -336,3 +359,103 @@ static void Task_BarnDoorWipeChild(u8 taskId)
|
||||
#undef DIR_WIPE_IN
|
||||
#undef DIR_WIPE_OUT
|
||||
#undef tChildOffset
|
||||
|
||||
static bool8 sub_807F3A4(u8 taskId, const u8 *text, u8 x, u8 y)
|
||||
{
|
||||
u8 windowId = gTasks[taskId].data[1];
|
||||
|
||||
switch (gTasks[taskId].data[2])
|
||||
{
|
||||
case 0:
|
||||
FillWindowPixelBuffer(windowId, PIXEL_FILL(0));
|
||||
StringExpandPlaceholders(gStringVar4, text);
|
||||
AddTextPrinterParameterized4(windowId, 2, x, y, 1, 0, gUnknown_83C68EC, 1, gStringVar4);
|
||||
gTextFlags.canABSpeedUpPrint = FALSE;
|
||||
gTasks[taskId].data[2] = 1;
|
||||
break;
|
||||
case 1:
|
||||
RunTextPrinters();
|
||||
if (!IsTextPrinterActive(windowId))
|
||||
{
|
||||
gTasks[taskId].data[2] = 0;
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void sub_807F45C(u8 taskId)
|
||||
{
|
||||
u8 windowId;
|
||||
const struct HealLocation *loc;
|
||||
|
||||
switch (gTasks[taskId].data[0])
|
||||
{
|
||||
case 0:
|
||||
windowId = AddWindow(&gUnknown_83C68E4);
|
||||
gTasks[taskId].data[1] = windowId;
|
||||
Menu_LoadStdPalAt(0xF0);
|
||||
FillWindowPixelBuffer(windowId, PIXEL_FILL(0));
|
||||
PutWindowTilemap(windowId);
|
||||
CopyWindowToVram(windowId, 3);
|
||||
loc = GetHealLocationPointer(1);
|
||||
if (gSaveBlock1Ptr->lastHealLocation.mapGroup == loc->group
|
||||
&& gSaveBlock1Ptr->lastHealLocation.mapNum == loc->map
|
||||
&& gSaveBlock1Ptr->lastHealLocation.warpId == -1
|
||||
&& gSaveBlock1Ptr->lastHealLocation.x == loc->x
|
||||
&& gSaveBlock1Ptr->lastHealLocation.y == loc->y)
|
||||
gTasks[taskId].data[0] = 4;
|
||||
else
|
||||
gTasks[taskId].data[0] = 1;
|
||||
break;
|
||||
case 1:
|
||||
if (sub_807F3A4(taskId, gUnknown_841B554, 2, 8))
|
||||
{
|
||||
ObjectEventTurn(&gObjectEvents[gPlayerAvatar.objectEventId], 2);
|
||||
++gTasks[taskId].data[0];
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if (sub_807F3A4(taskId, gUnknown_841B5B6, 2, 8))
|
||||
{
|
||||
ObjectEventTurn(&gObjectEvents[gPlayerAvatar.objectEventId], 2);
|
||||
++gTasks[taskId].data[0];
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
case 5:
|
||||
windowId = gTasks[taskId].data[1];
|
||||
ClearWindowTilemap(windowId);
|
||||
CopyWindowToVram(windowId, 1);
|
||||
RemoveWindow(windowId);
|
||||
palette_bg_faded_fill_black();
|
||||
sub_807DC00();
|
||||
++gTasks[taskId].data[0];
|
||||
break;
|
||||
case 3:
|
||||
if (sub_807E418() == TRUE)
|
||||
{
|
||||
DestroyTask(taskId);
|
||||
ScriptContext1_SetupScript(EventScript_AfterWhiteOutHeal);
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
if (sub_807E418() == TRUE)
|
||||
{
|
||||
DestroyTask(taskId);
|
||||
ScriptContext1_SetupScript(EventScript_MomHeal);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_807F5F0(void)
|
||||
{
|
||||
u8 taskId;
|
||||
|
||||
ScriptContext2_Enable();
|
||||
palette_bg_faded_fill_black();
|
||||
taskId = CreateTask(sub_807F45C, 10);
|
||||
gTasks[taskId].data[0] = 0;
|
||||
}
|
||||
|
||||
@@ -316,7 +316,7 @@ void Special_AnimatePcTurnOff()
|
||||
void SpawnCameraObject(void)
|
||||
{
|
||||
u8 objectEventId = SpawnSpecialObjectEventParameterized(OBJECT_EVENT_GFX_YOUNGSTER, 8, 127, gSaveBlock1Ptr->pos.x + 7, gSaveBlock1Ptr->pos.y + 7, 3);
|
||||
gObjectEvents[objectEventId].mapobj_bit_13 = TRUE;
|
||||
gObjectEvents[objectEventId].invisible = TRUE;
|
||||
CameraObjectSetFollowedObjectId(gObjectEvents[objectEventId].spriteId);
|
||||
}
|
||||
|
||||
@@ -1920,15 +1920,15 @@ u16 Special_BattleCardAction(void)
|
||||
switch (gSpecialVar_Result)
|
||||
{
|
||||
case 0:
|
||||
return sub_81445C0(3);
|
||||
return MEvent_GetBattleCardCount(3);
|
||||
case 1:
|
||||
return sub_81445C0(4);
|
||||
return MEvent_GetBattleCardCount(4);
|
||||
case 2:
|
||||
return sub_81445C0(0);
|
||||
return MEvent_GetBattleCardCount(0);
|
||||
case 3:
|
||||
return sub_81445C0(1);
|
||||
return MEvent_GetBattleCardCount(1);
|
||||
case 4:
|
||||
return sub_81445C0(2);
|
||||
return MEvent_GetBattleCardCount(2);
|
||||
default:
|
||||
AGB_ASSERT_EX(0, ABSPATH("scr_tool.c"), 3873);
|
||||
return 0;
|
||||
|
||||
+1
-1
@@ -490,7 +490,7 @@ void MapGridSetMetatileEntryAt(s32 x, s32 y, u16 metatile)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8059024(s32 x, s32 y, bool32 arg2)
|
||||
void MapGridSetMetatileImpassabilityAt(s32 x, s32 y, bool32 arg2)
|
||||
{
|
||||
if (x >= 0 && x < VMap.Xsize
|
||||
&& y >= 0 && y < VMap.Ysize)
|
||||
|
||||
+30
-30
@@ -33,7 +33,7 @@ struct HelpSystemVideoState
|
||||
|
||||
static EWRAM_DATA u8 sMapTilesBackup[BG_CHAR_SIZE] = {0};
|
||||
EWRAM_DATA u8 gUnknown_203F174 = 0;
|
||||
EWRAM_DATA u8 gUnknown_203F175 = 0;
|
||||
EWRAM_DATA bool8 gHelpSystemToggleWithRButtonDisabled = FALSE;
|
||||
static EWRAM_DATA u8 sDelayTimer = 0;
|
||||
static EWRAM_DATA u8 sInHelpSystem = 0;
|
||||
static EWRAM_DATA struct HelpSystemVideoState sVideoState = {0};
|
||||
@@ -53,7 +53,7 @@ u8 RunHelpSystemCallback(void)
|
||||
sInHelpSystem = 0;
|
||||
if (gSaveBlock2Ptr->optionsButtonMode != OPTIONS_BUTTON_MODE_HELP)
|
||||
return 0;
|
||||
if (JOY_NEW(R_BUTTON) && gUnknown_203F175 == 1)
|
||||
if (JOY_NEW(R_BUTTON) && gHelpSystemToggleWithRButtonDisabled == TRUE)
|
||||
return 0;
|
||||
if (JOY_NEW(L_BUTTON | R_BUTTON))
|
||||
{
|
||||
@@ -93,9 +93,9 @@ u8 RunHelpSystemCallback(void)
|
||||
HelpSystem_PrintText_Row61(gString_Help);
|
||||
sub_813BD14(1);
|
||||
if (sub_812B40C() == TRUE)
|
||||
sub_812BC54(&gHelpSystemListMenu, gHelpSystemListMenuItems);
|
||||
HelpSystemSubroutine_PrintWelcomeMessage(&gHelpSystemListMenu, gHelpSystemListMenuItems);
|
||||
else
|
||||
sub_812BCA8(&gHelpSystemListMenu, gHelpSystemListMenuItems);
|
||||
HelpSystemSubroutine_WelcomeEndGotoMenu(&gHelpSystemListMenu, gHelpSystemListMenuItems);
|
||||
sub_813BE78(1);
|
||||
sub_813BF50(1);
|
||||
CommitTilemap();
|
||||
@@ -110,7 +110,7 @@ u8 RunHelpSystemCallback(void)
|
||||
sVideoState.state = 5;
|
||||
break;
|
||||
case 5:
|
||||
if (!sub_812BB9C(&gHelpSystemListMenu, gHelpSystemListMenuItems))
|
||||
if (!RunHelpMenuSubroutine(&gHelpSystemListMenu, gHelpSystemListMenuItems))
|
||||
{
|
||||
PlaySE(SE_HELP_CL);
|
||||
sVideoState.state = 6;
|
||||
@@ -981,9 +981,9 @@ void HelpSystem_FillPanel1(void)
|
||||
void HelpSystem_InitListMenuController(struct HelpSystemListMenu * a0, u8 a1, u8 a2)
|
||||
{
|
||||
gHelpSystemListMenu.sub = a0->sub;
|
||||
gHelpSystemListMenu.field_0C = a1;
|
||||
gHelpSystemListMenu.field_0D = a2;
|
||||
gHelpSystemListMenu.field_0E = 0;
|
||||
gHelpSystemListMenu.itemsAbove = a1;
|
||||
gHelpSystemListMenu.cursorPos = a2;
|
||||
gHelpSystemListMenu.state = 0;
|
||||
if (gHelpSystemListMenu.sub.totalItems < gHelpSystemListMenu.sub.maxShowed)
|
||||
gHelpSystemListMenu.sub.maxShowed = gHelpSystemListMenu.sub.totalItems;
|
||||
sub_813BDA4(0);
|
||||
@@ -1007,7 +1007,7 @@ s32 HelpSystem_GetMenuInput(void)
|
||||
else if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
return gHelpSystemListMenu.sub.items[gHelpSystemListMenu.field_0C + gHelpSystemListMenu.field_0D].index;
|
||||
return gHelpSystemListMenu.sub.items[gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos].index;
|
||||
}
|
||||
else if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
@@ -1051,15 +1051,15 @@ void sub_813C75C(void)
|
||||
u8 r6 = gHelpSystemListMenu.sub.totalItems - 7;
|
||||
if (gHelpSystemListMenu.sub.totalItems > 7)
|
||||
{
|
||||
s32 r4 = gHelpSystemListMenu.field_0C + gHelpSystemListMenu.field_0D;
|
||||
s32 r4 = gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos;
|
||||
sub_813C004(0, 0);
|
||||
if (r4 == 0)
|
||||
sub_813C004(1, 1);
|
||||
else if (gHelpSystemListMenu.field_0C == 0 && gHelpSystemListMenu.field_0D != 0)
|
||||
else if (gHelpSystemListMenu.itemsAbove == 0 && gHelpSystemListMenu.cursorPos != 0)
|
||||
sub_813C004(1, 1);
|
||||
else if (gHelpSystemListMenu.field_0C == r6)
|
||||
else if (gHelpSystemListMenu.itemsAbove == r6)
|
||||
sub_813C004(0, 1);
|
||||
else if (gHelpSystemListMenu.field_0C != 0)
|
||||
else if (gHelpSystemListMenu.itemsAbove != 0)
|
||||
{
|
||||
sub_813C004(0, 1);
|
||||
sub_813C004(1, 1);
|
||||
@@ -1071,7 +1071,7 @@ void PrintListMenuItems(void)
|
||||
{
|
||||
u8 glyphHeight = GetFontAttribute(2, 1) + 1;
|
||||
s32 i;
|
||||
s32 r5 = gHelpSystemListMenu.field_0C;
|
||||
s32 r5 = gHelpSystemListMenu.itemsAbove;
|
||||
|
||||
for (i = 0; i < gHelpSystemListMenu.sub.maxShowed; i++)
|
||||
{
|
||||
@@ -1086,7 +1086,7 @@ void PlaceListMenuCursor(void)
|
||||
{
|
||||
u8 glyphHeight = GetFontAttribute(2, 1) + 1;
|
||||
u8 x = gHelpSystemListMenu.sub.left;
|
||||
u8 y = gHelpSystemListMenu.sub.top + glyphHeight * gHelpSystemListMenu.field_0D;
|
||||
u8 y = gHelpSystemListMenu.sub.top + glyphHeight * gHelpSystemListMenu.cursorPos;
|
||||
HelpSystem_PrintTextAt(gFameCheckerText_ListMenuCursor, x, y);
|
||||
}
|
||||
|
||||
@@ -1107,24 +1107,24 @@ u8 TryMoveCursor1(u8 dirn)
|
||||
r4 = 0;
|
||||
else
|
||||
r4 = gHelpSystemListMenu.sub.maxShowed - (gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1)) - 1;
|
||||
if (gHelpSystemListMenu.field_0C == 0)
|
||||
if (gHelpSystemListMenu.itemsAbove == 0)
|
||||
{
|
||||
if (gHelpSystemListMenu.field_0D != 0)
|
||||
if (gHelpSystemListMenu.cursorPos != 0)
|
||||
{
|
||||
gHelpSystemListMenu.field_0D--;
|
||||
gHelpSystemListMenu.cursorPos--;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
if (gHelpSystemListMenu.field_0D > r4)
|
||||
if (gHelpSystemListMenu.cursorPos > r4)
|
||||
{
|
||||
gHelpSystemListMenu.field_0D--;
|
||||
gHelpSystemListMenu.cursorPos--;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
gHelpSystemListMenu.field_0C--;
|
||||
gHelpSystemListMenu.itemsAbove--;
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
@@ -1134,24 +1134,24 @@ u8 TryMoveCursor1(u8 dirn)
|
||||
r4 = 0;
|
||||
else
|
||||
r4 = gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1);
|
||||
if (gHelpSystemListMenu.field_0C == gHelpSystemListMenu.sub.totalItems - gHelpSystemListMenu.sub.maxShowed)
|
||||
if (gHelpSystemListMenu.itemsAbove == gHelpSystemListMenu.sub.totalItems - gHelpSystemListMenu.sub.maxShowed)
|
||||
{
|
||||
if (gHelpSystemListMenu.field_0D < gHelpSystemListMenu.sub.maxShowed - 1)
|
||||
if (gHelpSystemListMenu.cursorPos < gHelpSystemListMenu.sub.maxShowed - 1)
|
||||
{
|
||||
gHelpSystemListMenu.field_0D++;
|
||||
gHelpSystemListMenu.cursorPos++;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
else if (gHelpSystemListMenu.field_0D < r4)
|
||||
else if (gHelpSystemListMenu.cursorPos < r4)
|
||||
{
|
||||
gHelpSystemListMenu.field_0D++;
|
||||
gHelpSystemListMenu.cursorPos++;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
gHelpSystemListMenu.field_0C++;
|
||||
gHelpSystemListMenu.itemsAbove++;
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
@@ -1159,7 +1159,7 @@ u8 TryMoveCursor1(u8 dirn)
|
||||
|
||||
bool8 MoveCursor(u8 by, u8 dirn)
|
||||
{
|
||||
u8 r7 = gHelpSystemListMenu.field_0D;
|
||||
u8 r7 = gHelpSystemListMenu.cursorPos;
|
||||
u8 flags = 0;
|
||||
s32 i;
|
||||
for (i = 0; i < by; i++)
|
||||
@@ -1172,14 +1172,14 @@ bool8 MoveCursor(u8 by, u8 dirn)
|
||||
// neither changed
|
||||
return TRUE;
|
||||
case 1:
|
||||
// changed field_0D only
|
||||
// changed cursorPos only
|
||||
sub_813C860(r7);
|
||||
PlaceListMenuCursor();
|
||||
CommitTilemap();
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
// changed field_0C
|
||||
// changed itemsAbove
|
||||
if (sub_812BF88() == TRUE)
|
||||
{
|
||||
HelpSystem_SetInputDelay(2);
|
||||
|
||||
+209
-210
@@ -19,22 +19,22 @@
|
||||
static EWRAM_DATA u16 sSomeVariable = 0;
|
||||
static EWRAM_DATA u8 gUnknown_203B0EE = 0;
|
||||
|
||||
u8 gUnknown_3005E9C[4];
|
||||
u8 sHelpSystemState[4];
|
||||
u16 gSomeVariableBackup;
|
||||
|
||||
static bool32 IsCurrentMapInArray(const u16 * mapIdxs);
|
||||
static void sub_812B520(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
|
||||
static void sub_812B614(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
|
||||
static bool8 sub_812B754(void);
|
||||
static bool8 sub_812B780(u8);
|
||||
static bool8 sub_812BB10(void);
|
||||
static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
|
||||
static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
|
||||
static bool8 HelpSystem_HasDefeatedBrock(void);
|
||||
static bool8 HelpSystemSubmenuIndexIsActive(u8);
|
||||
static bool8 HasGottenAtLeastOneHM(void);
|
||||
|
||||
static void sub_812BF5C(void);
|
||||
static void sub_812BF74(const u8 *);
|
||||
static void sub_812BF94(struct HelpSystemListMenu * a0);
|
||||
static void sub_812BF9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
|
||||
static void PrintWelcomeMessageOnPanel1(void);
|
||||
static void PrintTextOnPanel2Row52RightAlign(const u8 *);
|
||||
static void ResetHelpSystemCursor(struct HelpSystemListMenu * a0);
|
||||
static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
|
||||
|
||||
static const u8 *const gUnknown_845B080[] = {
|
||||
static const u8 *const sHelpSystemTopicPtrs[] = {
|
||||
gUnknown_81B2DF8,
|
||||
gUnknown_81B2E1C,
|
||||
gUnknown_81B2E2E,
|
||||
@@ -43,7 +43,7 @@ static const u8 *const gUnknown_845B080[] = {
|
||||
gUnknown_81B2E6A
|
||||
};
|
||||
|
||||
static const u8 *const gUnknown_845B098[] = {
|
||||
static const u8 *const sHelpSystemTopicMouseoverDescriptionPtrs[] = {
|
||||
gUnknown_81B2E88,
|
||||
gUnknown_81B2EC8,
|
||||
gUnknown_81B2F00,
|
||||
@@ -52,7 +52,7 @@ static const u8 *const gUnknown_845B098[] = {
|
||||
gUnknown_81B2FA9
|
||||
};
|
||||
|
||||
static const u8 *const gUnknown_845B0B0[] = {
|
||||
static const u8 *const sHelpSystemSpecializedQuestionTextPtrs[] = {
|
||||
NULL,
|
||||
gUnknown_81B3083,
|
||||
gUnknown_81B30A9,
|
||||
@@ -100,7 +100,7 @@ static const u8 *const gUnknown_845B0B0[] = {
|
||||
gUnknown_81B3516
|
||||
};
|
||||
|
||||
static const u8 *const gUnknown_845B164[] = {
|
||||
static const u8 *const sHelpSystemSpecializedAnswerTextPtrs[] = {
|
||||
NULL,
|
||||
gUnknown_81B3525,
|
||||
gUnknown_81B35E6,
|
||||
@@ -148,7 +148,7 @@ static const u8 *const gUnknown_845B164[] = {
|
||||
gUnknown_81B55F4
|
||||
};
|
||||
|
||||
static const u8 *const gUnknown_845B218[] = {
|
||||
static const u8 *const sHelpSystemMenuTopicTextPtrs[] = {
|
||||
NULL,
|
||||
gUnknown_81B56E3,
|
||||
gUnknown_81B56F4,
|
||||
@@ -200,7 +200,7 @@ static const u8 *const gUnknown_845B218[] = {
|
||||
gUnknown_81B5A37
|
||||
};
|
||||
|
||||
static const u8 *const gUnknown_845B2DC[] = {
|
||||
static const u8 *const sHelpSystemSpecializedControlsTextPtrs[] = {
|
||||
NULL,
|
||||
gUnknown_81B5A4D,
|
||||
gUnknown_81B5B0C,
|
||||
@@ -252,7 +252,7 @@ static const u8 *const gUnknown_845B2DC[] = {
|
||||
gUnknown_81B7C57
|
||||
};
|
||||
|
||||
static const u8 *const gUnknown_845B3A0[] = {
|
||||
static const u8 *const sHelpSystemSpecializedStringsTextPtrs[] = {
|
||||
NULL,
|
||||
gUnknown_81B7CC1,
|
||||
gUnknown_81B7CC4,
|
||||
@@ -299,7 +299,7 @@ static const u8 *const gUnknown_845B3A0[] = {
|
||||
gUnknown_81B7E0F
|
||||
};
|
||||
|
||||
static const u8 *const gUnknown_845B450[] = {
|
||||
static const u8 *const sHelpSystemSpecializedStringDefinitionsTextPtrs[] = {
|
||||
NULL,
|
||||
gUnknown_81B7E16,
|
||||
gUnknown_81B7F0A,
|
||||
@@ -346,7 +346,7 @@ static const u8 *const gUnknown_845B450[] = {
|
||||
gUnknown_81B9B2F
|
||||
};
|
||||
|
||||
static const u8 *const gUnknown_845B500[] = {
|
||||
static const u8 *const sHelpSystemGeneralTopicTextPtrs[] = {
|
||||
NULL,
|
||||
gUnknown_81B9BB7,
|
||||
gUnknown_81B9BC7,
|
||||
@@ -357,7 +357,7 @@ static const u8 *const gUnknown_845B500[] = {
|
||||
gUnknown_81B9C1D
|
||||
};
|
||||
|
||||
static const u8 *const gUnknown_845B520[] = {
|
||||
static const u8 *const sHelpSystemGeneralTopicDescriptionTextPtrs[] = {
|
||||
NULL,
|
||||
gUnknown_81B9C2F,
|
||||
gUnknown_81B9D04,
|
||||
@@ -368,7 +368,7 @@ static const u8 *const gUnknown_845B520[] = {
|
||||
gUnknown_81BA027
|
||||
};
|
||||
|
||||
static const u8 *const gUnknown_845B540[] = {
|
||||
static const u8 *const sHelpSystemTypeMatchupTextPtrs[] = {
|
||||
NULL,
|
||||
gUnknown_81BA0F1,
|
||||
gUnknown_81BA10D,
|
||||
@@ -407,7 +407,7 @@ static const u8 *const gUnknown_845B540[] = {
|
||||
gUnknown_81BA400
|
||||
};
|
||||
|
||||
static const u8 *const gUnknown_845B5D0[] = {
|
||||
static const u8 *const sHelpSystemTypeMatchupDescriptionTextPtrs[] = {
|
||||
NULL,
|
||||
gUnknown_81BA416,
|
||||
gUnknown_81BA4E6,
|
||||
@@ -446,7 +446,6 @@ static const u8 *const gUnknown_845B5D0[] = {
|
||||
gUnknown_81BB156
|
||||
};
|
||||
|
||||
|
||||
static const u8 gUnknown_845B660[] = {
|
||||
0x01, 0x02, 0x03, 0xff
|
||||
};
|
||||
@@ -739,7 +738,7 @@ static const u8 gUnknown_845B9BE[] = {
|
||||
0x09, 0x01, 0x02, 0x03, 0x23, 0x25, 0x24, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x27, 0x15, 0x26, 0x16, 0x17, 0x18, 0x1a, 0x0e, 0x1b, 0xff
|
||||
};
|
||||
|
||||
static const u8 *const gUnknown_845B9E0[] = {
|
||||
static const u8 *const sHelpSystemSubmenuIndexPointers[] = {
|
||||
NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, gUnknown_845B660, NULL,
|
||||
NULL, NULL, NULL, gUnknown_845B664, NULL,
|
||||
@@ -780,48 +779,48 @@ static const u8 *const gUnknown_845B9E0[] = {
|
||||
|
||||
static const u16 unref_845BCB0[] = INCBIN_U16("graphics/help_system/unk_845BCB0.bin");
|
||||
|
||||
static const u8 gUnknown_845C4B0[] = {
|
||||
static const u8 sHelpSystemContextTopicOrder[] = {
|
||||
3, 0, 1, 2, 4, 5
|
||||
};
|
||||
|
||||
static const u8 gUnknown_845C4B6[][6] = {
|
||||
{0, 0, 0, 0, 0, 1},
|
||||
{0, 0, 0, 1, 0, 1},
|
||||
{0, 0, 0, 1, 0, 1},
|
||||
{0, 1, 0, 1, 0, 1},
|
||||
{0, 1, 0, 0, 0, 1},
|
||||
{0, 1, 1, 0, 0, 1},
|
||||
{0, 1, 1, 0, 0, 1},
|
||||
{0, 0, 1, 0, 0, 1},
|
||||
{0, 0, 1, 0, 0, 1},
|
||||
{0, 1, 1, 0, 0, 1},
|
||||
{0, 1, 1, 0, 0, 1},
|
||||
{0, 1, 0, 0, 0, 1},
|
||||
{0, 1, 1, 0, 0, 1},
|
||||
{0, 1, 1, 0, 0, 1},
|
||||
{1, 0, 0, 1, 0, 1},
|
||||
{1, 1, 1, 0, 0, 1},
|
||||
{1, 1, 1, 1, 0, 1},
|
||||
{1, 1, 1, 0, 0, 1},
|
||||
{1, 1, 1, 0, 1, 1},
|
||||
{1, 1, 1, 0, 0, 1},
|
||||
{1, 1, 1, 0, 0, 1},
|
||||
{1, 1, 1, 0, 0, 1},
|
||||
{1, 1, 1, 0, 0, 1},
|
||||
{1, 1, 1, 0, 1, 1},
|
||||
{1, 1, 1, 0, 1, 1},
|
||||
{1, 1, 1, 0, 1, 1},
|
||||
{1, 1, 1, 0, 1, 1},
|
||||
{0, 1, 0, 0, 0, 1},
|
||||
{0, 1, 0, 0, 0, 1},
|
||||
{0, 1, 0, 0, 0, 1},
|
||||
{0, 1, 0, 0, 0, 1},
|
||||
{0, 1, 0, 0, 0, 1},
|
||||
{0, 1, 0, 0, 0, 1},
|
||||
{0, 1, 0, 0, 0, 1},
|
||||
{0, 1, 0, 0, 0, 1},
|
||||
{0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0}
|
||||
static const bool8 sHelpSystemContextTopicFlags[][6] = {
|
||||
{FALSE, FALSE, FALSE, FALSE, FALSE, TRUE },
|
||||
{FALSE, FALSE, FALSE, TRUE, FALSE, TRUE },
|
||||
{FALSE, FALSE, FALSE, TRUE, FALSE, TRUE },
|
||||
{FALSE, TRUE, FALSE, TRUE, FALSE, TRUE },
|
||||
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
|
||||
{FALSE, TRUE, TRUE, FALSE, FALSE, TRUE },
|
||||
{FALSE, TRUE, TRUE, FALSE, FALSE, TRUE },
|
||||
{FALSE, FALSE, TRUE, FALSE, FALSE, TRUE },
|
||||
{FALSE, FALSE, TRUE, FALSE, FALSE, TRUE },
|
||||
{FALSE, TRUE, TRUE, FALSE, FALSE, TRUE },
|
||||
{FALSE, TRUE, TRUE, FALSE, FALSE, TRUE },
|
||||
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
|
||||
{FALSE, TRUE, TRUE, FALSE, FALSE, TRUE },
|
||||
{FALSE, TRUE, TRUE, FALSE, FALSE, TRUE },
|
||||
{TRUE, FALSE, FALSE, TRUE, FALSE, TRUE },
|
||||
{TRUE, TRUE, TRUE, FALSE, FALSE, TRUE },
|
||||
{TRUE, TRUE, TRUE, TRUE, FALSE, TRUE },
|
||||
{TRUE, TRUE, TRUE, FALSE, FALSE, TRUE },
|
||||
{TRUE, TRUE, TRUE, FALSE, TRUE, TRUE },
|
||||
{TRUE, TRUE, TRUE, FALSE, FALSE, TRUE },
|
||||
{TRUE, TRUE, TRUE, FALSE, FALSE, TRUE },
|
||||
{TRUE, TRUE, TRUE, FALSE, FALSE, TRUE },
|
||||
{TRUE, TRUE, TRUE, FALSE, FALSE, TRUE },
|
||||
{TRUE, TRUE, TRUE, FALSE, TRUE, TRUE },
|
||||
{TRUE, TRUE, TRUE, FALSE, TRUE, TRUE },
|
||||
{TRUE, TRUE, TRUE, FALSE, TRUE, TRUE },
|
||||
{TRUE, TRUE, TRUE, FALSE, TRUE, TRUE },
|
||||
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
|
||||
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
|
||||
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
|
||||
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
|
||||
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
|
||||
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
|
||||
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
|
||||
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
|
||||
{FALSE, FALSE, FALSE, FALSE, FALSE, FALSE},
|
||||
{FALSE, FALSE, FALSE, FALSE, FALSE, FALSE}
|
||||
};
|
||||
|
||||
static const u16 sMartMaps[] = {
|
||||
@@ -961,12 +960,12 @@ static bool8 IsInDungeonMap(void)
|
||||
|
||||
void sub_812B35C(void)
|
||||
{
|
||||
sub_812B4B8();
|
||||
HelpSystem_EnableToggleWithRButton();
|
||||
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
|
||||
HelpSystem_SetSomeVariable2(0x16);
|
||||
else if (IsInDungeonMap())
|
||||
HelpSystem_SetSomeVariable2(0x15);
|
||||
else if (is_light_level_8_or_9(gMapHeader.mapType))
|
||||
else if (IsMapTypeIndoors(gMapHeader.mapType))
|
||||
{
|
||||
if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_1F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_1F)) || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_2F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_2F)))
|
||||
HelpSystem_SetSomeVariable2(0x0E);
|
||||
@@ -1015,126 +1014,126 @@ void HelpSystem_Enable(void)
|
||||
if (gQuestLogState != 2 && gQuestLogState != 3)
|
||||
{
|
||||
gHelpSystemEnabled = TRUE;
|
||||
sub_812B4B8();
|
||||
HelpSystem_EnableToggleWithRButton();
|
||||
}
|
||||
}
|
||||
|
||||
void sub_812B4AC(void)
|
||||
void HelpSystem_DisableToggleWithRButton(void)
|
||||
{
|
||||
gUnknown_203F175 = 1;
|
||||
gHelpSystemToggleWithRButtonDisabled = TRUE;
|
||||
}
|
||||
|
||||
void sub_812B4B8(void)
|
||||
void HelpSystem_EnableToggleWithRButton(void)
|
||||
{
|
||||
gUnknown_203F175 = 0;
|
||||
gHelpSystemToggleWithRButtonDisabled = FALSE;
|
||||
}
|
||||
|
||||
static void sub_812B4C4(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
static void ResetHelpSystemListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
|
||||
{
|
||||
a0->sub.items = a1;
|
||||
a0->sub.totalItems = 1;
|
||||
a0->sub.maxShowed = 1;
|
||||
a0->sub.left = 1;
|
||||
a0->sub.top = 4;
|
||||
helpListMenu->sub.items = listMenuItemsBuffer;
|
||||
helpListMenu->sub.totalItems = 1;
|
||||
helpListMenu->sub.maxShowed = 1;
|
||||
helpListMenu->sub.left = 1;
|
||||
helpListMenu->sub.top = 4;
|
||||
}
|
||||
|
||||
static void sub_812B4D8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
static void BuildAndPrintMainTopicsListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
|
||||
{
|
||||
sub_812B4C4(a0, a1);
|
||||
sub_812B520(a0, a1);
|
||||
sub_812BF74(gUnknown_841DFAC);
|
||||
HelpSystem_InitListMenuController(a0, 0, gUnknown_3005E9C[2]);
|
||||
sub_812BF9C(a0, a1);
|
||||
ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer);
|
||||
BuildMainTopicsListAndMoveToH00(helpListMenu, listMenuItemsBuffer);
|
||||
PrintTextOnPanel2Row52RightAlign(gUnknown_841DFAC);
|
||||
HelpSystem_InitListMenuController(helpListMenu, 0, sHelpSystemState[2]);
|
||||
PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer);
|
||||
sub_813BDA4(1);
|
||||
sub_813BD5C(1);
|
||||
}
|
||||
|
||||
static void sub_812B520(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
|
||||
{
|
||||
u8 i;
|
||||
u8 r4 = 0;
|
||||
u8 totalItems = 0;
|
||||
for (i = 0; i < 6; i++)
|
||||
{
|
||||
if (gUnknown_845C4B6[sSomeVariable][gUnknown_845C4B0[i]] == 1)
|
||||
if (sHelpSystemContextTopicFlags[sSomeVariable][sHelpSystemContextTopicOrder[i]] == TRUE)
|
||||
{
|
||||
a1[r4].label = gUnknown_845B080[gUnknown_845C4B0[i]];
|
||||
a1[r4].index = gUnknown_845C4B0[i];
|
||||
r4++;
|
||||
listMenuItemsBuffer[totalItems].label = sHelpSystemTopicPtrs[sHelpSystemContextTopicOrder[i]];
|
||||
listMenuItemsBuffer[totalItems].index = sHelpSystemContextTopicOrder[i];
|
||||
totalItems++;
|
||||
}
|
||||
}
|
||||
a1[r4 - 1].index = -2;
|
||||
a0->sub.totalItems = r4;
|
||||
a0->sub.maxShowed = r4;
|
||||
a0->sub.left = 0;
|
||||
listMenuItemsBuffer[totalItems - 1].index = -2;
|
||||
helpListMenu->sub.totalItems = totalItems;
|
||||
helpListMenu->sub.maxShowed = totalItems;
|
||||
helpListMenu->sub.left = 0;
|
||||
}
|
||||
|
||||
static void sub_812B5A8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
static void BuildAndPrintSubmenuList(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
|
||||
{
|
||||
sub_813BDE8(0);
|
||||
sub_813BFC0(0);
|
||||
sub_813BE78(1);
|
||||
sub_812B4C4(a0, a1);
|
||||
sub_812B614(a0, a1);
|
||||
sub_812BF74(gUnknown_841DFC9);
|
||||
HelpSystem_InitListMenuController(a0, a0->field_0C, a0->field_0D);
|
||||
HelpSystem_PrintTextAt(gUnknown_845B080[gUnknown_3005E9C[1]], 0, 0);
|
||||
ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer);
|
||||
SetHelpSystemSubmenuItems(helpListMenu, listMenuItemsBuffer);
|
||||
PrintTextOnPanel2Row52RightAlign(gUnknown_841DFC9);
|
||||
HelpSystem_InitListMenuController(helpListMenu, helpListMenu->itemsAbove, helpListMenu->cursorPos);
|
||||
HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[sHelpSystemState[1]], 0, 0);
|
||||
sub_813BDA4(1);
|
||||
sub_813BD5C(1);
|
||||
}
|
||||
|
||||
static void sub_812B614(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
|
||||
{
|
||||
u8 r6 = 0;
|
||||
const u8 * r3 = gUnknown_845B9E0[sSomeVariable * 5 + gUnknown_3005E9C[1]];
|
||||
u8 totalItems = 0;
|
||||
const u8 * indexPtr = sHelpSystemSubmenuIndexPointers[sSomeVariable * 5 + sHelpSystemState[1]];
|
||||
u8 i;
|
||||
for (i = 0; r3[i] != 0xFF; i++)
|
||||
for (i = 0; indexPtr[i] != 0xFF; i++)
|
||||
{
|
||||
if (sub_812B780(r3[i]) == TRUE)
|
||||
if (HelpSystemSubmenuIndexIsActive(indexPtr[i]) == TRUE)
|
||||
{
|
||||
if (gUnknown_3005E9C[1] == 0)
|
||||
a1[r6].label = gUnknown_845B0B0[r3[i]];
|
||||
else if (gUnknown_3005E9C[1] == 1)
|
||||
a1[r6].label = gUnknown_845B218[r3[i]];
|
||||
else if (gUnknown_3005E9C[1] == 2)
|
||||
a1[r6].label = gUnknown_845B3A0[r3[i]];
|
||||
else if (gUnknown_3005E9C[1] == 3)
|
||||
a1[r6].label = gUnknown_845B500[r3[i]];
|
||||
if (sHelpSystemState[1] == 0)
|
||||
listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedQuestionTextPtrs[indexPtr[i]];
|
||||
else if (sHelpSystemState[1] == 1)
|
||||
listMenuItemsBuffer[totalItems].label = sHelpSystemMenuTopicTextPtrs[indexPtr[i]];
|
||||
else if (sHelpSystemState[1] == 2)
|
||||
listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedStringsTextPtrs[indexPtr[i]];
|
||||
else if (sHelpSystemState[1] == 3)
|
||||
listMenuItemsBuffer[totalItems].label = sHelpSystemGeneralTopicTextPtrs[indexPtr[i]];
|
||||
else
|
||||
a1[r6].label = gUnknown_845B540[r3[i]];
|
||||
a1[r6].index = r3[i];
|
||||
r6++;
|
||||
listMenuItemsBuffer[totalItems].label = sHelpSystemTypeMatchupTextPtrs[indexPtr[i]];
|
||||
listMenuItemsBuffer[totalItems].index = indexPtr[i];
|
||||
totalItems++;
|
||||
}
|
||||
}
|
||||
if (sub_812B754() == TRUE)
|
||||
if (HelpSystem_HasDefeatedBrock() == TRUE)
|
||||
{
|
||||
for (i = 0, r3 = gUnknown_845B9BE; r3[i] != 0xFF; i++)
|
||||
for (i = 0, indexPtr = gUnknown_845B9BE; indexPtr[i] != 0xFF; i++)
|
||||
{
|
||||
a1[r6].label = gUnknown_845B3A0[r3[i]];
|
||||
a1[r6].index = r3[i];
|
||||
r6++;
|
||||
listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedStringsTextPtrs[indexPtr[i]];
|
||||
listMenuItemsBuffer[totalItems].index = indexPtr[i];
|
||||
totalItems++;
|
||||
}
|
||||
}
|
||||
a1[r6].label = gUnknown_81B2E6F;
|
||||
a1[r6].index = -2;
|
||||
r6++;
|
||||
a0->sub.totalItems = r6;
|
||||
a0->sub.maxShowed = 7;
|
||||
a0->sub.left = 0;
|
||||
a0->sub.top = 21;
|
||||
listMenuItemsBuffer[totalItems].label = gUnknown_81B2E6F;
|
||||
listMenuItemsBuffer[totalItems].index = -2;
|
||||
totalItems++;
|
||||
helpListMenu->sub.totalItems = totalItems;
|
||||
helpListMenu->sub.maxShowed = 7;
|
||||
helpListMenu->sub.left = 0;
|
||||
helpListMenu->sub.top = 21;
|
||||
}
|
||||
|
||||
static bool8 sub_812B754(void)
|
||||
static bool8 HelpSystem_HasDefeatedBrock(void)
|
||||
{
|
||||
if (FlagGet(FLAG_DEFEATED_BROCK) == TRUE && gUnknown_3005E9C[1] == 2)
|
||||
if (FlagGet(FLAG_DEFEATED_BROCK) == TRUE && sHelpSystemState[1] == 2)
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool8 sub_812B780(u8 id)
|
||||
static bool8 HelpSystemSubmenuIndexIsActive(u8 id)
|
||||
{
|
||||
u8 i = 0;
|
||||
|
||||
if (gUnknown_3005E9C[1] == 0)
|
||||
if (sHelpSystemState[1] == 0)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
@@ -1188,7 +1187,7 @@ static bool8 sub_812B780(u8 id)
|
||||
return FlagGet(FLAG_BADGE01_GET);
|
||||
case 28:
|
||||
case 40:
|
||||
return sub_812BB10();
|
||||
return HasGottenAtLeastOneHM();
|
||||
case 39:
|
||||
return FlagGet(FLAG_GOT_FAME_CHECKER);
|
||||
case 44:
|
||||
@@ -1196,7 +1195,7 @@ static bool8 sub_812B780(u8 id)
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
if (gUnknown_3005E9C[1] == 1)
|
||||
if (sHelpSystemState[1] == 1)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
@@ -1254,7 +1253,7 @@ static bool8 sub_812B780(u8 id)
|
||||
return FlagGet(FLAG_BADGE01_GET);
|
||||
case 16:
|
||||
case 17:
|
||||
return sub_812BB10();
|
||||
return HasGottenAtLeastOneHM();
|
||||
case 18:
|
||||
return FlagGet(FLAG_GOT_BICYCLE);
|
||||
case 48:
|
||||
@@ -1262,9 +1261,9 @@ static bool8 sub_812B780(u8 id)
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
if (gUnknown_3005E9C[1] == 2)
|
||||
if (sHelpSystemState[1] == 2)
|
||||
{
|
||||
if (sub_812B754() == TRUE)
|
||||
if (HelpSystem_HasDefeatedBrock() == TRUE)
|
||||
{
|
||||
for (i = 0; gUnknown_845B9BE[i] != 0xFF; i++)
|
||||
{
|
||||
@@ -1311,7 +1310,7 @@ static bool8 sub_812B780(u8 id)
|
||||
return FlagGet(FLAG_SYS_POKEMON_GET);
|
||||
case 36:
|
||||
case 37:
|
||||
return sub_812BB10();
|
||||
return HasGottenAtLeastOneHM();
|
||||
case 3:
|
||||
case 15:
|
||||
case 18:
|
||||
@@ -1320,7 +1319,7 @@ static bool8 sub_812B780(u8 id)
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
if (gUnknown_3005E9C[1] == 3)
|
||||
if (sHelpSystemState[1] == 3)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
@@ -1331,7 +1330,7 @@ static bool8 sub_812B780(u8 id)
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
if (gUnknown_3005E9C[1] == 4)
|
||||
if (sHelpSystemState[1] == 4)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
@@ -1339,7 +1338,7 @@ static bool8 sub_812B780(u8 id)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool8 sub_812BB10(void)
|
||||
static bool8 HasGottenAtLeastOneHM(void)
|
||||
{
|
||||
if (FlagGet(FLAG_GOT_HM01) == TRUE)
|
||||
return TRUE;
|
||||
@@ -1358,64 +1357,64 @@ static bool8 sub_812BB10(void)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 sub_812BB9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
bool8 RunHelpMenuSubroutine(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
|
||||
{
|
||||
switch (a0->field_0E)
|
||||
switch (helpListMenu->state)
|
||||
{
|
||||
case 8:
|
||||
return sub_812BC54(a0, a1);
|
||||
return HelpSystemSubroutine_PrintWelcomeMessage(helpListMenu, listMenuItemsBuffer);
|
||||
case 9:
|
||||
return sub_812BC80(a0, a1);
|
||||
return HelpSystemSubroutine_WelcomeWaitButton(helpListMenu, listMenuItemsBuffer);
|
||||
case 10:
|
||||
return sub_812BCA8(a0, a1);
|
||||
return HelpSystemSubroutine_WelcomeEndGotoMenu(helpListMenu, listMenuItemsBuffer);
|
||||
case 0:
|
||||
return sub_812BCD0(a0, a1);
|
||||
return HelpSystemSubroutine_MenuInputHandlerMain(helpListMenu, listMenuItemsBuffer);
|
||||
case 1:
|
||||
return sub_812BD2C(a0, a1);
|
||||
return HelpMenuSubroutine_InitSubmenu(helpListMenu, listMenuItemsBuffer);
|
||||
case 2:
|
||||
return sub_812BD64(a0, a1);
|
||||
return HelpMenuSubroutine_ReturnFromSubmenu(helpListMenu, listMenuItemsBuffer);
|
||||
case 3:
|
||||
return sub_812BD98(a0, a1);
|
||||
return HelpMenuSubroutine_SubmenuInputHandler(helpListMenu, listMenuItemsBuffer);
|
||||
case 4:
|
||||
return sub_812BE10(a0, a1);
|
||||
return HelpMenuSubroutine_HelpItemPrint(helpListMenu, listMenuItemsBuffer);
|
||||
case 5:
|
||||
return sub_812BEEC(a0, a1);
|
||||
return HelpMenuSubroutine_ReturnFromHelpItem(helpListMenu, listMenuItemsBuffer);
|
||||
case 6:
|
||||
return sub_812BF18(a0, a1);
|
||||
return HelpMenuSubroutine_HelpItemWaitButton(helpListMenu, listMenuItemsBuffer);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 sub_812BC54(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
bool8 HelpSystemSubroutine_PrintWelcomeMessage(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
|
||||
{
|
||||
sub_812BF74(gUnknown_841DFA5);
|
||||
sub_812BF5C();
|
||||
PrintTextOnPanel2Row52RightAlign(gUnknown_841DFA5);
|
||||
PrintWelcomeMessageOnPanel1();
|
||||
sub_813BDA4(1);
|
||||
sub_813BD5C(1);
|
||||
a0->field_0E = 9;
|
||||
helpListMenu->state = 9;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool8 sub_812BC80(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
bool8 HelpSystemSubroutine_WelcomeWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
|
||||
{
|
||||
if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
a0->field_0E = 10;
|
||||
helpListMenu->state = 10;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool8 sub_812BCA8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
bool8 HelpSystemSubroutine_WelcomeEndGotoMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
|
||||
{
|
||||
gUnknown_3005E9C[2] = 0;
|
||||
sub_812BF94(a0);
|
||||
sub_812B4D8(a0, a1);
|
||||
a0->field_0E = 0;
|
||||
sHelpSystemState[2] = 0;
|
||||
ResetHelpSystemCursor(helpListMenu);
|
||||
BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer);
|
||||
helpListMenu->state = 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool8 sub_812BCD0(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
bool8 HelpSystemSubroutine_MenuInputHandlerMain(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
|
||||
{
|
||||
s32 v0 = HelpSystem_GetMenuInput();
|
||||
switch (v0)
|
||||
@@ -1425,42 +1424,42 @@ bool8 sub_812BCD0(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
return FALSE;
|
||||
case -5:
|
||||
case -4:
|
||||
sub_812BF9C(a0, a1);
|
||||
PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer);
|
||||
break;
|
||||
case -3:
|
||||
case -1:
|
||||
break;
|
||||
default:
|
||||
gUnknown_3005E9C[1] = v0;
|
||||
a0->field_0E = 1;
|
||||
sHelpSystemState[1] = v0;
|
||||
helpListMenu->state = 1;
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool8 sub_812BD2C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
bool8 HelpMenuSubroutine_InitSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
|
||||
{
|
||||
gUnknown_3005E9C[0] = 1;
|
||||
gUnknown_3005E9C[2] = a0->field_0D;
|
||||
sub_812BF94(a0);
|
||||
sub_812B5A8(a0, a1);
|
||||
sHelpSystemState[0] = 1;
|
||||
sHelpSystemState[2] = helpListMenu->cursorPos;
|
||||
ResetHelpSystemCursor(helpListMenu);
|
||||
BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer);
|
||||
sub_813C75C();
|
||||
HelpSystem_SetInputDelay(2);
|
||||
a0->field_0E = 3;
|
||||
helpListMenu->state = 3;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool8 sub_812BD64(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
bool8 HelpMenuSubroutine_ReturnFromSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
|
||||
{
|
||||
sub_813C004(0, 0);
|
||||
sub_813C004(1, 0);
|
||||
gUnknown_3005E9C[0] = 0;
|
||||
sub_812B4D8(a0, a1);
|
||||
a0->field_0E = 0;
|
||||
sHelpSystemState[0] = 0;
|
||||
BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer);
|
||||
helpListMenu->state = 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
bool8 HelpMenuSubroutine_SubmenuInputHandler(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
|
||||
{
|
||||
s32 v0 = HelpSystem_GetMenuInput();
|
||||
switch (v0)
|
||||
@@ -1468,7 +1467,7 @@ bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
case -6:
|
||||
return FALSE;
|
||||
case -2:
|
||||
a0->field_0E = 2;
|
||||
helpListMenu->state = 2;
|
||||
break;
|
||||
case -5:
|
||||
case -4:
|
||||
@@ -1476,8 +1475,8 @@ bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
case -1:
|
||||
break;
|
||||
default:
|
||||
gUnknown_3005E9C[3] = v0;
|
||||
a0->field_0E = 4;
|
||||
sHelpSystemState[3] = v0;
|
||||
helpListMenu->state = 4;
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
@@ -1485,60 +1484,60 @@ bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
|
||||
void sub_812BDEC(void)
|
||||
{
|
||||
HelpSystem_PrintTextAt(gUnknown_845B080[gUnknown_3005E9C[1]], 0, 0);
|
||||
HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[sHelpSystemState[1]], 0, 0);
|
||||
}
|
||||
|
||||
bool8 sub_812BE10(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
bool8 HelpMenuSubroutine_HelpItemPrint(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
|
||||
{
|
||||
gUnknown_3005E9C[0] = 2;
|
||||
sHelpSystemState[0] = 2;
|
||||
sub_813BDA4(0);
|
||||
HelpSystem_FillPanel1();
|
||||
sub_812BF74(gUnknown_841DFBE);
|
||||
PrintTextOnPanel2Row52RightAlign(gUnknown_841DFBE);
|
||||
sub_813BDE8(1);
|
||||
sub_813BEE4(1);
|
||||
|
||||
if (gUnknown_3005E9C[1] == 0)
|
||||
if (sHelpSystemState[1] == 0)
|
||||
{
|
||||
HelpSystem_PrintTwoStrings(gUnknown_845B0B0[gUnknown_3005E9C[3]], gUnknown_845B164[gUnknown_3005E9C[3]]);
|
||||
HelpSystem_PrintTwoStrings(sHelpSystemSpecializedQuestionTextPtrs[sHelpSystemState[3]], sHelpSystemSpecializedAnswerTextPtrs[sHelpSystemState[3]]);
|
||||
}
|
||||
else if (gUnknown_3005E9C[1] == 1)
|
||||
else if (sHelpSystemState[1] == 1)
|
||||
{
|
||||
HelpSystem_PrintTwoStrings(gUnknown_845B218[gUnknown_3005E9C[3]], gUnknown_845B2DC[gUnknown_3005E9C[3]]);
|
||||
HelpSystem_PrintTwoStrings(sHelpSystemMenuTopicTextPtrs[sHelpSystemState[3]], sHelpSystemSpecializedControlsTextPtrs[sHelpSystemState[3]]);
|
||||
}
|
||||
else if (gUnknown_3005E9C[1] == 2)
|
||||
else if (sHelpSystemState[1] == 2)
|
||||
{
|
||||
HelpSystem_PrintTwoStrings(gUnknown_845B3A0[gUnknown_3005E9C[3]], gUnknown_845B450[gUnknown_3005E9C[3]]);
|
||||
HelpSystem_PrintTwoStrings(sHelpSystemSpecializedStringsTextPtrs[sHelpSystemState[3]], sHelpSystemSpecializedStringDefinitionsTextPtrs[sHelpSystemState[3]]);
|
||||
}
|
||||
else if (gUnknown_3005E9C[1] == 3)
|
||||
else if (sHelpSystemState[1] == 3)
|
||||
{
|
||||
HelpSystem_PrintTwoStrings(gUnknown_845B500[gUnknown_3005E9C[3]], gUnknown_845B520[gUnknown_3005E9C[3]]);
|
||||
HelpSystem_PrintTwoStrings(sHelpSystemGeneralTopicTextPtrs[sHelpSystemState[3]], sHelpSystemGeneralTopicDescriptionTextPtrs[sHelpSystemState[3]]);
|
||||
}
|
||||
else
|
||||
{
|
||||
HelpSystem_PrintTwoStrings(gUnknown_845B540[gUnknown_3005E9C[3]], gUnknown_845B5D0[gUnknown_3005E9C[3]]);
|
||||
HelpSystem_PrintTwoStrings(sHelpSystemTypeMatchupTextPtrs[sHelpSystemState[3]], sHelpSystemTypeMatchupDescriptionTextPtrs[sHelpSystemState[3]]);
|
||||
}
|
||||
sub_813BDA4(1);
|
||||
sub_813BD5C(1);
|
||||
a0->field_0E = 6;
|
||||
helpListMenu->state = 6;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool8 sub_812BEEC(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
bool8 HelpMenuSubroutine_ReturnFromHelpItem(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
|
||||
{
|
||||
gUnknown_3005E9C[0] = 1;
|
||||
sub_812B5A8(a0, a1);
|
||||
sHelpSystemState[0] = 1;
|
||||
BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer);
|
||||
sub_813C75C();
|
||||
HelpSystem_SetInputDelay(2);
|
||||
a0->field_0E = 3;
|
||||
helpListMenu->state = 3;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool8 sub_812BF18(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
bool8 HelpMenuSubroutine_HelpItemWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
|
||||
{
|
||||
if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
a0->field_0E = 5;
|
||||
helpListMenu->state = 5;
|
||||
return TRUE;
|
||||
}
|
||||
if (JOY_NEW(L_BUTTON | R_BUTTON))
|
||||
@@ -1546,13 +1545,13 @@ bool8 sub_812BF18(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void sub_812BF5C(void)
|
||||
static void PrintWelcomeMessageOnPanel1(void)
|
||||
{
|
||||
HelpSystem_FillPanel1();
|
||||
HelpSystem_PrintTextAt(gUnknown_81B2FC9, 0, 0);
|
||||
}
|
||||
|
||||
static void sub_812BF74(const u8 * str)
|
||||
static void PrintTextOnPanel2Row52RightAlign(const u8 * str)
|
||||
{
|
||||
HelpSystem_FillPanel2();
|
||||
HelpSystem_PrintTextRightAlign_Row52(str);
|
||||
@@ -1560,21 +1559,21 @@ static void sub_812BF74(const u8 * str)
|
||||
|
||||
u8 sub_812BF88(void)
|
||||
{
|
||||
return gUnknown_3005E9C[0];
|
||||
return sHelpSystemState[0];
|
||||
}
|
||||
|
||||
static void sub_812BF94(struct HelpSystemListMenu * a0)
|
||||
static void ResetHelpSystemCursor(struct HelpSystemListMenu * helpListMenu)
|
||||
{
|
||||
a0->field_0C = 0;
|
||||
a0->field_0D = 0;
|
||||
helpListMenu->itemsAbove = 0;
|
||||
helpListMenu->cursorPos = 0;
|
||||
}
|
||||
|
||||
static void sub_812BF9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
|
||||
{
|
||||
s32 index = a1[a0->field_0C + a0->field_0D].index;
|
||||
s32 index = listMenuItemsBuffer[helpListMenu->itemsAbove + helpListMenu->cursorPos].index;
|
||||
if (index == -2)
|
||||
HelpSystem_PrintText_813C584(gUnknown_845B098[5]);
|
||||
HelpSystem_PrintText_813C584(sHelpSystemTopicMouseoverDescriptionPtrs[5]);
|
||||
else
|
||||
HelpSystem_PrintText_813C584(gUnknown_845B098[index]);
|
||||
HelpSystem_PrintText_813C584(sHelpSystemTopicMouseoverDescriptionPtrs[index]);
|
||||
sub_813BE30(1);
|
||||
}
|
||||
|
||||
+2
-2
@@ -1431,7 +1431,7 @@ static void sub_80EDB70(struct IntroSequenceData * this)
|
||||
{
|
||||
this->field_0018->pos1.x += this->field_0018->pos2.x;
|
||||
this->field_0018->pos1.y += this->field_0018->pos2.y;
|
||||
sub_8007FFC(this->field_0018, 0, 0x2A);
|
||||
obj_pos2_update_enable(this->field_0018, 0, 0x2A);
|
||||
this->field_0018->callback = SpriteCallbackDummy;
|
||||
StartSpriteAffineAnim(this->field_0018, 1);
|
||||
}
|
||||
@@ -1448,7 +1448,7 @@ static void sub_80EDBAC(struct IntroSequenceData * this)
|
||||
{
|
||||
StartSpriteAffineAnim(this->field_0028[i], 1);
|
||||
this->field_0028[i]->callback = nullsub_83;
|
||||
sub_8007FFC(this->field_0028[i], gUnknown_840BBB8[i][0], gUnknown_840BBB8[i][1]);
|
||||
obj_pos2_update_enable(this->field_0028[i], gUnknown_840BBB8[i][0], gUnknown_840BBB8[i][1]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -309,7 +309,7 @@ static void MoveRelearnerLoadBgGfx(void)
|
||||
FillBgTilemapBufferRect(0, 0x000, 0, 0, 30, 20, 0xF);
|
||||
SetBgTilemapBuffer(1, sMoveRelearner->bg1TilemapBuffer);
|
||||
TextWindow_SetUserSelectedFrame(0, 1, 0xE0);
|
||||
sub_8107D38(0xD0, 1);
|
||||
ListMenuLoadStdPalAt(0xD0, 1);
|
||||
LoadPalette(gUnknown_8E97DDC, 0x00, 0x20);
|
||||
DecompressAndLoadBgGfxUsingHeap(1, gUnknown_8E97DFC, 0, 0, 0);
|
||||
CopyToBgTilemapBuffer(1, gUnknown_8E97EC4, 0, 0);
|
||||
|
||||
@@ -0,0 +1,402 @@
|
||||
#include "global.h"
|
||||
#include "librfu.h"
|
||||
|
||||
static void sio32intr_clock_master(void);
|
||||
static void sio32intr_clock_slave(void);
|
||||
static u16 handshake_wait(u16 slot);
|
||||
static void STWI_set_timer_in_RAM(u8 count);
|
||||
static void STWI_stop_timer_in_RAM(void);
|
||||
static void STWI_init_slave(void);
|
||||
static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)());
|
||||
static void Callback_Dummy_S(u16 reqCommandId, void (*callbackS)(u16));
|
||||
static void Callback_Dummy_ID(void (*callbackId)(void));
|
||||
|
||||
void IntrSIO32(void)
|
||||
{
|
||||
if (gSTWIStatus->state == 10)
|
||||
{
|
||||
if (gSTWIStatus->callbackID != NULL)
|
||||
Callback_Dummy_ID(gSTWIStatus->callbackID);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gSTWIStatus->msMode == AGB_CLK_MASTER)
|
||||
sio32intr_clock_master();
|
||||
else
|
||||
sio32intr_clock_slave();
|
||||
}
|
||||
}
|
||||
|
||||
static void sio32intr_clock_master(void)
|
||||
{
|
||||
u32 regSIODATA32;
|
||||
u32 ackLen;
|
||||
|
||||
STWI_set_timer_in_RAM(80);
|
||||
regSIODATA32 = REG_SIODATA32;
|
||||
|
||||
if (gSTWIStatus->state == 0) // master send req
|
||||
{
|
||||
if (regSIODATA32 == 0x80000000)
|
||||
{
|
||||
if (gSTWIStatus->reqNext <= gSTWIStatus->reqLength)
|
||||
{
|
||||
REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket->rfuPacket8.data)[gSTWIStatus->reqNext];
|
||||
gSTWIStatus->reqNext++;
|
||||
}
|
||||
else
|
||||
{
|
||||
gSTWIStatus->state = 1; // master wait ack
|
||||
REG_SIODATA32 = 0x80000000;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
STWI_stop_timer_in_RAM();
|
||||
STWI_set_timer_in_RAM(130);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (gSTWIStatus->state == 1) // master wait ack
|
||||
{
|
||||
if ((regSIODATA32 & 0xFFFF0000) == 0x99660000)
|
||||
{
|
||||
gSTWIStatus->ackNext = 0;
|
||||
((u32*)gSTWIStatus->rxPacket)[gSTWIStatus->ackNext] = regSIODATA32;
|
||||
gSTWIStatus->ackNext++;
|
||||
gSTWIStatus->ackActiveCommand = regSIODATA32;
|
||||
gSTWIStatus->ackLength = ackLen = regSIODATA32 >> 8;
|
||||
if ((ackLen = gSTWIStatus->ackLength) >= gSTWIStatus->ackNext)
|
||||
{
|
||||
gSTWIStatus->state = 2; // master receive ack
|
||||
REG_SIODATA32 = 0x80000000;
|
||||
}
|
||||
else
|
||||
{
|
||||
gSTWIStatus->state = 3; // master done ack
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
STWI_stop_timer_in_RAM();
|
||||
STWI_set_timer_in_RAM(130);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (gSTWIStatus->state == 2) // master receive ack
|
||||
{
|
||||
((u32*)gSTWIStatus->rxPacket)[gSTWIStatus->ackNext] = regSIODATA32;
|
||||
gSTWIStatus->ackNext++;
|
||||
if (gSTWIStatus->ackLength < gSTWIStatus->ackNext)
|
||||
gSTWIStatus->state = 3; // master done ack
|
||||
else
|
||||
REG_SIODATA32 = 0x80000000;
|
||||
}
|
||||
|
||||
if (handshake_wait(1) == 1)
|
||||
return;
|
||||
|
||||
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS | SIO_MULTI_SD;
|
||||
|
||||
if (handshake_wait(0) == 1)
|
||||
return;
|
||||
|
||||
STWI_stop_timer_in_RAM();
|
||||
|
||||
if (gSTWIStatus->state == 3) // master done ack
|
||||
{
|
||||
if (
|
||||
gSTWIStatus->ackActiveCommand == (0x80 | ID_MS_CHANGE_REQ)
|
||||
|| gSTWIStatus->ackActiveCommand == (0x80 | ID_DATA_TX_AND_CHANGE_REQ)
|
||||
|| gSTWIStatus->ackActiveCommand == (0x80 | ID_UNK35_REQ)
|
||||
|| gSTWIStatus->ackActiveCommand == (0x80 | ID_RESUME_RETRANSMIT_AND_CHANGE_REQ)
|
||||
)
|
||||
{
|
||||
|
||||
gSTWIStatus->msMode = AGB_CLK_SLAVE;
|
||||
REG_SIODATA32 = 0x80000000;
|
||||
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS;
|
||||
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE;
|
||||
gSTWIStatus->state = 5; // slave receive req init
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gSTWIStatus->ackActiveCommand == 0xEE)
|
||||
{
|
||||
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
|
||||
gSTWIStatus->state = 4; // error
|
||||
gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION;
|
||||
}
|
||||
else
|
||||
{
|
||||
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
|
||||
gSTWIStatus->state = 4; // error
|
||||
}
|
||||
}
|
||||
gSTWIStatus->sending = 0;
|
||||
if (gSTWIStatus->callbackM != NULL)
|
||||
Callback_Dummy_M(gSTWIStatus->reqActiveCommand, gSTWIStatus->error, gSTWIStatus->callbackM);
|
||||
}
|
||||
else
|
||||
{
|
||||
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
|
||||
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS | SIO_ENABLE;
|
||||
}
|
||||
}
|
||||
|
||||
static void sio32intr_clock_slave(void)
|
||||
{
|
||||
u32 regSIODATA32;
|
||||
u32 r0;
|
||||
register u32 reqLen asm("r2");
|
||||
|
||||
gSTWIStatus->timerActive = 0;
|
||||
STWI_set_timer_in_RAM(100);
|
||||
if (handshake_wait(0) == 1)
|
||||
return;
|
||||
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_MULTI_SD;
|
||||
regSIODATA32 = REG_SIODATA32;
|
||||
if (gSTWIStatus->state == 5) // slave receive req init
|
||||
{
|
||||
((u32*)gSTWIStatus->rxPacket)[0] = regSIODATA32;
|
||||
gSTWIStatus->reqNext = 1;
|
||||
r0 = 0x99660000;
|
||||
if ((regSIODATA32 >> 16) == (r0 >> 16))
|
||||
{
|
||||
gSTWIStatus->reqLength = reqLen = regSIODATA32 >> 8;
|
||||
gSTWIStatus->reqActiveCommand = regSIODATA32;
|
||||
if (gSTWIStatus->reqLength == 0)
|
||||
{
|
||||
if (
|
||||
gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ
|
||||
|| gSTWIStatus->reqActiveCommand == ID_DATA_READY_AND_CHANGE_REQ
|
||||
|| gSTWIStatus->reqActiveCommand == ID_DISCONNECTED_AND_CHANGE_REQ
|
||||
|| gSTWIStatus->reqActiveCommand == ID_UNK36_REQ
|
||||
)
|
||||
{
|
||||
gSTWIStatus->ackActiveCommand = gSTWIStatus->reqActiveCommand + 0x80;
|
||||
((u32*)gSTWIStatus->txPacket)[0] = 0x99660000 + gSTWIStatus->ackActiveCommand;
|
||||
gSTWIStatus->ackLength = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
((u32*)gSTWIStatus->txPacket)[0] = 0x996601EE;
|
||||
if (gSTWIStatus->reqActiveCommand >= 0x10 && gSTWIStatus->reqActiveCommand <= 0x3D)
|
||||
{
|
||||
((u32*)gSTWIStatus->txPacket)[1] = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
((u32*)gSTWIStatus->txPacket)[1] = 2;
|
||||
}
|
||||
gSTWIStatus->ackLength = 1;
|
||||
gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION;
|
||||
}
|
||||
REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket)[0];
|
||||
gSTWIStatus->ackNext = 1;
|
||||
gSTWIStatus->state = 7; // slave send ack
|
||||
}
|
||||
else
|
||||
{
|
||||
REG_SIODATA32 = 0x80000000;
|
||||
gSTWIStatus->reqNext = 1;
|
||||
gSTWIStatus->state = 6; // slave receive req
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
STWI_stop_timer_in_RAM();
|
||||
STWI_set_timer_in_RAM(100);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (gSTWIStatus->state == 6) // slave receive req
|
||||
{
|
||||
((u32*)gSTWIStatus->rxPacket)[gSTWIStatus->reqNext] = regSIODATA32;
|
||||
gSTWIStatus->reqNext++;
|
||||
if (gSTWIStatus->reqLength < gSTWIStatus->reqNext)
|
||||
{
|
||||
if (
|
||||
gSTWIStatus->reqActiveCommand == ID_DATA_READY_AND_CHANGE_REQ
|
||||
|| gSTWIStatus->reqActiveCommand == ID_DISCONNECTED_AND_CHANGE_REQ
|
||||
|| gSTWIStatus->reqActiveCommand == ID_UNK36_REQ
|
||||
)
|
||||
{
|
||||
gSTWIStatus->ackActiveCommand = gSTWIStatus->reqActiveCommand + 0x80;
|
||||
((u32*)gSTWIStatus->txPacket)[0] = 0x99660000 | gSTWIStatus->ackActiveCommand;
|
||||
gSTWIStatus->ackLength = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
((u32*)gSTWIStatus->txPacket)[0] = 0x996601EE;
|
||||
if (gSTWIStatus->reqActiveCommand >= 0x10 && gSTWIStatus->reqActiveCommand <= 0x3D)
|
||||
{
|
||||
((u32*)gSTWIStatus->txPacket)[1] = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
((u32*)gSTWIStatus->txPacket)[1] = 2;
|
||||
}
|
||||
gSTWIStatus->ackLength = 1;
|
||||
gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION;
|
||||
}
|
||||
REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket)[0];
|
||||
gSTWIStatus->ackNext = 1;
|
||||
gSTWIStatus->state = 7; // slave send ack
|
||||
}
|
||||
else
|
||||
{
|
||||
REG_SIODATA32 = 0x80000000;
|
||||
}
|
||||
}
|
||||
else if (gSTWIStatus->state == 7) // slave send ack
|
||||
{
|
||||
if (regSIODATA32 == 0x80000000)
|
||||
{
|
||||
if (gSTWIStatus->ackLength < gSTWIStatus->ackNext)
|
||||
{
|
||||
gSTWIStatus->state = 8; // slave done ack
|
||||
}
|
||||
else
|
||||
{
|
||||
REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket)[gSTWIStatus->ackNext];
|
||||
gSTWIStatus->ackNext++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
STWI_stop_timer_in_RAM();
|
||||
STWI_set_timer_in_RAM(100);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (handshake_wait(1) == 1)
|
||||
return;
|
||||
if (gSTWIStatus->state == 8) // slave done ack
|
||||
{
|
||||
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS;
|
||||
STWI_stop_timer_in_RAM();
|
||||
if (gSTWIStatus->error == ERR_REQ_CMD_ACK_REJECTION)
|
||||
{
|
||||
STWI_init_slave();
|
||||
if (gSTWIStatus->callbackS != NULL)
|
||||
{
|
||||
Callback_Dummy_S(0x1EE, gSTWIStatus->callbackS);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
REG_SIODATA32 = 0;
|
||||
REG_SIOCNT = 0;
|
||||
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
|
||||
gSTWIStatus->msMode = AGB_CLK_MASTER;
|
||||
gSTWIStatus->state = 0; // master send req
|
||||
if (gSTWIStatus->callbackS != NULL)
|
||||
{
|
||||
Callback_Dummy_S((gSTWIStatus->reqLength << 8) | (gSTWIStatus->reqActiveCommand), gSTWIStatus->callbackS);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
REG_IME = 0;
|
||||
if (REG_TM0CNT_H & TIMER_ENABLE)
|
||||
{
|
||||
if ((REG_TM0CNT_H & 0x03) == TIMER_1CLK)
|
||||
{
|
||||
while (REG_TM0CNT_L > 0xFF9B);
|
||||
}
|
||||
else
|
||||
{
|
||||
while (REG_TM0CNT_L > 0xFFFE);
|
||||
}
|
||||
}
|
||||
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS;
|
||||
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE;
|
||||
REG_IME = 1;
|
||||
}
|
||||
}
|
||||
|
||||
static u16 handshake_wait(u16 slot)
|
||||
{
|
||||
do
|
||||
{
|
||||
if ((gSTWIStatus->timerActive & 0xFF) == 1)
|
||||
{
|
||||
gSTWIStatus->timerActive = 0;
|
||||
return 1;
|
||||
}
|
||||
} while ((REG_SIOCNT & SIO_MULTI_SI) != (slot << SIO_MULTI_SI_SHIFT));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void STWI_set_timer_in_RAM(u8 count)
|
||||
{
|
||||
vu16* regTMCNTL = (vu16*)(REG_ADDR_TMCNT_L + gSTWIStatus->timerSelect * 4);
|
||||
vu16* regTMCNTH = (vu16*)(REG_ADDR_TMCNT_H + gSTWIStatus->timerSelect * 4);
|
||||
REG_IME = 0;
|
||||
switch (count)
|
||||
{
|
||||
case 50:
|
||||
*regTMCNTL = 0xFCCB;
|
||||
gSTWIStatus->timerState = 1;
|
||||
break;
|
||||
case 80:
|
||||
*regTMCNTL = 0xFAE0;
|
||||
gSTWIStatus->timerState = 2;
|
||||
break;
|
||||
case 100:
|
||||
*regTMCNTL = 0xF996;
|
||||
gSTWIStatus->timerState = 3;
|
||||
break;
|
||||
case 130:
|
||||
*regTMCNTL = 0xF7AD;
|
||||
gSTWIStatus->timerState = 4;
|
||||
break;
|
||||
}
|
||||
*regTMCNTH = TIMER_ENABLE | TIMER_64CLK | TIMER_256CLK | TIMER_INTR_ENABLE;
|
||||
REG_IF = INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect;
|
||||
REG_IME = 1;
|
||||
}
|
||||
|
||||
static void STWI_stop_timer_in_RAM(void)
|
||||
{
|
||||
gSTWIStatus->timerState = 0;
|
||||
REG_TMCNT_L(gSTWIStatus->timerSelect) = 0;
|
||||
REG_TMCNT_H(gSTWIStatus->timerSelect) = 0;
|
||||
}
|
||||
|
||||
static void STWI_init_slave(void)
|
||||
{
|
||||
gSTWIStatus->state = 5; // slave receive req init
|
||||
gSTWIStatus->msMode = AGB_CLK_SLAVE;
|
||||
gSTWIStatus->reqLength = 0;
|
||||
gSTWIStatus->reqNext = 0;
|
||||
gSTWIStatus->reqActiveCommand = 0;
|
||||
gSTWIStatus->ackLength = 0;
|
||||
gSTWIStatus->ackNext = 0;
|
||||
gSTWIStatus->ackActiveCommand = 0;
|
||||
gSTWIStatus->timerState = 0;
|
||||
gSTWIStatus->timerActive = 0;
|
||||
gSTWIStatus->error = 0;
|
||||
gSTWIStatus->recoveryCount = 0;
|
||||
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE;
|
||||
}
|
||||
|
||||
NAKED
|
||||
static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)())
|
||||
{
|
||||
asm("bx r2");
|
||||
}
|
||||
|
||||
NAKED
|
||||
static void Callback_Dummy_S(u16 reqCommandId, void (*callbackS)(u16))
|
||||
{
|
||||
asm("bx r1");
|
||||
}
|
||||
|
||||
NAKED
|
||||
static void Callback_Dummy_ID(void (*callbackId)(void))
|
||||
{
|
||||
asm("bx r0");
|
||||
}
|
||||
+904
-840
File diff suppressed because it is too large
Load Diff
+76
-66
@@ -4,44 +4,56 @@ static void Sio32IDIntr(void);
|
||||
static void Sio32IDInit(void);
|
||||
static s32 Sio32IDMain(void);
|
||||
|
||||
struct RfuSIO32Id
|
||||
{
|
||||
u8 MS_mode;
|
||||
u8 state;
|
||||
u16 count;
|
||||
u16 send_id;
|
||||
u16 recv_id;
|
||||
u16 unk8; // unused
|
||||
u16 lastId;
|
||||
};
|
||||
|
||||
struct RfuSIO32Id gRfuSIO32Id;
|
||||
|
||||
static const u16 Sio32ConnectionData[] = { 0x494e, 0x544e, 0x4e45, 0x4f44 }; // NINTENDO
|
||||
static const char Sio32IDLib_Var[] = "Sio32ID_030820";
|
||||
|
||||
s32 AgbRFU_checkID(u8 r5)
|
||||
s32 AgbRFU_checkID(u8 maxTries)
|
||||
{
|
||||
u16 r8;
|
||||
vu16 *r4;
|
||||
s32 r6;
|
||||
u16 ieBak;
|
||||
vu16 *regTMCNTL;
|
||||
s32 id;
|
||||
|
||||
// Interrupts must be enabled
|
||||
if (REG_IME == 0)
|
||||
return -1;
|
||||
r8 = REG_IE;
|
||||
ieBak = REG_IE;
|
||||
gSTWIStatus->state = 10;
|
||||
STWI_set_Callback_ID(Sio32IDIntr);
|
||||
Sio32IDInit();
|
||||
r4 = ®_TMCNT_L(gSTWIStatus->timerSelect);
|
||||
r5 *= 8;
|
||||
while (--r5 != 0xFF)
|
||||
regTMCNTL = ®_TMCNT_L(gSTWIStatus->timerSelect);
|
||||
maxTries *= 8;
|
||||
while (--maxTries != 0xFF)
|
||||
{
|
||||
r6 = Sio32IDMain();
|
||||
if (r6 != 0)
|
||||
id = Sio32IDMain();
|
||||
if (id != 0)
|
||||
break;
|
||||
r4[1] = 0;
|
||||
r4[0] = 0;
|
||||
r4[1] = TIMER_1024CLK | TIMER_ENABLE;
|
||||
while (r4[0] < 32)
|
||||
regTMCNTL[1] = 0;
|
||||
regTMCNTL[0] = 0;
|
||||
regTMCNTL[1] = TIMER_1024CLK | TIMER_ENABLE;
|
||||
while (regTMCNTL[0] < 32)
|
||||
;
|
||||
r4[1] = 0;
|
||||
r4[0] = 0;
|
||||
regTMCNTL[1] = 0;
|
||||
regTMCNTL[0] = 0;
|
||||
}
|
||||
REG_IME = 0;
|
||||
REG_IE = r8;
|
||||
REG_IE = ieBak;
|
||||
REG_IME = 1;
|
||||
gSTWIStatus->state = 0;
|
||||
STWI_set_Callback_ID(NULL);
|
||||
return r6;
|
||||
return id;
|
||||
}
|
||||
|
||||
static void Sio32IDInit(void)
|
||||
@@ -58,107 +70,105 @@ static void Sio32IDInit(void)
|
||||
|
||||
static s32 Sio32IDMain(void)
|
||||
{
|
||||
u8 r12;
|
||||
|
||||
switch (r12 = gRfuSIO32Id.unk1)
|
||||
switch (gRfuSIO32Id.state)
|
||||
{
|
||||
case 0:
|
||||
gRfuSIO32Id.unk0 = 1;
|
||||
gRfuSIO32Id.MS_mode = AGB_CLK_MASTER;
|
||||
REG_SIOCNT |= SIO_38400_BPS;
|
||||
REG_IME = r12;
|
||||
REG_IME = 0;
|
||||
REG_IE |= INTR_FLAG_SERIAL;
|
||||
REG_IME = 1;
|
||||
gRfuSIO32Id.unk1 = 1;
|
||||
gRfuSIO32Id.state = 1;
|
||||
*(vu8 *)®_SIOCNT |= SIO_ENABLE;
|
||||
break;
|
||||
case 1:
|
||||
if (gRfuSIO32Id.unkA == 0)
|
||||
if (gRfuSIO32Id.lastId == 0)
|
||||
{
|
||||
if (gRfuSIO32Id.unk0 == 1)
|
||||
if (gRfuSIO32Id.MS_mode == AGB_CLK_MASTER)
|
||||
{
|
||||
if (gRfuSIO32Id.unk2 == 0)
|
||||
if (gRfuSIO32Id.count == 0)
|
||||
{
|
||||
REG_IME = gRfuSIO32Id.unk2;
|
||||
REG_IME = 0;
|
||||
REG_SIOCNT |= SIO_ENABLE;
|
||||
REG_IME = r12;
|
||||
REG_IME = 1;
|
||||
}
|
||||
}
|
||||
else if (gRfuSIO32Id.unk4 != 0x8001 && !gRfuSIO32Id.unk2)
|
||||
else if (gRfuSIO32Id.send_id != RFU_ID && !gRfuSIO32Id.count)
|
||||
{
|
||||
REG_IME = gRfuSIO32Id.unk2;
|
||||
REG_IME = 0;
|
||||
REG_IE &= ~INTR_FLAG_SERIAL;
|
||||
REG_IME = r12;
|
||||
REG_SIOCNT = gRfuSIO32Id.unk2;
|
||||
REG_IME = 1;
|
||||
REG_SIOCNT = 0;
|
||||
REG_SIOCNT = SIO_32BIT_MODE;
|
||||
REG_IF = INTR_FLAG_SERIAL;
|
||||
REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE;
|
||||
REG_IME = gRfuSIO32Id.unk2;
|
||||
REG_IME = 0;
|
||||
REG_IE |= INTR_FLAG_SERIAL;
|
||||
REG_IME = r12;
|
||||
REG_IME = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
gRfuSIO32Id.unk1 = 2;
|
||||
gRfuSIO32Id.state = 2;
|
||||
// fallthrough
|
||||
}
|
||||
default:
|
||||
return gRfuSIO32Id.unkA;
|
||||
return gRfuSIO32Id.lastId;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void Sio32IDIntr(void)
|
||||
{
|
||||
u32 r5;
|
||||
u16 r0;
|
||||
u32 regSIODATA32;
|
||||
u16 delay;
|
||||
#ifndef NONMATCHING
|
||||
register u32 r1 asm("r1");
|
||||
register u16 r0_ asm("r0");
|
||||
register u32 rfuSIO32IdUnk0_times_16 asm("r1");
|
||||
register u16 negRfuSIO32IdUnk6 asm("r0");
|
||||
#else
|
||||
u32 r1;
|
||||
u16 r0_;
|
||||
u32 rfuSIO32IdUnk0_times_16;
|
||||
u16 negRfuSIO32IdUnk6;
|
||||
#endif
|
||||
|
||||
r5 = REG_SIODATA32;
|
||||
if (gRfuSIO32Id.unk0 != 1)
|
||||
regSIODATA32 = REG_SIODATA32;
|
||||
if (gRfuSIO32Id.MS_mode != AGB_CLK_MASTER)
|
||||
REG_SIOCNT |= SIO_ENABLE;
|
||||
r1 = 16 * gRfuSIO32Id.unk0; // to handle side effect of inline asm
|
||||
r1 = (r5 << r1) >> 16;
|
||||
r5 = (r5 << 16 * (1 - gRfuSIO32Id.unk0)) >> 16;
|
||||
if (gRfuSIO32Id.unkA == 0)
|
||||
rfuSIO32IdUnk0_times_16 = 16 * gRfuSIO32Id.MS_mode; // to handle side effect of inline asm
|
||||
rfuSIO32IdUnk0_times_16 = (regSIODATA32 << rfuSIO32IdUnk0_times_16) >> 16;
|
||||
regSIODATA32 = (regSIODATA32 << 16 * (1 - gRfuSIO32Id.MS_mode)) >> 16;
|
||||
if (gRfuSIO32Id.lastId == 0)
|
||||
{
|
||||
if (r1 == gRfuSIO32Id.unk6)
|
||||
if (rfuSIO32IdUnk0_times_16 == gRfuSIO32Id.recv_id)
|
||||
{
|
||||
if (gRfuSIO32Id.unk2 > 3)
|
||||
if (gRfuSIO32Id.count > 3)
|
||||
{
|
||||
gRfuSIO32Id.unkA = r5;
|
||||
gRfuSIO32Id.lastId = regSIODATA32;
|
||||
}
|
||||
else if (r1 == (u16)~gRfuSIO32Id.unk4)
|
||||
else if (rfuSIO32IdUnk0_times_16 == (u16)~gRfuSIO32Id.send_id)
|
||||
{
|
||||
r0_ = ~gRfuSIO32Id.unk6;
|
||||
if (r5 == r0_)
|
||||
++gRfuSIO32Id.unk2;
|
||||
negRfuSIO32IdUnk6 = ~gRfuSIO32Id.recv_id;
|
||||
if (regSIODATA32 == negRfuSIO32IdUnk6)
|
||||
++gRfuSIO32Id.count;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
gRfuSIO32Id.unk2 = gRfuSIO32Id.unkA;
|
||||
gRfuSIO32Id.count = 0;
|
||||
}
|
||||
}
|
||||
if (gRfuSIO32Id.unk2 < 4)
|
||||
gRfuSIO32Id.unk4 = *(gRfuSIO32Id.unk2 + Sio32ConnectionData);
|
||||
if (gRfuSIO32Id.count < 4)
|
||||
gRfuSIO32Id.send_id = *(gRfuSIO32Id.count + Sio32ConnectionData);
|
||||
else
|
||||
gRfuSIO32Id.unk4 = 0x8001;
|
||||
gRfuSIO32Id.unk6 = ~r5;
|
||||
REG_SIODATA32 = (gRfuSIO32Id.unk4 << 16 * (1 - gRfuSIO32Id.unk0))
|
||||
+ (gRfuSIO32Id.unk6 << 16 * gRfuSIO32Id.unk0);
|
||||
if (gRfuSIO32Id.unk0 == 1 && (gRfuSIO32Id.unk2 || r5 == 0x494E))
|
||||
gRfuSIO32Id.send_id = RFU_ID;
|
||||
gRfuSIO32Id.recv_id = ~regSIODATA32;
|
||||
REG_SIODATA32 = (gRfuSIO32Id.send_id << 16 * (1 - gRfuSIO32Id.MS_mode))
|
||||
+ (gRfuSIO32Id.recv_id << 16 * gRfuSIO32Id.MS_mode);
|
||||
if (gRfuSIO32Id.MS_mode == AGB_CLK_MASTER && (gRfuSIO32Id.count != 0 || regSIODATA32 == 0x494e))
|
||||
{
|
||||
for (r0 = 0; r0 < 600; ++r0)
|
||||
for (delay = 0; delay < 600; ++delay)
|
||||
;
|
||||
if (gRfuSIO32Id.unkA == 0)
|
||||
if (gRfuSIO32Id.lastId == 0)
|
||||
REG_SIOCNT |= SIO_ENABLE;
|
||||
}
|
||||
}
|
||||
|
||||
+42
-39
@@ -28,8 +28,8 @@ void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, b
|
||||
}
|
||||
gSTWIStatus->rxPacket = &interruptStruct->rxPacketAlloc;
|
||||
gSTWIStatus->txPacket = &interruptStruct->txPacketAlloc;
|
||||
gSTWIStatus->msMode = 1;
|
||||
gSTWIStatus->state = 0;
|
||||
gSTWIStatus->msMode = AGB_CLK_MASTER;
|
||||
gSTWIStatus->state = 0; // master send req
|
||||
gSTWIStatus->reqLength = 0;
|
||||
gSTWIStatus->reqNext = 0;
|
||||
gSTWIStatus->ackLength = 0;
|
||||
@@ -39,7 +39,7 @@ void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, b
|
||||
gSTWIStatus->timerActive = 0;
|
||||
gSTWIStatus->error = 0;
|
||||
gSTWIStatus->recoveryCount = 0;
|
||||
gSTWIStatus->unk_2c = 0;
|
||||
gSTWIStatus->sending = 0;
|
||||
REG_RCNT = 0x100; // TODO: mystery bit?
|
||||
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
|
||||
STWI_init_Callback_M();
|
||||
@@ -71,7 +71,7 @@ void AgbRFU_SoftReset(void)
|
||||
*timerH = 3;
|
||||
REG_RCNT = 0x80A0;
|
||||
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
|
||||
gSTWIStatus->state = 0;
|
||||
gSTWIStatus->state = 0; // master send req
|
||||
gSTWIStatus->reqLength = 0;
|
||||
gSTWIStatus->reqNext = 0;
|
||||
gSTWIStatus->reqActiveCommand = 0;
|
||||
@@ -81,9 +81,9 @@ void AgbRFU_SoftReset(void)
|
||||
gSTWIStatus->timerState = 0;
|
||||
gSTWIStatus->timerActive = 0;
|
||||
gSTWIStatus->error = 0;
|
||||
gSTWIStatus->msMode = 1;
|
||||
gSTWIStatus->msMode = AGB_CLK_MASTER;
|
||||
gSTWIStatus->recoveryCount = 0;
|
||||
gSTWIStatus->unk_2c = 0;
|
||||
gSTWIStatus->sending = 0;
|
||||
}
|
||||
|
||||
void STWI_set_MS_mode(u8 mode)
|
||||
@@ -131,12 +131,12 @@ void STWI_set_Callback_S(void (*callbackS)(u16))
|
||||
|
||||
void STWI_set_Callback_ID(void (*func)(void)) // name in SDK, but is actually setting a function pointer
|
||||
{
|
||||
gSTWIStatus->unk_20 = func;
|
||||
gSTWIStatus->callbackID = func;
|
||||
}
|
||||
|
||||
u16 STWI_poll_CommandEnd(void)
|
||||
{
|
||||
while (gSTWIStatus->unk_2c == TRUE)
|
||||
while (gSTWIStatus->sending == 1)
|
||||
;
|
||||
return gSTWIStatus->error;
|
||||
}
|
||||
@@ -195,7 +195,7 @@ void STWI_send_ConfigStatusREQ(void)
|
||||
}
|
||||
}
|
||||
|
||||
void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data)
|
||||
void STWI_send_GameConfigREQ(const u8 *serial_gname, const u8 *uname)
|
||||
{
|
||||
u8 *packetBytes;
|
||||
s32 i;
|
||||
@@ -203,29 +203,28 @@ void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data)
|
||||
if (!STWI_init(ID_GAME_CONFIG_REQ))
|
||||
{
|
||||
gSTWIStatus->reqLength = 6;
|
||||
// TODO: what is unk1
|
||||
packetBytes = gSTWIStatus->txPacket->rfuPacket8.data;
|
||||
packetBytes += sizeof(u32);
|
||||
*(u16 *)packetBytes = *(u16 *)unk1;
|
||||
*(u16 *)packetBytes = *(u16 *)serial_gname;
|
||||
packetBytes += sizeof(u16);
|
||||
unk1 += sizeof(u16);
|
||||
serial_gname += sizeof(u16);
|
||||
for (i = 0; i < 14; ++i)
|
||||
{
|
||||
*packetBytes = *unk1;
|
||||
*packetBytes = *serial_gname;
|
||||
++packetBytes;
|
||||
++unk1;
|
||||
++serial_gname;
|
||||
}
|
||||
for (i = 0; i < 8; ++i)
|
||||
{
|
||||
*packetBytes = *data;
|
||||
*packetBytes = *uname;
|
||||
++packetBytes;
|
||||
++data;
|
||||
++uname;
|
||||
}
|
||||
STWI_start_Command();
|
||||
}
|
||||
}
|
||||
|
||||
void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3)
|
||||
void STWI_send_SystemConfigREQ(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer)
|
||||
{
|
||||
if (!STWI_init(ID_SYSTEM_CONFIG_REQ))
|
||||
{
|
||||
@@ -234,9 +233,9 @@ void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3)
|
||||
gSTWIStatus->reqLength = 1;
|
||||
packetBytes = gSTWIStatus->txPacket->rfuPacket8.data;
|
||||
packetBytes += sizeof(u32);
|
||||
*packetBytes++ = unk3;
|
||||
*packetBytes++ = unk2;
|
||||
*(u16*)packetBytes = unk1;
|
||||
*packetBytes++ = mcTimer;
|
||||
*packetBytes++ = maxMFrame;
|
||||
*(u16*)packetBytes = availSlotFlag;
|
||||
STWI_start_Command();
|
||||
}
|
||||
}
|
||||
@@ -499,20 +498,17 @@ static void STWI_intr_timer(void)
|
||||
STWI_stop_timer();
|
||||
STWI_reset_ClockCounter();
|
||||
if (gSTWIStatus->callbackM != NULL)
|
||||
gSTWIStatus->callbackM(255, 0);
|
||||
gSTWIStatus->callbackM(ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void STWI_set_timer(u8 unk)
|
||||
static void STWI_set_timer(u8 count)
|
||||
{
|
||||
vu16 *timerL;
|
||||
vu16 *timerH;
|
||||
|
||||
timerL = ®_TMCNT_L(gSTWIStatus->timerSelect);
|
||||
timerH = ®_TMCNT_H(gSTWIStatus->timerSelect);
|
||||
vu16 *timerL = ®_TMCNT_L(gSTWIStatus->timerSelect);
|
||||
vu16 *timerH = ®_TMCNT_H(gSTWIStatus->timerSelect);
|
||||
REG_IME = 0;
|
||||
switch (unk)
|
||||
switch (count)
|
||||
{
|
||||
case 50:
|
||||
*timerL = 0xFCCB;
|
||||
@@ -543,25 +539,31 @@ static void STWI_stop_timer(void)
|
||||
REG_TMCNT_H(gSTWIStatus->timerSelect) = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up STWI to send REQ. Returns 1 if error (see below).
|
||||
*/
|
||||
static u16 STWI_init(u8 request)
|
||||
{
|
||||
if (!REG_IME)
|
||||
{
|
||||
// Can't start sending if IME is disabled.
|
||||
gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE;
|
||||
if (gSTWIStatus->callbackM != NULL)
|
||||
gSTWIStatus->callbackM(request, gSTWIStatus->error);
|
||||
return TRUE;
|
||||
}
|
||||
else if (gSTWIStatus->unk_2c == TRUE)
|
||||
else if (gSTWIStatus->sending == 1)
|
||||
{
|
||||
// Already sending something. Cancel and error.
|
||||
gSTWIStatus->error = ERR_REQ_CMD_SENDING;
|
||||
gSTWIStatus->unk_2c = FALSE;
|
||||
gSTWIStatus->sending = 0;
|
||||
if (gSTWIStatus->callbackM != NULL)
|
||||
gSTWIStatus->callbackM(request, gSTWIStatus->error);
|
||||
return TRUE;
|
||||
}
|
||||
else if(!gSTWIStatus->msMode)
|
||||
else if (gSTWIStatus->msMode == AGB_CLK_SLAVE)
|
||||
{
|
||||
// Can't send if clock slave
|
||||
gSTWIStatus->error = ERR_REQ_CMD_CLOCK_SLAVE;
|
||||
if (gSTWIStatus->callbackM != NULL)
|
||||
gSTWIStatus->callbackM(request, gSTWIStatus->error, gSTWIStatus);
|
||||
@@ -569,9 +571,10 @@ static u16 STWI_init(u8 request)
|
||||
}
|
||||
else
|
||||
{
|
||||
gSTWIStatus->unk_2c = TRUE;
|
||||
// Good to go, start sending
|
||||
gSTWIStatus->sending = 1;
|
||||
gSTWIStatus->reqActiveCommand = request;
|
||||
gSTWIStatus->state = 0;
|
||||
gSTWIStatus->state = 0; // master send req
|
||||
gSTWIStatus->reqLength = 0;
|
||||
gSTWIStatus->reqNext = 0;
|
||||
gSTWIStatus->ackLength = 0;
|
||||
@@ -595,7 +598,7 @@ static s32 STWI_start_Command(void)
|
||||
// but the cast here is required to avoid register issue
|
||||
*(u32 *)gSTWIStatus->txPacket->rfuPacket8.data = 0x99660000 | (gSTWIStatus->reqLength << 8) | gSTWIStatus->reqActiveCommand;
|
||||
REG_SIODATA32 = gSTWIStatus->txPacket->rfuPacket32.command;
|
||||
gSTWIStatus->state = 0;
|
||||
gSTWIStatus->state = 0; // master send req
|
||||
gSTWIStatus->reqNext = 1;
|
||||
imeTemp = REG_IME;
|
||||
REG_IME = 0;
|
||||
@@ -608,7 +611,7 @@ static s32 STWI_start_Command(void)
|
||||
|
||||
static s32 STWI_restart_Command(void)
|
||||
{
|
||||
if (gSTWIStatus->recoveryCount <= 1)
|
||||
if (gSTWIStatus->recoveryCount < 2)
|
||||
{
|
||||
++gSTWIStatus->recoveryCount;
|
||||
STWI_start_Command();
|
||||
@@ -618,17 +621,17 @@ static s32 STWI_restart_Command(void)
|
||||
if (gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_DATA_TX_AND_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_UNK35_REQ || gSTWIStatus->reqActiveCommand == ID_RESUME_RETRANSMIT_AND_CHANGE_REQ)
|
||||
{
|
||||
gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT;
|
||||
gSTWIStatus->unk_2c = 0;
|
||||
gSTWIStatus->sending = 0;
|
||||
if (gSTWIStatus->callbackM != NULL)
|
||||
gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error);
|
||||
}
|
||||
else
|
||||
{
|
||||
gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT;
|
||||
gSTWIStatus->unk_2c = 0;
|
||||
gSTWIStatus->sending = 0;
|
||||
if (gSTWIStatus->callbackM != NULL)
|
||||
gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error);
|
||||
gSTWIStatus->state = 4; // TODO: what's 4
|
||||
gSTWIStatus->state = 4; // error
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -636,7 +639,7 @@ static s32 STWI_restart_Command(void)
|
||||
|
||||
static s32 STWI_reset_ClockCounter(void)
|
||||
{
|
||||
gSTWIStatus->state = 5; // TODO: what is 5
|
||||
gSTWIStatus->state = 5; // slave receive req init
|
||||
gSTWIStatus->reqLength = 0;
|
||||
gSTWIStatus->reqNext = 0;
|
||||
REG_SIODATA32 = (1 << 31);
|
||||
|
||||
+67
-67
@@ -82,14 +82,14 @@ u32 gFiller_3003EC0;
|
||||
u16 gLinkHeldKeys;
|
||||
u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH];
|
||||
u32 gLinkStatus;
|
||||
bool8 gUnknown_3003F24;
|
||||
bool8 gLinkAllAcked5FFF;
|
||||
bool8 gUnknown_3003F28;
|
||||
bool8 gUnknown_3003F2C[MAX_LINK_PLAYERS];
|
||||
bool8 gUnknown_3003F30[MAX_LINK_PLAYERS];
|
||||
u16 gUnknown_3003F34;
|
||||
bool8 gLinkCommand2FFEAck[MAX_LINK_PLAYERS];
|
||||
bool8 gLinkCommand5FFFAck[MAX_LINK_PLAYERS];
|
||||
u16 gLinkCmd5FFFparam;
|
||||
u8 gSuppressLinkErrorMessage;
|
||||
bool8 gWirelessCommType;
|
||||
bool8 gSavedLinkPlayerCount;
|
||||
u8 gWirelessCommType;
|
||||
u8 gSavedLinkPlayerCount;
|
||||
u16 gSendCmd[CMD_LENGTH];
|
||||
u8 gSavedMultiplayerId;
|
||||
bool8 gReceivedRemoteLinkPlayers;
|
||||
@@ -123,8 +123,8 @@ EWRAM_DATA struct {
|
||||
u8 lastSendQueueCount;
|
||||
u8 unk_06;
|
||||
} sLinkErrorBuffer = {};
|
||||
EWRAM_DATA u16 gUnknown_202285C = 0;
|
||||
EWRAM_DATA void *gUnknown_2022860 = NULL;
|
||||
static EWRAM_DATA u16 sStartSend5FFFfailures = 0;
|
||||
static EWRAM_DATA void *sLinkErrorBgTilemapBuffer = NULL;
|
||||
|
||||
static void InitLocalLinkPlayer(void);
|
||||
static void sub_800978C(void);
|
||||
@@ -142,13 +142,13 @@ static u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size);
|
||||
static void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2);
|
||||
static void LinkCB_RequestPlayerDataExchange(void);
|
||||
static void Task_PrintTestData(u8 taskId);
|
||||
static void sub_800AB0C(void);
|
||||
static void sub_800AB38(void);
|
||||
static void sub_800ABD4(void);
|
||||
static void sub_800AC00(void);
|
||||
static void LinkCB_BuildCommand5FFF(void);
|
||||
static void LinkCB_WaitAckCommand5FFF(void);
|
||||
static void LinkFunc_Send2FFE_1(void);
|
||||
static void LinkFunc_Send2FFE_2(void);
|
||||
static void CheckErrorStatus(void);
|
||||
static void CB2_PrintErrorMessage(void);
|
||||
static void sub_800B210(void);
|
||||
static void SetWirelessCommType0(void);
|
||||
static void DisableSerial(void);
|
||||
static void EnableSerial(void);
|
||||
static bool8 IsSioMultiMaster(void);
|
||||
@@ -232,16 +232,16 @@ bool8 IsWirelessAdapterConnected(void)
|
||||
if (gQuestLogState == 2 || gQuestLogState == 3)
|
||||
return FALSE;
|
||||
|
||||
sub_800B1F4();
|
||||
SetWirelessCommType1();
|
||||
sub_80F86F4();
|
||||
sub_80FB128(TRUE);
|
||||
if (sub_80FD3A4() == RFU_ID)
|
||||
if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID)
|
||||
{
|
||||
rfu_REQ_stopMode();
|
||||
rfu_waitREQComplete();
|
||||
return TRUE;
|
||||
}
|
||||
sub_800B210();
|
||||
SetWirelessCommType0();
|
||||
CloseLink();
|
||||
RestoreSerialTimer3IntrHandlers();
|
||||
return FALSE;
|
||||
@@ -379,8 +379,8 @@ void OpenLink(void)
|
||||
ResetBlockSend();
|
||||
gUnknown_3000E4C = 0;
|
||||
gUnknown_3003F28 = FALSE;
|
||||
gUnknown_3003F24 = FALSE;
|
||||
gUnknown_3003F34 = 0;
|
||||
gLinkAllAcked5FFF = FALSE;
|
||||
gLinkCmd5FFFparam = 0;
|
||||
CreateTask(Task_TriggerHandshake, 2);
|
||||
}
|
||||
else
|
||||
@@ -391,8 +391,8 @@ void OpenLink(void)
|
||||
for (i = 0; i < MAX_LINK_PLAYERS; i++)
|
||||
{
|
||||
gRemoteLinkPlayersNotReceived[i] = TRUE;
|
||||
gUnknown_3003F30[i] = FALSE;
|
||||
gUnknown_3003F2C[i] = FALSE;
|
||||
gLinkCommand5FFFAck[i] = FALSE;
|
||||
gLinkCommand2FFEAck[i] = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -401,7 +401,7 @@ void CloseLink(void)
|
||||
gReceivedRemoteLinkPlayers = FALSE;
|
||||
if (gWirelessCommType)
|
||||
{
|
||||
sub_80F8DC0();
|
||||
LinkRfu_Shutdown();
|
||||
}
|
||||
gLinkOpen = FALSE;
|
||||
DisableSerial();
|
||||
@@ -468,7 +468,7 @@ void LinkTestProcessKeyInput(void)
|
||||
}
|
||||
if (JOY_NEW(SELECT_BUTTON))
|
||||
{
|
||||
sub_800AAC0();
|
||||
Link_TryStartSend5FFF();
|
||||
}
|
||||
if (gLinkTestDebugValuesEnabled)
|
||||
{
|
||||
@@ -613,7 +613,7 @@ void ProcessRecvCmds(u8 unused)
|
||||
linkPlayer->name[9] = 0;
|
||||
linkPlayer->name[8] = 0;
|
||||
}
|
||||
sub_800B284(linkPlayer);
|
||||
IntlConvertLinkPlayerName(linkPlayer);
|
||||
if (strcmp(block->magic1, sASCIIGameFreakInc) != 0
|
||||
|| strcmp(block->magic2, sASCIIGameFreakInc) != 0)
|
||||
{
|
||||
@@ -632,10 +632,10 @@ void ProcessRecvCmds(u8 unused)
|
||||
}
|
||||
break;
|
||||
case LINKCMD_0x5FFF:
|
||||
gUnknown_3003F30[i] = TRUE;
|
||||
gLinkCommand5FFFAck[i] = TRUE;
|
||||
break;
|
||||
case LINKCMD_0x2FFE:
|
||||
gUnknown_3003F2C[i] = TRUE;
|
||||
gLinkCommand2FFEAck[i] = TRUE;
|
||||
break;
|
||||
case LINKCMD_0xAAAA:
|
||||
sub_800A3CC();
|
||||
@@ -701,7 +701,7 @@ void BuildSendCmd(u16 command)
|
||||
break;
|
||||
case LINKCMD_0x5FFF:
|
||||
gSendCmd[0] = LINKCMD_0x5FFF;
|
||||
gSendCmd[1] = gUnknown_3003F34;
|
||||
gSendCmd[1] = gLinkCmd5FFFparam;
|
||||
break;
|
||||
case LINKCMD_0x5566:
|
||||
gSendCmd[0] = LINKCMD_0x5566;
|
||||
@@ -721,7 +721,7 @@ void sub_8009FE8(void)
|
||||
{
|
||||
if (gWirelessCommType)
|
||||
{
|
||||
sub_80F9828();
|
||||
StartSendingKeysToRfu();
|
||||
}
|
||||
gLinkCallback = sub_800A040;
|
||||
}
|
||||
@@ -1312,54 +1312,54 @@ u8 sub_800AA74(void)
|
||||
return gUnknown_3000E50;
|
||||
}
|
||||
|
||||
void sub_800AA80(u16 a0)
|
||||
void Link_StartSend5FFFwithParam(u16 a0)
|
||||
{
|
||||
if (gWirelessCommType == 1)
|
||||
{
|
||||
task_add_05_task_del_08FA224_when_no_RfuFunc();
|
||||
Rfu_BeginBuildAndSendCommand5F();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gLinkCallback == NULL)
|
||||
{
|
||||
gLinkCallback = sub_800AB0C;
|
||||
gUnknown_3003F24 = FALSE;
|
||||
gUnknown_3003F34 = a0;
|
||||
gLinkCallback = LinkCB_BuildCommand5FFF;
|
||||
gLinkAllAcked5FFF = FALSE;
|
||||
gLinkCmd5FFFparam = a0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_800AAC0(void)
|
||||
void Link_TryStartSend5FFF(void)
|
||||
{
|
||||
if (gWirelessCommType == 1)
|
||||
{
|
||||
task_add_05_task_del_08FA224_when_no_RfuFunc();
|
||||
Rfu_BeginBuildAndSendCommand5F();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gLinkCallback != NULL)
|
||||
{
|
||||
gUnknown_202285C++;
|
||||
sStartSend5FFFfailures++;
|
||||
}
|
||||
else
|
||||
{
|
||||
gLinkCallback = sub_800AB0C;
|
||||
gUnknown_3003F24 = FALSE;
|
||||
gUnknown_3003F34 = 0;
|
||||
gLinkCallback = LinkCB_BuildCommand5FFF;
|
||||
gLinkAllAcked5FFF = FALSE;
|
||||
gLinkCmd5FFFparam = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_800AB0C(void)
|
||||
static void LinkCB_BuildCommand5FFF(void)
|
||||
{
|
||||
if (gLastRecvQueueCount == 0)
|
||||
{
|
||||
BuildSendCmd(LINKCMD_0x5FFF);
|
||||
gLinkCallback = sub_800AB38;
|
||||
gLinkCallback = LinkCB_WaitAckCommand5FFF;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_800AB38(void)
|
||||
static void LinkCB_WaitAckCommand5FFF(void)
|
||||
{
|
||||
int i;
|
||||
unsigned count;
|
||||
@@ -1369,7 +1369,7 @@ static void sub_800AB38(void)
|
||||
count = 0;
|
||||
for (i = 0; i < linkPlayerCount; i++)
|
||||
{
|
||||
if (gUnknown_3003F30[i])
|
||||
if (gLinkCommand5FFFAck[i])
|
||||
{
|
||||
count++;
|
||||
}
|
||||
@@ -1380,36 +1380,36 @@ static void sub_800AB38(void)
|
||||
gLinkVSyncDisabled = TRUE;
|
||||
CloseLink();
|
||||
gLinkCallback = NULL;
|
||||
gUnknown_3003F24 = TRUE;
|
||||
gLinkAllAcked5FFF = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_800AB9C(void)
|
||||
void PrepareSendLinkCmd2FFE_or_RfuCmd6600(void)
|
||||
{
|
||||
if (gWirelessCommType == 1)
|
||||
{
|
||||
sub_80FA42C();
|
||||
LinkRfu_SetRfuFuncToSend6600();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gLinkCallback == NULL)
|
||||
{
|
||||
gLinkCallback = sub_800ABD4;
|
||||
gLinkCallback = LinkFunc_Send2FFE_1;
|
||||
}
|
||||
gUnknown_3003F24 = FALSE;
|
||||
gLinkAllAcked5FFF = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_800ABD4(void)
|
||||
static void LinkFunc_Send2FFE_1(void)
|
||||
{
|
||||
if (gLastRecvQueueCount == 0)
|
||||
{
|
||||
BuildSendCmd(LINKCMD_0x2FFE);
|
||||
gLinkCallback = sub_800AC00;
|
||||
gLinkCallback = LinkFunc_Send2FFE_2;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_800AC00(void)
|
||||
static void LinkFunc_Send2FFE_2(void)
|
||||
{
|
||||
u8 i;
|
||||
u8 linkPlayerCount;
|
||||
@@ -1417,7 +1417,7 @@ static void sub_800AC00(void)
|
||||
linkPlayerCount = GetLinkPlayerCount();
|
||||
for (i = 0; i < linkPlayerCount; i++)
|
||||
{
|
||||
if (!gUnknown_3003F2C[i])
|
||||
if (!gLinkCommand2FFEAck[i])
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -1426,7 +1426,7 @@ static void sub_800AC00(void)
|
||||
{
|
||||
for (i = 0; i < MAX_LINK_PLAYERS; i++)
|
||||
{
|
||||
gUnknown_3003F2C[i] = FALSE;
|
||||
gLinkCommand2FFEAck[i] = FALSE;
|
||||
}
|
||||
gLinkCallback = NULL;
|
||||
}
|
||||
@@ -1448,7 +1448,7 @@ static void CheckErrorStatus(void)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_800ACBC(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06)
|
||||
void SetLinkErrorFromRfu(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06)
|
||||
{
|
||||
sLinkErrorBuffer.status = status;
|
||||
sLinkErrorBuffer.lastSendQueueCount = lastSendQueueCount;
|
||||
@@ -1477,12 +1477,12 @@ void CB2_LinkError(void)
|
||||
{
|
||||
gWirelessCommType = 3;
|
||||
}
|
||||
sub_80F85F8();
|
||||
ResetLinkRfuGFLayer();
|
||||
}
|
||||
SetVBlankCallback(sub_800978C);
|
||||
ResetBgsAndClearDma3BusyFlags(0);
|
||||
ResetBgsAndClearDma3BusyFlags(FALSE);
|
||||
InitBgsFromTemplates(0, sLinkErrorBgTemplates, 2);
|
||||
gUnknown_2022860 = tilemapBuffer = malloc(0x800);
|
||||
sLinkErrorBgTilemapBuffer = tilemapBuffer = malloc(0x800);
|
||||
SetBgTilemapBuffer(1, tilemapBuffer);
|
||||
if (InitWindows(sLinkErrorWindowTemplates))
|
||||
{
|
||||
@@ -1603,12 +1603,12 @@ static void CB2_PrintErrorMessage(void)
|
||||
|
||||
bool8 GetSioMultiSI(void)
|
||||
{
|
||||
return (REG_SIOCNT & 0x04) != 0;
|
||||
return (REG_SIOCNT & SIO_MULTI_SI) != 0;
|
||||
}
|
||||
|
||||
static bool8 IsSioMultiMaster(void)
|
||||
{
|
||||
return (REG_SIOCNT & 0x8) && !(REG_SIOCNT & 0x04);
|
||||
return (REG_SIOCNT & SIO_MULTI_SD) && !(REG_SIOCNT & SIO_MULTI_SI);
|
||||
}
|
||||
|
||||
bool8 IsLinkConnectionEstablished(void)
|
||||
@@ -1626,7 +1626,7 @@ bool8 HasLinkErrorOccurred(void)
|
||||
return gLinkErrorOccurred;
|
||||
}
|
||||
|
||||
void sub_800B0B4(void)
|
||||
void PrepareLocalLinkPlayerBlock(void)
|
||||
{
|
||||
struct LinkPlayerBlock * block;
|
||||
|
||||
@@ -1638,7 +1638,7 @@ void sub_800B0B4(void)
|
||||
memcpy(gBlockSendBuffer, block, sizeof(*block));
|
||||
}
|
||||
|
||||
void sub_800B110(u32 who)
|
||||
void LinkPlayerFromBlock(u32 who)
|
||||
{
|
||||
u8 who_ = who;
|
||||
struct LinkPlayerBlock * block;
|
||||
@@ -1647,7 +1647,7 @@ void sub_800B110(u32 who)
|
||||
block = (struct LinkPlayerBlock *)gBlockRecvBuffer[who_];
|
||||
player = &gLinkPlayers[who_];
|
||||
*player = block->linkPlayer;
|
||||
sub_800B284(player);
|
||||
IntlConvertLinkPlayerName(player);
|
||||
if (strcmp(block->magic1, sASCIIGameFreakInc) != 0 || strcmp(block->magic2, sASCIIGameFreakInc) != 0)
|
||||
{
|
||||
SetMainCallback2(CB2_LinkError);
|
||||
@@ -1670,8 +1670,8 @@ bool8 HandleLinkConnection(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
r4 = sub_80FAE94();
|
||||
r5 = sub_80FAEF0();
|
||||
r4 = LinkRfuMain1();
|
||||
r5 = LinkRfuMain2();
|
||||
if (sub_8058318() == TRUE)
|
||||
{
|
||||
if (r4 == TRUE || IsRfuRecvQueueEmpty() || r5)
|
||||
@@ -1683,7 +1683,7 @@ bool8 HandleLinkConnection(void)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void sub_800B1F4(void)
|
||||
void SetWirelessCommType1(void)
|
||||
{
|
||||
if (gReceivedRemoteLinkPlayers == 0)
|
||||
{
|
||||
@@ -1691,7 +1691,7 @@ void sub_800B1F4(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_800B210(void)
|
||||
static void SetWirelessCommType0(void)
|
||||
{
|
||||
if (gReceivedRemoteLinkPlayers == 0)
|
||||
{
|
||||
@@ -1699,7 +1699,7 @@ static void sub_800B210(void)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_800B22C(void)
|
||||
void SetWirelessCommType0_UnusedCopy(void)
|
||||
{
|
||||
if (gReceivedRemoteLinkPlayers == 0)
|
||||
{
|
||||
@@ -1725,7 +1725,7 @@ bool32 sub_800B270(void)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void sub_800B284(struct LinkPlayer * player)
|
||||
void IntlConvertLinkPlayerName(struct LinkPlayer * player)
|
||||
{
|
||||
player->name[10] = player->name[8];
|
||||
ConvertInternationalString(player->name, player->language);
|
||||
|
||||
-1381
File diff suppressed because it is too large
Load Diff
+793
-765
File diff suppressed because it is too large
Load Diff
+112
-99
@@ -166,7 +166,7 @@ static const struct SpriteTemplate sWirelessStatusIndicatorSpriteTemplate = {
|
||||
SpriteCallbackDummy
|
||||
};
|
||||
|
||||
void sub_80FC478(struct UnkRfuStruct_2_Sub_124 *ptr)
|
||||
void RFU_queue_20_70_reset(struct UnkRfuStruct_2_Sub_124 *queue)
|
||||
{
|
||||
s32 i;
|
||||
s32 j;
|
||||
@@ -175,16 +175,16 @@ void sub_80FC478(struct UnkRfuStruct_2_Sub_124 *ptr)
|
||||
{
|
||||
for (j = 0; j < 70; j++)
|
||||
{
|
||||
ptr->unk_00[i][j] = 0;
|
||||
queue->slots[i][j] = 0;
|
||||
}
|
||||
}
|
||||
ptr->unk_8c1 = 0;
|
||||
ptr->unk_8c0 = 0;
|
||||
ptr->unk_8c2 = 0;
|
||||
ptr->unk_8c3 = 0;
|
||||
queue->send_slot = 0;
|
||||
queue->recv_slot = 0;
|
||||
queue->count = 0;
|
||||
queue->full = 0;
|
||||
}
|
||||
|
||||
void sub_80FC4D4(struct UnkRfuStruct_2_Sub_9e8 *ptr)
|
||||
void RFU_queue_40_14_reset(struct UnkRfuStruct_2_Sub_9e8 *ptr)
|
||||
{
|
||||
s32 i;
|
||||
s32 j;
|
||||
@@ -193,16 +193,16 @@ void sub_80FC4D4(struct UnkRfuStruct_2_Sub_9e8 *ptr)
|
||||
{
|
||||
for (j = 0; j < 14; j++)
|
||||
{
|
||||
ptr->unk_00[i][j] = 0;
|
||||
ptr->slots[i][j] = 0;
|
||||
}
|
||||
}
|
||||
ptr->unk_231 = 0;
|
||||
ptr->unk_230 = 0;
|
||||
ptr->unk_232 = 0;
|
||||
ptr->unk_233 = 0;
|
||||
ptr->send_slot = 0;
|
||||
ptr->recv_slot = 0;
|
||||
ptr->count = 0;
|
||||
ptr->full = 0;
|
||||
}
|
||||
|
||||
static void sub_80FC530(struct UnkRfuStruct_Sub_Unused *ptr)
|
||||
static void RFU_queue_2_256_reset(struct UnkRfuStruct_Sub_Unused *ptr)
|
||||
{
|
||||
s32 i;
|
||||
s32 j;
|
||||
@@ -211,29 +211,29 @@ static void sub_80FC530(struct UnkRfuStruct_Sub_Unused *ptr)
|
||||
{
|
||||
for (j = 0; j < 256; j++)
|
||||
{
|
||||
ptr->unk_00[i][j] = 0;
|
||||
ptr->slots[i][j] = 0;
|
||||
}
|
||||
}
|
||||
ptr->unk_201 = 0;
|
||||
ptr->unk_200 = 0;
|
||||
ptr->unk_202 = 0;
|
||||
ptr->unk_203 = 0;
|
||||
ptr->send_slot = 0;
|
||||
ptr->recv_slot = 0;
|
||||
ptr->count = 0;
|
||||
ptr->full = 0;
|
||||
}
|
||||
|
||||
void sub_80FC588(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2)
|
||||
void RFU_queue_20_70_recv(struct UnkRfuStruct_2_Sub_124 *queue, u8 *data)
|
||||
{
|
||||
s32 i;
|
||||
u16 imeBak;
|
||||
u8 count;
|
||||
|
||||
if (q1->unk_8c2 < 20)
|
||||
if (queue->count < 20)
|
||||
{
|
||||
imeBak = REG_IME;
|
||||
REG_IME = 0;
|
||||
count = 0;
|
||||
for (i = 0; i < 70; i += 14)
|
||||
{
|
||||
if (q2[i] == 0 && q2[i + 1] == 0)
|
||||
if (data[i] == 0 && data[i + 1] == 0)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
@@ -242,36 +242,36 @@ void sub_80FC588(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2)
|
||||
{
|
||||
for (i = 0; i < 70; i++)
|
||||
{
|
||||
q1->unk_00[q1->unk_8c0][i] = q2[i];
|
||||
queue->slots[queue->recv_slot][i] = data[i];
|
||||
}
|
||||
q1->unk_8c0++;
|
||||
q1->unk_8c0 %= 20;
|
||||
q1->unk_8c2++;
|
||||
queue->recv_slot++;
|
||||
queue->recv_slot %= 20;
|
||||
queue->count++;
|
||||
for (i = 0; i < 70; i++)
|
||||
{
|
||||
q2[i] = 0;
|
||||
data[i] = 0;
|
||||
}
|
||||
}
|
||||
REG_IME = imeBak;
|
||||
}
|
||||
else
|
||||
{
|
||||
q1->unk_8c3 = 1;
|
||||
queue->full = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80FC63C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2)
|
||||
void RFU_queue_40_14_recv(struct UnkRfuStruct_2_Sub_9e8 *queue, u8 *data)
|
||||
{
|
||||
s32 i;
|
||||
u16 imeBak;
|
||||
|
||||
if (q1->unk_232 < 40)
|
||||
if (queue->count < 40)
|
||||
{
|
||||
imeBak = REG_IME;
|
||||
REG_IME = 0;
|
||||
for (i = 0; i < 14; i++)
|
||||
{
|
||||
if (q2[i] != 0)
|
||||
if (data[i] != 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -280,57 +280,57 @@ void sub_80FC63C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2)
|
||||
{
|
||||
for (i = 0; i < 14; i++)
|
||||
{
|
||||
q1->unk_00[q1->unk_230][i] = q2[i];
|
||||
queue->slots[queue->recv_slot][i] = data[i];
|
||||
}
|
||||
q1->unk_230++;
|
||||
q1->unk_230 %= 40;
|
||||
q1->unk_232++;
|
||||
queue->recv_slot++;
|
||||
queue->recv_slot %= 40;
|
||||
queue->count++;
|
||||
for (i = 0; i < 14; i++)
|
||||
{
|
||||
q2[i] = 0;
|
||||
data[i] = 0;
|
||||
}
|
||||
}
|
||||
REG_IME = imeBak;
|
||||
}
|
||||
else
|
||||
{
|
||||
q1->unk_233 = 1;
|
||||
queue->full = 1;
|
||||
}
|
||||
}
|
||||
|
||||
bool8 sub_80FC6E8(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2)
|
||||
bool8 RFU_queue_20_70_send(struct UnkRfuStruct_2_Sub_124 *queue, u8 *dest)
|
||||
{
|
||||
u16 imeBak;
|
||||
s32 i;
|
||||
|
||||
imeBak = REG_IME;
|
||||
REG_IME = 0;
|
||||
if (q1->unk_8c0 == q1->unk_8c1 || q1->unk_8c3 != 0)
|
||||
if (queue->recv_slot == queue->send_slot || queue->full)
|
||||
{
|
||||
for (i = 0; i < 70; i++)
|
||||
{
|
||||
q2[i] = 0;
|
||||
dest[i] = 0;
|
||||
}
|
||||
REG_IME = imeBak;
|
||||
return FALSE;
|
||||
}
|
||||
for (i = 0; i < 70; i++)
|
||||
{
|
||||
q2[i] = q1->unk_00[q1->unk_8c1][i];
|
||||
dest[i] = queue->slots[queue->send_slot][i];
|
||||
}
|
||||
q1->unk_8c1++;
|
||||
q1->unk_8c1 %= 20;
|
||||
q1->unk_8c2--;
|
||||
queue->send_slot++;
|
||||
queue->send_slot %= 20;
|
||||
queue->count--;
|
||||
REG_IME = imeBak;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool8 sub_80FC79C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2)
|
||||
bool8 RFU_queue_40_14_send(struct UnkRfuStruct_2_Sub_9e8 *queue, u8 *dest)
|
||||
{
|
||||
s32 i;
|
||||
u16 imeBak;
|
||||
|
||||
if (q1->unk_230 == q1->unk_231 || q1->unk_233 != 0)
|
||||
if (queue->recv_slot == queue->send_slot || queue->full != 0)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
@@ -338,98 +338,98 @@ bool8 sub_80FC79C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2)
|
||||
REG_IME = 0;
|
||||
for (i = 0; i < 14; i++)
|
||||
{
|
||||
q2[i] = q1->unk_00[q1->unk_231][i];
|
||||
dest[i] = queue->slots[queue->send_slot][i];
|
||||
}
|
||||
q1->unk_231++;
|
||||
q1->unk_231 %= 40;
|
||||
q1->unk_232--;
|
||||
queue->send_slot++;
|
||||
queue->send_slot %= 40;
|
||||
queue->count--;
|
||||
REG_IME = imeBak;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void sub_80FC828(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2)
|
||||
void RFU_queue_2_14_recv(struct UnkRfuStruct_2_Sub_c1c *queue, const u8 *data)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
if (q2[1] == 0)
|
||||
if (data[1] == 0)
|
||||
{
|
||||
sub_80FC888(q1, NULL);
|
||||
RFU_queue_2_14_send(queue, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < 14; i++)
|
||||
{
|
||||
q1->unk_00[q1->unk_1c][i] = q2[i];
|
||||
queue->slots[queue->recv_slot][i] = data[i];
|
||||
}
|
||||
q1->unk_1c++;
|
||||
q1->unk_1c %= 2;
|
||||
if (q1->unk_1e < 2)
|
||||
queue->recv_slot++;
|
||||
queue->recv_slot %= 2;
|
||||
if (queue->count < 2)
|
||||
{
|
||||
q1->unk_1e++;
|
||||
queue->count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
q1->unk_1d = q1->unk_1c;
|
||||
queue->send_slot = queue->recv_slot;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool8 sub_80FC888(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2)
|
||||
bool8 RFU_queue_2_14_send(struct UnkRfuStruct_2_Sub_c1c *queue, u8 *dest)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
if (q1->unk_1e == 0)
|
||||
if (queue->count == 0)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
if (q2 != NULL)
|
||||
if (dest != NULL)
|
||||
{
|
||||
for (i = 0; i < 14; i++)
|
||||
{
|
||||
q2[i] = q1->unk_00[q1->unk_1d][i];
|
||||
dest[i] = queue->slots[queue->send_slot][i];
|
||||
}
|
||||
}
|
||||
q1->unk_1d++;
|
||||
q1->unk_1d %= 2;
|
||||
q1->unk_1e--;
|
||||
queue->send_slot++;
|
||||
queue->send_slot %= 2;
|
||||
queue->count--;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void sub_80FC8D8(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2)
|
||||
static void RFU_queue_2_256_recv(struct UnkRfuStruct_Sub_Unused *queue, u8 *data)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
if (q1->unk_202 < 2)
|
||||
if (queue->count < 2)
|
||||
{
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
q1->unk_00[q1->unk_200][i] = q2[i];
|
||||
queue->slots[queue->recv_slot][i] = data[i];
|
||||
}
|
||||
q1->unk_200++;
|
||||
q1->unk_200 %= 2;
|
||||
q1->unk_202++;
|
||||
queue->recv_slot++;
|
||||
queue->recv_slot %= 2;
|
||||
queue->count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
q1->unk_203 = 1;
|
||||
queue->full = 1;
|
||||
}
|
||||
}
|
||||
|
||||
static bool8 sub_80FC944(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2)
|
||||
static bool8 RFU_queue_2_256_send(struct UnkRfuStruct_Sub_Unused *queue, u8 *send)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
if (q1->unk_200 == q1->unk_201 || q1->unk_203)
|
||||
if (queue->recv_slot == queue->send_slot || queue->full)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
q2[i] = q1->unk_00[q1->unk_201][i];
|
||||
send[i] = queue->slots[queue->send_slot][i];
|
||||
}
|
||||
q1->unk_201++;
|
||||
q1->unk_201 %= 2;
|
||||
q1->unk_202--;
|
||||
queue->send_slot++;
|
||||
queue->send_slot %= 2;
|
||||
queue->count--;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -438,7 +438,7 @@ static void sub_80FC9B8(u8 *q1, u8 mode)
|
||||
s32 i;
|
||||
u8 rval;
|
||||
u16 r5 = 0;
|
||||
static u8 _3002018;
|
||||
static u8 counter;
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
@@ -470,11 +470,11 @@ static void sub_80FC9B8(u8 *q1, u8 mode)
|
||||
case 3:
|
||||
for (i = 0; i < 200; i++)
|
||||
{
|
||||
q1[i] = i + 1 + _3002018;
|
||||
r5 += (i + 1 + _3002018) & 0xFF;
|
||||
q1[i] = i + 1 + counter;
|
||||
r5 += (i + 1 + counter) & 0xFF;
|
||||
}
|
||||
*((u16 *)(q1 + i)) = r5;
|
||||
_3002018++;
|
||||
counter++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -603,7 +603,7 @@ static u8 GetConnectedChildStrength(u8 maxFlags)
|
||||
}
|
||||
#endif
|
||||
|
||||
void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 r2, s32 r3)
|
||||
void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 started, s32 child_sprite_genders)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
@@ -613,30 +613,37 @@ void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 r2, s32 r3
|
||||
}
|
||||
for (i = 0; i < RFU_CHILD_MAX; i++)
|
||||
{
|
||||
data->unk_04[i] = r3;
|
||||
r3 >>= 8;
|
||||
data->child_sprite_gender[i] = child_sprite_genders;
|
||||
child_sprite_genders >>= 8;
|
||||
}
|
||||
data->playerGender = gSaveBlock2Ptr->playerGender;
|
||||
data->unk_0a_0 = activity;
|
||||
data->unk_0a_7 = r2;
|
||||
data->unk_00.unk_00_0 = GAME_LANGUAGE;
|
||||
data->unk_00.unk_01_2 = GAME_VERSION;
|
||||
data->unk_00.unk_00_4 = 0;
|
||||
data->unk_00.unk_00_5 = 0;
|
||||
data->activity = activity;
|
||||
data->started = started;
|
||||
data->unk_00.language = GAME_LANGUAGE;
|
||||
data->unk_00.version = GAME_VERSION;
|
||||
data->unk_00.hasNews = FALSE;
|
||||
data->unk_00.hasCard = FALSE;
|
||||
data->unk_00.unk_00_6 = 0;
|
||||
data->unk_00.isChampion = FlagGet(FLAG_SYS_CAN_LINK_WITH_RS);
|
||||
data->unk_00.hasNationalDex = IsNationalPokedexEnabled();
|
||||
data->unk_00.gameClear = FlagGet(FLAG_SYS_GAME_CLEAR);
|
||||
}
|
||||
|
||||
bool8 sub_80FCC3C(struct GFtgtGname *gname, u8 *uname, u8 idx)
|
||||
/*
|
||||
* ==========================================================
|
||||
* Returns 1 if parent, 0 if child or neutral.
|
||||
* If partner serial number is valid, copies gname and uname.
|
||||
* Otherwise, blanks these.
|
||||
* ==========================================================
|
||||
*/
|
||||
bool8 LinkRfu_GetNameIfCompatible(struct GFtgtGname *gname, u8 *uname, u8 idx)
|
||||
{
|
||||
bool8 retVal;
|
||||
|
||||
if (gUnknown_3005E10.unk_06 == 1)
|
||||
if (lman.parent_child == MODE_PARENT)
|
||||
{
|
||||
retVal = TRUE;
|
||||
if (sub_80FA44C(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1))
|
||||
if (RfuSerialNumberIsValid(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1))
|
||||
{
|
||||
memcpy(gname, &gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);
|
||||
memcpy(uname, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH);
|
||||
@@ -650,7 +657,7 @@ bool8 sub_80FCC3C(struct GFtgtGname *gname, u8 *uname, u8 idx)
|
||||
else
|
||||
{
|
||||
retVal = FALSE;
|
||||
if (sub_80FA44C(gRfuLinkStatus->partner[idx].serialNo))
|
||||
if (RfuSerialNumberIsValid(gRfuLinkStatus->partner[idx].serialNo))
|
||||
{
|
||||
memcpy(gname, &gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);
|
||||
memcpy(uname, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH);
|
||||
@@ -664,7 +671,13 @@ bool8 sub_80FCC3C(struct GFtgtGname *gname, u8 *uname, u8 idx)
|
||||
return retVal;
|
||||
}
|
||||
|
||||
bool8 sub_80FCCF4(struct GFtgtGname *gname, u8 *uname, u8 idx)
|
||||
/*
|
||||
* ==========================================================
|
||||
* Specific check for serial number 0x7F7D,
|
||||
* which comes from ???
|
||||
* ==========================================================
|
||||
*/
|
||||
bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *gname, u8 *uname, u8 idx)
|
||||
{
|
||||
bool8 retVal = FALSE;
|
||||
if (gRfuLinkStatus->partner[idx].serialNo == 0x7F7D)
|
||||
@@ -824,7 +837,7 @@ void UpdateWirelessStatusIndicatorSprite(void)
|
||||
gMain.oamBuffer[125].paletteNum = sprite->oam.paletteNum;
|
||||
gMain.oamBuffer[125].tileNum = sprite->data[6] + sprite->anims[sprite->data[2]][sprite->data[4]].frame.imageValue;
|
||||
CpuCopy16(gMain.oamBuffer + 125, (struct OamData *)OAM + 125, sizeof(struct OamData));
|
||||
if (sub_80FB9F4() == 1)
|
||||
if (RfuGetErrorStatus() == 1)
|
||||
{
|
||||
DestroyWirelessStatusIndicatorSprite();
|
||||
}
|
||||
@@ -848,7 +861,7 @@ static void ZeroName(u8 *name)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH; i++)
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)
|
||||
{
|
||||
*name++ = 0;
|
||||
}
|
||||
@@ -858,7 +871,7 @@ static bool32 NameIsEmpty(const u8 *name)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH; i++)
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)
|
||||
{
|
||||
if (*name++ != 0)
|
||||
{
|
||||
|
||||
+1
-1
@@ -763,7 +763,7 @@ void sub_8107CF8(u8 windowId, u16 speciesId, u32 personality, u16 x, u16 y)
|
||||
BlitBitmapToWindow(windowId, GetMonIconPtr(speciesId, personality, 1), x, y, 32, 32);
|
||||
}
|
||||
|
||||
void sub_8107D38(u8 palOffset, u8 palId)
|
||||
void ListMenuLoadStdPalAt(u8 palOffset, u8 palId)
|
||||
{
|
||||
const u16 *palette;
|
||||
|
||||
|
||||
+2
-2
@@ -20,7 +20,7 @@ void ClearMailStruct(struct MailStruct *mail)
|
||||
|
||||
for (i = 0; i < MAIL_WORDS_COUNT; i++)
|
||||
mail->words[i] = 0xFFFF;
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH; i++)
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)
|
||||
mail->playerName[i] = EOS;
|
||||
for (i = 0; i < 4; i++)
|
||||
mail->trainerId[i] = 0;
|
||||
@@ -52,7 +52,7 @@ u8 GiveMailToMon(struct Pokemon *mon, u16 itemId)
|
||||
{
|
||||
for (i = 0; i < MAIL_WORDS_COUNT; i++)
|
||||
gSaveBlock1Ptr->mail[id].words[i] = 0xFFFF;
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH - 1 && gSaveBlock2Ptr->playerName[i] != EOS; i++)
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH && gSaveBlock2Ptr->playerName[i] != EOS; i++)
|
||||
gSaveBlock1Ptr->mail[id].playerName[i] = gSaveBlock2Ptr->playerName[i];
|
||||
for (; i <= 5; i++)
|
||||
gSaveBlock1Ptr->mail[id].playerName[i] = CHAR_SPACE;
|
||||
|
||||
+224
-221
File diff suppressed because it is too large
Load Diff
@@ -1,793 +0,0 @@
|
||||
#include "global.h"
|
||||
#include "constants/species.h"
|
||||
#include "bg.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "palette.h"
|
||||
#include "decompress.h"
|
||||
#include "malloc.h"
|
||||
#include "menu.h"
|
||||
#include "new_menu_helpers.h"
|
||||
#include "pokemon_icon.h"
|
||||
#include "mystery_gift_menu.h"
|
||||
#include "menu_indicators.h"
|
||||
#include "string_util.h"
|
||||
#include "link_rfu.h"
|
||||
#include "mevent.h"
|
||||
#include "battle_anim.h"
|
||||
|
||||
struct UnkStruct_8467FB8
|
||||
{
|
||||
u8 textPal1:4;
|
||||
u8 textPal2:4;
|
||||
u8 textPal3:4;
|
||||
u8 textPal4:4;
|
||||
const u8 * tiles;
|
||||
const u8 * map;
|
||||
const u16 * pal;
|
||||
};
|
||||
|
||||
struct UnkStruct_203F3C8_02DC
|
||||
{
|
||||
u8 unk_00;
|
||||
u8 unk_01[41];
|
||||
u8 unk_42[4];
|
||||
};
|
||||
|
||||
struct UnkStruct_203F3C8
|
||||
{
|
||||
/*0000*/ struct MEWonderCardData unk_0000;
|
||||
/*014c*/ struct MEventBuffer_3430_Sub unk_014C;
|
||||
/*0170*/ const struct UnkStruct_8467FB8 * unk_0170;
|
||||
/*0174*/ u8 unk_0174;
|
||||
/*0175*/ u8 unk_0175;
|
||||
/*0176*/ u16 unk_0176[3];
|
||||
/*017C*/ u8 unk_017C;
|
||||
/*017D*/ u8 unk_017D[7][2];
|
||||
/*018B*/ u8 unk_018B[41];
|
||||
/*01B4*/ u8 unk_01B4[41];
|
||||
/*01DD*/ u8 unk_01DD[7];
|
||||
/*01E4*/ u8 unk_01E4[4][41];
|
||||
/*0288*/ u8 unk_0288[41];
|
||||
/*02B1*/ u8 unk_02B1[41];
|
||||
/*02DC*/ struct UnkStruct_203F3C8_02DC unk_02DC[8];
|
||||
/*045C*/ u8 buffer_045C[0x1000];
|
||||
};
|
||||
|
||||
EWRAM_DATA struct UnkStruct_203F3C8 * gUnknown_203F3C8 = NULL;
|
||||
|
||||
void sub_8145A98(void);
|
||||
void sub_8145D18(u8 whichWindow);
|
||||
void sub_8146060(void);
|
||||
void sub_81461D8(void);
|
||||
|
||||
const u8 gUnknown_8467068[][3] = {
|
||||
{0, 2, 3},
|
||||
{0, 1, 2}
|
||||
};
|
||||
const u8 ALIGNED(4) gUnknown_8467070[3] = {7, 4, 7};
|
||||
const struct WindowTemplate gUnknown_8467074[] = {
|
||||
{0x01, 0x01, 0x01, 0x19, 0x04, 0x0f, 0x029c},
|
||||
{0x01, 0x01, 0x06, 0x1c, 0x08, 0x0f, 0x01bc},
|
||||
{0x01, 0x01, 0x0e, 0x1c, 0x05, 0x0f, 0x0130}
|
||||
};
|
||||
|
||||
const u16 gUnknown_846708C[] = INCBIN_U16("data/graphics/mevent/pal_46708C.gbapal");
|
||||
const u16 gUnknown_84670AC[] = INCBIN_U16("data/graphics/mevent/pal_4670AC.gbapal");
|
||||
const u16 gUnknown_84670CC[] = INCBIN_U16("data/graphics/mevent/pal_4670CC.gbapal");
|
||||
const u16 gUnknown_84670EC[] = INCBIN_U16("data/graphics/mevent/pal_4670EC.gbapal");
|
||||
const u16 gUnknown_846710C[] = INCBIN_U16("data/graphics/mevent/pal_46710C.gbapal");
|
||||
const u16 gUnknown_846712C[] = INCBIN_U16("data/graphics/mevent/pal_46712C.gbapal");
|
||||
const u16 gUnknown_846714C[] = INCBIN_U16("data/graphics/mevent/pal_46714C.gbapal");
|
||||
const u16 gUnknown_846716C[] = INCBIN_U16("data/graphics/mevent/pal_46716C.gbapal");
|
||||
const u8 gUnknown_846718C[] = INCBIN_U8("data/graphics/mevent/gfx_46718C.4bpp.lz");
|
||||
const u8 gUnknown_8467288[] = INCBIN_U8("data/graphics/mevent/tilemap_467288.bin.lz");
|
||||
const u8 gUnknown_846737C[] = INCBIN_U8("data/graphics/mevent/gfx_46737C.4bpp.lz");
|
||||
const u8 gUnknown_8467470[] = INCBIN_U8("data/graphics/mevent/tilemap_467470.bin.lz");
|
||||
const u8 gUnknown_8467558[] = INCBIN_U8("data/graphics/mevent/gfx_467558.4bpp.lz");
|
||||
const u8 gUnknown_846762C[] = INCBIN_U8("data/graphics/mevent/tilemap_46762C.bin.lz");
|
||||
const u8 gUnknown_8467700[] = INCBIN_U8("data/graphics/mevent/gfx_467700.4bpp.lz");
|
||||
const u8 gUnknown_8467934[] = INCBIN_U8("data/graphics/mevent/tilemap_467934.bin.lz");
|
||||
const u8 gUnknown_8467A7C[] = INCBIN_U8("data/graphics/mevent/gfx_467A7C.4bpp.lz");
|
||||
const u8 gUnknown_8467CAC[] = INCBIN_U8("data/graphics/mevent/tilemap_467CAC.bin.lz");
|
||||
const u16 gUnknown_8467DF4[] = INCBIN_U16("data/graphics/mevent/pal_467DF4.gbapal");
|
||||
const u16 gUnknown_8467E14[] = INCBIN_U16("data/graphics/mevent/pal_467E14.gbapal");
|
||||
const u16 gUnknown_8467E34[] = INCBIN_U16("data/graphics/mevent/pal_467E34.gbapal");
|
||||
const u16 gUnknown_8467E54[] = INCBIN_U16("data/graphics/mevent/pal_467E54.gbapal");
|
||||
const u16 gUnknown_8467E74[] = INCBIN_U16("data/graphics/mevent/pal_467E74.gbapal");
|
||||
const u16 gUnknown_8467E94[] = INCBIN_U16("data/graphics/mevent/pal_467E94.gbapal");
|
||||
const u16 gUnknown_8467EB4[] = INCBIN_U16("data/graphics/mevent/pal_467EB4.gbapal");
|
||||
const u16 gUnknown_8467ED4[] = INCBIN_U16("data/graphics/mevent/pal_467ED4.gbapal");
|
||||
const u32 gUnknown_8467EF4[] = INCBIN_U32("data/graphics/mevent/gfx_467EF4.4bpp.lz");
|
||||
|
||||
const struct CompressedSpriteSheet gUnknown_8467F58 = {
|
||||
gUnknown_8467EF4, 0x100, 0x8000
|
||||
};
|
||||
const struct SpritePalette gUnknown_8467F60[] = {
|
||||
{gUnknown_8467DF4, 0x8000},
|
||||
{gUnknown_8467E14, 0x8000},
|
||||
{gUnknown_8467E34, 0x8000},
|
||||
{gUnknown_8467E54, 0x8000},
|
||||
{gUnknown_8467E74, 0x8000},
|
||||
{gUnknown_8467E94, 0x8000},
|
||||
{gUnknown_8467EB4, 0x8000},
|
||||
{gUnknown_8467ED4, 0x8000}
|
||||
};
|
||||
const struct SpriteTemplate gUnknown_8467FA0 = {
|
||||
0x8000, 0x8000, &gOamData_AffineOff_ObjNormal_32x16, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
|
||||
};
|
||||
const struct UnkStruct_8467FB8 gUnknown_8467FB8[8] = {
|
||||
{1, 0, 0, 0, gUnknown_846718C, gUnknown_8467288, gUnknown_846708C},
|
||||
{1, 0, 0, 1, gUnknown_846737C, gUnknown_8467470, gUnknown_84670AC},
|
||||
{1, 0, 0, 2, gUnknown_8467558, gUnknown_846762C, gUnknown_84670CC},
|
||||
{1, 0, 0, 3, gUnknown_8467558, gUnknown_846762C, gUnknown_84670EC},
|
||||
{1, 0, 0, 4, gUnknown_8467558, gUnknown_846762C, gUnknown_846710C},
|
||||
{1, 0, 0, 5, gUnknown_8467558, gUnknown_846762C, gUnknown_846712C},
|
||||
{1, 0, 0, 6, gUnknown_8467700, gUnknown_8467934, gUnknown_846714C},
|
||||
{1, 0, 0, 7, gUnknown_8467A7C, gUnknown_8467CAC, gUnknown_846716C}
|
||||
};
|
||||
|
||||
bool32 InitWonderCardResources(struct MEWonderCardData * r5, struct MEventBuffer_3430_Sub * r6)
|
||||
{
|
||||
if (r5 == NULL || r6 == NULL)
|
||||
return FALSE;
|
||||
gUnknown_203F3C8 = AllocZeroed(sizeof(struct UnkStruct_203F3C8));
|
||||
if (gUnknown_203F3C8 == NULL)
|
||||
return FALSE;
|
||||
gUnknown_203F3C8->unk_0000 = *r5;
|
||||
gUnknown_203F3C8->unk_014C = *r6;
|
||||
if (gUnknown_203F3C8->unk_0000.unk_08_2 >= NELEMS(gUnknown_8467FB8))
|
||||
gUnknown_203F3C8->unk_0000.unk_08_2 = 0;
|
||||
if (gUnknown_203F3C8->unk_0000.unk_08_0 >= NELEMS(gUnknown_8467070))
|
||||
gUnknown_203F3C8->unk_0000.unk_08_0 = 0;
|
||||
if (gUnknown_203F3C8->unk_0000.unk_09 > NELEMS(gUnknown_203F3C8->unk_017D))
|
||||
gUnknown_203F3C8->unk_0000.unk_09 = 0;
|
||||
gUnknown_203F3C8->unk_0170 = &gUnknown_8467FB8[gUnknown_203F3C8->unk_0000.unk_08_2];
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void DestroyWonderCardResources(void)
|
||||
{
|
||||
if (gUnknown_203F3C8 != NULL)
|
||||
{
|
||||
*gUnknown_203F3C8 = (struct UnkStruct_203F3C8){};
|
||||
Free(gUnknown_203F3C8);
|
||||
gUnknown_203F3C8 = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
s32 FadeToWonderCardMenu(void)
|
||||
{
|
||||
if (gUnknown_203F3C8 == NULL)
|
||||
return -1;
|
||||
switch(gUnknown_203F3C8->unk_0174)
|
||||
{
|
||||
case 0:
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
|
||||
break;
|
||||
case 1:
|
||||
if (UpdatePaletteFade())
|
||||
return 0;
|
||||
break;
|
||||
case 2:
|
||||
FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
DecompressAndCopyTileDataToVram(2, gUnknown_203F3C8->unk_0170->tiles, 0, 0x008, 0);
|
||||
gUnknown_203F3C8->unk_0176[0] = AddWindow(&gUnknown_8467074[0]);
|
||||
gUnknown_203F3C8->unk_0176[1] = AddWindow(&gUnknown_8467074[1]);
|
||||
gUnknown_203F3C8->unk_0176[2] = AddWindow(&gUnknown_8467074[2]);
|
||||
break;
|
||||
case 3:
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return 0;
|
||||
gPaletteFade.bufferTransferDisabled = TRUE;
|
||||
LoadPalette(gUnknown_203F3C8->unk_0170->pal, 0x10, 0x20);
|
||||
LZ77UnCompWram(gUnknown_203F3C8->unk_0170->map, gUnknown_203F3C8->buffer_045C);
|
||||
CopyRectToBgTilemapBufferRect(2, gUnknown_203F3C8->buffer_045C, 0, 0, 30, 20, 0, 0, 30, 20, 1, 0x008, 0);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
break;
|
||||
case 4:
|
||||
sub_8145A98();
|
||||
break;
|
||||
case 5:
|
||||
sub_8145D18(0);
|
||||
sub_8145D18(1);
|
||||
sub_8145D18(2);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
break;
|
||||
case 6:
|
||||
LoadMonIconPalettes();
|
||||
break;
|
||||
case 7:
|
||||
ShowBg(1);
|
||||
ShowBg(2);
|
||||
gPaletteFade.bufferTransferDisabled = FALSE;
|
||||
sub_8146060();
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
|
||||
UpdatePaletteFade();
|
||||
break;
|
||||
default:
|
||||
if (UpdatePaletteFade())
|
||||
return 0;
|
||||
gUnknown_203F3C8->unk_0174 = 0;
|
||||
return 1;
|
||||
}
|
||||
++gUnknown_203F3C8->unk_0174;
|
||||
return 0;
|
||||
}
|
||||
|
||||
s32 FadeOutFromWonderCard(bool32 flag)
|
||||
{
|
||||
if (gUnknown_203F3C8 == NULL)
|
||||
return -1;
|
||||
switch (gUnknown_203F3C8->unk_0174)
|
||||
{
|
||||
case 0:
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
|
||||
break;
|
||||
case 1:
|
||||
if (UpdatePaletteFade())
|
||||
return 0;
|
||||
break;
|
||||
case 2:
|
||||
FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
break;
|
||||
case 3:
|
||||
HideBg(1);
|
||||
HideBg(2);
|
||||
RemoveWindow(gUnknown_203F3C8->unk_0176[2]);
|
||||
RemoveWindow(gUnknown_203F3C8->unk_0176[1]);
|
||||
RemoveWindow(gUnknown_203F3C8->unk_0176[0]);
|
||||
break;
|
||||
case 4:
|
||||
sub_81461D8();
|
||||
FreeMonIconPalettes();
|
||||
break;
|
||||
case 5:
|
||||
PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag);
|
||||
break;
|
||||
case 6:
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
|
||||
break;
|
||||
default:
|
||||
if (UpdatePaletteFade())
|
||||
return 0;
|
||||
gUnknown_203F3C8->unk_0174 = 0;
|
||||
return 1;
|
||||
}
|
||||
++gUnknown_203F3C8->unk_0174;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sub_8145A98(void)
|
||||
{
|
||||
u16 i = 0;
|
||||
u16 r6;
|
||||
u16 sp0[3] = {0, 0, 0};
|
||||
|
||||
memcpy(gUnknown_203F3C8->unk_018B, gUnknown_203F3C8->unk_0000.unk_0A, 40);
|
||||
gUnknown_203F3C8->unk_018B[40] = EOS;
|
||||
memcpy(gUnknown_203F3C8->unk_01B4, gUnknown_203F3C8->unk_0000.unk_32, 40);
|
||||
gUnknown_203F3C8->unk_01B4[40] = EOS;
|
||||
if (gUnknown_203F3C8->unk_0000.unk_04 > 999999)
|
||||
gUnknown_203F3C8->unk_0000.unk_04 = 999999;
|
||||
ConvertIntToDecimalStringN(gUnknown_203F3C8->unk_01DD, gUnknown_203F3C8->unk_0000.unk_04, STR_CONV_MODE_LEFT_ALIGN, 6);
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
memcpy(gUnknown_203F3C8->unk_01E4[i], gUnknown_203F3C8->unk_0000.unk_5A[i], 40);
|
||||
gUnknown_203F3C8->unk_01E4[i][40] = EOS;
|
||||
}
|
||||
memcpy(gUnknown_203F3C8->unk_0288, gUnknown_203F3C8->unk_0000.unk_FA, 40);
|
||||
gUnknown_203F3C8->unk_0288[40] = EOS;
|
||||
switch (gUnknown_203F3C8->unk_0000.unk_08_0)
|
||||
{
|
||||
case 0:
|
||||
memcpy(gUnknown_203F3C8->unk_02B1, gUnknown_203F3C8->unk_0000.unk_122, 40);
|
||||
gUnknown_203F3C8->unk_02B1[40] = EOS;
|
||||
break;
|
||||
case 1:
|
||||
gUnknown_203F3C8->unk_02B1[00] = EOS;
|
||||
break;
|
||||
case 2:
|
||||
gUnknown_203F3C8->unk_02B1[00] = EOS;
|
||||
sp0[0] = gUnknown_203F3C8->unk_014C.unk_00 < 999 ? gUnknown_203F3C8->unk_014C.unk_00 : 999;
|
||||
sp0[1] = gUnknown_203F3C8->unk_014C.unk_02 < 999 ? gUnknown_203F3C8->unk_014C.unk_02 : 999;
|
||||
sp0[2] = gUnknown_203F3C8->unk_014C.unk_04 < 999 ? gUnknown_203F3C8->unk_014C.unk_04 : 999;
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
memset(gUnknown_203F3C8->unk_02DC[i].unk_42, EOS, 4);
|
||||
memset(gUnknown_203F3C8->unk_02DC[i].unk_01, EOS, 41);
|
||||
}
|
||||
for (i = 0, r6 = 0; i < 40; i++)
|
||||
{
|
||||
if (gUnknown_203F3C8->unk_0000.unk_122[i] != 0xF7)
|
||||
{
|
||||
gUnknown_203F3C8->unk_02DC[gUnknown_203F3C8->unk_0175].unk_01[r6] = gUnknown_203F3C8->unk_0000.unk_122[i];
|
||||
r6++;
|
||||
}
|
||||
else
|
||||
{
|
||||
u8 r3 = gUnknown_203F3C8->unk_0000.unk_122[i + 1];
|
||||
if (r3 > 2)
|
||||
{
|
||||
i += 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
ConvertIntToDecimalStringN(gUnknown_203F3C8->unk_02DC[gUnknown_203F3C8->unk_0175].unk_42, sp0[r3], STR_CONV_MODE_LEADING_ZEROS, 3);
|
||||
gUnknown_203F3C8->unk_02DC[gUnknown_203F3C8->unk_0175].unk_00 = gUnknown_203F3C8->unk_0000.unk_122[i + 2];
|
||||
gUnknown_203F3C8->unk_0175++;
|
||||
if (gUnknown_203F3C8->unk_0175 > 7)
|
||||
break;
|
||||
r6 = 0;
|
||||
i += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8145D18(u8 whichWindow)
|
||||
{
|
||||
s8 sp0C = 0;
|
||||
s32 windowId = gUnknown_203F3C8->unk_0176[whichWindow];
|
||||
PutWindowTilemap(windowId);
|
||||
FillWindowPixelBuffer(windowId, 0);
|
||||
switch (whichWindow)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
s32 x;
|
||||
AddTextPrinterParameterized3(windowId, 3, 0, 1, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_018B);
|
||||
x = 160 - GetStringWidth(3, gUnknown_203F3C8->unk_01B4, GetFontAttribute(3, 2));
|
||||
if (x < 0)
|
||||
x = 0;
|
||||
AddTextPrinterParameterized3(windowId, 3, x, 17, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_01B4);
|
||||
if (gUnknown_203F3C8->unk_0000.unk_04 != 0)
|
||||
{
|
||||
AddTextPrinterParameterized3(windowId, 2, 166, 17, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_01DD);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
for (; sp0C < 4; sp0C++)
|
||||
{
|
||||
AddTextPrinterParameterized3(windowId, 3, 0, 16 * sp0C + 2, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal2], 0, gUnknown_203F3C8->unk_01E4[sp0C]);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
AddTextPrinterParameterized3(windowId, 3, 0, gUnknown_8467070[gUnknown_203F3C8->unk_0000.unk_08_0], gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_0288);
|
||||
if (gUnknown_203F3C8->unk_0000.unk_08_0 != 2)
|
||||
{
|
||||
AddTextPrinterParameterized3(windowId, 3, 0, 16 + gUnknown_8467070[gUnknown_203F3C8->unk_0000.unk_08_0], gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02B1);
|
||||
}
|
||||
else
|
||||
{
|
||||
s32 x = 0;
|
||||
s32 y = gUnknown_8467070[gUnknown_203F3C8->unk_0000.unk_08_0] + 16;
|
||||
s32 spacing = GetFontAttribute(3, 2);
|
||||
for (; sp0C < gUnknown_203F3C8->unk_0175; sp0C++)
|
||||
{
|
||||
AddTextPrinterParameterized3(windowId, 3, x, y, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02DC[sp0C].unk_01);
|
||||
if (gUnknown_203F3C8->unk_02DC[sp0C].unk_42[0] != EOS)
|
||||
{
|
||||
x += GetStringWidth(3, gUnknown_203F3C8->unk_02DC[sp0C].unk_01, spacing);
|
||||
AddTextPrinterParameterized3(windowId, 2, x, y, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02DC[sp0C].unk_42);
|
||||
x += GetStringWidth(3, gUnknown_203F3C8->unk_02DC[sp0C].unk_42, spacing) + gUnknown_203F3C8->unk_02DC[sp0C].unk_00;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
CopyWindowToVram(windowId, 3);
|
||||
}
|
||||
|
||||
void sub_8146060(void)
|
||||
{
|
||||
u8 r7 = 0;
|
||||
gUnknown_203F3C8->unk_017C = 0xFF;
|
||||
if (gUnknown_203F3C8->unk_014C.unk_06 != SPECIES_NONE)
|
||||
{
|
||||
gUnknown_203F3C8->unk_017C = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(gUnknown_203F3C8->unk_014C.unk_06), SpriteCallbackDummy, 0xDC, 0x14, 0, FALSE);
|
||||
gSprites[gUnknown_203F3C8->unk_017C].oam.priority = 2;
|
||||
}
|
||||
if (gUnknown_203F3C8->unk_0000.unk_09 != 0 && gUnknown_203F3C8->unk_0000.unk_08_0 == 1)
|
||||
{
|
||||
LoadCompressedSpriteSheetUsingHeap(&gUnknown_8467F58);
|
||||
LoadSpritePalette(&gUnknown_8467F60[gUnknown_203F3C8->unk_0170->textPal4]);
|
||||
for (; r7 < gUnknown_203F3C8->unk_0000.unk_09; r7++)
|
||||
{
|
||||
gUnknown_203F3C8->unk_017D[r7][0] = 0xFF;
|
||||
gUnknown_203F3C8->unk_017D[r7][1] = 0xFF;
|
||||
gUnknown_203F3C8->unk_017D[r7][0] = CreateSprite(&gUnknown_8467FA0, 0xd8 - 32 * r7, 0x90, 8);
|
||||
if (gUnknown_203F3C8->unk_014C.unk_08[0][r7] != 0)
|
||||
{
|
||||
gUnknown_203F3C8->unk_017D[r7][1] = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(gUnknown_203F3C8->unk_014C.unk_08[0][r7]), SpriteCallbackDummy, 0xd8 - 32 * r7, 0x88, 0, 0);
|
||||
gSprites[gUnknown_203F3C8->unk_017D[r7][1]].oam.priority = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_81461D8(void)
|
||||
{
|
||||
u8 r6 = 0;
|
||||
if (gUnknown_203F3C8->unk_017C != 0xFF)
|
||||
DestroyMonIcon(&gSprites[gUnknown_203F3C8->unk_017C]);
|
||||
if (gUnknown_203F3C8->unk_0000.unk_09 != 0 && gUnknown_203F3C8->unk_0000.unk_08_0 == 1)
|
||||
{
|
||||
for (; r6 < gUnknown_203F3C8->unk_0000.unk_09; r6++)
|
||||
{
|
||||
if (gUnknown_203F3C8->unk_017D[r6][0] != 0xFF)
|
||||
{
|
||||
DestroySprite(&gSprites[gUnknown_203F3C8->unk_017D[r6][0]]);
|
||||
// This might be a typo. Uncomment the next line, and comment the one that follows, to get the presumed intended behavior.
|
||||
// if (gUnknown_203F3C8->unk_017D[r6][1] != 0xFF)
|
||||
if (gUnknown_203F3C8->unk_017D[r6][0] != 0xFF)
|
||||
{
|
||||
DestroyMonIcon(&gSprites[gUnknown_203F3C8->unk_017D[r6][1]]);
|
||||
}
|
||||
}
|
||||
}
|
||||
FreeSpriteTilesByTag(0x8000);
|
||||
FreeSpritePaletteByTag(0x8000);
|
||||
}
|
||||
}
|
||||
|
||||
struct UnkStruct_203F3CC
|
||||
{
|
||||
/*0000*/ struct MEWonderNewsData unk_0000;
|
||||
/*01bc*/ const struct UnkStruct_8467FB8 * unk_01BC;
|
||||
/*01c0*/ u8 unk_01C0_0:1;
|
||||
u8 unk_01C0_1:7;
|
||||
/*01c1*/ u8 unk_01C1;
|
||||
/*01c2*/ u8 unk_01C2_0:1;
|
||||
u8 unk_01C2_1:7;
|
||||
/*01c3*/ u8 unk_01C3_0:1;
|
||||
u8 unk_01C3_1:7;
|
||||
/*01c4*/ u16 unk_01C4;
|
||||
/*01c6*/ u16 unk_01C6;
|
||||
/*01c8*/ u16 unk_01C8[2];
|
||||
/*01cc*/ u8 filler_01CC[2];
|
||||
/*01ce*/ u8 unk_01CE[41];
|
||||
/*01f7*/ u8 unk_01F7[10][41];
|
||||
/*0394*/ struct ScrollArrowsTemplate unk_0394;
|
||||
/*03a4*/ u8 buffer_03A4[0x1000];
|
||||
};
|
||||
|
||||
EWRAM_DATA struct UnkStruct_203F3CC * gUnknown_203F3CC = NULL;
|
||||
|
||||
void sub_8146980(void);
|
||||
void sub_8146A30(void);
|
||||
void sub_8146B58(void);
|
||||
|
||||
const u8 gUnknown_8468038[][3] = {
|
||||
{0, 2, 3},
|
||||
{0, 1, 2}
|
||||
};
|
||||
const struct WindowTemplate gUnknown_8468040[] = {
|
||||
{0, 1, 0, 28, 3, 15, 0x000},
|
||||
{2, 1, 3, 28, 20, 15, 0x000}
|
||||
};
|
||||
const struct ScrollArrowsTemplate gUnknown_8468050 = {
|
||||
0x02, 0xe8, 0x18, 0x03, 0xe8, 0x98,
|
||||
0x0000, 0x0002, 0x1000, 0x1000, 0x0,
|
||||
};
|
||||
|
||||
const u16 gUnknown_8468060[] = INCBIN_U16("data/graphics/mevent/pal_468060.gbapal");
|
||||
const u16 gUnknown_8468080[] = INCBIN_U16("data/graphics/mevent/pal_468080.gbapal");
|
||||
const u16 gUnknown_84680A0[] = INCBIN_U16("data/graphics/mevent/pal_4680A0.gbapal");
|
||||
const u8 gUnknown_84680C0[] = INCBIN_U8("data/graphics/mevent/gfx_4680C0.4bpp.lz");
|
||||
const u8 gUnknown_8468140[] = INCBIN_U8("data/graphics/mevent/tilemap_468140.bin.lz");
|
||||
const u8 gUnknown_846821C[] = INCBIN_U8("data/graphics/mevent/gfx_46821C.4bpp.lz");
|
||||
const u8 gUnknown_846824C[] = INCBIN_U8("data/graphics/mevent/tilemap_46824C.bin.lz");
|
||||
const u8 gUnknown_846830C[] = INCBIN_U8("data/graphics/mevent/gfx_46830C.4bpp.lz");
|
||||
const u8 gUnknown_846837C[] = INCBIN_U8("data/graphics/mevent/tilemap_46837C.bin.lz");
|
||||
const u8 gUnknown_8468448[] = INCBIN_U8("data/graphics/mevent/gfx_468448.4bpp.lz");
|
||||
const u8 gUnknown_84684D8[] = INCBIN_U8("data/graphics/mevent/tilemap_4684D8.bin.lz");
|
||||
const u8 gUnknown_84685B4[] = INCBIN_U8("data/graphics/mevent/gfx_4685B4.4bpp.lz");
|
||||
const u8 gUnknown_8468644[] = INCBIN_U8("data/graphics/mevent/tilemap_468644.bin.lz");
|
||||
|
||||
const struct UnkStruct_8467FB8 gUnknown_8468720[] = {
|
||||
{1, 0, 0, 0, gUnknown_84680C0, gUnknown_8468140, gUnknown_8468060},
|
||||
{1, 0, 0, 0, gUnknown_846821C, gUnknown_846824C, gUnknown_84670AC},
|
||||
{1, 0, 0, 0, gUnknown_846830C, gUnknown_846837C, gUnknown_84670CC},
|
||||
{1, 0, 0, 0, gUnknown_846830C, gUnknown_846837C, gUnknown_84670EC},
|
||||
{1, 0, 0, 0, gUnknown_846830C, gUnknown_846837C, gUnknown_846710C},
|
||||
{1, 0, 0, 0, gUnknown_846830C, gUnknown_846837C, gUnknown_846712C},
|
||||
{1, 0, 0, 0, gUnknown_8468448, gUnknown_84684D8, gUnknown_8468080},
|
||||
{1, 0, 0, 0, gUnknown_84685B4, gUnknown_8468644, gUnknown_84680A0}
|
||||
};
|
||||
|
||||
bool32 InitWonderNewsResources(const struct MEWonderNewsData * a0)
|
||||
{
|
||||
if (a0 == NULL)
|
||||
return FALSE;
|
||||
gUnknown_203F3CC = AllocZeroed(sizeof(struct UnkStruct_203F3CC));
|
||||
if (gUnknown_203F3CC == NULL)
|
||||
return FALSE;
|
||||
gUnknown_203F3CC->unk_0000 = *a0;
|
||||
if (gUnknown_203F3CC->unk_0000.unk_03 >= NELEMS(gUnknown_8468720))
|
||||
gUnknown_203F3CC->unk_0000.unk_03 = 0;
|
||||
gUnknown_203F3CC->unk_01BC = &gUnknown_8468720[gUnknown_203F3CC->unk_0000.unk_03];
|
||||
gUnknown_203F3CC->unk_01C1 = 0xFF;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void DestroyWonderNewsResources(void)
|
||||
{
|
||||
if (gUnknown_203F3CC != NULL)
|
||||
{
|
||||
*gUnknown_203F3CC = (struct UnkStruct_203F3CC){};
|
||||
Free(gUnknown_203F3CC);
|
||||
gUnknown_203F3CC = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
s32 FadeToWonderNewsMenu(void)
|
||||
{
|
||||
if (gUnknown_203F3CC == NULL)
|
||||
return -1;
|
||||
|
||||
switch (gUnknown_203F3CC->unk_01C0_1)
|
||||
{
|
||||
case 0:
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
|
||||
break;
|
||||
case 1:
|
||||
if (UpdatePaletteFade())
|
||||
return 0;
|
||||
ChangeBgY(0, 0, 0);
|
||||
ChangeBgY(1, 0, 0);
|
||||
ChangeBgY(2, 0, 0);
|
||||
ChangeBgY(3, 0, 0);
|
||||
SetGpuReg(REG_OFFSET_WIN0H, 0xF0);
|
||||
SetGpuReg(REG_OFFSET_WIN0V, 0x1A98);
|
||||
SetGpuReg(REG_OFFSET_WININ, 0x1F);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, 0x1B);
|
||||
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
|
||||
break;
|
||||
case 2:
|
||||
FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 20);
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
CopyBgTilemapBufferToVram(3);
|
||||
DecompressAndCopyTileDataToVram(3, gUnknown_203F3CC->unk_01BC->tiles, 0, 8, 0);
|
||||
gUnknown_203F3CC->unk_01C8[0] = AddWindow(&gUnknown_8468040[0]);
|
||||
gUnknown_203F3CC->unk_01C8[1] = AddWindow(&gUnknown_8468040[1]);
|
||||
break;
|
||||
case 3:
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return 0;
|
||||
gPaletteFade.bufferTransferDisabled = TRUE;
|
||||
LoadPalette(gUnknown_203F3CC->unk_01BC->pal, 0x10, 0x20);
|
||||
LZ77UnCompWram(gUnknown_203F3CC->unk_01BC->map, gUnknown_203F3CC->buffer_03A4);
|
||||
CopyRectToBgTilemapBufferRect(1, gUnknown_203F3CC->buffer_03A4, 0, 0, 30, 3, 0, 0, 30, 3, 1, 8, 0);
|
||||
CopyRectToBgTilemapBufferRect(3, gUnknown_203F3CC->buffer_03A4, 0, 3, 30, 23, 0, 3, 30, 23, 1, 8, 0);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
CopyBgTilemapBufferToVram(3);
|
||||
break;
|
||||
case 4:
|
||||
sub_8146980();
|
||||
break;
|
||||
case 5:
|
||||
sub_8146A30();
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
break;
|
||||
case 6:
|
||||
ShowBg(1);
|
||||
ShowBg(2);
|
||||
ShowBg(3);
|
||||
gPaletteFade.bufferTransferDisabled = FALSE;
|
||||
gUnknown_203F3CC->unk_01C1 = AddScrollIndicatorArrowPair(&gUnknown_203F3CC->unk_0394, &gUnknown_203F3CC->unk_01C6);
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
|
||||
UpdatePaletteFade();
|
||||
break;
|
||||
default:
|
||||
if (UpdatePaletteFade())
|
||||
return 0;
|
||||
gUnknown_203F3CC->unk_01C0_1 = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
++gUnknown_203F3CC->unk_01C0_1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
s32 FadeOutFromWonderNews(bool32 flag)
|
||||
{
|
||||
if (gUnknown_203F3CC == NULL)
|
||||
return -1;
|
||||
switch (gUnknown_203F3CC->unk_01C0_1)
|
||||
{
|
||||
case 0:
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
|
||||
break;
|
||||
case 1:
|
||||
if (UpdatePaletteFade())
|
||||
return 0;
|
||||
ChangeBgY(2, 0, 0);
|
||||
SetGpuReg(REG_OFFSET_WIN0H, 0);
|
||||
SetGpuReg(REG_OFFSET_WIN0V, 0);
|
||||
SetGpuReg(REG_OFFSET_WININ, 0);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, 0);
|
||||
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
|
||||
break;
|
||||
case 2:
|
||||
FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 24);
|
||||
FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 24);
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
CopyBgTilemapBufferToVram(3);
|
||||
break;
|
||||
case 3:
|
||||
HideBg(1);
|
||||
HideBg(2);
|
||||
RemoveWindow(gUnknown_203F3CC->unk_01C8[1]);
|
||||
RemoveWindow(gUnknown_203F3CC->unk_01C8[0]);
|
||||
break;
|
||||
case 4:
|
||||
ChangeBgY(2, 0, 0);
|
||||
ChangeBgY(3, 0, 0);
|
||||
if (gUnknown_203F3CC->unk_01C1 != 0xFF)
|
||||
{
|
||||
RemoveScrollIndicatorArrowPair(gUnknown_203F3CC->unk_01C1);
|
||||
gUnknown_203F3CC->unk_01C1 = 0xFF;
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag);
|
||||
break;
|
||||
case 6:
|
||||
MG_DrawCheckerboardPattern();
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
CopyBgTilemapBufferToVram(3);
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
|
||||
break;
|
||||
default:
|
||||
if (UpdatePaletteFade())
|
||||
return 0;
|
||||
gUnknown_203F3CC->unk_01C0_1 = 0;
|
||||
return 1;
|
||||
}
|
||||
++gUnknown_203F3CC->unk_01C0_1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void MENews_RemoveScrollIndicatorArrowPair(void)
|
||||
{
|
||||
if (!gUnknown_203F3CC->unk_01C0_0 && gUnknown_203F3CC->unk_01C1 != 0xFF)
|
||||
{
|
||||
RemoveScrollIndicatorArrowPair(gUnknown_203F3CC->unk_01C1);
|
||||
gUnknown_203F3CC->unk_01C1 = 0xFF;
|
||||
gUnknown_203F3CC->unk_01C0_0 = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MENews_AddScrollIndicatorArrowPair(void)
|
||||
{
|
||||
if (gUnknown_203F3CC->unk_01C0_0)
|
||||
{
|
||||
gUnknown_203F3CC->unk_01C1 = AddScrollIndicatorArrowPair(&gUnknown_203F3CC->unk_0394, &gUnknown_203F3CC->unk_01C6);
|
||||
gUnknown_203F3CC->unk_01C0_0 = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
u32 MENews_GetInput(u16 input)
|
||||
{
|
||||
if (gUnknown_203F3CC->unk_01C2_0)
|
||||
{
|
||||
sub_8146B58();
|
||||
return 0xFF;
|
||||
}
|
||||
switch (input)
|
||||
{
|
||||
case A_BUTTON:
|
||||
return 0;
|
||||
case B_BUTTON:
|
||||
return 1;
|
||||
case DPAD_UP:
|
||||
if (gUnknown_203F3CC->unk_01C6 == 0)
|
||||
return 0xFF;
|
||||
if (gUnknown_203F3CC->unk_01C0_0)
|
||||
return 0xFF;
|
||||
gUnknown_203F3CC->unk_01C3_0 = FALSE;
|
||||
break;
|
||||
case DPAD_DOWN:
|
||||
if (gUnknown_203F3CC->unk_01C6 == gUnknown_203F3CC->unk_01C4)
|
||||
return 0xFF;
|
||||
if (gUnknown_203F3CC->unk_01C0_0)
|
||||
return 0xFF;
|
||||
gUnknown_203F3CC->unk_01C3_0 = TRUE;
|
||||
break;
|
||||
default:
|
||||
return 0xFF;
|
||||
}
|
||||
gUnknown_203F3CC->unk_01C2_0 = TRUE;
|
||||
gUnknown_203F3CC->unk_01C2_1 = 2;
|
||||
gUnknown_203F3CC->unk_01C3_1 = 0;
|
||||
if (gUnknown_203F3CC->unk_01C3_0 == FALSE)
|
||||
return 2;
|
||||
else
|
||||
return 3;
|
||||
}
|
||||
|
||||
void sub_8146980(void)
|
||||
{
|
||||
u8 i = 0;
|
||||
memcpy(gUnknown_203F3CC->unk_01CE, gUnknown_203F3CC->unk_0000.unk_04, 40);
|
||||
gUnknown_203F3CC->unk_01CE[40] = EOS;
|
||||
for (; i < 10; ++i)
|
||||
{
|
||||
memcpy(gUnknown_203F3CC->unk_01F7[i], gUnknown_203F3CC->unk_0000.unk_2C[i], 40);
|
||||
gUnknown_203F3CC->unk_01F7[i][40] = EOS;
|
||||
if (i > 7 && gUnknown_203F3CC->unk_01F7[i][0] != EOS)
|
||||
++gUnknown_203F3CC->unk_01C4;
|
||||
}
|
||||
gUnknown_203F3CC->unk_0394 = gUnknown_8468050;
|
||||
gUnknown_203F3CC->unk_0394.fullyDownThreshold = gUnknown_203F3CC->unk_01C4;
|
||||
}
|
||||
|
||||
void sub_8146A30(void)
|
||||
{
|
||||
u8 i = 0;
|
||||
s32 x;
|
||||
PutWindowTilemap(gUnknown_203F3CC->unk_01C8[0]);
|
||||
PutWindowTilemap(gUnknown_203F3CC->unk_01C8[1]);
|
||||
FillWindowPixelBuffer(gUnknown_203F3CC->unk_01C8[0], 0);
|
||||
FillWindowPixelBuffer(gUnknown_203F3CC->unk_01C8[1], 0);
|
||||
x = (0xe0 - GetStringWidth(3, gUnknown_203F3CC->unk_01CE, GetFontAttribute(3, 2))) / 2;
|
||||
if (x < 0)
|
||||
x = 0;
|
||||
AddTextPrinterParameterized3(gUnknown_203F3CC->unk_01C8[0], 3, x, 6, gUnknown_8468038[gUnknown_203F3CC->unk_01BC->textPal1], 0, gUnknown_203F3CC->unk_01CE);
|
||||
for (; i < 10; ++i)
|
||||
{
|
||||
AddTextPrinterParameterized3(gUnknown_203F3CC->unk_01C8[1], 3, 0, 16 * i + 2, gUnknown_8468038[gUnknown_203F3CC->unk_01BC->textPal2], 0, gUnknown_203F3CC->unk_01F7[i]);
|
||||
}
|
||||
CopyWindowToVram(gUnknown_203F3CC->unk_01C8[0], 3);
|
||||
CopyWindowToVram(gUnknown_203F3CC->unk_01C8[1], 3);
|
||||
}
|
||||
|
||||
void sub_8146B58(void)
|
||||
{
|
||||
u16 r4 = gUnknown_203F3CC->unk_01C2_1;
|
||||
r4 <<= 8;
|
||||
if (gUnknown_203F3CC->unk_01C3_0)
|
||||
{
|
||||
ChangeBgY(2, r4, 1);
|
||||
ChangeBgY(3, r4, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
ChangeBgY(2, r4, 2);
|
||||
ChangeBgY(3, r4, 2);
|
||||
}
|
||||
gUnknown_203F3CC->unk_01C3_1 += gUnknown_203F3CC->unk_01C2_1;
|
||||
if (gUnknown_203F3CC->unk_01C3_1 > 15)
|
||||
{
|
||||
if (gUnknown_203F3CC->unk_01C3_0)
|
||||
++gUnknown_203F3CC->unk_01C6;
|
||||
else
|
||||
--gUnknown_203F3CC->unk_01C6;
|
||||
gUnknown_203F3CC->unk_01C2_0 = FALSE;
|
||||
gUnknown_203F3CC->unk_01C3_1 = 0;
|
||||
}
|
||||
}
|
||||
+5
-4
@@ -195,15 +195,16 @@ static u32 client_mainseq_4(struct mevent_client * svr)
|
||||
mevent_client_send_word(svr, 0x13, svr->param);
|
||||
break;
|
||||
case 10:
|
||||
sub_8143F68(svr->recvBuffer);
|
||||
OverwriteSavedWonderCardWithReceivedCard(svr->recvBuffer);
|
||||
break;
|
||||
case 9:
|
||||
if (!sub_8143EF4(svr->recvBuffer))
|
||||
if (!MEvent_HaveAlreadyReceivedWonderNews(svr->recvBuffer))
|
||||
{
|
||||
sub_8143DC8(svr->recvBuffer);
|
||||
OverwriteSavedWonderNewsWithReceivedNews(svr->recvBuffer);
|
||||
mevent_client_send_word(svr, 0x13, 0);
|
||||
}
|
||||
else
|
||||
// Other trainer already has news
|
||||
mevent_client_send_word(svr, 0x13, 1);
|
||||
break;
|
||||
case 15:
|
||||
@@ -211,7 +212,7 @@ static u32 client_mainseq_4(struct mevent_client * svr)
|
||||
svr->flag = 0;
|
||||
break;
|
||||
case 16:
|
||||
sub_8144254(svr->recvBuffer);
|
||||
MEvent_ReceiveDistributionMon(svr->recvBuffer);
|
||||
break;
|
||||
case 17:
|
||||
MEventSetRamScript(svr->recvBuffer, 1000);
|
||||
|
||||
+2
-2
@@ -176,7 +176,7 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr)
|
||||
case 9:
|
||||
AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 408);
|
||||
ptr = mevent_first_if_not_null_else_second(cmd->parameter, &svr->sendWord);
|
||||
svr->param = sub_8144434(ptr, svr->mevent_unk1442cc, ptr);
|
||||
svr->param = MEvent_CanPlayerReceiveDistributionMon(ptr, svr->mevent_unk1442cc, ptr);
|
||||
break;
|
||||
case 10:
|
||||
AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 415);
|
||||
@@ -247,7 +247,7 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr)
|
||||
case 26:
|
||||
AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, ABSPATH("mevent_server.c"), 506);
|
||||
memcpy(svr->card, GetSavedWonderCard(), 332);
|
||||
sub_814410C(svr->card);
|
||||
MEvent_WonderCardResetUnk08_6(svr->card);
|
||||
break;
|
||||
case 27:
|
||||
AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, ABSPATH("mevent_server.c"), 512);
|
||||
|
||||
@@ -0,0 +1,459 @@
|
||||
#include "global.h"
|
||||
#include "constants/species.h"
|
||||
#include "bg.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "palette.h"
|
||||
#include "decompress.h"
|
||||
#include "malloc.h"
|
||||
#include "menu.h"
|
||||
#include "new_menu_helpers.h"
|
||||
#include "pokemon_icon.h"
|
||||
#include "mystery_gift_menu.h"
|
||||
#include "menu_indicators.h"
|
||||
#include "string_util.h"
|
||||
#include "link_rfu.h"
|
||||
#include "mevent.h"
|
||||
#include "battle_anim.h"
|
||||
|
||||
struct MEventScreenMgr_02DC
|
||||
{
|
||||
u8 nDigits;
|
||||
u8 nameTxt[41];
|
||||
u8 numberTxt[4];
|
||||
};
|
||||
|
||||
struct MEventScreenMgr
|
||||
{
|
||||
/*0000*/ struct MEWonderCardData wonderCard;
|
||||
/*014c*/ struct MEventBuffer_3430_Sub buff3430Sub;
|
||||
/*0170*/ const struct UnkStruct_8467FB8 * bgSpec;
|
||||
/*0174*/ u8 state;
|
||||
/*0175*/ u8 recordIdx;
|
||||
/*0176*/ u16 windowIds[3];
|
||||
/*017C*/ u8 monIconId;
|
||||
/*017D*/ u8 cardIconAndShadowSprites[7][2];
|
||||
/*018B*/ u8 title[41];
|
||||
/*01B4*/ u8 subtitle[41];
|
||||
/*01DD*/ u8 unk_01DD[7];
|
||||
/*01E4*/ u8 mainMessageLines[4][41];
|
||||
/*0288*/ u8 instructionsLine1[41];
|
||||
/*02B1*/ u8 instructionsLine2[41];
|
||||
/*02DC*/ struct MEventScreenMgr_02DC recordStrings[8];
|
||||
/*045C*/ u8 buffer_045C[0x1000];
|
||||
};
|
||||
|
||||
static EWRAM_DATA struct MEventScreenMgr * sMEventScreenData = NULL;
|
||||
|
||||
static void sub_8145A98(void);
|
||||
static void sub_8145D18(u8 whichWindow);
|
||||
static void sub_8146060(void);
|
||||
static void sub_81461D8(void);
|
||||
|
||||
static const u8 gUnknown_8467068[][3] = {
|
||||
{0, 2, 3},
|
||||
{0, 1, 2}
|
||||
};
|
||||
|
||||
static const u8 ALIGNED(4) sTextYCoords[3] = {7, 4, 7};
|
||||
|
||||
static const struct WindowTemplate sWindowTemplates[] = {
|
||||
{
|
||||
.bg = 1,
|
||||
.tilemapLeft = 1,
|
||||
.tilemapTop = 1,
|
||||
.width = 25,
|
||||
.height = 4,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 0x29c},
|
||||
{
|
||||
.bg = 1,
|
||||
.tilemapLeft = 1,
|
||||
.tilemapTop = 6,
|
||||
.width = 28,
|
||||
.height = 8,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 0x1bc},
|
||||
{
|
||||
.bg = 1,
|
||||
.tilemapLeft = 1,
|
||||
.tilemapTop = 14,
|
||||
.width = 28,
|
||||
.height = 5,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 0x130}
|
||||
};
|
||||
|
||||
static const u16 gCard0Pal[] = INCBIN_U16("data/graphics/mevent/pal_46708C.gbapal");
|
||||
const u16 gCard1Pal[] = INCBIN_U16("data/graphics/mevent/pal_4670AC.gbapal");
|
||||
const u16 gCard2Pal[] = INCBIN_U16("data/graphics/mevent/pal_4670CC.gbapal");
|
||||
const u16 gCard3Pal[] = INCBIN_U16("data/graphics/mevent/pal_4670EC.gbapal");
|
||||
const u16 gCard4Pal[] = INCBIN_U16("data/graphics/mevent/pal_46710C.gbapal");
|
||||
const u16 gCard5Pal[] = INCBIN_U16("data/graphics/mevent/pal_46712C.gbapal");
|
||||
static const u16 gCard6Pal[] = INCBIN_U16("data/graphics/mevent/pal_46714C.gbapal");
|
||||
static const u16 gCard7Pal[] = INCBIN_U16("data/graphics/mevent/pal_46716C.gbapal");
|
||||
static const u8 sCard0Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_46718C.4bpp.lz");
|
||||
static const u8 sCard0Map[] = INCBIN_U8("data/graphics/mevent/tilemap_467288.bin.lz");
|
||||
static const u8 sCard1Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_46737C.4bpp.lz");
|
||||
static const u8 sCard1Map[] = INCBIN_U8("data/graphics/mevent/tilemap_467470.bin.lz");
|
||||
static const u8 sCard2Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_467558.4bpp.lz");
|
||||
static const u8 sCard2Map[] = INCBIN_U8("data/graphics/mevent/tilemap_46762C.bin.lz");
|
||||
static const u8 sCard6Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_467700.4bpp.lz");
|
||||
static const u8 sCard6Map[] = INCBIN_U8("data/graphics/mevent/tilemap_467934.bin.lz");
|
||||
static const u8 sCard7Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_467A7C.4bpp.lz");
|
||||
static const u8 sCard7Map[] = INCBIN_U8("data/graphics/mevent/tilemap_467CAC.bin.lz");
|
||||
static const u16 gUnknown_8467DF4[] = INCBIN_U16("data/graphics/mevent/pal_467DF4.gbapal");
|
||||
static const u16 gUnknown_8467E14[] = INCBIN_U16("data/graphics/mevent/pal_467E14.gbapal");
|
||||
static const u16 gUnknown_8467E34[] = INCBIN_U16("data/graphics/mevent/pal_467E34.gbapal");
|
||||
static const u16 gUnknown_8467E54[] = INCBIN_U16("data/graphics/mevent/pal_467E54.gbapal");
|
||||
static const u16 gUnknown_8467E74[] = INCBIN_U16("data/graphics/mevent/pal_467E74.gbapal");
|
||||
static const u16 gUnknown_8467E94[] = INCBIN_U16("data/graphics/mevent/pal_467E94.gbapal");
|
||||
static const u16 gUnknown_8467EB4[] = INCBIN_U16("data/graphics/mevent/pal_467EB4.gbapal");
|
||||
static const u16 gUnknown_8467ED4[] = INCBIN_U16("data/graphics/mevent/pal_467ED4.gbapal");
|
||||
static const u32 gUnknown_8467EF4[] = INCBIN_U32("data/graphics/mevent/gfx_467EF4.4bpp.lz");
|
||||
|
||||
static const struct CompressedSpriteSheet sShadowSpriteSheet = {
|
||||
gUnknown_8467EF4, 0x100, 0x8000
|
||||
};
|
||||
|
||||
static const struct SpritePalette sShadowSpritePalettes[] = {
|
||||
{gUnknown_8467DF4, 0x8000},
|
||||
{gUnknown_8467E14, 0x8000},
|
||||
{gUnknown_8467E34, 0x8000},
|
||||
{gUnknown_8467E54, 0x8000},
|
||||
{gUnknown_8467E74, 0x8000},
|
||||
{gUnknown_8467E94, 0x8000},
|
||||
{gUnknown_8467EB4, 0x8000},
|
||||
{gUnknown_8467ED4, 0x8000}
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sShadowSpriteTemplate = {
|
||||
0x8000, 0x8000, &gOamData_AffineOff_ObjNormal_32x16, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
|
||||
};
|
||||
|
||||
static const struct UnkStruct_8467FB8 sCardGfxPtrs[8] = {
|
||||
{1, 0, 0, 0, sCard0Gfx, sCard0Map, gCard0Pal},
|
||||
{1, 0, 0, 1, sCard1Gfx, sCard1Map, gCard1Pal},
|
||||
{1, 0, 0, 2, sCard2Gfx, sCard2Map, gCard2Pal},
|
||||
{1, 0, 0, 3, sCard2Gfx, sCard2Map, gCard3Pal},
|
||||
{1, 0, 0, 4, sCard2Gfx, sCard2Map, gCard4Pal},
|
||||
{1, 0, 0, 5, sCard2Gfx, sCard2Map, gCard5Pal},
|
||||
{1, 0, 0, 6, sCard6Gfx, sCard6Map, gCard6Pal},
|
||||
{1, 0, 0, 7, sCard7Gfx, sCard7Map, gCard7Pal}
|
||||
};
|
||||
|
||||
bool32 InitWonderCardResources(struct MEWonderCardData * card, struct MEventBuffer_3430_Sub * b3430sub)
|
||||
{
|
||||
if (card == NULL || b3430sub == NULL)
|
||||
return FALSE;
|
||||
sMEventScreenData = AllocZeroed(sizeof(struct MEventScreenMgr));
|
||||
if (sMEventScreenData == NULL)
|
||||
return FALSE;
|
||||
sMEventScreenData->wonderCard = *card;
|
||||
sMEventScreenData->buff3430Sub = *b3430sub;
|
||||
if (sMEventScreenData->wonderCard.unk_08_2 >= NELEMS(sCardGfxPtrs))
|
||||
sMEventScreenData->wonderCard.unk_08_2 = 0;
|
||||
if (sMEventScreenData->wonderCard.unk_08_0 >= NELEMS(sTextYCoords))
|
||||
sMEventScreenData->wonderCard.unk_08_0 = 0;
|
||||
if (sMEventScreenData->wonderCard.recvMonCapacity > NELEMS(sMEventScreenData->cardIconAndShadowSprites))
|
||||
sMEventScreenData->wonderCard.recvMonCapacity = 0;
|
||||
sMEventScreenData->bgSpec = &sCardGfxPtrs[sMEventScreenData->wonderCard.unk_08_2];
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void DestroyWonderCardResources(void)
|
||||
{
|
||||
if (sMEventScreenData != NULL)
|
||||
{
|
||||
*sMEventScreenData = (struct MEventScreenMgr){};
|
||||
Free(sMEventScreenData);
|
||||
sMEventScreenData = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
s32 FadeToWonderCardMenu(void)
|
||||
{
|
||||
if (sMEventScreenData == NULL)
|
||||
return -1;
|
||||
switch(sMEventScreenData->state)
|
||||
{
|
||||
case 0:
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
|
||||
break;
|
||||
case 1:
|
||||
if (UpdatePaletteFade())
|
||||
return 0;
|
||||
break;
|
||||
case 2:
|
||||
FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
DecompressAndCopyTileDataToVram(2, sMEventScreenData->bgSpec->tiles, 0, 0x008, 0);
|
||||
sMEventScreenData->windowIds[0] = AddWindow(&sWindowTemplates[0]);
|
||||
sMEventScreenData->windowIds[1] = AddWindow(&sWindowTemplates[1]);
|
||||
sMEventScreenData->windowIds[2] = AddWindow(&sWindowTemplates[2]);
|
||||
break;
|
||||
case 3:
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return 0;
|
||||
gPaletteFade.bufferTransferDisabled = TRUE;
|
||||
LoadPalette(sMEventScreenData->bgSpec->pal, 0x10, 0x20);
|
||||
LZ77UnCompWram(sMEventScreenData->bgSpec->map, sMEventScreenData->buffer_045C);
|
||||
CopyRectToBgTilemapBufferRect(2, sMEventScreenData->buffer_045C, 0, 0, 30, 20, 0, 0, 30, 20, 1, 0x008, 0);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
break;
|
||||
case 4:
|
||||
sub_8145A98();
|
||||
break;
|
||||
case 5:
|
||||
sub_8145D18(0);
|
||||
sub_8145D18(1);
|
||||
sub_8145D18(2);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
break;
|
||||
case 6:
|
||||
LoadMonIconPalettes();
|
||||
break;
|
||||
case 7:
|
||||
ShowBg(1);
|
||||
ShowBg(2);
|
||||
gPaletteFade.bufferTransferDisabled = FALSE;
|
||||
sub_8146060();
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
|
||||
UpdatePaletteFade();
|
||||
break;
|
||||
default:
|
||||
if (UpdatePaletteFade())
|
||||
return 0;
|
||||
sMEventScreenData->state = 0;
|
||||
return 1;
|
||||
}
|
||||
++sMEventScreenData->state;
|
||||
return 0;
|
||||
}
|
||||
|
||||
s32 FadeOutFromWonderCard(bool32 flag)
|
||||
{
|
||||
if (sMEventScreenData == NULL)
|
||||
return -1;
|
||||
switch (sMEventScreenData->state)
|
||||
{
|
||||
case 0:
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
|
||||
break;
|
||||
case 1:
|
||||
if (UpdatePaletteFade())
|
||||
return 0;
|
||||
break;
|
||||
case 2:
|
||||
FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
break;
|
||||
case 3:
|
||||
HideBg(1);
|
||||
HideBg(2);
|
||||
RemoveWindow(sMEventScreenData->windowIds[2]);
|
||||
RemoveWindow(sMEventScreenData->windowIds[1]);
|
||||
RemoveWindow(sMEventScreenData->windowIds[0]);
|
||||
break;
|
||||
case 4:
|
||||
sub_81461D8();
|
||||
FreeMonIconPalettes();
|
||||
break;
|
||||
case 5:
|
||||
PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag);
|
||||
break;
|
||||
case 6:
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
|
||||
break;
|
||||
default:
|
||||
if (UpdatePaletteFade())
|
||||
return 0;
|
||||
sMEventScreenData->state = 0;
|
||||
return 1;
|
||||
}
|
||||
++sMEventScreenData->state;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void sub_8145A98(void)
|
||||
{
|
||||
u16 i = 0;
|
||||
u16 r6;
|
||||
u16 sp0[3] = {0, 0, 0};
|
||||
|
||||
memcpy(sMEventScreenData->title, sMEventScreenData->wonderCard.unk_0A, 40);
|
||||
sMEventScreenData->title[40] = EOS;
|
||||
memcpy(sMEventScreenData->subtitle, sMEventScreenData->wonderCard.unk_32, 40);
|
||||
sMEventScreenData->subtitle[40] = EOS;
|
||||
if (sMEventScreenData->wonderCard.unk_04 > 999999)
|
||||
sMEventScreenData->wonderCard.unk_04 = 999999;
|
||||
ConvertIntToDecimalStringN(sMEventScreenData->unk_01DD, sMEventScreenData->wonderCard.unk_04, STR_CONV_MODE_LEFT_ALIGN, 6);
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
memcpy(sMEventScreenData->mainMessageLines[i], sMEventScreenData->wonderCard.unk_5A[i], 40);
|
||||
sMEventScreenData->mainMessageLines[i][40] = EOS;
|
||||
}
|
||||
memcpy(sMEventScreenData->instructionsLine1, sMEventScreenData->wonderCard.unk_FA, 40);
|
||||
sMEventScreenData->instructionsLine1[40] = EOS;
|
||||
switch (sMEventScreenData->wonderCard.unk_08_0)
|
||||
{
|
||||
case 0:
|
||||
memcpy(sMEventScreenData->instructionsLine2, sMEventScreenData->wonderCard.unk_122, 40);
|
||||
sMEventScreenData->instructionsLine2[40] = EOS;
|
||||
break;
|
||||
case 1:
|
||||
sMEventScreenData->instructionsLine2[00] = EOS;
|
||||
break;
|
||||
case 2:
|
||||
sMEventScreenData->instructionsLine2[00] = EOS;
|
||||
sp0[0] = sMEventScreenData->buff3430Sub.linkWins < 999 ? sMEventScreenData->buff3430Sub.linkWins : 999;
|
||||
sp0[1] = sMEventScreenData->buff3430Sub.linkLosses < 999 ? sMEventScreenData->buff3430Sub.linkLosses : 999;
|
||||
sp0[2] = sMEventScreenData->buff3430Sub.linkTrades < 999 ? sMEventScreenData->buff3430Sub.linkTrades : 999;
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
memset(sMEventScreenData->recordStrings[i].numberTxt, EOS, 4);
|
||||
memset(sMEventScreenData->recordStrings[i].nameTxt, EOS, 41);
|
||||
}
|
||||
for (i = 0, r6 = 0; i < 40; i++)
|
||||
{
|
||||
if (sMEventScreenData->wonderCard.unk_122[i] != CHAR_SPECIAL_F7)
|
||||
{
|
||||
sMEventScreenData->recordStrings[sMEventScreenData->recordIdx].nameTxt[r6] = sMEventScreenData->wonderCard.unk_122[i];
|
||||
r6++;
|
||||
}
|
||||
else
|
||||
{
|
||||
u8 r3 = sMEventScreenData->wonderCard.unk_122[i + 1];
|
||||
if (r3 > 2)
|
||||
{
|
||||
i += 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
ConvertIntToDecimalStringN(sMEventScreenData->recordStrings[sMEventScreenData->recordIdx].numberTxt, sp0[r3], STR_CONV_MODE_LEADING_ZEROS, 3);
|
||||
sMEventScreenData->recordStrings[sMEventScreenData->recordIdx].nDigits = sMEventScreenData->wonderCard.unk_122[i + 2];
|
||||
sMEventScreenData->recordIdx++;
|
||||
if (sMEventScreenData->recordIdx > 7)
|
||||
break;
|
||||
r6 = 0;
|
||||
i += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_8145D18(u8 whichWindow)
|
||||
{
|
||||
s8 sp0C = 0;
|
||||
s32 windowId = sMEventScreenData->windowIds[whichWindow];
|
||||
PutWindowTilemap(windowId);
|
||||
FillWindowPixelBuffer(windowId, 0);
|
||||
switch (whichWindow)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
s32 x;
|
||||
AddTextPrinterParameterized3(windowId, 3, 0, 1, gUnknown_8467068[sMEventScreenData->bgSpec->textPal1], 0, sMEventScreenData->title);
|
||||
x = 160 - GetStringWidth(3, sMEventScreenData->subtitle, GetFontAttribute(3, 2));
|
||||
if (x < 0)
|
||||
x = 0;
|
||||
AddTextPrinterParameterized3(windowId, 3, x, 17, gUnknown_8467068[sMEventScreenData->bgSpec->textPal1], 0, sMEventScreenData->subtitle);
|
||||
if (sMEventScreenData->wonderCard.unk_04 != 0)
|
||||
{
|
||||
AddTextPrinterParameterized3(windowId, 2, 166, 17, gUnknown_8467068[sMEventScreenData->bgSpec->textPal1], 0, sMEventScreenData->unk_01DD);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
for (; sp0C < 4; sp0C++)
|
||||
{
|
||||
AddTextPrinterParameterized3(windowId, 3, 0, 16 * sp0C + 2, gUnknown_8467068[sMEventScreenData->bgSpec->textPal2], 0, sMEventScreenData->mainMessageLines[sp0C]);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
AddTextPrinterParameterized3(windowId, 3, 0, sTextYCoords[sMEventScreenData->wonderCard.unk_08_0], gUnknown_8467068[sMEventScreenData->bgSpec->textPal3], 0, sMEventScreenData->instructionsLine1);
|
||||
if (sMEventScreenData->wonderCard.unk_08_0 != 2)
|
||||
{
|
||||
AddTextPrinterParameterized3(windowId, 3, 0, 16 + sTextYCoords[sMEventScreenData->wonderCard.unk_08_0], gUnknown_8467068[sMEventScreenData->bgSpec->textPal3], 0, sMEventScreenData->instructionsLine2);
|
||||
}
|
||||
else
|
||||
{
|
||||
s32 x = 0;
|
||||
s32 y = sTextYCoords[sMEventScreenData->wonderCard.unk_08_0] + 16;
|
||||
s32 spacing = GetFontAttribute(3, 2);
|
||||
for (; sp0C < sMEventScreenData->recordIdx; sp0C++)
|
||||
{
|
||||
AddTextPrinterParameterized3(windowId, 3, x, y, gUnknown_8467068[sMEventScreenData->bgSpec->textPal3], 0, sMEventScreenData->recordStrings[sp0C].nameTxt);
|
||||
if (sMEventScreenData->recordStrings[sp0C].numberTxt[0] != EOS)
|
||||
{
|
||||
x += GetStringWidth(3, sMEventScreenData->recordStrings[sp0C].nameTxt, spacing);
|
||||
AddTextPrinterParameterized3(windowId, 2, x, y, gUnknown_8467068[sMEventScreenData->bgSpec->textPal3], 0, sMEventScreenData->recordStrings[sp0C].numberTxt);
|
||||
x += GetStringWidth(3, sMEventScreenData->recordStrings[sp0C].numberTxt, spacing) + sMEventScreenData->recordStrings[sp0C].nDigits;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
CopyWindowToVram(windowId, 3);
|
||||
}
|
||||
|
||||
static void sub_8146060(void)
|
||||
{
|
||||
u8 r7 = 0;
|
||||
sMEventScreenData->monIconId = 0xFF;
|
||||
if (sMEventScreenData->buff3430Sub.unk_06 != SPECIES_NONE)
|
||||
{
|
||||
sMEventScreenData->monIconId = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(sMEventScreenData->buff3430Sub.unk_06), SpriteCallbackDummy, 0xDC, 0x14, 0, FALSE);
|
||||
gSprites[sMEventScreenData->monIconId].oam.priority = 2;
|
||||
}
|
||||
if (sMEventScreenData->wonderCard.recvMonCapacity != 0 && sMEventScreenData->wonderCard.unk_08_0 == 1)
|
||||
{
|
||||
LoadCompressedSpriteSheetUsingHeap(&sShadowSpriteSheet);
|
||||
LoadSpritePalette(&sShadowSpritePalettes[sMEventScreenData->bgSpec->index]);
|
||||
for (; r7 < sMEventScreenData->wonderCard.recvMonCapacity; r7++)
|
||||
{
|
||||
sMEventScreenData->cardIconAndShadowSprites[r7][0] = 0xFF;
|
||||
sMEventScreenData->cardIconAndShadowSprites[r7][1] = 0xFF;
|
||||
sMEventScreenData->cardIconAndShadowSprites[r7][0] = CreateSprite(&sShadowSpriteTemplate, 0xd8 - 32 * r7, 0x90, 8);
|
||||
if (sMEventScreenData->buff3430Sub.distributedMons[0][r7] != 0)
|
||||
{
|
||||
sMEventScreenData->cardIconAndShadowSprites[r7][1] = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(sMEventScreenData->buff3430Sub.distributedMons[0][r7]), SpriteCallbackDummy, 0xd8 - 32 * r7, 0x88, 0, 0);
|
||||
gSprites[sMEventScreenData->cardIconAndShadowSprites[r7][1]].oam.priority = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_81461D8(void)
|
||||
{
|
||||
u8 r6 = 0;
|
||||
if (sMEventScreenData->monIconId != 0xFF)
|
||||
DestroyMonIcon(&gSprites[sMEventScreenData->monIconId]);
|
||||
if (sMEventScreenData->wonderCard.recvMonCapacity != 0 && sMEventScreenData->wonderCard.unk_08_0 == 1)
|
||||
{
|
||||
for (; r6 < sMEventScreenData->wonderCard.recvMonCapacity; r6++)
|
||||
{
|
||||
if (sMEventScreenData->cardIconAndShadowSprites[r6][0] != 0xFF)
|
||||
{
|
||||
DestroySprite(&gSprites[sMEventScreenData->cardIconAndShadowSprites[r6][0]]);
|
||||
// This might be a typo. Uncomment the next line, and comment the one that follows, to get the presumed intended behavior.
|
||||
// if (sMEventScreenData->cardIconAndShadowSprites[r6][1] != 0xFF)
|
||||
if (sMEventScreenData->cardIconAndShadowSprites[r6][0] != 0xFF)
|
||||
{
|
||||
DestroyMonIcon(&gSprites[sMEventScreenData->cardIconAndShadowSprites[r6][1]]);
|
||||
}
|
||||
}
|
||||
}
|
||||
FreeSpriteTilesByTag(0x8000);
|
||||
FreeSpritePaletteByTag(0x8000);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,357 @@
|
||||
#include "global.h"
|
||||
#include "gflib.h"
|
||||
#include "menu_indicators.h"
|
||||
#include "new_menu_helpers.h"
|
||||
#include "mevent.h"
|
||||
#include "mystery_gift_menu.h"
|
||||
#include "menu.h"
|
||||
#include "link_rfu.h"
|
||||
|
||||
struct UnkStruct_203F3CC
|
||||
{
|
||||
/*0000*/ struct MEWonderNewsData wonderNews;
|
||||
/*01bc*/ const struct UnkStruct_8467FB8 * bgSpec;
|
||||
/*01c0*/ u8 verticalScrollDisabled:1;
|
||||
u8 state:7;
|
||||
/*01c1*/ u8 menuIndicatorsId;
|
||||
/*01c2*/ u8 unk_01C2_0:1;
|
||||
u8 unk_01C2_1:7;
|
||||
/*01c3*/ u8 scrollDirection:1;
|
||||
u8 unk_01C3_1:7;
|
||||
/*01c4*/ u16 numMails;
|
||||
/*01c6*/ u16 scrollOffset;
|
||||
/*01c8*/ u16 windowIds[2];
|
||||
/*01cc*/ u8 filler_01CC[2];
|
||||
/*01ce*/ u8 title[41];
|
||||
/*01f7*/ u8 messages[10][41];
|
||||
/*0394*/ struct ScrollArrowsTemplate scrollArrowsTemplate;
|
||||
/*03a4*/ u8 buffer_03A4[0x1000];
|
||||
};
|
||||
|
||||
static EWRAM_DATA struct UnkStruct_203F3CC * sWork = NULL;
|
||||
|
||||
static void sub_8146980(void);
|
||||
static void sub_8146A30(void);
|
||||
static void sub_8146B58(void);
|
||||
|
||||
static const u8 sTextPals[][3] = {
|
||||
{0, 2, 3},
|
||||
{0, 1, 2}
|
||||
};
|
||||
static const struct WindowTemplate gUnknown_8468040[] = {
|
||||
{0, 1, 0, 28, 3, 15, 0x000},
|
||||
{2, 1, 3, 28, 20, 15, 0x000}
|
||||
};
|
||||
static const struct ScrollArrowsTemplate sScrollArrowsTemplate = {
|
||||
0x02, 0xe8, 0x18, 0x03, 0xe8, 0x98,
|
||||
0x0000, 0x0002, 0x1000, 0x1000, 0x0,
|
||||
};
|
||||
|
||||
static const u16 sNews1Pal[] = INCBIN_U16("data/graphics/mevent/pal_468060.gbapal");
|
||||
static const u16 sNews6Pal[] = INCBIN_U16("data/graphics/mevent/pal_468080.gbapal");
|
||||
static const u16 sNews7Pal[] = INCBIN_U16("data/graphics/mevent/pal_4680A0.gbapal");
|
||||
static const u8 sNews0Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_4680C0.4bpp.lz");
|
||||
static const u8 sNews0Map[] = INCBIN_U8("data/graphics/mevent/tilemap_468140.bin.lz");
|
||||
static const u8 sNews1Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_46821C.4bpp.lz");
|
||||
static const u8 sNews1Map[] = INCBIN_U8("data/graphics/mevent/tilemap_46824C.bin.lz");
|
||||
static const u8 sNews2Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_46830C.4bpp.lz");
|
||||
static const u8 sNews2Map[] = INCBIN_U8("data/graphics/mevent/tilemap_46837C.bin.lz");
|
||||
static const u8 sNews6Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_468448.4bpp.lz");
|
||||
static const u8 sNews6Map[] = INCBIN_U8("data/graphics/mevent/tilemap_4684D8.bin.lz");
|
||||
static const u8 sNews7Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_4685B4.4bpp.lz");
|
||||
static const u8 sNews7Map[] = INCBIN_U8("data/graphics/mevent/tilemap_468644.bin.lz");
|
||||
|
||||
static const struct UnkStruct_8467FB8 sBgSpecs[] = {
|
||||
{1, 0, 0, 0, sNews0Gfx, sNews0Map, sNews1Pal},
|
||||
{1, 0, 0, 0, sNews1Gfx, sNews1Map, gCard1Pal},
|
||||
{1, 0, 0, 0, sNews2Gfx, sNews2Map, gCard2Pal},
|
||||
{1, 0, 0, 0, sNews2Gfx, sNews2Map, gCard3Pal},
|
||||
{1, 0, 0, 0, sNews2Gfx, sNews2Map, gCard4Pal},
|
||||
{1, 0, 0, 0, sNews2Gfx, sNews2Map, gCard5Pal},
|
||||
{1, 0, 0, 0, sNews6Gfx, sNews6Map, sNews6Pal},
|
||||
{1, 0, 0, 0, sNews7Gfx, sNews7Map, sNews7Pal}
|
||||
};
|
||||
|
||||
bool32 InitWonderNewsResources(const struct MEWonderNewsData * news)
|
||||
{
|
||||
if (news == NULL)
|
||||
return FALSE;
|
||||
sWork = AllocZeroed(sizeof(struct UnkStruct_203F3CC));
|
||||
if (sWork == NULL)
|
||||
return FALSE;
|
||||
sWork->wonderNews = *news;
|
||||
if (sWork->wonderNews.unk_03 >= NELEMS(sBgSpecs))
|
||||
sWork->wonderNews.unk_03 = 0;
|
||||
sWork->bgSpec = &sBgSpecs[sWork->wonderNews.unk_03];
|
||||
sWork->menuIndicatorsId = 0xFF;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void DestroyWonderNewsResources(void)
|
||||
{
|
||||
if (sWork != NULL)
|
||||
{
|
||||
*sWork = (struct UnkStruct_203F3CC){};
|
||||
Free(sWork);
|
||||
sWork = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
s32 FadeToWonderNewsMenu(void)
|
||||
{
|
||||
if (sWork == NULL)
|
||||
return -1;
|
||||
|
||||
switch (sWork->state)
|
||||
{
|
||||
case 0:
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
|
||||
break;
|
||||
case 1:
|
||||
if (UpdatePaletteFade())
|
||||
return 0;
|
||||
ChangeBgY(0, 0, 0);
|
||||
ChangeBgY(1, 0, 0);
|
||||
ChangeBgY(2, 0, 0);
|
||||
ChangeBgY(3, 0, 0);
|
||||
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 240));
|
||||
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(26, 152));
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ);
|
||||
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
|
||||
break;
|
||||
case 2:
|
||||
FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 20);
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
CopyBgTilemapBufferToVram(3);
|
||||
DecompressAndCopyTileDataToVram(3, sWork->bgSpec->tiles, 0, 8, 0);
|
||||
sWork->windowIds[0] = AddWindow(&gUnknown_8468040[0]);
|
||||
sWork->windowIds[1] = AddWindow(&gUnknown_8468040[1]);
|
||||
break;
|
||||
case 3:
|
||||
if (FreeTempTileDataBuffersIfPossible())
|
||||
return 0;
|
||||
gPaletteFade.bufferTransferDisabled = TRUE;
|
||||
LoadPalette(sWork->bgSpec->pal, 0x10, 0x20);
|
||||
LZ77UnCompWram(sWork->bgSpec->map, sWork->buffer_03A4);
|
||||
CopyRectToBgTilemapBufferRect(1, sWork->buffer_03A4, 0, 0, 30, 3, 0, 0, 30, 3, 1, 8, 0);
|
||||
CopyRectToBgTilemapBufferRect(3, sWork->buffer_03A4, 0, 3, 30, 23, 0, 3, 30, 23, 1, 8, 0);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
CopyBgTilemapBufferToVram(3);
|
||||
break;
|
||||
case 4:
|
||||
sub_8146980();
|
||||
break;
|
||||
case 5:
|
||||
sub_8146A30();
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
break;
|
||||
case 6:
|
||||
ShowBg(1);
|
||||
ShowBg(2);
|
||||
ShowBg(3);
|
||||
gPaletteFade.bufferTransferDisabled = FALSE;
|
||||
sWork->menuIndicatorsId = AddScrollIndicatorArrowPair(&sWork->scrollArrowsTemplate, &sWork->scrollOffset);
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
|
||||
UpdatePaletteFade();
|
||||
break;
|
||||
default:
|
||||
if (UpdatePaletteFade())
|
||||
return 0;
|
||||
sWork->state = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
++sWork->state;
|
||||
return 0;
|
||||
}
|
||||
|
||||
s32 FadeOutFromWonderNews(bool32 flag)
|
||||
{
|
||||
if (sWork == NULL)
|
||||
return -1;
|
||||
switch (sWork->state)
|
||||
{
|
||||
case 0:
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
|
||||
break;
|
||||
case 1:
|
||||
if (UpdatePaletteFade())
|
||||
return 0;
|
||||
ChangeBgY(2, 0, 0);
|
||||
SetGpuReg(REG_OFFSET_WIN0H, 0);
|
||||
SetGpuReg(REG_OFFSET_WIN0V, 0);
|
||||
SetGpuReg(REG_OFFSET_WININ, 0);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, 0);
|
||||
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
|
||||
break;
|
||||
case 2:
|
||||
FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
|
||||
FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 24);
|
||||
FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 24);
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
CopyBgTilemapBufferToVram(2);
|
||||
CopyBgTilemapBufferToVram(3);
|
||||
break;
|
||||
case 3:
|
||||
HideBg(1);
|
||||
HideBg(2);
|
||||
RemoveWindow(sWork->windowIds[1]);
|
||||
RemoveWindow(sWork->windowIds[0]);
|
||||
break;
|
||||
case 4:
|
||||
ChangeBgY(2, 0, 0);
|
||||
ChangeBgY(3, 0, 0);
|
||||
if (sWork->menuIndicatorsId != 0xFF)
|
||||
{
|
||||
RemoveScrollIndicatorArrowPair(sWork->menuIndicatorsId);
|
||||
sWork->menuIndicatorsId = 0xFF;
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag);
|
||||
break;
|
||||
case 6:
|
||||
MG_DrawCheckerboardPattern();
|
||||
CopyBgTilemapBufferToVram(0);
|
||||
CopyBgTilemapBufferToVram(3);
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
|
||||
break;
|
||||
default:
|
||||
if (UpdatePaletteFade())
|
||||
return 0;
|
||||
sWork->state = 0;
|
||||
return 1;
|
||||
}
|
||||
++sWork->state;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void MENews_RemoveScrollIndicatorArrowPair(void)
|
||||
{
|
||||
if (!sWork->verticalScrollDisabled && sWork->menuIndicatorsId != 0xFF)
|
||||
{
|
||||
RemoveScrollIndicatorArrowPair(sWork->menuIndicatorsId);
|
||||
sWork->menuIndicatorsId = 0xFF;
|
||||
sWork->verticalScrollDisabled = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MENews_AddScrollIndicatorArrowPair(void)
|
||||
{
|
||||
if (sWork->verticalScrollDisabled)
|
||||
{
|
||||
sWork->menuIndicatorsId = AddScrollIndicatorArrowPair(&sWork->scrollArrowsTemplate, &sWork->scrollOffset);
|
||||
sWork->verticalScrollDisabled = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
u32 MENews_GetInput(u16 input)
|
||||
{
|
||||
if (sWork->unk_01C2_0)
|
||||
{
|
||||
sub_8146B58();
|
||||
return 0xFF;
|
||||
}
|
||||
switch (input)
|
||||
{
|
||||
case A_BUTTON:
|
||||
return 0;
|
||||
case B_BUTTON:
|
||||
return 1;
|
||||
case DPAD_UP:
|
||||
if (sWork->scrollOffset == 0)
|
||||
return 0xFF;
|
||||
if (sWork->verticalScrollDisabled)
|
||||
return 0xFF;
|
||||
sWork->scrollDirection = FALSE;
|
||||
break;
|
||||
case DPAD_DOWN:
|
||||
if (sWork->scrollOffset == sWork->numMails)
|
||||
return 0xFF;
|
||||
if (sWork->verticalScrollDisabled)
|
||||
return 0xFF;
|
||||
sWork->scrollDirection = TRUE;
|
||||
break;
|
||||
default:
|
||||
return 0xFF;
|
||||
}
|
||||
sWork->unk_01C2_0 = TRUE;
|
||||
sWork->unk_01C2_1 = 2;
|
||||
sWork->unk_01C3_1 = 0;
|
||||
if (sWork->scrollDirection == FALSE)
|
||||
return 2;
|
||||
else
|
||||
return 3;
|
||||
}
|
||||
|
||||
static void sub_8146980(void)
|
||||
{
|
||||
u8 i = 0;
|
||||
memcpy(sWork->title, sWork->wonderNews.unk_04, 40);
|
||||
sWork->title[40] = EOS;
|
||||
for (; i < 10; ++i)
|
||||
{
|
||||
memcpy(sWork->messages[i], sWork->wonderNews.unk_2C[i], 40);
|
||||
sWork->messages[i][40] = EOS;
|
||||
if (i > 7 && sWork->messages[i][0] != EOS)
|
||||
++sWork->numMails;
|
||||
}
|
||||
sWork->scrollArrowsTemplate = sScrollArrowsTemplate;
|
||||
sWork->scrollArrowsTemplate.fullyDownThreshold = sWork->numMails;
|
||||
}
|
||||
|
||||
static void sub_8146A30(void)
|
||||
{
|
||||
u8 i = 0;
|
||||
s32 x;
|
||||
PutWindowTilemap(sWork->windowIds[0]);
|
||||
PutWindowTilemap(sWork->windowIds[1]);
|
||||
FillWindowPixelBuffer(sWork->windowIds[0], 0);
|
||||
FillWindowPixelBuffer(sWork->windowIds[1], 0);
|
||||
x = (0xe0 - GetStringWidth(3, sWork->title, GetFontAttribute(3, 2))) / 2;
|
||||
if (x < 0)
|
||||
x = 0;
|
||||
AddTextPrinterParameterized3(sWork->windowIds[0], 3, x, 6, sTextPals[sWork->bgSpec->textPal1], 0, sWork->title);
|
||||
for (; i < 10; ++i)
|
||||
{
|
||||
AddTextPrinterParameterized3(sWork->windowIds[1], 3, 0, 16 * i + 2, sTextPals[sWork->bgSpec->textPal2], 0, sWork->messages[i]);
|
||||
}
|
||||
CopyWindowToVram(sWork->windowIds[0], 3);
|
||||
CopyWindowToVram(sWork->windowIds[1], 3);
|
||||
}
|
||||
|
||||
static void sub_8146B58(void)
|
||||
{
|
||||
u16 r4 = sWork->unk_01C2_1;
|
||||
r4 <<= 8;
|
||||
if (sWork->scrollDirection)
|
||||
{
|
||||
ChangeBgY(2, r4, 1);
|
||||
ChangeBgY(3, r4, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
ChangeBgY(2, r4, 2);
|
||||
ChangeBgY(3, r4, 2);
|
||||
}
|
||||
sWork->unk_01C3_1 += sWork->unk_01C2_1;
|
||||
if (sWork->unk_01C3_1 > 15)
|
||||
{
|
||||
if (sWork->scrollDirection)
|
||||
++sWork->scrollOffset;
|
||||
else
|
||||
--sWork->scrollOffset;
|
||||
sWork->unk_01C2_0 = FALSE;
|
||||
sWork->unk_01C3_1 = 0;
|
||||
}
|
||||
}
|
||||
@@ -5,72 +5,83 @@
|
||||
#include "trig.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
void sub_815F1AC(u8 taskId);
|
||||
bool32 sub_815F2AC(u8 spriteId);
|
||||
void sub_815F3E0(u8 spriteId1, u8 spriteId2, u8 spriteId3);
|
||||
bool32 sub_815F444(u8 spriteId);
|
||||
void sub_815F470(struct Sprite * sprite);
|
||||
void sub_815F564(u16 tilesTag, u16 palTag);
|
||||
u8 sub_815F5BC(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority);
|
||||
void sub_815F610(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p);
|
||||
static void Task_MinigameCountdown(u8 taskId);
|
||||
static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId);
|
||||
static void StartStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3);
|
||||
static bool32 IsStartGraphicAnimRunning(u8 spriteId);
|
||||
static void SpriteCB_Start(struct Sprite * sprite);
|
||||
static void Load321StartGfx(u16 tilesTag, u16 palTag);
|
||||
static u8 CreateNumberSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority);
|
||||
static void CreateStartSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p);
|
||||
|
||||
void sub_815F138(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
|
||||
#define tState data[0]
|
||||
#define tTilesTag data[2]
|
||||
#define tPalTag data[3]
|
||||
#define tX data[4]
|
||||
#define tY data[5]
|
||||
#define tSubpriority data[6]
|
||||
#define tSpriteId1 data[7]
|
||||
#define tSpriteId2 data[8]
|
||||
#define tSpriteId3 data[9]
|
||||
|
||||
void StartMinigameCountdown(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
|
||||
{
|
||||
u8 taskId = CreateTask(sub_815F1AC, 80);
|
||||
gTasks[taskId].data[2] = tilesTag;
|
||||
gTasks[taskId].data[3] = palTag;
|
||||
gTasks[taskId].data[4] = x;
|
||||
gTasks[taskId].data[5] = y;
|
||||
gTasks[taskId].data[6] = subpriority;
|
||||
u8 taskId = CreateTask(Task_MinigameCountdown, 80);
|
||||
gTasks[taskId].tTilesTag = tilesTag;
|
||||
gTasks[taskId].tPalTag = palTag;
|
||||
gTasks[taskId].tX = x;
|
||||
gTasks[taskId].tY = y;
|
||||
gTasks[taskId].tSubpriority = subpriority;
|
||||
}
|
||||
|
||||
bool8 sub_815F198(void)
|
||||
bool8 IsMinigameCountdownRunning(void)
|
||||
{
|
||||
return FuncIsActiveTask(sub_815F1AC);
|
||||
return FuncIsActiveTask(Task_MinigameCountdown);
|
||||
}
|
||||
|
||||
void sub_815F1AC(u8 taskId)
|
||||
static void Task_MinigameCountdown(u8 taskId)
|
||||
{
|
||||
s16 * data = gTasks[taskId].data;
|
||||
|
||||
switch (data[0])
|
||||
switch (tState)
|
||||
{
|
||||
case 0:
|
||||
sub_815F564(data[2], data[3]);
|
||||
data[7] = sub_815F5BC(data[2], data[3], data[4], data[5], data[6]);
|
||||
sub_815F610(data[2], data[3], data[4], data[5], data[6], &data[8], &data[9]);
|
||||
data[0]++;
|
||||
Load321StartGfx(tTilesTag, tPalTag);
|
||||
tSpriteId1 = CreateNumberSprite(tTilesTag, tPalTag, tX, tY, tSubpriority);
|
||||
CreateStartSprite(tTilesTag, tPalTag, tX, tY, tSubpriority, &tSpriteId2, &tSpriteId3);
|
||||
tState++;
|
||||
break;
|
||||
case 1:
|
||||
if (!sub_815F2AC(data[7]))
|
||||
if (!RunMinigameCountdownDigitsAnim(tSpriteId1))
|
||||
{
|
||||
sub_815F3E0(data[7], data[8], data[9]);
|
||||
FreeSpriteOamMatrix(&gSprites[data[7]]);
|
||||
DestroySprite(&gSprites[data[7]]);
|
||||
data[0]++;
|
||||
StartStartGraphic(tSpriteId1, tSpriteId2, tSpriteId3);
|
||||
FreeSpriteOamMatrix(&gSprites[tSpriteId1]);
|
||||
DestroySprite(&gSprites[tSpriteId1]);
|
||||
tState++;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (!sub_815F444(data[8]))
|
||||
if (!IsStartGraphicAnimRunning(tSpriteId2))
|
||||
{
|
||||
DestroySprite(&gSprites[data[8]]);
|
||||
DestroySprite(&gSprites[data[9]]);
|
||||
FreeSpriteTilesByTag(data[2]);
|
||||
FreeSpritePaletteByTag(data[3]);
|
||||
DestroySprite(&gSprites[tSpriteId2]);
|
||||
DestroySprite(&gSprites[tSpriteId3]);
|
||||
FreeSpriteTilesByTag(tTilesTag);
|
||||
FreeSpritePaletteByTag(tPalTag);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool32 sub_815F2AC(u8 spriteId)
|
||||
static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId)
|
||||
{
|
||||
struct Sprite * sprite = &gSprites[spriteId];
|
||||
|
||||
switch (sprite->data[0])
|
||||
{
|
||||
case 0:
|
||||
sub_8007FFC(sprite, 0x800, 0x1A);
|
||||
// some sort of affine transform; x transform disabled
|
||||
obj_pos2_update_enable(sprite, 0x800, 0x1A);
|
||||
sprite->data[0]++;
|
||||
// fallthrough
|
||||
case 1:
|
||||
@@ -134,22 +145,22 @@ bool32 sub_815F2AC(u8 spriteId)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void sub_815F3E0(u8 spriteId1, u8 spriteId2, u8 spriteId3)
|
||||
static void StartStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3)
|
||||
{
|
||||
gSprites[spriteId2].pos2.y = -40;
|
||||
gSprites[spriteId3].pos2.y = -40;
|
||||
gSprites[spriteId2].invisible = FALSE;
|
||||
gSprites[spriteId3].invisible = FALSE;
|
||||
gSprites[spriteId2].callback = sub_815F470;
|
||||
gSprites[spriteId3].callback = sub_815F470;
|
||||
gSprites[spriteId2].callback = SpriteCB_Start;
|
||||
gSprites[spriteId3].callback = SpriteCB_Start;
|
||||
}
|
||||
|
||||
bool32 sub_815F444(u8 spriteId)
|
||||
static bool32 IsStartGraphicAnimRunning(u8 spriteId)
|
||||
{
|
||||
return gSprites[spriteId].callback == sub_815F470;
|
||||
return gSprites[spriteId].callback == SpriteCB_Start;
|
||||
}
|
||||
|
||||
void sub_815F470(struct Sprite * sprite)
|
||||
static void SpriteCB_Start(struct Sprite * sprite)
|
||||
{
|
||||
s16 * data = sprite->data;
|
||||
s32 y;
|
||||
@@ -200,103 +211,103 @@ void sub_815F470(struct Sprite * sprite)
|
||||
}
|
||||
}
|
||||
|
||||
const u16 gUnknown_847A328[] = INCBIN_U16("data/graphics/unk_847a348.gbapal");
|
||||
const u16 gUnknown_847A348[] = INCBIN_U16("data/graphics/unk_847a348.4bpp.lz");
|
||||
static const u16 sSpritePal_321Start[] = INCBIN_U16("data/graphics/unk_847a348.gbapal");
|
||||
static const u16 sSpriteSheet_321Start[] = INCBIN_U16("data/graphics/unk_847a348.4bpp.lz");
|
||||
|
||||
void sub_815F564(u16 tilesTag, u16 palTag)
|
||||
static void Load321StartGfx(u16 tilesTag, u16 palTag)
|
||||
{
|
||||
struct CompressedSpriteSheet spriteSheet = {(const void *)gUnknown_847A348, 0xE00};
|
||||
struct SpritePalette spritePalette = {gUnknown_847A328};
|
||||
struct CompressedSpriteSheet spriteSheet = {(const void *)sSpriteSheet_321Start, 0xE00};
|
||||
struct SpritePalette spritePalette = {sSpritePal_321Start};
|
||||
spriteSheet.tag = tilesTag;
|
||||
spritePalette.tag = palTag;
|
||||
LoadCompressedSpriteSheet(&spriteSheet);
|
||||
LoadSpritePalette(&spritePalette);
|
||||
}
|
||||
|
||||
const struct OamData gOamData_847A7AC = {
|
||||
static const struct OamData sOamData_Numbers = {
|
||||
.affineMode = ST_OAM_AFFINE_DOUBLE,
|
||||
.shape = ST_OAM_SQUARE,
|
||||
.size = 2
|
||||
.shape = SPRITE_SHAPE(32x32),
|
||||
.size = SPRITE_SIZE(32x32)
|
||||
};
|
||||
|
||||
const struct OamData gOamData_847A7B4 = {
|
||||
static const struct OamData sOamData_Start = {
|
||||
.affineMode = ST_OAM_AFFINE_OFF,
|
||||
.shape = ST_OAM_H_RECTANGLE,
|
||||
.size = 3
|
||||
.shape = SPRITE_SHAPE(64x32),
|
||||
.size = SPRITE_SIZE(64x32)
|
||||
};
|
||||
|
||||
const union AnimCmd gUnknown_847A7BC[] = {
|
||||
static const union AnimCmd sAnim_Numbers_Three[] = {
|
||||
ANIMCMD_FRAME( 0, 1),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
const union AnimCmd gUnknown_847A7C4[] = {
|
||||
static const union AnimCmd sAnim_Numbers_Two[] = {
|
||||
ANIMCMD_FRAME(16, 1),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
const union AnimCmd gUnknown_847A7CC[] = {
|
||||
static const union AnimCmd sAnim_Numbers_One[] = {
|
||||
ANIMCMD_FRAME(32, 1),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
const union AnimCmd *const gUnknown_847A7D4[] = {
|
||||
gUnknown_847A7BC,
|
||||
gUnknown_847A7C4,
|
||||
gUnknown_847A7CC
|
||||
static const union AnimCmd *const sAnimTable_Numbers[] = {
|
||||
sAnim_Numbers_Three,
|
||||
sAnim_Numbers_Two,
|
||||
sAnim_Numbers_One
|
||||
};
|
||||
|
||||
const union AnimCmd gUnknown_847A7E0[] = {
|
||||
static const union AnimCmd sAnim_StartLeft[] = {
|
||||
ANIMCMD_FRAME(48, 1),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
const union AnimCmd gUnknown_847A7E8[] = {
|
||||
static const union AnimCmd sAnim_StartRight[] = {
|
||||
ANIMCMD_FRAME(80, 1),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
const union AnimCmd *const gUnknown_847A7F0[] = {
|
||||
gUnknown_847A7E0,
|
||||
gUnknown_847A7E8
|
||||
static const union AnimCmd *const sAnimTable_Start[] = {
|
||||
sAnim_StartLeft,
|
||||
sAnim_StartRight
|
||||
};
|
||||
|
||||
const union AffineAnimCmd gUnknown_847A7F8[] = {
|
||||
static const union AffineAnimCmd sAffineAnim_Numbers_0[] = {
|
||||
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
|
||||
AFFINEANIMCMD_END
|
||||
};
|
||||
|
||||
const union AffineAnimCmd gUnknown_847A808[] = {
|
||||
static const union AffineAnimCmd sAffineAnim_Numbers_1[] = {
|
||||
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
|
||||
AFFINEANIMCMD_FRAME( 0x10, -0x10, 0, 8),
|
||||
AFFINEANIMCMD_END
|
||||
};
|
||||
|
||||
const union AffineAnimCmd gUnknown_847A820[] = {
|
||||
static const union AffineAnimCmd sAffineAnim_Numbers_2[] = {
|
||||
AFFINEANIMCMD_FRAME(-0x12, 0x12, 0, 8),
|
||||
AFFINEANIMCMD_END
|
||||
};
|
||||
|
||||
const union AffineAnimCmd gUnknown_847A830[] = {
|
||||
static const union AffineAnimCmd sAffineAnim_Numbers_3[] = {
|
||||
AFFINEANIMCMD_FRAME( 0x6, -0x6, 0, 8),
|
||||
AFFINEANIMCMD_FRAME( -0x4, 0x4, 0, 8),
|
||||
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
|
||||
AFFINEANIMCMD_END
|
||||
};
|
||||
|
||||
const union AffineAnimCmd *const gUnknown_847A850[] = {
|
||||
gUnknown_847A7F8,
|
||||
gUnknown_847A808,
|
||||
gUnknown_847A820,
|
||||
gUnknown_847A830
|
||||
static const union AffineAnimCmd *const sAffineAnimTable_Numbers[] = {
|
||||
sAffineAnim_Numbers_0,
|
||||
sAffineAnim_Numbers_1,
|
||||
sAffineAnim_Numbers_2,
|
||||
sAffineAnim_Numbers_3
|
||||
};
|
||||
|
||||
u8 sub_815F5BC(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
|
||||
static u8 CreateNumberSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
|
||||
{
|
||||
struct SpriteTemplate spriteTemplate = {
|
||||
.oam = &gOamData_847A7AC,
|
||||
.anims = gUnknown_847A7D4,
|
||||
.affineAnims = gUnknown_847A850,
|
||||
.oam = &sOamData_Numbers,
|
||||
.anims = sAnimTable_Numbers,
|
||||
.affineAnims = sAffineAnimTable_Numbers,
|
||||
.callback = SpriteCallbackDummy
|
||||
};
|
||||
spriteTemplate.tileTag = tilesTag;
|
||||
@@ -304,11 +315,11 @@ u8 sub_815F5BC(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
|
||||
return CreateSprite(&spriteTemplate, x, y, subpriority);
|
||||
}
|
||||
|
||||
void sub_815F610(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p)
|
||||
static void CreateStartSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p)
|
||||
{
|
||||
struct SpriteTemplate spriteTemplate = {
|
||||
.oam = &gOamData_847A7B4,
|
||||
.anims = gUnknown_847A7F0,
|
||||
.oam = &sOamData_Start,
|
||||
.anims = sAnimTable_Start,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCallbackDummy
|
||||
};
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "help_system.h"
|
||||
#include "strings.h"
|
||||
#include "constants/songs.h"
|
||||
#include "constants/union_room.h"
|
||||
|
||||
EWRAM_DATA u8 sDownArrowCounterAndYCoordIdx[8] = {};
|
||||
EWRAM_DATA bool8 gGiftIsFromEReader = FALSE;
|
||||
@@ -1237,21 +1238,21 @@ void task00_mystery_gift(u8 taskId)
|
||||
case 0:
|
||||
if (data->source == 1)
|
||||
{
|
||||
MEvent_CreateTask_CardOrNewsWithFriend(0x15);
|
||||
MEvent_CreateTask_CardOrNewsWithFriend(ACTIVITY_WCARD2);
|
||||
}
|
||||
else if (data->source == 0)
|
||||
{
|
||||
MEvent_CreateTask_CardOrNewsOverWireless(0x15);
|
||||
MEvent_CreateTask_CardOrNewsOverWireless(ACTIVITY_WCARD2);
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (data->source == 1)
|
||||
{
|
||||
MEvent_CreateTask_CardOrNewsWithFriend(0x16);
|
||||
MEvent_CreateTask_CardOrNewsWithFriend(ACTIVITY_WNEWS2);
|
||||
}
|
||||
else if (data->source == 0)
|
||||
{
|
||||
MEvent_CreateTask_CardOrNewsOverWireless(0x16);
|
||||
MEvent_CreateTask_CardOrNewsOverWireless(ACTIVITY_WNEWS2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1278,7 +1279,7 @@ void task00_mystery_gift(u8 taskId)
|
||||
switch (mevent_client_do_exec(&data->curPromptWindowId))
|
||||
{
|
||||
case 6: // done
|
||||
task_add_05_task_del_08FA224_when_no_RfuFunc();
|
||||
Rfu_BeginBuildAndSendCommand5F();
|
||||
data->prevPromptWindowId = data->curPromptWindowId;
|
||||
data->state = 13;
|
||||
break;
|
||||
@@ -1595,10 +1596,10 @@ void task00_mystery_gift(u8 taskId)
|
||||
switch (data->IsCardOrNews)
|
||||
{
|
||||
case 0:
|
||||
MEvent_CreateTask_Leader(21);
|
||||
MEvent_CreateTask_Leader(ACTIVITY_WCARD2);
|
||||
break;
|
||||
case 1:
|
||||
MEvent_CreateTask_Leader(22);
|
||||
MEvent_CreateTask_Leader(ACTIVITY_WNEWS2);
|
||||
break;
|
||||
}
|
||||
data->source = 1;
|
||||
@@ -1644,7 +1645,7 @@ void task00_mystery_gift(u8 taskId)
|
||||
}
|
||||
break;
|
||||
case 33:
|
||||
task_add_05_task_del_08FA224_when_no_RfuFunc();
|
||||
Rfu_BeginBuildAndSendCommand5F();
|
||||
StringCopy(gStringVar1, gLinkPlayers[1].name);
|
||||
data->state = 34;
|
||||
break;
|
||||
|
||||
+3
-3
@@ -108,7 +108,7 @@ void ResetMenuAndMonGlobals(void)
|
||||
|
||||
void NewGameInitData(void)
|
||||
{
|
||||
u8 rivalName[PLAYER_NAME_LENGTH];
|
||||
u8 rivalName[PLAYER_NAME_LENGTH + 1];
|
||||
|
||||
StringCopy(rivalName, gSaveBlock1Ptr->rivalName);
|
||||
gDifferentSaveFile = TRUE;
|
||||
@@ -143,9 +143,9 @@ void NewGameInitData(void)
|
||||
sub_809C794();
|
||||
InitEasyChatPhrases();
|
||||
ResetTrainerFanClub();
|
||||
copy_strings_to_sav1();
|
||||
UnionRoomChat_InitializeRegisteredTexts();
|
||||
ResetMiniGamesResults();
|
||||
sub_8143D24();
|
||||
InitMEventData();
|
||||
SetAllRenewableItemFlags();
|
||||
WarpToPlayersRoom();
|
||||
ScriptContext2_RunNewScript(EventScript_ResetAllMapFlags);
|
||||
|
||||
+2
-2
@@ -1902,8 +1902,8 @@ static void GetDefaultName(u8 arg0, u8 namePick)
|
||||
src = sRivalNameChoices[namePick];
|
||||
dest = gSaveBlock1Ptr->rivalName;
|
||||
}
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH - 1 && src[i] != EOS; i++)
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH && src[i] != EOS; i++)
|
||||
dest[i] = src[i];
|
||||
for (; i < PLAYER_NAME_LENGTH; i++)
|
||||
for (; i < PLAYER_NAME_LENGTH + 1; i++)
|
||||
dest[i] = EOS;
|
||||
}
|
||||
|
||||
+2
-2
@@ -3881,7 +3881,7 @@ static void CursorCB_Register(u8 taskId)
|
||||
u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES);
|
||||
u8 obedience = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_OBEDIENCE);
|
||||
|
||||
switch (CanRegisterMonForTradingBoard(*(struct GFtgtGnameSub *)sub_80F9800(), species2, species, obedience))
|
||||
switch (CanRegisterMonForTradingBoard(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), species2, species, obedience))
|
||||
{
|
||||
case CANT_REGISTER_MON:
|
||||
StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow);
|
||||
@@ -3907,7 +3907,7 @@ static void CursorCB_Trade1(u8 taskId)
|
||||
u16 species2 = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES2);
|
||||
u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES);
|
||||
u8 obedience = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_OBEDIENCE);
|
||||
u32 stringId = GetUnionRoomTradeMessageId(*(struct GFtgtGnameSub *)sub_80F9800(), gUnknown_203B064, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, obedience);
|
||||
u32 stringId = GetUnionRoomTradeMessageId(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), gPartnerTgtGnameSub, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, obedience);
|
||||
|
||||
if (stringId != UR_TRADE_MSG_NONE)
|
||||
{
|
||||
|
||||
@@ -562,8 +562,8 @@ void sub_8102F80(u8 taskId)
|
||||
switch (gUnknown_203ACF0->field_01)
|
||||
{
|
||||
case 0:
|
||||
sub_8107D38(0x10, 0);
|
||||
sub_8107D38(0x20, 1);
|
||||
ListMenuLoadStdPalAt(0x10, 0);
|
||||
ListMenuLoadStdPalAt(0x20, 1);
|
||||
gUnknown_203ACF0->field_48 = sub_8103518(gUnknown_203ACF0->field_42);
|
||||
gUnknown_203ACF0->field_01 = 2;
|
||||
break;
|
||||
@@ -648,8 +648,8 @@ void sub_8103238(u8 taskId)
|
||||
switch (gUnknown_203ACF0->field_01)
|
||||
{
|
||||
case 0:
|
||||
sub_8107D38(0x10, 0);
|
||||
sub_8107D38(0x20, 1);
|
||||
ListMenuLoadStdPalAt(0x10, 0);
|
||||
ListMenuLoadStdPalAt(0x20, 1);
|
||||
gUnknown_203ACF0->field_48 = sub_8103518(gUnknown_203ACF0->field_42);
|
||||
gUnknown_203ACF0->field_01 = 2;
|
||||
break;
|
||||
|
||||
+16
-3
@@ -90,7 +90,20 @@ static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon);
|
||||
|
||||
#include "data/battle_moves.h"
|
||||
|
||||
static const u8 sUnreferencedData[] = { 0x34, 0x00, 0x10, 0x00, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00 };
|
||||
// Used in an unreferenced function in RS.
|
||||
// Unreferenced here and in Emerald.
|
||||
struct CombinedMove
|
||||
{
|
||||
u16 move1;
|
||||
u16 move2;
|
||||
u16 newMove;
|
||||
};
|
||||
|
||||
static const struct CombinedMove sCombinedMoves[2] =
|
||||
{
|
||||
{MOVE_EMBER, MOVE_GUST, MOVE_HEAT_WAVE},
|
||||
{0xFFFF, 0xFFFF, 0xFFFF}
|
||||
};
|
||||
|
||||
static const u16 sSpeciesToHoennPokedexNum[] = // Assigns all species to the Hoenn Dex Index (Summary No. for Hoenn Dex)
|
||||
{
|
||||
@@ -2991,7 +3004,7 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data)
|
||||
{
|
||||
retVal = 0;
|
||||
|
||||
// FRLG changed this to 7 which used to be PLAYER_NAME_LENGTH
|
||||
// FRLG changed this to 7 which used to be PLAYER_NAME_LENGTH + 1
|
||||
while (retVal < 7)
|
||||
{
|
||||
data[retVal] = boxMon->otName[retVal];
|
||||
@@ -5769,7 +5782,7 @@ s8 GetFlavorRelationByPersonality(u32 personality, u8 flavor)
|
||||
|
||||
bool8 IsTradedMon(struct Pokemon *mon)
|
||||
{
|
||||
u8 otName[7 + 1]; // change PLAYER_NAME_LENGTH to 7
|
||||
u8 otName[PLAYER_NAME_LENGTH];
|
||||
u32 otId;
|
||||
GetMonData(mon, MON_DATA_OT_NAME, otName);
|
||||
otId = GetMonData(mon, MON_DATA_OT_ID, 0);
|
||||
|
||||
+22
-22
@@ -2411,8 +2411,8 @@ static void BufferFanClubTrainerName(struct LinkBattleRecords *linkRecords, u8 w
|
||||
else
|
||||
{
|
||||
str = gStringVar1;
|
||||
StringCopyN(str, linkTrainerName, PLAYER_NAME_LENGTH - 1);
|
||||
str[PLAYER_NAME_LENGTH - 1] = EOS;
|
||||
StringCopyN(str, linkTrainerName, PLAYER_NAME_LENGTH);
|
||||
str[PLAYER_NAME_LENGTH] = EOS;
|
||||
if ( str[0] == EXT_CTRL_CODE_BEGIN
|
||||
&& str[1] == EXT_CTRL_CODE_JPN)
|
||||
{
|
||||
@@ -3401,8 +3401,8 @@ static const u16 *BufferQuestLogText_LinkTraded(const u16 *a0)
|
||||
{
|
||||
const u16 *r6 = a0 + 4;
|
||||
|
||||
memset(gStringVar1, EOS, PLAYER_NAME_LENGTH);
|
||||
memcpy(gStringVar1, r6, PLAYER_NAME_LENGTH - 1);
|
||||
memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1);
|
||||
memcpy(gStringVar1, r6, PLAYER_NAME_LENGTH);
|
||||
|
||||
BufferLinkPartnersName(gStringVar1);
|
||||
QuestLog_GetSpeciesName(a0[3], gStringVar2, 0); // Mon received
|
||||
@@ -3435,7 +3435,7 @@ static u16 *BufferQuestLogData_LinkBattledSingle(u16 *a0, const u16 *eventData)
|
||||
a0[0] = QL_EVENT_LINK_BATTLED_SINGLE;
|
||||
a0[1] = sQuestLogIdx;
|
||||
*((u8 *)a0 + 4) = *((const u8 *)eventData + 0);
|
||||
memcpy((u8 *)a0 + 5, (const u8 *)eventData + 1, PLAYER_NAME_LENGTH - 1);
|
||||
memcpy((u8 *)a0 + 5, (const u8 *)eventData + 1, PLAYER_NAME_LENGTH);
|
||||
a0 += 6;
|
||||
return a0;
|
||||
}
|
||||
@@ -3444,8 +3444,8 @@ static const u16 *BufferQuestLogText_LinkBattledSingle(const u16 *a0)
|
||||
{
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
|
||||
memset(gStringVar1, EOS, PLAYER_NAME_LENGTH);
|
||||
memcpy(gStringVar1, (const u8 *)a0 + 5, PLAYER_NAME_LENGTH - 1);
|
||||
memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1);
|
||||
memcpy(gStringVar1, (const u8 *)a0 + 5, PLAYER_NAME_LENGTH);
|
||||
BufferLinkPartnersName(gStringVar1);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sBattleOutcomeTexts[((const u8 *)a0)[4]]);
|
||||
@@ -3459,7 +3459,7 @@ static u16 *BufferQuestLogData_LinkBattledDouble(u16 *a0, const u16 *eventData)
|
||||
a0[0] = QL_EVENT_LINK_BATTLED_DOUBLE;
|
||||
a0[1] = sQuestLogIdx;
|
||||
*((u8 *)a0 + 4) = *((const u8 *)eventData + 0);
|
||||
memcpy((u8 *)a0 + 5, (const u8 *)eventData + 1, PLAYER_NAME_LENGTH - 1);
|
||||
memcpy((u8 *)a0 + 5, (const u8 *)eventData + 1, PLAYER_NAME_LENGTH);
|
||||
a0 += 6;
|
||||
return a0;
|
||||
}
|
||||
@@ -3468,8 +3468,8 @@ static const u16 *BufferQuestLogText_LinkBattledDouble(const u16 *a0)
|
||||
{
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
|
||||
memset(gStringVar1, EOS, PLAYER_NAME_LENGTH);
|
||||
memcpy(gStringVar1, (const u8 *)a0 + 5, PLAYER_NAME_LENGTH - 1);
|
||||
memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1);
|
||||
memcpy(gStringVar1, (const u8 *)a0 + 5, PLAYER_NAME_LENGTH);
|
||||
BufferLinkPartnersName(gStringVar1);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
|
||||
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sBattleOutcomeTexts[((const u8 *)a0)[4]]);
|
||||
@@ -3483,9 +3483,9 @@ static u16 *BufferQuestLogData_LinkBattledMulti(u16 *a0, const u16 *eventData)
|
||||
a0[0] = QL_EVENT_LINK_BATTLED_MULTI;
|
||||
a0[1] = sQuestLogIdx;
|
||||
*((u8 *)a0 + 4) = *((const u8 *)eventData + 0);
|
||||
memcpy((u8 *)a0 + 5, (const u8 *)eventData + 1, PLAYER_NAME_LENGTH - 1);
|
||||
memcpy((u8 *)a0 + 12, (const u8 *)eventData + 8, PLAYER_NAME_LENGTH - 1);
|
||||
memcpy((u8 *)a0 + 19, (const u8 *)eventData + 15, PLAYER_NAME_LENGTH - 1);
|
||||
memcpy((u8 *)a0 + 5, (const u8 *)eventData + 1, PLAYER_NAME_LENGTH);
|
||||
memcpy((u8 *)a0 + 12, (const u8 *)eventData + 8, PLAYER_NAME_LENGTH);
|
||||
memcpy((u8 *)a0 + 19, (const u8 *)eventData + 15, PLAYER_NAME_LENGTH);
|
||||
a0 += 13;
|
||||
return a0;
|
||||
}
|
||||
@@ -3494,9 +3494,9 @@ static const u16 *BufferQuestLogText_LinkBattledMulti(const u16 *a0)
|
||||
{
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
|
||||
memset(gStringVar1, EOS, PLAYER_NAME_LENGTH);
|
||||
memset(gStringVar2, EOS, PLAYER_NAME_LENGTH);
|
||||
memset(gStringVar3, EOS, PLAYER_NAME_LENGTH);
|
||||
memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1);
|
||||
memset(gStringVar2, EOS, PLAYER_NAME_LENGTH + 1);
|
||||
memset(gStringVar3, EOS, PLAYER_NAME_LENGTH + 1);
|
||||
StringCopy7(gStringVar1, (const u8 *)a0 + 5);
|
||||
StringCopy7(gStringVar2, (const u8 *)a0 + 12);
|
||||
StringCopy7(gStringVar3, (const u8 *)a0 + 19);
|
||||
@@ -3548,7 +3548,7 @@ static u16 *BufferQuestLogData_LinkTradedUnionRoom(u16 *a0, const u16 *eventData
|
||||
a0[1] = sQuestLogIdx;
|
||||
a0[2] = eventData[0];
|
||||
a0[3] = eventData[1];
|
||||
memcpy(r4, eventData + 2, PLAYER_NAME_LENGTH - 1);
|
||||
memcpy(r4, eventData + 2, PLAYER_NAME_LENGTH);
|
||||
r4 += 8;
|
||||
return (u16 *)r4;
|
||||
}
|
||||
@@ -3556,8 +3556,8 @@ static u16 *BufferQuestLogData_LinkTradedUnionRoom(u16 *a0, const u16 *eventData
|
||||
static const u16 *BufferQuestLogText_LinkTradedUnionRoom(const u16 *a0)
|
||||
{
|
||||
const u8 *r6 = (const u8 *)(a0 + 4);
|
||||
memset(gStringVar1, EOS, PLAYER_NAME_LENGTH);
|
||||
memcpy(gStringVar1, r6, PLAYER_NAME_LENGTH - 1);
|
||||
memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1);
|
||||
memcpy(gStringVar1, r6, PLAYER_NAME_LENGTH);
|
||||
BufferLinkPartnersName(gStringVar1);
|
||||
QuestLog_GetSpeciesName(a0[3], gStringVar2, 0);
|
||||
QuestLog_GetSpeciesName(a0[2], gStringVar3, 0);
|
||||
@@ -3571,15 +3571,15 @@ static u16 *BufferQuestLogData_LinkBattledUnionRoom(u16 *a0, const u16 *eventDat
|
||||
a0[0] = QL_EVENT_LINK_BATTLED_UNION;
|
||||
a0[1] = sQuestLogIdx;
|
||||
*(u8 *)&a0[2] = *(const u8 *)&eventData[0];
|
||||
memcpy((u8 *)a0 + 5, (const u8 *)eventData + 1, PLAYER_NAME_LENGTH - 1);
|
||||
memcpy((u8 *)a0 + 5, (const u8 *)eventData + 1, PLAYER_NAME_LENGTH);
|
||||
a0 += 6;
|
||||
return a0;
|
||||
}
|
||||
|
||||
static const u16 *BufferQuestLogText_LinkBattledUnionRoom(const u16 *a0)
|
||||
{
|
||||
memset(gStringVar1, EOS, PLAYER_NAME_LENGTH);
|
||||
memcpy(gStringVar1, (const u8 *)a0 + 5, PLAYER_NAME_LENGTH - 1);
|
||||
memset(gStringVar1, EOS, PLAYER_NAME_LENGTH + 1);
|
||||
memcpy(gStringVar1, (const u8 *)a0 + 5, PLAYER_NAME_LENGTH);
|
||||
BufferLinkPartnersName(gStringVar1);
|
||||
StringCopy(gStringVar2, sBattleOutcomeTexts[*(const u8 *)&a0[2]]);
|
||||
StringExpandPlaceholders(gStringVar4, QuestLog_Text_BattledTrainerEndedInOutcome);
|
||||
|
||||
+32
-32
@@ -14,22 +14,22 @@ void SetQuestLogObjectEventsData(struct QuestLog * questLog)
|
||||
for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
|
||||
{
|
||||
questLog->unk_008[i].active = gObjectEvents[i].active;
|
||||
questLog->unk_008[i].mapobj_bit_3 = gObjectEvents[i].mapobj_bit_3;
|
||||
questLog->unk_008[i].mapobj_bit_4 = gObjectEvents[i].mapobj_bit_4;
|
||||
questLog->unk_008[i].mapobj_bit_5 = gObjectEvents[i].mapobj_bit_5;
|
||||
questLog->unk_008[i].mapobj_bit_8 = gObjectEvents[i].mapobj_bit_8;
|
||||
questLog->unk_008[i].mapobj_bit_9 = gObjectEvents[i].mapobj_bit_9;
|
||||
questLog->unk_008[i].mapobj_bit_10 = gObjectEvents[i].mapobj_bit_10;
|
||||
questLog->unk_008[i].mapobj_bit_11 = gObjectEvents[i].mapobj_bit_11;
|
||||
questLog->unk_008[i].mapobj_bit_12 = gObjectEvents[i].mapobj_bit_12;
|
||||
questLog->unk_008[i].mapobj_bit_13 = gObjectEvents[i].mapobj_bit_13;
|
||||
questLog->unk_008[i].mapobj_bit_14 = gObjectEvents[i].mapobj_bit_14;
|
||||
questLog->unk_008[i].mapobj_bit_15 = gObjectEvents[i].mapobj_bit_15;
|
||||
questLog->unk_008[i].mapobj_bit_16 = gObjectEvents[i].mapobj_bit_16;
|
||||
questLog->unk_008[i].mapobj_bit_23 = gObjectEvents[i].mapobj_bit_23;
|
||||
questLog->unk_008[i].mapobj_bit_24 = gObjectEvents[i].mapobj_bit_24;
|
||||
questLog->unk_008[i].mapobj_bit_25 = gObjectEvents[i].mapobj_bit_25;
|
||||
questLog->unk_008[i].mapobj_bit_26 = gObjectEvents[i].mapobj_bit_26;
|
||||
questLog->unk_008[i].triggerGroundEffectsOnStop = gObjectEvents[i].triggerGroundEffectsOnStop;
|
||||
questLog->unk_008[i].disableCoveringGroundEffects = gObjectEvents[i].disableCoveringGroundEffects;
|
||||
questLog->unk_008[i].landingJump = gObjectEvents[i].landingJump;
|
||||
questLog->unk_008[i].frozen = gObjectEvents[i].frozen;
|
||||
questLog->unk_008[i].facingDirectionLocked = gObjectEvents[i].facingDirectionLocked;
|
||||
questLog->unk_008[i].disableAnim = gObjectEvents[i].disableAnim;
|
||||
questLog->unk_008[i].enableAnim = gObjectEvents[i].enableAnim;
|
||||
questLog->unk_008[i].inanimate = gObjectEvents[i].inanimate;
|
||||
questLog->unk_008[i].invisible = gObjectEvents[i].invisible;
|
||||
questLog->unk_008[i].offScreen = gObjectEvents[i].offScreen;
|
||||
questLog->unk_008[i].trackedByCamera = gObjectEvents[i].trackedByCamera;
|
||||
questLog->unk_008[i].isPlayer = gObjectEvents[i].isPlayer;
|
||||
questLog->unk_008[i].spriteAnimPausedBackup = gObjectEvents[i].spriteAnimPausedBackup;
|
||||
questLog->unk_008[i].spriteAffineAnimPausedBackup = gObjectEvents[i].spriteAffineAnimPausedBackup;
|
||||
questLog->unk_008[i].disableJumpLandingGroundEffect = gObjectEvents[i].disableJumpLandingGroundEffect;
|
||||
questLog->unk_008[i].fixedPriority = gObjectEvents[i].fixedPriority;
|
||||
questLog->unk_008[i].mapobj_unk_18 = gObjectEvents[i].facingDirection;
|
||||
questLog->unk_008[i].mapobj_unk_0B_0 = gObjectEvents[i].mapobj_unk_0B_0;
|
||||
questLog->unk_008[i].elevation = gObjectEvents[i].elevation;
|
||||
@@ -58,22 +58,22 @@ void sub_815A1F8(const struct QuestLog * questLog, const struct ObjectEventTempl
|
||||
for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
|
||||
{
|
||||
gObjectEvents[i].active = questLogObjectEvents[i].active;
|
||||
gObjectEvents[i].mapobj_bit_3 = questLogObjectEvents[i].mapobj_bit_3;
|
||||
gObjectEvents[i].mapobj_bit_4 = questLogObjectEvents[i].mapobj_bit_4;
|
||||
gObjectEvents[i].mapobj_bit_5 = questLogObjectEvents[i].mapobj_bit_5;
|
||||
gObjectEvents[i].mapobj_bit_8 = questLogObjectEvents[i].mapobj_bit_8;
|
||||
gObjectEvents[i].mapobj_bit_9 = questLogObjectEvents[i].mapobj_bit_9;
|
||||
gObjectEvents[i].mapobj_bit_10 = questLogObjectEvents[i].mapobj_bit_10;
|
||||
gObjectEvents[i].mapobj_bit_11 = questLogObjectEvents[i].mapobj_bit_11;
|
||||
gObjectEvents[i].mapobj_bit_12 = questLogObjectEvents[i].mapobj_bit_12;
|
||||
gObjectEvents[i].mapobj_bit_13 = questLogObjectEvents[i].mapobj_bit_13;
|
||||
gObjectEvents[i].mapobj_bit_14 = questLogObjectEvents[i].mapobj_bit_14;
|
||||
gObjectEvents[i].mapobj_bit_15 = questLogObjectEvents[i].mapobj_bit_15;
|
||||
gObjectEvents[i].mapobj_bit_16 = questLogObjectEvents[i].mapobj_bit_16;
|
||||
gObjectEvents[i].mapobj_bit_23 = questLogObjectEvents[i].mapobj_bit_23;
|
||||
gObjectEvents[i].mapobj_bit_24 = questLogObjectEvents[i].mapobj_bit_24;
|
||||
gObjectEvents[i].mapobj_bit_25 = questLogObjectEvents[i].mapobj_bit_25;
|
||||
gObjectEvents[i].mapobj_bit_26 = questLogObjectEvents[i].mapobj_bit_26;
|
||||
gObjectEvents[i].triggerGroundEffectsOnStop = questLogObjectEvents[i].triggerGroundEffectsOnStop;
|
||||
gObjectEvents[i].disableCoveringGroundEffects = questLogObjectEvents[i].disableCoveringGroundEffects;
|
||||
gObjectEvents[i].landingJump = questLogObjectEvents[i].landingJump;
|
||||
gObjectEvents[i].frozen = questLogObjectEvents[i].frozen;
|
||||
gObjectEvents[i].facingDirectionLocked = questLogObjectEvents[i].facingDirectionLocked;
|
||||
gObjectEvents[i].disableAnim = questLogObjectEvents[i].disableAnim;
|
||||
gObjectEvents[i].enableAnim = questLogObjectEvents[i].enableAnim;
|
||||
gObjectEvents[i].inanimate = questLogObjectEvents[i].inanimate;
|
||||
gObjectEvents[i].invisible = questLogObjectEvents[i].invisible;
|
||||
gObjectEvents[i].offScreen = questLogObjectEvents[i].offScreen;
|
||||
gObjectEvents[i].trackedByCamera = questLogObjectEvents[i].trackedByCamera;
|
||||
gObjectEvents[i].isPlayer = questLogObjectEvents[i].isPlayer;
|
||||
gObjectEvents[i].spriteAnimPausedBackup = questLogObjectEvents[i].spriteAnimPausedBackup;
|
||||
gObjectEvents[i].spriteAffineAnimPausedBackup = questLogObjectEvents[i].spriteAffineAnimPausedBackup;
|
||||
gObjectEvents[i].disableJumpLandingGroundEffect = questLogObjectEvents[i].disableJumpLandingGroundEffect;
|
||||
gObjectEvents[i].fixedPriority = questLogObjectEvents[i].fixedPriority;
|
||||
gObjectEvents[i].facingDirection = questLogObjectEvents[i].mapobj_unk_18;
|
||||
gObjectEvents[i].mapobj_unk_0B_0 = questLogObjectEvents[i].mapobj_unk_0B_0;
|
||||
gObjectEvents[i].elevation = questLogObjectEvents[i].elevation;
|
||||
|
||||
@@ -100,7 +100,7 @@ static void sub_81505C4(u8 taskId)
|
||||
{
|
||||
case 0:
|
||||
ObjectEventClearAnimIfSpecialAnimActive(objectEvent);
|
||||
objectEvent->mapobj_bit_11 = TRUE;
|
||||
objectEvent->enableAnim = TRUE;
|
||||
sub_81507BC(objectEvent, sub_805C808(4));
|
||||
StartSpriteAnim(sprite, sub_80634F0(objectEvent->facingDirection));
|
||||
gTasks[taskId].data[0]++;
|
||||
|
||||
+107
-105
@@ -10,14 +10,15 @@
|
||||
#include "task.h"
|
||||
#include "constants/flags.h"
|
||||
#include "constants/event_object_movement.h"
|
||||
#include "constants/union_room.h"
|
||||
#include "constants/object_events.h"
|
||||
|
||||
static EWRAM_DATA struct UnionObj * UnionObjWork = NULL;
|
||||
static EWRAM_DATA u32 sUnionObjRefreshTimer = 0;
|
||||
|
||||
static u8 StartUnionObjAnimTask(void);
|
||||
static u32 sub_811BBC8(u32 playerIdx, u32 arg1);
|
||||
static void sub_811C008(s32 arg0, s32 arg1, u8 arg2);
|
||||
static u32 RfuUnionGroupMemberIsInvisible(u32 group, u32 member);
|
||||
static void UnionPartnerObjectSetFacing(s32 member, s32 group, u8 direction);
|
||||
|
||||
static const u8 sUnionObjectEventGfxIds[][10] = {
|
||||
[MALE] = {
|
||||
@@ -69,12 +70,12 @@ static const u8 sOppositeFacingDirection[] = {
|
||||
[DIR_EAST] = DIR_WEST
|
||||
};
|
||||
|
||||
static const u8 gUnknown_845711B[] = {
|
||||
1,
|
||||
3,
|
||||
1,
|
||||
4,
|
||||
2
|
||||
static const u8 sUnionGroupMemberFacings[] = {
|
||||
DIR_SOUTH,
|
||||
DIR_WEST,
|
||||
DIR_SOUTH,
|
||||
DIR_EAST,
|
||||
DIR_NORTH
|
||||
};
|
||||
|
||||
static const u8 sUnionRoomLocalIds[] = {
|
||||
@@ -116,19 +117,19 @@ static u8 GetUnionRoomPlayerGraphicsId(u32 gender, u32 id)
|
||||
return sUnionObjectEventGfxIds[gender][id % 8];
|
||||
}
|
||||
|
||||
static void GetUnionRoomPlayerFacingCoords(u32 id, u32 dirn, s32 * xp, s32 * yp)
|
||||
static void GetUnionRoomPlayerFacingCoords(u32 group, u32 member, s32 * xp, s32 * yp)
|
||||
{
|
||||
*xp = sUnionPartnerCoords[id][0] + sFacingDirectionOffsets[dirn][0] + 7;
|
||||
*yp = sUnionPartnerCoords[id][1] + sFacingDirectionOffsets[dirn][1] + 7;
|
||||
*xp = sUnionPartnerCoords[group][0] + sFacingDirectionOffsets[member][0] + 7;
|
||||
*yp = sUnionPartnerCoords[group][1] + sFacingDirectionOffsets[member][1] + 7;
|
||||
}
|
||||
|
||||
static bool32 sub_811B58C(u32 id, u32 dirn, s32 x, s32 y)
|
||||
static bool32 IsUnionRoomPlayerFacingTileAt(u32 group, u32 member, s32 x, s32 y)
|
||||
{
|
||||
if (sUnionPartnerCoords[id][0] + sFacingDirectionOffsets[dirn][0] + 7 != x)
|
||||
if (sUnionPartnerCoords[group][0] + sFacingDirectionOffsets[member][0] + 7 != x)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else if (sUnionPartnerCoords[id][1] + sFacingDirectionOffsets[dirn][1] + 7 != y)
|
||||
else if (sUnionPartnerCoords[group][1] + sFacingDirectionOffsets[member][1] + 7 != y)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
@@ -188,6 +189,7 @@ static bool32 SetUnionRoomPlayerEnterExitMovement(u32 playerIdx, const u8 * move
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static bool32 TryReleaseUnionRoomPlayerObjectEvent(u32 playerIdx)
|
||||
{
|
||||
u8 objectId;
|
||||
@@ -263,11 +265,11 @@ static const u8 sMovement_UnionPlayerEnter[2] = {
|
||||
MOVEMENT_ACTION_STEP_END
|
||||
};
|
||||
|
||||
static bool32 AnimateUnionRoomPlayerSpawn(s8 * a0, u32 playerIdx, struct UnionObj * ptr)
|
||||
static bool32 AnimateUnionRoomPlayerSpawn(s8 * state_p, u32 playerIdx, struct UnionObj * ptr)
|
||||
{
|
||||
s16 x, y;
|
||||
|
||||
switch (*a0)
|
||||
switch (*state_p)
|
||||
{
|
||||
case 0:
|
||||
if (!is_walking_or_running())
|
||||
@@ -275,30 +277,30 @@ static bool32 AnimateUnionRoomPlayerSpawn(s8 * a0, u32 playerIdx, struct UnionOb
|
||||
break;
|
||||
}
|
||||
PlayerGetDestCoords(&x, &y);
|
||||
if (sub_811B58C(playerIdx, 0, x, y) == TRUE)
|
||||
if (IsUnionRoomPlayerFacingTileAt(playerIdx, 0, x, y) == TRUE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
player_get_pos_including_state_based_drift(&x, &y);
|
||||
if (sub_811B58C(playerIdx, 0, x, y) == TRUE)
|
||||
if (IsUnionRoomPlayerFacingTileAt(playerIdx, 0, x, y) == TRUE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
SetUnionRoomPlayerGfx(playerIdx, ptr->gfxId);
|
||||
CreateUnionRoomPlayerObjectEvent(playerIdx);
|
||||
ShowUnionRoomPlayer(playerIdx);
|
||||
(*a0)++;
|
||||
(*state_p)++;
|
||||
// fallthrough
|
||||
case 3: // incorrect?
|
||||
if (SetUnionRoomPlayerEnterExitMovement(playerIdx, sMovement_UnionPlayerEnter) == 1)
|
||||
{
|
||||
(*a0)++;
|
||||
(*state_p)++;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (TryReleaseUnionRoomPlayerObjectEvent(playerIdx))
|
||||
{
|
||||
*a0 = 0;
|
||||
*state_p = 0;
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
@@ -306,12 +308,12 @@ static bool32 AnimateUnionRoomPlayerSpawn(s8 * a0, u32 playerIdx, struct UnionOb
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool32 sub_811B8BC(u32 playerIdx, u32 a1, u32 a2)
|
||||
static bool32 SpawnGroupLeader(u32 playerIdx, u32 gender, u32 idMod256)
|
||||
{
|
||||
struct UnionObj * ptr = &UnionObjWork[playerIdx];
|
||||
AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH("rfu_union_tool.c"), 561)
|
||||
ptr->schedAnim = 1;
|
||||
ptr->gfxId = GetUnionRoomPlayerGraphicsId(a1, a2);
|
||||
ptr->schedAnim = UNION_ROOM_SPAWN_IN;
|
||||
ptr->gfxId = GetUnionRoomPlayerGraphicsId(gender, idMod256);
|
||||
if (ptr->state == 0)
|
||||
{
|
||||
return TRUE;
|
||||
@@ -322,11 +324,11 @@ static bool32 sub_811B8BC(u32 playerIdx, u32 a1, u32 a2)
|
||||
}
|
||||
}
|
||||
|
||||
static bool32 sub_811B90C(u32 playerIdx)
|
||||
static bool32 DespawnGroupLeader(u32 playerIdx)
|
||||
{
|
||||
struct UnionObj * ptr = &UnionObjWork[playerIdx];
|
||||
AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH("rfu_union_tool.c"), 577)
|
||||
ptr->schedAnim = 2;
|
||||
ptr->schedAnim = UNION_ROOM_SPAWN_OUT;
|
||||
if (ptr->state == 1)
|
||||
{
|
||||
return TRUE;
|
||||
@@ -342,7 +344,7 @@ static void AnimateUnionObj(u32 playerIdx, struct UnionObj * ptr)
|
||||
switch (ptr->state)
|
||||
{
|
||||
case 0:
|
||||
if (ptr->schedAnim == 1)
|
||||
if (ptr->schedAnim == UNION_ROOM_SPAWN_IN)
|
||||
{
|
||||
ptr->state = 2;
|
||||
ptr->animState = 0;
|
||||
@@ -353,7 +355,7 @@ static void AnimateUnionObj(u32 playerIdx, struct UnionObj * ptr)
|
||||
}
|
||||
// fallthrough
|
||||
case 2:
|
||||
if (!sub_811BBC8(playerIdx, 0) && ptr->schedAnim == 2)
|
||||
if (!RfuUnionGroupMemberIsInvisible(playerIdx, 0) && ptr->schedAnim == 2)
|
||||
{
|
||||
ptr->state = 0;
|
||||
ptr->animState = 0;
|
||||
@@ -366,7 +368,7 @@ static void AnimateUnionObj(u32 playerIdx, struct UnionObj * ptr)
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (ptr->schedAnim == 2)
|
||||
if (ptr->schedAnim == UNION_ROOM_SPAWN_OUT)
|
||||
{
|
||||
ptr->state = 3;
|
||||
ptr->animState = 0;
|
||||
@@ -383,7 +385,7 @@ static void AnimateUnionObj(u32 playerIdx, struct UnionObj * ptr)
|
||||
}
|
||||
break;
|
||||
}
|
||||
ptr->schedAnim = 0;
|
||||
ptr->schedAnim = UNION_ROOM_SPAWN_NONE;
|
||||
}
|
||||
|
||||
static void Task_AnimateUnionObjs(u8 taskId)
|
||||
@@ -409,7 +411,7 @@ static u8 StartUnionObjAnimTask(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_811BA5C(void)
|
||||
static void DestroyAnimateUnionObjsTask(void)
|
||||
{
|
||||
u8 taskId = FindTaskIdByFunc(Task_AnimateUnionObjs);
|
||||
if (taskId < NUM_TASKS)
|
||||
@@ -418,7 +420,7 @@ static void sub_811BA5C(void)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_811BA78(void)
|
||||
void DeleteUnionObjWorkAndStopTask(void)
|
||||
{
|
||||
s32 i;
|
||||
for (i = 0; i < 8; i++)
|
||||
@@ -430,31 +432,31 @@ void sub_811BA78(void)
|
||||
}
|
||||
}
|
||||
UnionObjWork = NULL;
|
||||
sub_811BA5C();
|
||||
DestroyAnimateUnionObjsTask();
|
||||
}
|
||||
|
||||
void sub_811BAAC(u8 * sp8, s32 r9)
|
||||
void CreateGroupMemberObjectsInvisible(u8 * sprite_ids, s32 group)
|
||||
{
|
||||
s32 r7;
|
||||
s32 i;
|
||||
|
||||
for (r7 = 0; r7 < 5; r7++)
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
s32 r5 = 5 * r9 + r7;
|
||||
sp8[r5] = sprite_new(OBJECT_EVENT_GFX_MAN, r5 - 0x38, sUnionPartnerCoords[r9][0] + sFacingDirectionOffsets[r7][0], sUnionPartnerCoords[r9][1] + sFacingDirectionOffsets[r7][1], 3, 1);
|
||||
sub_8069124(r5 - 0x38, TRUE);
|
||||
s32 obj_id = 5 * group + i;
|
||||
sprite_ids[obj_id] = sprite_new(OBJECT_EVENT_GFX_MAN, obj_id - 0x38, sUnionPartnerCoords[group][0] + sFacingDirectionOffsets[i][0], sUnionPartnerCoords[group][1] + sFacingDirectionOffsets[i][1], 3, 1);
|
||||
RfuUnionObjectToggleInvisibility(obj_id - 0x38, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_811BB40(u8 * r5)
|
||||
void DestroyGroupMemberObjects(u8 *spriteIds)
|
||||
{
|
||||
s32 i;
|
||||
for (i = 0; i < 40; i++)
|
||||
{
|
||||
DestroySprite(&gSprites[r5[i]]);
|
||||
DestroySprite(&gSprites[spriteIds[i]]);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_811BB68(void)
|
||||
void MakeGroupAssemblyAreasPassable(void)
|
||||
{
|
||||
s32 i, j, x, y;
|
||||
for (i = 0; i < 8; i++)
|
||||
@@ -462,94 +464,94 @@ void sub_811BB68(void)
|
||||
for (j = 0; j < 5; j++)
|
||||
{
|
||||
GetUnionRoomPlayerFacingCoords(i, j, &x, &y);
|
||||
sub_8059024(x, y, 0);
|
||||
MapGridSetMetatileImpassabilityAt(x, y, FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static u8 sub_811BBA0(u32 r1, u32 unused, struct GFtgtGname * r2)
|
||||
static u8 UnionPartnerObjectGetFacing(u32 member, u32 group, struct GFtgtGname * gname)
|
||||
{
|
||||
if (r1 != 0)
|
||||
if (member != 0)
|
||||
{
|
||||
return gUnknown_845711B[r1];
|
||||
return sUnionGroupMemberFacings[member];
|
||||
}
|
||||
else if (r2->unk_0a_0 == 0x45)
|
||||
else if (gname->activity == 0x45)
|
||||
{
|
||||
return 1;
|
||||
return DIR_SOUTH;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 4;
|
||||
return DIR_EAST;
|
||||
}
|
||||
}
|
||||
|
||||
static u32 sub_811BBC8(u32 a0, u32 a1)
|
||||
static u32 RfuUnionGroupMemberIsInvisible(u32 group, u32 member)
|
||||
{
|
||||
return sub_806916C(5 * a0 + a1 - 0x38);
|
||||
return RfuUnionObjectIsInvisible(5 * group + member - 0x38);
|
||||
}
|
||||
|
||||
static void sub_811BBE0(u32 r5, u32 r6, u8 r8, struct GFtgtGname * r9)
|
||||
static void SpawnGroupMember(u32 groupNo, u32 memberNo, u8 direction, struct GFtgtGname * gname)
|
||||
{
|
||||
s32 x, y;
|
||||
s32 r7 = 5 * r5 + r6;
|
||||
if (sub_811BBC8(r5, r6) == 1)
|
||||
s32 objId = 5 * groupNo + memberNo;
|
||||
if (RfuUnionGroupMemberIsInvisible(groupNo, memberNo) == TRUE)
|
||||
{
|
||||
sub_8069124(r7 - 0x38, FALSE);
|
||||
sub_80691A4(r7 - 0x38, 1);
|
||||
RfuUnionObjectToggleInvisibility(objId - 0x38, FALSE);
|
||||
RfuUnionObjectStartWarp(objId - 0x38, UNION_ROOM_SPAWN_IN);
|
||||
}
|
||||
sub_8069094(r7 - 0x38, r8);
|
||||
sub_811C008(r6, r5, sub_811BBA0(r6, r5, r9));
|
||||
GetUnionRoomPlayerFacingCoords(r5, r6, &x, &y);
|
||||
sub_8059024(x, y, 1);
|
||||
RfuUnionObjectSetFacingDirection(objId - 0x38, direction);
|
||||
UnionPartnerObjectSetFacing(memberNo, groupNo, UnionPartnerObjectGetFacing(memberNo, groupNo, gname));
|
||||
GetUnionRoomPlayerFacingCoords(groupNo, memberNo, &x, &y);
|
||||
MapGridSetMetatileImpassabilityAt(x, y, TRUE);
|
||||
}
|
||||
|
||||
static void sub_811BC68(u32 a0, u32 a1)
|
||||
static void DespawnGroupMember(u32 group, u32 member)
|
||||
{
|
||||
s32 x, y;
|
||||
sub_80691A4(5 * a0 + a1 - 0x38, 2);
|
||||
GetUnionRoomPlayerFacingCoords(a0, a1, &x, &y);
|
||||
sub_8059024(x, y, 0);
|
||||
RfuUnionObjectStartWarp(5 * group + member - 0x38, UNION_ROOM_SPAWN_OUT);
|
||||
GetUnionRoomPlayerFacingCoords(group, member, &x, &y);
|
||||
MapGridSetMetatileImpassabilityAt(x, y, FALSE);
|
||||
}
|
||||
|
||||
static void sub_811BCA0(u32 r7, struct GFtgtGname * r8)
|
||||
static void AssembleGroup(u32 group, struct GFtgtGname * gname)
|
||||
{
|
||||
s16 x, y, x2, y2;
|
||||
s32 i;
|
||||
|
||||
PlayerGetDestCoords(&x, &y);
|
||||
player_get_pos_including_state_based_drift(&x2, &y2);
|
||||
if (sub_806916C(5 * r7 - 0x38) == 1)
|
||||
if (RfuUnionObjectIsInvisible(5 * group - 0x38) == TRUE)
|
||||
{
|
||||
if (sub_811B58C(r7, 0, x, y) == TRUE || sub_811B58C(r7, 0, x2, y2) == TRUE)
|
||||
if (IsUnionRoomPlayerFacingTileAt(group, 0, x, y) == TRUE || IsUnionRoomPlayerFacingTileAt(group, 0, x2, y2) == TRUE)
|
||||
{
|
||||
return;
|
||||
}
|
||||
sub_811BBE0(r7, 0, GetUnionRoomPlayerGraphicsId(r8->playerGender, r8->unk_00.playerTrainerId[0]), r8);
|
||||
SpawnGroupMember(group, 0, GetUnionRoomPlayerGraphicsId(gname->playerGender, gname->unk_00.playerTrainerId[0]), gname);
|
||||
}
|
||||
for (i = 1; i < 5; i++)
|
||||
{
|
||||
if (r8->unk_04[i - 1] == 0)
|
||||
if (gname->child_sprite_gender[i - 1] == 0)
|
||||
{
|
||||
sub_811BC68(r7, i);
|
||||
DespawnGroupMember(group, i);
|
||||
}
|
||||
else if (sub_811B58C(r7, i, x, y) == FALSE && sub_811B58C(r7, i, x2, y2) == FALSE)
|
||||
else if (IsUnionRoomPlayerFacingTileAt(group, i, x, y) == FALSE && IsUnionRoomPlayerFacingTileAt(group, i, x2, y2) == FALSE)
|
||||
{
|
||||
sub_811BBE0(r7, i, GetUnionRoomPlayerGraphicsId((r8->unk_04[i - 1] >> 3) & 1, r8->unk_04[i - 1] & 7), r8);
|
||||
SpawnGroupMember(group, i, GetUnionRoomPlayerGraphicsId((gname->child_sprite_gender[i - 1] >> 3) & 1, gname->child_sprite_gender[i - 1] & 7), gname);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_811BDA8(u32 r5, struct GFtgtGname * r4)
|
||||
static void SpawnGroupLeaderAndMembers(u32 group, struct GFtgtGname * gname)
|
||||
{
|
||||
u32 i;
|
||||
switch (r4->unk_0a_0)
|
||||
switch (gname->activity)
|
||||
{
|
||||
case 0x40:
|
||||
case 0x54:
|
||||
sub_811B8BC(r5, r4->playerGender, r4->unk_00.playerTrainerId[0]);
|
||||
SpawnGroupLeader(group, gname->playerGender, gname->unk_00.playerTrainerId[0]);
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
sub_811BC68(r5, i);
|
||||
DespawnGroupMember(group, i);
|
||||
}
|
||||
break;
|
||||
case 0x41:
|
||||
@@ -559,70 +561,70 @@ static void sub_811BDA8(u32 r5, struct GFtgtGname * r4)
|
||||
case 0x51:
|
||||
case 0x52:
|
||||
case 0x53:
|
||||
sub_811B90C(r5);
|
||||
sub_811BCA0(r5, r4);
|
||||
DespawnGroupLeader(group);
|
||||
AssembleGroup(group, gname);
|
||||
break;
|
||||
default:
|
||||
AGB_ASSERT_EX(0, ABSPATH("rfu_union_tool.c"), 979)
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_811BE6C(u32 r5, struct GFtgtGname * unused)
|
||||
static void DespawnGroupLeaderAndMembers(u32 group, struct GFtgtGname * gname)
|
||||
{
|
||||
s32 i;
|
||||
sub_811B90C(r5);
|
||||
DespawnGroupLeader(group);
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
sub_811BC68(r5, i);
|
||||
DespawnGroupMember(group, i);
|
||||
}
|
||||
}
|
||||
|
||||
static void UpdateUnionRoomPlayerSprites(struct UnkStruct_URoom *r0)
|
||||
static void UpdateUnionRoomPlayerSprites(struct UnkStruct_URoom * groups)
|
||||
{
|
||||
s32 i;
|
||||
struct UnkStruct_x20 * r4;
|
||||
struct UnkStruct_x20 * x20_p;
|
||||
sUnionObjRefreshTimer = 0;
|
||||
for (i = 0, r4 = r0->field_0->arr; i < 8; i++)
|
||||
for (i = 0, x20_p = groups->field_0->arr; i < 8; i++)
|
||||
{
|
||||
if (r4[i].field_1A_0 == 1)
|
||||
if (x20_p[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN)
|
||||
{
|
||||
sub_811BDA8(i, &r4[i].unk.gname);
|
||||
SpawnGroupLeaderAndMembers(i, &x20_p[i].gname_uname.gname);
|
||||
}
|
||||
else if (r4[i].field_1A_0 == 2)
|
||||
else if (x20_p[i].groupScheduledAnim == UNION_ROOM_SPAWN_OUT)
|
||||
{
|
||||
sub_811BE6C(i, &r4[i].unk.gname);
|
||||
DespawnGroupLeaderAndMembers(i, &x20_p[i].gname_uname.gname);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_811BECC(struct UnkStruct_URoom *unused)
|
||||
void ScheduleUnionRoomPlayerRefresh(struct UnkStruct_URoom *uroom_p)
|
||||
{
|
||||
sUnionObjRefreshTimer = 300;
|
||||
}
|
||||
|
||||
void sub_811BEDC(struct UnkStruct_URoom *r2)
|
||||
void HandleUnionRoomPlayerRefresh(struct UnkStruct_URoom *uroom_p)
|
||||
{
|
||||
if (++sUnionObjRefreshTimer > 300)
|
||||
{
|
||||
UpdateUnionRoomPlayerSprites(r2);
|
||||
UpdateUnionRoomPlayerSprites(uroom_p);
|
||||
}
|
||||
}
|
||||
|
||||
bool32 sub_811BF00(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3)
|
||||
bool32 RfuUnionTool_GetGroupAndMemberInFrontOfPlayer(struct UnkStruct_Main0 *main0_p, s16 *member_p, s16 *group_p, u8 *spriteIds)
|
||||
{
|
||||
s16 x, y;
|
||||
s32 i, j;
|
||||
struct UnkStruct_x20 * r4;
|
||||
struct UnkStruct_x20 * x20_p;
|
||||
if (!is_walking_or_running())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
|
||||
for (i = 0, r4 = arg0->arr; i < 8; i++)
|
||||
for (i = 0, x20_p = main0_p->arr; i < 8; i++)
|
||||
{
|
||||
for (j = 0; j < 5; j++)
|
||||
{
|
||||
s32 r3 = 5 * i + j;
|
||||
s32 objId = 5 * i + j;
|
||||
if (x != sUnionPartnerCoords[i][0] + sFacingDirectionOffsets[j][0] + 7)
|
||||
{
|
||||
continue;
|
||||
@@ -631,33 +633,33 @@ bool32 sub_811BF00(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (sub_806916C(r3 - 0x38) != 0)
|
||||
if (RfuUnionObjectIsInvisible(objId - 0x38) != 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (sub_8069294(r3 - 0x38) != 0)
|
||||
if (RfuUnionObjectIsWarping(objId - 0x38) != 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (r4[i].field_1A_0 != 1)
|
||||
if (x20_p[i].groupScheduledAnim != UNION_ROOM_SPAWN_IN)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
sub_811C008(j, i, sOppositeFacingDirection[GetPlayerFacingDirection()]);
|
||||
*arg1 = j;
|
||||
*arg2 = i;
|
||||
UnionPartnerObjectSetFacing(j, i, sOppositeFacingDirection[GetPlayerFacingDirection()]);
|
||||
*member_p = j;
|
||||
*group_p = i;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void sub_811C008(s32 arg0, s32 arg1, u8 arg2)
|
||||
static void UnionPartnerObjectSetFacing(s32 member, s32 group, u8 direction)
|
||||
{
|
||||
sub_8069058(5 * arg1 - 0x38 + arg0, arg2);
|
||||
TurnObjectEvent(5 * group - 0x38 + member, direction);
|
||||
}
|
||||
|
||||
void sub_811C028(u32 arg0, u32 arg1, struct UnkStruct_Main0 *arg2)
|
||||
void UpdateUnionGroupMemberFacing(u32 member, u32 group, struct UnkStruct_Main0 *main0_p)
|
||||
{
|
||||
return sub_811C008(arg0, arg1, sub_811BBA0(arg0, arg1, &arg2->arr[arg1].unk.gname));
|
||||
return UnionPartnerObjectSetFacing(member, group, UnionPartnerObjectGetFacing(member, group, &main0_p->arr[group].gname_uname.gname));
|
||||
}
|
||||
|
||||
+3
-3
@@ -856,7 +856,7 @@ void sub_80DA634(u8 taskId)
|
||||
gTasks[taskId].data[0] = 1;
|
||||
break;
|
||||
case 1:
|
||||
sub_800AB9C();
|
||||
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
|
||||
gTasks[taskId].data[0] = 2;
|
||||
break;
|
||||
case 2:
|
||||
@@ -890,7 +890,7 @@ void sub_80DA634(u8 taskId)
|
||||
break;
|
||||
case 7:
|
||||
ClearContinueGameWarpStatus2();
|
||||
sub_800AB9C();
|
||||
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
|
||||
gTasks[taskId].data[0] = 8;
|
||||
break;
|
||||
case 8:
|
||||
@@ -901,7 +901,7 @@ void sub_80DA634(u8 taskId)
|
||||
}
|
||||
break;
|
||||
case 9:
|
||||
sub_800AB9C();
|
||||
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
|
||||
gTasks[taskId].data[0] = 10;
|
||||
break;
|
||||
case 10:
|
||||
|
||||
+1
-1
@@ -1193,7 +1193,7 @@ bool8 ScrCmd_turnvobject(struct ScriptContext *ctx)
|
||||
u8 v1 = ScriptReadByte(ctx);
|
||||
u8 direction = ScriptReadByte(ctx);
|
||||
|
||||
sub_8069058(v1, direction);
|
||||
TurnObjectEvent(v1, direction);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -506,7 +506,7 @@ u8 *GetRamScript(u8 objectId, u8 *script)
|
||||
}
|
||||
}
|
||||
|
||||
bool32 sub_8069DFC(void)
|
||||
bool32 ValidateRamScript(void)
|
||||
{
|
||||
struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data;
|
||||
if (scriptData->magic != RAM_SCRIPT_MAGIC)
|
||||
|
||||
+21
-7
@@ -176,7 +176,7 @@ static const struct SpriteTemplate sWakeSpriteTemplate = {
|
||||
SpriteCB_Wake
|
||||
};
|
||||
|
||||
void ScrSpecial_SeagallopFerry(void)
|
||||
void DoSeagallopFerryScene(void)
|
||||
{
|
||||
SetVBlankCallback(NULL);
|
||||
HelpSystem_Disable();
|
||||
@@ -459,7 +459,8 @@ static bool8 GetDirectionOfTravel(void)
|
||||
return (sTravelDirectionMatrix[gSpecialVar_0x8004] >> gSpecialVar_0x8006) & 1;
|
||||
}
|
||||
|
||||
u8 sub_8147500(void)
|
||||
// For "All aboard SEAGALLOP HI-SPEED ##" text
|
||||
u8 GetSeagallopNumber(void)
|
||||
{
|
||||
u16 originId, destId;
|
||||
|
||||
@@ -478,21 +479,34 @@ u8 sub_8147500(void)
|
||||
if (originId == SEAGALLOP_BIRTH_ISLAND || destId == SEAGALLOP_BIRTH_ISLAND)
|
||||
return 12;
|
||||
|
||||
if ((originId == SEAGALLOP_ONE_ISLAND || originId == SEAGALLOP_TWO_ISLAND || originId == SEAGALLOP_THREE_ISLAND) && (destId == SEAGALLOP_ONE_ISLAND || destId == SEAGALLOP_TWO_ISLAND || destId == SEAGALLOP_THREE_ISLAND))
|
||||
if ((originId == SEAGALLOP_ONE_ISLAND
|
||||
|| originId == SEAGALLOP_TWO_ISLAND
|
||||
|| originId == SEAGALLOP_THREE_ISLAND)
|
||||
&& (destId == SEAGALLOP_ONE_ISLAND
|
||||
|| destId == SEAGALLOP_TWO_ISLAND
|
||||
|| destId == SEAGALLOP_THREE_ISLAND))
|
||||
return 2;
|
||||
|
||||
if ((originId == SEAGALLOP_FOUR_ISLAND || originId == SEAGALLOP_FIVE_ISLAND) && (destId == SEAGALLOP_FOUR_ISLAND || destId == SEAGALLOP_FIVE_ISLAND))
|
||||
if ((originId == SEAGALLOP_FOUR_ISLAND
|
||||
|| originId == SEAGALLOP_FIVE_ISLAND)
|
||||
&& (destId == SEAGALLOP_FOUR_ISLAND
|
||||
|| destId == SEAGALLOP_FIVE_ISLAND))
|
||||
return 3;
|
||||
|
||||
if ((originId == SEAGALLOP_SIX_ISLAND || originId == SEAGALLOP_SEVEN_ISLAND) && (destId == SEAGALLOP_SIX_ISLAND || destId == SEAGALLOP_SEVEN_ISLAND))
|
||||
if ((originId == SEAGALLOP_SIX_ISLAND
|
||||
|| originId == SEAGALLOP_SEVEN_ISLAND)
|
||||
&& (destId == SEAGALLOP_SIX_ISLAND
|
||||
|| destId == SEAGALLOP_SEVEN_ISLAND))
|
||||
return 5;
|
||||
|
||||
return 6;
|
||||
}
|
||||
|
||||
bool8 sub_8147594(void)
|
||||
bool8 IsPlayerLeftOfVermilionSailor(void)
|
||||
{
|
||||
if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(VERMILION_CITY) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(VERMILION_CITY) && gSaveBlock1Ptr->pos.x < 24)
|
||||
if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(VERMILION_CITY)
|
||||
&& gSaveBlock1Ptr->location.mapNum == MAP_NUM(VERMILION_CITY)
|
||||
&& gSaveBlock1Ptr->pos.x < 24)
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
#include "global.h"
|
||||
#include "decompress.h"
|
||||
#include "util.h"
|
||||
|
||||
static void SmokescreenImpact_Callback(struct Sprite * sprite);
|
||||
|
||||
extern const struct CompressedSpriteSheet gSmokescreenImpactSpriteSheet;
|
||||
extern const struct CompressedSpritePalette gSmokescreenImpactSpritePalette;
|
||||
extern const struct SpriteTemplate gSmokescreenImpactSpriteTemplate;
|
||||
|
||||
u8 SmokescreenImpact(s16 x, s16 y, u8 a3)
|
||||
{
|
||||
u8 mainSpriteId;
|
||||
u8 spriteId1, spriteId2, spriteId3, spriteId4;
|
||||
struct Sprite *mainSprite;
|
||||
|
||||
if (GetSpriteTileStartByTag(gSmokescreenImpactSpriteSheet.tag) == 0xFFFF)
|
||||
{
|
||||
LoadCompressedSpriteSheetUsingHeap(&gSmokescreenImpactSpriteSheet);
|
||||
LoadCompressedSpritePaletteUsingHeap(&gSmokescreenImpactSpritePalette);
|
||||
}
|
||||
|
||||
mainSpriteId = CreateInvisibleSpriteWithCallback(SmokescreenImpact_Callback);
|
||||
mainSprite = &gSprites[mainSpriteId];
|
||||
mainSprite->data[1] = a3;
|
||||
|
||||
spriteId1 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x - 16, y - 16, 2);
|
||||
gSprites[spriteId1].data[0] = mainSpriteId;
|
||||
mainSprite->data[0]++;
|
||||
AnimateSprite(&gSprites[spriteId1]);
|
||||
|
||||
spriteId2 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x, y - 16, 2);
|
||||
gSprites[spriteId2].data[0] = mainSpriteId;
|
||||
mainSprite->data[0]++;
|
||||
StartSpriteAnim(&gSprites[spriteId2], 1);
|
||||
AnimateSprite(&gSprites[spriteId2]);
|
||||
|
||||
spriteId3 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x - 16, y, 2);
|
||||
gSprites[spriteId3].data[0] = mainSpriteId;
|
||||
mainSprite->data[0]++;
|
||||
StartSpriteAnim(&gSprites[spriteId3], 2);
|
||||
AnimateSprite(&gSprites[spriteId3]);
|
||||
|
||||
spriteId4 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x, y, 2);
|
||||
gSprites[spriteId4].data[0] = mainSpriteId;
|
||||
mainSprite->data[0]++;
|
||||
StartSpriteAnim(&gSprites[spriteId4], 3);
|
||||
AnimateSprite(&gSprites[spriteId4]);
|
||||
|
||||
return mainSpriteId;
|
||||
}
|
||||
|
||||
static void SmokescreenImpact_Callback(struct Sprite *sprite)
|
||||
{
|
||||
if (!sprite->data[0])
|
||||
{
|
||||
FreeSpriteTilesByTag(gSmokescreenImpactSpriteSheet.tag);
|
||||
FreeSpritePaletteByTag(gSmokescreenImpactSpritePalette.tag);
|
||||
if (!sprite->data[1])
|
||||
DestroySprite(sprite);
|
||||
else
|
||||
sprite->callback = SpriteCallbackDummy;
|
||||
}
|
||||
}
|
||||
|
||||
void SpriteCB_DestroySprite(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->animEnded)
|
||||
{
|
||||
gSprites[sprite->data[0]].data[0]--;
|
||||
DestroySprite(sprite);
|
||||
}
|
||||
}
|
||||
+60
-60
@@ -94,17 +94,17 @@ typedef void (*AffineAnimCmdFunc)(u8 matrixNum, struct Sprite *);
|
||||
#define DUMMY_OAM_DATA \
|
||||
{ \
|
||||
160, /* Y (off-screen) */ \
|
||||
0, \
|
||||
0, \
|
||||
0, \
|
||||
0, \
|
||||
0, \
|
||||
ST_OAM_AFFINE_OFF, \
|
||||
ST_OAM_OBJ_NORMAL, \
|
||||
FALSE, \
|
||||
ST_OAM_4BPP, \
|
||||
ST_OAM_SQUARE, \
|
||||
304, /* X */ \
|
||||
0, \
|
||||
0, \
|
||||
0, \
|
||||
ST_OAM_SIZE_0, \
|
||||
0x000, \
|
||||
3, /* lowest priority */ \
|
||||
0, \
|
||||
0x0, \
|
||||
0 \
|
||||
}
|
||||
|
||||
@@ -250,47 +250,47 @@ static const AffineAnimCmdFunc sAffineAnimCmdFuncs[] =
|
||||
AffineAnimCmd_frame,
|
||||
};
|
||||
|
||||
static const s32 sUnknown_082EC6F4[3][4][2] =
|
||||
static const s32 sOamDimensionsCopy[3][4][2] =
|
||||
{
|
||||
{
|
||||
{8, 8},
|
||||
{0x10, 0x10},
|
||||
{0x20, 0x20},
|
||||
{0x40, 0x40},
|
||||
[ST_OAM_SQUARE] = {
|
||||
[ST_OAM_SIZE_0] = { 8, 8}, // SPRITE_SIZE_8x8
|
||||
[ST_OAM_SIZE_1] = {16, 16}, // SPRITE_SIZE_16x16
|
||||
[ST_OAM_SIZE_2] = {32, 32}, // SPRITE_SIZE_32x32
|
||||
[ST_OAM_SIZE_3] = {64, 64}, // SPRITE_SIZE_64x64
|
||||
},
|
||||
{
|
||||
{0x10, 8},
|
||||
{0x20, 8},
|
||||
{0x20, 0x10},
|
||||
{0x40, 0x20},
|
||||
[ST_OAM_H_RECTANGLE] = {
|
||||
[ST_OAM_SIZE_0] = {16, 8}, // SPRITE_SIZE_16x8
|
||||
[ST_OAM_SIZE_1] = {32, 8}, // SPRITE_SIZE_32x8
|
||||
[ST_OAM_SIZE_2] = {32, 16}, // SPRITE_SIZE_32x16
|
||||
[ST_OAM_SIZE_3] = {64, 32}, // SPRITE_SIZE_64x32
|
||||
},
|
||||
{
|
||||
{8, 0x10},
|
||||
{8, 0x20},
|
||||
{0x10, 0x20},
|
||||
{0x20, 0x40},
|
||||
[ST_OAM_V_RECTANGLE] = {
|
||||
[ST_OAM_SIZE_0] = { 8, 16}, // SPRITE_SIZE_8x16
|
||||
[ST_OAM_SIZE_1] = { 8, 32}, // SPRITE_SIZE_8x32
|
||||
[ST_OAM_SIZE_2] = {16, 32}, // SPRITE_SIZE_16x32
|
||||
[ST_OAM_SIZE_3] = {32, 64}, // SPRITE_SIZE_32x64
|
||||
},
|
||||
};
|
||||
|
||||
static const struct OamDimensions sOamDimensions[3][4] =
|
||||
{
|
||||
{ // square
|
||||
{ 8, 8 },
|
||||
{ 16, 16 },
|
||||
{ 32, 32 },
|
||||
{ 64, 64 },
|
||||
[ST_OAM_SQUARE] = {
|
||||
[ST_OAM_SIZE_0] = { 8, 8}, // SPRITE_SIZE_8x8
|
||||
[ST_OAM_SIZE_1] = {16, 16}, // SPRITE_SIZE_16x16
|
||||
[ST_OAM_SIZE_2] = {32, 32}, // SPRITE_SIZE_32x32
|
||||
[ST_OAM_SIZE_3] = {64, 64}, // SPRITE_SIZE_64x64
|
||||
},
|
||||
{ // horizontal rectangle
|
||||
{ 16, 8 },
|
||||
{ 32, 8 },
|
||||
{ 32, 16 },
|
||||
{ 64, 32 },
|
||||
[ST_OAM_H_RECTANGLE] = {
|
||||
[ST_OAM_SIZE_0] = {16, 8}, // SPRITE_SIZE_16x8
|
||||
[ST_OAM_SIZE_1] = {32, 8}, // SPRITE_SIZE_32x8
|
||||
[ST_OAM_SIZE_2] = {32, 16}, // SPRITE_SIZE_32x16
|
||||
[ST_OAM_SIZE_3] = {64, 32}, // SPRITE_SIZE_64x32
|
||||
},
|
||||
{ // vertical rectangle
|
||||
{ 8, 16 },
|
||||
{ 8, 32 },
|
||||
{ 16, 32 },
|
||||
{ 32, 64 },
|
||||
[ST_OAM_V_RECTANGLE] = {
|
||||
[ST_OAM_SIZE_0] = { 8, 16}, // SPRITE_SIZE_8x16
|
||||
[ST_OAM_SIZE_1] = { 8, 32}, // SPRITE_SIZE_8x32
|
||||
[ST_OAM_SIZE_2] = {16, 32}, // SPRITE_SIZE_16x32
|
||||
[ST_OAM_SIZE_3] = {32, 64}, // SPRITE_SIZE_32x64
|
||||
},
|
||||
};
|
||||
|
||||
@@ -1222,43 +1222,43 @@ u8 GetSpriteMatrixNum(struct Sprite *sprite)
|
||||
return matrixNum;
|
||||
}
|
||||
|
||||
void sub_8007FFC(struct Sprite* sprite, s16 a2, s16 a3)
|
||||
void obj_pos2_update_enable(struct Sprite* sprite, s16 xmod, s16 ymod)
|
||||
{
|
||||
sprite->data[6] = a2;
|
||||
sprite->data[7] = a3;
|
||||
sprite->data[6] = xmod;
|
||||
sprite->data[7] = ymod;
|
||||
sprite->flags_f = 1;
|
||||
}
|
||||
|
||||
s32 sub_800800C(s32 a0, s32 a1, s32 a2)
|
||||
static s32 affine_get_new_pos2(s32 baseDim, s32 xformed, s32 modifier)
|
||||
{
|
||||
s32 subResult, var1;
|
||||
s32 subResult, shiftResult;
|
||||
|
||||
subResult = a1 - a0;
|
||||
subResult = xformed - baseDim;
|
||||
if (subResult < 0)
|
||||
var1 = -(subResult) >> 9;
|
||||
shiftResult = -(subResult) >> 9;
|
||||
else
|
||||
var1 = -(subResult >> 9);
|
||||
return a2 - ((u32)(a2 * a1) / (u32)(a0) + var1);
|
||||
shiftResult = -(subResult >> 9);
|
||||
return modifier - ((u32)(modifier * xformed) / (u32)(baseDim) + shiftResult);
|
||||
}
|
||||
|
||||
void obj_update_pos2(struct Sprite *sprite, s32 a1, s32 a2)
|
||||
static void obj_update_pos2(struct Sprite *sprite, s32 xmod, s32 ymod)
|
||||
{
|
||||
s32 var0, var1, var2;
|
||||
s32 dim, baseDim, xFormed;
|
||||
|
||||
u32 matrixNum = sprite->oam.matrixNum;
|
||||
if (a1 != 0x800)
|
||||
if (xmod != 0x800)
|
||||
{
|
||||
var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][0];
|
||||
var1 = var0 << 8;
|
||||
var2 = (var0 << 16) / gOamMatrices[matrixNum].a;
|
||||
sprite->pos2.x = sub_800800C(var1, var2, a1);
|
||||
dim = sOamDimensionsCopy[sprite->oam.shape][sprite->oam.size][0];
|
||||
baseDim = dim << 8;
|
||||
xFormed = (dim << 16) / gOamMatrices[matrixNum].a;
|
||||
sprite->pos2.x = affine_get_new_pos2(baseDim, xFormed, xmod);
|
||||
}
|
||||
if (a2 != 0x800)
|
||||
if (ymod != 0x800)
|
||||
{
|
||||
var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][1];
|
||||
var1 = var0 << 8;
|
||||
var2 = (var0 << 16) / gOamMatrices[matrixNum].d;
|
||||
sprite->pos2.y = sub_800800C(var1, var2, a2);
|
||||
dim = sOamDimensionsCopy[sprite->oam.shape][sprite->oam.size][1];
|
||||
baseDim = dim << 8;
|
||||
xFormed = (dim << 16) / gOamMatrices[matrixNum].d;
|
||||
sprite->pos2.y = affine_get_new_pos2(baseDim, xFormed, ymod);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -1304,7 +1304,7 @@ static void InitWindowTemplatesAndPals(void)
|
||||
LoadPalette(gTMCaseMainWindowPalette, 0xA0, 0x20);
|
||||
LoadPalette(sPal3Override, 0xF6, 0x04);
|
||||
LoadPalette(sPal3Override, 0xD6, 0x04);
|
||||
sub_8107D38(0xc0, 0x01);
|
||||
ListMenuLoadStdPalAt(0xc0, 0x01);
|
||||
for (i = 0; i < 9; i++)
|
||||
FillWindowPixelBuffer(i, 0x00);
|
||||
PutWindowTilemap(0);
|
||||
|
||||
+29
-52
@@ -1,41 +1,22 @@
|
||||
#include "global.h"
|
||||
#include "palette.h"
|
||||
#include "gflib.h"
|
||||
#include "task.h"
|
||||
#include "decompress.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "malloc.h"
|
||||
#include "bg.h"
|
||||
#include "text.h"
|
||||
#include "window.h"
|
||||
#include "librfu.h"
|
||||
#include "text_window.h"
|
||||
#include "evolution_scene.h"
|
||||
#include "pokemon_icon.h"
|
||||
#include "pokedex.h"
|
||||
#include "mail_data.h"
|
||||
#include "graphics.h"
|
||||
#include "link.h"
|
||||
#include "random.h"
|
||||
#include "save.h"
|
||||
#include "load_save.h"
|
||||
#include "quest_log.h"
|
||||
#include "field_fadetransition.h"
|
||||
#include "mevent.h"
|
||||
#include "help_system.h"
|
||||
#include "link_rfu.h"
|
||||
#include "cable_club.h"
|
||||
#include "data.h"
|
||||
#include "sound.h"
|
||||
#include "string_util.h"
|
||||
#include "strings.h"
|
||||
#include "menu.h"
|
||||
#include "overworld.h"
|
||||
#include "battle_anim.h"
|
||||
#include "pokeball.h"
|
||||
#include "party_menu.h"
|
||||
#include "util.h"
|
||||
#include "daycare.h"
|
||||
#include "script.h"
|
||||
#include "event_data.h"
|
||||
#include "battle_interface.h"
|
||||
#include "pokemon_summary_screen.h"
|
||||
@@ -43,11 +24,7 @@
|
||||
#include "new_menu_helpers.h"
|
||||
#include "trade.h"
|
||||
#include "trade_scene.h"
|
||||
#include "constants/species.h"
|
||||
#include "constants/items.h"
|
||||
#include "constants/easy_chat.h"
|
||||
#include "constants/songs.h"
|
||||
#include "constants/region_map.h"
|
||||
#include "constants/moves.h"
|
||||
|
||||
struct TradeMenuResources
|
||||
@@ -788,9 +765,9 @@ static void sub_804C728(void)
|
||||
|
||||
if (gWirelessCommType)
|
||||
{
|
||||
sub_800B1F4();
|
||||
SetWirelessCommType1();
|
||||
OpenLink();
|
||||
sub_80FBB20();
|
||||
LinkRfu_CreateIdleTask();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -833,14 +810,14 @@ static void sub_804C728(void)
|
||||
case 4:
|
||||
if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE)
|
||||
{
|
||||
sub_80FBB4C();
|
||||
LinkRfu_DestroyIdleTask();
|
||||
CalculatePlayerPartyCount();
|
||||
gMain.state++;
|
||||
sTradeMenuResourcesPtr->unk_A8 = 0;
|
||||
if (gWirelessCommType)
|
||||
{
|
||||
sub_80FA484(TRUE);
|
||||
sub_800AB9C();
|
||||
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1236,7 +1213,7 @@ static void sub_804D548(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_800AA80(32);
|
||||
Link_StartSend5FFFwithParam(32);
|
||||
sTradeMenuResourcesPtr->unk_6F = 13;
|
||||
}
|
||||
}
|
||||
@@ -2027,11 +2004,11 @@ static void sub_804E908(void)
|
||||
{
|
||||
if (gWirelessCommType)
|
||||
{
|
||||
sub_800AB9C();
|
||||
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_800AA80(12);
|
||||
Link_StartSend5FFFwithParam(12);
|
||||
}
|
||||
|
||||
sTradeMenuResourcesPtr->unk_6F = 12;
|
||||
@@ -2067,7 +2044,7 @@ static void sub_804E9C0(void)
|
||||
{
|
||||
if (!sub_80FA484(FALSE))
|
||||
{
|
||||
sub_800AB9C();
|
||||
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
|
||||
sTradeMenuResourcesPtr->unk_6F = 13;
|
||||
}
|
||||
}
|
||||
@@ -2763,30 +2740,30 @@ static bool32 IsDeoxysOrMewUntradable(u16 species, bool8 isObedientBitSet)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
int GetUnionRoomTradeMessageId(struct GFtgtGnameSub a0, struct GFtgtGnameSub a1, u16 species1, u16 species2, u8 type, u16 species3, u8 isObedientBitSet)
|
||||
int GetUnionRoomTradeMessageId(struct GFtgtGnameSub playerSub, struct GFtgtGnameSub partnerSub, u16 species1, u16 species2, u8 type, u16 species3, u8 isObedientBitSet)
|
||||
{
|
||||
u8 r9 = a0.hasNationalDex;
|
||||
u8 r4 = a0.isChampion;
|
||||
u8 r10 = a1.hasNationalDex;
|
||||
u8 r0 = a1.isChampion;
|
||||
u8 r1 = a1.unk_01_2;
|
||||
u8 r2;
|
||||
u8 playerHasNationalDex = playerSub.hasNationalDex;
|
||||
u8 playerIsChampion = playerSub.isChampion;
|
||||
u8 partnerHasNationalDex = partnerSub.hasNationalDex;
|
||||
u8 partnerIsChampion = partnerSub.isChampion;
|
||||
u8 partnerVersion = partnerSub.version;
|
||||
bool8 isNotFRLG;
|
||||
|
||||
if (r1 == VERSION_FIRE_RED || r1 == VERSION_LEAF_GREEN)
|
||||
if (partnerVersion == VERSION_FIRE_RED || partnerVersion == VERSION_LEAF_GREEN)
|
||||
{
|
||||
r2 = 0;
|
||||
isNotFRLG = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
r2 = 1;
|
||||
isNotFRLG = TRUE;
|
||||
}
|
||||
if (r2)
|
||||
if (isNotFRLG)
|
||||
{
|
||||
if (!r4)
|
||||
if (!playerIsChampion)
|
||||
{
|
||||
return 8;
|
||||
}
|
||||
else if (!r0)
|
||||
else if (!partnerIsChampion)
|
||||
{
|
||||
return 9;
|
||||
}
|
||||
@@ -2817,7 +2794,7 @@ int GetUnionRoomTradeMessageId(struct GFtgtGnameSub a0, struct GFtgtGnameSub a1,
|
||||
return 3;
|
||||
}
|
||||
|
||||
if (!r9)
|
||||
if (!playerHasNationalDex)
|
||||
{
|
||||
if (species1 == SPECIES_EGG)
|
||||
{
|
||||
@@ -2835,7 +2812,7 @@ int GetUnionRoomTradeMessageId(struct GFtgtGnameSub a0, struct GFtgtGnameSub a1,
|
||||
}
|
||||
}
|
||||
|
||||
if (!r10 && species1 > SPECIES_MEW)
|
||||
if (!partnerHasNationalDex && species1 > SPECIES_MEW)
|
||||
{
|
||||
return 7;
|
||||
}
|
||||
@@ -2843,11 +2820,11 @@ int GetUnionRoomTradeMessageId(struct GFtgtGnameSub a0, struct GFtgtGnameSub a1,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int CanRegisterMonForTradingBoard(struct GFtgtGnameSub a0, u16 species, u16 a2, u8 a3)
|
||||
int CanRegisterMonForTradingBoard(struct GFtgtGnameSub playerSub, u16 species2, u16 species, u8 obedience)
|
||||
{
|
||||
u8 canTradeEggAndNational = a0.hasNationalDex;
|
||||
u8 canTradeEggAndNational = playerSub.hasNationalDex;
|
||||
|
||||
if (IsDeoxysOrMewUntradable(a2, a3))
|
||||
if (IsDeoxysOrMewUntradable(species, obedience))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
@@ -2857,12 +2834,12 @@ int CanRegisterMonForTradingBoard(struct GFtgtGnameSub a0, u16 species, u16 a2,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (species == SPECIES_EGG)
|
||||
if (species2 == SPECIES_EGG)
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (species > SPECIES_MEW && species != SPECIES_EGG)
|
||||
if (species2 > SPECIES_MEW && species2 != SPECIES_EGG)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
+6
-6
@@ -2556,7 +2556,7 @@ static void sub_8053E8C(void)
|
||||
DrawTextOnTradeWindow(0, gStringVar4, 0);
|
||||
break;
|
||||
case 1:
|
||||
sub_800AB9C();
|
||||
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
|
||||
gMain.state = 100;
|
||||
sTradeData->timer = 0;
|
||||
break;
|
||||
@@ -2594,7 +2594,7 @@ static void sub_8053E8C(void)
|
||||
}
|
||||
if (gWirelessCommType)
|
||||
{
|
||||
sub_8144714(2, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
|
||||
MEvent_RecordIdOfWonderCardSenderByEventType(2, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
|
||||
}
|
||||
SetContinueGameWarpStatusToDynamicWarp();
|
||||
sub_80DA3AC();
|
||||
@@ -2641,7 +2641,7 @@ static void sub_8053E8C(void)
|
||||
case 41:
|
||||
if (sTradeData->timer == 0)
|
||||
{
|
||||
sub_800AB9C();
|
||||
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
|
||||
gMain.state = 42;
|
||||
}
|
||||
else
|
||||
@@ -2660,7 +2660,7 @@ static void sub_8053E8C(void)
|
||||
if (++sTradeData->timer > 60)
|
||||
{
|
||||
gMain.state++;
|
||||
sub_800AB9C();
|
||||
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
@@ -2682,11 +2682,11 @@ static void sub_8053E8C(void)
|
||||
{
|
||||
if (gWirelessCommType && gMain.savedCallback == CB2_ReturnFromLinkTrade)
|
||||
{
|
||||
sub_800AB9C();
|
||||
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_800AAC0();
|
||||
Link_TryStartSend5FFF();
|
||||
}
|
||||
gMain.state++;
|
||||
}
|
||||
|
||||
+1
-1
@@ -590,7 +590,7 @@ static void Task_TrainerCard(u8 taskId)
|
||||
}
|
||||
break;
|
||||
case 15:
|
||||
sub_800AAC0();
|
||||
Link_TryStartSend5FFF();
|
||||
DrawDialogueFrame(0, 1);
|
||||
AddTextPrinterParameterized(0, 2, gText_WaitingTrainerFinishReading, 0, 1, TEXT_SPEED_FF, 0);
|
||||
CopyWindowToVram(0, 3);
|
||||
|
||||
+1390
-1248
File diff suppressed because it is too large
Load Diff
+27
-26
@@ -13,15 +13,16 @@
|
||||
#include "text_window.h"
|
||||
#include "union_room.h"
|
||||
#include "window.h"
|
||||
#include "constants/union_room.h"
|
||||
|
||||
struct UnkStruct_203B08C
|
||||
struct UnionRoomBattleWork
|
||||
{
|
||||
s16 a0;
|
||||
s16 textState;
|
||||
};
|
||||
|
||||
static EWRAM_DATA struct UnkStruct_203B08C * gUnknown_203B08C = NULL;
|
||||
static EWRAM_DATA struct UnionRoomBattleWork * sWork = NULL;
|
||||
|
||||
static const struct BgTemplate gUnknown_8457194[] = {
|
||||
static const struct BgTemplate sBgTemplates[] = {
|
||||
{
|
||||
.bg = 0,
|
||||
.charBaseIndex = 3,
|
||||
@@ -29,7 +30,7 @@ static const struct BgTemplate gUnknown_8457194[] = {
|
||||
}
|
||||
};
|
||||
|
||||
static const struct WindowTemplate gUnknown_8457198[] = {
|
||||
static const struct WindowTemplate sWindowTemplates[] = {
|
||||
{
|
||||
.bg = 0,
|
||||
.tilemapLeft = 2,
|
||||
@@ -43,10 +44,10 @@ static const struct WindowTemplate gUnknown_8457198[] = {
|
||||
|
||||
static const u8 gUnknown_84571A8[] = {1, 2, 3};
|
||||
|
||||
static void sub_811C04C(void)
|
||||
static void SetUpPartiesAndStartBattle(void)
|
||||
{
|
||||
s32 i;
|
||||
sub_81173C0(BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER);
|
||||
StartUnionRoomBattle(BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER);
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
gEnemyParty[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1];
|
||||
@@ -65,7 +66,7 @@ static void sub_811C04C(void)
|
||||
SetMainCallback2(CB2_InitBattle);
|
||||
}
|
||||
|
||||
static void sub_811C0E0(u8 windowId, const u8 * str, u8 x, u8 y, s32 speed)
|
||||
static void UnionRoomBattle_CreateTextPrinter(u8 windowId, const u8 * str, u8 x, u8 y, s32 speed)
|
||||
{
|
||||
s32 letterSpacing = 1;
|
||||
s32 lineSpacing = 1;
|
||||
@@ -73,13 +74,13 @@ static void sub_811C0E0(u8 windowId, const u8 * str, u8 x, u8 y, s32 speed)
|
||||
AddTextPrinterParameterized4(windowId, 3, x, y, letterSpacing, lineSpacing, gUnknown_84571A8, speed, str);
|
||||
}
|
||||
|
||||
static bool32 sub_811C150(s16 * state, const u8 * str, s32 speed)
|
||||
static bool32 UnionRoomBattle_PrintTextOnWindow0(s16 * state, const u8 * str, s32 speed)
|
||||
{
|
||||
switch (*state)
|
||||
{
|
||||
case 0:
|
||||
DrawTextBorderOuter(0, 0x001, 0xD);
|
||||
sub_811C0E0(0, str, 0, 2, speed);
|
||||
UnionRoomBattle_CreateTextPrinter(0, str, 0, 2, speed);
|
||||
PutWindowTilemap(0);
|
||||
CopyWindowToVram(0, 3);
|
||||
(*state)++;
|
||||
@@ -95,27 +96,27 @@ static bool32 sub_811C150(s16 * state, const u8 * str, s32 speed)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void sub_811C1B4(void)
|
||||
static void VBlankCB_UnionRoomBattle(void)
|
||||
{
|
||||
LoadOam();
|
||||
ProcessSpriteCopyRequests();
|
||||
TransferPlttBuffer();
|
||||
}
|
||||
|
||||
void sub_811C1C8(void)
|
||||
void CB2_UnionRoomBattle(void)
|
||||
{
|
||||
switch (gMain.state)
|
||||
{
|
||||
case 0:
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, 0x0000);
|
||||
gUnknown_203B08C = AllocZeroed(sizeof(struct UnkStruct_203B08C));
|
||||
sWork = AllocZeroed(sizeof(struct UnionRoomBattleWork));
|
||||
ResetSpriteData();
|
||||
FreeAllSpritePalettes();
|
||||
ResetTasks();
|
||||
ResetBgsAndClearDma3BusyFlags(0);
|
||||
InitBgsFromTemplates(0, gUnknown_8457194, 1);
|
||||
InitBgsFromTemplates(0, sBgTemplates, 1);
|
||||
ResetTempTileDataBuffers();
|
||||
if (!InitWindows(gUnknown_8457198))
|
||||
if (!InitWindows(sWindowTemplates))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -126,11 +127,11 @@ void sub_811C1C8(void)
|
||||
FillBgTilemapBufferRect(0, 0, 0, 0, 30, 20, 0xF);
|
||||
TextWindow_SetStdFrame0_WithPal(0, 1, 0xD0);
|
||||
Menu_LoadStdPal();
|
||||
SetVBlankCallback(sub_811C1B4);
|
||||
SetVBlankCallback(VBlankCB_UnionRoomBattle);
|
||||
gMain.state++;
|
||||
break;
|
||||
case 1:
|
||||
if (sub_811C150(&gUnknown_203B08C->a0, gText_CommStandbyAwaitingOtherPlayer, 0))
|
||||
if (UnionRoomBattle_PrintTextOnWindow0(&sWork->textState, gText_CommStandbyAwaitingOtherPlayer, 0))
|
||||
{
|
||||
gMain.state++;
|
||||
}
|
||||
@@ -146,11 +147,11 @@ void sub_811C1C8(void)
|
||||
memset(gBlockSendBuffer, 0, 0x20);
|
||||
if (gSelectedOrderFromParty[0] == -gSelectedOrderFromParty[1])
|
||||
{
|
||||
gBlockSendBuffer[0] = 0x52;
|
||||
gBlockSendBuffer[0] = ACTIVITY_DECLINE | 0x40;
|
||||
}
|
||||
else
|
||||
{
|
||||
gBlockSendBuffer[0] = 0x51;
|
||||
gBlockSendBuffer[0] = ACTIVITY_ACCEPT | 0x40;
|
||||
}
|
||||
SendBlock(0, gBlockSendBuffer, 0x20);
|
||||
gMain.state++;
|
||||
@@ -159,15 +160,15 @@ void sub_811C1C8(void)
|
||||
case 4:
|
||||
if (GetBlockReceivedStatus() == 3)
|
||||
{
|
||||
if (gBlockRecvBuffer[0][0] == 0x51 && gBlockRecvBuffer[1][0] == 0x51)
|
||||
if (gBlockRecvBuffer[0][0] == (ACTIVITY_ACCEPT | 0x40) && gBlockRecvBuffer[1][0] == (ACTIVITY_ACCEPT | 0x40))
|
||||
{
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
|
||||
gMain.state = 50;
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_800AAC0();
|
||||
if (gBlockRecvBuffer[GetMultiplayerId()][0] == 0x52)
|
||||
Link_TryStartSend5FFF();
|
||||
if (gBlockRecvBuffer[GetMultiplayerId()][0] == (ACTIVITY_DECLINE | 0x40))
|
||||
{
|
||||
gMain.state = 6;
|
||||
}
|
||||
@@ -182,14 +183,14 @@ void sub_811C1C8(void)
|
||||
case 50:
|
||||
if (!UpdatePaletteFade())
|
||||
{
|
||||
sub_800AB9C();
|
||||
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
|
||||
gMain.state++;
|
||||
}
|
||||
break;
|
||||
case 51:
|
||||
if (IsLinkTaskFinished())
|
||||
{
|
||||
SetMainCallback2(sub_811C04C);
|
||||
SetMainCallback2(SetUpPartiesAndStartBattle);
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
@@ -199,7 +200,7 @@ void sub_811C1C8(void)
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
if (sub_811C150(&gUnknown_203B08C->a0, gText_RefusedBattle, 1))
|
||||
if (UnionRoomBattle_PrintTextOnWindow0(&sWork->textState, gText_RefusedBattle, 1))
|
||||
{
|
||||
SetMainCallback2(CB2_ReturnToField);
|
||||
}
|
||||
@@ -211,7 +212,7 @@ void sub_811C1C8(void)
|
||||
}
|
||||
break;
|
||||
case 9:
|
||||
if (sub_811C150(&gUnknown_203B08C->a0, gText_BattleWasRefused, 1))
|
||||
if (UnionRoomBattle_PrintTextOnWindow0(&sWork->textState, gText_BattleWasRefused, 1))
|
||||
{
|
||||
SetMainCallback2(CB2_ReturnToField);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,318 @@
|
||||
#include "global.h"
|
||||
#include "gflib.h"
|
||||
#include "decompress.h"
|
||||
#include "graphics.h"
|
||||
#include "union_room_chat.h"
|
||||
|
||||
struct UnionRoomChat3
|
||||
{
|
||||
struct Sprite *selectorCursorSprite;
|
||||
struct Sprite *characterSelectCursorSprite;
|
||||
struct Sprite *textEntryCursorSprite;
|
||||
struct Sprite *rButtonSprite;
|
||||
struct Sprite *chatIconsSprite;
|
||||
u16 cursorBlinkTimer;
|
||||
};
|
||||
|
||||
static EWRAM_DATA struct UnionRoomChat3 *sWork = NULL;
|
||||
|
||||
static void SpriteCB_TextEntryCursor(struct Sprite * sprite);
|
||||
static void SpriteCB_CharacterSelectCursor(struct Sprite * sprite);
|
||||
|
||||
static const u16 sUnionRoomChatInterfacePal[] = INCBIN_U16("graphics/union_room_chat/unk_845AC14.gbapal");
|
||||
static const u32 sSelectorCursorGfxTiles[] = INCBIN_U32("graphics/union_room_chat/unk_845AC34.4bpp.lz");
|
||||
static const u32 sHorizontalBarGfxTiles[] = INCBIN_U32("graphics/union_room_chat/unk_845AEB8.4bpp.lz");
|
||||
static const u32 sMenuCursorGfxTiles[] = INCBIN_U32("graphics/union_room_chat/unk_845AED8.4bpp.lz");
|
||||
static const u32 sRButtonGfxTiles[] = INCBIN_U32("graphics/union_room_chat/unk_845AF04.4bpp.lz");
|
||||
|
||||
static const struct CompressedSpriteSheet sSpriteSheets[] = {
|
||||
{sSelectorCursorGfxTiles, 0x1000, 0},
|
||||
{sMenuCursorGfxTiles, 0x0040, 1},
|
||||
{sHorizontalBarGfxTiles, 0x0040, 2},
|
||||
{sRButtonGfxTiles, 0x0080, 3},
|
||||
{gUnionRoomChatIcons, 0x0400, 4}
|
||||
};
|
||||
|
||||
static const struct SpritePalette sSpritePalette = {
|
||||
sUnionRoomChatInterfacePal, 0
|
||||
};
|
||||
|
||||
static const struct OamData sOamData_64x32_1 = {
|
||||
.shape = SPRITE_SHAPE(64x32),
|
||||
.size = SPRITE_SIZE(64x32),
|
||||
.priority = 1
|
||||
};
|
||||
|
||||
static const union AnimCmd sAnim_CursorSmallOpen[] = {
|
||||
ANIMCMD_FRAME(0x00, 30),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd sAnim_CursorSmallClosed[] = {
|
||||
ANIMCMD_FRAME(0x20, 30),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd sAnim_CursorLargeOpen[] = {
|
||||
ANIMCMD_FRAME(0x40, 30),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd sAnim_CursorLargeClosed[] = {
|
||||
ANIMCMD_FRAME(0x60, 30),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd *const sSpriteAnims_SelectorCursor[] = {
|
||||
sAnim_CursorSmallOpen,
|
||||
sAnim_CursorSmallClosed,
|
||||
sAnim_CursorLargeOpen,
|
||||
sAnim_CursorLargeClosed
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sSpriteTemplate_SelectorCursor = {
|
||||
.tileTag = 0,
|
||||
.paletteTag = 0,
|
||||
.oam = &sOamData_64x32_1,
|
||||
.anims = sSpriteAnims_SelectorCursor,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCallbackDummy
|
||||
};
|
||||
|
||||
static const struct OamData sOamData_8x16_2 = {
|
||||
.shape = SPRITE_SHAPE(8x16),
|
||||
.size = SPRITE_SIZE(8x16),
|
||||
.priority = 2
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sSpriteTemplate_TextEntryCursor = {
|
||||
.tileTag = 2,
|
||||
.paletteTag = 0,
|
||||
.oam = &sOamData_8x16_2,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCB_TextEntryCursor
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sSpriteTemplate_CharacterSelectCursor = {
|
||||
.tileTag = 1,
|
||||
.paletteTag = 0,
|
||||
.oam = &sOamData_8x16_2,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCB_CharacterSelectCursor
|
||||
};
|
||||
|
||||
static const struct OamData sOamData_16x16_2 = {
|
||||
.shape = SPRITE_SHAPE(16x16),
|
||||
.size = SPRITE_SIZE(16x16),
|
||||
.priority = 2
|
||||
};
|
||||
|
||||
static const struct OamData sOamData_32x16_2 = {
|
||||
.shape = SPRITE_SHAPE(32x16),
|
||||
.size = SPRITE_SIZE(32x16),
|
||||
.priority = 2
|
||||
};
|
||||
|
||||
static const union AnimCmd sAnim_UnionRoomChatIcons_ToggleCase[] = {
|
||||
ANIMCMD_FRAME(0x00, 2),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd sAnim_UnionRoomChatIcons_Dummy1[] = {
|
||||
ANIMCMD_FRAME(0x08, 2),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd sAnim_UnionRoomChatIcons_Dummy2[] = {
|
||||
ANIMCMD_FRAME(0x10, 2),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd sAnim_UnionRoomChatIcons_Register[] = {
|
||||
ANIMCMD_FRAME(0x18, 2),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd *const sSpriteAnimTable_UnionRoomChatIcons[] = {
|
||||
sAnim_UnionRoomChatIcons_ToggleCase,
|
||||
sAnim_UnionRoomChatIcons_Dummy1,
|
||||
sAnim_UnionRoomChatIcons_Dummy2,
|
||||
sAnim_UnionRoomChatIcons_Register
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sSpriteTemplate_RButton = {
|
||||
.tileTag = 3,
|
||||
.paletteTag = 0,
|
||||
.oam = &sOamData_16x16_2,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCallbackDummy
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sSpriteTemplate_UnionRoomChatIcons = {
|
||||
.tileTag = 4,
|
||||
.paletteTag = 0,
|
||||
.oam = &sOamData_32x16_2,
|
||||
.anims = sSpriteAnimTable_UnionRoomChatIcons,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCallbackDummy
|
||||
};
|
||||
|
||||
bool32 UnionRoomChat_TryAllocSpriteWork(void)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < NELEMS(sSpriteSheets); i++)
|
||||
LoadCompressedSpriteSheet(&sSpriteSheets[i]);
|
||||
|
||||
LoadSpritePalette(&sSpritePalette);
|
||||
sWork = Alloc(sizeof(struct UnionRoomChat3));
|
||||
if (sWork == NULL)
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void UnionRoomChat_FreeSpriteWork(void)
|
||||
{
|
||||
if (sWork != NULL)
|
||||
Free(sWork);
|
||||
}
|
||||
|
||||
void UnionRoomChat_CreateSelectorCursorObj(void)
|
||||
{
|
||||
u8 spriteId = CreateSprite(&sSpriteTemplate_SelectorCursor, 10, 24, 0);
|
||||
sWork->selectorCursorSprite = &gSprites[spriteId];
|
||||
}
|
||||
|
||||
void UnionRoomChat_ToggleSelectorCursorObjVisibility(bool32 invisible)
|
||||
{
|
||||
sWork->selectorCursorSprite->invisible = invisible;
|
||||
}
|
||||
|
||||
void UnionRoomChat_MoveSelectorCursorObj(void)
|
||||
{
|
||||
u8 x, y;
|
||||
u8 page = GetCurrentKeyboardPage();
|
||||
UnionRoomChat_GetCursorColAndRow(&x, &y);
|
||||
if (page != UNION_ROOM_KB_PAGE_COUNT)
|
||||
{
|
||||
StartSpriteAnim(sWork->selectorCursorSprite, 0);
|
||||
sWork->selectorCursorSprite->pos1.x = x * 8 + 10;
|
||||
sWork->selectorCursorSprite->pos1.y = y * 12 + 24;
|
||||
}
|
||||
else
|
||||
{
|
||||
StartSpriteAnim(sWork->selectorCursorSprite, 2);
|
||||
sWork->selectorCursorSprite->pos1.x = 24;
|
||||
sWork->selectorCursorSprite->pos1.y = y * 12 + 24;
|
||||
}
|
||||
}
|
||||
|
||||
void UnionRoomChat_UpdateObjPalCycle(int arg0)
|
||||
{
|
||||
const u16 *palette = &sUnionRoomChatInterfacePal[arg0 * 2 + 1];
|
||||
u8 index = IndexOfSpritePaletteTag(0);
|
||||
LoadPalette(palette, index * 16 + 0x101, 4);
|
||||
}
|
||||
|
||||
void UnionRoomChat_SetSelectorCursorClosedImage(void)
|
||||
{
|
||||
if (GetCurrentKeyboardPage() != UNION_ROOM_KB_PAGE_COUNT)
|
||||
StartSpriteAnim(sWork->selectorCursorSprite, 1);
|
||||
else
|
||||
StartSpriteAnim(sWork->selectorCursorSprite, 3);
|
||||
|
||||
sWork->cursorBlinkTimer = 0;
|
||||
}
|
||||
|
||||
bool32 UnionRoomChat_AnimateSelectorCursorReopen(void)
|
||||
{
|
||||
if (sWork->cursorBlinkTimer > 3)
|
||||
return FALSE;
|
||||
|
||||
if (++sWork->cursorBlinkTimer > 3)
|
||||
{
|
||||
if (GetCurrentKeyboardPage() != UNION_ROOM_KB_PAGE_COUNT)
|
||||
StartSpriteAnim(sWork->selectorCursorSprite, 0);
|
||||
else
|
||||
StartSpriteAnim(sWork->selectorCursorSprite, 2);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void UnionRoomChat_SpawnTextEntryPointerSprites(void)
|
||||
{
|
||||
u8 spriteId = CreateSprite(&sSpriteTemplate_TextEntryCursor, 76, 152, 2);
|
||||
sWork->textEntryCursorSprite = &gSprites[spriteId];
|
||||
spriteId = CreateSprite(&sSpriteTemplate_CharacterSelectCursor, 64, 152, 1);
|
||||
sWork->characterSelectCursorSprite = &gSprites[spriteId];
|
||||
}
|
||||
|
||||
static void SpriteCB_TextEntryCursor(struct Sprite *sprite)
|
||||
{
|
||||
int var0 = UnionRoomChat_GetMessageEntryCursorPosition();
|
||||
if (var0 == 15)
|
||||
{
|
||||
sprite->invisible = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->invisible = FALSE;
|
||||
sprite->pos1.x = var0 * 8 + 76;
|
||||
}
|
||||
}
|
||||
|
||||
static void SpriteCB_CharacterSelectCursor(struct Sprite *sprite)
|
||||
{
|
||||
if (++sprite->data[0] > 4)
|
||||
{
|
||||
sprite->data[0] = 0;
|
||||
if (++sprite->pos2.x > 4)
|
||||
sprite->pos2.x = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void CreatePageSwitchUISprites(void)
|
||||
{
|
||||
u8 spriteId = CreateSprite(&sSpriteTemplate_RButton, 8, 152, 3);
|
||||
sWork->rButtonSprite = &gSprites[spriteId];
|
||||
spriteId = CreateSprite(&sSpriteTemplate_UnionRoomChatIcons, 32, 152, 4);
|
||||
sWork->chatIconsSprite = &gSprites[spriteId];
|
||||
sWork->chatIconsSprite->invisible = TRUE;
|
||||
}
|
||||
|
||||
void UpdateVisibleUnionRoomChatIcon(void)
|
||||
{
|
||||
if (GetCurrentKeyboardPage() == UNION_ROOM_KB_PAGE_COUNT)
|
||||
{
|
||||
if (UnionRoomChat_LenMessageEntryBuffer() != 0)
|
||||
{
|
||||
// REGISTER
|
||||
sWork->chatIconsSprite->invisible = FALSE;
|
||||
StartSpriteAnim(sWork->chatIconsSprite, 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
sWork->chatIconsSprite->invisible = TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int anim = UnionRoomChat_GetWhetherShouldShowCaseToggleIcon();
|
||||
if (anim == 3)
|
||||
{
|
||||
sWork->chatIconsSprite->invisible = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
// A <--> a
|
||||
sWork->chatIconsSprite->invisible = FALSE;
|
||||
StartSpriteAnim(sWork->chatIconsSprite, anim);
|
||||
}
|
||||
}
|
||||
}
|
||||
+41
-30
@@ -1,10 +1,11 @@
|
||||
#include "global.h"
|
||||
#include "union_room_message.h"
|
||||
#include "mevent_server.h"
|
||||
#include "constants/union_room.h"
|
||||
|
||||
ALIGNED(4) const u8 gUnknown_84571AC[] = _("");
|
||||
ALIGNED(4) const u8 gUnionRoomActivity_Blank[] = _("");
|
||||
ALIGNED(4) const u8 gUnknown_84571B0[] = _(":");
|
||||
ALIGNED(4) const u8 gUnknown_84571B4[] = _("{EXTRA 7}");
|
||||
ALIGNED(4) const u8 gUnknown_84571B4[] = _("{ID}");
|
||||
ALIGNED(4) const u8 gUnknown_84571B8[] = _("Please start over from the beginning.");
|
||||
ALIGNED(4) const u8 gUnknown_84571E0[] = _("The WIRELESS COMMUNICATION\nSYSTEM search has been canceled.");
|
||||
ALIGNED(4) const u8 gUnref_845721C[] = _("ともだちからの れんらくを\nまっています");
|
||||
@@ -124,6 +125,7 @@ const u8 *const gUnknown_8457754[] = {
|
||||
|
||||
ALIGNED(4) const u8 gUnknown_845777C[] = _("The WIRELESS COMMUNICATION\nSYSTEM link has been established.");
|
||||
ALIGNED(4) const u8 gUnknown_84577BC[] = _("The WIRELESS COMMUNICATION\nSYSTEM link has been dropped…");
|
||||
|
||||
ALIGNED(4) const u8 gUnknown_84577F8[] = _("The link with your friend has been\ndropped…");
|
||||
ALIGNED(4) const u8 gUnknown_8457824[] = _("{STR_VAR_1} replied, “No…”");
|
||||
|
||||
@@ -150,11 +152,12 @@ const u8 *const gUnknown_8457898[] = {
|
||||
|
||||
ALIGNED(4) const u8 gUnknown_84578A0[] = _("はなしかけています…\nしょうしょう おまちください");
|
||||
ALIGNED(4) const u8 gUnknown_84578BC[] = _("Awaiting {STR_VAR_1}'s response about\nthe trade…");
|
||||
|
||||
ALIGNED(4) const u8 gUnknown_84578E4[] = _("Communicating{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\n{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.");
|
||||
ALIGNED(4) const u8 gUnknown_8457950[] = _("Communicating with {STR_VAR_1}{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\n{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.");
|
||||
ALIGNED(4) const u8 gUnknown_84579BC[] = _("Please wait a while{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.\n{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.{PAUSE 15}.");
|
||||
|
||||
const u8 *const gUnknown_8457A34[] = {
|
||||
const u8 *const gURText_PleaseWaitMsgs[] = {
|
||||
gUnknown_84578E4,
|
||||
gUnknown_8457950,
|
||||
gUnknown_84579BC
|
||||
@@ -165,7 +168,7 @@ ALIGNED(4) const u8 gUnknown_8457A70[] = _("Hello!\nWould you like to do somethi
|
||||
ALIGNED(4) const u8 gUnknown_8457A98[] = _("{STR_VAR_1}: Hiya, we meet again!\nWhat are you up for this time?");
|
||||
ALIGNED(4) const u8 gUnknown_8457AD0[] = _("{STR_VAR_1}: Oh! {PLAYER}, hello!\nWould you like to do something?");
|
||||
|
||||
const u8 *const gUnknown_8457B04[][2] = {
|
||||
const u8 *const gURText_FriendPromptsForActivity[][2] = {
|
||||
{
|
||||
gUnknown_8457A40,
|
||||
gUnknown_8457A70
|
||||
@@ -237,6 +240,7 @@ const u8 *const gUnknown_8457F80[][2] = {
|
||||
};
|
||||
|
||||
ALIGNED(4) const u8 gUnknown_8457F90[] = _("……\nThe TRAINER appears to be busy…\p");
|
||||
|
||||
ALIGNED(4) const u8 gUnknown_8457FB4[] = _("A battle, huh?\nAll right, just give me some time.");
|
||||
ALIGNED(4) const u8 gUnknown_8457FE8[] = _("You want to chat, huh?\nSure, just wait a little.");
|
||||
ALIGNED(4) const u8 gUnknown_845801C[] = _("Sure thing! As my “Greetings,”\nhere's my TRAINER CARD.");
|
||||
@@ -244,7 +248,7 @@ ALIGNED(4) const u8 gUnknown_8458054[] = _("A battle? Of course, but I need\ntim
|
||||
ALIGNED(4) const u8 gUnknown_8458088[] = _("Did you want to chat?\nOkay, but please wait a moment.");
|
||||
ALIGNED(4) const u8 gUnknown_84580C0[] = _("As my introduction, I'll show you\nmy TRAINER CARD.");
|
||||
|
||||
const u8 *const gUnknown_84580F4[][4] = {
|
||||
const u8 *const gResponseToURoomActivityInviteStringPtrs[][4] = {
|
||||
{
|
||||
gUnknown_8457FB4,
|
||||
gUnknown_8457FE8,
|
||||
@@ -415,7 +419,8 @@ ALIGNED(4) const u8 gUnknown_8458AB8[] = _("Welcome to the TRADING BOARD.\pYou m
|
||||
ALIGNED(4) const u8 gUnknown_8458B44[] = _("This TRADING BOARD is used for\noffering a POKéMON for a trade.\pAll you need to do is register a\nPOKéMON for a trade.\pAnother TRAINER may offer a party\nPOKéMON in return for the trade.\pWe hope you will register POKéMON\nand trade them with many, many\lother TRAINERS.\pWould you like to register one of\nyour POKéMON?");
|
||||
ALIGNED(4) const u8 gUnref_ThankYouForComing_JP[] = _("こうかんけいじばん の とうろくが\nかんりょう しました\pごりよう ありがとう\nございました!\p");
|
||||
ALIGNED(4) const u8 gUnref_NoOneRegisteredMon[] = _("けいじばんに だれも ポケモンを\nとうろく していません\p\n");
|
||||
ALIGNED(4) const u8 gUnknown_8458CD4[] = _("Please choose the type of POKéMON\nthat you would like in the trade.\n");
|
||||
|
||||
ALIGNED(4) const u8 gURText_PleaseChooseTypeOfMon[] = _("Please choose the type of POKéMON\nthat you would like in the trade.\n");
|
||||
ALIGNED(4) const u8 gUnknown_8458D1C[] = _("Which of your party POKéMON will\nyou offer in trade?\p");
|
||||
ALIGNED(4) const u8 gUnknown_8458D54[] = _("Registration has been canceled.\p");
|
||||
ALIGNED(4) const u8 gUnknown_8458D78[] = _("Registration has been completed.\p");
|
||||
@@ -439,9 +444,10 @@ const u8 *const gUnknown_8458F94[] = {
|
||||
};
|
||||
|
||||
ALIGNED(4) const u8 gUnknown_8458F9C[] = _("Your trade offer was rejected.\p");
|
||||
ALIGNED(4) const u8 gUnknown_8458FBC[] = _("EGG TRADE");
|
||||
ALIGNED(4) const u8 gText_EggTrade[] = _("EGG TRADE");
|
||||
ALIGNED(4) const u8 gUnknown_8458FC8[] = _("{DPAD_UPDOWN}CHOOSE {A_BUTTON}JOIN {B_BUTTON}CANCEL");
|
||||
ALIGNED(4) const u8 gUnknown_8458FE4[] = _("Please choose a TRAINER.");
|
||||
|
||||
ALIGNED(4) const u8 gUnknown_8459000[] = _("Please choose a TRAINER for\na SINGLE BATTLE.");
|
||||
ALIGNED(4) const u8 gUnknown_8459030[] = _("Please choose a TRAINER for\na DOUBLE BATTLE.");
|
||||
ALIGNED(4) const u8 gUnknown_8459060[] = _("Please choose the LEADER\nfor a MULTI BATTLE.");
|
||||
@@ -453,15 +459,15 @@ ALIGNED(4) const u8 gUnknown_8459160[] = _("BERRY CRUSH!\nPlease choose the LEAD
|
||||
ALIGNED(4) const u8 gUnknown_8459188[] = _("DODRIO BERRY-PICKING!\nPlease choose the LEADER.");
|
||||
|
||||
const u8 *const gUnknown_84591B8[] = {
|
||||
gUnknown_8459000,
|
||||
gUnknown_8459030,
|
||||
gUnknown_8459060,
|
||||
gUnknown_8459090,
|
||||
gUnknown_845912C,
|
||||
gUnknown_8459160,
|
||||
gUnknown_8459188,
|
||||
gUnknown_84590BC,
|
||||
gUnknown_84590F4
|
||||
[LINK_GROUP_SINGLE_BATTLE] = gUnknown_8459000,
|
||||
[LINK_GROUP_DOUBLE_BATTLE] = gUnknown_8459030,
|
||||
[LINK_GROUP_MULTI_BATTLE] = gUnknown_8459060,
|
||||
[LINK_GROUP_TRADE] = gUnknown_8459090,
|
||||
[LINK_GROUP_POKEMON_JUMP] = gUnknown_845912C,
|
||||
[LINK_GROUP_BERRY_CRUSH] = gUnknown_8459160,
|
||||
[LINK_GROUP_BERRY_PICKING] = gUnknown_8459188,
|
||||
[LINK_GROUP_WONDER_CARD] = gUnknown_84590BC,
|
||||
[LINK_GROUP_WONDER_NEWS] = gUnknown_84590F4
|
||||
};
|
||||
|
||||
ALIGNED(4) const u8 gUnknown_84591DC[] = _("Searching for a WIRELESS\nCOMMUNICATION SYSTEM. Wait...");
|
||||
@@ -470,6 +476,7 @@ ALIGNED(4) const u8 gUnknown_8459238[] = _("Awaiting {STR_VAR_1}'s response…")
|
||||
ALIGNED(4) const u8 gUnknown_8459250[] = _("{STR_VAR_1} has been asked to register\nyou as a member. Please wait.");
|
||||
ALIGNED(4) const u8 gUnknown_845928C[] = _("Awaiting a response from the\nWIRELESS COMMUNICATION SYSTEM.");
|
||||
ALIGNED(4) const u8 gUnref_PlsWaitLittleWHile[] = _("ほかの さんかしゃが そろうまで\nしょうしょう おまちください");
|
||||
|
||||
ALIGNED(4) const u8 gUnknown_84592E8[] = _("No CARDS appear to be shared \nright now.");
|
||||
ALIGNED(4) const u8 gUnknown_8459314[] = _("No NEWS appears to be shared\nright now.");
|
||||
|
||||
@@ -482,23 +489,26 @@ ALIGNED(4) const u8 gUnknown_8459344[] = _("BATTLE");
|
||||
ALIGNED(4) const u8 gUnknown_845934C[] = _("CHAT");
|
||||
ALIGNED(4) const u8 gUnknown_8459354[] = _("GREETINGS");
|
||||
ALIGNED(4) const u8 gUnknown_8459360[] = _("EXIT");
|
||||
|
||||
ALIGNED(4) const u8 gUnknown_8459368[] = _("EXIT");
|
||||
ALIGNED(4) const u8 gUnknown_8459370[] = _("INFO");
|
||||
ALIGNED(4) const u8 gUnknown_8459378[] = _("NAME{CLEAR_TO 0x3C}WANTED{CLEAR_TO 0x6E}OFFER{CLEAR_TO 0xC6}LV.");
|
||||
ALIGNED(4) const u8 gUnknown_8459394[] = _("SINGLE BATTLE");
|
||||
ALIGNED(4) const u8 gUnknown_84593A4[] = _("DOUBLE BATTLE");
|
||||
ALIGNED(4) const u8 gUnknown_84593B4[] = _("MULTI BATTLE");
|
||||
ALIGNED(4) const u8 gUnknown_84593C4[] = _("POKéMON TRADES");
|
||||
ALIGNED(4) const u8 gUnknown_84593D4[] = _("CHAT");
|
||||
ALIGNED(4) const u8 gUnknown_84593DC[] = _("CARDS");
|
||||
ALIGNED(4) const u8 gUnknown_84593E4[] = _("WONDER CARDS");
|
||||
ALIGNED(4) const u8 gUnknown_84593F4[] = _("WONDER NEWS");
|
||||
ALIGNED(4) const u8 gUnknown_8459400[] = _("POKéMON JUMP");
|
||||
ALIGNED(4) const u8 gUnknown_8459410[] = _("BERRY CRUSH");
|
||||
ALIGNED(4) const u8 gUnknown_845941C[] = _("BERRY-PICKING");
|
||||
ALIGNED(4) const u8 gUnknown_845942C[] = _("SEARCH");
|
||||
ALIGNED(4) const u8 gUnknown_8459434[] = _("ぐるぐるこうかん");
|
||||
ALIGNED(4) const u8 gUnknown_8459440[] = _("アイテムトレード");
|
||||
|
||||
ALIGNED(4) const u8 gUnionRoomActivity_SingleBattle[] = _("SINGLE BATTLE");
|
||||
ALIGNED(4) const u8 gUnionRoomActivity_DoubleBattle[] = _("DOUBLE BATTLE");
|
||||
ALIGNED(4) const u8 gUnionRoomActivity_MultiBattle[] = _("MULTI BATTLE");
|
||||
ALIGNED(4) const u8 gUnionRoomActivity_PokemonTrades[] = _("POKéMON TRADES");
|
||||
ALIGNED(4) const u8 gUnionRoomActivity_Chat[] = _("CHAT");
|
||||
ALIGNED(4) const u8 gUnionRoomActivity_Cards[] = _("CARDS");
|
||||
ALIGNED(4) const u8 gUnionRoomActivity_WonderCards[] = _("WONDER CARDS");
|
||||
ALIGNED(4) const u8 gunionRoomActivity_WonderNews[] = _("WONDER NEWS");
|
||||
ALIGNED(4) const u8 gUnionRoomActivity_PokemonJump[] = _("POKéMON JUMP");
|
||||
ALIGNED(4) const u8 gUnionRoomActivity_BerryCrush[] = _("BERRY CRUSH");
|
||||
ALIGNED(4) const u8 gUnionRoomActivity_BerryPicking[] = _("BERRY-PICKING");
|
||||
ALIGNED(4) const u8 gUnionRoomActivity_Search[] = _("SEARCH");
|
||||
ALIGNED(4) const u8 gUnionRoomActivity_SpinTradeJP[] = _("ぐるぐるこうかん");
|
||||
ALIGNED(4) const u8 gUnionRoomActivity_ItemTradeJP[] = _("アイテムトレード");
|
||||
|
||||
ALIGNED(4) const u8 gUnknown_845944C[] = _("It's a NORMAL CARD.");
|
||||
ALIGNED(4) const u8 gUnknown_8459460[] = _("It's a BRONZE CARD!");
|
||||
ALIGNED(4) const u8 gUnknown_8459474[] = _("It's a COPPER CARD!");
|
||||
@@ -515,6 +525,7 @@ const u8 *const gUnknown_84594B0[] = {
|
||||
|
||||
ALIGNED(4) const u8 gUnknown_84594C4[] = _("This is {SPECIAL_F7 0x00} {SPECIAL_F7 0x01}'s\nTRAINER CARD…\l{SPECIAL_F7 0x02}\pPOKéDEX: {SPECIAL_F7 0x03}\nTIME: {SPECIAL_F7 0x04}:{SPECIAL_F7 0x05}\p");
|
||||
ALIGNED(4) const u8 gUnknown_8459504[] = _("BATTLES: {SPECIAL_F7 0x00} WINS {SPECIAL_F7 0x02} LOSSES\nTRADES: {SPECIAL_F7 0x03} TIMES\p“{SPECIAL_F7 0x04} {SPECIAL_F7 0x05}\n{SPECIAL_F7 0x06} {SPECIAL_F7 0x07}”\p");
|
||||
|
||||
ALIGNED(4) const u8 gUnknown_8459544[] = _("{SPECIAL_F7 0x01}: Glad to have met you!{PAUSE 60}");
|
||||
ALIGNED(4) const u8 gUnknown_8459564[] = _("{SPECIAL_F7 0x01}: Glad to meet you!{PAUSE 60}");
|
||||
|
||||
|
||||
@@ -1,437 +0,0 @@
|
||||
#include "global.h"
|
||||
#include "malloc.h"
|
||||
#include "decompress.h"
|
||||
#include "unk_815C980.h"
|
||||
#include "main.h"
|
||||
#include "battle.h"
|
||||
|
||||
struct UnkStruct2
|
||||
{
|
||||
bool8 isActive;
|
||||
u8 firstOamId;
|
||||
u8 field_2;
|
||||
u8 oamCount;
|
||||
u8 palTagIndex;
|
||||
u8 size;
|
||||
u8 shape;
|
||||
u8 priority;
|
||||
u8 xDelta;
|
||||
u8 field_9;
|
||||
u16 tileStart;
|
||||
s16 x;
|
||||
s16 y;
|
||||
u16 tileTag;
|
||||
u16 palTag;
|
||||
u32 field_14;
|
||||
s32 field_18;
|
||||
};
|
||||
|
||||
struct UnkStruct1
|
||||
{
|
||||
u32 count;
|
||||
struct UnkStruct2 *array;
|
||||
};
|
||||
|
||||
// this file's functions
|
||||
static u8 sub_815D244(u8 arg0);;
|
||||
static void sub_815CC28(struct UnkStruct2 *arg0);
|
||||
static void sub_815CDDC(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2);
|
||||
static void sub_815CE90(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2);
|
||||
static void sub_815CFEC(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2);
|
||||
static bool32 SharesTileWithAnyActive(u32 id);
|
||||
static bool32 SharesPalWithAnyActive(u32 id);
|
||||
static void sub_8035648(void);
|
||||
static u8 sub_815D324(u32 shape, u32 size);
|
||||
|
||||
// ewram
|
||||
static EWRAM_DATA struct UnkStruct1 *gUnknown_203F454 = {0};
|
||||
|
||||
// const rom data
|
||||
static const u8 gUnknown_8479658[][4] =
|
||||
{
|
||||
{0x01, 0x04, 0x10, 0x40},
|
||||
{0x02, 0x04, 0x08, 0x20},
|
||||
{0x02, 0x04, 0x08, 0x20},
|
||||
{0x00, 0x00, 0x00, 0x00}
|
||||
};
|
||||
|
||||
// code
|
||||
bool32 sub_815C980(u32 count)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
if (gUnknown_203F454 != NULL)
|
||||
sub_815C9F4();
|
||||
|
||||
gUnknown_203F454 = Alloc(sizeof(*gUnknown_203F454));
|
||||
if (gUnknown_203F454 == NULL)
|
||||
return FALSE;
|
||||
|
||||
gUnknown_203F454->array = Alloc(sizeof(struct UnkStruct2) * count);
|
||||
if (gUnknown_203F454->array == NULL)
|
||||
{
|
||||
Free(gUnknown_203F454);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gUnknown_203F454->count = count;
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
gUnknown_203F454->array[i].isActive = FALSE;
|
||||
gUnknown_203F454->array[i].firstOamId = 0xFF;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void sub_815C9F4(void)
|
||||
{
|
||||
if (gUnknown_203F454 != NULL)
|
||||
{
|
||||
if (gUnknown_203F454->array != NULL)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < gUnknown_203F454->count; i++)
|
||||
sub_815D108(i);
|
||||
|
||||
Free(gUnknown_203F454->array);
|
||||
}
|
||||
|
||||
FREE_AND_SET_NULL(gUnknown_203F454);
|
||||
}
|
||||
}
|
||||
|
||||
bool32 sub_815CA40(u32 id, s32 arg1, const struct UnkStruct3 *arg2)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
if (gUnknown_203F454 == NULL)
|
||||
return FALSE;
|
||||
if (gUnknown_203F454->array[id].isActive)
|
||||
return FALSE;
|
||||
|
||||
gUnknown_203F454->array[id].firstOamId = sub_815D244(arg2->field_1);
|
||||
if (gUnknown_203F454->array[id].firstOamId == 0xFF)
|
||||
return FALSE;
|
||||
|
||||
gUnknown_203F454->array[id].tileStart = GetSpriteTileStartByTag(arg2->spriteSheet->tag);
|
||||
if (gUnknown_203F454->array[id].tileStart == 0xFFFF)
|
||||
{
|
||||
if (arg2->spriteSheet->size != 0)
|
||||
{
|
||||
gUnknown_203F454->array[id].tileStart = LoadSpriteSheet(arg2->spriteSheet);
|
||||
}
|
||||
else
|
||||
{
|
||||
struct CompressedSpriteSheet compObjectPic;
|
||||
|
||||
compObjectPic = *(struct CompressedSpriteSheet*)(arg2->spriteSheet);
|
||||
compObjectPic.size = GetDecompressedDataSize(arg2->spriteSheet->data);
|
||||
gUnknown_203F454->array[id].tileStart = LoadCompressedSpriteSheet(&compObjectPic);
|
||||
}
|
||||
|
||||
if (gUnknown_203F454->array[id].tileStart == 0xFFFF)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gUnknown_203F454->array[id].palTagIndex = IndexOfSpritePaletteTag(arg2->spritePal->tag);
|
||||
if (gUnknown_203F454->array[id].palTagIndex == 0xFF)
|
||||
gUnknown_203F454->array[id].palTagIndex = LoadSpritePalette(arg2->spritePal);
|
||||
|
||||
gUnknown_203F454->array[id].field_2 = arg2->field_0_0;
|
||||
gUnknown_203F454->array[id].oamCount = arg2->field_1;
|
||||
gUnknown_203F454->array[id].x = arg2->x;
|
||||
gUnknown_203F454->array[id].y = arg2->y;
|
||||
gUnknown_203F454->array[id].shape = arg2->shape;
|
||||
gUnknown_203F454->array[id].size = arg2->size;
|
||||
gUnknown_203F454->array[id].priority = arg2->priority;
|
||||
gUnknown_203F454->array[id].xDelta = arg2->xDelta;
|
||||
gUnknown_203F454->array[id].field_9 = sub_815D324(arg2->shape, arg2->size);
|
||||
gUnknown_203F454->array[id].tileTag = arg2->spriteSheet->tag;
|
||||
gUnknown_203F454->array[id].palTag = arg2->spritePal->tag;
|
||||
gUnknown_203F454->array[id].isActive = TRUE;
|
||||
gUnknown_203F454->array[id].field_14 = 1;
|
||||
|
||||
for (i = 1; i < arg2->field_1; i++)
|
||||
gUnknown_203F454->array[id].field_14 *= 10;
|
||||
|
||||
sub_815CC28(&gUnknown_203F454->array[id]);
|
||||
sub_815CD70(id, arg1);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void sub_815CC28(struct UnkStruct2 *arg0)
|
||||
{
|
||||
u32 i;
|
||||
u32 oamId = arg0->firstOamId;
|
||||
u32 x = arg0->x;
|
||||
u32 oamCount = arg0->oamCount + 1;
|
||||
|
||||
CpuFill16(0, &gMain.oamBuffer[oamId], sizeof(struct OamData) * oamCount);
|
||||
for (i = 0, oamId = arg0->firstOamId; i < oamCount; i++, oamId++)
|
||||
{
|
||||
gMain.oamBuffer[oamId].y = arg0->y;
|
||||
gMain.oamBuffer[oamId].x = x;
|
||||
gMain.oamBuffer[oamId].shape = arg0->shape;
|
||||
gMain.oamBuffer[oamId].size = arg0->size;
|
||||
gMain.oamBuffer[oamId].tileNum = arg0->tileStart;
|
||||
gMain.oamBuffer[oamId].priority = arg0->priority;
|
||||
gMain.oamBuffer[oamId].paletteNum = arg0->palTagIndex;
|
||||
|
||||
x += arg0->xDelta;
|
||||
}
|
||||
|
||||
oamId--;
|
||||
gMain.oamBuffer[oamId].x = arg0->x - arg0->xDelta;
|
||||
gMain.oamBuffer[oamId].affineMode = 2;
|
||||
gMain.oamBuffer[oamId].tileNum = arg0->tileStart + (arg0->field_9 * 10);
|
||||
}
|
||||
|
||||
void sub_815CD70(u32 id, s32 arg1)
|
||||
{
|
||||
bool32 r2;
|
||||
|
||||
if (gUnknown_203F454 == NULL)
|
||||
return;
|
||||
if (!gUnknown_203F454->array[id].isActive)
|
||||
return;
|
||||
|
||||
gUnknown_203F454->array[id].field_18 = arg1;
|
||||
if (arg1 < 0)
|
||||
{
|
||||
r2 = TRUE;
|
||||
arg1 *= -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
r2 = FALSE;
|
||||
}
|
||||
|
||||
switch (gUnknown_203F454->array[id].field_2)
|
||||
{
|
||||
case 0:
|
||||
default:
|
||||
sub_815CDDC(&gUnknown_203F454->array[id], arg1, r2);
|
||||
break;
|
||||
case 1:
|
||||
sub_815CE90(&gUnknown_203F454->array[id], arg1, r2);
|
||||
break;
|
||||
case 2:
|
||||
sub_815CFEC(&gUnknown_203F454->array[id], arg1, r2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_815CDDC(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2)
|
||||
{
|
||||
u32 r5 = arg0->field_14;
|
||||
u32 oamId = arg0->firstOamId;
|
||||
|
||||
while (r5 != 0)
|
||||
{
|
||||
u32 r4 = arg1 / r5;
|
||||
arg1 -= (r4 * r5);
|
||||
r5 /= 10;
|
||||
|
||||
gMain.oamBuffer[oamId].tileNum = (r4 * arg0->field_9) + arg0->tileStart;
|
||||
oamId++;
|
||||
}
|
||||
|
||||
if (arg2)
|
||||
gMain.oamBuffer[oamId].affineMode = 0;
|
||||
else
|
||||
gMain.oamBuffer[oamId].affineMode = 2;
|
||||
}
|
||||
|
||||
static void sub_815CE90(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2)
|
||||
{
|
||||
u32 r5 = arg0->field_14;
|
||||
static int gUnknown_3002078;
|
||||
static int gUnknown_300207C;
|
||||
static int gUnknown_3002080;
|
||||
|
||||
gUnknown_3002078 = arg0->firstOamId;
|
||||
gUnknown_300207C = 0;
|
||||
gUnknown_3002080 = -1;
|
||||
|
||||
while (r5 != 0)
|
||||
{
|
||||
u32 r4 = arg1 / r5;
|
||||
arg1 -= (r4 * r5);
|
||||
r5 /= 10;
|
||||
|
||||
if (r4 != 0 || gUnknown_3002080 != -1 || r5 == 0)
|
||||
{
|
||||
gMain.oamBuffer[gUnknown_3002078].tileNum = (r4 * arg0->field_9) + arg0->tileStart;
|
||||
gMain.oamBuffer[gUnknown_3002078].affineMode = 0;
|
||||
|
||||
if (gUnknown_3002080 == -1)
|
||||
gUnknown_3002080 = gUnknown_300207C;
|
||||
}
|
||||
else
|
||||
{
|
||||
gMain.oamBuffer[gUnknown_3002078].affineMode = 2;
|
||||
}
|
||||
|
||||
gUnknown_3002078++;
|
||||
gUnknown_300207C++;
|
||||
}
|
||||
|
||||
if (arg2)
|
||||
{
|
||||
gMain.oamBuffer[gUnknown_3002078].affineMode = 0;
|
||||
gMain.oamBuffer[gUnknown_3002078].x = arg0->x + ((gUnknown_3002080 - 1) * arg0->xDelta);
|
||||
}
|
||||
else
|
||||
{
|
||||
gMain.oamBuffer[gUnknown_3002078].affineMode = 2;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_815CFEC(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2)
|
||||
{
|
||||
u32 r5 = arg0->field_14;
|
||||
u32 oamId = arg0->firstOamId;
|
||||
u32 var_28 = 0;
|
||||
s32 r9 = 0;
|
||||
|
||||
while (r5 != 0)
|
||||
{
|
||||
u32 r4 = arg1 / r5;
|
||||
arg1 -= (r4 * r5);
|
||||
r5 /= 10;
|
||||
|
||||
if (r4 != 0 || var_28 != 0 || r5 == 0)
|
||||
{
|
||||
var_28 = 1;
|
||||
gMain.oamBuffer[oamId].tileNum = (r4 * arg0->field_9) + arg0->tileStart;
|
||||
gMain.oamBuffer[oamId].affineMode = 0;
|
||||
|
||||
oamId++;
|
||||
r9++;
|
||||
}
|
||||
}
|
||||
|
||||
while (r9 < arg0->oamCount)
|
||||
{
|
||||
gMain.oamBuffer[oamId].affineMode = 2;
|
||||
oamId++;
|
||||
r9++;
|
||||
}
|
||||
|
||||
if (arg2)
|
||||
gMain.oamBuffer[oamId].affineMode = 0;
|
||||
else
|
||||
gMain.oamBuffer[oamId].affineMode = 2;
|
||||
}
|
||||
|
||||
void sub_815D108(u32 id)
|
||||
{
|
||||
s32 oamId, oamCount, i;
|
||||
|
||||
if (gUnknown_203F454 == NULL)
|
||||
return;
|
||||
if (!gUnknown_203F454->array[id].isActive)
|
||||
return;
|
||||
|
||||
oamCount = gUnknown_203F454->array[id].oamCount + 1;
|
||||
oamId = gUnknown_203F454->array[id].firstOamId;
|
||||
|
||||
for (i = 0; i < oamCount; i++, oamId++)
|
||||
gMain.oamBuffer[oamId].affineMode = 2;
|
||||
|
||||
if (!SharesTileWithAnyActive(id))
|
||||
FreeSpriteTilesByTag(gUnknown_203F454->array[id].tileTag);
|
||||
if (!SharesPalWithAnyActive(id))
|
||||
FreeSpritePaletteByTag(gUnknown_203F454->array[id].palTag);
|
||||
|
||||
gUnknown_203F454->array[id].isActive = FALSE;
|
||||
}
|
||||
|
||||
void sub_815D1A8(u32 id, bool32 arg1)
|
||||
{
|
||||
s32 oamId, oamCount, i;
|
||||
|
||||
if (gUnknown_203F454 == NULL)
|
||||
return;
|
||||
if (!gUnknown_203F454->array[id].isActive)
|
||||
return;
|
||||
|
||||
oamCount = gUnknown_203F454->array[id].oamCount + 1;
|
||||
oamId = gUnknown_203F454->array[id].firstOamId;
|
||||
if (arg1)
|
||||
{
|
||||
for (i = 0; i < oamCount; i++, oamId++)
|
||||
gMain.oamBuffer[oamId].affineMode = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < oamCount; i++, oamId++)
|
||||
gMain.oamBuffer[oamId].affineMode = 0;
|
||||
|
||||
sub_815CD70(id, gUnknown_203F454->array[id].field_18);
|
||||
}
|
||||
}
|
||||
|
||||
static u8 sub_815D244(u8 arg0)
|
||||
{
|
||||
u32 i;
|
||||
u16 oamCount = 64;
|
||||
|
||||
for (i = 0; i < gUnknown_203F454->count; i++)
|
||||
{
|
||||
if (!gUnknown_203F454->array[i].isActive)
|
||||
{
|
||||
if (gUnknown_203F454->array[i].firstOamId != 0xFF && gUnknown_203F454->array[i].oamCount <= arg0)
|
||||
return gUnknown_203F454->array[i].firstOamId;
|
||||
}
|
||||
else
|
||||
{
|
||||
oamCount += 1 + gUnknown_203F454->array[i].oamCount;
|
||||
}
|
||||
}
|
||||
|
||||
if (oamCount + arg0 + 1 > 128)
|
||||
return 0xFF;
|
||||
else
|
||||
return oamCount;
|
||||
}
|
||||
|
||||
static bool32 SharesTileWithAnyActive(u32 id)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < gUnknown_203F454->count; i++)
|
||||
{
|
||||
if (gUnknown_203F454->array[i].isActive && i != id
|
||||
&& gUnknown_203F454->array[i].tileTag == gUnknown_203F454->array[id].tileTag)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool32 SharesPalWithAnyActive(u32 id)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < gUnknown_203F454->count; i++)
|
||||
{
|
||||
if (gUnknown_203F454->array[i].isActive && i != id
|
||||
&& gUnknown_203F454->array[i].palTag == gUnknown_203F454->array[id].palTag)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static u8 sub_815D324(u32 shape, u32 size)
|
||||
{
|
||||
return gUnknown_8479658[shape][size];
|
||||
}
|
||||
+1
-2
@@ -22,7 +22,6 @@
|
||||
#include "field_player_avatar.h"
|
||||
#include "event_object_80688E4.h"
|
||||
#include "event_object_8097404.h"
|
||||
#include "unk_810c3a4.h"
|
||||
#include "vs_seeker.h"
|
||||
#include "constants/movement_commands.h"
|
||||
#include "constants/object_events.h"
|
||||
@@ -598,7 +597,7 @@ static void sub_810C3B8(u8 taskId)
|
||||
{
|
||||
if (sub_810CF04(i) == TRUE)
|
||||
{
|
||||
if (gObjectEvents[i].mapobj_bit_1)
|
||||
if (gObjectEvents[i].singleMovementActive)
|
||||
return;
|
||||
FreezeObjectEvent(&gObjectEvents[i]);
|
||||
}
|
||||
|
||||
@@ -13,40 +13,32 @@
|
||||
#include "dynamic_placeholder_text_util.h"
|
||||
#include "overworld.h"
|
||||
#include "sound.h"
|
||||
#include "strings.h"
|
||||
#include "menu.h"
|
||||
#include "librfu.h"
|
||||
#include "link_rfu.h"
|
||||
#include "union_room.h"
|
||||
#include "constants/songs.h"
|
||||
#include "constants/union_room.h"
|
||||
|
||||
struct WirelessCommunicationStatusScreenStruct
|
||||
{
|
||||
u32 field_00[4];
|
||||
u32 field_10[4];
|
||||
u32 field_20[16];
|
||||
u8 field_60;
|
||||
u8 field_61;
|
||||
u32 counts[4];
|
||||
u32 lastCounts[4];
|
||||
u32 activities[16];
|
||||
u8 taskId;
|
||||
u8 rfuTaskId;
|
||||
u8 filler_62[0xA];
|
||||
};
|
||||
|
||||
struct WirelessCommunicationStatusScreenStruct * gUnknown_3002040;
|
||||
static struct WirelessCommunicationStatusScreenStruct * sWCSS;
|
||||
|
||||
extern const u8 gUnknown_841E2B4[];
|
||||
extern const u8 gUnknown_841E2BF[];
|
||||
extern const u8 gUnknown_841E2C9[];
|
||||
extern const u8 gUnknown_841E2D4[];
|
||||
extern const u8 gUnknown_841E245[];
|
||||
extern const u8 gUnknown_841E263[];
|
||||
extern const u8 gUnknown_841E273[];
|
||||
extern const u8 gUnknown_841E284[];
|
||||
extern const u8 gUnknown_841E29E[];
|
||||
static void CB2_InitWirelessCommunicationScreen(void);
|
||||
static void Task_WirelessCommunicationScreen(u8 taskId);
|
||||
static void WCSS_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 palIdx);
|
||||
static bool32 UpdateCommunicationCounts(u32 * counts, u32 * lastCounts, u32 * activities, u8 taskId);
|
||||
|
||||
void sub_814F1E4(void);
|
||||
void sub_814F46C(u8 taskId);
|
||||
void sub_814F65C(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 palIdx);
|
||||
bool32 sub_814F7E4(u32 * a0, u32 * a1, u32 * a2, u8 taskId);
|
||||
|
||||
const u16 gUnknown_846F4D0[][16] = {
|
||||
static const u16 sWCSS_Palettes[][16] = {
|
||||
INCBIN_U16("graphics/misc/unk_846f4d0.gbapal"),
|
||||
INCBIN_U16("graphics/misc/unk_846f4f0.gbapal"),
|
||||
INCBIN_U16("graphics/misc/unk_846f510.gbapal"),
|
||||
@@ -65,10 +57,10 @@ const u16 gUnknown_846F4D0[][16] = {
|
||||
INCBIN_U16("graphics/misc/unk_846f6b0.gbapal")
|
||||
};
|
||||
|
||||
const u32 gUnknown_846F6D0[] = INCBIN_U32("graphics/misc/unk_846f6d0.4bpp.lz");
|
||||
const u16 gUnknown_846F8E0[] = INCBIN_U16("graphics/misc/unk_846f8e0.bin");
|
||||
static const u32 sBgTilesGfx[] = INCBIN_U32("graphics/misc/unk_846f6d0.4bpp.lz");
|
||||
static const u16 sBgTilemap[] = INCBIN_U16("graphics/misc/unk_846f8e0.bin");
|
||||
|
||||
const struct BgTemplate gUnknown_846FA74[] = {
|
||||
static const struct BgTemplate sBGTemplates[] = {
|
||||
{
|
||||
.bg = 0,
|
||||
.charBaseIndex = 2,
|
||||
@@ -88,7 +80,7 @@ const struct BgTemplate gUnknown_846FA74[] = {
|
||||
}
|
||||
};
|
||||
|
||||
const struct WindowTemplate gUnknown_846FA7C[] = {
|
||||
static const struct WindowTemplate sWindowTemplates[] = {
|
||||
{
|
||||
.bg = 0x00,
|
||||
.tilemapLeft = 0x03,
|
||||
@@ -116,47 +108,51 @@ const struct WindowTemplate gUnknown_846FA7C[] = {
|
||||
}, DUMMY_WIN_TEMPLATE
|
||||
};
|
||||
|
||||
const u8 *const gUnknown_846FA9C[] = {
|
||||
static const u8 *const gUnknown_846FA9C[] = {
|
||||
gUnknown_841E2B4,
|
||||
gUnknown_841E2BF,
|
||||
gUnknown_841E2C9,
|
||||
gUnknown_841E2D4
|
||||
};
|
||||
const u8 *const gUnknown_846FAAC[] = {
|
||||
gUnknown_841E245,
|
||||
gUnknown_841E263,
|
||||
gUnknown_841E273,
|
||||
gUnknown_841E284,
|
||||
gUnknown_841E29E
|
||||
|
||||
static const u8 *const sHeaderTextPtrs[] = {
|
||||
gText_WirelessCommunicationStatus,
|
||||
gText_PeopleTrading,
|
||||
gText_PeopleBattling,
|
||||
gText_PeopleInUnionRoom,
|
||||
gText_PeopleCommunicating
|
||||
};
|
||||
|
||||
const u8 gUnknown_846FAC0[][3] = {
|
||||
{0x01, 0x01, 0x02},
|
||||
{0x02, 0x01, 0x02},
|
||||
{0x03, 0x01, 0x04},
|
||||
{0x04, 0x00, 0x02},
|
||||
{0x15, 0x03, 0x02},
|
||||
{0x16, 0x03, 0x02},
|
||||
{0x09, 0x04, 0x00},
|
||||
{0x0a, 0x04, 0x00},
|
||||
{0x0b, 0x04, 0x00},
|
||||
{0x0c, 0xff, 0x00},
|
||||
{0x0d, 0x00, 0x00},
|
||||
{0x0e, 0xff, 0x00},
|
||||
{0x0f, 0x04, 0x00},
|
||||
{0x10, 0xff, 0x00},
|
||||
{0x40, 0x02, 0x01},
|
||||
{0x41, 0x02, 0x02},
|
||||
{0x44, 0x02, 0x02},
|
||||
{0x45, 0x02, 0x00},
|
||||
{0x48, 0x02, 0x02},
|
||||
{0x54, 0x02, 0x01},
|
||||
{0x53, 0x02, 0x02},
|
||||
{0x51, 0x02, 0x01},
|
||||
{0x52, 0x02, 0x01}
|
||||
static const u8 sCountParams[][3] = {
|
||||
// activity, count idx, by
|
||||
// by=0 means count all
|
||||
// UB: no check for count idx == -1
|
||||
{ACTIVITY_BATTLE, 1, 2},
|
||||
{ACTIVITY_DBLBATTLE, 1, 2},
|
||||
{ACTIVITY_MLTBATTLE, 1, 4},
|
||||
{ACTIVITY_TRADE, 0, 2},
|
||||
{ACTIVITY_WCARD2, 3, 2},
|
||||
{ACTIVITY_WNEWS2, 3, 2},
|
||||
{ACTIVITY_PJUMP, 4, 0},
|
||||
{ACTIVITY_BCRUSH, 4, 0},
|
||||
{ACTIVITY_BPICK, 4, 0},
|
||||
{ACTIVITY_SEARCH, -1, 0},
|
||||
{ACTIVITY_SPINTRADE, 0, 0},
|
||||
{ACTIVITY_ITEMTRADE, -1, 0},
|
||||
{0x0f, 4, 0},
|
||||
{0x10, -1, 0},
|
||||
{0x40, 2, 1},
|
||||
{ACTIVITY_BATTLE | 0x40, 2, 2},
|
||||
{ACTIVITY_TRADE | 0x40, 2, 2},
|
||||
{ACTIVITY_CHAT | 0x40, 2, 0},
|
||||
{ACTIVITY_CARD | 0x40, 2, 2},
|
||||
{20 | 0x40, 2, 1},
|
||||
{19 | 0x40, 2, 2},
|
||||
{ACTIVITY_ACCEPT | 0x40, 2, 1},
|
||||
{ACTIVITY_DECLINE | 0x40, 2, 1}
|
||||
};
|
||||
|
||||
void sub_814F19C(void)
|
||||
static void CB2_RunWirelessCommunicationScreen(void)
|
||||
{
|
||||
if (!IsDma3ManagerBusyWithBgCopy())
|
||||
{
|
||||
@@ -168,50 +164,50 @@ void sub_814F19C(void)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_814F1C0(void)
|
||||
static void VBlankCB_WirelessCommunicationScreen(void)
|
||||
{
|
||||
LoadOam();
|
||||
ProcessSpriteCopyRequests();
|
||||
TransferPlttBuffer();
|
||||
}
|
||||
|
||||
void sub_814F1D4(void)
|
||||
void Special_WirelessCommunicationScreen(void)
|
||||
{
|
||||
SetMainCallback2(sub_814F1E4);
|
||||
SetMainCallback2(CB2_InitWirelessCommunicationScreen);
|
||||
}
|
||||
|
||||
void sub_814F1E4(void)
|
||||
static void CB2_InitWirelessCommunicationScreen(void)
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, 0);
|
||||
gUnknown_3002040 = AllocZeroed(sizeof(*gUnknown_3002040));
|
||||
sWCSS = AllocZeroed(sizeof(*sWCSS));
|
||||
SetVBlankCallback(NULL);
|
||||
ResetBgsAndClearDma3BusyFlags(0);
|
||||
InitBgsFromTemplates(0, gUnknown_846FA74, NELEMS(gUnknown_846FA74));
|
||||
ResetBgsAndClearDma3BusyFlags(FALSE);
|
||||
InitBgsFromTemplates(0, sBGTemplates, NELEMS(sBGTemplates));
|
||||
SetBgTilemapBuffer(1, Alloc(0x800));
|
||||
SetBgTilemapBuffer(0, Alloc(0x800));
|
||||
DecompressAndLoadBgGfxUsingHeap(1, gUnknown_846F6D0, 0, 0, 0);
|
||||
CopyToBgTilemapBuffer(1, gUnknown_846F8E0, 0, 0);
|
||||
InitWindows(gUnknown_846FA7C);
|
||||
DecompressAndLoadBgGfxUsingHeap(1, sBgTilesGfx, 0, 0, 0);
|
||||
CopyToBgTilemapBuffer(1, sBgTilemap, 0, 0);
|
||||
InitWindows(sWindowTemplates);
|
||||
DeactivateAllTextPrinters();
|
||||
ResetPaletteFade();
|
||||
ResetSpriteData();
|
||||
ResetTasks();
|
||||
ScanlineEffect_Stop();
|
||||
m4aSoundVSyncOn();
|
||||
SetVBlankCallback(sub_814F1C0);
|
||||
gUnknown_3002040->field_60 = CreateTask(sub_814F46C, 0);
|
||||
gUnknown_3002040->field_61 = sub_8116DE0();
|
||||
gUnknown_3002040->field_10[3] = 1;
|
||||
SetVBlankCallback(VBlankCB_WirelessCommunicationScreen);
|
||||
sWCSS->taskId = CreateTask(Task_WirelessCommunicationScreen, 0);
|
||||
sWCSS->rfuTaskId = CreateTask_ListenToWireless();
|
||||
sWCSS->lastCounts[3] = 1;
|
||||
ChangeBgX(0, 0, 0);
|
||||
ChangeBgY(0, 0, 0);
|
||||
ChangeBgX(1, 0, 0);
|
||||
ChangeBgY(1, 0, 0);
|
||||
LoadPalette(gUnknown_846F4D0, 0, 0x20);
|
||||
LoadPalette(sWCSS_Palettes, 0, 0x20);
|
||||
Menu_LoadStdPalAt(0xf0);
|
||||
DynamicPlaceholderTextUtil_Reset();
|
||||
FillBgTilemapBufferRect(0, 0x000, 0, 0, 32, 32, 0xF);
|
||||
CopyBgTilemapBufferToVram(1);
|
||||
SetMainCallback2(sub_814F19C);
|
||||
SetMainCallback2(CB2_RunWirelessCommunicationScreen);
|
||||
RunTasks();
|
||||
RunTextPrinters();
|
||||
AnimateSprites();
|
||||
@@ -219,7 +215,7 @@ void sub_814F1E4(void)
|
||||
UpdatePaletteFade();
|
||||
}
|
||||
|
||||
void sub_814F32C(void)
|
||||
static void ExitWirelessCommunicationStatusScreen(void)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
@@ -228,55 +224,55 @@ void sub_814F32C(void)
|
||||
{
|
||||
Free(GetBgTilemapBuffer(i));
|
||||
}
|
||||
Free(gUnknown_3002040);
|
||||
Free(sWCSS);
|
||||
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
|
||||
}
|
||||
|
||||
void sub_814F364(s16 * unk0, s16 * unk1)
|
||||
static void WCSS_CyclePalette(s16 * frameCtr_p, s16 * palIdx_p)
|
||||
{
|
||||
s32 idx;
|
||||
(*unk0)++;
|
||||
if (*unk0 > 5)
|
||||
(*frameCtr_p)++;
|
||||
if (*frameCtr_p > 5)
|
||||
{
|
||||
(*unk1)++;
|
||||
if (*unk1 == 14)
|
||||
(*palIdx_p)++;
|
||||
if (*palIdx_p == 14)
|
||||
{
|
||||
*unk1 = 0;
|
||||
*palIdx_p = 0;
|
||||
}
|
||||
*unk0 = 0;
|
||||
*frameCtr_p = 0;
|
||||
}
|
||||
idx = *unk1 + 2;
|
||||
LoadPalette(gUnknown_846F4D0[idx], 0, 16);
|
||||
idx = *palIdx_p + 2;
|
||||
LoadPalette(sWCSS_Palettes[idx], 0, 16);
|
||||
}
|
||||
|
||||
void sub_814F3A8(void)
|
||||
static void PrintHeaderTexts(void)
|
||||
{
|
||||
s32 i;
|
||||
u32 width;
|
||||
|
||||
FillWindowPixelBuffer(0, 0);
|
||||
FillWindowPixelBuffer(1, 0);
|
||||
FillWindowPixelBuffer(2, 0);
|
||||
width = 0xC0 - GetStringWidth(3, gUnknown_846FAAC[0], 0);
|
||||
sub_814F65C(0, 3, gUnknown_846FAAC[0], width / 2, 6, 3);
|
||||
FillWindowPixelBuffer(0, PIXEL_FILL(0));
|
||||
FillWindowPixelBuffer(1, PIXEL_FILL(0));
|
||||
FillWindowPixelBuffer(2, PIXEL_FILL(0));
|
||||
width = 0xC0 - GetStringWidth(3, sHeaderTextPtrs[0], 0);
|
||||
WCSS_AddTextPrinterParameterized(0, 3, sHeaderTextPtrs[0], width / 2, 6, 3);
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
sub_814F65C(1, 3, gUnknown_846FAAC[i + 1], 0, 30 * i + 10, 1);
|
||||
WCSS_AddTextPrinterParameterized(1, 3, sHeaderTextPtrs[i + 1], 0, 30 * i + 10, 1);
|
||||
}
|
||||
sub_814F65C(1, 3, gUnknown_846FAAC[i + 1], 0, 30 * i + 10, 2);
|
||||
WCSS_AddTextPrinterParameterized(1, 3, sHeaderTextPtrs[i + 1], 0, 30 * i + 10, 2);
|
||||
PutWindowTilemap(0);
|
||||
CopyWindowToVram(0, 2);
|
||||
PutWindowTilemap(1);
|
||||
CopyWindowToVram(1, 2);
|
||||
}
|
||||
|
||||
void sub_814F46C(u8 taskId)
|
||||
static void Task_WirelessCommunicationScreen(u8 taskId)
|
||||
{
|
||||
s32 i;
|
||||
switch (gTasks[taskId].data[0])
|
||||
{
|
||||
case 0:
|
||||
sub_814F3A8();
|
||||
PrintHeaderTexts();
|
||||
gTasks[taskId].data[0]++;
|
||||
break;
|
||||
case 1:
|
||||
@@ -291,16 +287,16 @@ void sub_814F46C(u8 taskId)
|
||||
gTasks[taskId].data[0]++;
|
||||
break;
|
||||
case 3:
|
||||
if (sub_814F7E4(gUnknown_3002040->field_00, gUnknown_3002040->field_10, gUnknown_3002040->field_20, gUnknown_3002040->field_61))
|
||||
if (UpdateCommunicationCounts(sWCSS->counts, sWCSS->lastCounts, sWCSS->activities, sWCSS->rfuTaskId))
|
||||
{
|
||||
FillWindowPixelBuffer(2, 0x00);
|
||||
FillWindowPixelBuffer(2, PIXEL_FILL(0));
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
ConvertIntToDecimalStringN(gStringVar4, gUnknown_3002040->field_00[i], STR_CONV_MODE_RIGHT_ALIGN, 2);
|
||||
ConvertIntToDecimalStringN(gStringVar4, sWCSS->counts[i], STR_CONV_MODE_RIGHT_ALIGN, 2);
|
||||
if (i != 3)
|
||||
sub_814F65C(2, 3, gStringVar4, 4, 30 * i + 10, 1);
|
||||
WCSS_AddTextPrinterParameterized(2, 3, gStringVar4, 4, 30 * i + 10, 1);
|
||||
else
|
||||
sub_814F65C(2, 3, gStringVar4, 4, 100, 2);
|
||||
WCSS_AddTextPrinterParameterized(2, 3, gStringVar4, 4, 100, 2);
|
||||
}
|
||||
PutWindowTilemap(2);
|
||||
CopyWindowToVram(2, 3);
|
||||
@@ -308,10 +304,10 @@ void sub_814F46C(u8 taskId)
|
||||
if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
gTasks[gUnknown_3002040->field_61].data[15] = 0xFF;
|
||||
gTasks[sWCSS->rfuTaskId].data[15] = 0xFF;
|
||||
gTasks[taskId].data[0]++;
|
||||
}
|
||||
sub_814F364(&gTasks[taskId].data[7], &gTasks[taskId].data[8]);
|
||||
WCSS_CyclePalette(&gTasks[taskId].data[7], &gTasks[taskId].data[8]);
|
||||
break;
|
||||
case 4:
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
|
||||
@@ -320,117 +316,117 @@ void sub_814F46C(u8 taskId)
|
||||
case 5:
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
SetMainCallback2(sub_814F32C);
|
||||
SetMainCallback2(ExitWirelessCommunicationStatusScreen);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_814F65C(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 palIdx)
|
||||
static void WCSS_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 palIdx)
|
||||
{
|
||||
u8 textColor[3];
|
||||
switch (palIdx)
|
||||
{
|
||||
case 0:
|
||||
textColor[0] = 0;
|
||||
textColor[1] = 2;
|
||||
textColor[2] = 3;
|
||||
textColor[0] = TEXT_COLOR_TRANSPARENT;
|
||||
textColor[1] = TEXT_COLOR_DARK_GREY;
|
||||
textColor[2] = TEXT_COLOR_LIGHT_GREY;
|
||||
break;
|
||||
case 1:
|
||||
textColor[0] = 0;
|
||||
textColor[1] = 1;
|
||||
textColor[2] = 3;
|
||||
textColor[0] = TEXT_COLOR_TRANSPARENT;
|
||||
textColor[1] = TEXT_COLOR_WHITE;
|
||||
textColor[2] = TEXT_COLOR_LIGHT_GREY;
|
||||
break;
|
||||
case 2:
|
||||
textColor[0] = 0;
|
||||
textColor[1] = 4;
|
||||
textColor[2] = 5;
|
||||
textColor[0] = TEXT_COLOR_TRANSPARENT;
|
||||
textColor[1] = TEXT_COLOR_RED;
|
||||
textColor[2] = TEXT_COLOR_LIGHT_RED;
|
||||
break;
|
||||
case 3:
|
||||
textColor[0] = 0;
|
||||
textColor[1] = 7;
|
||||
textColor[2] = 6;
|
||||
textColor[0] = TEXT_COLOR_TRANSPARENT;
|
||||
textColor[1] = TEXT_COLOR_LIGHT_GREEN;
|
||||
textColor[2] = TEXT_COLOR_GREEN;
|
||||
break;
|
||||
case 4:
|
||||
textColor[0] = 0;
|
||||
textColor[1] = 1;
|
||||
textColor[2] = 2;
|
||||
textColor[0] = TEXT_COLOR_TRANSPARENT;
|
||||
textColor[1] = TEXT_COLOR_WHITE;
|
||||
textColor[2] = TEXT_COLOR_DARK_GREY;
|
||||
break;
|
||||
// default: UB
|
||||
}
|
||||
AddTextPrinterParameterized4(windowId, fontId,x, y, fontId == 0 ? 0 : 1, 0, textColor, -1, str);
|
||||
}
|
||||
|
||||
u32 sub_814F714(struct UnkStruct_x20 * unk20, u32 * arg1)
|
||||
static u32 CountMembersInGroup(struct UnkStruct_x20 * unk20, u32 * counts)
|
||||
{
|
||||
u32 r8 = unk20->unk.gname.unk_0a_0;
|
||||
u32 activity = unk20->gname_uname.gname.activity;
|
||||
s32 i, j, k;
|
||||
|
||||
for (i = 0; i < NELEMS(gUnknown_846FAC0); i++)
|
||||
for (i = 0; i < NELEMS(sCountParams); i++)
|
||||
{
|
||||
if (r8 == gUnknown_846FAC0[i][0] && unk20->field_1A_0 == 1)
|
||||
if (activity == sCountParams[i][0] && unk20->groupScheduledAnim == UNION_ROOM_SPAWN_IN)
|
||||
{
|
||||
if (gUnknown_846FAC0[i][2] == 0)
|
||||
if (sCountParams[i][2] == 0)
|
||||
{
|
||||
k = 0;
|
||||
for (j = 0; j < 4; j++)
|
||||
for (j = 0; j < RFU_CHILD_MAX; j++)
|
||||
{
|
||||
if (unk20->unk.gname.unk_04[j] != 0) k++;
|
||||
if (unk20->gname_uname.gname.child_sprite_gender[j] != 0) k++;
|
||||
}
|
||||
k++;
|
||||
arg1[gUnknown_846FAC0[i][1]] += k;
|
||||
counts[sCountParams[i][1]] += k;
|
||||
}
|
||||
else
|
||||
{
|
||||
arg1[gUnknown_846FAC0[i][1]] += gUnknown_846FAC0[i][2];
|
||||
counts[sCountParams[i][1]] += sCountParams[i][2];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return r8;
|
||||
return activity;
|
||||
}
|
||||
|
||||
bool32 sub_814F7BC(const u32 * ptr0, const u32 * ptr1)
|
||||
static bool32 HaveCountsChanged(const u32 * newCounts, const u32 * prevCounts)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
if (ptr0[i] != ptr1[i])
|
||||
if (newCounts[i] != prevCounts[i])
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool32 sub_814F7E4(u32 * a0, u32 * a1, u32 * a2, u8 taskId)
|
||||
static bool32 UpdateCommunicationCounts(u32 * counts, u32 * lastCounts, u32 * activities, u8 taskId)
|
||||
{
|
||||
bool32 r8 = FALSE;
|
||||
u32 sp0[4] = {0, 0, 0, 0};
|
||||
bool32 activitiesUpdated = FALSE;
|
||||
u32 buffer[4] = {0, 0, 0, 0};
|
||||
struct UnkStruct_Group * group = (void *)gTasks[taskId].data;
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
u32 r1 = sub_814F714(&group->field_0->arr[i], sp0);
|
||||
if (r1 != a2[i])
|
||||
u32 activity = CountMembersInGroup(&group->field_0->arr[i], buffer);
|
||||
if (activity != activities[i])
|
||||
{
|
||||
a2[i] = r1;
|
||||
r8 = TRUE;
|
||||
activities[i] = activity;
|
||||
activitiesUpdated = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (sub_814F7BC(sp0, a1) == FALSE)
|
||||
if (HaveCountsChanged(buffer, lastCounts) == FALSE)
|
||||
{
|
||||
if (r8 == TRUE)
|
||||
if (activitiesUpdated == TRUE)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
memcpy(a0, sp0, sizeof(sp0));
|
||||
memcpy(a1, sp0, sizeof(sp0));
|
||||
a0[3] = a0[0] + a0[1] + a0[2];
|
||||
memcpy(counts, buffer, sizeof(buffer));
|
||||
memcpy(lastCounts, buffer, sizeof(buffer));
|
||||
counts[3] = counts[0] + counts[1] + counts[2];
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user