merge bike with master, fix conflicts
This commit is contained in:
@@ -4738,9 +4738,9 @@ static void HandleEndTurn_BattleWon(void)
|
||||
gBattlescriptCurrInstr = BattleScript_FrontierTrainerBattleWon;
|
||||
|
||||
if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_3FE)
|
||||
PlayBGM(BGM_KACHI3);
|
||||
PlayBGM(MUS_KACHI3);
|
||||
else
|
||||
PlayBGM(BGM_KACHI1);
|
||||
PlayBGM(MUS_KACHI1);
|
||||
}
|
||||
else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & BATTLE_TYPE_LINK))
|
||||
{
|
||||
@@ -4751,7 +4751,7 @@ static void HandleEndTurn_BattleWon(void)
|
||||
{
|
||||
case TRAINER_CLASS_ELITE_FOUR:
|
||||
case TRAINER_CLASS_CHAMPION:
|
||||
PlayBGM(BGM_KACHI5);
|
||||
PlayBGM(MUS_KACHI5);
|
||||
break;
|
||||
case TRAINER_CLASS_TEAM_AQUA:
|
||||
case TRAINER_CLASS_TEAM_MAGMA:
|
||||
@@ -4759,13 +4759,13 @@ static void HandleEndTurn_BattleWon(void)
|
||||
case TRAINER_CLASS_AQUA_LEADER:
|
||||
case TRAINER_CLASS_MAGMA_ADMIN:
|
||||
case TRAINER_CLASS_MAGMA_LEADER:
|
||||
PlayBGM(BGM_KACHI4);
|
||||
PlayBGM(MUS_KACHI4);
|
||||
break;
|
||||
case TRAINER_CLASS_LEADER:
|
||||
PlayBGM(BGM_KACHI3);
|
||||
PlayBGM(MUS_KACHI3);
|
||||
break;
|
||||
default:
|
||||
PlayBGM(BGM_KACHI1);
|
||||
PlayBGM(MUS_KACHI1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "global.h"
|
||||
#include "battle.h"
|
||||
#include "sprite.h"
|
||||
#include "constants\trainers.h"
|
||||
#include "constants/trainers.h"
|
||||
#include "graphics.h"
|
||||
#include "decompress.h"
|
||||
#include "bg.h"
|
||||
@@ -13,7 +13,7 @@
|
||||
#include "task.h"
|
||||
#include "trig.h"
|
||||
#include "sound.h"
|
||||
#include "songs.h"
|
||||
#include "constants/songs.h"
|
||||
#include "strings.h"
|
||||
#include "window.h"
|
||||
#include "text_window.h"
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include "reshow_battle_screen.h"
|
||||
#include "pokeball.h"
|
||||
#include "data2.h"
|
||||
#include "pokeblock.h"
|
||||
|
||||
extern u32 gBattleExecBuffer;
|
||||
extern u8 gActiveBank;
|
||||
@@ -291,13 +292,13 @@ static void CompleteOnSpecialAnimDone(void)
|
||||
SafariBufferExecCompleted();
|
||||
}
|
||||
|
||||
static void OpenPokeblockCase(void)
|
||||
static void SafariOpenPokeblockCase(void)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
gBattleBankFunc[gActiveBank] = CompleteWhenChosePokeblock;
|
||||
FreeAllWindowBuffers();
|
||||
sub_81358F4();
|
||||
OpenPokeblockCaseInBattle();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -497,7 +498,7 @@ static void SafariHandleChooseItem(void)
|
||||
s32 i;
|
||||
|
||||
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
|
||||
gBattleBankFunc[gActiveBank] = OpenPokeblockCase;
|
||||
gBattleBankFunc[gActiveBank] = SafariOpenPokeblockCase;
|
||||
gBankInMenu = gActiveBank;
|
||||
}
|
||||
|
||||
|
||||
@@ -177,7 +177,6 @@ extern const u16 gBattleInterface_BallDisplayPal[];
|
||||
extern const u8 gHealthboxElementsGfxTable[][32];
|
||||
|
||||
// functions
|
||||
extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor *color, s8 speed, const u8 *str); // menu.h
|
||||
extern void LoadBattleBarGfx(u8 arg0);
|
||||
|
||||
// this file's functions
|
||||
|
||||
@@ -484,8 +484,8 @@ const u8 gText_PkmnBrokeFree[] = _("Oh, no!\nThe POKéMON broke free!");
|
||||
const u8 gText_ItAppearedCaught[] = _("Aww!\nIt appeared to be caught!");
|
||||
const u8 gText_AarghAlmostHadIt[] = _("Aargh!\nAlmost had it!");
|
||||
const u8 gText_ShootSoClose[] = _("Shoot!\nIt was so close, too!");
|
||||
const u8 gText_GotchaPkmnCaught[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{UNKNOWN_A}{PLAY_BGM BGM_KACHI22}\p");
|
||||
const u8 gText_GotchaPkmnCaught2[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{UNKNOWN_A}{PLAY_BGM BGM_KACHI22}{PAUSE 127}");
|
||||
const u8 gText_GotchaPkmnCaught[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{UNKNOWN_A}{PLAY_BGM MUS_KACHI22}\p");
|
||||
const u8 gText_GotchaPkmnCaught2[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{UNKNOWN_A}{PLAY_BGM MUS_KACHI22}{PAUSE 127}");
|
||||
const u8 gText_GiveNicknameCaptured[] = _("Give a nickname to the\ncaptured {B_OPPONENT_MON1_NAME}?");
|
||||
const u8 gText_PkmnSentToPC[] = _("{B_OPPONENT_MON1_NAME} was sent to\n{B_PC_CREATOR_NAME} PC.");
|
||||
const u8 gText_Someones[] = _("someone’s");
|
||||
|
||||
@@ -7121,7 +7121,7 @@ static void atk76_various(void)
|
||||
gBattleOutcome = BATTLE_OPPONENT_TELEPORTED;
|
||||
break;
|
||||
case VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC:
|
||||
EmitPlayFanfareOrBGM(0, BGM_KACHI1, TRUE);
|
||||
EmitPlayFanfareOrBGM(0, MUS_KACHI1, TRUE);
|
||||
MarkBufferBankForExecution(gActiveBank);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
#include "constants/game_stat.h"
|
||||
#include "event_data.h"
|
||||
#include "constants/species.h"
|
||||
#include "songs.h"
|
||||
#include "constants/songs.h"
|
||||
#include "metatile_behavior.h"
|
||||
#include "constants/maps.h"
|
||||
#include "field_player_avatar.h"
|
||||
@@ -88,9 +88,6 @@ extern u32 GetGameStat(u8 statId);
|
||||
extern u32 gBattleTypeFlags;
|
||||
extern u8 gBattleOutcome;
|
||||
extern void (*gFieldCallback)(void);
|
||||
extern u8 gApproachingTrainerId;
|
||||
extern u8 gNoOfApproachingTrainers;
|
||||
extern u16 gUnknown_03006080;
|
||||
|
||||
// this file's functions
|
||||
static void DoBattlePikeWildBattle(void);
|
||||
@@ -113,7 +110,7 @@ static void HandleRematchVarsOnBattleEnd(void);
|
||||
static const u8 *GetIntroSpeechOfApproachingTrainer(void);
|
||||
static const u8 *GetTrainerCantBattleSpeech(void);
|
||||
|
||||
// ewram data
|
||||
// ewram vars
|
||||
EWRAM_DATA static u16 sTrainerBattleMode = 0;
|
||||
EWRAM_DATA u16 gTrainerBattleOpponent_A = 0;
|
||||
EWRAM_DATA u16 gTrainerBattleOpponent_B = 0;
|
||||
@@ -523,25 +520,25 @@ void BattleSetup_StartLegendaryBattle(void)
|
||||
default:
|
||||
case SPECIES_GROUDON:
|
||||
gBattleTypeFlags |= BATTLE_TYPE_GROUDON;
|
||||
CreateBattleStartTask(B_TRANSITION_GROUDON, BGM_BATTLE34);
|
||||
CreateBattleStartTask(B_TRANSITION_GROUDON, MUS_BATTLE34);
|
||||
break;
|
||||
case SPECIES_KYOGRE:
|
||||
gBattleTypeFlags |= BATTLE_TYPE_KYOGRE;
|
||||
CreateBattleStartTask(B_TRANSITION_KYOGRE, BGM_BATTLE34);
|
||||
CreateBattleStartTask(B_TRANSITION_KYOGRE, MUS_BATTLE34);
|
||||
break;
|
||||
case SPECIES_RAYQUAZA:
|
||||
gBattleTypeFlags |= BATTLE_TYPE_RAYQUAZA;
|
||||
CreateBattleStartTask(B_TRANSITION_RAYQUAZA, BGM_BATTLE_LEGENDARY);
|
||||
CreateBattleStartTask(B_TRANSITION_RAYQUAZA, MUS_VS_REKKU);
|
||||
break;
|
||||
case SPECIES_DEOXYS:
|
||||
CreateBattleStartTask(B_TRANSITION_BLUR, BGM_FRLG_BATTLE_DEOXYS);
|
||||
CreateBattleStartTask(B_TRANSITION_BLUR, MUS_RG_VS_DEO);
|
||||
break;
|
||||
case SPECIES_LUGIA:
|
||||
case SPECIES_HO_OH:
|
||||
CreateBattleStartTask(B_TRANSITION_BLUR, BGM_FRLG_BATTLE_LEGENDARY);
|
||||
CreateBattleStartTask(B_TRANSITION_BLUR, MUS_RG_VS_DEN);
|
||||
break;
|
||||
case SPECIES_MEW:
|
||||
CreateBattleStartTask(B_TRANSITION_GRID_SQUARES, BGM_BATTLE_MEW);
|
||||
CreateBattleStartTask(B_TRANSITION_GRID_SQUARES, MUS_VS_MEW);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -558,9 +555,9 @@ void StartGroudonKyogreBattle(void)
|
||||
gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_KYOGRE_GROUDON;
|
||||
|
||||
if (gGameVersion == VERSION_RUBY)
|
||||
CreateBattleStartTask(B_TRANSITION_SHARDS, BGM_BATTLE34); // GROUDON
|
||||
CreateBattleStartTask(B_TRANSITION_SHARDS, MUS_BATTLE34); // GROUDON
|
||||
else
|
||||
CreateBattleStartTask(B_TRANSITION_RIPPLE, BGM_BATTLE34); // KYOGRE
|
||||
CreateBattleStartTask(B_TRANSITION_RIPPLE, MUS_BATTLE34); // KYOGRE
|
||||
|
||||
IncrementGameStat(GAME_STAT_TOTAL_BATTLES);
|
||||
IncrementGameStat(GAME_STAT_WILD_BATTLES);
|
||||
@@ -593,7 +590,7 @@ void StartRegiBattle(void)
|
||||
transitionId = B_TRANSITION_GRID_SQUARES;
|
||||
break;
|
||||
}
|
||||
CreateBattleStartTask(transitionId, BGM_BATTLE36);
|
||||
CreateBattleStartTask(transitionId, MUS_BATTLE36);
|
||||
|
||||
IncrementGameStat(GAME_STAT_TOTAL_BATTLES);
|
||||
IncrementGameStat(GAME_STAT_WILD_BATTLES);
|
||||
@@ -1449,46 +1446,46 @@ void SetUpTrainerEncounterMusic(void)
|
||||
switch (GetTrainerEncounterMusicId(trainerId))
|
||||
{
|
||||
case TRAINER_ENCOUNTER_MUSIC_MALE:
|
||||
music = BGM_BOYEYE;
|
||||
music = MUS_BOYEYE;
|
||||
break;
|
||||
case TRAINER_ENCOUNTER_MUSIC_FEMALE:
|
||||
music = BGM_GIRLEYE;
|
||||
music = MUS_GIRLEYE;
|
||||
break;
|
||||
case TRAINER_ENCOUNTER_MUSIC_GIRL:
|
||||
music = BGM_SYOUJOEYE;
|
||||
music = MUS_SYOUJOEYE;
|
||||
break;
|
||||
case TRAINER_ENCOUNTER_MUSIC_INTENSE:
|
||||
music = BGM_HAGESHII;
|
||||
music = MUS_HAGESHII;
|
||||
break;
|
||||
case TRAINER_ENCOUNTER_MUSIC_COOL:
|
||||
music = BGM_KAKKOII;
|
||||
music = MUS_KAKKOII;
|
||||
break;
|
||||
case TRAINER_ENCOUNTER_MUSIC_AQUA:
|
||||
music = BGM_AQA_0;
|
||||
music = MUS_AQA_0;
|
||||
break;
|
||||
case TRAINER_ENCOUNTER_MUSIC_MAGMA:
|
||||
music = BGM_MGM0;
|
||||
music = MUS_MGM0;
|
||||
break;
|
||||
case TRAINER_ENCOUNTER_MUSIC_SWIMMER:
|
||||
music = BGM_SWIMEYE;
|
||||
music = MUS_SWIMEYE;
|
||||
break;
|
||||
case TRAINER_ENCOUNTER_MUSIC_TWINS:
|
||||
music = BGM_HUTAGO;
|
||||
music = MUS_HUTAGO;
|
||||
break;
|
||||
case TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR:
|
||||
music = BGM_SITENNOU;
|
||||
music = MUS_SITENNOU;
|
||||
break;
|
||||
case TRAINER_ENCOUNTER_MUSIC_HIKER:
|
||||
music = BGM_YAMA_EYE;
|
||||
music = MUS_YAMA_EYE;
|
||||
break;
|
||||
case TRAINER_ENCOUNTER_MUSIC_INTERVIEWER:
|
||||
music = BGM_INTER_V;
|
||||
music = MUS_INTER_V;
|
||||
break;
|
||||
case TRAINER_ENCOUNTER_MUSIC_RICH:
|
||||
music = BGM_TEST;
|
||||
music = MUS_TEST;
|
||||
break;
|
||||
default:
|
||||
music = BGM_AYASII;
|
||||
music = MUS_AYASII;
|
||||
}
|
||||
PlayNewMapMusic(music);
|
||||
}
|
||||
|
||||
@@ -134,8 +134,6 @@ extern u8 gInGameOpponentsNo;
|
||||
extern u8 gUnknown_020322D5;
|
||||
extern u8 gResultsWindowId;
|
||||
|
||||
extern const u8 * const gPokeblockNames[];
|
||||
|
||||
// graphics
|
||||
extern const u8 gBerryBlenderArrowTiles[];
|
||||
extern const u8 gBerryBlenderStartTiles[];
|
||||
@@ -1305,11 +1303,11 @@ static void sub_8080018(void)
|
||||
sBerryBlenderData->field_4C = 128;
|
||||
sBerryBlenderData->gameFrameTime = 0;
|
||||
SetMainCallback2(sub_8081898);
|
||||
if (GetCurrentMapMusic() != BGM_CYCLING)
|
||||
if (GetCurrentMapMusic() != MUS_CYCLING)
|
||||
{
|
||||
sBerryBlenderData->field_154 = GetCurrentMapMusic();
|
||||
}
|
||||
PlayBGM(BGM_CYCLING);
|
||||
PlayBGM(MUS_CYCLING);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1604,10 +1602,10 @@ static void sub_80808D4(void)
|
||||
sBerryBlenderData->field_120[i] = CreateTask(sUnknown_083399EC[i], 10 + i);
|
||||
}
|
||||
|
||||
if (GetCurrentMapMusic() != BGM_CYCLING)
|
||||
if (GetCurrentMapMusic() != MUS_CYCLING)
|
||||
sBerryBlenderData->field_154 = GetCurrentMapMusic();
|
||||
|
||||
PlayBGM(BGM_CYCLING);
|
||||
PlayBGM(MUS_CYCLING);
|
||||
PlaySE(SE_MOTER);
|
||||
Blender_ControlHitPitch();
|
||||
break;
|
||||
@@ -3522,7 +3520,7 @@ static void sub_8083F3C(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[0] == 0)
|
||||
{
|
||||
PlayFanfare(BGM_FANFA1);
|
||||
PlayFanfare(MUS_FANFA1);
|
||||
gTasks[taskId].data[0]++;
|
||||
}
|
||||
if (IsFanfareTaskInactive())
|
||||
|
||||
@@ -1000,8 +1000,8 @@ void GetOnOffBike(u8 transitionFlags)
|
||||
else
|
||||
{
|
||||
SetPlayerAvatarTransitionFlags(transitionFlags);
|
||||
Overworld_SetSavedMusic(BGM_CYCLING);
|
||||
Overworld_ChangeMusicTo(BGM_CYCLING);
|
||||
Overworld_SetSavedMusic(MUS_CYCLING);
|
||||
Overworld_ChangeMusicTo(MUS_CYCLING);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ extern const u8 gDaycareText_PlayOther[];
|
||||
|
||||
extern u8 GetCursorSelectionMonId(void);
|
||||
extern u16 ItemIdToBattleMoveId(u16);
|
||||
extern s32 ListMenuHandleInput(u8);
|
||||
extern s32 ListMenuHandleInputGetItemId(u8);
|
||||
extern void sub_81AE6C8(u8, u16*, u16*);
|
||||
extern void sub_819746C(u8, bool8);
|
||||
extern void sub_81973FC(u8, bool8);
|
||||
@@ -75,7 +75,7 @@ static const struct ListMenuItem sLevelMenuItems[] =
|
||||
static const struct ListMenuTemplate sDaycareListMenuLevelTemplate =
|
||||
{
|
||||
.items = sLevelMenuItems,
|
||||
.unk_04 = sub_81AF078,
|
||||
.moveCursorFunc = sub_81AF078,
|
||||
.unk_08 = DaycarePrintMonInfo,
|
||||
.totalItems = 3,
|
||||
.maxShowed = 3,
|
||||
@@ -90,7 +90,8 @@ static const struct ListMenuTemplate sDaycareListMenuLevelTemplate =
|
||||
.unk_16_0 = TRUE,
|
||||
.spaceBetweenItems = 0,
|
||||
.unk_16_7 = FALSE,
|
||||
.unk_17_0 = 1
|
||||
.unk_17_0 = 1,
|
||||
.cursorKind = 0
|
||||
};
|
||||
|
||||
static const u8 *const sCompatibilityMessages[] =
|
||||
@@ -1256,7 +1257,7 @@ static void DaycarePrintMonInfo(u8 windowId, s32 daycareSlotId, u8 y)
|
||||
|
||||
static void Task_HandleDaycareLevelMenuInput(u8 taskId)
|
||||
{
|
||||
u32 var = ListMenuHandleInput(gTasks[taskId].tMenuListTaskId);
|
||||
u32 var = ListMenuHandleInputGetItemId(gTasks[taskId].tMenuListTaskId);
|
||||
|
||||
if (gMain.newKeys & A_BUTTON)
|
||||
{
|
||||
|
||||
@@ -792,17 +792,17 @@ void sub_8127330(u8 taskId)
|
||||
for (i = 0; i < sDecorPCBuffer->unk_520 - 1; i ++)
|
||||
{
|
||||
sub_8127454(sDecorPCBuffer->names[i], gCurDecorInventoryItems[i]);
|
||||
sDecorPCBuffer->items[i].unk_00 = sDecorPCBuffer->names[i];
|
||||
sDecorPCBuffer->items[i].unk_04 = i;
|
||||
sDecorPCBuffer->items[i].name = sDecorPCBuffer->names[i];
|
||||
sDecorPCBuffer->items[i].id = i;
|
||||
}
|
||||
StringCopy(sDecorPCBuffer->names[i], gText_Cancel);
|
||||
sDecorPCBuffer->items[i].unk_00 = sDecorPCBuffer->names[i];
|
||||
sDecorPCBuffer->items[i].unk_04 = -2;
|
||||
gUnknown_03006310 = gUnknown_085A6BD0;
|
||||
gUnknown_03006310.unk_10 = sDecorMenuWindowIndices[1];
|
||||
gUnknown_03006310.totalItems = sDecorPCBuffer->unk_520;
|
||||
gUnknown_03006310.items = sDecorPCBuffer->items;
|
||||
gUnknown_03006310.maxShowed = sDecorPCBuffer->unk_521;
|
||||
sDecorPCBuffer->items[i].name = sDecorPCBuffer->names[i];
|
||||
sDecorPCBuffer->items[i].id = -2;
|
||||
gMultiuseListMenuTemplate = gUnknown_085A6BD0;
|
||||
gMultiuseListMenuTemplate.unk_10 = sDecorMenuWindowIndices[1];
|
||||
gMultiuseListMenuTemplate.totalItems = sDecorPCBuffer->unk_520;
|
||||
gMultiuseListMenuTemplate.items = sDecorPCBuffer->items;
|
||||
gMultiuseListMenuTemplate.maxShowed = sDecorPCBuffer->unk_521;
|
||||
}
|
||||
|
||||
void sub_8127454(u8 *dest, u16 decorId)
|
||||
@@ -871,7 +871,7 @@ void sub_812759C(u8 taskId)
|
||||
sub_81272C8();
|
||||
sub_81272F8();
|
||||
sub_8127330(taskId);
|
||||
data[13] = ListMenuInit(&gUnknown_03006310, sSecretBasePCSelectDecorPageNo, sSecretBasePCSelectDecorLineNo);
|
||||
data[13] = ListMenuInit(&gMultiuseListMenuTemplate, sSecretBasePCSelectDecorPageNo, sSecretBasePCSelectDecorLineNo);
|
||||
sub_8127500();
|
||||
}
|
||||
|
||||
@@ -889,8 +889,8 @@ void sub_812764C(u8 taskId)
|
||||
data = gTasks[taskId].data;
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
input = ListMenuHandleInput(data[13]);
|
||||
get_coro_args_x18_x1A(data[13], &sSecretBasePCSelectDecorPageNo, &sSecretBasePCSelectDecorLineNo);
|
||||
input = ListMenuHandleInputGetItemId(data[13]);
|
||||
sub_81AE860(data[13], &sSecretBasePCSelectDecorPageNo, &sSecretBasePCSelectDecorLineNo);
|
||||
switch (input)
|
||||
{
|
||||
case -1:
|
||||
|
||||
@@ -91,7 +91,7 @@ static void CreateRandomEggShardSprite(void);
|
||||
static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex);
|
||||
|
||||
// IWRAM bss
|
||||
static IWRAM_DATA struct EggHatchData* sEggHatchData;
|
||||
static IWRAM_DATA struct EggHatchData *sEggHatchData;
|
||||
|
||||
// rom data
|
||||
static const u16 sEggPalette[] = INCBIN_U16("graphics/pokemon/palettes/egg_palette.gbapal");
|
||||
|
||||
@@ -594,14 +594,14 @@ static void Task_EvolutionScene(u8 taskID)
|
||||
case 3:
|
||||
if (EvoScene_IsMonAnimFinished(sEvoStructPtr->preEvoSpriteID)) // wait for animation, play tu du SE
|
||||
{
|
||||
PlaySE(BGM_ME_SHINKA);
|
||||
PlaySE(MUS_ME_SHINKA);
|
||||
gTasks[taskID].tState++;
|
||||
}
|
||||
break;
|
||||
case 4: // play evolution music and fade screen black
|
||||
if (!IsSEPlaying())
|
||||
{
|
||||
PlayNewMapMusic(BGM_SHINKA);
|
||||
PlayNewMapMusic(MUS_SHINKA);
|
||||
gTasks[taskID].tState++;
|
||||
BeginNormalPaletteFade(0x1C, 4, 0, 0x10, 0);
|
||||
}
|
||||
@@ -677,7 +677,7 @@ static void Task_EvolutionScene(u8 taskID)
|
||||
{
|
||||
StringExpandPlaceholders(gStringVar4, gText_CongratsPkmnEvolved);
|
||||
BattleHandleAddTextPrinter(gStringVar4, 0);
|
||||
PlayBGM(BGM_FANFA5);
|
||||
PlayBGM(MUS_FANFA5);
|
||||
gTasks[taskID].tState++;
|
||||
SetMonData(mon, MON_DATA_SPECIES, (void*)(&gTasks[taskID].tPostEvoSpecies));
|
||||
CalculateMonStats(mon);
|
||||
@@ -772,7 +772,7 @@ static void Task_EvolutionScene(u8 taskID)
|
||||
if (!IsTextPrinterActive(0) && !IsSEPlaying())
|
||||
{
|
||||
BufferMoveToLearnIntoBattleTextBuff2();
|
||||
PlayFanfare(BGM_FANFA1);
|
||||
PlayFanfare(MUS_FANFA1);
|
||||
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_ID_ADDER]);
|
||||
BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
|
||||
gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter
|
||||
@@ -962,15 +962,15 @@ static void Task_TradeEvolutionScene(u8 taskID)
|
||||
case 2:
|
||||
if (IsCryFinished())
|
||||
{
|
||||
m4aSongNumStop(BGM_SHINKA);
|
||||
PlaySE(BGM_ME_SHINKA);
|
||||
m4aSongNumStop(MUS_SHINKA);
|
||||
PlaySE(MUS_ME_SHINKA);
|
||||
gTasks[taskID].tState++;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (!IsSEPlaying())
|
||||
{
|
||||
PlayBGM(BGM_SHINKA);
|
||||
PlayBGM(MUS_SHINKA);
|
||||
gTasks[taskID].tState++;
|
||||
BeginNormalPaletteFade(0x1C, 4, 0, 0x10, 0);
|
||||
}
|
||||
@@ -1040,7 +1040,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
|
||||
{
|
||||
StringExpandPlaceholders(gStringVar4, gText_CongratsPkmnEvolved);
|
||||
sub_807F1A8(0, gStringVar4, 1);
|
||||
PlayFanfare(BGM_FANFA5);
|
||||
PlayFanfare(MUS_FANFA5);
|
||||
gTasks[taskID].tState++;
|
||||
SetMonData(mon, MON_DATA_SPECIES, (&gTasks[taskID].tPostEvoSpecies));
|
||||
CalculateMonStats(mon);
|
||||
@@ -1073,7 +1073,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
|
||||
}
|
||||
else
|
||||
{
|
||||
PlayBGM(BGM_SHINKA);
|
||||
PlayBGM(MUS_SHINKA);
|
||||
sub_807F1A8(0, gText_CommunicationStandby5, 1);
|
||||
gTasks[taskID].tState++;
|
||||
}
|
||||
@@ -1117,7 +1117,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
|
||||
if (!IsTextPrinterActive(0) && !IsSEPlaying())
|
||||
{
|
||||
BufferMoveToLearnIntoBattleTextBuff2();
|
||||
PlayFanfare(BGM_FANFA1);
|
||||
PlayFanfare(MUS_FANFA1);
|
||||
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_ID_ADDER]);
|
||||
sub_807F1A8(0, gDisplayedStringBattle, 1);
|
||||
gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter
|
||||
|
||||
@@ -1174,11 +1174,11 @@ void npc_by_local_id_and_map_set_field_1_bit_x20(u8 localId, u8 mapNum, u8 mapGr
|
||||
}
|
||||
}
|
||||
|
||||
void FieldObjectGetLocalIdAndMap(struct MapObject *mapObject, u8 *localId, u8 *mapNum, u8 *mapGroup)
|
||||
void FieldObjectGetLocalIdAndMap(struct MapObject *mapObject, void *localId, void *mapNum, void *mapGroup)
|
||||
{
|
||||
*localId = mapObject->localId;
|
||||
*mapNum = mapObject->mapNum;
|
||||
*mapGroup = mapObject->mapGroup;
|
||||
*(u8*)(localId) = mapObject->localId;
|
||||
*(u8*)(mapNum) = mapObject->mapNum;
|
||||
*(u8*)(mapGroup) = mapObject->mapGroup;
|
||||
}
|
||||
|
||||
void sub_808E75C(s16 x, s16 y)
|
||||
@@ -3231,7 +3231,7 @@ bool8 mss_npc_reset_oampriv3_1_unk2_unk3(struct MapObject *mapObject, struct Spr
|
||||
|
||||
bool8 sub_8091EC0(struct MapObject *mapObject, struct Sprite *sprite)
|
||||
{
|
||||
if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.running1 == 2)
|
||||
if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == 2)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
@@ -3410,7 +3410,7 @@ field_object_step(CopyPlayer2, gUnknown_0850DA90)
|
||||
|
||||
bool8 mss_08062EA4(struct MapObject *mapObject, struct Sprite *sprite)
|
||||
{
|
||||
if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.running1 == 2)
|
||||
if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == 2)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
@@ -3426,7 +3426,7 @@ void FieldObjectCB_TreeDisguise(struct Sprite *sprite)
|
||||
mapObject = &gMapObjects[sprite->data[0]];
|
||||
if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && !sprite->data[7]))
|
||||
{
|
||||
FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
|
||||
FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
|
||||
mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_TREE_DISGUISE);
|
||||
mapObject->mapobj_unk_21 = 1;
|
||||
sprite->data[7] ++;
|
||||
@@ -3447,7 +3447,7 @@ void FieldObjectCB_MountainDisguise(struct Sprite *sprite)
|
||||
mapObject = &gMapObjects[sprite->data[0]];
|
||||
if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && !sprite->data[7]))
|
||||
{
|
||||
FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
|
||||
FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
|
||||
mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE);
|
||||
mapObject->mapobj_unk_21 = 1;
|
||||
sprite->data[7] ++;
|
||||
@@ -4694,7 +4694,7 @@ bool8 sub_80954CC(struct MapObject *mapObject, struct Sprite *sprite)
|
||||
|
||||
bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *sprite)
|
||||
{
|
||||
FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
|
||||
FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
|
||||
FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1);
|
||||
sprite->data[2] = 1;
|
||||
return TRUE;
|
||||
@@ -4702,7 +4702,7 @@ bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *s
|
||||
|
||||
bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *sprite)
|
||||
{
|
||||
FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
|
||||
FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
|
||||
FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_2);
|
||||
sprite->data[2] = 1;
|
||||
return TRUE;
|
||||
@@ -4710,7 +4710,7 @@ bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *s
|
||||
|
||||
bool8 do_heart_bubble(struct MapObject *mapObject, struct Sprite *sprite)
|
||||
{
|
||||
FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
|
||||
FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
|
||||
FieldEffectStart(FLDEFF_HEART_ICON);
|
||||
sprite->data[2] = 1;
|
||||
return TRUE;
|
||||
|
||||
@@ -211,7 +211,7 @@ void Task_HandleTruckSequence(u8 taskId)
|
||||
data[1]++;
|
||||
if (data[1] == 90)
|
||||
{
|
||||
PlaySE(SE_TRACK_HAIK);
|
||||
PlaySE(SE_TRACK_HAIKI);
|
||||
data[1] = 0;
|
||||
data[0] = 5;
|
||||
}
|
||||
|
||||
@@ -424,7 +424,7 @@ static bool8 InitHallOfFameScreen(void)
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
SetMainCallback2(CB2_HallOfFame);
|
||||
PlayBGM(BGM_DENDOU);
|
||||
PlayBGM(MUS_DENDOU);
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -943,7 +943,7 @@ static void sub_818E6B0(u8 sheen)
|
||||
}
|
||||
}
|
||||
|
||||
bool8 sub_818E704(struct Pokeblock *pokeblock)
|
||||
bool8 GivePokeblockToContestLady(struct Pokeblock *pokeblock)
|
||||
{
|
||||
u8 sheen;
|
||||
bool8 response;
|
||||
@@ -1079,7 +1079,7 @@ void sub_818E914(void)
|
||||
|
||||
void sub_818E92C(void)
|
||||
{
|
||||
sub_81357FC(3, c2_exit_to_overworld_2_switch);
|
||||
OpenPokeblockCase(3, c2_exit_to_overworld_2_switch);
|
||||
}
|
||||
|
||||
void sub_818E940(void)
|
||||
|
||||
@@ -33,7 +33,6 @@ extern void Overworld_SetWarpDestination(s8 mapBank, s8 mapNo, s8 warpNo, s8 xPo
|
||||
extern void warp_in(void);
|
||||
extern void sub_80BB358(void);
|
||||
extern void ResetBagScrollPositions(void);
|
||||
extern void sub_813624C(void); // clears something pokeblock related
|
||||
extern void ResetPokedex(void);
|
||||
extern void sub_8084400(void);
|
||||
extern void ClearMailData(void);
|
||||
@@ -148,7 +147,7 @@ void sub_808447C(void)
|
||||
ZeroPlayerPartyMons();
|
||||
ZeroEnemyPartyMons();
|
||||
ResetBagScrollPositions();
|
||||
sub_813624C();
|
||||
ResetPokeblockScrollPositions();
|
||||
}
|
||||
|
||||
void NewGameInitData(void)
|
||||
|
||||
@@ -885,7 +885,7 @@ static void sub_80760F8(struct Sprite *sprite)
|
||||
{
|
||||
gDoingBattleAnim = FALSE;
|
||||
m4aMPlayAllStop();
|
||||
PlaySE(BGM_FANFA5);
|
||||
PlaySE(MUS_FANFA5);
|
||||
}
|
||||
else if (sprite->data[4] == 315)
|
||||
{
|
||||
|
||||
1337
src/pokeblock.c
Normal file
1337
src/pokeblock.c
Normal file
File diff suppressed because it is too large
Load Diff
1108
src/pokeblock_feed.c
Normal file
1108
src/pokeblock_feed.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -21,6 +21,7 @@
|
||||
#include "constants/abilities.h"
|
||||
#include "pokemon_animation.h"
|
||||
#include "pokedex.h"
|
||||
#include "pokeblock.h"
|
||||
|
||||
extern struct BattlePokemon gBattleMons[4];
|
||||
extern struct BattleEnigmaBerry gEnigmaBerries[4];
|
||||
@@ -58,7 +59,6 @@ extern const u8 gText_PkmnsXPreventsSwitching[];
|
||||
extern const struct CompressedSpritePalette gMonPaletteTable[];
|
||||
extern const struct CompressedSpritePalette gMonShinyPaletteTable[];
|
||||
extern const u16 gHMMoves[];
|
||||
extern const s8 gPokeblockFlavorCompatibilityTable[];
|
||||
extern const u8 gMonAnimationDelayTable[];
|
||||
extern const u8 gMonFrontAnimIdsTable[];
|
||||
|
||||
@@ -1145,11 +1145,11 @@ void ClearBattleMonForms(void)
|
||||
u16 GetBattleBGM(void)
|
||||
{
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON)
|
||||
return BGM_BATTLE34;
|
||||
return MUS_BATTLE34;
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_REGI)
|
||||
return BGM_BATTLE36;
|
||||
return MUS_BATTLE36;
|
||||
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
|
||||
return BGM_BATTLE20;
|
||||
return MUS_BATTLE20;
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
|
||||
{
|
||||
u8 trainerClass;
|
||||
@@ -1165,24 +1165,24 @@ u16 GetBattleBGM(void)
|
||||
{
|
||||
case TRAINER_CLASS_AQUA_LEADER:
|
||||
case TRAINER_CLASS_MAGMA_LEADER:
|
||||
return BGM_BATTLE30;
|
||||
return MUS_BATTLE30;
|
||||
case TRAINER_CLASS_TEAM_AQUA:
|
||||
case TRAINER_CLASS_TEAM_MAGMA:
|
||||
case TRAINER_CLASS_AQUA_ADMIN:
|
||||
case TRAINER_CLASS_MAGMA_ADMIN:
|
||||
return BGM_BATTLE31;
|
||||
return MUS_BATTLE31;
|
||||
case TRAINER_CLASS_LEADER:
|
||||
return BGM_BATTLE32;
|
||||
return MUS_BATTLE32;
|
||||
case TRAINER_CLASS_CHAMPION:
|
||||
return BGM_BATTLE33;
|
||||
return MUS_BATTLE33;
|
||||
case TRAINER_CLASS_PKMN_TRAINER_3:
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
|
||||
return BGM_BATTLE35;
|
||||
return MUS_BATTLE35;
|
||||
if (!StringCompare(gTrainers[gTrainerBattleOpponent_A].trainerName, gText_BattleWallyName))
|
||||
return BGM_BATTLE20;
|
||||
return BGM_BATTLE35;
|
||||
return MUS_BATTLE20;
|
||||
return MUS_BATTLE35;
|
||||
case TRAINER_CLASS_ELITE_FOUR:
|
||||
return BGM_BATTLE38;
|
||||
return MUS_BATTLE38;
|
||||
case TRAINER_CLASS_SALON_MAIDEN:
|
||||
case TRAINER_CLASS_DOME_ACE:
|
||||
case TRAINER_CLASS_PALACE_MAVEN:
|
||||
@@ -1190,12 +1190,12 @@ u16 GetBattleBGM(void)
|
||||
case TRAINER_CLASS_FACTORY_HEAD:
|
||||
case TRAINER_CLASS_PIKE_QUEEN:
|
||||
case TRAINER_CLASS_PYRAMID_KING:
|
||||
return BGM_BATTLE_FRONTIER_BRAIN;
|
||||
return MUS_VS_FRONT;
|
||||
default:
|
||||
return BGM_BATTLE20;
|
||||
return MUS_BATTLE20;
|
||||
}
|
||||
}
|
||||
return BGM_BATTLE27;
|
||||
return MUS_BATTLE27;
|
||||
}
|
||||
|
||||
void PlayBattleBGM(void)
|
||||
@@ -1298,21 +1298,21 @@ bool8 IsPokeSpriteNotFlipped(u16 species)
|
||||
return gBaseStats[species].noFlip;
|
||||
}
|
||||
|
||||
s8 GetMonFlavorRelation(struct Pokemon *mon, u8 a2)
|
||||
s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor)
|
||||
{
|
||||
u8 nature = GetNature(mon);
|
||||
return gPokeblockFlavorCompatibilityTable[nature * 5 + a2];
|
||||
return gPokeblockFlavorCompatibilityTable[nature * 5 + flavor];
|
||||
}
|
||||
|
||||
s8 GetFlavorRelationByPersonality(u32 personality, u8 a2)
|
||||
s8 GetFlavorRelationByPersonality(u32 personality, u8 flavor)
|
||||
{
|
||||
u8 nature = GetNatureFromPersonality(personality);
|
||||
return gPokeblockFlavorCompatibilityTable[nature * 5 + a2];
|
||||
return gPokeblockFlavorCompatibilityTable[nature * 5 + flavor];
|
||||
}
|
||||
|
||||
bool8 IsTradedMon(struct Pokemon *mon)
|
||||
{
|
||||
u8 otName[8];
|
||||
u8 otName[OT_NAME_LENGTH + 1];
|
||||
u32 otId;
|
||||
GetMonData(mon, MON_DATA_OT_NAME, otName);
|
||||
otId = GetMonData(mon, MON_DATA_OT_ID, 0);
|
||||
|
||||
@@ -73,7 +73,7 @@ extern void do_scheduled_bg_tilemap_copies_to_vram(void);
|
||||
extern u8 sub_81221EC();
|
||||
extern u8 sub_81221AC();
|
||||
extern void SetVBlankHBlankCallbacksToNull();
|
||||
extern void sub_8121DA0();
|
||||
extern void ResetVramOamAndBgCntRegs();
|
||||
extern void clear_scheduled_bg_copies_to_vram();
|
||||
extern void remove_some_task();
|
||||
extern void ResetBgsAndClearDma3BusyFlags(u32 leftoverFireRedLeafGreenVariable);
|
||||
@@ -193,7 +193,7 @@ void sub_81C4A88();
|
||||
void sub_81C4280();
|
||||
void sub_81C0510(u8 taskId);
|
||||
void sub_81C171C(u8 taskId);
|
||||
void sub_8121E10();
|
||||
void ResetAllBgsCoordinates();
|
||||
u8 sub_81B205C(struct Pokemon* a);
|
||||
void sub_81C1DA4(u16 a, s16 b);
|
||||
void sub_81C1EFC(u16 a, s16 b, u16 c);
|
||||
@@ -450,7 +450,7 @@ bool8 sub_81BFB10(void)
|
||||
{
|
||||
case 0:
|
||||
SetVBlankHBlankCallbacksToNull();
|
||||
sub_8121DA0();
|
||||
ResetVramOamAndBgCntRegs();
|
||||
clear_scheduled_bg_copies_to_vram();
|
||||
gMain.state++;
|
||||
break;
|
||||
@@ -578,7 +578,7 @@ void sub_81BFE24()
|
||||
SetBgTilemapBuffer(1, &gUnknown_0203CF1C->unkTilemap2);
|
||||
SetBgTilemapBuffer(2, &gUnknown_0203CF1C->unkTilemap1);
|
||||
SetBgTilemapBuffer(3, &gUnknown_0203CF1C->unkTilemap0);
|
||||
sub_8121E10();
|
||||
ResetAllBgsCoordinates();
|
||||
schedule_bg_copy_tilemap_to_vram(1);
|
||||
schedule_bg_copy_tilemap_to_vram(2);
|
||||
schedule_bg_copy_tilemap_to_vram(3);
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "main.h"
|
||||
#include "battle.h"
|
||||
#include "string_util.h"
|
||||
#include "pokeblock.h"
|
||||
|
||||
struct PokeblockFeeder
|
||||
{
|
||||
@@ -24,7 +25,6 @@ extern u8 EventScript_2A4B8A[];
|
||||
extern u8 EventScript_2A4B6F[];
|
||||
extern u8 EventScript_2A4B4C[];
|
||||
extern u8 EventScript_2A4B9B[];
|
||||
extern const u8* const gPokeblockNames[];
|
||||
|
||||
extern void sub_80EE44C(u8, u8);
|
||||
extern void IncrementGameStat(u8 index);
|
||||
|
||||
@@ -2089,7 +2089,7 @@ bool8 ScrCmd_getpricereduction(struct ScriptContext *ctx)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 ScrCmd_choosecontestpkmn(struct ScriptContext *ctx)
|
||||
bool8 ScrCmd_choosecontestmon(struct ScriptContext *ctx)
|
||||
{
|
||||
sub_81B9404();
|
||||
ScriptContext1_Stop();
|
||||
@@ -2332,7 +2332,7 @@ bool8 ScrCmd_mossdeepgym4(struct ScriptContext *ctx)
|
||||
|
||||
bool8 ScrCmd_cmdD8(struct ScriptContext *ctx)
|
||||
{
|
||||
gSelectedMapObject = sub_80B47BC();
|
||||
gSelectedMapObject = GetCurrentApproachingTrainerMapObjectId();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
@@ -1082,13 +1082,13 @@ void game_continue(u8 taskId)
|
||||
if (sub_80E9878(i))
|
||||
{
|
||||
sub_80E9780(gUnknown_0203A020->names[count], i);
|
||||
gUnknown_0203A020->items[count].unk_00 = gUnknown_0203A020->names[count];
|
||||
gUnknown_0203A020->items[count].unk_04 = i;
|
||||
gUnknown_0203A020->items[count].name = gUnknown_0203A020->names[count];
|
||||
gUnknown_0203A020->items[count].id = i;
|
||||
count ++;
|
||||
}
|
||||
}
|
||||
gUnknown_0203A020->items[count].unk_00 = gText_Cancel;
|
||||
gUnknown_0203A020->items[count].unk_04 = -2;
|
||||
gUnknown_0203A020->items[count].name = gText_Cancel;
|
||||
gUnknown_0203A020->items[count].id = -2;
|
||||
data[0] = count + 1;
|
||||
if (data[0] < 8)
|
||||
{
|
||||
@@ -1098,11 +1098,11 @@ void game_continue(u8 taskId)
|
||||
{
|
||||
data[3] = 8;
|
||||
}
|
||||
gUnknown_03006310 = gUnknown_0858D07C;
|
||||
gUnknown_03006310.unk_10 = data[6];
|
||||
gUnknown_03006310.totalItems = data[0];
|
||||
gUnknown_03006310.items = gUnknown_0203A020->items;
|
||||
gUnknown_03006310.maxShowed = data[3];
|
||||
gMultiuseListMenuTemplate = gUnknown_0858D07C;
|
||||
gMultiuseListMenuTemplate.unk_10 = data[6];
|
||||
gMultiuseListMenuTemplate.totalItems = data[0];
|
||||
gMultiuseListMenuTemplate.items = gUnknown_0203A020->items;
|
||||
gMultiuseListMenuTemplate.maxShowed = data[3];
|
||||
}
|
||||
|
||||
void sub_80E9DEC(u32 a0, bool8 flag, struct ListMenu *menu)
|
||||
@@ -1119,7 +1119,7 @@ void sub_80E9E00(u8 taskId)
|
||||
|
||||
data = gTasks[taskId].data;
|
||||
SetStandardWindowBorderStyle(data[6], 0);
|
||||
data[5] = ListMenuInit(&gUnknown_03006310, data[2], data[1]);
|
||||
data[5] = ListMenuInit(&gMultiuseListMenuTemplate, data[2], data[1]);
|
||||
sub_80E9E44(taskId);
|
||||
schedule_bg_copy_tilemap_to_vram(0);
|
||||
}
|
||||
@@ -1138,8 +1138,8 @@ void sub_80E9E90(u8 taskId)
|
||||
s32 input;
|
||||
|
||||
data = gTasks[taskId].data;
|
||||
input = ListMenuHandleInput(data[5]);
|
||||
get_coro_args_x18_x1A(data[5], &data[2], &data[1]);
|
||||
input = ListMenuHandleInputGetItemId(data[5]);
|
||||
sub_81AE860(data[5], &data[2], &data[1]);
|
||||
switch (input)
|
||||
{
|
||||
case -1:
|
||||
|
||||
@@ -189,7 +189,7 @@ bool8 WaitFanfare(bool8 stop)
|
||||
if (!stop)
|
||||
m4aMPlayContinue(&gMPlay_BGM);
|
||||
else
|
||||
m4aSongNumStart(SE_STOP);
|
||||
m4aSongNumStart(MUS_DUMMY);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -1,15 +1,170 @@
|
||||
#include "global.h"
|
||||
#include "trainer_see.h"
|
||||
#include "battle_setup.h"
|
||||
#include "pokemon.h"
|
||||
#include "sprite.h"
|
||||
#include "field_effect.h"
|
||||
#include "field_map_obj.h"
|
||||
#include "field_player_avatar.h"
|
||||
#include "map_obj_8097404.h"
|
||||
#include "pokenav.h"
|
||||
#include "task.h"
|
||||
#include "util.h"
|
||||
#include "script.h"
|
||||
#include "event_data.h"
|
||||
#include "script_movement.h"
|
||||
|
||||
extern u8 gApproachingTrainerId;
|
||||
extern u8 gNoOfApproachingTrainers;
|
||||
extern u8 gUnknown_030060AC;
|
||||
extern u16 gUnknown_03006080;
|
||||
extern bool8 InBattlePyramid(void);
|
||||
extern bool32 InTrainerHill(void);
|
||||
extern bool8 GetBattlePyramidTrainerFlag(u8 mapObjectId);
|
||||
extern bool8 GetTrainerHillTrainerFlag(u8 mapObjectId);
|
||||
extern void sub_809BE48(u16 npcId);
|
||||
|
||||
// this file's functions
|
||||
u8 CheckIfTrainerWantsBattle(u8 mapObjectId);
|
||||
static u8 CheckTrainer(u8 mapObjectId);
|
||||
static u8 GetTrainerApproachDistance(struct MapObject *trainerObj);
|
||||
static u8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 approachDistance, u8 direction);
|
||||
static void TrainerApproachPlayer(struct MapObject *trainerObj, u8 range);
|
||||
static void Task_RunTrainerSeeFuncList(u8 taskId);
|
||||
static void Task_DestroyTrainerApproachTask(u8 taskId);
|
||||
static void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnimNum);
|
||||
|
||||
static u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 x, s16 y);
|
||||
static u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 x, s16 y);
|
||||
static u8 GetTrainerApproachDistanceWest(struct MapObject *trainerObj, s16 range, s16 x, s16 y);
|
||||
static u8 GetTrainerApproachDistanceEast(struct MapObject *trainerObj, s16 range, s16 x, s16 y);
|
||||
|
||||
static bool8 sub_80B4178(u8 taskId, struct Task *task, struct MapObject *trainerObj);
|
||||
static bool8 sub_80B417C(u8 taskId, struct Task *task, struct MapObject *trainerObj);
|
||||
static bool8 sub_80B41C0(u8 taskId, struct Task *task, struct MapObject *trainerObj);
|
||||
static bool8 sub_80B4200(u8 taskId, struct Task *task, struct MapObject *trainerObj);
|
||||
static bool8 sub_80B425C(u8 taskId, struct Task *task, struct MapObject *trainerObj);
|
||||
static bool8 sub_80B4318(u8 taskId, struct Task *task, struct MapObject *trainerObj);
|
||||
static bool8 sub_80B435C(u8 taskId, struct Task *task, struct MapObject *trainerObj);
|
||||
static bool8 sub_80B4390(u8 taskId, struct Task *task, struct MapObject *trainerObj);
|
||||
static bool8 sub_80B43AC(u8 taskId, struct Task *task, struct MapObject *trainerObj);
|
||||
static bool8 sub_80B43E0(u8 taskId, struct Task *task, struct MapObject *trainerObj);
|
||||
static bool8 sub_80B4438(u8 taskId, struct Task *task, struct MapObject *trainerObj);
|
||||
static bool8 sub_80B44AC(u8 taskId, struct Task *task, struct MapObject *trainerObj);
|
||||
|
||||
static void SpriteCB_TrainerIcons(struct Sprite *sprite);
|
||||
|
||||
// IWRAM common
|
||||
u16 gUnknown_03006080;
|
||||
u8 gUnknown_03006084[4];
|
||||
struct ApproachingTrainer gApproachingTrainers[2];
|
||||
u8 gNoOfApproachingTrainers;
|
||||
u8 gUnknown_030060AC;
|
||||
|
||||
// EWRAM
|
||||
EWRAM_DATA u8 gApproachingTrainerId = 0;
|
||||
|
||||
// const rom data
|
||||
static const u8 sEmotion_ExclamationMarkGfx[] = INCBIN_U8("graphics/misc/emotion_exclamation.4bpp");
|
||||
static const u8 sEmotion_QuestionMarkGfx[] = INCBIN_U8("graphics/misc/emotion_question.4bpp");
|
||||
static const u8 sEmotion_HeartGfx[] = INCBIN_U8("graphics/misc/emotion_heart.4bpp");
|
||||
|
||||
static u8 (*const sDirectionalApproachDistanceFuncs[])(struct MapObject *trainerObj, s16 range, s16 x, s16 y) =
|
||||
{
|
||||
GetTrainerApproachDistanceSouth,
|
||||
GetTrainerApproachDistanceNorth,
|
||||
GetTrainerApproachDistanceWest,
|
||||
GetTrainerApproachDistanceEast,
|
||||
};
|
||||
|
||||
static bool8 (*const sTrainerSeeFuncList[])(u8 taskId, struct Task *task, struct MapObject *trainerObj) =
|
||||
{
|
||||
sub_80B4178,
|
||||
sub_80B417C,
|
||||
sub_80B41C0,
|
||||
sub_80B4200,
|
||||
sub_80B425C,
|
||||
sub_80B4318,
|
||||
sub_80B435C,
|
||||
sub_80B4390,
|
||||
sub_80B43AC,
|
||||
sub_80B43E0,
|
||||
sub_80B4438,
|
||||
sub_80B44AC
|
||||
};
|
||||
|
||||
static bool8 (*const sTrainerSeeFuncList2[])(u8 taskId, struct Task *task, struct MapObject *trainerObj) =
|
||||
{
|
||||
sub_80B43AC,
|
||||
sub_80B43E0,
|
||||
sub_80B4438,
|
||||
sub_80B44AC,
|
||||
};
|
||||
|
||||
static const struct OamData sOamData_Icons =
|
||||
{
|
||||
.y = 0,
|
||||
.affineMode = 0,
|
||||
.objMode = 0,
|
||||
.mosaic = 0,
|
||||
.bpp = 0,
|
||||
.shape = 0,
|
||||
.x = 0,
|
||||
.matrixNum = 0,
|
||||
.size = 1,
|
||||
.tileNum = 0,
|
||||
.priority = 1,
|
||||
.paletteNum = 0,
|
||||
.affineParam = 0,
|
||||
};
|
||||
|
||||
static const struct SpriteFrameImage sSpriteImageTable_ExclamationQuestionMark[] =
|
||||
{
|
||||
{sEmotion_ExclamationMarkGfx, 0x80},
|
||||
{sEmotion_QuestionMarkGfx, 0x80}
|
||||
};
|
||||
|
||||
static const struct SpriteFrameImage sSpriteImageTable_HeartIcon[] =
|
||||
{
|
||||
{sEmotion_HeartGfx, 0x80}
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_Icons1[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 60),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_Icons2[] =
|
||||
{
|
||||
ANIMCMD_FRAME(1, 60),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd *const sSpriteAnimTable_Icons[] =
|
||||
{
|
||||
sSpriteAnim_Icons1,
|
||||
sSpriteAnim_Icons2
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sSpriteTemplate_ExclamationQuestionMark =
|
||||
{
|
||||
.tileTag = 0xffff,
|
||||
.paletteTag = 0xffff,
|
||||
.oam = &sOamData_Icons,
|
||||
.anims = sSpriteAnimTable_Icons,
|
||||
.images = sSpriteImageTable_ExclamationQuestionMark,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCB_TrainerIcons
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sSpriteTemplate_HeartIcon =
|
||||
{
|
||||
.tileTag = 0xffff,
|
||||
.paletteTag = 0x1004,
|
||||
.oam = &sOamData_Icons,
|
||||
.anims = sSpriteAnimTable_Icons,
|
||||
.images = sSpriteImageTable_HeartIcon,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCB_TrainerIcons
|
||||
};
|
||||
|
||||
// code
|
||||
bool8 CheckForTrainersWantingBattle(void)
|
||||
{
|
||||
u8 i;
|
||||
@@ -26,7 +181,7 @@ bool8 CheckForTrainersWantingBattle(void)
|
||||
if (gMapObjects[i].trainerType != 1 && gMapObjects[i].trainerType != 3)
|
||||
continue;
|
||||
|
||||
retVal = CheckIfTrainerWantsBattle(i);
|
||||
retVal = CheckTrainer(i);
|
||||
if (retVal == 2)
|
||||
break; // two trainers have been found
|
||||
|
||||
@@ -66,3 +221,561 @@ bool8 CheckForTrainersWantingBattle(void)
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static u8 CheckTrainer(u8 mapObjectId)
|
||||
{
|
||||
const u8 *scriptPtr;
|
||||
u8 ret = 1;
|
||||
u8 approachDistance;
|
||||
|
||||
if (InTrainerHill() == TRUE)
|
||||
scriptPtr = sub_81D62AC();
|
||||
else
|
||||
scriptPtr = GetFieldObjectScriptPointerByFieldObjectId(mapObjectId);
|
||||
|
||||
if (InBattlePyramid())
|
||||
{
|
||||
if (GetBattlePyramidTrainerFlag(mapObjectId))
|
||||
return 0;
|
||||
}
|
||||
else if (InTrainerHill() == TRUE)
|
||||
{
|
||||
if (GetTrainerHillTrainerFlag(mapObjectId))
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GetTrainerFlagFromScriptPointer(scriptPtr))
|
||||
return 0;
|
||||
}
|
||||
|
||||
approachDistance = GetTrainerApproachDistance(&gMapObjects[mapObjectId]);
|
||||
|
||||
if (approachDistance != 0)
|
||||
{
|
||||
if (scriptPtr[1] == TRAINER_BATTLE_DOUBLE
|
||||
|| scriptPtr[1] == TRAINER_BATTLE_REMATCH_DOUBLE
|
||||
|| scriptPtr[1] == TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE)
|
||||
{
|
||||
if (GetMonsStateToDoubles_2() != 0)
|
||||
return 0;
|
||||
|
||||
ret = 2;
|
||||
}
|
||||
|
||||
gApproachingTrainers[gNoOfApproachingTrainers].mapObjectId = mapObjectId;
|
||||
gApproachingTrainers[gNoOfApproachingTrainers].trainerScriptPtr = scriptPtr;
|
||||
gApproachingTrainers[gNoOfApproachingTrainers].radius = approachDistance;
|
||||
TrainerApproachPlayer(&gMapObjects[mapObjectId], approachDistance - 1);
|
||||
gNoOfApproachingTrainers++;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u8 GetTrainerApproachDistance(struct MapObject *trainerObj)
|
||||
{
|
||||
s16 x, y;
|
||||
u8 i;
|
||||
u8 approachDistance;
|
||||
|
||||
PlayerGetDestCoords(&x, &y);
|
||||
if (trainerObj->trainerType == 1) // can only see in one direction
|
||||
{
|
||||
approachDistance = sDirectionalApproachDistanceFuncs[trainerObj->mapobj_unk_18 - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y);
|
||||
return CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, trainerObj->mapobj_unk_18);
|
||||
}
|
||||
else // can see in all directions
|
||||
{
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
approachDistance = sDirectionalApproachDistanceFuncs[i](trainerObj, trainerObj->trainerRange_berryTreeId, x, y);
|
||||
if (CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, i + 1)) // directions are 1-4 instead of 0-3. south north west east
|
||||
return approachDistance;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Returns how far south the player is from trainer. 0 if out of trainer's sight.
|
||||
static u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 x, s16 y)
|
||||
{
|
||||
if (trainerObj->coords2.x == x
|
||||
&& y > trainerObj->coords2.y
|
||||
&& y <= trainerObj->coords2.y + range)
|
||||
return (y - trainerObj->coords2.y);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Returns how far north the player is from trainer. 0 if out of trainer's sight.
|
||||
static u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 x, s16 y)
|
||||
{
|
||||
if (trainerObj->coords2.x == x
|
||||
&& y < trainerObj->coords2.y
|
||||
&& y >= trainerObj->coords2.y - range)
|
||||
return (trainerObj->coords2.y - y);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Returns how far west the player is from trainer. 0 if out of trainer's sight.
|
||||
static u8 GetTrainerApproachDistanceWest(struct MapObject *trainerObj, s16 range, s16 x, s16 y)
|
||||
{
|
||||
if (trainerObj->coords2.y == y
|
||||
&& x < trainerObj->coords2.x
|
||||
&& x >= trainerObj->coords2.x - range)
|
||||
return (trainerObj->coords2.x - x);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Returns how far east the player is from trainer. 0 if out of trainer's sight.
|
||||
static u8 GetTrainerApproachDistanceEast(struct MapObject *trainerObj, s16 range, s16 x, s16 y)
|
||||
{
|
||||
if (trainerObj->coords2.y == y
|
||||
&& x > trainerObj->coords2.x
|
||||
&& x <= trainerObj->coords2.x + range)
|
||||
return (x - trainerObj->coords2.x);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define COLLISION_MASK (~1)
|
||||
|
||||
static u8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 approachDistance, u8 direction)
|
||||
{
|
||||
s16 x, y;
|
||||
u8 unk19_temp;
|
||||
u8 unk19b_temp;
|
||||
u8 i;
|
||||
u8 collision;
|
||||
|
||||
if (approachDistance == 0)
|
||||
return 0;
|
||||
|
||||
x = trainerObj->coords2.x;
|
||||
y = trainerObj->coords2.y;
|
||||
|
||||
MoveCoords(direction, &x, &y);
|
||||
for (i = 0; i < approachDistance - 1; i++, MoveCoords(direction, &x, &y))
|
||||
{
|
||||
collision = sub_8092C8C(trainerObj, x, y, direction);
|
||||
if (collision != 0 && (collision & COLLISION_MASK))
|
||||
return 0;
|
||||
}
|
||||
|
||||
// preserve mapobj_unk_19 before clearing.
|
||||
unk19_temp = trainerObj->range.as_nybbles.x;
|
||||
unk19b_temp = trainerObj->range.as_nybbles.y;
|
||||
trainerObj->range.as_nybbles.x = 0;
|
||||
trainerObj->range.as_nybbles.y = 0;
|
||||
|
||||
collision = npc_block_way(trainerObj, x, y, direction);
|
||||
|
||||
trainerObj->range.as_nybbles.x = unk19_temp;
|
||||
trainerObj->range.as_nybbles.y = unk19b_temp;
|
||||
if (collision == 4)
|
||||
return approachDistance;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define tFuncId data[0]
|
||||
#define tTrainerRange data[3]
|
||||
#define tOutOfAshSpriteId data[4]
|
||||
#define tTrainerMapObjectId data[7]
|
||||
|
||||
static void TrainerApproachPlayer(struct MapObject *trainerObj, u8 range)
|
||||
{
|
||||
struct Task *task;
|
||||
|
||||
gApproachingTrainers[gNoOfApproachingTrainers].taskId = CreateTask(Task_RunTrainerSeeFuncList, 0x50);
|
||||
task = &gTasks[gApproachingTrainers[gNoOfApproachingTrainers].taskId];
|
||||
task->tTrainerRange = range;
|
||||
task->tTrainerMapObjectId = gApproachingTrainers[gNoOfApproachingTrainers].mapObjectId;
|
||||
}
|
||||
|
||||
static void sub_80B40C8(TaskFunc followupFunc)
|
||||
{
|
||||
u8 taskId;
|
||||
TaskFunc taskFunc;
|
||||
|
||||
if (gApproachingTrainerId == 0)
|
||||
taskId = gApproachingTrainers[0].taskId;
|
||||
else
|
||||
taskId = gApproachingTrainers[1].taskId;
|
||||
|
||||
taskFunc = Task_RunTrainerSeeFuncList;
|
||||
SetTaskFuncWithFollowupFunc(taskId, taskFunc, followupFunc);
|
||||
gTasks[taskId].tFuncId = 1;
|
||||
taskFunc(taskId);
|
||||
}
|
||||
|
||||
static void Task_RunTrainerSeeFuncList(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
struct MapObject *trainerObj = &gMapObjects[task->tTrainerMapObjectId];
|
||||
|
||||
if (!trainerObj->active)
|
||||
{
|
||||
SwitchTaskToFollowupFunc(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
while (sTrainerSeeFuncList[task->tFuncId](taskId, task, trainerObj));
|
||||
}
|
||||
}
|
||||
|
||||
static bool8 sub_80B4178(u8 taskId, struct Task *task, struct MapObject *trainerObj)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool8 sub_80B417C(u8 taskId, struct Task *task, struct MapObject *trainerObj)
|
||||
{
|
||||
u8 direction;
|
||||
|
||||
FieldObjectGetLocalIdAndMap(trainerObj, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
|
||||
FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1);
|
||||
direction = GetFaceDirectionAnimId(trainerObj->mapobj_unk_18);
|
||||
FieldObjectSetSpecialAnim(trainerObj, direction);
|
||||
task->tFuncId++;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static bool8 sub_80B41C0(u8 taskId, struct Task *task, struct MapObject *trainerObj)
|
||||
{
|
||||
if (FieldEffectActiveListContains(FLDEFF_EXCLAMATION_MARK_ICON_1))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
task->tFuncId++;
|
||||
if (trainerObj->animPattern == 57 || trainerObj->animPattern == 58)
|
||||
task->tFuncId = 6;
|
||||
if (trainerObj->animPattern == 63)
|
||||
task->tFuncId = 8;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
static bool8 sub_80B4200(u8 taskId, struct Task *task, struct MapObject *trainerObj)
|
||||
{
|
||||
if (!(FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)) || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
|
||||
{
|
||||
if (task->tTrainerRange)
|
||||
{
|
||||
FieldObjectSetSpecialAnim(trainerObj, GetGoSpeed0AnimId(trainerObj->mapobj_unk_18));
|
||||
task->tTrainerRange--;
|
||||
}
|
||||
else
|
||||
{
|
||||
FieldObjectSetSpecialAnim(trainerObj, 0x3E);
|
||||
task->tFuncId++;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool8 sub_80B425C(u8 taskId, struct Task *task, struct MapObject *trainerObj)
|
||||
{
|
||||
struct MapObject *playerObj;
|
||||
|
||||
if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) && !FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
|
||||
return FALSE;
|
||||
|
||||
npc_set_running_behaviour_etc(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18));
|
||||
sub_808F23C(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18));
|
||||
sub_808F208(trainerObj);
|
||||
|
||||
playerObj = &gMapObjects[gPlayerAvatar.mapObjectId];
|
||||
if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj) && !FieldObjectClearAnimIfSpecialAnimFinished(playerObj))
|
||||
return FALSE;
|
||||
|
||||
sub_808BCE8();
|
||||
FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], GetFaceDirectionAnimId(GetOppositeDirection(trainerObj->mapobj_unk_18)));
|
||||
task->tFuncId++;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool8 sub_80B4318(u8 taskId, struct Task *task, struct MapObject *trainerObj)
|
||||
{
|
||||
struct MapObject *playerObj = &gMapObjects[gPlayerAvatar.mapObjectId];
|
||||
|
||||
if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj)
|
||||
|| FieldObjectClearAnimIfSpecialAnimFinished(playerObj))
|
||||
SwitchTaskToFollowupFunc(taskId);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool8 sub_80B435C(u8 taskId, struct Task *task, struct MapObject *trainerObj)
|
||||
{
|
||||
if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)
|
||||
|| FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
|
||||
{
|
||||
FieldObjectSetSpecialAnim(trainerObj, 0x59);
|
||||
task->tFuncId++;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool8 sub_80B4390(u8 taskId, struct Task *task, struct MapObject *trainerObj)
|
||||
{
|
||||
if (FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
|
||||
task->tFuncId = 3;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool8 sub_80B43AC(u8 taskId, struct Task *task, struct MapObject *trainerObj)
|
||||
{
|
||||
if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)
|
||||
|| FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
|
||||
{
|
||||
FieldObjectSetSpecialAnim(trainerObj, 0x3E);
|
||||
task->tFuncId++;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool8 sub_80B43E0(u8 taskId, struct Task *task, struct MapObject *trainerObj)
|
||||
{
|
||||
if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(trainerObj))
|
||||
{
|
||||
gFieldEffectArguments[0] = trainerObj->coords2.x;
|
||||
gFieldEffectArguments[1] = trainerObj->coords2.y;
|
||||
gFieldEffectArguments[2] = gSprites[trainerObj->spriteId].subpriority - 1;
|
||||
gFieldEffectArguments[3] = 2;
|
||||
task->tOutOfAshSpriteId = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH);
|
||||
task->tFuncId++;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool8 sub_80B4438(u8 taskId, struct Task *task, struct MapObject *trainerObj)
|
||||
{
|
||||
struct Sprite *sprite;
|
||||
|
||||
if (gSprites[task->tOutOfAshSpriteId].animCmdIndex == 2)
|
||||
{
|
||||
trainerObj->mapobj_bit_26 = 0;
|
||||
trainerObj->mapobj_bit_2 = 1;
|
||||
|
||||
sprite = &gSprites[trainerObj->spriteId];
|
||||
sprite->oam.priority = 2;
|
||||
FieldObjectClearAnimIfSpecialAnimFinished(trainerObj);
|
||||
FieldObjectSetSpecialAnim(trainerObj, sub_80934BC(trainerObj->mapobj_unk_18));
|
||||
task->tFuncId++;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool8 sub_80B44AC(u8 taskId, struct Task *task, struct MapObject *trainerObj)
|
||||
{
|
||||
if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH))
|
||||
task->tFuncId = 3;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#undef tFuncId
|
||||
#undef tTrainerRange
|
||||
#undef tOutOfAshSpriteId
|
||||
#undef tTrainerMapObjectId
|
||||
|
||||
static void sub_80B44C8(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
struct MapObject *mapObj;
|
||||
|
||||
// another mapObj loaded into by loadword?
|
||||
LoadWordFromTwoHalfwords(&task->data[1], (u32 *)&mapObj);
|
||||
if (!task->data[7])
|
||||
{
|
||||
FieldObjectClearAnim(mapObj);
|
||||
task->data[7]++;
|
||||
}
|
||||
sTrainerSeeFuncList2[task->data[0]](taskId, task, mapObj);
|
||||
if (task->data[0] == 3 && !FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH))
|
||||
{
|
||||
npc_set_running_behaviour_etc(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18));
|
||||
sub_808F23C(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18));
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
mapObj->mapobj_bit_7 = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B4578(struct MapObject *var)
|
||||
{
|
||||
StoreWordInTwoHalfwords(&gTasks[CreateTask(sub_80B44C8, 0)].data[1], (u32)var);
|
||||
}
|
||||
|
||||
void EndTrainerApproach(void)
|
||||
{
|
||||
sub_80B40C8(Task_DestroyTrainerApproachTask);
|
||||
}
|
||||
|
||||
static void Task_DestroyTrainerApproachTask(u8 taskId)
|
||||
{
|
||||
DestroyTask(taskId);
|
||||
EnableBothScriptContexts();
|
||||
}
|
||||
|
||||
void sub_80B45D0(void)
|
||||
{
|
||||
if (gNoOfApproachingTrainers == 2)
|
||||
{
|
||||
if (gApproachingTrainerId == 0)
|
||||
{
|
||||
gApproachingTrainerId++;
|
||||
gSpecialVar_Result = 1;
|
||||
UnfreezeMapObjects();
|
||||
sub_80974D0(gApproachingTrainers[1].mapObjectId);
|
||||
}
|
||||
else
|
||||
{
|
||||
gApproachingTrainerId = 0;
|
||||
gSpecialVar_Result = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
gSpecialVar_Result = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#define sLocalId data[0]
|
||||
#define sMapNum data[1]
|
||||
#define sMapGroup data[2]
|
||||
#define sData3 data[3]
|
||||
#define sData4 data[4]
|
||||
#define sFldEffId data[7]
|
||||
|
||||
u8 FldEff_ExclamationMarkIcon1(void)
|
||||
{
|
||||
u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x53);
|
||||
|
||||
if (spriteId != MAX_SPRITES)
|
||||
SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON_1, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
u8 FldEff_ExclamationMarkIcon2(void)
|
||||
{
|
||||
u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x52);
|
||||
|
||||
if (spriteId != MAX_SPRITES)
|
||||
SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON_2, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
u8 FldEff_HeartIcon(void)
|
||||
{
|
||||
u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_HeartIcon, 0, 0, 0x52);
|
||||
|
||||
if (spriteId != MAX_SPRITES)
|
||||
{
|
||||
struct Sprite *sprite = &gSprites[spriteId];
|
||||
|
||||
SetIconSpriteData(sprite, FLDEFF_HEART_ICON, 0);
|
||||
sprite->oam.paletteNum = 2;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnimNum)
|
||||
{
|
||||
sprite->oam.priority = 1;
|
||||
sprite->coordOffsetEnabled = 1;
|
||||
|
||||
sprite->sLocalId = gFieldEffectArguments[0];
|
||||
sprite->sMapNum = gFieldEffectArguments[1];
|
||||
sprite->sMapGroup = gFieldEffectArguments[2];
|
||||
sprite->sData3 = -5;
|
||||
sprite->sFldEffId = fldEffId;
|
||||
|
||||
StartSpriteAnim(sprite, spriteAnimNum);
|
||||
}
|
||||
|
||||
static void SpriteCB_TrainerIcons(struct Sprite *sprite)
|
||||
{
|
||||
u8 mapObjId;
|
||||
|
||||
if (TryGetFieldObjectIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &mapObjId)
|
||||
|| sprite->animEnded)
|
||||
{
|
||||
FieldEffectStop(sprite, sprite->sFldEffId);
|
||||
}
|
||||
else
|
||||
{
|
||||
struct Sprite *mapObjSprite = &gSprites[gMapObjects[mapObjId].spriteId];
|
||||
sprite->sData4 += sprite->sData3;
|
||||
sprite->pos1.x = mapObjSprite->pos1.x;
|
||||
sprite->pos1.y = mapObjSprite->pos1.y - 16;
|
||||
sprite->pos2.x = mapObjSprite->pos2.x;
|
||||
sprite->pos2.y = mapObjSprite->pos2.y + sprite->sData4;
|
||||
if (sprite->sData4)
|
||||
sprite->sData3++;
|
||||
else
|
||||
sprite->sData3 = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#undef sLocalId
|
||||
#undef sMapNum
|
||||
#undef sMapGroup
|
||||
#undef sData3
|
||||
#undef sData4
|
||||
#undef sFldEffId
|
||||
|
||||
u8 GetCurrentApproachingTrainerMapObjectId(void)
|
||||
{
|
||||
if (gApproachingTrainerId == 0)
|
||||
return gApproachingTrainers[0].mapObjectId;
|
||||
else
|
||||
return gApproachingTrainers[1].mapObjectId;
|
||||
}
|
||||
|
||||
u8 GetChosenApproachingTrainerMapObjectId(u8 arrayId)
|
||||
{
|
||||
if (arrayId >= ARRAY_COUNT(gApproachingTrainers))
|
||||
return 0;
|
||||
else if (arrayId == 0)
|
||||
return gApproachingTrainers[0].mapObjectId;
|
||||
else
|
||||
return gApproachingTrainers[1].mapObjectId;
|
||||
}
|
||||
|
||||
void sub_80B4808(void)
|
||||
{
|
||||
struct MapObject *trainerObj;
|
||||
|
||||
if (gUnknown_030060AC == 1)
|
||||
{
|
||||
trainerObj = &gMapObjects[gApproachingTrainers[gUnknown_03006080].mapObjectId];
|
||||
gUnknown_03006084[0] = GetFaceDirectionAnimId(GetOppositeDirection(trainerObj->mapobj_unk_18));
|
||||
gUnknown_03006084[1] = 0xFE;
|
||||
ScriptMovement_StartObjectMovementScript(0xFF, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, gUnknown_03006084);
|
||||
}
|
||||
else
|
||||
{
|
||||
trainerObj = &gMapObjects[gPlayerAvatar.mapObjectId];
|
||||
gUnknown_03006084[0] = GetFaceDirectionAnimId(trainerObj->mapobj_unk_18);
|
||||
gUnknown_03006084[1] = 0xFE;
|
||||
ScriptMovement_StartObjectMovementScript(0xFF, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, gUnknown_03006084);
|
||||
}
|
||||
|
||||
sub_809BE48(0xFF);
|
||||
}
|
||||
|
||||
230
src/use_pokeblock.c
Normal file
230
src/use_pokeblock.c
Normal file
@@ -0,0 +1,230 @@
|
||||
#include "global.h"
|
||||
#include "main.h"
|
||||
#include "pokeblock.h"
|
||||
#include "malloc.h"
|
||||
#include "palette.h"
|
||||
#include "pokenav.h"
|
||||
#include "unknown_task.h"
|
||||
#include "text.h"
|
||||
#include "bg.h"
|
||||
#include "window.h"
|
||||
#include "text_window.h"
|
||||
|
||||
struct UsePokeblockSubStruct
|
||||
{
|
||||
void (*field_0)(void);
|
||||
void (*callback)(void);
|
||||
struct Pokeblock *pokeblock;
|
||||
struct Pokemon *pokemon;
|
||||
u8 stringBuffer[0x40];
|
||||
u8 field_50;
|
||||
u8 field_51;
|
||||
u8 field_52;
|
||||
u8 field_53;
|
||||
u8 field_54;
|
||||
u8 field_55;
|
||||
u8 field_56;
|
||||
u8 field_57[5];
|
||||
u8 field_5c[5];
|
||||
u8 field_61[5];
|
||||
s16 field_66[5];
|
||||
};
|
||||
|
||||
struct UsePokeblockStruct
|
||||
{
|
||||
u8 field_0[0x7C58];
|
||||
u8 field_7C58[0x378];
|
||||
struct UsePokeblockSubStruct info;
|
||||
};
|
||||
|
||||
extern u16 gKeyRepeatStartDelay;
|
||||
|
||||
// this file's functions
|
||||
void sub_816636C(void (*func)(void));
|
||||
void sub_8166380(void);
|
||||
void sub_816631C(void);
|
||||
void sub_81662C0(void);
|
||||
void sub_8166564(void);
|
||||
void sub_8166304(void);
|
||||
void sub_81668F8(void);
|
||||
void sub_8167420(void);
|
||||
void sub_8167760(void);
|
||||
u8 sub_81672E4(u8 arg0);
|
||||
bool8 sub_8168328(void);
|
||||
bool8 sub_8167930(void);
|
||||
void sub_8167608(u8 arg0);
|
||||
void sub_8167BA0(u16 arg0, u8 copyToVramMode);
|
||||
|
||||
extern const struct BgTemplate gUnknown_085DFCCC[4];
|
||||
extern const struct WindowTemplate gUnknown_085DFCDC[];
|
||||
|
||||
// ram variables
|
||||
EWRAM_DATA struct UsePokeblockSubStruct *gUnknown_0203BC90 = NULL;
|
||||
EWRAM_DATA void (*gUnknown_0203BC94)(void) = NULL;
|
||||
EWRAM_DATA struct Pokeblock *gUnknown_0203BC98 = NULL;
|
||||
EWRAM_DATA u8 gPokeblockMonId = 0;
|
||||
EWRAM_DATA s16 gPokeblockGain = 0;
|
||||
EWRAM_DATA void *gUnknown_0203BCA0 = NULL;
|
||||
EWRAM_DATA void *gUnknown_0203BCA4 = NULL;
|
||||
EWRAM_DATA void *gUnknown_0203BCA8 = NULL;
|
||||
EWRAM_DATA struct UsePokeblockStruct *gUnknown_0203BCAC = NULL;
|
||||
|
||||
// const rom data
|
||||
// todo: make it static once the file is decompiled
|
||||
|
||||
// code
|
||||
void ChooseMonToGivePokeblock(struct Pokeblock *pokeblock, void (*callback)(void))
|
||||
{
|
||||
gUnknown_0203BCAC = AllocZeroed(0x806C);
|
||||
gUnknown_0203BC90 = &gUnknown_0203BCAC->info;
|
||||
gUnknown_0203BC90->pokeblock = pokeblock;
|
||||
gUnknown_0203BC90->callback = callback;
|
||||
sub_816636C(sub_8166380);
|
||||
SetMainCallback2(sub_816631C);
|
||||
}
|
||||
|
||||
void CB2_ReturnAndChooseMonToGivePokeblock(void)
|
||||
{
|
||||
gUnknown_0203BCAC = AllocZeroed(0x806C);
|
||||
gUnknown_0203BC90 = &gUnknown_0203BCAC->info;
|
||||
gUnknown_0203BC90->pokeblock = gUnknown_0203BC98;
|
||||
gUnknown_0203BC90->callback = gUnknown_0203BC94;
|
||||
gPokeblockMonId = sub_81672E4(gPokeblockMonId);
|
||||
gUnknown_0203BC90->field_56 = gPokeblockMonId < 4 ? 0 : 1;
|
||||
sub_816636C(sub_8166380);
|
||||
SetMainCallback2(sub_81662C0);
|
||||
}
|
||||
|
||||
void sub_81662C0(void)
|
||||
{
|
||||
gUnknown_0203BC90->field_0();
|
||||
AnimateSprites();
|
||||
BuildOamBuffer();
|
||||
UpdatePaletteFade();
|
||||
if (gUnknown_0203BC90->field_0 == sub_8166564)
|
||||
{
|
||||
gUnknown_0203BC90->field_50 = 0;
|
||||
SetMainCallback2(sub_8166304);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8166304(void)
|
||||
{
|
||||
sub_81668F8();
|
||||
AnimateSprites();
|
||||
BuildOamBuffer();
|
||||
UpdatePaletteFade();
|
||||
}
|
||||
|
||||
void sub_816631C(void)
|
||||
{
|
||||
gUnknown_0203BC90->field_0();
|
||||
AnimateSprites();
|
||||
BuildOamBuffer();
|
||||
RunTextPrinters();
|
||||
UpdatePaletteFade();
|
||||
}
|
||||
|
||||
void sub_8166340(void)
|
||||
{
|
||||
LoadOam();
|
||||
ProcessSpriteCopyRequests();
|
||||
TransferPlttBuffer();
|
||||
sub_81D2108(gUnknown_0203BCAC->field_7C58);
|
||||
sub_80BA0A8();
|
||||
}
|
||||
|
||||
void sub_816636C(void (*func)(void))
|
||||
{
|
||||
gUnknown_0203BC90->field_0 = func;
|
||||
gUnknown_0203BC90->field_50 = 0;
|
||||
}
|
||||
|
||||
void sub_8166380(void)
|
||||
{
|
||||
switch (gUnknown_0203BC90->field_50)
|
||||
{
|
||||
case 0:
|
||||
gUnknown_0203BCAC->field_0[0x7B10] = 0xFF;
|
||||
sub_81D1ED4(gUnknown_0203BCAC->field_7C58);
|
||||
gUnknown_0203BC90->field_50++;
|
||||
break;
|
||||
case 1:
|
||||
ResetSpriteData();
|
||||
FreeAllSpritePalettes();
|
||||
gUnknown_0203BC90->field_50++;
|
||||
break;
|
||||
case 2:
|
||||
SetVBlankCallback(NULL);
|
||||
CpuFill32(0, (void*)(VRAM), VRAM_SIZE);
|
||||
gUnknown_0203BC90->field_50++;
|
||||
break;
|
||||
case 3:
|
||||
ResetBgsAndClearDma3BusyFlags(0);
|
||||
InitBgsFromTemplates(0, gUnknown_085DFCCC, ARRAY_COUNT(gUnknown_085DFCCC));
|
||||
InitWindows(gUnknown_085DFCDC);
|
||||
DeactivateAllTextPrinters();
|
||||
sub_809882C(0, 0x97, 0xE0);
|
||||
gUnknown_0203BC90->field_50++;
|
||||
break;
|
||||
case 4:
|
||||
gUnknown_0203BC90->field_50++;
|
||||
break;
|
||||
case 5:
|
||||
if (!sub_8168328())
|
||||
{
|
||||
gUnknown_0203BC90->field_50++;
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
gKeyRepeatStartDelay = 20;
|
||||
sub_8167420();
|
||||
gUnknown_0203BC90->field_50++;
|
||||
break;
|
||||
case 7:
|
||||
if (!sub_8167930())
|
||||
{
|
||||
gUnknown_0203BC90->field_50++;
|
||||
}
|
||||
break;
|
||||
case 8:
|
||||
sub_8167608(0);
|
||||
sub_8167760();
|
||||
gUnknown_0203BC90->field_50++;
|
||||
break;
|
||||
case 9:
|
||||
if (!sub_81D312C(&gUnknown_0203BCAC->field_0[0x7B0E]))
|
||||
{
|
||||
gUnknown_0203BC90->field_50++;
|
||||
}
|
||||
break;
|
||||
case 10:
|
||||
gUnknown_0203BC90->field_50++;
|
||||
break;
|
||||
case 11:
|
||||
sub_81D2754(gUnknown_0203BCAC->field_7C58, &gUnknown_0203BCAC->field_0[0x7C6C]);
|
||||
sub_81D20AC(gUnknown_0203BCAC->field_7C58);
|
||||
gUnknown_0203BC90->field_50++;
|
||||
break;
|
||||
case 12:
|
||||
if (!sub_81D20BC(gUnknown_0203BCAC->field_7C58))
|
||||
{
|
||||
sub_81D1F84(gUnknown_0203BCAC->field_7C58, &gUnknown_0203BCAC->field_7C58[0x14], &gUnknown_0203BCAC->field_7C58[0x14]);
|
||||
gUnknown_0203BC90->field_50++;
|
||||
}
|
||||
break;
|
||||
case 13:
|
||||
sub_81D2230(gUnknown_0203BCAC->field_7C58);
|
||||
gUnknown_0203BC90->field_50++;
|
||||
break;
|
||||
case 14:
|
||||
PutWindowTilemap(0);
|
||||
PutWindowTilemap(1);
|
||||
sub_8167BA0(0, 1);
|
||||
gUnknown_0203BC90->field_50++;
|
||||
break;
|
||||
case 15:
|
||||
sub_816636C(sub_8166564);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,7 @@
|
||||
#include "task.h"
|
||||
#include "strings.h"
|
||||
#include "sound.h"
|
||||
#include "songs.h"
|
||||
#include "constants/songs.h"
|
||||
#include "trig.h"
|
||||
#include "decompress.h"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user