Merge branch 'master' of https://github.com/pret/pokeemerald into decompile_pokedex

This commit is contained in:
golem galvanize
2018-04-25 00:28:57 -04:00
68 changed files with 4728 additions and 8948 deletions

View File

@@ -123,7 +123,7 @@ EWRAM_DATA static u8 sAnimBackgroundFadeState = 0;
EWRAM_DATA static u16 sAnimMoveIndex = 0; // set but unused.
EWRAM_DATA u8 gBattleAnimAttacker = 0;
EWRAM_DATA u8 gBattleAnimTarget = 0;
EWRAM_DATA u16 gAnimSpeciesByBanks[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA u16 gAnimBattlerSpecies[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA u8 gUnknown_02038440 = 0;
// const rom data
@@ -228,15 +228,15 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
if (GetBattlerSide(i) != 0)
gAnimSpeciesByBanks[i] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);
gAnimBattlerSpecies[i] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);
else
gAnimSpeciesByBanks[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);
gAnimBattlerSpecies[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);
}
}
else
{
for (i = 0; i < 4; i++)
gAnimSpeciesByBanks[i] = gContestResources->field_18->field_0;
gAnimBattlerSpecies[i] = gContestResources->field_18->field_0;
}
if (!isMoveAnim)
@@ -1318,16 +1318,16 @@ s8 BattleAnimAdjustPanning2(s8 pan)
return pan;
}
s16 sub_80A52EC(s16 a)
s16 KeepPanInRange(s16 panArg)
{
s16 var = a;
s16 pan = panArg;
if (var > 63)
var = 63;
else if (var < -64)
var = -64;
if (pan > PAN_SIDE_OPPONENT)
pan = PAN_SIDE_OPPONENT;
else if (pan < PAN_SIDE_PLAYER)
pan = PAN_SIDE_PLAYER;
return var;
return pan;
}
s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan)

View File

@@ -0,0 +1,438 @@
#include "global.h"
#include "battle.h"
#include "constants/battle_anim.h"
#include "constants/species.h"
#include "battle_anim.h"
#include "task.h"
#include "sound.h"
#include "contest.h"
// this file's functions
static void sub_8158B98(u8 taskId);
static void sub_8158C04(u8 taskId);
static void sub_8158D08(u8 taskId);
static void sub_8158FF4(u8 taskId);
static void sub_815913C(u8 taskId);
static void sub_8159308(u8 taskId);
// task start
void sub_8158B30(u8 taskId)
{
s8 pan1, pan2, panIncrement;
gTasks[taskId].data[0] = gBattleAnimArgs[0];
gTasks[taskId].data[1] = gBattleAnimArgs[1];
pan1 = BattleAnimAdjustPanning(PAN_SIDE_PLAYER);
pan2 = BattleAnimAdjustPanning(PAN_SIDE_OPPONENT);
panIncrement = CalculatePanIncrement(pan1, pan2, 2);
gTasks[taskId].data[2] = pan1;
gTasks[taskId].data[3] = pan2;
gTasks[taskId].data[4] = panIncrement;
gTasks[taskId].data[10] = 10;
gTasks[taskId].func = sub_8158B98;
}
static void sub_8158B98(u8 taskId)
{
s16 pan = gTasks[taskId].data[2];
s8 panIncrement = gTasks[taskId].data[4];
if (++gTasks[taskId].data[11] == 111)
{
gTasks[taskId].data[10] = 5;
gTasks[taskId].data[11] = 0;
gTasks[taskId].func = sub_8158C04;
}
else
{
if (++gTasks[taskId].data[10] == 11)
{
gTasks[taskId].data[10] = 0;
PlaySE12WithPanning(gTasks[taskId].data[0], pan);
}
pan += panIncrement;
gTasks[taskId].data[2] = KeepPanInRange(pan);
}
}
static void sub_8158C04(u8 taskId)
{
if (++gTasks[taskId].data[10] == 6)
{
s8 pan;
gTasks[taskId].data[10] = 0;
pan = BattleAnimAdjustPanning(PAN_SIDE_OPPONENT);
PlaySE12WithPanning(gTasks[taskId].data[1], pan);
if (++gTasks[taskId].data[11] == 2)
DestroyAnimSoundTask(taskId);
}
}
// task end
// task start
void sub_8158C58(u8 taskId)
{
u16 songId = gBattleAnimArgs[0];
s8 targetPan = gBattleAnimArgs[2];
s8 panIncrement = gBattleAnimArgs[3];
u8 r10 = gBattleAnimArgs[4];
u8 r7 = gBattleAnimArgs[5];
u8 r9 = gBattleAnimArgs[6];
s8 sourcePan = BattleAnimAdjustPanning(gBattleAnimArgs[1]);
targetPan = BattleAnimAdjustPanning(targetPan);
panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement);
gTasks[taskId].data[0] = songId;
gTasks[taskId].data[1] = sourcePan;
gTasks[taskId].data[2] = targetPan;
gTasks[taskId].data[3] = panIncrement;
gTasks[taskId].data[4] = r10;
gTasks[taskId].data[5] = r7;
gTasks[taskId].data[6] = r9;
gTasks[taskId].data[10] = 0;
gTasks[taskId].data[11] = sourcePan;
gTasks[taskId].data[12] = r9;
gTasks[taskId].func = sub_8158D08;
sub_8158D08(taskId);
}
static void sub_8158D08(u8 taskId)
{
if (gTasks[taskId].data[12]++ == gTasks[taskId].data[6])
{
gTasks[taskId].data[12] = 0;
PlaySE12WithPanning(gTasks[taskId].data[0], gTasks[taskId].data[11]);
if (--gTasks[taskId].data[4] == 0)
{
DestroyAnimSoundTask(taskId);
return;
}
}
if (gTasks[taskId].data[10]++ == gTasks[taskId].data[5])
{
gTasks[taskId].data[10] = 0;
gTasks[taskId].data[11] += gTasks[taskId].data[3];
gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11]);
}
}
// task end
// task start
void sub_8158D8C(u8 taskId)
{
u16 species = 0;
s8 pan = BattleAnimAdjustPanning(PAN_SIDE_PLAYER);
if (IsContest())
{
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
species = gContestResources->field_18->field_0;
else
DestroyAnimVisualTask(taskId); // UB: function should return upon destroying task
}
else
{
u8 battlerId;
// get wanted battler
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
battlerId = gBattleAnimAttacker;
else if (gBattleAnimArgs[0] == ANIM_TARGET)
battlerId = gBattleAnimTarget;
else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER)
battlerId = BATTLE_PARTNER(gBattleAnimAttacker);
else
battlerId = BATTLE_PARTNER(gBattleAnimTarget);
// check if battler is visible
if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER) && !IsBattlerSpriteVisible(battlerId))
{
DestroyAnimVisualTask(taskId);
return;
}
if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
else
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
}
if (species != SPECIES_NONE)
PlayCry3(species, pan, 3);
DestroyAnimVisualTask(taskId);
}
// task end
// task start
void sub_8158E9C(u8 taskId)
{
u16 species = 0;
s8 pan = BattleAnimAdjustPanning(PAN_SIDE_PLAYER);
if (IsContest())
{
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
species = gContestResources->field_18->field_0;
else
DestroyAnimVisualTask(taskId); // UB: function should return upon destroying task
}
else
{
u8 battlerId;
// get wanted battler
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
battlerId = gBattleAnimAttacker;
else if (gBattleAnimArgs[0] == ANIM_TARGET)
battlerId = gBattleAnimTarget;
else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER)
battlerId = BATTLE_PARTNER(gBattleAnimAttacker);
else
battlerId = BATTLE_PARTNER(gBattleAnimTarget);
// check if battler is visible
if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER) && !IsBattlerSpriteVisible(battlerId))
{
DestroyAnimVisualTask(taskId);
return;
}
if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
else
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
}
gTasks[taskId].data[0] = gBattleAnimArgs[1];
gTasks[taskId].data[1] = species;
gTasks[taskId].data[2] = pan;
if (species != SPECIES_NONE)
{
if (gBattleAnimArgs[1] == 0xFF)
PlayCry3(species, pan, 9);
else
PlayCry3(species, pan, 7);
gTasks[taskId].func = sub_8158FF4;
}
else
{
DestroyAnimVisualTask(taskId);
}
}
static void sub_8158FF4(u8 taskId)
{
u16 species = gTasks[taskId].data[1];
s8 pan = gTasks[taskId].data[2];
if (gTasks[taskId].data[9] < 2)
{
gTasks[taskId].data[9]++;
}
else
{
if (gTasks[taskId].data[0] == 0xFF)
{
if (!IsCryPlaying())
{
PlayCry3(species, pan, 10);
DestroyAnimVisualTask(taskId);
}
}
else
{
if (!IsCryPlaying())
{
PlayCry3(species, pan, 8);
DestroyAnimVisualTask(taskId);
}
}
}
}
// task end
void sub_8159078(u8 taskId)
{
if (gTasks[taskId].data[9] < 2)
{
gTasks[taskId].data[9]++;
}
else
{
if (!IsCryPlaying())
DestroyAnimVisualTask(taskId);
}
}
// task start
void sub_81590B8(u8 taskId)
{
u16 species;
s8 pan;
gTasks[taskId].data[10] = gBattleAnimArgs[0];
pan = BattleAnimAdjustPanning(PAN_SIDE_PLAYER);
if (IsContest())
species = gContestResources->field_18->field_0;
else
species = gAnimBattlerSpecies[gBattleAnimAttacker];
gTasks[taskId].data[1] = species;
gTasks[taskId].data[2] = pan;
if (species != SPECIES_NONE)
gTasks[taskId].func = sub_815913C;
else
DestroyAnimVisualTask(taskId);
}
static void sub_815913C(u8 taskId)
{
u16 species = gTasks[taskId].data[1];
s8 pan = gTasks[taskId].data[2];
switch (gTasks[taskId].data[9])
{
case 2:
PlayCry6(species, pan, 4);
gTasks[taskId].data[9]++;
break;
case 1:
case 3:
case 4:
gTasks[taskId].data[9]++;
break;
case 5:
if (IsCryPlaying())
break;
case 0:
StopCryAndClearCrySongs();
gTasks[taskId].data[9]++;
break;
default:
if (gTasks[taskId].data[10] == 0)
PlayCry6(species, pan, 6);
else
PlayCry3(species, pan, 6);
DestroyAnimVisualTask(taskId);
break;
}
}
// task end
void sub_8159210(u8 taskId)
{
u16 songId = gBattleAnimArgs[0];
s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]);
PlaySE1WithPanning(songId, pan);
DestroyAnimVisualTask(taskId);
}
void sub_8159244(u8 taskId)
{
u16 songId = gBattleAnimArgs[0];
s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]);
PlaySE2WithPanning(songId, pan);
DestroyAnimVisualTask(taskId);
}
void sub_8159278(u8 taskId)
{
s8 targetPan = gBattleAnimArgs[1];
s8 panIncrement = gBattleAnimArgs[2];
u16 r9 = gBattleAnimArgs[3];
s8 sourcePan = BattleAnimAdjustPanning(gBattleAnimArgs[0]);
targetPan = BattleAnimAdjustPanning(targetPan);
panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement);
gTasks[taskId].data[1] = sourcePan;
gTasks[taskId].data[2] = targetPan;
gTasks[taskId].data[3] = panIncrement;
gTasks[taskId].data[5] = r9;
gTasks[taskId].data[10] = 0;
gTasks[taskId].data[11] = sourcePan;
gTasks[taskId].func = sub_8159308;
sub_8159308(taskId);
}
#ifdef NONMATCHING
void sub_8159308(u8 taskId)
{
s16 panIncrement = gTasks[taskId].data[3];
if (gTasks[taskId].data[10]++ == gTasks[taskId].data[5])
{
gTasks[taskId].data[10] = 0;
gTasks[taskId].data[11] += panIncrement;
gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11]);
}
gUnknown_02038440 = gTasks[taskId].data[11];
if (gTasks[taskId].data[11] == gTasks[taskId].data[2])
DestroyAnimVisualTask(taskId);
}
#else
ASM_DIRECT
void sub_8159308(u8 taskId)
{
asm_unified(" push {r4,r5,lr}\n\
lsls r0, 24\n\
lsrs r0, 24\n\
adds r5, r0, 0\n\
ldr r1, =gTasks\n\
lsls r0, r5, 2\n\
adds r0, r5\n\
lsls r0, 3\n\
adds r4, r0, r1\n\
ldrh r2, [r4, 0xE]\n\
ldrh r0, [r4, 0x1C]\n\
adds r1, r0, 0x1\n\
strh r1, [r4, 0x1C]\n\
lsls r0, 16\n\
asrs r0, 16\n\
movs r3, 0x12\n\
ldrsh r1, [r4, r3]\n\
cmp r0, r1\n\
bne _08159342\n\
movs r0, 0\n\
strh r0, [r4, 0x1C]\n\
ldrh r1, [r4, 0x1E]\n\
adds r0, r2, r1\n\
strh r0, [r4, 0x1E]\n\
movs r2, 0x1E\n\
ldrsh r0, [r4, r2]\n\
bl KeepPanInRange\n\
strh r0, [r4, 0x1E]\n\
_08159342:\n\
ldr r1, =gUnknown_02038440\n\
ldrh r0, [r4, 0x1E]\n\
strb r0, [r1]\n\
movs r3, 0x1E\n\
ldrsh r1, [r4, r3]\n\
movs r2, 0xC\n\
ldrsh r0, [r4, r2]\n\
cmp r1, r0\n\
bne _0815935A\n\
adds r0, r5, 0\n\
bl DestroyAnimVisualTask\n\
_0815935A:\n\
pop {r4,r5}\n\
pop {r0}\n\
bx r0\n\
.pool");
}
#endif

View File

@@ -12,7 +12,6 @@
extern bool8 gBikeCyclingChallenge;
extern u8 gBikeCollisions;
extern bool8 gUnknown_02037348;
extern u8 sub_8093514(u8 direction);
extern u8 sub_808B980(u8 direction);
@@ -989,7 +988,7 @@ bool8 player_should_look_direction_be_enforced_upon_movement(void)
void GetOnOffBike(u8 transitionFlags)
{
gUnknown_02037348 = FALSE;
gUnusedBikeCameraAheadPanback = FALSE;
if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE))
{

View File

@@ -1305,12 +1305,12 @@ void sub_8128060(u8 taskId)
void ConfigureCameraObjectForPlacingDecoration(struct PlaceDecorationGraphicsDataBuffer *data, u8 decor)
{
sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.unk4].data[0];
gUnknown_03005DD0.unk4 = gpu_pal_decompress_alloc_tag_and_upload(data, decor);
gSprites[gUnknown_03005DD0.unk4].oam.priority = 1;
gSprites[gUnknown_03005DD0.unk4].callback = sub_81292D0;
gSprites[gUnknown_03005DD0.unk4].pos1.x = gUnknown_085A7250[data->decoration->shape].x;
gSprites[gUnknown_03005DD0.unk4].pos1.y = gUnknown_085A7250[data->decoration->shape].y;
sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.spriteId].data[0];
gUnknown_03005DD0.spriteId = gpu_pal_decompress_alloc_tag_and_upload(data, decor);
gSprites[gUnknown_03005DD0.spriteId].oam.priority = 1;
gSprites[gUnknown_03005DD0.spriteId].callback = sub_81292D0;
gSprites[gUnknown_03005DD0.spriteId].pos1.x = gUnknown_085A7250[data->decoration->shape].x;
gSprites[gUnknown_03005DD0.spriteId].pos1.y = gUnknown_085A7250[data->decoration->shape].y;
}
void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct PlaceDecorationGraphicsDataBuffer *data)
@@ -1332,7 +1332,7 @@ void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct PlaceDecorationGraphic
}
gSprites[sDecor_CameraSpriteObjectIdx2].oam.priority = 1;
DestroySprite(&gSprites[sDecor_CameraSpriteObjectIdx1]);
sDecor_CameraSpriteObjectIdx1 = gUnknown_03005DD0.unk4;
sDecor_CameraSpriteObjectIdx1 = gUnknown_03005DD0.spriteId;
}
void sub_812826C(u8 taskId)
@@ -2251,9 +2251,9 @@ bool8 sub_81299AC(u8 taskId)
void SetUpPuttingAwayDecorationPlayerAvatar(void)
{
player_get_direction_lower_nybble();
sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.unk4].data[0];
sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.spriteId].data[0];
sub_812A39C();
gUnknown_03005DD0.unk4 = CreateSprite(&gUnknown_085A7404, 0x78, 0x50, 0);
gUnknown_03005DD0.spriteId = CreateSprite(&gUnknown_085A7404, 0x78, 0x50, 0);
if (gSaveBlock2Ptr->playerGender == MALE)
{
sDecor_CameraSpriteObjectIdx2 = AddPseudoFieldObject(0xC1, SpriteCallbackDummy, 0x88, 0x48, 0);
@@ -2264,7 +2264,7 @@ void SetUpPuttingAwayDecorationPlayerAvatar(void)
}
gSprites[sDecor_CameraSpriteObjectIdx2].oam.priority = 1;
DestroySprite(&gSprites[sDecor_CameraSpriteObjectIdx1]);
sDecor_CameraSpriteObjectIdx1 = gUnknown_03005DD0.unk4;
sDecor_CameraSpriteObjectIdx1 = gUnknown_03005DD0.spriteId;
gSprites[sDecor_CameraSpriteObjectIdx1].oam.priority = 1;
}

