Merge branch 'master' into battle

This commit is contained in:
jiangzhengwenjz
2019-08-25 06:58:56 +08:00
31 changed files with 8275 additions and 1631 deletions
+3 -4
View File
@@ -1380,10 +1380,9 @@ static bool8 BT_Phase2FullScreenWave_UpdateWave(struct Task *task)
for (i = 0; i < 160; ++i, theta += frequency)
{
s16 var = theta >> 8;
#ifndef NONMATCHING
asm("");
#endif
++var;
--var;
gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->bg123VOfs + Sin(var, amplitude);
}
if (++task->tDelayForFade == 41)
+50 -345
View File
@@ -1024,295 +1024,49 @@ void CopyToBgTilemapBufferRect_ChangePalette(u8 bg, const void *src, u8 destX, u
{
CopyRectToBgTilemapBufferRect(bg, src, 0, 0, rectWidth, rectHeight, destX, destY, rectWidth, rectHeight, palette, 0, 0);
}
// Skipping for now, it probably uses structs passed by value
/*
void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2)
void CopyRectToBgTilemapBufferRect(u8 bg, const void *src, u8 srcX, u8 srcY, u8 srcWidth, u8 unused, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, s16 palette1, s16 tileOffset)
{
u16 attribute;
u16 mode;
u16 mode2;
u16 screenWidth, screenHeight, screenSize;
u16 var;
const void *srcPtr;
u16 i, j;
void* srcCopy;
u16 destX16;
u16 destY16;
if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)
if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg))
{
attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);
mode = GetBgMetricTextMode(bg, 0x1) * 0x20;
mode2 = GetBgMetricTextMode(bg, 0x2) * 0x20;
screenSize = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);
screenWidth = GetBgMetricTextMode(bg, 0x1) * 0x20;
screenHeight = GetBgMetricTextMode(bg, 0x2) * 0x20;
switch (GetBgType(bg))
{
case 0:
srcCopy = src;
for (destY16 = destY; destY16 < (destY + rectHeight); destY16++)
case 0:
srcPtr = src + ((srcY * srcWidth) + srcX) * 2;
for (i = destX; i < (destX + rectWidth); i++)
{
for (j = srcHeight; j < (srcHeight + destY); j++)
{
for (destX16 = destX; destX16 < (destX + rectWidth); destX16++)
{
CopyTileMapEntry(&((u16*)srcCopy)[(srcY * rectWidth) + srcX], &((u16*)sGpuBgConfigs2[bg].tilemap)[GetTileMapIndexFromCoords(destX16, destY16, attribute, mode, mode2)], palette1, tileOffset, palette2);
}
u16 index = GetTileMapIndexFromCoords(j, i, screenSize, screenWidth, screenHeight);
CopyTileMapEntry(srcPtr, sGpuBgConfigs2[bg].tilemap + (index * 2), rectHeight, palette1, tileOffset);
srcPtr += 2;
}
break;
case 1:
srcCopy = src;
mode = GetBgMetricAffineMode(bg, 0x1);
for (destY16 = destY; destY16 < (destY + rectHeight); destY16++)
srcPtr += (srcWidth - destY) * 2;
}
break;
case 1:
srcPtr = src + ((srcY * srcWidth) + srcX);
var = GetBgMetricAffineMode(bg, 0x1);
for (i = destX; i < (destX + rectWidth); i++)
{
for (j = srcHeight; j < (srcHeight + destY); j++)
{
for (destX16 = destX; destX16 < (destX + rectWidth); destX16++)
{
CopyTileMapEntry(&((u16*)srcCopy)[(srcY * rectWidth) + srcX], &((u16*)sGpuBgConfigs2[bg].tilemap)[GetTileMapIndexFromCoords(destX16, destY16, attribute, mode, mode2)], palette1, tileOffset, palette2);
}
*(u8*)(sGpuBgConfigs2[bg].tilemap + ((var * i) + j)) = *(u8*)(srcPtr) + palette1;
srcPtr++;
}
break;
srcPtr += (srcWidth - destY);
}
break;
}
}
}*/
NAKED
void CopyRectToBgTilemapBufferRect(u8 bg, const void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2)
{
asm("push {r4-r7,lr}\n\
mov r7, r10\n\
mov r6, r9\n\
mov r5, r8\n\
push {r5-r7}\n\
sub sp, #0x40\n\
str r1, [sp, #0x8]\n\
ldr r1, [sp, #0x60]\n\
ldr r4, [sp, #0x68]\n\
ldr r5, [sp, #0x6C]\n\
ldr r6, [sp, #0x70]\n\
ldr r7, [sp, #0x74]\n\
mov r8, r7\n\
ldr r7, [sp, #0x78]\n\
mov r9, r7\n\
ldr r7, [sp, #0x7C]\n\
mov r10, r7\n\
ldr r7, [sp, #0x80]\n\
mov r12, r7\n\
lsl r0, #24\n\
lsr r0, #24\n\
str r0, [sp, #0x4]\n\
lsl r2, #24\n\
lsr r2, #24\n\
str r2, [sp, #0xC]\n\
lsl r3, #24\n\
lsr r3, #24\n\
str r3, [sp, #0x10]\n\
lsl r1, #24\n\
lsr r7, r1, #24\n\
lsl r4, #24\n\
lsr r4, #24\n\
str r4, [sp, #0x14]\n\
lsl r5, #24\n\
lsr r5, #24\n\
lsl r6, #24\n\
lsr r6, #24\n\
str r6, [sp, #0x18]\n\
mov r0, r8\n\
lsl r0, #24\n\
lsr r4, r0, #24\n\
mov r1, r9\n\
lsl r1, #24\n\
lsr r1, #24\n\
str r1, [sp, #0x1C]\n\
mov r2, r10\n\
lsl r2, #16\n\
lsr r2, #16\n\
str r2, [sp, #0x20]\n\
mov r0, r12\n\
lsl r0, #16\n\
lsr r0, #16\n\
str r0, [sp, #0x24]\n\
ldr r0, [sp, #0x4]\n\
bl IsInvalidBg32\n\
cmp r0, #0\n\
beq _08002592\n\
b _080026EE\n\
_08002592:\n\
ldr r0, [sp, #0x4]\n\
bl IsTileMapOutsideWram\n\
cmp r0, #0\n\
beq _0800259E\n\
b _080026EE\n\
_0800259E:\n\
ldr r0, [sp, #0x4]\n\
mov r1, #0x4\n\
bl GetBgControlAttribute\n\
lsl r0, #16\n\
lsr r0, #16\n\
str r0, [sp, #0x30]\n\
ldr r0, [sp, #0x4]\n\
mov r1, #0x1\n\
bl GetBgMetricTextMode\n\
lsl r0, #21\n\
lsr r0, #16\n\
str r0, [sp, #0x28]\n\
ldr r0, [sp, #0x4]\n\
mov r1, #0x2\n\
bl GetBgMetricTextMode\n\
lsl r0, #21\n\
lsr r0, #16\n\
str r0, [sp, #0x2C]\n\
ldr r0, [sp, #0x4]\n\
bl GetBgType\n\
cmp r0, #0\n\
beq _080025D8\n\
cmp r0, #0x1\n\
beq _08002674\n\
b _080026EE\n\
_080025D8:\n\
ldr r1, [sp, #0x10]\n\
add r0, r1, #0\n\
mul r0, r7\n\
ldr r2, [sp, #0xC]\n\
add r0, r2\n\
lsl r0, #1\n\
ldr r1, [sp, #0x8]\n\
add r6, r1, r0\n\
add r0, r5, r4\n\
cmp r5, r0\n\
blt _080025F0\n\
b _080026EE\n\
_080025F0:\n\
ldr r2, [sp, #0x18]\n\
sub r2, r7, r2\n\
str r2, [sp, #0x34]\n\
str r0, [sp, #0x38]\n\
_080025F8:\n\
ldr r4, [sp, #0x14]\n\
ldr r7, [sp, #0x18]\n\
add r0, r4, r7\n\
add r1, r5, #0x1\n\
str r1, [sp, #0x3C]\n\
cmp r4, r0\n\
bge _0800265A\n\
ldr r2, [sp, #0x4]\n\
lsl r0, r2, #4\n\
ldr r1, =sGpuBgConfigs2+4\n\
add r0, r1\n\
mov r10, r0\n\
ldr r7, [sp, #0x20]\n\
lsl r7, #16\n\
mov r9, r7\n\
ldr r1, [sp, #0x24]\n\
lsl r0, r1, #16\n\
asr r0, #16\n\
mov r8, r0\n\
_0800261E:\n\
ldr r2, [sp, #0x2C]\n\
str r2, [sp]\n\
add r0, r4, #0\n\
add r1, r5, #0\n\
ldr r2, [sp, #0x30]\n\
ldr r3, [sp, #0x28]\n\
bl GetTileMapIndexFromCoords\n\
lsl r0, #16\n\
lsr r0, #15\n\
mov r7, r10\n\
ldr r1, [r7]\n\
add r1, r0\n\
mov r0, r8\n\
str r0, [sp]\n\
add r0, r6, #0\n\
ldr r2, [sp, #0x1C]\n\
mov r7, r9\n\
asr r3, r7, #16\n\
bl CopyTileMapEntry\n\
add r6, #0x2\n\
add r0, r4, #0x1\n\
lsl r0, #16\n\
lsr r4, r0, #16\n\
ldr r1, [sp, #0x14]\n\
ldr r2, [sp, #0x18]\n\
add r0, r1, r2\n\
cmp r4, r0\n\
blt _0800261E\n\
_0800265A:\n\
ldr r5, [sp, #0x34]\n\
lsl r0, r5, #1\n\
add r6, r0\n\
ldr r7, [sp, #0x3C]\n\
lsl r0, r7, #16\n\
lsr r5, r0, #16\n\
ldr r0, [sp, #0x38]\n\
cmp r5, r0\n\
blt _080025F8\n\
b _080026EE\n\
.pool\n\
_08002674:\n\
ldr r1, [sp, #0x10]\n\
add r0, r1, #0\n\
mul r0, r7\n\
ldr r2, [sp, #0xC]\n\
add r0, r2\n\
ldr r1, [sp, #0x8]\n\
add r6, r1, r0\n\
ldr r0, [sp, #0x4]\n\
mov r1, #0x1\n\
bl GetBgMetricAffineMode\n\
lsl r0, #16\n\
lsr r0, #16\n\
mov r9, r0\n\
add r0, r5, r4\n\
cmp r5, r0\n\
bge _080026EE\n\
ldr r2, [sp, #0x18]\n\
sub r2, r7, r2\n\
str r2, [sp, #0x34]\n\
str r0, [sp, #0x38]\n\
ldr r7, =sGpuBgConfigs2+4\n\
mov r10, r7\n\
ldr r0, [sp, #0x4]\n\
lsl r0, #4\n\
mov r8, r0\n\
_080026A8:\n\
ldr r4, [sp, #0x14]\n\
ldr r1, [sp, #0x18]\n\
add r0, r4, r1\n\
add r2, r5, #0x1\n\
str r2, [sp, #0x3C]\n\
cmp r4, r0\n\
bge _080026DE\n\
mov r3, r8\n\
add r3, r10\n\
mov r7, r9\n\
mul r7, r5\n\
mov r12, r7\n\
add r2, r0, #0\n\
_080026C2:\n\
ldr r1, [r3]\n\
mov r5, r12\n\
add r0, r5, r4\n\
add r1, r0\n\
ldrb r0, [r6]\n\
ldr r7, [sp, #0x20]\n\
add r0, r7\n\
strb r0, [r1]\n\
add r6, #0x1\n\
add r0, r4, #0x1\n\
lsl r0, #16\n\
lsr r4, r0, #16\n\
cmp r4, r2\n\
blt _080026C2\n\
_080026DE:\n\
ldr r0, [sp, #0x34]\n\
add r6, r0\n\
ldr r1, [sp, #0x3C]\n\
lsl r0, r1, #16\n\
lsr r5, r0, #16\n\
ldr r2, [sp, #0x38]\n\
cmp r5, r2\n\
blt _080026A8\n\
_080026EE:\n\
add sp, #0x40\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");
}
void FillBgTilemapBufferRect_Palette0(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height)
@@ -1494,78 +1248,29 @@ u32 GetTileMapIndexFromCoords(s32 x, s32 y, s32 screenSize, u32 screenWidth, u32
return (y * 0x20) + x;
}
#ifdef NONMATCHING // This one has some weird switch statement cases that refuse to cooperate
void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u32 tileOffset, u32 palette2)
void CopyTileMapEntry(const u16 *src, u16 *dest, s32 palette1, s32 tileOffset, s32 palette2)
{
u16 test;
u16 var;
if (palette1 == 16)
goto CASE_16;
switch (palette1)
{
default:
if (palette1 > 0x10 || palette1 < 0)
test = *src + tileOffset + (palette2 << 12);
else
test = ((*src + tileOffset) & 0xFFF) + ((palette1 + palette2) << 12);
break;
case 0x10:
test = ((*dest & 0xFC00) + (palette2 << 12)) | ((*src + tileOffset) & 0x3FF);
break;
case 0 ... 16:
var = ((*src + tileOffset) & 0xFFF) + ((palette1 + palette2) << 12);
break;
CASE_16:
var = *dest;
var &= 0xFC00;
var += palette2 << 12;
var |= (*src + tileOffset) & 0x3FF;
break;
default:
var = *src + tileOffset + (palette2 << 12);
break;
}
*dest = test;
*dest = var;
}
#else
NAKED
void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u32 tileOffset, u32 palette2)
{
asm("push {r4-r6,lr}\n\
add r4, r0, #0\n\
add r6, r1, #0\n\
ldr r5, [sp, #0x10]\n\
cmp r2, #0x10\n\
beq _08002B14\n\
cmp r2, #0x10\n\
bgt _08002B34\n\
cmp r2, #0\n\
blt _08002B34\n\
ldrh r0, [r4]\n\
add r0, r3\n\
ldr r3, =0x00000fff\n\
add r1, r3, #0\n\
and r0, r1\n\
add r1, r2, r5\n\
lsl r1, #12\n\
b _08002B3A\n\
.pool\n\
_08002B14:\n\
ldrh r1, [r6]\n\
mov r0, #0xFC\n\
lsl r0, #8\n\
and r1, r0\n\
lsl r2, r5, #12\n\
add r2, r1, r2\n\
ldrh r0, [r4]\n\
add r0, r3\n\
ldr r3, =0x000003ff\n\
add r1, r3, #0\n\
and r0, r1\n\
orr r0, r2\n\
b _08002B3C\n\
.pool\n\
_08002B34:\n\
ldrh r0, [r4]\n\
add r0, r3\n\
lsl r1, r5, #12\n\
_08002B3A:\n\
add r0, r1\n\
_08002B3C:\n\
lsl r0, #16\n\
lsr r1, r0, #16\n\
strh r1, [r6]\n\
pop {r4-r6}\n\
pop {r0}\n\
bx r0\n");
}
#endif // NONMATCHING
u32 GetBgType(u8 bg)
{
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -132,7 +132,7 @@ static void Task_DiplomaInit(u8 taskId)
CopyToBgTilemapBuffer(1, gUnknown_84154E8, 0, 0);
break;
case 4:
if (HasAllKantoMons())
if (HasAllMons())
{
SetGpuReg(REG_OFFSET_BG1HOFS, 0x100);
}
@@ -265,7 +265,7 @@ static void DiplomaPrintText(void)
u32 width;
DynamicPlaceholderTextUtil_Reset();
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName);
if (HasAllKantoMons())
if (HasAllMons())
{
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_841B68F);
}
+1 -1
View File
@@ -1247,7 +1247,7 @@ static bool8 sub_812B780(u8 id)
return FlagGet(FLAG_0x828);
case 4:
case 34:
if (sub_8088EDC(1) > 1)
if (GetKantoPokedexCount(1) > 1)
return TRUE;
return FALSE;
case 15:
+123
View File
@@ -0,0 +1,123 @@
#include "global.h"
#include "pokedex.h"
#include "constants/species.h"
extern s8 sub_8104AB0(u16 nationalDexNo, u8 caseID, u8 unk);
ALIGNED(4) static const u8 gExpandedPlaceholder_PokedexDescription[] = _("");
#include "data/pokemon/pokedex_text.h"
#include "data/pokemon/pokedex_entries.h"
const u8 *sub_8088E20(u16 dexNum)
{
return gPokedexEntries[dexNum].categoryName;
}
u16 GetPokedexHeightWeight(u16 dexNum, u8 data)
{
switch (data)
{
case 0: // height
return gPokedexEntries[dexNum].height;
case 1: // weight
return gPokedexEntries[dexNum].weight;
default:
return 1;
}
}
s8 GetSetPokedexFlag(u16 nationalDexNo, u8 caseID)
{
return sub_8104AB0(nationalDexNo, caseID, 0);
}
u16 GetNationalPokedexCount(u8 caseID)
{
u16 count = 0;
u16 i;
for (i = 0; i < NATIONAL_DEX_COUNT; i++)
{
switch (caseID)
{
case FLAG_GET_SEEN:
if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN))
count++;
break;
case FLAG_GET_CAUGHT:
if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
count++;
break;
}
}
return count;
}
u16 GetKantoPokedexCount(u8 caseID)
{
u16 count = 0;
u16 i;
for (i = 0; i < KANTO_DEX_COUNT; i++)
{
switch (caseID)
{
case FLAG_GET_SEEN:
if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN))
count++;
break;
case FLAG_GET_CAUGHT:
if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
count++;
break;
}
}
return count;
}
bool16 HasAllHoennMons(void)
{
u16 i;
for (i = 0; i < HOENN_DEX_COUNT - 2; i++)
{
if (!GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT))
return FALSE;
}
return TRUE;
}
bool8 HasAllKantoMons(void)
{
u16 i;
for (i = 0; i < KANTO_DEX_COUNT - 1; i++)
{
if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
return FALSE;
}
return TRUE;
}
bool16 HasAllMons(void)
{
u16 i;
for (i = 0; i < NATIONAL_DEX_MEWTWO; i++)
{
if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
return FALSE;
}
for (i = NATIONAL_DEX_MEW; i < NATIONAL_DEX_TYRANITAR; i++)
{
if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
return FALSE;
}
for (i = NATIONAL_DEX_CELEBI; i < NATIONAL_DEX_RAYQUAZA; i++)
{
if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
return FALSE;
}
return TRUE;
}
+4 -4
View File
@@ -25,13 +25,13 @@ u16 Special_GetPokedexCount(void)
{
if (gSpecialVar_0x8004 == 0)
{
gSpecialVar_0x8005 = sub_8088EDC(0);
gSpecialVar_0x8006 = sub_8088EDC(1);
gSpecialVar_0x8005 = GetKantoPokedexCount(0);
gSpecialVar_0x8006 = GetKantoPokedexCount(1);
}
else
{
gSpecialVar_0x8005 = pokedex_count(0);
gSpecialVar_0x8006 = pokedex_count(1);
gSpecialVar_0x8005 = GetNationalPokedexCount(0);
gSpecialVar_0x8006 = GetNationalPokedexCount(1);
}
return sub_806E25C();
}
+248
View File
@@ -0,0 +1,248 @@
#include "global.h"
#include "graphics.h"
#include "palette.h"
#include "util.h"
#include "battle_transition.h"
#include "task.h"
#include "fieldmap.h"
static EWRAM_DATA struct {
const u16 *src;
u16 *dest;
u16 size;
} sTilesetDMA3TransferBuffer[20] = {0};
static u8 sTilesetDMA3TransferBufferSize;
static u16 sPrimaryTilesetAnimCounter;
static u16 sPrimaryTilesetAnimCounterMax;
static u16 sSecondaryTilesetAnimCounter;
static u16 sSecondaryTilesetAnimCounterMax;
static void (*sPrimaryTilesetAnimCallback)(u16);
static void (*sSecondaryTilesetAnimCallback)(u16);
static void _InitPrimaryTilesetAnimation(void);
static void _InitSecondaryTilesetAnimation(void);
extern const u16 *const gUnknown_83A7660[];
extern const u16 *const gUnknown_83AA654[];
extern const u16 *const gUnknown_83AB874[];
extern const u16 *const gUnknown_83ABDB4[];
extern const u16 *const gUnknown_83AC1E8[];
extern const u16 *const gUnknown_83AC5F8[];
extern const u16 *const gUnknown_83AC7C8[];
extern const u16 *const gUnknown_83AC950[];
static void ResetTilesetAnimBuffer(void)
{
sTilesetDMA3TransferBufferSize = 0;
CpuFill32(0, sTilesetDMA3TransferBuffer, sizeof sTilesetDMA3TransferBuffer);
}
static void AppendTilesetAnimToBuffer(const u16 *src, u16 *dest, u16 size)
{
if (sTilesetDMA3TransferBufferSize < 20)
{
sTilesetDMA3TransferBuffer[sTilesetDMA3TransferBufferSize].src = src;
sTilesetDMA3TransferBuffer[sTilesetDMA3TransferBufferSize].dest = dest;
sTilesetDMA3TransferBuffer[sTilesetDMA3TransferBufferSize].size = size;
sTilesetDMA3TransferBufferSize++;
}
}
void TransferTilesetAnimsBuffer(void)
{
int i;
for (i = 0; i < sTilesetDMA3TransferBufferSize; i++)
DmaCopy16(3, sTilesetDMA3TransferBuffer[i].src, sTilesetDMA3TransferBuffer[i].dest, sTilesetDMA3TransferBuffer[i].size);
sTilesetDMA3TransferBufferSize = 0;
}
void InitTilesetAnimations(void)
{
ResetTilesetAnimBuffer();
_InitPrimaryTilesetAnimation();
_InitSecondaryTilesetAnimation();
}
void InitSecondaryTilesetAnimation(void)
{
_InitSecondaryTilesetAnimation();
}
void UpdateTilesetAnimations(void)
{
ResetTilesetAnimBuffer();
if (++sPrimaryTilesetAnimCounter >= sPrimaryTilesetAnimCounterMax)
sPrimaryTilesetAnimCounter = 0;
if (++sSecondaryTilesetAnimCounter >= sSecondaryTilesetAnimCounterMax)
sSecondaryTilesetAnimCounter = 0;
if (sPrimaryTilesetAnimCallback)
sPrimaryTilesetAnimCallback(sPrimaryTilesetAnimCounter);
if (sSecondaryTilesetAnimCallback)
sSecondaryTilesetAnimCallback(sSecondaryTilesetAnimCounter);
}
static void _InitPrimaryTilesetAnimation(void)
{
sPrimaryTilesetAnimCounter = 0;
sPrimaryTilesetAnimCounterMax = 0;
sPrimaryTilesetAnimCallback = NULL;
if (gMapHeader.mapData->primaryTileset && gMapHeader.mapData->primaryTileset->callback)
gMapHeader.mapData->primaryTileset->callback();
}
static void _InitSecondaryTilesetAnimation(void)
{
sSecondaryTilesetAnimCounter = 0;
sSecondaryTilesetAnimCounterMax = 0;
sSecondaryTilesetAnimCallback = NULL;
if (gMapHeader.mapData->secondaryTileset && gMapHeader.mapData->secondaryTileset->callback)
gMapHeader.mapData->secondaryTileset->callback();
}
static void sub_80700A4(u16 timer)
{
const u16 *const *ptr = gUnknown_83A7660;
u16 i = timer % 5;
AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(508)), 0x80);
}
static void sub_80700D0(u16 timer)
{
const u16 *const *ptr = gUnknown_83AA654;
u16 i = timer % 8;
AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(416)), 0x600);
}
static void sub_80700F8(u16 timer)
{
const u16 *const *ptr = gUnknown_83AB874;
u16 i = timer % 8;
AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(464)), 0x240);
}
static void sub_8070120(u16 timer)
{
if (timer % 8 == 0)
sub_80700F8(timer >> 3);
if (timer % 16 == 1)
sub_80700D0(timer >> 4);
if (timer % 16 == 2)
sub_80700A4(timer >> 4);
}
void sub_8070154(void)
{
sPrimaryTilesetAnimCounter = 0;
sPrimaryTilesetAnimCounterMax = 640;
sPrimaryTilesetAnimCallback = sub_8070120;
}
static void sub_807017C(u16 timer)
{
const u16 *const *ptr = gUnknown_83ABDB4;
u16 i = timer % 5;
AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(744)), 0x100);
}
static void sub_80701AC(u16 timer)
{
if (timer % 12 == 0)
sub_807017C(timer / 12);
}
void sub_80701D8(void)
{
sSecondaryTilesetAnimCounter = 0;
sSecondaryTilesetAnimCounterMax = 120;
sSecondaryTilesetAnimCallback = sub_80701AC;
}
static void sub_80701FC(u16 timer)
{
const u16 *const *ptr = gUnknown_83AC1E8;
u16 i = timer % 4;
AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(976)), 0x100);
}
static void sub_8070224(u16 timer)
{
if (timer % 10 == 0)
sub_80701FC(timer / 10);
}
void sub_8070250(void)
{
sSecondaryTilesetAnimCounter = 0;
sSecondaryTilesetAnimCounterMax = 160;
sSecondaryTilesetAnimCallback = sub_8070224;
}
static void sub_8070274(u16 timer)
{
const u16 *const *ptr = gUnknown_83AC5F8;
u16 i = timer % 4;
AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(896)), 0x100);
}
static void sub_807029C(u16 timer)
{
if (timer % 16 == 0)
sub_8070274(timer >> 4);
}
void sub_80702B4(void)
{
sSecondaryTilesetAnimCounter = 0;
sSecondaryTilesetAnimCounterMax = 256;
sSecondaryTilesetAnimCallback = sub_807029C;
}
static void sub_80702DC(u16 timer)
{
u16 i = timer % 2;
AppendTilesetAnimToBuffer(gUnknown_83AC7C8[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(880)), 0xE0);
}
static void sub_8070304(u16 timer)
{
if (timer % 2 == 0)
sub_80702DC(timer >> 1);
}
void sub_807031C(void)
{
sSecondaryTilesetAnimCounter = 0;
sSecondaryTilesetAnimCounterMax = 240;
sSecondaryTilesetAnimCallback = sub_8070304;
}
static void sub_8070340(u16 timer)
{
u16 i = timer % 4;
AppendTilesetAnimToBuffer(gUnknown_83AC950[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(739)), 0x80);
}
static void sub_8070368(u16 timer)
{
if (timer % 16 == 0)
sub_8070340(timer >> 4);
}
void sub_8070380(void)
{
sSecondaryTilesetAnimCounter = 0;
sSecondaryTilesetAnimCounterMax = 256;
sSecondaryTilesetAnimCallback = sub_8070368;
}
+10 -246
View File
@@ -151,7 +151,6 @@ void DoBgAffineSet(struct BgAffineDstData *dest, u32 texX, u32 texY, s16 scrX, s
BgAffineSet(&src, dest, 1);
}
#ifdef NONMATCHING
void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
{
u8 x, y;
@@ -166,7 +165,7 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
for (x = 0; x < w; x++)
{
int tile = (*tilemap & 0x3ff) * 32;
u16 tile = (*tilemap & 0x3ff) * 32;
int attr = *tilemap & 0xc00;
if (attr == 0)
@@ -177,7 +176,11 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
{
for (i = 0; i < 8; i++)
{
DmaCopy32Defvars(3, (7 - i) * 4 + tile + tiles, output + i * 4, 4);
u8 requiredForMatching = 0;
++requiredForMatching;
--requiredForMatching;
DmaCopy32Defvars(3, tile + (7 - i) * 4 + tiles, output + i * 4, 4);
}
}
else // xflip
@@ -187,14 +190,16 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
for (j = 0; j < 4; j++)
{
u8 i2 = i * 4;
xflip[i2 + (3-j)] = (tiles[tile + i2 + j] & 0xf) << 4;
xflip[i2 + (3-j)] |= tiles[tile + i2 + j] >> 4;
xflip[i2 + (3 - j)] = (tiles[tile + i2 + j] & 0xf) << 4;
xflip[i2 + (3 - j)] |= tiles[tile + i2 + j] >> 4;
}
}
if (*tilemap & 0x800) // yflip
{
for (i = 0; i < 8; i++)
{
++tile;
--tile;
DmaCopy32Defvars(3, (7 - i) * 4 + xflip, output + i * 4, 4);
}
}
@@ -209,247 +214,6 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
tilemap += filler;
}
}
#else
NAKED
void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
{
asm_unified("\tpush {r4-r7,lr}\n"
"\tmov r7, r10\n"
"\tmov r6, r9\n"
"\tmov r5, r8\n"
"\tpush {r5-r7}\n"
"\tsub sp, 0x3C\n"
"\tstr r2, [sp, 0x20]\n"
"\tadds r4, r3, 0\n"
"\tldr r7, [sp, 0x5C]\n"
"\tlsls r0, 24\n"
"\tlsls r1, 24\n"
"\tldr r2, _0804504C @ =sSpriteDimensions\n"
"\tlsrs r1, 23\n"
"\tlsrs r0, 21\n"
"\tadds r1, r0\n"
"\tadds r0, r2, 0x1\n"
"\tadds r0, r1, r0\n"
"\tldrb r0, [r0]\n"
"\tstr r0, [sp, 0x24]\n"
"\tadds r1, r2\n"
"\tldrb r1, [r1]\n"
"\tstr r1, [sp, 0x28]\n"
"\tmovs r1, 0\n"
"\tcmp r1, r0\n"
"\tbcc _08044FF8\n"
"\tb _0804517A\n"
"_08044FF8:\n"
"\tmovs r0, 0x20\n"
"\tldr r2, [sp, 0x28]\n"
"\tsubs r0, r2\n"
"\tlsls r0, 1\n"
"\tstr r0, [sp, 0x2C]\n"
"_08045002:\n"
"\tmovs r2, 0\n"
"\tadds r1, 0x1\n"
"\tstr r1, [sp, 0x34]\n"
"\tldr r3, [sp, 0x28]\n"
"\tcmp r2, r3\n"
"\tbcc _08045010\n"
"\tb _08045168\n"
"_08045010:\n"
"\tldr r0, _08045050 @ =0x040000d4\n"
"\tmov r8, r0\n"
"_08045014:\n"
"\tldrh r1, [r4]\n"
"\tldr r0, _08045054 @ =0x000003ff\n"
"\tands r0, r1\n"
"\tlsls r0, 5\n"
"\tmov r12, r0\n"
"\tmovs r0, 0xC0\n"
"\tlsls r0, 4\n"
"\tands r0, r1\n"
"\tmov r3, sp\n"
"\tstrh r1, [r3, 0x38]\n"
"\tcmp r0, 0\n"
"\tbne _0804505C\n"
"\tldr r0, [sp, 0x20]\n"
"\tadd r0, r12\n"
"\tmov r1, r8\n"
"\tstr r0, [r1]\n"
"\tstr r7, [r1, 0x4]\n"
"\tldr r3, _08045058 @ =0x84000008\n"
"\tstr r3, [r1, 0x8]\n"
"\tldr r0, [r1, 0x8]\n"
"\tadds r4, 0x2\n"
"\tstr r4, [sp, 0x30]\n"
"\tadds r7, 0x20\n"
"\tmov r10, r7\n"
"\tadds r2, 0x1\n"
"\tmov r9, r2\n"
"\tb _08045156\n"
"\t.align 2, 0\n"
"_0804504C: .4byte sSpriteDimensions\n"
"_08045050: .4byte 0x040000d4\n"
"_08045054: .4byte 0x000003ff\n"
"_08045058: .4byte 0x84000008\n"
"_0804505C:\n"
"\tmovs r1, 0x80\n"
"\tlsls r1, 4\n"
"\tcmp r0, r1\n"
"\tbne _080450AC\n"
"\tmovs r3, 0\n"
"\tadds r4, 0x2\n"
"\tstr r4, [sp, 0x30]\n"
"\tmovs r0, 0x20\n"
"\tadds r0, r7\n"
"\tmov r10, r0\n"
"\tadds r2, 0x1\n"
"\tmov r9, r2\n"
"\tldr r4, _080450A4 @ =0x040000d4\n"
"\tldr r6, _080450A8 @ =0x84000001\n"
"\tmovs r5, 0x7\n"
"_0804507A:\n"
"\tlsls r2, r3, 24\n"
"\tasrs r2, 24\n"
"\tsubs r0, r5, r2\n"
"\tlsls r0, 2\n"
"\tadd r0, r12\n"
"\tldr r1, [sp, 0x20]\n"
"\tadds r0, r1, r0\n"
"\tlsls r1, r2, 2\n"
"\tadds r1, r7, r1\n"
"\tstr r0, [r4]\n"
"\tstr r1, [r4, 0x4]\n"
"\tstr r6, [r4, 0x8]\n"
"\tldr r0, [r4, 0x8]\n"
"\tadds r2, 0x1\n"
"\tlsls r2, 24\n"
"\tlsrs r3, r2, 24\n"
"\tasrs r2, 24\n"
"\tcmp r2, 0x7\n"
"\tble _0804507A\n"
"\tb _08045156\n"
"\t.align 2, 0\n"
"_080450A4: .4byte 0x040000d4\n"
"_080450A8: .4byte 0x84000001\n"
"_080450AC:\n"
"\tmovs r3, 0\n"
"\tadds r4, 0x2\n"
"\tstr r4, [sp, 0x30]\n"
"\tmovs r0, 0x20\n"
"\tadds r0, r7\n"
"\tmov r10, r0\n"
"\tadds r2, 0x1\n"
"\tmov r9, r2\n"
"_080450BC:\n"
"\tmovs r2, 0\n"
"\tlsls r4, r3, 24\n"
"\tlsls r0, r4, 2\n"
"\tlsrs r0, 24\n"
"\tadds r6, r0, 0x3\n"
"\tmov r1, r12\n"
"\tadds r5, r1, r0\n"
"_080450CA:\n"
"\tlsls r1, r2, 24\n"
"\tasrs r1, 24\n"
"\tsubs r0, r6, r1\n"
"\tmov r2, sp\n"
"\tadds r3, r2, r0\n"
"\tadds r0, r5, r1\n"
"\tldr r2, [sp, 0x20]\n"
"\tadds r0, r2, r0\n"
"\tldrb r2, [r0]\n"
"\tmovs r0, 0xF\n"
"\tands r0, r2\n"
"\tlsls r0, 4\n"
"\tlsrs r2, 4\n"
"\torrs r0, r2\n"
"\tstrb r0, [r3]\n"
"\tadds r1, 0x1\n"
"\tlsls r1, 24\n"
"\tlsrs r2, r1, 24\n"
"\tasrs r1, 24\n"
"\tcmp r1, 0x3\n"
"\tble _080450CA\n"
"\tmovs r3, 0x80\n"
"\tlsls r3, 17\n"
"\tadds r0, r4, r3\n"
"\tlsrs r3, r0, 24\n"
"\tasrs r0, 24\n"
"\tcmp r0, 0x7\n"
"\tble _080450BC\n"
"\tmovs r0, 0x80\n"
"\tlsls r0, 4\n"
"\tmov r1, sp\n"
"\tldrh r1, [r1, 0x38]\n"
"\tands r0, r1\n"
"\tcmp r0, 0\n"
"\tbeq _08045148\n"
"\tmovs r3, 0\n"
"\tldr r4, _08045140 @ =0x040000d4\n"
"\tldr r6, _08045144 @ =0x84000001\n"
"\tmovs r5, 0x7\n"
"_08045118:\n"
"\tlsls r1, r3, 24\n"
"\tasrs r1, 24\n"
"\tsubs r0, r5, r1\n"
"\tlsls r0, 2\n"
"\tmov r3, sp\n"
"\tadds r2, r3, r0\n"
"\tlsls r0, r1, 2\n"
"\tadds r0, r7, r0\n"
"\tstr r2, [r4]\n"
"\tstr r0, [r4, 0x4]\n"
"\tstr r6, [r4, 0x8]\n"
"\tldr r0, [r4, 0x8]\n"
"\tadds r1, 0x1\n"
"\tlsls r1, 24\n"
"\tlsrs r3, r1, 24\n"
"\tasrs r1, 24\n"
"\tcmp r1, 0x7\n"
"\tble _08045118\n"
"\tb _08045156\n"
"\t.align 2, 0\n"
"_08045140: .4byte 0x040000d4\n"
"_08045144: .4byte 0x84000001\n"
"_08045148:\n"
"\tmov r0, sp\n"
"\tmov r1, r8\n"
"\tstr r0, [r1]\n"
"\tstr r7, [r1, 0x4]\n"
"\tldr r2, _0804518C @ =0x84000008\n"
"\tstr r2, [r1, 0x8]\n"
"\tldr r0, [r1, 0x8]\n"
"_08045156:\n"
"\tldr r4, [sp, 0x30]\n"
"\tmov r7, r10\n"
"\tmov r3, r9\n"
"\tlsls r0, r3, 24\n"
"\tlsrs r2, r0, 24\n"
"\tldr r0, [sp, 0x28]\n"
"\tcmp r2, r0\n"
"\tbcs _08045168\n"
"\tb _08045014\n"
"_08045168:\n"
"\tldr r1, [sp, 0x2C]\n"
"\tadds r4, r1\n"
"\tldr r2, [sp, 0x34]\n"
"\tlsls r0, r2, 24\n"
"\tlsrs r1, r0, 24\n"
"\tldr r3, [sp, 0x24]\n"
"\tcmp r1, r3\n"
"\tbcs _0804517A\n"
"\tb _08045002\n"
"_0804517A:\n"
"\tadd sp, 0x3C\n"
"\tpop {r3-r5}\n"
"\tmov r8, r3\n"
"\tmov r9, r4\n"
"\tmov r10, r5\n"
"\tpop {r4-r7}\n"
"\tpop {r0}\n"
"\tbx r0\n"
"\t.align 2, 0\n"
"_0804518C: .4byte 0x84000008");
}
#endif // NONMATCHING
int CountTrailingZeroBits(u32 value)
{