document minigame_countdown.c

This commit is contained in:
PikalaxALT
2020-02-11 13:43:14 -05:00
parent 354d837d6f
commit 9ff146b0bc
8 changed files with 152 additions and 141 deletions
+2 -2
View File
@@ -962,10 +962,10 @@ _0814C26C:
adds r0, r1, 0 adds r0, r1, 0
movs r2, 0x78 movs r2, 0x78
movs r3, 0x50 movs r3, 0x50
bl sub_815F138 bl StartMinigameCountdown
b _0814C2EC b _0814C2EC
_0814C28A: _0814C28A:
bl sub_815F198 bl IsMinigameCountdownRunning
cmp r0, 0 cmp r0, 0
bne _0814C2F2 bne _0814C2F2
_0814C292: _0814C292:
+2 -2
View File
@@ -649,7 +649,7 @@ _08150D28:
movs r1, 0x8 movs r1, 0x8
movs r2, 0x78 movs r2, 0x78
movs r3, 0x50 movs r3, 0x50
bl sub_815F138 bl StartMinigameCountdown
b _08150D52 b _08150D52
_08150D3A: _08150D3A:
bl IsLinkTaskFinished bl IsLinkTaskFinished
@@ -658,7 +658,7 @@ _08150D3A:
beq _08150D74 beq _08150D74
b _08150D52 b _08150D52
_08150D46: _08150D46:
bl sub_815F198 bl IsMinigameCountdownRunning
cmp r0, 0 cmp r0, 0
bne _08150D74 bne _08150D74
_08150D4E: _08150D4E:
+2 -2
View File
@@ -7702,7 +7702,7 @@ sub_814B43C: @ 814B43C
movs r1, 0x7 movs r1, 0x7
movs r2, 0x78 movs r2, 0x78
movs r3, 0x50 movs r3, 0x50
bl sub_815F138 bl StartMinigameCountdown
adds r0, r4, 0 adds r0, r4, 0
bl sub_814B134 bl sub_814B134
add sp, 0x4 add sp, 0x4
@@ -7714,7 +7714,7 @@ sub_814B43C: @ 814B43C
thumb_func_start sub_814B460 thumb_func_start sub_814B460
sub_814B460: @ 814B460 sub_814B460: @ 814B460
push {lr} push {lr}
bl sub_815F198 bl IsMinigameCountdownRunning
pop {r1} pop {r1}
bx r1 bx r1
thumb_func_end sub_814B460 thumb_func_end sub_814B460
+1 -1
View File
@@ -315,6 +315,6 @@ void CopyFromSprites(u8 *dest);
u8 SpriteTileAllocBitmapOp(u16 bit, u8 op); u8 SpriteTileAllocBitmapOp(u16 bit, u8 op);
void ClearSpriteCopyRequests(void); void ClearSpriteCopyRequests(void);
void ResetAffineAnimData(void); void ResetAffineAnimData(void);
void sub_8007FFC(struct Sprite* sprite, s16 a2, s16 a3); void obj_pos2_update_enable(struct Sprite* sprite, s16 xmod, s16 ymod);
#endif //GUARD_SPRITE_H #endif //GUARD_SPRITE_H
+2 -2
View File
@@ -296,7 +296,7 @@ SECTIONS {
src/renewable_hidden_items.o(.text); src/renewable_hidden_items.o(.text);
src/trainer_tower.o(.text); src/trainer_tower.o(.text);
src/berry_powder.o(.text); src/berry_powder.o(.text);
src/unk_815F138.o(.text); src/minigame_countdown.o(.text);
src/berry_fix_program.o(.text); src/berry_fix_program.o(.text);
} =0 } =0
@@ -581,7 +581,7 @@ SECTIONS {
src/cereader_tool.o(.rodata); src/cereader_tool.o(.rodata);
src/renewable_hidden_items.o(.rodata); src/renewable_hidden_items.o(.rodata);
src/trainer_tower.o(.rodata); src/trainer_tower.o(.rodata);
src/unk_815F138.o(.rodata); src/minigame_countdown.o(.rodata);
src/berry_fix_program.o(.rodata); src/berry_fix_program.o(.rodata);
data/data_8479668.o(.rodata.after_trainer_tower); data/data_8479668.o(.rodata.after_trainer_tower);
+2 -2
View File
@@ -1431,7 +1431,7 @@ static void sub_80EDB70(struct IntroSequenceData * this)
{ {
this->field_0018->pos1.x += this->field_0018->pos2.x; this->field_0018->pos1.x += this->field_0018->pos2.x;
this->field_0018->pos1.y += this->field_0018->pos2.y; this->field_0018->pos1.y += this->field_0018->pos2.y;
sub_8007FFC(this->field_0018, 0, 0x2A); obj_pos2_update_enable(this->field_0018, 0, 0x2A);
this->field_0018->callback = SpriteCallbackDummy; this->field_0018->callback = SpriteCallbackDummy;
StartSpriteAffineAnim(this->field_0018, 1); StartSpriteAffineAnim(this->field_0018, 1);
} }
@@ -1448,7 +1448,7 @@ static void sub_80EDBAC(struct IntroSequenceData * this)
{ {
StartSpriteAffineAnim(this->field_0028[i], 1); StartSpriteAffineAnim(this->field_0028[i], 1);
this->field_0028[i]->callback = nullsub_83; this->field_0028[i]->callback = nullsub_83;
sub_8007FFC(this->field_0028[i], gUnknown_840BBB8[i][0], gUnknown_840BBB8[i][1]); obj_pos2_update_enable(this->field_0028[i], gUnknown_840BBB8[i][0], gUnknown_840BBB8[i][1]);
} }
} }
+91 -80
View File
@@ -5,72 +5,83 @@
#include "trig.h" #include "trig.h"
#include "constants/songs.h" #include "constants/songs.h"
void sub_815F1AC(u8 taskId); static void Task_MinigameCountdown(u8 taskId);
bool32 sub_815F2AC(u8 spriteId); static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId);
void sub_815F3E0(u8 spriteId1, u8 spriteId2, u8 spriteId3); static void StartStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3);
bool32 sub_815F444(u8 spriteId); static bool32 IsStartGraphicAnimRunning(u8 spriteId);
void sub_815F470(struct Sprite * sprite); static void SpriteCB_Start(struct Sprite * sprite);
void sub_815F564(u16 tilesTag, u16 palTag); static void Load321StartGfx(u16 tilesTag, u16 palTag);
u8 sub_815F5BC(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority); static u8 CreateNumberSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority);
void sub_815F610(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p); static void CreateStartSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p);
void sub_815F138(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority) #define tState data[0]
#define tTilesTag data[2]
#define tPalTag data[3]
#define tX data[4]
#define tY data[5]
#define tSubpriority data[6]
#define tSpriteId1 data[7]
#define tSpriteId2 data[8]
#define tSpriteId3 data[9]
void StartMinigameCountdown(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
{ {
u8 taskId = CreateTask(sub_815F1AC, 80); u8 taskId = CreateTask(Task_MinigameCountdown, 80);
gTasks[taskId].data[2] = tilesTag; gTasks[taskId].tTilesTag = tilesTag;
gTasks[taskId].data[3] = palTag; gTasks[taskId].tPalTag = palTag;
gTasks[taskId].data[4] = x; gTasks[taskId].tX = x;
gTasks[taskId].data[5] = y; gTasks[taskId].tY = y;
gTasks[taskId].data[6] = subpriority; gTasks[taskId].tSubpriority = subpriority;
} }
bool8 sub_815F198(void) bool8 IsMinigameCountdownRunning(void)
{ {
return FuncIsActiveTask(sub_815F1AC); return FuncIsActiveTask(Task_MinigameCountdown);
} }
void sub_815F1AC(u8 taskId) static void Task_MinigameCountdown(u8 taskId)
{ {
s16 * data = gTasks[taskId].data; s16 * data = gTasks[taskId].data;
switch (data[0]) switch (tState)
{ {
case 0: case 0:
sub_815F564(data[2], data[3]); Load321StartGfx(tTilesTag, tPalTag);
data[7] = sub_815F5BC(data[2], data[3], data[4], data[5], data[6]); tSpriteId1 = CreateNumberSprite(tTilesTag, tPalTag, tX, tY, tSubpriority);
sub_815F610(data[2], data[3], data[4], data[5], data[6], &data[8], &data[9]); CreateStartSprite(tTilesTag, tPalTag, tX, tY, tSubpriority, &tSpriteId2, &tSpriteId3);
data[0]++; tState++;
break; break;
case 1: case 1:
if (!sub_815F2AC(data[7])) if (!RunMinigameCountdownDigitsAnim(tSpriteId1))
{ {
sub_815F3E0(data[7], data[8], data[9]); StartStartGraphic(tSpriteId1, tSpriteId2, tSpriteId3);
FreeSpriteOamMatrix(&gSprites[data[7]]); FreeSpriteOamMatrix(&gSprites[tSpriteId1]);
DestroySprite(&gSprites[data[7]]); DestroySprite(&gSprites[tSpriteId1]);
data[0]++; tState++;
} }
break; break;
case 2: case 2:
if (!sub_815F444(data[8])) if (!IsStartGraphicAnimRunning(tSpriteId2))
{ {
DestroySprite(&gSprites[data[8]]); DestroySprite(&gSprites[tSpriteId2]);
DestroySprite(&gSprites[data[9]]); DestroySprite(&gSprites[tSpriteId3]);
FreeSpriteTilesByTag(data[2]); FreeSpriteTilesByTag(tTilesTag);
FreeSpritePaletteByTag(data[3]); FreeSpritePaletteByTag(tPalTag);
DestroyTask(taskId); DestroyTask(taskId);
} }
break; break;
} }
} }
bool32 sub_815F2AC(u8 spriteId) static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId)
{ {
struct Sprite * sprite = &gSprites[spriteId]; struct Sprite * sprite = &gSprites[spriteId];
switch (sprite->data[0]) switch (sprite->data[0])
{ {
case 0: case 0:
sub_8007FFC(sprite, 0x800, 0x1A); // some sort of affine transform; x transform disabled
obj_pos2_update_enable(sprite, 0x800, 0x1A);
sprite->data[0]++; sprite->data[0]++;
// fallthrough // fallthrough
case 1: case 1:
@@ -134,22 +145,22 @@ bool32 sub_815F2AC(u8 spriteId)
return TRUE; return TRUE;
} }
void sub_815F3E0(u8 spriteId1, u8 spriteId2, u8 spriteId3) static void StartStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3)
{ {
gSprites[spriteId2].pos2.y = -40; gSprites[spriteId2].pos2.y = -40;
gSprites[spriteId3].pos2.y = -40; gSprites[spriteId3].pos2.y = -40;
gSprites[spriteId2].invisible = FALSE; gSprites[spriteId2].invisible = FALSE;
gSprites[spriteId3].invisible = FALSE; gSprites[spriteId3].invisible = FALSE;
gSprites[spriteId2].callback = sub_815F470; gSprites[spriteId2].callback = SpriteCB_Start;
gSprites[spriteId3].callback = sub_815F470; gSprites[spriteId3].callback = SpriteCB_Start;
} }
bool32 sub_815F444(u8 spriteId) static bool32 IsStartGraphicAnimRunning(u8 spriteId)
{ {
return gSprites[spriteId].callback == sub_815F470; return gSprites[spriteId].callback == SpriteCB_Start;
} }
void sub_815F470(struct Sprite * sprite) static void SpriteCB_Start(struct Sprite * sprite)
{ {
s16 * data = sprite->data; s16 * data = sprite->data;
s32 y; s32 y;
@@ -200,103 +211,103 @@ void sub_815F470(struct Sprite * sprite)
} }
} }
const u16 gUnknown_847A328[] = INCBIN_U16("data/graphics/unk_847a348.gbapal"); static const u16 sSpritePal_321Start[] = INCBIN_U16("data/graphics/unk_847a348.gbapal");
const u16 gUnknown_847A348[] = INCBIN_U16("data/graphics/unk_847a348.4bpp.lz"); static const u16 sSpriteSheet_321Start[] = INCBIN_U16("data/graphics/unk_847a348.4bpp.lz");
void sub_815F564(u16 tilesTag, u16 palTag) static void Load321StartGfx(u16 tilesTag, u16 palTag)
{ {
struct CompressedSpriteSheet spriteSheet = {(const void *)gUnknown_847A348, 0xE00}; struct CompressedSpriteSheet spriteSheet = {(const void *)sSpriteSheet_321Start, 0xE00};
struct SpritePalette spritePalette = {gUnknown_847A328}; struct SpritePalette spritePalette = {sSpritePal_321Start};
spriteSheet.tag = tilesTag; spriteSheet.tag = tilesTag;
spritePalette.tag = palTag; spritePalette.tag = palTag;
LoadCompressedSpriteSheet(&spriteSheet); LoadCompressedSpriteSheet(&spriteSheet);
LoadSpritePalette(&spritePalette); LoadSpritePalette(&spritePalette);
} }
const struct OamData gOamData_847A7AC = { static const struct OamData sOamData_Numbers = {
.affineMode = ST_OAM_AFFINE_DOUBLE, .affineMode = ST_OAM_AFFINE_DOUBLE,
.shape = ST_OAM_SQUARE, .shape = SPRITE_SHAPE(32x32),
.size = 2 .size = SPRITE_SIZE(32x32)
}; };
const struct OamData gOamData_847A7B4 = { static const struct OamData sOamData_Start = {
.affineMode = ST_OAM_AFFINE_OFF, .affineMode = ST_OAM_AFFINE_OFF,
.shape = ST_OAM_H_RECTANGLE, .shape = SPRITE_SHAPE(64x32),
.size = 3 .size = SPRITE_SIZE(64x32)
}; };
const union AnimCmd gUnknown_847A7BC[] = { static const union AnimCmd sAnim_Numbers_Three[] = {
ANIMCMD_FRAME( 0, 1), ANIMCMD_FRAME( 0, 1),
ANIMCMD_END ANIMCMD_END
}; };
const union AnimCmd gUnknown_847A7C4[] = { static const union AnimCmd sAnim_Numbers_Two[] = {
ANIMCMD_FRAME(16, 1), ANIMCMD_FRAME(16, 1),
ANIMCMD_END ANIMCMD_END
}; };
const union AnimCmd gUnknown_847A7CC[] = { static const union AnimCmd sAnim_Numbers_One[] = {
ANIMCMD_FRAME(32, 1), ANIMCMD_FRAME(32, 1),
ANIMCMD_END ANIMCMD_END
}; };
const union AnimCmd *const gUnknown_847A7D4[] = { static const union AnimCmd *const sAnimTable_Numbers[] = {
gUnknown_847A7BC, sAnim_Numbers_Three,
gUnknown_847A7C4, sAnim_Numbers_Two,
gUnknown_847A7CC sAnim_Numbers_One
}; };
const union AnimCmd gUnknown_847A7E0[] = { static const union AnimCmd sAnim_StartLeft[] = {
ANIMCMD_FRAME(48, 1), ANIMCMD_FRAME(48, 1),
ANIMCMD_END ANIMCMD_END
}; };
const union AnimCmd gUnknown_847A7E8[] = { static const union AnimCmd sAnim_StartRight[] = {
ANIMCMD_FRAME(80, 1), ANIMCMD_FRAME(80, 1),
ANIMCMD_END ANIMCMD_END
}; };
const union AnimCmd *const gUnknown_847A7F0[] = { static const union AnimCmd *const sAnimTable_Start[] = {
gUnknown_847A7E0, sAnim_StartLeft,
gUnknown_847A7E8 sAnim_StartRight
}; };
const union AffineAnimCmd gUnknown_847A7F8[] = { static const union AffineAnimCmd sAffineAnim_Numbers_0[] = {
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
AFFINEANIMCMD_END AFFINEANIMCMD_END
}; };
const union AffineAnimCmd gUnknown_847A808[] = { static const union AffineAnimCmd sAffineAnim_Numbers_1[] = {
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
AFFINEANIMCMD_FRAME( 0x10, -0x10, 0, 8), AFFINEANIMCMD_FRAME( 0x10, -0x10, 0, 8),
AFFINEANIMCMD_END AFFINEANIMCMD_END
}; };
const union AffineAnimCmd gUnknown_847A820[] = { static const union AffineAnimCmd sAffineAnim_Numbers_2[] = {
AFFINEANIMCMD_FRAME(-0x12, 0x12, 0, 8), AFFINEANIMCMD_FRAME(-0x12, 0x12, 0, 8),
AFFINEANIMCMD_END AFFINEANIMCMD_END
}; };
const union AffineAnimCmd gUnknown_847A830[] = { static const union AffineAnimCmd sAffineAnim_Numbers_3[] = {
AFFINEANIMCMD_FRAME( 0x6, -0x6, 0, 8), AFFINEANIMCMD_FRAME( 0x6, -0x6, 0, 8),
AFFINEANIMCMD_FRAME( -0x4, 0x4, 0, 8), AFFINEANIMCMD_FRAME( -0x4, 0x4, 0, 8),
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
AFFINEANIMCMD_END AFFINEANIMCMD_END
}; };
const union AffineAnimCmd *const gUnknown_847A850[] = { static const union AffineAnimCmd *const sAffineAnimTable_Numbers[] = {
gUnknown_847A7F8, sAffineAnim_Numbers_0,
gUnknown_847A808, sAffineAnim_Numbers_1,
gUnknown_847A820, sAffineAnim_Numbers_2,
gUnknown_847A830 sAffineAnim_Numbers_3
}; };
u8 sub_815F5BC(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority) static u8 CreateNumberSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
{ {
struct SpriteTemplate spriteTemplate = { struct SpriteTemplate spriteTemplate = {
.oam = &gOamData_847A7AC, .oam = &sOamData_Numbers,
.anims = gUnknown_847A7D4, .anims = sAnimTable_Numbers,
.affineAnims = gUnknown_847A850, .affineAnims = sAffineAnimTable_Numbers,
.callback = SpriteCallbackDummy .callback = SpriteCallbackDummy
}; };
spriteTemplate.tileTag = tilesTag; spriteTemplate.tileTag = tilesTag;
@@ -304,11 +315,11 @@ u8 sub_815F5BC(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
return CreateSprite(&spriteTemplate, x, y, subpriority); return CreateSprite(&spriteTemplate, x, y, subpriority);
} }
void sub_815F610(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p) static void CreateStartSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p)
{ {
struct SpriteTemplate spriteTemplate = { struct SpriteTemplate spriteTemplate = {
.oam = &gOamData_847A7B4, .oam = &sOamData_Start,
.anims = gUnknown_847A7F0, .anims = sAnimTable_Start,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy .callback = SpriteCallbackDummy
}; };
+50 -50
View File
@@ -250,47 +250,47 @@ static const AffineAnimCmdFunc sAffineAnimCmdFuncs[] =
AffineAnimCmd_frame, AffineAnimCmd_frame,
}; };
static const s32 sUnknown_082EC6F4[3][4][2] = static const s32 sOamDimensionsCopy[3][4][2] =
{ {
{ [ST_OAM_SQUARE] = {
{8, 8}, [ST_OAM_SIZE_0] = { 8, 8}, // SPRITE_SIZE_8x8
{0x10, 0x10}, [ST_OAM_SIZE_1] = {16, 16}, // SPRITE_SIZE_16x16
{0x20, 0x20}, [ST_OAM_SIZE_2] = {32, 32}, // SPRITE_SIZE_32x32
{0x40, 0x40}, [ST_OAM_SIZE_3] = {64, 64}, // SPRITE_SIZE_64x64
}, },
{ [ST_OAM_H_RECTANGLE] = {
{0x10, 8}, [ST_OAM_SIZE_0] = {16, 8}, // SPRITE_SIZE_16x8
{0x20, 8}, [ST_OAM_SIZE_1] = {32, 8}, // SPRITE_SIZE_32x8
{0x20, 0x10}, [ST_OAM_SIZE_2] = {32, 16}, // SPRITE_SIZE_32x16
{0x40, 0x20}, [ST_OAM_SIZE_3] = {64, 32}, // SPRITE_SIZE_64x32
}, },
{ [ST_OAM_V_RECTANGLE] = {
{8, 0x10}, [ST_OAM_SIZE_0] = { 8, 16}, // SPRITE_SIZE_8x16
{8, 0x20}, [ST_OAM_SIZE_1] = { 8, 32}, // SPRITE_SIZE_8x32
{0x10, 0x20}, [ST_OAM_SIZE_2] = {16, 32}, // SPRITE_SIZE_16x32
{0x20, 0x40}, [ST_OAM_SIZE_3] = {32, 64}, // SPRITE_SIZE_32x64
}, },
}; };
static const struct OamDimensions sOamDimensions[3][4] = static const struct OamDimensions sOamDimensions[3][4] =
{ {
{ // square [ST_OAM_SQUARE] = {
{ 8, 8 }, [ST_OAM_SIZE_0] = { 8, 8}, // SPRITE_SIZE_8x8
{ 16, 16 }, [ST_OAM_SIZE_1] = {16, 16}, // SPRITE_SIZE_16x16
{ 32, 32 }, [ST_OAM_SIZE_2] = {32, 32}, // SPRITE_SIZE_32x32
{ 64, 64 }, [ST_OAM_SIZE_3] = {64, 64}, // SPRITE_SIZE_64x64
}, },
{ // horizontal rectangle [ST_OAM_H_RECTANGLE] = {
{ 16, 8 }, [ST_OAM_SIZE_0] = {16, 8}, // SPRITE_SIZE_16x8
{ 32, 8 }, [ST_OAM_SIZE_1] = {32, 8}, // SPRITE_SIZE_32x8
{ 32, 16 }, [ST_OAM_SIZE_2] = {32, 16}, // SPRITE_SIZE_32x16
{ 64, 32 }, [ST_OAM_SIZE_3] = {64, 32}, // SPRITE_SIZE_64x32
}, },
{ // vertical rectangle [ST_OAM_V_RECTANGLE] = {
{ 8, 16 }, [ST_OAM_SIZE_0] = { 8, 16}, // SPRITE_SIZE_8x16
{ 8, 32 }, [ST_OAM_SIZE_1] = { 8, 32}, // SPRITE_SIZE_8x32
{ 16, 32 }, [ST_OAM_SIZE_2] = {16, 32}, // SPRITE_SIZE_16x32
{ 32, 64 }, [ST_OAM_SIZE_3] = {32, 64}, // SPRITE_SIZE_32x64
}, },
}; };
@@ -1222,43 +1222,43 @@ u8 GetSpriteMatrixNum(struct Sprite *sprite)
return matrixNum; return matrixNum;
} }
void sub_8007FFC(struct Sprite* sprite, s16 a2, s16 a3) void obj_pos2_update_enable(struct Sprite* sprite, s16 a2, s16 a3)
{ {
sprite->data[6] = a2; sprite->data[6] = a2;
sprite->data[7] = a3; sprite->data[7] = a3;
sprite->flags_f = 1; sprite->flags_f = 1;
} }
s32 sub_800800C(s32 a0, s32 a1, s32 a2) static s32 affine_get_new_pos2(s32 baseDim, s32 xformed, s32 modifier)
{ {
s32 subResult, var1; s32 subResult, shiftResult;
subResult = a1 - a0; subResult = xformed - baseDim;
if (subResult < 0) if (subResult < 0)
var1 = -(subResult) >> 9; shiftResult = -(subResult) >> 9;
else else
var1 = -(subResult >> 9); shiftResult = -(subResult >> 9);
return a2 - ((u32)(a2 * a1) / (u32)(a0) + var1); return modifier - ((u32)(modifier * xformed) / (u32)(baseDim) + shiftResult);
} }
void obj_update_pos2(struct Sprite *sprite, s32 a1, s32 a2) static void obj_update_pos2(struct Sprite *sprite, s32 xmod, s32 ymod)
{ {
s32 var0, var1, var2; s32 dim, baseDim, xFormed;
u32 matrixNum = sprite->oam.matrixNum; u32 matrixNum = sprite->oam.matrixNum;
if (a1 != 0x800) if (xmod != 0x800)
{ {
var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][0]; dim = sOamDimensionsCopy[sprite->oam.shape][sprite->oam.size][0];
var1 = var0 << 8; baseDim = dim << 8;
var2 = (var0 << 16) / gOamMatrices[matrixNum].a; xFormed = (dim << 16) / gOamMatrices[matrixNum].a;
sprite->pos2.x = sub_800800C(var1, var2, a1); sprite->pos2.x = affine_get_new_pos2(baseDim, xFormed, xmod);
} }
if (a2 != 0x800) if (ymod != 0x800)
{ {
var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][1]; dim = sOamDimensionsCopy[sprite->oam.shape][sprite->oam.size][1];
var1 = var0 << 8; baseDim = dim << 8;
var2 = (var0 << 16) / gOamMatrices[matrixNum].d; xFormed = (dim << 16) / gOamMatrices[matrixNum].d;
sprite->pos2.y = sub_800800C(var1, var2, a2); sprite->pos2.y = affine_get_new_pos2(baseDim, xFormed, ymod);
} }
} }