340
src/dewford_trend.c Normal file
View File

@@ -0,0 +1,340 @@
#include "global.h"
#include "dewford_trend.h"
#include "easy_chat.h"
#include "constants/easy_chat.h"
#include "event_data.h"
#include "link.h"
#include "malloc.h"
#include "random.h"
#include "text.h"
#include "tv.h"
// static functions
static void sub_8122804(struct EasyChatPair *s, u16 b, u8 c);
static bool8 sub_8122A58(struct EasyChatPair *a, struct EasyChatPair *b, u8 c);
static void sub_8122B28(struct EasyChatPair *s);
static bool8 SB1ContainsWords(u16 *a);
static bool8 IsEasyChatPairEqual(u16 *words1, u16 *words2);
static s16 GetEqualEasyChatPairIndex(struct EasyChatPair *s, struct EasyChatPair *a, u16 b);
// text
void InitDewfordTrend(void)
{
u16 i;
for (i = 0; i < 5; i++)
{
gSaveBlock1Ptr->easyChatPairs[i].words[0] = sub_811EE38(EC_GROUP_CONDITIONS);
if (Random() & 1)
gSaveBlock1Ptr->easyChatPairs[i].words[1] = sub_811EE38(EC_GROUP_LIFESTYLE);
else
gSaveBlock1Ptr->easyChatPairs[i].words[1] = sub_811EE38(EC_GROUP_HOBBIES);
gSaveBlock1Ptr->easyChatPairs[i].unk1_6 = Random() & 1;
sub_8122B28(&(gSaveBlock1Ptr->easyChatPairs[i]));
}
sub_8122804(gSaveBlock1Ptr->easyChatPairs, 5, 0);
}
void UpdateDewfordTrendPerDay(u16 a)
{
u16 i;
if (a != 0)
{
u32 sp0 = a * 5;
for (i = 0; i < 5; i++)
{
u32 r4;
u32 r2 = sp0;
struct EasyChatPair *r5 = &(gSaveBlock1Ptr->easyChatPairs[i]);
if (r5->unk1_6 == 0)
{
if (r5->unk0_0 >= (u16)r2)
{
r5->unk0_0 -= r2;
if (r5->unk0_0 == 0)
r5->unk1_6 = 1;
continue;
}
r2 -= r5->unk0_0;
r5->unk0_0 = 0;
r5->unk1_6 = 1;
}
r4 = r5->unk0_0 + r2;
if ((u16)r4 > r5->unk0_7)
{
u32 sp4 = r4 % r5->unk0_7;
r4 = r4 / r5->unk0_7;
r5->unk1_6 = r4 ^ 1;
if (r5->unk1_6)
r5->unk0_0 = sp4;
else
r5->unk0_0 = r5->unk0_7 - sp4;
}
else
{
r5->unk0_0 = r4;
if (r5->unk0_0 == r5->unk0_7)
r5->unk1_6 = 0;
}
}
sub_8122804(gSaveBlock1Ptr->easyChatPairs, 5, 0);
}
}
bool8 sub_81226D8(u16 *a)
{
struct EasyChatPair s = {0};
u16 i;
if (!SB1ContainsWords(a))
{
if (!FlagGet(FLAG_SYS_POPWORD_INPUT))
{
FlagSet(FLAG_SYS_POPWORD_INPUT);
if (!FlagGet(FLAG_SYS_MIX_RECORD))
{
gSaveBlock1Ptr->easyChatPairs[0].words[0] = a[0];
gSaveBlock1Ptr->easyChatPairs[0].words[1] = a[1];
return TRUE;
}
}
s.words[0] = a[0];
s.words[1] = a[1];
s.unk1_6 = 1;
sub_8122B28(&s);
for (i = 0; i < 5; i++)
{
if (sub_8122A58(&s, &(gSaveBlock1Ptr->easyChatPairs[i]), 0))
{
u16 r3 = 4;
while (r3 > i)
{
gSaveBlock1Ptr->easyChatPairs[r3] = gSaveBlock1Ptr->easyChatPairs[r3 - 1];
r3--;
}
gSaveBlock1Ptr->easyChatPairs[i] = s;
if(i == 4)
sub_80EDC60(a);
return (i == 0);
}
}
gSaveBlock1Ptr->easyChatPairs[4] = s;
sub_80EDC60(a);
}
return FALSE;
}
static void sub_8122804(struct EasyChatPair *s, u16 b, u8 c)
{
u16 h;
for (h = 0; h < b; h++)
{
u16 i;
for (i = h + 1; i < b; i++)
{
if (sub_8122A58(&s[i], &s[h], c))
{
struct EasyChatPair temp;
temp = s[i];
s[i] = s[h];
s[h] = temp;
}
}
}
}
void sub_812287C(void *a, u32 b, u8 unused)
{
u16 i, j, r3, players;
struct EasyChatPair *buffer1, *buffer2, *src, *dst, *foo_of_buffer2;
buffer1 = Alloc(0x100);
if(buffer1 != NULL)
{
buffer2 = Alloc(0x100);
if(buffer2 == NULL)
{
Free(buffer1);
}
else
{
players = GetLinkPlayerCount();
for (i = 0; i < players; i++)
memcpy(&(buffer1[i * 5]), (u8 *)a + i * b, 40);
src = buffer1;
dst = buffer2;
r3 = 0;
for (i = 0; i < players; i++)
{
for (j = 0; j < 5; j++)
{
s16 foo = GetEqualEasyChatPairIndex(buffer2, src, r3);
if (foo < 0)
{
*(dst++) = *src;
r3++;
}
else
{
foo_of_buffer2 = (struct EasyChatPair *)((u32)buffer2 + (foo * 8)); //required to do this to reverse the order of register operands in add ASM statement
if (foo_of_buffer2->unk0_0 < src->unk0_0)
{
*foo_of_buffer2 = *src;
}
}
src++;
}
}
sub_8122804(buffer2, r3, 2);
src = buffer2;
dst = gSaveBlock1Ptr->easyChatPairs;
for (i = 0; i < 5; i++)
*(dst++) = *(src++);
Free(buffer1);
Free(buffer2);
}
}
}
void BufferTrendyPhraseString(void)
{
struct EasyChatPair *s = &gSaveBlock1Ptr->easyChatPairs[gSpecialVar_0x8004];
ConvertEasyChatWordsToString(gStringVar1, s->words, 2, 1);
}
void TrendyPhraseIsOld(void)
{
u16 result = 0;
if (gSaveBlock1Ptr->easyChatPairs[0].unk0_0 - gSaveBlock1Ptr->easyChatPairs[1].unk0_0 < 2)
{
asm("":::"r2"); //Force the compiler to store address of gSaveBlock1 in r3 instead of r2
if (!gSaveBlock1Ptr->easyChatPairs[0].unk1_6 && gSaveBlock1Ptr->easyChatPairs[1].unk1_6)
result = 1;
}
gSpecialVar_Result = result;
}
void GetDewfordHallPaintingNameIndex(void)
{
gSpecialVar_Result = (gSaveBlock1Ptr->easyChatPairs[0].words[0] + gSaveBlock1Ptr->easyChatPairs[0].words[1]) & 7;
}
static bool8 sub_8122A58(struct EasyChatPair *a, struct EasyChatPair *b, u8 c)
{
switch (c)
{
case 0:
if (a->unk0_0 > b->unk0_0)
return 1;
if (a->unk0_0 < b->unk0_0)
return 0;
if (a->unk0_7 > b->unk0_7)
return 1;
if (a->unk0_7 < b->unk0_7)
return 0;
break;
case 1:
if (a->unk0_7 > b->unk0_7)
return 1;
if (a->unk0_7 < b->unk0_7)
return 0;
if (a->unk0_0 > b->unk0_0)
return 1;
if (a->unk0_0 < b->unk0_0)
return 0;
break;
case 2:
if (a->unk0_0 > b->unk0_0)
return 1;
if (a->unk0_0 < b->unk0_0)
return 0;
if (a->unk0_7 > b->unk0_7)
return 1;
if (a->unk0_7 < b->unk0_7)
return 0;
if (a->unk2 > b->unk2)
return 1;
if (a->unk2 < b->unk2)
return 0;
if (a->words[0] > b->words[0])
return 1;
if (a->words[0] < b->words[0])
return 0;
if (a->words[1] > b->words[1])
return 1;
if (a->words[1] < b->words[1])
return 0;
return 1;
}
return Random() & 1;
}
static void sub_8122B28(struct EasyChatPair *s)
{
u16 r4;
r4 = Random() % 98;
if (r4 > 50)
{
r4 = Random() % 98;
if (r4 > 80)
r4 = Random() % 98;
}
s->unk0_7 = r4 + 30;
s->unk0_0 = (Random() % (r4 + 1)) + 30;
s->unk2 = Random();
}
static bool8 SB1ContainsWords(u16 *a)
{
u16 i;
for (i = 0; i < 5; i++)
{
if (IsEasyChatPairEqual(a, gSaveBlock1Ptr->easyChatPairs[i].words) != 0)
return TRUE;
}
return FALSE;
}
static bool8 IsEasyChatPairEqual(u16 *words1, u16 *words2)
{
u16 i;
for (i = 0; i < 2; i++)
{
if (*(words1++) != *(words2++))
return FALSE;
}
return TRUE;
}
static s16 GetEqualEasyChatPairIndex(struct EasyChatPair*s, struct EasyChatPair *a, u16 b)
{
s16 i;
for (i = 0; i < b; i++)
{
if (IsEasyChatPairEqual(a->words, s->words))
return i;
s++;
}
return -1;
}

View File

