shadow_minimize.c: match CreateMinimizeSprite

This is the same as the pokeemerald function, except that matrixNum is signed.
Also bring name consistency in shadow_minimize.c with pokeemerald, too.
This commit is contained in:
kazblox
2020-05-23 00:09:45 -04:00
committed by GitHub
parent 96737d150f
commit c36c19ddfc
+29 -153
View File
@@ -8,14 +8,14 @@ extern s16 gBattleAnimArgs[];
extern u8 gBattleAnimAttacker;
extern u8 gBattleAnimTarget;
static void sub_80D04E0(u8 taskId);
void sub_80D0614(struct Task* task, u8 taskId);
void sub_80D0704(struct Sprite* sprite);
static void AnimTask_Minimize_Step(u8 taskId);
void CreateMinimizeSprite(struct Task* task, u8 taskId);
void ClonedMinimizeSprite_Step(struct Sprite* sprite);
// shadow_minimize (the minimizing-like shadow over the Pokemon effect.)
// Used in Minimize.
void sub_80D0488(u8 taskId)
void AnimTask_Minimize(u8 taskId)
{
struct Task* task = &gTasks[taskId];
u8 spriteId = GetAnimBattlerSpriteId(0);
@@ -28,17 +28,17 @@ void sub_80D0488(u8 taskId)
task->data[5] = 0;
task->data[6] = 0;
task->data[7] = GetBattlerSubpriority(gBattleAnimAttacker);
task->func = sub_80D04E0;
task->func = AnimTask_Minimize_Step;
}
void sub_80D04E0(u8 taskId)
void AnimTask_Minimize_Step(u8 taskId)
{
struct Task* task = &gTasks[taskId];
switch (task->data[1])
{
case 0:
if (task->data[2] == 0 || task->data[2] == 3 || task->data[2] == 6)
sub_80D0614(task, taskId);
CreateMinimizeSprite(task, taskId);
task->data[2]++;
task->data[4] += 0x28;
obj_id_set_rotscale(task->data[0], task->data[4], task->data[4], 0);
@@ -97,164 +97,40 @@ void sub_80D04E0(u8 taskId)
}
}
#ifdef NONMATCHING
void sub_80D0614(struct Task* task, u8 taskId)
void CreateMinimizeSprite(struct Task* task, u8 taskId)
{
s16 r8 = duplicate_obj_of_side_rel2move_in_transparent_mode(0);
if (r8 >= 0)
s16 matrixNum; // u16 in Emerald
s16 spriteId = duplicate_obj_of_side_rel2move_in_transparent_mode(0);
if (spriteId >= 0)
{
u8 r6 = AllocOamMatrix();
if (r6 == 0xFF)
matrixNum = AllocOamMatrix();
if (matrixNum == 0xFF)
{
obj_delete_but_dont_free_vram(&gSprites[r8]);
obj_delete_but_dont_free_vram(&gSprites[spriteId]);
return;
}
else
{
gSprites[r8].oam.objMode = ST_OAM_OBJ_BLEND;
gSprites[r8].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
gSprites[r8].affineAnimPaused = TRUE;
r6 &= 0x1f;
gSprites[r8].oam.matrixNum = r6; // need to inhibit optimizing out the mov r0, 0x3f / neg r0, r0
// current code does subs r0, #94 (0x1f - 94 = 0xc1, !0x3f = 0xc1)
gSprites[r8].subpriority = task->data[7] - task->data[3];
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND;
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
gSprites[spriteId].affineAnimPaused = TRUE;
gSprites[spriteId].oam.matrixNum = matrixNum;
gSprites[spriteId].subpriority = task->data[7] - task->data[3];
task->data[3]++;
task->data[6]++;
gSprites[r8].data[0] = 16;
gSprites[r8].data[1] = taskId;
gSprites[r8].data[2] = 6;
gSprites[r8].callback = sub_80D0704;
obj_id_set_rotscale(r8, task->data[4], task->data[4], 0);
gSprites[r8].oam.affineMode = 1;
CalcCenterToCornerVec(&gSprites[r8], gSprites[r8].oam.shape, gSprites[r8].oam.size, gSprites[r8].oam.affineMode);
gSprites[spriteId].data[0] = 16;
gSprites[spriteId].data[1] = taskId;
gSprites[spriteId].data[2] = 6;
gSprites[spriteId].callback = ClonedMinimizeSprite_Step;
obj_id_set_rotscale(spriteId, task->data[4], task->data[4], 0);
gSprites[spriteId].oam.affineMode = 1;
CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode);
}
}
}
#else
NAKED
void sub_80D0614(struct Task* task, u8 taskId)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r9\n\
mov r6, r8\n\
push {r6,r7}\n\
adds r7, r0, 0 @r7 is task\n\
lsls r1, 24\n\
lsrs r1, 24\n\
mov r9, r1 @r9 is taskId\n\
movs r0, 0\n\
bl duplicate_obj_of_side_rel2move_in_transparent_mode\n\
lsls r0, 16\n\
lsrs r0, 16\n\
mov r8, r0\n\
lsls r0, 16\n\
asrs r4, r0, 16\n\
cmp r4, 0\n\
blt _080D06EE @jump to bottom\n\
bl AllocOamMatrix\n\
lsls r0, 24\n\
lsrs r6, r0, 24\n\
cmp r6, 0xFF\n\
bne _080D0658\n\
lsls r0, r4, 4\n\
adds r0, r4\n\
lsls r0, 2\n\
ldr r1, _080D0654 @ =gSprites\n\
adds r0, r1\n\
bl obj_delete_but_dont_free_vram\n\
b _080D06EE @ jump to bottom\n\
.align 2, 0\n\
_080D0654: .4byte gSprites\n\
_080D0658:\n\
ldr r5, _080D06FC @ =gSprites\n\
lsls r3, r4, 4\n\
adds r3, r4\n\
lsls r3, 2\n\
adds r4, r3, r5\n\
ldrb r1, [r4, 0x1]\n\
movs r0, 0xD\n\
negs r0, r0\n\
ands r0, r1\n\
movs r1, 0x4\n\
orrs r0, r1\n\
movs r1, 0x3\n\
orrs r0, r1\n\
strb r0, [r4, 0x1]\n\
adds r2, r4, 0\n\
adds r2, 0x2C\n\
ldrb r0, [r2]\n\
movs r1, 0x80\n\
orrs r0, r1\n\
strb r0, [r2]\n\
movs r0, 0x1F\n\
ands r6, r0\n\
lsls r2, r6, 1\n\
ldrb r1, [r4, 0x3]\n\
movs r0, 0x3F\n\
negs r0, r0\n\
ands r0, r1\n\
orrs r0, r2\n\
strb r0, [r4, 0x3]\n\
ldrb r0, [r7, 0x16]\n\
ldrb r1, [r7, 0xE]\n\
subs r0, r1\n\
adds r1, r4, 0\n\
adds r1, 0x43\n\
strb r0, [r1]\n\
ldrh r0, [r7, 0xE]\n\
adds r0, 0x1\n\
strh r0, [r7, 0xE]\n\
ldrh r0, [r7, 0x14]\n\
adds r0, 0x1\n\
strh r0, [r7, 0x14]\n\
movs r0, 0x10\n\
strh r0, [r4, 0x2E]\n\
mov r0, r9\n\
strh r0, [r4, 0x30]\n\
movs r0, 0x6\n\
strh r0, [r4, 0x32]\n\
adds r5, 0x1C\n\
adds r3, r5\n\
ldr r0, _080D0700 @ =sub_80D0704\n\
str r0, [r3]\n\
mov r1, r8 @duplicate_obj_of_side_rel2move_in_transparent_mode(0)\n\
lsls r0, r1, 24\n\
lsrs r0, 24\n\
movs r1, 0x10\n\
ldrsh r2, [r7, r1]\n\
adds r1, r2, 0\n\
movs r3, 0\n\
bl obj_id_set_rotscale\n\
ldrb r0, [r4, 0x1]\n\
movs r3, 0x4\n\
negs r3, r3\n\
ands r3, r0\n\
movs r0, 0x1\n\
orrs r3, r0\n\
strb r3, [r4, 0x1]\n\
lsrs r1, r3, 6\n\
ldrb r2, [r4, 0x3]\n\
lsrs r2, 6\n\
lsls r3, 30\n\
lsrs r3, 30\n\
adds r0, r4, 0\n\
bl CalcCenterToCornerVec\n\
_080D06EE:\n\
pop {r3,r4}\n\
mov r8, r3\n\
mov r9, r4\n\
pop {r4-r7}\n\
pop {r0}\n\
bx r0\n\
.align 2, 0\n\
_080D06FC: .4byte gSprites\n\
_080D0700: .4byte sub_80D0704\n\
.syntax divided\n");
}
#endif
void sub_80D0704(struct Sprite* sprite)
void ClonedMinimizeSprite_Step(struct Sprite* sprite)
{
if (--sprite->data[0] == 0)
{