@@ -1,9 +1,18 @@
// Includes
#include "global.h"
#include "berry.h"
#include "bike.h"
#include "field_camera.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
#include "field_map_obj.h"
#include "gpu_regs.h"
#include "menu.h"
#include "overworld.h"
#include "rotating_gate.h"
#include "sprite.h"
#include "text.h"
// Static type declarations
struct FieldCameraUnknownStruct
{
u8 unk0;
@@ -13,16 +22,474 @@ struct FieldCameraUnknownStruct
bool8 unk4;
};
// Static RAM declarations
// static functions
static void RedrawMapSliceNorth(struct FieldCameraUnknownStruct *a, const struct MapData *mapData);
static void RedrawMapSliceSouth(struct FieldCameraUnknownStruct *a, const struct MapData *mapData);
static void RedrawMapSliceEast(struct FieldCameraUnknownStruct *a, const struct MapData *mapData);
static void RedrawMapSliceWest(struct FieldCameraUnknownStruct *a, const struct MapData *mapData);
static s32 MapPosToBgTilemapOffset(struct FieldCameraUnknownStruct *a, s32 x, s32 y);
static void DrawWholeMapViewInternal(int x, int y, const struct MapData *mapData);
static void DrawMetatileAt(const struct MapData *mapData, u16, int, int);
static void DrawMetatile(s32 a, u16 *b, u16 c);
static void CameraPanningCB_PanAhead(void);
IWRAM_DATA struct FieldCameraUnknownStruct gUnknown_03000E20;
IWRAM_DATA s16 gUnknown_03000E28;
IWRAM_DATA s16 gUnknown_03000E2A;
IWRAM_DATA u8 gUnknown_03000E2C;
IWRAM_DATA void (*gUnknown_03000E30)(void);
// IWRAM bss vars
static IWRAM_DATA struct FieldCameraUnknownStruct gUnknown_03000E20;
static IWRAM_DATA s16 gUnknown_03000E28;
static IWRAM_DATA s16 gUnknown_03000E2A;
static IWRAM_DATA u8 gUnknown_03000E2C;
static IWRAM_DATA void (*gUnknown_03000E30)(void);
// Static ROM declarations
// text
static void move_tilemap_camera_to_upper_left_corner_(struct FieldCameraUnknownStruct *a)
{
a->unk2 = 0;
a->unk3 = 0;
a->unk0 = 0;
a->unk1 = 0;
a->unk4 = TRUE;
}
// .rodata
static void tilemap_move_something(struct FieldCameraUnknownStruct *a, u32 b, u32 c)
{
a->unk2 += b;
a->unk2 %= 32;
a->unk3 += c;
a->unk3 %= 32;
}
static void coords8_add(struct FieldCameraUnknownStruct *a, u32 b, u32 c)
{
a->unk0 += b;
a->unk1 += c;
}
void move_tilemap_camera_to_upper_left_corner(void)
{
move_tilemap_camera_to_upper_left_corner_(&gUnknown_03000E20);
}
void FieldUpdateBgTilemapScroll(void)
{
u32 r4, r5;
r5 = gUnknown_03000E20.unk0 + gUnknown_03000E28;
r4 = gUnknown_03000E2A + gUnknown_03000E20.unk1 + 8;
SetGpuReg(REG_OFFSET_BG1HOFS, r5);
SetGpuReg(REG_OFFSET_BG1VOFS, r4);
SetGpuReg(REG_OFFSET_BG2HOFS, r5);
SetGpuReg(REG_OFFSET_BG2VOFS, r4);
SetGpuReg(REG_OFFSET_BG3HOFS, r5);
SetGpuReg(REG_OFFSET_BG3VOFS, r4);
}
void sub_8089C08(s16 *a, s16 *b)
{
*a = gUnknown_03000E20.unk0 + gUnknown_03000E28;
*b = gUnknown_03000E20.unk1 + gUnknown_03000E2A + 8;
}
void DrawWholeMapView(void)
{
DrawWholeMapViewInternal(gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y, gMapHeader.mapData);
gUnknown_03000E20.unk4 = TRUE;
}
static void DrawWholeMapViewInternal(int x, int y, const struct MapData *mapData)
{
u8 i;
u8 j;
u32 r6;
u8 temp;
for (i = 0; i < 32; i += 2)
{
temp = gUnknown_03000E20.unk3 + i;
if (temp >= 32)
temp -= 32;
r6 = temp * 32;
for (j = 0; j < 32; j += 2)
{
temp = gUnknown_03000E20.unk2 + j;
if (temp >= 32)
temp -= 32;
DrawMetatileAt(mapData, r6 + temp, x + j / 2, y + i / 2);
}
}
}
static void RedrawMapSlicesForCameraUpdate(struct FieldCameraUnknownStruct *a, int x, int y)
{
const struct MapData *mapData = gMapHeader.mapData;
if (x > 0)
RedrawMapSliceWest(a, mapData);
if (x < 0)
RedrawMapSliceEast(a, mapData);
if (y > 0)
RedrawMapSliceNorth(a, mapData);
if (y < 0)
RedrawMapSliceSouth(a, mapData);
a->unk4 = TRUE;
}
static void RedrawMapSliceNorth(struct FieldCameraUnknownStruct *a, const struct MapData *mapData)
{
u8 i;
u8 temp;
u32 r7;
temp = a->unk3 + 28;
if (temp >= 32)
temp -= 32;
r7 = temp * 32;
for (i = 0; i < 32; i += 2)
{
temp = a->unk2 + i;
if (temp >= 32)
temp -= 32;
DrawMetatileAt(mapData, r7 + temp, gSaveBlock1Ptr->pos.x + i / 2, gSaveBlock1Ptr->pos.y + 14);
}
}
static void RedrawMapSliceSouth(struct FieldCameraUnknownStruct *a, const struct MapData *mapData)
{
u8 i;
u8 temp;
u32 r7 = a->unk3 * 32;
for (i = 0; i < 32; i += 2)
{
temp = a->unk2 + i;
if (temp >= 32)
temp -= 32;
DrawMetatileAt(mapData, r7 + temp, gSaveBlock1Ptr->pos.x + i / 2, gSaveBlock1Ptr->pos.y);
}
}
static void RedrawMapSliceEast(struct FieldCameraUnknownStruct *a, const struct MapData *mapData)
{
u8 i;
u8 temp;
u32 r6 = a->unk2;
for (i = 0; i < 32; i += 2)
{
temp = a->unk3 + i;
if (temp >= 32)
temp -= 32;
DrawMetatileAt(mapData, temp * 32 + r6, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y + i / 2);
}
}
static void RedrawMapSliceWest(struct FieldCameraUnknownStruct *a, const struct MapData *mapData)
{
u8 i;
u8 temp;
u8 r5 = a->unk2 + 28;
if (r5 >= 32)
r5 -= 32;
for (i = 0; i < 32; i += 2)
{
temp = a->unk3 + i;
if (temp >= 32)
temp -= 32;
DrawMetatileAt(mapData, temp * 32 + r5, gSaveBlock1Ptr->pos.x + 14, gSaveBlock1Ptr->pos.y + i / 2);
}
}
void CurrentMapDrawMetatileAt(int a, int b)
{
int offset = MapPosToBgTilemapOffset(&gUnknown_03000E20, a, b);
if (offset >= 0)
{
DrawMetatileAt(gMapHeader.mapData, offset, a, b);
gUnknown_03000E20.unk4 = TRUE;
}
}
void DrawDoorMetatileAt(int x, int y, u16 *arr)
{
int offset = MapPosToBgTilemapOffset(&gUnknown_03000E20, x, y);
if (offset >= 0)
{
DrawMetatile(1, arr, offset);
gUnknown_03000E20.unk4 = TRUE;
}
}
static void DrawMetatileAt(const struct MapData *mapData, u16 b, int c, int d)
{
u16 metatileId = MapGridGetMetatileIdAt(c, d);
u16 *metatiles;
if (metatileId > 1024)
metatileId = 0;
if (metatileId < 512)
metatiles = mapData->primaryTileset->metatiles;
else
{
metatiles = mapData->secondaryTileset->metatiles;
metatileId -= 512;
}
DrawMetatile(MapGridGetMetatileLayerTypeAt(c, d), metatiles + metatileId * 8, b);
}
static void DrawMetatile(s32 a, u16 *b, u16 c)
{
switch (a)
{
case 2:
gBGTilemapBuffers3[c] = b[0];
gBGTilemapBuffers3[c + 1] = b[1];
gBGTilemapBuffers3[c + 0x20] = b[2];
gBGTilemapBuffers3[c + 0x21] = b[3];
gBGTilemapBuffers1[c] = 0;
gBGTilemapBuffers1[c + 1] = 0;
gBGTilemapBuffers1[c + 0x20] = 0;
gBGTilemapBuffers1[c + 0x21] = 0;
gBGTilemapBuffers2[c] = b[4];
gBGTilemapBuffers2[c + 1] = b[5];
gBGTilemapBuffers2[c + 0x20] = b[6];
gBGTilemapBuffers2[c + 0x21] = b[7];
break;
case 1:
gBGTilemapBuffers3[c] = b[0];
gBGTilemapBuffers3[c + 1] = b[1];
gBGTilemapBuffers3[c + 0x20] = b[2];
gBGTilemapBuffers3[c + 0x21] = b[3];
gBGTilemapBuffers1[c] = b[4];
gBGTilemapBuffers1[c + 1] = b[5];
gBGTilemapBuffers1[c + 0x20] = b[6];
gBGTilemapBuffers1[c + 0x21] = b[7];
gBGTilemapBuffers2[c] = 0;
gBGTilemapBuffers2[c + 1] = 0;
gBGTilemapBuffers2[c + 0x20] = 0;
gBGTilemapBuffers2[c + 0x21] = 0;
break;
case 0:
gBGTilemapBuffers3[c] = 0x3014;
gBGTilemapBuffers3[c + 1] = 0x3014;
gBGTilemapBuffers3[c + 0x20] = 0x3014;
gBGTilemapBuffers3[c + 0x21] = 0x3014;
gBGTilemapBuffers1[c] = b[0];
gBGTilemapBuffers1[c + 1] = b[1];
gBGTilemapBuffers1[c + 0x20] = b[2];
gBGTilemapBuffers1[c + 0x21] = b[3];
gBGTilemapBuffers2[c] = b[4];
gBGTilemapBuffers2[c + 1] = b[5];
gBGTilemapBuffers2[c + 0x20] = b[6];
gBGTilemapBuffers2[c + 0x21] = b[7];
break;
}
schedule_bg_copy_tilemap_to_vram(1);
schedule_bg_copy_tilemap_to_vram(2);
schedule_bg_copy_tilemap_to_vram(3);
}
static s32 MapPosToBgTilemapOffset(struct FieldCameraUnknownStruct *a, s32 x, s32 y)
{
x -= gSaveBlock1Ptr->pos.x;
x *= 2;
if (x >= 32 || x < 0)
return -1;
x = x + a->unk2;
if (x >= 32)
x -= 32;
y = (y - gSaveBlock1Ptr->pos.y) * 2;
if (y >= 32 || y < 0)
return -1;
y = y + a->unk3;
if (y >= 32)
y -= 32;
return y * 32 + x;
}
static void CameraUpdateCallback(struct CameraObject *a)
{
if (a->spriteId != 0)
{
a->unk8 = gSprites[a->spriteId].data[2];
a->unkC = gSprites[a->spriteId].data[3];
}
}
void ResetCameraUpdateInfo(void)
{
gUnknown_03005DD0.unk8 = 0;
gUnknown_03005DD0.unkC = 0;
gUnknown_03005DD0.x = 0;
gUnknown_03005DD0.y = 0;
gUnknown_03005DD0.spriteId = 0;
gUnknown_03005DD0.callback = NULL;
}
u32 InitCameraUpdateCallback(u8 a)
{
if (gUnknown_03005DD0.spriteId != 0)
DestroySprite(&gSprites[gUnknown_03005DD0.spriteId]);
gUnknown_03005DD0.spriteId = AddCameraObject(a);
gUnknown_03005DD0.callback = CameraUpdateCallback;
return 0;
}
void CameraUpdate(void)
{
int deltaX;
int deltaY;
int r0;
int r1;
int r7;
int r8;
if (gUnknown_03005DD0.callback != NULL)
gUnknown_03005DD0.callback(&gUnknown_03005DD0);
r7 = gUnknown_03005DD0.unk8;
r8 = gUnknown_03005DD0.unkC;
deltaX = 0;
deltaY = 0;
r1 = gUnknown_03005DD0.x;
r0 = gUnknown_03005DD0.y;
if (r1 == 0 && r7 != 0)
{
if (r7 > 0)
deltaX = 1;
else
deltaX = -1;
}
if (r0 == 0 && r8 != 0)
{
if (r8 > 0)
deltaY = 1;
else
deltaY = -1;
}
if (r1 != 0 && r1 == -r7)
{
if (r7 > 0)
deltaX = 1;
else
deltaX = -1;
}
if (r0 != 0 && r0 == -r8)
{
if (r8 > 0)
deltaX = 1;
else
deltaX = -1;
}
gUnknown_03005DD0.x += r7;
gUnknown_03005DD0.x = gUnknown_03005DD0.x - 16 * (gUnknown_03005DD0.x / 16);
gUnknown_03005DD0.y += r8;
gUnknown_03005DD0.y = gUnknown_03005DD0.y - 16 * (gUnknown_03005DD0.y / 16);
if (deltaX != 0 || deltaY != 0)
{
CameraMove(deltaX, deltaY);
UpdateFieldObjectsForCameraUpdate(deltaX, deltaY);
RotatingGatePuzzleCameraUpdate(deltaX, deltaY);
ResetBerryTreeSparkleFlags();
tilemap_move_something(&gUnknown_03000E20, deltaX * 2, deltaY * 2);
RedrawMapSlicesForCameraUpdate(&gUnknown_03000E20, deltaX * 2, deltaY * 2);
}
coords8_add(&gUnknown_03000E20, r7, r8);
gUnknown_03005DEC -= r7;
gUnknown_03005DE8 -= r8;
}
void camera_move_and_redraw(int a, int b) //unused
{
CameraMove(a, b);
UpdateFieldObjectsForCameraUpdate(a, b);
DrawWholeMapView();
gUnknown_03005DEC -= a * 16;
gUnknown_03005DE8 -= b * 16;
}
void SetCameraPanningCallback(void (*a)(void))
{
gUnknown_03000E30 = a;
}
void SetCameraPanning(s16 a, s16 b)
{
gUnknown_03000E28 = a;
gUnknown_03000E2A = b + 32;
}
void InstallCameraPanAheadCallback(void)
{
gUnknown_03000E30 = CameraPanningCB_PanAhead;
gUnknown_03000E2C = 0;
gUnknown_03000E28 = 0;
gUnknown_03000E2A = 32;
}
void UpdateCameraPanning(void)
{
if (gUnknown_03000E30 != NULL)
gUnknown_03000E30();
//Update sprite offset of overworld objects
gSpriteCoordOffsetX = gUnknown_03005DEC - gUnknown_03000E28;
gSpriteCoordOffsetY = gUnknown_03005DE8 - gUnknown_03000E2A - 8;
}
static void CameraPanningCB_PanAhead(void)
{
u8 var;
if (gUnusedBikeCameraAheadPanback == FALSE)
{
InstallCameraPanAheadCallback();
}
else
{
// this code is never reached.
if (gPlayerAvatar.tileTransitionState == T_TILE_TRANSITION)
{
gUnknown_03000E2C ^= 1;
if (gUnknown_03000E2C == 0)
return;
}
else
{
gUnknown_03000E2C = 0;
}
var = player_get_direction_upper_nybble();
if (var == 2)
{
if (gUnknown_03000E2A > -8)
gUnknown_03000E2A -= 2;
}
else if (var == 1)
{
if (gUnknown_03000E2A < 72)
gUnknown_03000E2A += 2;
}
else if (gUnknown_03000E2A < 32)
{
gUnknown_03000E2A += 2;
}
else if (gUnknown_03000E2A > 32)
{
gUnknown_03000E2A -= 2;
}
}
}
// .text

View File

@@ -912,7 +912,7 @@ void re_escape_rope(u8 taskId)
DisplayItemMessageOnField(taskId, gStringVar4, task08_080A1C44);
}
bool8 sub_80FE314(void)
bool8 CanUseEscapeRopeOnCurrMap(void)
{
if (gMapHeader.flags & 2)
return TRUE;
@@ -922,7 +922,7 @@ bool8 sub_80FE314(void)
void ItemUseOutOfBattle_EscapeRope(u8 taskId)
{
if (sub_80FE314() == TRUE)
if (CanUseEscapeRopeOnCurrMap() == TRUE)
{
gUnknown_0203A0F4 = re_escape_rope;
SetUpItemUseOnFieldCallback(taskId);

View File

@@ -403,11 +403,11 @@ static bool8 MailReadBuildGraphics(void)
switch (sMailRead->animsActive)
{
case 1:
sub_80D2F68(icon);
LoadMonIconPalette(icon);
sMailRead->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x60, 0x80, 0, 0);
break;
case 2:
sub_80D2F68(icon);
LoadMonIconPalette(icon);
sMailRead->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x28, 0x80, 0, 0);
break;
}
@@ -540,7 +540,7 @@ static void CB2_ExitMailReadFreeVars(void)
{
case 1:
case 2:
sub_80D2FF0(sub_80D2E84(sMailRead->mail->species));
FreeMonIconPalette(sub_80D2E84(sMailRead->mail->species));
sub_80D2EF8(&gSprites[sMailRead->monIconSprite]);
}
memset(sMailRead, 0, sizeof(*sMailRead));

474
src/map_name_popup.c Normal file
View File

@@ -0,0 +1,474 @@
#include "global.h"
#include "constants/region_map_sections.h"
#include "constants/weather.h"
#include "bg.h"
#include "event_data.h"
#include "gpu_regs.h"
#include "international_string_util.h"
#include "menu.h"
#include "map_name_popup.h"
#include "palette.h"
#include "region_map.h"
#include "rom_818CFC8.h"
#include "start_menu.h"
#include "string_util.h"
#include "task.h"
#include "text.h"
// enums
enum MapPopUp_Themes
{
MAPPOPUP_THEME_WOOD,
MAPPOPUP_THEME_MARBLE,
MAPPOPUP_THEME_STONE,
MAPPOPUP_THEME_BRICK,
MAPPOPUP_THEME_UNDERWATER,
MAPPOPUP_THEME_STONE2,
};
// static functions
static void Task_MapNamePopUpWindow(u8 taskId);
static void ShowMapNamePopUpWindow(void);
static void LoadMapNamePopUpWindowBg(void);
// EWRAM
static EWRAM_DATA u8 mapNamePopupTaskId = 0;
// .rodata
static const u8 gMapPopUp_Table[][960] =
{
INCBIN_U8("graphics/interface/map_popup/wood.4bpp"),
INCBIN_U8("graphics/interface/map_popup/marble.4bpp"),
INCBIN_U8("graphics/interface/map_popup/stone.4bpp"),
INCBIN_U8("graphics/interface/map_popup/brick.4bpp"),
INCBIN_U8("graphics/interface/map_popup/underwater.4bpp"),
INCBIN_U8("graphics/interface/map_popup/stone2.4bpp"),
};
static const u8 gMapPopUp_Outline_Table[][960] =
{
INCBIN_U8("graphics/interface/map_popup/wood_outline.4bpp"),
INCBIN_U8("graphics/interface/map_popup/marble_outline.4bpp"),
INCBIN_U8("graphics/interface/map_popup/stone_outline.4bpp"),
INCBIN_U8("graphics/interface/map_popup/brick_outline.4bpp"),
INCBIN_U8("graphics/interface/map_popup/underwater_outline.4bpp"),
INCBIN_U8("graphics/interface/map_popup/stone2_outline.4bpp"),
};
static const u16 gMapPopUp_Palette_Table[][16] =
{
INCBIN_U16("graphics/interface/map_popup/wood.gbapal"),
INCBIN_U16("graphics/interface/map_popup/marble_outline.gbapal"),
INCBIN_U16("graphics/interface/map_popup/stone_outline.gbapal"),
INCBIN_U16("graphics/interface/map_popup/brick_outline.gbapal"),
INCBIN_U16("graphics/interface/map_popup/underwater_outline.gbapal"),
INCBIN_U16("graphics/interface/map_popup/stone2_outline.gbapal"),
};
static const u16 gUnknown_0857F444[16] = INCBIN_U16("graphics/interface/map_popup/857F444.gbapal");
static const u8 gRegionMapSectionId_To_PopUpThemeIdMapping[] =
{
MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD,
MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_BRICK,
MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_BRICK,
MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_BRICK, MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_BRICK,
MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD,
MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER,
MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD,
MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD,
MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD,
MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_UNDERWATER,
MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER,
MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER,
MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE2,
MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE,
MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_WOOD,
MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_STONE,
MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE,
MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_WOOD,
MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE,
MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE2,
MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE,
MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_MARBLE,
MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_WOOD,
MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE2,
MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE2,
MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_MARBLE
};
static const u8 gText_PyramidFloor1[] = _("PYRAMID FLOOR 1");
static const u8 gText_PyramidFloor2[] = _("PYRAMID FLOOR 2");
static const u8 gText_PyramidFloor3[] = _("PYRAMID FLOOR 3");
static const u8 gText_PyramidFloor4[] = _("PYRAMID FLOOR 4");
static const u8 gText_PyramidFloor5[] = _("PYRAMID FLOOR 5");
static const u8 gText_PyramidFloor6[] = _("PYRAMID FLOOR 6");
static const u8 gText_PyramidFloor7[] = _("PYRAMID FLOOR 7");
static const u8 gText_Pyramid[] = _("PYRAMID");
static const u8 * const gBattlePyramid_MapHeaderStrings[] =
{
gText_PyramidFloor1,
gText_PyramidFloor2,
gText_PyramidFloor3,
gText_PyramidFloor4,
gText_PyramidFloor5,
gText_PyramidFloor6,
gText_PyramidFloor7,
gText_Pyramid,
};
// text
bool8 sub_80D47D4(void)
{
HideStartMenu();
ShowMapNamePopup();
return 1;
}
void ShowMapNamePopup(void)
{
if (FlagGet(FLAG_SPECIAL_FLAG_0x4000) != TRUE)
{
if (!FuncIsActiveTask(Task_MapNamePopUpWindow))
{
mapNamePopupTaskId = CreateTask(Task_MapNamePopUpWindow, 90);
SetGpuReg(REG_OFFSET_BG0VOFS, 40);
gTasks[mapNamePopupTaskId].data[0] = 6;
gTasks[mapNamePopupTaskId].data[2] = 40;
}
else
{
if (gTasks[mapNamePopupTaskId].data[0] != 2)
gTasks[mapNamePopupTaskId].data[0] = 2;
gTasks[mapNamePopupTaskId].data[3] = 1;
}
}
}
static void Task_MapNamePopUpWindow(u8 taskId)
{
struct Task *task = &gTasks[taskId];
switch (task->data[0])
{
case 6:
task->data[4]++;
if (task->data[4] > 30)
{
task->data[0] = 0;
task->data[4] = 0;
ShowMapNamePopUpWindow();
}
break;
case 0:
task->data[2] -= 2;
if (task->data[2] <= 0 )
{
task->data[2] = 0;
task->data[0] = 1;
gTasks[mapNamePopupTaskId].data[1] = 0;
}
break;
case 1:
task->data[1]++;
if (task->data[1] > 120 )
{
task->data[1] = 0;
task->data[0] = 2;
}
break;
case 2:
task->data[2] += 2;
if (task->data[2] > 39)
{
task->data[2] = 40;
if (task->data[3])
{
task->data[0] = 6;
task->data[4] = 0;
task->data[3] = 0;
}
else
{
task->data[0] = 4;
return;
}
}
break;
case 4:
sub_819746C(GetMapNamePopUpWindowId(), TRUE);
task->data[0] = 5;
break;
case 5:
HideMapNamePopUpWindow();
return;
}
SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]);
}
void HideMapNamePopUpWindow(void)
{
if (FuncIsActiveTask(Task_MapNamePopUpWindow))
{
sub_819746C(GetMapNamePopUpWindowId(), TRUE);
RemoveMapNamePopUpWindow();
SetGpuReg_ForcedBlank(REG_OFFSET_BG0VOFS, 0);
DestroyTask(mapNamePopupTaskId);
}
}
static void ShowMapNamePopUpWindow(void)
{
u8 mapDisplayHeader[24];
u8 *withoutPrefixPtr;
u8 x;
const u8* mapDisplayHeaderSource;
if(InBattlePyramid())
{
if(gMapHeader.mapDataId == 0x17A)
{
withoutPrefixPtr = &(mapDisplayHeader[3]);
mapDisplayHeaderSource = gBattlePyramid_MapHeaderStrings[7];
}
else
{
withoutPrefixPtr = &(mapDisplayHeader[3]);
mapDisplayHeaderSource = gBattlePyramid_MapHeaderStrings[gSaveBlock2Ptr->battlePyramidWildHeaderId];
}
StringCopy(withoutPrefixPtr, mapDisplayHeaderSource);
}
else
{
withoutPrefixPtr = &(mapDisplayHeader[3]);
GetMapName(withoutPrefixPtr, gMapHeader.regionMapSectionId, 0);
}
AddMapNamePopUpWindow();
LoadMapNamePopUpWindowBg();
x = GetStringCenterAlignXOffset(7, withoutPrefixPtr, 80);
mapDisplayHeader[0] = EXT_CTRL_CODE_BEGIN;
mapDisplayHeader[1] = EXT_CTRL_CODE_HIGHLIGHT;
mapDisplayHeader[2] = TEXT_COLOR_TRANSPARENT;
PrintTextOnWindow(GetMapNamePopUpWindowId(), 7, mapDisplayHeader, x, 3, 0xFF, NULL);
CopyWindowToVram(GetMapNamePopUpWindowId(), 3);
}
#ifdef NONMATCHING
static void sub_80D4A78(u8 bg, u8 x, u8 y, u8 deltaX, u8 deltaY, u8 unused)
{
s32 i;
for(i=0; i<=11; i++)
{
FillBgTilemapBufferRect(bg, 0x21D + i, x + i - 1, y - 1, 1, 1, 0xE);
}
FillBgTilemapBufferRect(bg, 0x229 + i, x - 1, y, 1, 1, 0xE);
FillBgTilemapBufferRect(bg, 0x22A + i, deltaX + x, y, 1, 1, 0xE);
FillBgTilemapBufferRect(bg, 0x22B + i, x - 1, y + 1 , 1, 1, 0xE);
FillBgTilemapBufferRect(bg, 0x22C + i, deltaX + x, y + 1, 1, 1, 0xE);
FillBgTilemapBufferRect(bg, 0x22D + i, x - 1, y + 2, 1, 1, 0xE);
FillBgTilemapBufferRect(bg, 0x22E + i, deltaX + x, y + 2, 1, 1, 0xE);
for(i=0; i<=11; i++)
{
FillBgTilemapBufferRect(bg, 0x22F + i, x + i - 1, y + deltaY, 1, 1, 0xE);
}
}
#else
ASM_DIRECT
static void sub_80D4A78(u8 bg, u8 x, u8 y, u8 deltaX, u8 deltaY, u8 unused)
{
asm("\n\
.syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r10\n\
mov r6, r9\n\
mov r5, r8\n\
push {r5-r7}\n\
sub sp, 0x1C\n\
ldr r4, [sp, 0x3C]\n\
lsls r0, 24\n\
lsrs r7, r0, 24\n\
lsls r1, 24\n\
lsrs r1, 24\n\
mov r10, r1\n\
lsls r2, 24\n\
lsls r3, 24\n\
lsrs r3, 24\n\
str r3, [sp, 0x10]\n\
lsls r4, 24\n\
lsrs r4, 24\n\
str r4, [sp, 0x14]\n\
movs r5, 0\n\
lsls r0, r1, 24\n\
asrs r1, r0, 24\n\
lsrs r3, r2, 24\n\
str r3, [sp, 0xC]\n\
movs r6, 0xFF\n\
lsls r6, 24\n\
adds r6, r2\n\
mov r8, r6\n\
str r0, [sp, 0x18]\n\
subs r4, r1, 0x1\n\
_080D4AB4:\n\
ldr r0, =0x0000021d\n\
adds r1, r5, r0\n\
lsls r1, 16\n\
lsrs r1, 16\n\
lsls r2, r4, 24\n\
lsrs r2, 24\n\
movs r3, 0x1\n\
str r3, [sp]\n\
str r3, [sp, 0x4]\n\
movs r6, 0xE\n\
mov r9, r6\n\
str r6, [sp, 0x8]\n\
adds r0, r7, 0\n\
mov r6, r8\n\
lsrs r3, r6, 24\n\
bl FillBgTilemapBufferRect\n\
adds r4, 0x1\n\
adds r5, 0x1\n\
cmp r5, 0xB\n\
ble _080D4AB4\n\
ldr r1, =0x00000229\n\
movs r0, 0x1\n\
negs r0, r0\n\
add r0, r10\n\
lsls r0, 24\n\
lsrs r0, 24\n\
mov r8, r0\n\
movs r5, 0x1\n\
str r5, [sp]\n\
str r5, [sp, 0x4]\n\
mov r2, r9\n\
str r2, [sp, 0x8]\n\
adds r0, r7, 0\n\
mov r2, r8\n\
ldr r3, [sp, 0xC]\n\
bl FillBgTilemapBufferRect\n\
ldr r1, =0x0000022a\n\
ldr r6, [sp, 0x10]\n\
add r6, r10\n\
lsls r6, 24\n\
lsrs r6, 24\n\
str r5, [sp]\n\
str r5, [sp, 0x4]\n\
mov r3, r9\n\
str r3, [sp, 0x8]\n\
adds r0, r7, 0\n\
adds r2, r6, 0\n\
ldr r3, [sp, 0xC]\n\
bl FillBgTilemapBufferRect\n\
ldr r1, =0x0000022b\n\
ldr r4, [sp, 0xC]\n\
adds r4, 0x1\n\
lsls r4, 24\n\
lsrs r4, 24\n\
str r5, [sp]\n\
str r5, [sp, 0x4]\n\
mov r0, r9\n\
str r0, [sp, 0x8]\n\
adds r0, r7, 0\n\
mov r2, r8\n\
adds r3, r4, 0\n\
bl FillBgTilemapBufferRect\n\
movs r1, 0x8B\n\
lsls r1, 2\n\
str r5, [sp]\n\
str r5, [sp, 0x4]\n\
mov r2, r9\n\
str r2, [sp, 0x8]\n\
adds r0, r7, 0\n\
adds r2, r6, 0\n\
adds r3, r4, 0\n\
bl FillBgTilemapBufferRect\n\
ldr r1, =0x0000022d\n\
ldr r4, [sp, 0xC]\n\
adds r4, 0x2\n\
lsls r4, 24\n\
lsrs r4, 24\n\
str r5, [sp]\n\
str r5, [sp, 0x4]\n\
mov r3, r9\n\
str r3, [sp, 0x8]\n\
adds r0, r7, 0\n\
mov r2, r8\n\
adds r3, r4, 0\n\
bl FillBgTilemapBufferRect\n\
ldr r1, =0x0000022e\n\
str r5, [sp]\n\
str r5, [sp, 0x4]\n\
mov r0, r9\n\
str r0, [sp, 0x8]\n\
adds r0, r7, 0\n\
adds r2, r6, 0\n\
adds r3, r4, 0\n\
bl FillBgTilemapBufferRect\n\
movs r5, 0\n\
ldr r1, [sp, 0xC]\n\
ldr r2, [sp, 0x14]\n\
adds r0, r1, r2\n\
lsls r4, r0, 24\n\
movs r6, 0x1\n\
_080D4B8A:\n\
ldr r3, =0x0000022f\n\
adds r1, r5, r3\n\
lsls r1, 16\n\
lsrs r1, 16\n\
subs r0, r5, 0x1\n\
ldr r3, [sp, 0x18]\n\
asrs r2, r3, 24\n\
adds r2, r0\n\
lsls r2, 24\n\
lsrs r2, 24\n\
str r6, [sp]\n\
str r6, [sp, 0x4]\n\
movs r0, 0xE\n\
str r0, [sp, 0x8]\n\
adds r0, r7, 0\n\
lsrs r3, r4, 24\n\
bl FillBgTilemapBufferRect\n\
adds r5, 0x1\n\
cmp r5, 0xB\n\
ble _080D4B8A\n\
add sp, 0x1C\n\
pop {r3-r5}\n\
mov r8, r3\n\
mov r9, r4\n\
mov r10, r5\n\
pop {r4-r7}\n\
pop {r0}\n\
bx r0\n\
.pool\n\
.syntax divided");
}
#endif // NONMATCHING
static void LoadMapNamePopUpWindowBg(void)
{
u8 popupWindowId;
u16 regionMapSectionId;
u8 popUpThemeId;
popupWindowId = GetMapNamePopUpWindowId();
regionMapSectionId = gMapHeader.regionMapSectionId;
if(regionMapSectionId > MAPSEC_DYNAMIC)
{
if(regionMapSectionId > MAPSEC_SPECIAL_AREA)
regionMapSectionId -= (MAPSEC_SPECIAL_AREA - MAPSEC_DYNAMIC);
else
regionMapSectionId = 0; //discard kanto region sections
}
popUpThemeId = gRegionMapSectionId_To_PopUpThemeIdMapping[regionMapSectionId];
LoadBgTiles(GetWindowAttribute(popupWindowId, 0), &(gMapPopUp_Outline_Table[popUpThemeId][0]), 0x400, 0x21D);
CallWindowFunction(popupWindowId, sub_80D4A78);
PutWindowTilemap(popupWindowId);
if(gMapHeader.weather == WEATHER_BUBBLES)
LoadPalette(&gUnknown_0857F444, 0xE0, 0x20);
else
LoadPalette(&(gMapPopUp_Palette_Table[popUpThemeId][0]), 0xE0, 0x20);
BlitBitmapToWindow(popupWindowId, &(gMapPopUp_Table[popUpThemeId][0]), 0, 0, 80, 24);
}

187
src/map_obj_lock.c Normal file
View File

@@ -0,0 +1,187 @@
#include "global.h"
#include "event_data.h"
#include "field_map_obj.h"
#include "field_map_obj_helpers.h"
#include "field_player_avatar.h"
#include "map_obj_lock.h"
#include "script_movement.h"
#include "task.h"
#include "trainer_see.h"
bool8 walkrun_is_standing_still(void)
{
if (gPlayerAvatar.tileTransitionState == T_TILE_TRANSITION)
return FALSE;
else
return TRUE;
}
static void sub_80983A4(u8 taskId)
{
if (walkrun_is_standing_still())
{
sub_808B864();
DestroyTask(taskId);
}
}
bool8 sub_80983C4(void)
{
if (FuncIsActiveTask(sub_80983A4))
{
return FALSE;
}
else
{
sub_808BCF4();
return TRUE;
}
}
void ScriptFreezeMapObjects(void)
{
FreezeMapObjects();
CreateTask(sub_80983A4, 80);
}
static void sub_8098400(u8 taskId)
{
struct Task *task = &gTasks[taskId];
if (!task->data[0] && walkrun_is_standing_still() == TRUE)
{
sub_808B864();
task->data[0] = 1;
}
if (!task->data[1] && !gMapObjects[gSelectedMapObject].mapobj_bit_1)
{
FreezeMapObject(&gMapObjects[gSelectedMapObject]);
task->data[1] = 1;
}
if (task->data[0] && task->data[1])
DestroyTask(taskId);
}
bool8 sub_809847C(void)
{
if (FuncIsActiveTask(sub_8098400))
{
return FALSE;
}
else
{
sub_808BCF4();
return TRUE;
}
}
void LockSelectedMapObject(void)
{
u8 taskId;
FreezeMapObjectsExceptOne(gSelectedMapObject);
taskId = CreateTask(sub_8098400, 80);
if (!gMapObjects[gSelectedMapObject].mapobj_bit_1)
{
FreezeMapObject(&gMapObjects[gSelectedMapObject]);
gTasks[taskId].data[1] = 1;
}
}
void sub_80984F4(void)
{
u8 objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]);
sub_80D338C();
UnfreezeMapObjects();
}
void sub_8098524(void)
{
u8 objectId;
if (gMapObjects[gSelectedMapObject].active)
FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedMapObject]);
objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]);
sub_80D338C();
UnfreezeMapObjects();
}
void sub_8098574(void)
{
FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedMapObject], gSpecialVar_Facing);
}
void sub_809859C(void)
{
FieldObjectClearAnimIfSpecialAnimActive(&gMapObjects[gSelectedMapObject]);
}
static void sub_80985BC(u8 taskId)
{
struct Task *task = &gTasks[taskId];
u8 mapObjectId = task->data[2];
if (!task->data[0] && walkrun_is_standing_still() == TRUE)
{
sub_808B864();
task->data[0] = 1;
}
if (!task->data[1] && !gMapObjects[mapObjectId].mapobj_bit_1)
{
FreezeMapObject(&gMapObjects[mapObjectId]);
task->data[1] = 1;
}
if (task->data[0] && task->data[1])
DestroyTask(taskId);
}
void sub_8098630(void)
{
u8 trainerObjectId1, trainerObjectId2, taskId;
trainerObjectId1 = GetChosenApproachingTrainerMapObjectId(0);
if(gNoOfApproachingTrainers == 2)
{
trainerObjectId2 = GetChosenApproachingTrainerMapObjectId(1);
sub_8098074(trainerObjectId1, trainerObjectId2);
taskId = CreateTask(sub_80985BC, 80);
gTasks[taskId].data[2] = trainerObjectId1;
if(!gMapObjects[trainerObjectId1].mapobj_bit_1)
{
FreezeMapObject(&gMapObjects[trainerObjectId1]);
gTasks[taskId].data[1] = 1;
}
taskId = CreateTask(sub_80985BC, 81);
gTasks[taskId].data[2] = trainerObjectId2;
if(!gMapObjects[trainerObjectId2].mapobj_bit_1)
{
FreezeMapObject(&gMapObjects[trainerObjectId2]);
gTasks[taskId].data[1] = 1;
}
}
else
{
FreezeMapObjectsExceptOne(trainerObjectId1);
taskId = CreateTask(sub_80985BC, 80);
gTasks[taskId].data[2] = trainerObjectId1;
if(!gMapObjects[trainerObjectId1].mapobj_bit_1)
{
FreezeMapObject(&gMapObjects[trainerObjectId1]);
gTasks[taskId].data[1] = 1;
}
}
}
bool8 sub_8098734(void)
{
if (FuncIsActiveTask(sub_80985BC))
{
return FALSE;
}
else
{
sub_808BCF4();
return TRUE;
}
}

611
src/mon_markings.c Normal file
View File

@@ -0,0 +1,611 @@
#include "global.h"
#include "dma3.h"
#include "graphics.h"
#include "main.h"
#include "menu_indicators.h"
#include "mon_markings.h"
#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "text_window.h"
#define MENU_TEXT_SPRITE_X_OFFSET 32
// static functions
static void sub_811FC80(s16, s16, u16, u16);
static void TaskDummy7(struct Sprite *);
static void sub_811FF40(struct Sprite *);
static void sub_811FF7C(struct Sprite *);
static struct Sprite *sub_811FFD4(u16, u16, const u16 *, u16);
// .rodata
static const u16 gUnknown_0859E65C[] = INCBIN_U16("graphics/misc/mon_markings.gbapal");
static const u8 gUnknown_0859E67C[] = INCBIN_U8("graphics/misc/mon_markings.4bpp");
static const struct OamData gUnknown_0859EE7C =
{
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.bpp = 0,
.shape = 0,
.x = 0,
.matrixNum = 0,
.size = 3,
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0,
};
static const struct OamData gUnknown_0859EE84 =
{
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.bpp = 0,
.shape = 0,
.x = 0,
.matrixNum = 0,
.size = 0,
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0,
};
static const union AnimCmd gUnknown_0859EE8C[] =
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EE94[] =
{
ANIMCMD_FRAME(1, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EE9C[] =
{
ANIMCMD_FRAME(2, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EEA4[] =
{
ANIMCMD_FRAME(3, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EEAC[] =
{
ANIMCMD_FRAME(4, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EEB4[] =
{
ANIMCMD_FRAME(5, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EEBC[] =
{
ANIMCMD_FRAME(6, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EEC4[] =
{
ANIMCMD_FRAME(7, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EECC[] =
{
ANIMCMD_FRAME(8, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EED4[] =
{
ANIMCMD_FRAME(9, 5),
ANIMCMD_END,
};
static const union AnimCmd *const gUnknown_0859EEDC[] =
{
gUnknown_0859EE8C,
gUnknown_0859EE94,
gUnknown_0859EE9C,
gUnknown_0859EEA4,
gUnknown_0859EEAC,
gUnknown_0859EEB4,
gUnknown_0859EEBC,
gUnknown_0859EEC4,
gUnknown_0859EECC,
gUnknown_0859EED4,
};
static const union AnimCmd gUnknown_0859EF04[] =
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EF0C[] =
{
ANIMCMD_FRAME(64, 5),
ANIMCMD_END,
};
static const union AnimCmd *const gUnknown_0859EF14[] =
{
gUnknown_0859EF04,
gUnknown_0859EF0C,
};
static const struct OamData gUnknown_0859EF1C =
{
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.bpp = 0,
.shape = 1,
.x = 0,
.matrixNum = 0,
.size = 1,
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0,
};
static const union AnimCmd gUnknown_0859EF24[] =
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EF2C[] =
{
ANIMCMD_FRAME(4, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EF34[] =
{
ANIMCMD_FRAME(8, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EF3C[] =
{
ANIMCMD_FRAME(12, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EF44[] =
{
ANIMCMD_FRAME(16, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EF4C[] =
{
ANIMCMD_FRAME(20, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EF54[] =
{
ANIMCMD_FRAME(24, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EF5C[] =
{
ANIMCMD_FRAME(28, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EF64[] =
{
ANIMCMD_FRAME(32, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EF6C[] =
{
ANIMCMD_FRAME(36, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EF74[] =
{
ANIMCMD_FRAME(40, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EF7C[] =
{
ANIMCMD_FRAME(44, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EF84[] =
{
ANIMCMD_FRAME(48, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EF8C[] =
{
ANIMCMD_FRAME(52, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EF94[] =
{
ANIMCMD_FRAME(56, 5),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0859EF9C[] =
{
ANIMCMD_FRAME(60, 5),
ANIMCMD_END,
};
static const union AnimCmd *const gUnknown_0859EFA4[] =
{
gUnknown_0859EF24,
gUnknown_0859EF2C,
gUnknown_0859EF34,
gUnknown_0859EF3C,
gUnknown_0859EF44,
gUnknown_0859EF4C,
gUnknown_0859EF54,
gUnknown_0859EF5C,
gUnknown_0859EF64,
gUnknown_0859EF6C,
gUnknown_0859EF74,
gUnknown_0859EF7C,
gUnknown_0859EF84,
gUnknown_0859EF8C,
gUnknown_0859EF94,
gUnknown_0859EF9C,
};
static EWRAM_DATA struct PokemonMarkMenu *sMenu = NULL;
void sub_811F90C(struct PokemonMarkMenu *ptr)
{
sMenu = ptr;
}
void sub_811F918(void)
{
const struct TilesPal *frame = GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType);
sMenu->frameTiles = frame->tiles;
sMenu->framePalette = frame->pal;
sMenu->tileLoadState = 0;
CpuFill16(0, sMenu->menuWindowSpriteTiles, sizeof(sMenu->menuWindowSpriteTiles));
}
bool8 sub_811F960(void)
{
u16 i;
u8 *dest = sMenu->menuWindowSpriteTiles + sMenu->tileLoadState * 0x100;
switch (sMenu->tileLoadState)
{
case 0:
CpuFastCopy(sMenu->frameTiles, dest, TILE_SIZE_4BPP);
for (i = 0; i < 6; i++)
{
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP);
}
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 2, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP);
sMenu->tileLoadState++;
break;
default:
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 3, dest, TILE_SIZE_4BPP);
for (i = 0; i < 6; i++)
{
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 4, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP);
}
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 5, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP);
sMenu->tileLoadState++;
break;
case 13:
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 6, dest, TILE_SIZE_4BPP);
for (i = 0; i < 6; i++)
{
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 7, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP);
}
CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 8, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP);
sMenu->tileLoadState++;
return FALSE;
case 14:
return FALSE;
}
return TRUE;
}
void sub_811FA90(void)
{
sub_811F918();
while (sub_811F960());
}
void sub_811FAA4(u8 markings, s16 x, s16 y)
{
u16 i;
sMenu->cursorPos = 0;
sMenu->markings = markings;
for (i = 0; i < 4; i++)
sMenu->markingsArray[i] = (sMenu->markings >> i) & 1;
sub_811FC80(x, y, sMenu->baseTileTag, sMenu->basePaletteTag);
}
void sub_811FAF8(void)
{
u16 i;
for (i = 0; i < 2; i++)
{
FreeSpriteTilesByTag(sMenu->baseTileTag + i);
FreeSpritePaletteByTag(sMenu->basePaletteTag + i);
}
for (i = 0; i < 2; i++)
{
if (!sMenu->menuWindowSprites[i])
return;
DestroySprite(sMenu->menuWindowSprites[i]);
sMenu->menuWindowSprites[i] = NULL;
}
for (i = 0; i < 4; i++)
{
if (!sMenu->menuMarkingSprites[i])
return;
DestroySprite(sMenu->menuMarkingSprites[i]);
sMenu->menuMarkingSprites[i] = NULL;
}
if (sMenu->unkSprite)
{
DestroySprite(sMenu->unkSprite);
sMenu->unkSprite = NULL;
}
if (sMenu->menuTextSprite)
{
DestroySprite(sMenu->menuTextSprite);
sMenu->menuTextSprite = NULL;
}
}
bool8 sub_811FBA4(void)
{
u16 i;
if (gMain.newKeys & DPAD_UP)
{
s8 pos;
PlaySE(SE_SELECT);
pos = --sMenu->cursorPos;
if (pos < 0)
sMenu->cursorPos = 5;
return TRUE;
}
if (gMain.newKeys & DPAD_DOWN)
{
s8 pos;
PlaySE(SE_SELECT);
pos = ++sMenu->cursorPos;
if (pos > 5)
sMenu->cursorPos = 0;
return TRUE;
}
if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
switch (sMenu->cursorPos)
{
case 4:
sMenu->markings = 0;
for (i = 0; i < 4; i++)
sMenu->markings |= sMenu->markingsArray[i] << i;
return FALSE;
case 5:
return FALSE;
}
sMenu->markingsArray[sMenu->cursorPos] = !sMenu->markingsArray[sMenu->cursorPos];
return TRUE;
}
if (gMain.newKeys & B_BUTTON)
{
PlaySE(SE_SELECT);
return FALSE;
}
return TRUE;
}
static void sub_811FC80(s16 x, s16 y, u16 baseTileTag, u16 basePaletteTag)
{
u16 i;
u8 spriteId;
struct SpriteSheet sheets[] =
{
{ sMenu->menuWindowSpriteTiles, 0x1000, baseTileTag },
{ gPokenavConditionMarker_Gfx, 0x320, baseTileTag + 1 },
{ NULL, 0 }
};
struct SpritePalette palettes[] =
{
{ sMenu->framePalette, basePaletteTag },
{ gPokenavConditionMarker_Pal, basePaletteTag + 1},
{ NULL, 0 }
};
struct SpriteTemplate sprTemplate =
{
baseTileTag,
basePaletteTag,
&gUnknown_0859EE7C,
gUnknown_0859EF14,
NULL,
gDummySpriteAffineAnimTable,
TaskDummy7,
};
LoadSpriteSheets(sheets);
LoadSpritePalettes(palettes);
for (i = 0; i < 2; i++)
{
spriteId = CreateSprite(&sprTemplate, x + 32, y + 32, 1);
if (spriteId != 64)
{
sMenu->menuWindowSprites[i] = &gSprites[spriteId];
StartSpriteAnim(&gSprites[spriteId], i);
}
else
{
sMenu->menuWindowSprites[i] = NULL;
return;
}
}
sMenu->menuWindowSprites[1]->pos1.y = y + 96;
sprTemplate.tileTag++;
sprTemplate.paletteTag++;
sprTemplate.anims = gUnknown_0859EEDC;
sprTemplate.callback = sub_811FF40;
sprTemplate.oam = &gUnknown_0859EE84;
for (i = 0; i < 4; i++)
{
spriteId = CreateSprite(&sprTemplate, x + 32, y + 16 + 16 * i, 0);
if (spriteId != 64)
{
sMenu->menuMarkingSprites[i] = &gSprites[spriteId];
gSprites[spriteId].data[0] = i;
}
else
{
sMenu->menuMarkingSprites[i] = NULL;
return;
}
}
sprTemplate.callback = SpriteCallbackDummy;
spriteId = CreateSprite(&sprTemplate, 0, 0, 0);
if (spriteId != 64)
{
sMenu->menuTextSprite = &gSprites[spriteId];
sMenu->menuTextSprite->oam.shape = ST_OAM_SQUARE;
sMenu->menuTextSprite->oam.size = 2;
StartSpriteAnim(sMenu->menuTextSprite, 9);
sMenu->menuTextSprite->pos1.x = x + MENU_TEXT_SPRITE_X_OFFSET;
sMenu->menuTextSprite->pos1.y = y + 80;
CalcCenterToCornerVec(sMenu->menuTextSprite, 1, 2, 0);
}
else
{
sMenu->menuTextSprite = NULL;
}
sprTemplate.callback = sub_811FF7C;
spriteId = CreateSprite(&sprTemplate, x + 12, 0, 0);
if(spriteId != 64)
{
sMenu->unkSprite = &gSprites[spriteId];
sMenu->unkSprite->data[0] = y + 16;
StartSpriteAnim(sMenu->unkSprite, 8);
}
else
{
sMenu->unkSprite = NULL;
}
}
static void TaskDummy7(struct Sprite *sprite)
{
}
static void sub_811FF40(struct Sprite *sprite)
{
if (sMenu->markingsArray[sprite->data[0]])
StartSpriteAnim(sprite, 2 * sprite->data[0] + 1);
else
StartSpriteAnim(sprite, 2 * sprite->data[0]);
}
static void sub_811FF7C(struct Sprite *sprite)
{
sprite->pos1.y = (16 * sMenu->cursorPos) + sprite->data[0];
}
struct Sprite *sub_811FF94(u16 tileTag, u16 paletteTag, const u16 *palette)
{
if (!palette)
palette = gUnknown_0859E65C;
return sub_811FFD4(tileTag, paletteTag, palette, 16);
}
struct Sprite *sub_811FFB4(u16 tileTag, u16 paletteTag, const u16 *palette)
{
if (!palette)
palette = gUnknown_0859E65C;
return sub_811FFD4(tileTag, paletteTag, palette, 1);
}
static struct Sprite *sub_811FFD4(u16 tileTag, u16 paletteTag, const u16 *palette, u16 size)
{
u8 spriteId;
struct SpriteTemplate sprTemplate;
struct SpriteSheet sheet = { gUnknown_0859E67C, 0x80, tileTag };
struct SpritePalette sprPalette = { palette, paletteTag };
sprTemplate.tileTag = tileTag;
sprTemplate.paletteTag = paletteTag;
sprTemplate.oam = &gUnknown_0859EF1C;
sprTemplate.anims = gUnknown_0859EFA4;
sprTemplate.images = NULL;
sprTemplate.affineAnims = gDummySpriteAffineAnimTable;
sprTemplate.callback = TaskDummy7;
sheet.size = size * 0x80;
LoadSpriteSheet(&sheet);
LoadSpritePalette(&sprPalette);
spriteId = CreateSprite(&sprTemplate, 0, 0, 0);
if (spriteId != 64)
return &gSprites[spriteId];
else
return NULL;
}
void sub_8120084(u8 markings, void *dest)
{
RequestDma3Copy(gUnknown_0859E67C + markings * 0x80, dest, 0x80, 0x10);
}

View File

@@ -75,7 +75,7 @@ static const u8 gSpriteImage_858BCB8[] = INCBIN_U8("graphics/naming_screen/pc_ic
static const u16 gUnknown_0858BD78[] = INCBIN_U16("graphics/naming_screen/0.gbapal");
static const u16 gUnknown_0858BD98[] = INCBIN_U16("graphics/naming_screen/1.gbapal");
static const u8 *const gUnknown_0858BDB8[] =
static const u8 *const gUnknown_0858BDB8[] =
{
gText_PkmnTransferredSomeonesPC,
gText_PkmnTransferredLanettesPC,
@@ -85,7 +85,7 @@ static const u8 *const gUnknown_0858BDB8[] =
static const u8 gUnknown_0858BDC8[] = _("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!");
static const struct BgTemplate gUnknown_0858BE00[] =
static const struct BgTemplate gUnknown_0858BE00[] =
{
{
.bg = 0,
@@ -226,10 +226,10 @@ void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 monSpecies, u16 monGende
gNamingScreenData->monPersonality = monPersonality;
gNamingScreenData->destBuffer = destBuffer;
gNamingScreenData->returnCallback = returnCallback;
if (templateNum == 0)
StartTimer1();
SetMainCallback2(C2_NamingScreen);
}
}
@@ -316,15 +316,15 @@ static void sub_80E2FA4(void)
static void NamingScreen_InitBGs(void)
{
u8 i;
DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000);
DmaClear32(3, (void *)OAM, OAM_SIZE);
DmaClear16(3, (void *)PLTT, PLTT_SIZE);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0);
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, gUnknown_0858BE00, 4);
ChangeBgX(0, 0, 0);
ChangeBgY(0, 0, 0);
ChangeBgX(1, 0, 0);
@@ -333,21 +333,21 @@ static void NamingScreen_InitBGs(void)
ChangeBgY(2, 0, 0);
ChangeBgX(3, 0, 0);
ChangeBgY(3, 0, 0);
sub_81971D0();
sub_8197200();
for (i = 0; i < 5; i++)
gNamingScreenData->windows[i] = AddWindow(&gUnknown_0858BE10[i]);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0xC, 0x8));
SetBgTilemapBuffer(1, gNamingScreenData->tilemapBuffer1);
SetBgTilemapBuffer(2, gNamingScreenData->tilemapBuffer2);
SetBgTilemapBuffer(3, gNamingScreenData->tilemapBuffer3);
FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 0x20, 0x20);
FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 0x20, 0x20);
FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 0x20, 0x20);
@@ -511,7 +511,7 @@ static bool8 MainState_WaitFadeOutAndExit(void)
static void DisplaySentToPCMessage(void)
{
u8 stringToDisplay = 0;
if (!sub_813B260())
{
StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_STORAGE_UNKNOWN)));
@@ -524,10 +524,10 @@ static void DisplaySentToPCMessage(void)
StringCopy(gStringVar3, GetBoxNamePtr(get_unknown_box_id()));
stringToDisplay = 2;
}
if (FlagGet(FLAG_SYS_PC_LANETTE))
stringToDisplay++;
StringExpandPlaceholders(gStringVar4, gUnknown_0858BDB8[stringToDisplay]);
NewMenuHelpers_DrawDialogueFrame(0, 0);
gTextFlags.flag_0 = TRUE;
@@ -538,10 +538,10 @@ static void DisplaySentToPCMessage(void)
static bool8 sub_80E3604(void)
{
RunTextPrinters();
if (!IsTextPrinterActive(0) && (gMain.newKeys & A_BUTTON))
gNamingScreenData->state = MAIN_STATE_BEGIN_FADE_OUT;
return FALSE;
}
@@ -562,17 +562,17 @@ static bool8 MainState_WaitPageSwap(void)
s16 cursorX;
s16 cursorY;
bool32 var3;
if (IsPageSwapAnimNotInProgress())
{
GetCursorPos(&cursorX, &cursorY);
var3 = (cursorX == GetCurrentPageColumnCount());
gNamingScreenData->state = MAIN_STATE_HANDLE_INPUT;
gNamingScreenData->currentPage++;
gNamingScreenData->currentPage %= 3;
if (var3)
{
cursorX = GetCurrentPageColumnCount();
@@ -582,7 +582,7 @@ static bool8 MainState_WaitPageSwap(void)
if (cursorX >= GetCurrentPageColumnCount())
cursorX = GetCurrentPageColumnCount() - 1;
}
SetCursorPos(cursorX, cursorY);
sub_80E4E5C();
SetInputState(INPUT_STATE_ENABLED);
@@ -603,7 +603,7 @@ static bool8 PageSwapAnimState_1(struct Task *);
static bool8 PageSwapAnimState_2(struct Task *);
static bool8 PageSwapAnimState_Done(struct Task *);
static bool8 (*const sPageSwapAnimStateFuncs[])(struct Task *) =
static bool8 (*const sPageSwapAnimStateFuncs[])(struct Task *) =
{
PageSwapAnimState_Init,
PageSwapAnimState_1,
@@ -754,7 +754,7 @@ static void Task_80E39BC(u8 taskId)
task->data[3] += task->data[4];
task->data[6] += task->data[4];
}
if (task->data[3] == 16 && task->data[6] == 22)
{
task->data[4] = -4;
@@ -893,7 +893,7 @@ static void CursorInit(void)
static void SetCursorPos(s16 x, s16 y)
{
struct Sprite *cursorSprite = &gSprites[gNamingScreenData->cursorSpriteId];
if (x < gUnknown_0858BEA0[sub_80E3274()])
cursorSprite->pos1.x = gUnknown_0858BEA3[x + sub_80E3274() * 8] + 38;
else
@@ -909,7 +909,7 @@ static void SetCursorPos(s16 x, s16 y)
static void GetCursorPos(s16 *x, s16 *y)
{
struct Sprite *cursorSprite = &gSprites[gNamingScreenData->cursorSpriteId];
*x = cursorSprite->data[0];
*y = cursorSprite->data[1];
}
@@ -1133,7 +1133,7 @@ static void CreateInputTargetIcon(void)
static void TaskDummy2(void)
{
}
static void NamingScreen_CreatePlayerIcon(void)
@@ -1160,7 +1160,7 @@ static void NamingScreen_CreateMonIcon(void)
{
u8 spriteId;
sub_80D2F04();
LoadMonIconPalettes();
spriteId = CreateMonIcon(gNamingScreenData->monSpecies, SpriteCallbackDummy, 0x38, 0x28, 0, gNamingScreenData->monPersonality, 1);
gSprites[spriteId].oam.priority = 3;
}
@@ -1331,7 +1331,7 @@ static void InputState_Disabled(struct Task *task)
static void InputState_Enabled(struct Task *task)
{
task->tKeyboardEvent = 0;
if (gMain.newKeys & A_BUTTON)
task->tKeyboardEvent = KBEVENT_PRESSED_A;
else if (gMain.newKeys & B_BUTTON)
@@ -1454,7 +1454,7 @@ static void sub_80E4894(void)
static void sub_80E48E8(void)
{
u8 buffer[0x20];
StringCopy(buffer, gSpeciesNames[gNamingScreenData->monSpecies]);
StringAppendN(buffer, gNamingScreenData->template->title, 15);
FillWindowPixelBuffer(gNamingScreenData->windows[3], 0x11);
@@ -1492,10 +1492,10 @@ static void sub_80E498C(void)
static void TaskDummy3(void)
{
}
static const u8 sGenderColors[2][3] =
static const u8 sGenderColors[2][3] =
{
{0, 9, 8},
{0, 5, 4}
@@ -1505,7 +1505,7 @@ static void sub_80E49BC(void)
{
u8 genderSymbol[2];
bool8 isFemale = FALSE;
StringCopy(genderSymbol, gText_MaleSymbol);
if (gNamingScreenData->monGender != MON_GENDERLESS)
@@ -1575,7 +1575,7 @@ static bool8 sub_80E4B54(void)
sub_80E4D10();
CopyBgTilemapBufferToVram(3);
PlaySE(SE_SELECT);
if (GetPreviousTextCaretPosition() != gNamingScreenData->template->maxChars - 1)
return FALSE;
else
@@ -1633,7 +1633,7 @@ static void sub_80E4CF8(u8 bg, const void *src)
static void nullsub_10(u8 a1, u8 a2)
{
}
static void sub_80E4D10(void)
@@ -1643,18 +1643,18 @@ static void sub_80E4D10(void)
u16 unk2;
u8 maxChars = gNamingScreenData->template->maxChars;
u16 unk = gNamingScreenData->inputCharBaseXPos - 0x40;
FillWindowPixelBuffer(gNamingScreenData->windows[2], 0x11);
for (i = 0; i < maxChars; i++)
{
temp[0] = gNamingScreenData->textBuffer[i];
temp[1] = gExpandedPlaceholder_Empty[0];
unk2 = (sub_80E503C(temp[0]) == 1) ? 2 : 0;
PrintTextOnWindow(gNamingScreenData->windows[2], 1, temp, i * 8 + unk + unk2, 1, 0xFF, NULL);
}
sub_80E498C();
CopyWindowToVram(gNamingScreenData->windows[2], 2);
PutWindowTilemap(gNamingScreenData->windows[2]);
@@ -1674,12 +1674,12 @@ static const struct TextColorThing sUnkColorStruct =
}
};
static const u8 sFillValues[3] =
static const u8 sFillValues[3] =
{
0xEE, 0xDD, 0xFF
};
static const u8 *const sUnkColors[3] =
static const u8 *const sUnkColors[3] =
{
sUnkColorStruct.colors[1],
sUnkColorStruct.colors[0],
@@ -1689,18 +1689,18 @@ static const u8 *const sUnkColors[3] =
static void sub_80E4DE4(u8 window, u8 a1)
{
u8 i;
FillWindowPixelBuffer(window, sFillValues[a1]);
for (i = 0; i < 4; i++)
{
box_print(window, 1, 0, i * 16 + 1, sUnkColors[a1], 0, gUnknown_0858C198[a1][i]);
}
PutWindowTilemap(window);
}
static const u8 *const gUnknown_0858BF98[] =
static const u8 *const gUnknown_0858BF98[] =
{
gUnknown_08DD4620,
gUnknown_08DD46E0,
@@ -1714,7 +1714,7 @@ static void sub_80E4E5C(void)
u8 unk3;
u8 bg1Priority = GetGpuReg(REG_OFFSET_BG1CNT) & 3;
u8 bg2Priority = GetGpuReg(REG_OFFSET_BG2CNT) & 3;
if (bg1Priority > bg2Priority)
{
unk1 = 1;
@@ -1727,7 +1727,7 @@ static void sub_80E4E5C(void)
unk2 = 2;
unk3 = gNamingScreenData->windows[1];
}
sub_80E4CF8(unk1, gUnknown_0858BF98[gNamingScreenData->currentPage]);
sub_80E4DE4(unk3, sub_80E3254());
nullsub_10(unk1, sub_80E3254());
@@ -1737,7 +1737,7 @@ static void sub_80E4E5C(void)
static void sub_80E4EF0(void)
{
const u8 color[3] = { 15, 1, 2 };
FillWindowPixelBuffer(gNamingScreenData->windows[4], 0xFF);
box_print(gNamingScreenData->windows[4], 0, 2, 1, color, 0, gText_MoveOkBack);
PutWindowTilemap(gNamingScreenData->windows[4]);
@@ -1787,7 +1787,7 @@ static void sub_80E501C(void)
static bool8 sub_80E503C(u8 character)
{
u8 i;
for (i = 0; gUnknown_0858BDC8[i] != EOS; i++)
{
if (character == gUnknown_0858BDC8[i])
@@ -1987,20 +1987,20 @@ static const struct SpriteFrameImage gUnknown_0858C080[] =
{gSpriteImage_858BCB8, sizeof(gSpriteImage_858BCB8)},
};
static const union AnimCmd gSpriteAnim_858C090[] =
static const union AnimCmd gSpriteAnim_858C090[] =
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_JUMP(0)
};
static const union AnimCmd gSpriteAnim_858C098[] =
static const union AnimCmd gSpriteAnim_858C098[] =
{
ANIMCMD_FRAME(4, 8),
ANIMCMD_FRAME(8, 8),
ANIMCMD_END
};
static const union AnimCmd gSpriteAnim_858C0A4[] =
static const union AnimCmd gSpriteAnim_858C0A4[] =
{
ANIMCMD_FRAME(0, 2),
ANIMCMD_FRAME(1, 2),
@@ -2023,7 +2023,7 @@ static const union AnimCmd *const gSpriteAnimTable_858C0BC[] =
gSpriteAnim_858C0A4
};
static const struct SpriteTemplate gUnknown_0858C0C0 =
static const struct SpriteTemplate gUnknown_0858C0C0 =
{
.tileTag = 0x0002,
.paletteTag = 0x0004,
@@ -2034,7 +2034,7 @@ static const struct SpriteTemplate gUnknown_0858C0C0 =
.callback = sub_80E4084
};
static const struct SpriteTemplate gUnknown_0858C0D8 =
static const struct SpriteTemplate gUnknown_0858C0D8 =
{
.tileTag = 0x0003,
.paletteTag = 0x0001,
@@ -2045,7 +2045,7 @@ static const struct SpriteTemplate gUnknown_0858C0D8 =
.callback = SpriteCallbackDummy
};
static const struct SpriteTemplate gUnknown_0858C0F0 =
static const struct SpriteTemplate gUnknown_0858C0F0 =
{
.tileTag = 0x0004,
.paletteTag = 0x0004,
@@ -2056,7 +2056,7 @@ static const struct SpriteTemplate gUnknown_0858C0F0 =
.callback = SpriteCallbackDummy
};
static const struct SpriteTemplate gUnknown_0858C108 =
static const struct SpriteTemplate gUnknown_0858C108 =
{
.tileTag = 0x0000,
.paletteTag = 0x0006,
@@ -2067,7 +2067,7 @@ static const struct SpriteTemplate gUnknown_0858C108 =
.callback = SpriteCallbackDummy
};
static const struct SpriteTemplate gUnknown_0858C120 =
static const struct SpriteTemplate gUnknown_0858C120 =
{
.tileTag = 0x0001,
.paletteTag = 0x0007,
@@ -2078,7 +2078,7 @@ static const struct SpriteTemplate gUnknown_0858C120 =
.callback = SpriteCallbackDummy
};
static const struct SpriteTemplate gUnknown_0858C138 =
static const struct SpriteTemplate gUnknown_0858C138 =
{
.tileTag = 0x0007,
.paletteTag = 0x0005,
@@ -2089,7 +2089,7 @@ static const struct SpriteTemplate gUnknown_0858C138 =
.callback = sub_80E3B30
};
static const struct SpriteTemplate sSpriteTemplate_InputArrow =
static const struct SpriteTemplate sSpriteTemplate_InputArrow =
{
.tileTag = 0x000A,
.paletteTag = 0x0003,
@@ -2100,7 +2100,7 @@ static const struct SpriteTemplate sSpriteTemplate_InputArrow =
.callback = sub_80E3C20
};
static const struct SpriteTemplate sSpriteTemplate_Underscore =
static const struct SpriteTemplate sSpriteTemplate_Underscore =
{
.tileTag = 0x000B,
.paletteTag = 0x0003,
@@ -2111,7 +2111,7 @@ static const struct SpriteTemplate sSpriteTemplate_Underscore =
.callback = sub_80E3C6C
};
static const struct SpriteTemplate gUnknown_0858C180 =
static const struct SpriteTemplate gUnknown_0858C180 =
{
.tileTag = 0xFFFF,
.paletteTag = 0x0000,
@@ -2122,7 +2122,7 @@ static const struct SpriteTemplate gUnknown_0858C180 =
.callback = SpriteCallbackDummy
};
static const u8* const gUnknown_0858C198[][4] =
static const u8* const gUnknown_0858C198[][4] =
{
{
gUnknown_0862B88D,

View File

@@ -146,23 +146,7 @@ void CB2_InitOptionMenu(void)
gMain.state++;
break;
case 1:
{
u8 *addr;
u32 size;
addr = (u8 *)VRAM;
size = 0x18000;
while (1)
{
DmaFill16(3, 0, addr, 0x1000);
addr += 0x1000;
size -= 0x1000;
if (size <= 0x1000)
{
DmaFill16(3, 0, addr, size);
break;
}
}
DmaClearLarge16(3, (void*)(VRAM), VRAM_SIZE, 0x1000);
DmaClear32(3, OAM, OAM_SIZE);
DmaClear16(3, PLTT, PLTT_SIZE);
SetGpuReg(REG_OFFSET_DISPCNT, 0);
@@ -189,7 +173,6 @@ void CB2_InitOptionMenu(void)
ShowBg(0);
ShowBg(1);
gMain.state++;
}
break;
case 2:
ResetPaletteFade();

View File

@@ -89,9 +89,6 @@ extern const u16 gUnknown_82EC7C4[];
extern u16 gSaveFileStatus;
extern u16 gUnknown_03005DA8;
extern u8 *gUnknown_03005DA0;
extern u8 *gUnknown_03005D9C;
extern u8 *gUnknown_03005DA4;
extern bool8 (*gUnknown_03005DB0)(void);
extern u8 gUnknown_03005DB4;
extern u8 gFieldLinkPlayerCount;
@@ -1422,12 +1419,12 @@ static void overworld_bg_setup(void)
SetBgAttribute(1, BG_CTRL_ATTR_PALETTEMODE, 1);
SetBgAttribute(2, BG_CTRL_ATTR_PALETTEMODE, 1);
SetBgAttribute(3, BG_CTRL_ATTR_PALETTEMODE, 1);
gUnknown_03005DA0 = AllocZeroed(0x800);
gUnknown_03005D9C = AllocZeroed(0x800);
gUnknown_03005DA4 = AllocZeroed(0x800);
SetBgTilemapBuffer(1, gUnknown_03005DA0);
SetBgTilemapBuffer(2, gUnknown_03005D9C);
SetBgTilemapBuffer(3, gUnknown_03005DA4);
gBGTilemapBuffers2 = AllocZeroed(0x800);
gBGTilemapBuffers1 = AllocZeroed(0x800);
gBGTilemapBuffers3 = AllocZeroed(0x800);
SetBgTilemapBuffer(1, gBGTilemapBuffers2);
SetBgTilemapBuffer(2, gBGTilemapBuffers1);
SetBgTilemapBuffer(3, gBGTilemapBuffers3);
sub_81971D0();
}
@@ -1435,12 +1432,12 @@ void overworld_free_bg_tilemaps(void)
{
sub_81BE72C();
sub_81971F4();
if (gUnknown_03005DA4 != NULL)
FREE_AND_SET_NULL(gUnknown_03005DA4);
if (gUnknown_03005D9C != NULL)
FREE_AND_SET_NULL(gUnknown_03005D9C);
if (gUnknown_03005DA0 != NULL)
FREE_AND_SET_NULL(gUnknown_03005DA0);
if (gBGTilemapBuffers3 != NULL)
FREE_AND_SET_NULL(gBGTilemapBuffers3);
if (gBGTilemapBuffers1 != NULL)
FREE_AND_SET_NULL(gBGTilemapBuffers1);
if (gBGTilemapBuffers2 != NULL)
FREE_AND_SET_NULL(gBGTilemapBuffers2);
}
static void ResetSafariZoneFlag_(void)

View File

@@ -1,9 +1,28 @@
#include "global.h"
#include "sprite.h"
#include "mail.h"
#include "graphics.h"
#include "constants/species.h"
#include "palette.h"
#include "pokemon_icon.h"
#define POKE_ICON_BASE_PAL_TAG 56000
struct MonIconSpriteTemplate
{
const struct OamData *oam;
const u8 *image;
const union AnimCmd *const *anims;
const union AffineAnimCmd *const *affineAnims;
void (*callback)(struct Sprite *);
u16 paletteTag;
};
// static functions
static u8 CreateMonIconSprite(struct MonIconSpriteTemplate *, s16, s16, u8);
// .rodata
const u8 * const gMonIconTable[] =
{
gMonIcon_Bulbasaur,
@@ -1012,3 +1031,288 @@ const u16 sSpriteImageSizes[3][4] =
0x400, // 4×8
},
};
u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality, bool32 extra)
{
u8 spriteId;
struct MonIconSpriteTemplate iconTemplate =
{
.oam = &sMonIconOamData,
.image = GetMonIconPtr(species, personality, extra),
.anims = sMonIconAnims,
.affineAnims = sMonIconAffineAnims,
.callback = callback,
.paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species],
};
if (species > SPECIES_EGG)
iconTemplate.paletteTag = POKE_ICON_BASE_PAL_TAG;
spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority);
UpdateMonIconFrame(&gSprites[spriteId]);
return spriteId;
}
u8 sub_80D2D78(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, bool32 extra)
{
u8 spriteId;
struct MonIconSpriteTemplate iconTemplate =
{
.oam = &sMonIconOamData,
.image = NULL,
.anims = sMonIconAnims,
.affineAnims = sMonIconAffineAnims,
.callback = callback,
.paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species],
};
iconTemplate.image = GetMonIconTiles(species, extra);
spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority);
UpdateMonIconFrame(&gSprites[spriteId]);
return spriteId;
}
u16 mon_icon_convert_unown_species_id(u16 species, u32 personality)
{
u16 result;
if (species == SPECIES_UNOWN)
{
u16 letter = GetUnownLetterByPersonality(personality);
if (letter == 0)
letter = SPECIES_UNOWN;
else
letter += (SPECIES_UNOWN_B - 1);
result = letter;
}
else
{
if (species > SPECIES_EGG)
result = 260;
else
result = species;
}
return result;
}
u16 GetUnownLetterByPersonality(u32 personality)
{
if (!personality)
return 0;
return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C;
}
u16 sub_80D2E84(u16 species)
{
u16 value;
if (MailSpeciesToSpecies(species, &value) == SPECIES_UNOWN)
{
if (value == 0)
value += SPECIES_UNOWN;
else
value += (SPECIES_UNOWN_B - 1);
return value;
}
else
{
if(species > (SPECIES_UNOWN_B - 1))
species = 260;
return mon_icon_convert_unown_species_id(species, 0);
}
}
const u8 *GetMonIconPtr(u16 species, u32 personality, bool32 extra)
{
return GetMonIconTiles(mon_icon_convert_unown_species_id(species, personality), extra);
}
void sub_80D2EF8(struct Sprite *sprite)
{
sub_80D328C(sprite);
}
void LoadMonIconPalettes(void)
{
u8 i;
for (i = 0; i < 6; i++)
LoadSpritePalette(&gMonIconPaletteTable[i]);
}
// unused
void SafeLoadMonIconPalette(u16 species)
{
u8 palIndex;
if (species > SPECIES_EGG)
species = 260;
palIndex = gMonIconPaletteIndices[species];
if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF)
LoadSpritePalette(&gMonIconPaletteTable[palIndex]);
}
void LoadMonIconPalette(u16 species)
{
u8 palIndex = gMonIconPaletteIndices[species];
if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF)
LoadSpritePalette(&gMonIconPaletteTable[palIndex]);
}
void FreeMonIconPalettes(void)
{
u8 i;
for (i = 0; i < 6; i++)
FreeSpritePaletteByTag(gMonIconPaletteTable[i].tag);
}
// unused
void SafeFreeMonIconPalette(u16 species)
{
u8 palIndex;
if (species > SPECIES_EGG)
species = 260;
palIndex = gMonIconPaletteIndices[species];
FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag);
}
void FreeMonIconPalette(u16 species)
{
u8 palIndex;
palIndex = gMonIconPaletteIndices[species];
FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag);
}
void sub_80D3014(struct Sprite *sprite)
{
UpdateMonIconFrame(sprite);
}
const u8* GetMonIconTiles(u16 species, bool32 extra)
{
const u8* iconSprite = gMonIconTable[species];
if(species == SPECIES_DEOXYS && extra == TRUE)
{
iconSprite = (const u8*)(0x400 + (u32)iconSprite); //WTF?
}
return iconSprite;
}
void sub_80D304C(u16 offset)
{
s32 i;
const struct SpritePalette* monIconPalettePtr;
if(offset <= 0xA0)
{
monIconPalettePtr = gMonIconPaletteTable;
for(i = 5; i >= 0 ; i--)
{
LoadPalette(monIconPalettePtr->data, offset, 0x20);
offset += 0x10;
monIconPalettePtr++;
}
}
}
u8 sub_80D3080(u16 species)
{
if (species > SPECIES_EGG)
species = 260;
return gMonIconPaletteIndices[species];
}
u8 sub_80D30A0(u16 species)
{
return gMonIconPaletteIndices[species];
}
const u16* GetValidMonIconPalettePtr(u16 species)
{
if (species > SPECIES_EGG)
species = 260;
return gMonIconPaletteTable[gMonIconPaletteIndices[species]].data;
}
// TODO: try to find a way to avoid using asm statement
u8 UpdateMonIconFrame(struct Sprite *sprite)
{
u8 result = 0;
if (sprite->animDelayCounter == 0)
{
s16 frame = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue;
switch (frame)
{
case -1:
break;
case -2:
sprite->animCmdIndex = 0;
break;
default:
RequestSpriteCopy(
// pointer arithmetic is needed to get the correct pointer to perform the sprite copy on.
// because sprite->images is a struct def, it has to be casted to (u8 *) before any
// arithmetic can be performed.
(u8 *)sprite->images + (sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] * frame),
(u8 *)(OBJ_VRAM0 + sprite->oam.tileNum * TILE_SIZE_4BPP),
sSpriteImageSizes[sprite->oam.shape][sprite->oam.size]);
{
register u8 duration asm("r0") = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration;
sprite->animDelayCounter = duration;
}
sprite->animCmdIndex++;
result = sprite->animCmdIndex;
break;
}
}
else
{
sprite->animDelayCounter--;
}
return result;
}
static u8 CreateMonIconSprite(struct MonIconSpriteTemplate *iconTemplate, s16 x, s16 y, u8 subpriority)
{
u8 spriteId;
struct SpriteFrameImage image = { NULL, sSpriteImageSizes[iconTemplate->oam->shape][iconTemplate->oam->size] };
struct SpriteTemplate spriteTemplate =
{
.tileTag = 0xFFFF,
.paletteTag = iconTemplate->paletteTag,
.oam = iconTemplate->oam,
.anims = iconTemplate->anims,
.images = &image,
.affineAnims = iconTemplate->affineAnims,
.callback = iconTemplate->callback,
};
spriteId = CreateSprite(&spriteTemplate, x, y, subpriority);
gSprites[spriteId].animPaused = TRUE;
gSprites[spriteId].animBeginning = FALSE;
gSprites[spriteId].images = (const struct SpriteFrameImage *)iconTemplate->image;
return spriteId;
}
void sub_80D328C(struct Sprite *sprite)
{
struct SpriteFrameImage image = { NULL, sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] };
sprite->images = &image;
DestroySprite(sprite);
}
void sub_80D32C8(struct Sprite *sprite, u8 animNum)
{
sprite->animNum = animNum;
sprite->animDelayCounter = 0;
sprite->animCmdIndex = 0;
}

View File

@@ -2776,93 +2776,27 @@ void sub_81C2C38(u8 a)
schedule_bg_copy_tilemap_to_vram(0);
}
#ifdef NONMATCHING
u8 sub_81C2D2C(struct WindowTemplate *template, u8 a)
{
u8 *r4 = gUnknown_0203CF1C->unk40CB;
if (r4[a] == 0xFF)
u8 *windowIdPtr = &(gUnknown_0203CF1C->unk40CB[a]);
if (*windowIdPtr == 0xFF)
{
r4[a] = AddWindow(&template[a]);
FillWindowPixelBuffer(r4[a], 0);
*windowIdPtr = AddWindow(&template[a]);
FillWindowPixelBuffer(*windowIdPtr, 0);
}
return r4[a];
return *windowIdPtr;
}
#else
ASM_DIRECT
u8 sub_81C2D2C(struct WindowTemplate *template, u8 a)
{
asm(".syntax unified\n\
push {r4,lr}\n\
adds r3, r0, 0\n\
lsls r1, 24\n\
lsrs r2, r1, 24\n\
ldr r0, =gUnknown_0203CF1C\n\
ldr r4, =0x000040cb\n\
adds r1, r2, r4\n\
ldr r0, [r0]\n\
adds r4, r0, r1\n\
ldrb r0, [r4]\n\
cmp r0, 0xFF\n\
bne _081C2D56\n\
lsls r0, r2, 3\n\
adds r0, r3, r0\n\
bl AddWindow\n\
strb r0, [r4]\n\
ldrb r0, [r4]\n\
movs r1, 0\n\
bl FillWindowPixelBuffer\n\
_081C2D56:\n\
ldrb r0, [r4]\n\
pop {r4}\n\
pop {r1}\n\
bx r1\n\
.pool\n\
.syntax divided\n");
}
#endif
#ifdef NONMATCHING
void sub_81C2D68(u8 a)
{
u8 *r4 = gUnknown_0203CF1C->unk40CB;
if (r4[a] != 0xFF)
u8 *windowIdPtr = &(gUnknown_0203CF1C->unk40CB[a]);
if (*windowIdPtr != 0xFF)
{
ClearWindowTilemap(r4[a]);
RemoveWindow(r4[a]);
r4[a] = 0xFF;
ClearWindowTilemap(*windowIdPtr);
RemoveWindow(*windowIdPtr);
*windowIdPtr = 0xFF;
}
}
#else
ASM_DIRECT
void sub_81C2D68(u8 a)
{
asm(".syntax unified\n\
push {r4,lr}\n\
lsls r0, 24\n\
lsrs r0, 24\n\
ldr r1, =gUnknown_0203CF1C\n\
ldr r2, =0x000040cb\n\
adds r0, r2\n\
ldr r1, [r1]\n\
adds r4, r1, r0\n\
ldrb r0, [r4]\n\
cmp r0, 0xFF\n\
beq _081C2D8C\n\
bl ClearWindowTilemap\n\
ldrb r0, [r4]\n\
bl RemoveWindow\n\
movs r0, 0xFF\n\
strb r0, [r4]\n\
_081C2D8C:\n\
pop {r4}\n\
pop {r0}\n\
bx r0\n\
.pool\n\
.syntax divided\n");
}
#endif
void sub_81C2D9C(u8 a)
{

209
src/rom6.c Normal file
View File

@@ -0,0 +1,209 @@
#include "global.h"
#include "constants/map_objects.h"
#include "constants/songs.h"
#include "rom6.h"
#include "braille_puzzles.h"
#include "event_data.h"
#include "event_scripts.h"
#include "field_effect.h"
#include "field_map_obj.h"
#include "field_player_avatar.h"
#include "item_use.h"
#include "party_menu.h"
#include "overworld.h"
#include "script.h"
#include "sound.h"
#include "sprite.h"
#include "task.h"
// static functions
static void task08_080C9820(u8 taskId);
static void sub_8135578(u8 taskId);
static void sub_813552C(u8 taskId);
static void sub_813561C(u8 taskId);
static void sub_81356C4(void);
static void sub_8135714(void);
static void hm2_dig(void);
static void sub_8135780(void);
// extern RAM loc
extern struct MapPosition gUnknown_0203AB40;
// text
bool8 npc_before_player_of_type(u8 a)
{
u8 mapObjId;
GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203AB40.x, &gUnknown_0203AB40.y);
gUnknown_0203AB40.height = PlayerGetZCoord();
mapObjId = GetFieldObjectIdByXYZ(gUnknown_0203AB40.x, gUnknown_0203AB40.y, gUnknown_0203AB40.height);
if (gMapObjects[mapObjId].graphicsId != a)
{
return FALSE;
}
else
{
gSpecialVar_LastTalked = gMapObjects[mapObjId].localId;
return TRUE;
}
}
u8 oei_task_add(void)
{
GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203AB40.x, &gUnknown_0203AB40.y);
return CreateTask(task08_080C9820, 8);
}
static void task08_080C9820(u8 taskId)
{
u8 mapObjId;
ScriptContext2_Enable();
gPlayerAvatar.preventStep = TRUE;
mapObjId = gPlayerAvatar.mapObjectId;
if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(&gMapObjects[mapObjId])
|| FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId]))
{
if (gMapHeader.mapType == MAP_TYPE_UNDERWATER)
{
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
gTasks[taskId].func = sub_8135578;
}
else
{
sub_808C114();
FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], 0x39);
gTasks[taskId].func = sub_813552C;
}
}
}
static void sub_813552C(u8 taskId)
{
if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[gPlayerAvatar.mapObjectId]) == TRUE)
{
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
gTasks[taskId].func = sub_8135578;
}
}
static void sub_8135578(u8 taskId)
{
if (!FieldEffectActiveListContains(6))
{
gFieldEffectArguments[1] = player_get_direction_lower_nybble();
if (gFieldEffectArguments[1] == 1)
gFieldEffectArguments[2] = 0;
if (gFieldEffectArguments[1] == 2)
gFieldEffectArguments[2] = 1;
if (gFieldEffectArguments[1] == 3)
gFieldEffectArguments[2] = 2;
if (gFieldEffectArguments[1] == 4)
gFieldEffectArguments[2] = 3;
FieldObjectSetGraphicsId(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByCurrentState());
StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gFieldEffectArguments[2]);
FieldEffectActiveListRemove(6);
gTasks[taskId].func = sub_813561C;
}
}
static void sub_813561C(u8 taskId)
{
void (*func)(void) = (void (*)(void))(((u16)gTasks[taskId].data[8] << 16) | (u16)gTasks[taskId].data[9]);
func();
gPlayerAvatar.preventStep = FALSE;
DestroyTask(taskId);
}
bool8 SetUpFieldMove_RockSmash(void)
{
if(ShouldDoBrailleStrengthEffect())
{
gSpecialVar_Result = GetCursorSelectionMonId();
gUnknown_03005DB0 = FieldCallback_Teleport;
gUnknown_0203CEEC = sub_8179834;
return TRUE;
}
else if (npc_before_player_of_type(0x56) == TRUE)
{
gUnknown_03005DB0 = FieldCallback_Teleport;
gUnknown_0203CEEC = sub_81356C4;
return TRUE;
}
else
{
return FALSE;
}
}
static void sub_81356C4(void)
{
gFieldEffectArguments[0] = GetCursorSelectionMonId();
ScriptContext1_SetupScript(Route111_EventScript_2907F0);
}
bool8 FldEff_UseRockSmash(void)
{
u8 taskId = oei_task_add();
gTasks[taskId].data[8] = (u32)sub_8135714 >> 16;
gTasks[taskId].data[9] = (u32)sub_8135714;
IncrementGameStat(GAME_STAT_USED_ROCK_SMASH);
return FALSE;
}
static void sub_8135714(void)
{
PlaySE(SE_W088);
FieldEffectActiveListRemove(FLDEFF_USE_ROCK_SMASH);
EnableBothScriptContexts();
}
bool8 SetUpFieldMove_Dig(void)
{
if (CanUseEscapeRopeOnCurrMap() == TRUE)
{
gUnknown_03005DB0 = FieldCallback_Teleport;
gUnknown_0203CEEC = hm2_dig;
return TRUE;
}
else
{
return FALSE;
}
}
static void hm2_dig(void)
{
Overworld_ResetStateAfterDigEscRope();
FieldEffectStart(FLDEFF_USE_DIG);
gFieldEffectArguments[0] = GetCursorSelectionMonId();
}
bool8 FldEff_UseDig(void)
{
u8 taskId = oei_task_add();
gTasks[taskId].data[8] = (u32)sub_8135780 >> 16;
gTasks[taskId].data[9] = (u32)sub_8135780;
if (!ShouldDoBrailleDigEffect())
SetPlayerAvatarTransitionFlags(1);
return FALSE;
}
static void sub_8135780(void)
{
u8 taskId;
FieldEffectActiveListRemove(FLDEFF_USE_DIG);
if (ShouldDoBrailleDigEffect())
{
DoBrailleDigEffect();
}
else
{
taskId = CreateTask(task08_080A1C44, 8);
gTasks[taskId].data[0] = 0;
}
}

1188
src/rotating_gate.c Normal file

File diff suppressed because it is too large Load Diff

233
src/script_movement.c Normal file
View File

@@ -0,0 +1,233 @@
#include "global.h"
#include "script_movement.h"
#include "field_map_obj.h"
#include "field_map_obj_helpers.h"
#include "task.h"
#include "util.h"
// static functions
static void sub_80D33AC(u8);
static u8 sub_80D33F4(void);
static bool8 sub_80D3408(u8, u8, const u8 *);
static u8 sub_80D3474(u8, u8);
static bool8 sub_80D3584(u8, u8);
static void sub_80D35DC(u8, u8, u8, const u8 *);
static void UnfreezeObjects(u8);
static void sub_80D3660(u8);
static void sub_80A2490(u8, u8, u8, const u8 *);
// EWRAM_DATA
static EWRAM_DATA const u8 *gUnknown_02039D90[16] = {0};
// text
bool8 ScriptMovement_StartObjectMovementScript(u8 localId, u8 mapNum, u8 mapGroup, const u8 *movementScript)
{
u8 mapObjId;
if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjId))
return TRUE;
if (!FuncIsActiveTask(sub_80D3660))
sub_80D33AC(50);
return sub_80D3408(sub_80D33F4(), mapObjId, movementScript);
}
bool8 ScriptMovement_IsObjectMovementFinished(u8 localId, u8 mapNum, u8 mapBank)
{
u8 mapObjId;
u8 r4;
u8 r1;
if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapBank, &mapObjId))
return TRUE;
r4 = sub_80D33F4();
r1 = sub_80D3474(r4, mapObjId);
if (r1 == 16)
return TRUE;
return sub_80D3584(r4, r1);
}
void sub_80D338C(void)
{
u8 taskId;
taskId = sub_80D33F4();
if (taskId != 0xFF)
{
UnfreezeObjects(taskId);
DestroyTask(taskId);
}
}
static void sub_80D33AC(u8 priority)
{
u8 taskId;
u8 i;
taskId = CreateTask(sub_80D3660, priority);
for (i = 1; i < 16; i++)
gTasks[taskId].data[i] = 0xFFFF;
}
static u8 sub_80D33F4(void)
{
return FindTaskIdByFunc(sub_80D3660);
}
static bool8 sub_80D3408(u8 taskId, u8 mapObjId, const u8 *movementScript)
{
u8 r4;
r4 = sub_80D3474(taskId, mapObjId);
if (r4 != 16)
{
if (sub_80D3584(taskId, r4) == 0)
{
return TRUE;
}
else
{
sub_80D35DC(taskId, r4, mapObjId, movementScript);
return FALSE;
}
}
r4 = sub_80D3474(taskId, 0xFF);
if (r4 == 16)
{
return TRUE;
}
else
{
sub_80D35DC(taskId, r4, mapObjId, movementScript);
return FALSE;
}
}
static u8 sub_80D3474(u8 taskId, u8 b)
{
u8 *ptr;
u8 i;
ptr = (u8 *)&gTasks[taskId].data[1];
for (i = 0; i < 16; i++, ptr++)
{
if (*ptr == b)
return i;
}
return 16;
}
static void sub_80D34B0(u8 taskId, u8 b, u8 **c)
{
u8 i;
*c = (u8 *)&gTasks[taskId].data[1];
for (i = 0; i < b; i++, (*c)++)
;
}
static void sub_80D34E4(u8 taskId, u8 b, u8 c)
{
u8 *ptr;
sub_80D34B0(taskId, b, &ptr);
*ptr = c; //what is this supposed to do?
}
static void sub_80D3508(u8 taskId, u8 b, u8 *c)
{
u8 *ptr;
sub_80D34B0(taskId, b, &ptr);
*c = *ptr;
}
static void sub_80D352C(u8 a, u8 b)
{
u16 var = ~gBitTable[b];
gTasks[a].data[0] &= var;
}
static void sub_80D355C(u8 taskId, u8 b)
{
gTasks[taskId].data[0] |= gBitTable[b];
}
static bool8 sub_80D3584(u8 taskId, u8 b)
{
u16 var = (u16)gTasks[taskId].data[0] & gBitTable[b];
if (var != 0)
return TRUE;
else
return FALSE;
}
static void npc_obj_offscreen_culling_and_flag_update(u8 a, const u8 *movementScript)
{
gUnknown_02039D90[a] = movementScript;
}
static const u8 *sub_80D35CC(u8 a)
{
return gUnknown_02039D90[a];
}
static void sub_80D35DC(u8 taskId, u8 b, u8 mapObjId, const u8 *movementScript)
{
sub_80D352C(taskId, b);
npc_obj_offscreen_culling_and_flag_update(b, movementScript);
sub_80D34E4(taskId, b, mapObjId);
}
static void UnfreezeObjects(u8 taskId)
{
u8 *pMapObjId;
u8 i;
pMapObjId = (u8 *)&gTasks[taskId].data[1];
for (i = 0; i < 16; i++, pMapObjId++)
{
if (*pMapObjId != 0xFF)
npc_sync_anim_pause_bits(&gMapObjects[*pMapObjId]);
}
}
static void sub_80D3660(u8 taskId)
{
u8 i;
u8 var;
for (i = 0; i < 16; i++)
{
sub_80D3508(taskId, i, &var);
if (var != 0xFF)
sub_80A2490(taskId, i, var, sub_80D35CC(i));
}
}
static void sub_80A2490(u8 taskId, u8 b, u8 mapObjId, const u8 *d)
{
u8 var;
if (FieldObjectIsSpecialAnimActive(&gMapObjects[mapObjId])
&& !FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId]))
return;
var = *d;
if (var == 0xFE)
{
sub_80D355C(taskId, b);
FreezeMapObject(&gMapObjects[mapObjId]);
}
else
{
if (!FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], var))
{
d++;
npc_obj_offscreen_culling_and_flag_update(b, d);
}
}
}

View File

@@ -7,26 +7,26 @@
#include "graphics.h"
// const rom data
const u32 gTextWindowFrame1_Gfx[] = INCBIN_U32("graphics/text_window/1.4bpp");
static const u32 sTextWindowFrame2_Gfx[] = INCBIN_U32("graphics/text_window/2.4bpp");
static const u32 sTextWindowFrame3_Gfx[] = INCBIN_U32("graphics/text_window/3.4bpp");
static const u32 sTextWindowFrame4_Gfx[] = INCBIN_U32("graphics/text_window/4.4bpp");
static const u32 sTextWindowFrame5_Gfx[] = INCBIN_U32("graphics/text_window/5.4bpp");
static const u32 sTextWindowFrame6_Gfx[] = INCBIN_U32("graphics/text_window/6.4bpp");
static const u32 sTextWindowFrame7_Gfx[] = INCBIN_U32("graphics/text_window/7.4bpp");
static const u32 sTextWindowFrame8_Gfx[] = INCBIN_U32("graphics/text_window/8.4bpp");
static const u32 sTextWindowFrame9_Gfx[] = INCBIN_U32("graphics/text_window/9.4bpp");
static const u32 sTextWindowFrame10_Gfx[] = INCBIN_U32("graphics/text_window/10.4bpp");
static const u32 sTextWindowFrame11_Gfx[] = INCBIN_U32("graphics/text_window/11.4bpp");
static const u32 sTextWindowFrame12_Gfx[] = INCBIN_U32("graphics/text_window/12.4bpp");
static const u32 sTextWindowFrame13_Gfx[] = INCBIN_U32("graphics/text_window/13.4bpp");
static const u32 sTextWindowFrame14_Gfx[] = INCBIN_U32("graphics/text_window/14.4bpp");
static const u32 sTextWindowFrame15_Gfx[] = INCBIN_U32("graphics/text_window/15.4bpp");
static const u32 sTextWindowFrame16_Gfx[] = INCBIN_U32("graphics/text_window/16.4bpp");
static const u32 sTextWindowFrame17_Gfx[] = INCBIN_U32("graphics/text_window/17.4bpp");
static const u32 sTextWindowFrame18_Gfx[] = INCBIN_U32("graphics/text_window/18.4bpp");
static const u32 sTextWindowFrame19_Gfx[] = INCBIN_U32("graphics/text_window/19.4bpp");
static const u32 sTextWindowFrame20_Gfx[] = INCBIN_U32("graphics/text_window/20.4bpp");
const u8 gTextWindowFrame1_Gfx[] = INCBIN_U8("graphics/text_window/1.4bpp");
static const u8 sTextWindowFrame2_Gfx[] = INCBIN_U8("graphics/text_window/2.4bpp");
static const u8 sTextWindowFrame3_Gfx[] = INCBIN_U8("graphics/text_window/3.4bpp");
static const u8 sTextWindowFrame4_Gfx[] = INCBIN_U8("graphics/text_window/4.4bpp");
static const u8 sTextWindowFrame5_Gfx[] = INCBIN_U8("graphics/text_window/5.4bpp");
static const u8 sTextWindowFrame6_Gfx[] = INCBIN_U8("graphics/text_window/6.4bpp");
static const u8 sTextWindowFrame7_Gfx[] = INCBIN_U8("graphics/text_window/7.4bpp");
static const u8 sTextWindowFrame8_Gfx[] = INCBIN_U8("graphics/text_window/8.4bpp");
static const u8 sTextWindowFrame9_Gfx[] = INCBIN_U8("graphics/text_window/9.4bpp");
static const u8 sTextWindowFrame10_Gfx[] = INCBIN_U8("graphics/text_window/10.4bpp");
static const u8 sTextWindowFrame11_Gfx[] = INCBIN_U8("graphics/text_window/11.4bpp");
static const u8 sTextWindowFrame12_Gfx[] = INCBIN_U8("graphics/text_window/12.4bpp");
static const u8 sTextWindowFrame13_Gfx[] = INCBIN_U8("graphics/text_window/13.4bpp");
static const u8 sTextWindowFrame14_Gfx[] = INCBIN_U8("graphics/text_window/14.4bpp");
static const u8 sTextWindowFrame15_Gfx[] = INCBIN_U8("graphics/text_window/15.4bpp");
static const u8 sTextWindowFrame16_Gfx[] = INCBIN_U8("graphics/text_window/16.4bpp");
static const u8 sTextWindowFrame17_Gfx[] = INCBIN_U8("graphics/text_window/17.4bpp");
static const u8 sTextWindowFrame18_Gfx[] = INCBIN_U8("graphics/text_window/18.4bpp");
static const u8 sTextWindowFrame19_Gfx[] = INCBIN_U8("graphics/text_window/19.4bpp");
static const u8 sTextWindowFrame20_Gfx[] = INCBIN_U8("graphics/text_window/20.4bpp");
const u16 gTextWindowFrame1_Pal[] = INCBIN_U16("graphics/text_window/1.gbapal");
static const u16 sTextWindowFrame2_Pal[] = INCBIN_U16("graphics/text_window/2.gbapal");