sub_805E2C4 in C

This commit is contained in:
DizzyEggg 2024-10-16 15:51:30 +02:00
parent f813788fe0
commit da198b95ca
5 changed files with 293 additions and 121 deletions

View File

@ -34,10 +34,7 @@ gUnknown_8106AC8: @ 8106AC8
.global gUnknown_8106AE8
gUnknown_8106AE8: @ 8106AE8
.byte 0x00, 0x00, 0x01, 0x00
.global gUnknown_8106AEC
gUnknown_8106AEC: @ 8106AEC
.byte 0x00, 0x00, 0x01, 0x00
.byte 0x12, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x13, 0x02, 0x00, 0x00
.byte 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.byte 0x01, 0x00, 0xff, 0xff, 0x13, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff

View File

@ -22,72 +22,72 @@ typedef struct SpriteOAM
#define SPRITEOAM_MAX_Y 0xFF
#define SPRITEOAM_SHIFT_Y 0
#define SPRITEOAM_MASK_Y (SPRITEOAM_MAX_Y << SPRITEOAM_SHIFT_Y)
#define SPRITEOAM_MASK_Y (SPRITEOAM_MAX_Y << SPRITEOAM_SHIFT_Y) // ~ 0xFF00
#define SPRITEOAM_MAX_AFFINEMODE1 1
#define SPRITEOAM_SHIFT_AFFINEMODE1 8
#define SPRITEOAM_MASK_AFFINEMODE1 (SPRITEOAM_MAX_AFFINEMODE1 << SPRITEOAM_SHIFT_AFFINEMODE1)
#define SPRITEOAM_MASK_AFFINEMODE1 (SPRITEOAM_MAX_AFFINEMODE1 << SPRITEOAM_SHIFT_AFFINEMODE1) // ~ 0xFEFF
#define SPRITEOAM_MAX_AFFINEMODE2 1
#define SPRITEOAM_SHIFT_AFFINEMODE2 9
#define SPRITEOAM_MASK_AFFINEMODE2 (SPRITEOAM_MAX_AFFINEMODE2 << SPRITEOAM_SHIFT_AFFINEMODE2)
#define SPRITEOAM_MASK_AFFINEMODE2 (SPRITEOAM_MAX_AFFINEMODE2 << SPRITEOAM_SHIFT_AFFINEMODE2) // ~ 0xFDFF
#define SPRITEOAM_MAX_OBJMODE 3
#define SPRITEOAM_SHIFT_OBJMODE 10
#define SPRITEOAM_MASK_OBJMODE (SPRITEOAM_MAX_OBJMODE << SPRITEOAM_SHIFT_OBJMODE)
#define SPRITEOAM_MASK_OBJMODE (SPRITEOAM_MAX_OBJMODE << SPRITEOAM_SHIFT_OBJMODE) // ~ 0xF3FF
#define SPRITEOAM_MAX_MOSAIC 1
#define SPRITEOAM_SHIFT_MOSAIC 12
#define SPRITEOAM_MASK_MOSAIC (SPRITEOAM_MAX_MOSAIC << SPRITEOAM_SHIFT_MOSAIC)
#define SPRITEOAM_MASK_MOSAIC (SPRITEOAM_MAX_MOSAIC << SPRITEOAM_SHIFT_MOSAIC) // ~ 0xEFFF
#define SPRITEOAM_MAX_BPP 1
#define SPRITEOAM_SHIFT_BPP 13
#define SPRITEOAM_MASK_BPP (SPRITEOAM_MAX_BPP << SPRITEOAM_SHIFT_BPP)
#define SPRITEOAM_MASK_BPP (SPRITEOAM_MAX_BPP << SPRITEOAM_SHIFT_BPP) // ~ 0xDFFF
#define SPRITEOAM_MAX_SHAPE 3
#define SPRITEOAM_SHIFT_SHAPE 14
#define SPRITEOAM_MASK_SHAPE (SPRITEOAM_MAX_SHAPE << SPRITEOAM_SHIFT_SHAPE)
#define SPRITEOAM_MASK_SHAPE (SPRITEOAM_MAX_SHAPE << SPRITEOAM_SHIFT_SHAPE) // ~ 0x3FFF
// attrib2
#define SPRITEOAM_MAX_X 0x1FF
#define SPRITEOAM_SHIFT_X 0
#define SPRITEOAM_MASK_X (SPRITEOAM_MAX_X << SPRITEOAM_SHIFT_X)
#define SPRITEOAM_MASK_X (SPRITEOAM_MAX_X << SPRITEOAM_SHIFT_X) // ~ 0xFE00
#define SPRITEOAM_MAX_MATRIXNUM 31
#define SPRITEOAM_SHIFT_MATRIXNUM 9
#define SPRITEOAM_MASK_MATRIXNUM (SPRITEOAM_MAX_MATRIXNUM << SPRITEOAM_SHIFT_MATRIXNUM)
#define SPRITEOAM_MASK_MATRIXNUM (SPRITEOAM_MAX_MATRIXNUM << SPRITEOAM_SHIFT_MATRIXNUM) // ~ 0xC1FF
#define SPRITEOAM_MAX_SIZE 3
#define SPRITEOAM_SHIFT_SIZE 14
#define SPRITEOAM_MASK_SIZE (SPRITEOAM_MAX_SIZE << SPRITEOAM_SHIFT_SIZE)
#define SPRITEOAM_MASK_SIZE (SPRITEOAM_MAX_SIZE << SPRITEOAM_SHIFT_SIZE) // ~ 0x3FFF
// attrib3
#define SPRITEOAM_MAX_TILENUM 0x3FF
#define SPRITEOAM_SHIFT_TILENUM 0
#define SPRITEOAM_MASK_TILENUM (SPRITEOAM_MAX_TILENUM << SPRITEOAM_SHIFT_TILENUM)
#define SPRITEOAM_MASK_TILENUM (SPRITEOAM_MAX_TILENUM << SPRITEOAM_SHIFT_TILENUM) // ~ 0xFC00
#define SPRITEOAM_MAX_PRIORITY 3
#define SPRITEOAM_SHIFT_PRIORITY 10
#define SPRITEOAM_MASK_PRIORITY (SPRITEOAM_MAX_PRIORITY << SPRITEOAM_SHIFT_PRIORITY)
#define SPRITEOAM_MASK_PRIORITY (SPRITEOAM_MAX_PRIORITY << SPRITEOAM_SHIFT_PRIORITY) // ~ 0xF3FF
#define SPRITEOAM_MAX_PALETTENUM 15
#define SPRITEOAM_SHIFT_PALETTENUM 12
#define SPRITEOAM_MASK_PALETTENUM (SPRITEOAM_MAX_PALETTENUM << SPRITEOAM_SHIFT_PALETTENUM)
#define SPRITEOAM_MASK_PALETTENUM (SPRITEOAM_MAX_PALETTENUM << SPRITEOAM_SHIFT_PALETTENUM) // ~ 0xFFF
// unk6
#define SPRITEOAM_MAX_UNK6_0 1
#define SPRITEOAM_SHIFT_UNK6_0 0
#define SPRITEOAM_MASK_UNK6_0 (SPRITEOAM_MAX_UNK6_0 << SPRITEOAM_SHIFT_UNK6_0)
#define SPRITEOAM_MASK_UNK6_0 (SPRITEOAM_MAX_UNK6_0 << SPRITEOAM_SHIFT_UNK6_0) // ~ 0xFFFE
#define SPRITEOAM_MAX_UNK6_1 1
#define SPRITEOAM_SHIFT_UNK6_1 1
#define SPRITEOAM_MASK_UNK6_1 (SPRITEOAM_MAX_UNK6_1 << SPRITEOAM_SHIFT_UNK6_1)
#define SPRITEOAM_MASK_UNK6_1 (SPRITEOAM_MAX_UNK6_1 << SPRITEOAM_SHIFT_UNK6_1) // ~ 0xFFFD
#define SPRITEOAM_MAX_UNK6_4 0xFFF
#define SPRITEOAM_SHIFT_UNK6_4 4
#define SPRITEOAM_MASK_UNK6_4 (SPRITEOAM_MAX_UNK6_4 << SPRITEOAM_SHIFT_UNK6_4)
#define SPRITEOAM_MASK_UNK6_4 (SPRITEOAM_MAX_UNK6_4 << SPRITEOAM_SHIFT_UNK6_4) // ~ 0xF
#endif // GUARD_SPRITE_OAM_H
#endif // GUARD_SPRITE_OAM_H

View File

@ -95,7 +95,7 @@ void sub_8044C10(u8 a0);
u16 GetLeaderActionId(void);
void sub_80978C8(s16 a0);
void sub_8044C50(u16 a0);
void sub_805E2C4(Entity *leader);
static void TryCreateModeArrows(Entity *leader);
bool8 sub_8094C48(void);
void sub_8052210(u8 a0);
bool8 sub_805EC4C(Entity *a0, u8 a1);
@ -129,12 +129,12 @@ extern u8 sub_8062F90(Entity *, u32, u32, u32, u32);
extern Entity *gLeaderPointer;
extern u8 gUnknown_202F22D;
extern u8 gUnknown_202F22C;
extern u8 sInRotateMode;
extern u8 sInDiagonalMode;
extern u8 gUnknown_202F230;
extern u8 gUnknown_202F231;
extern u8 gUnknown_202EE00;
extern u16 gUnknown_202F22E;
extern s16 gUnknown_202F22E;
extern const u8 *gUnknown_80F8A84;
extern const u8 *gUnknown_80F8A6C;
@ -157,7 +157,7 @@ extern const u8 *gFieldItemMenuGroundTextPtr;
extern const u8 *gUnknown_80FE940;
extern const u8 *gWhichTextPtr1;
void sub_805D8C8(void)
void DungeonHandlePlayerInput(void)
{
struct UnkMenuBitsStruct r6;
bool8 triggers[5]; // Always FALSE, if one of these is TRUE - they can open various menus or cause an item throw. Most likely used for debugging/testing.
@ -204,8 +204,8 @@ void sub_805D8C8(void)
}
sub_805E804();
}
gUnknown_202F22D = 0;
gUnknown_202F22C = 0;
sInRotateMode = FALSE;
sInDiagonalMode = FALSE;
if (gDungeon->unk5C0 >= 0) {
r6.a0_8 = 1;
r6.a0_16 = 0;
@ -223,10 +223,9 @@ void sub_805D8C8(void)
gUnknown_202F231 = 0;
while (r6.a0_8 == 0) {
u32 buttonsR1, buttonsR2;
u32 dpadDiagonal, dpadSimple;
bool32 highlightTiles, tryItemThrow;
bool32 bPress, rPress, unkBool; // Always FALSE, might've been used as debug variables.
u32 r4;
s32 directionNew;
gUnknown_202F22E++;
@ -241,7 +240,7 @@ void sub_805D8C8(void)
sub_8075680(0);
}
sub_805E2C4(leader);
TryCreateModeArrows(leader);
unkBool = FALSE;
{
s32 i;
@ -273,56 +272,55 @@ void sub_805D8C8(void)
gDungeon->unk673 = 1;
break;
}
else {
if (gRealInputs.held & L_BUTTON) {
bool8 canUseMove;
s32 i, j;
else if (gRealInputs.held & L_BUTTON) {
bool32 canUseMove;
s32 i, j;
for (i = 0; i < MAX_MON_MOVES; i++) {
if (MoveFlagExists(&leaderInfo->moves.moves[i]) && MoveFlagSet(&leaderInfo->moves.moves[i])) {
break;
}
}
if (i == MAX_MON_MOVES) {
SendMessage(leader, gUnknown_80F8A28);
for (i = 0; i < MAX_MON_MOVES; i++) {
if (MoveFlagExists(&leaderInfo->moves.moves[i]) && MoveFlagSet(&leaderInfo->moves.moves[i])) {
break;
}
for (j = 0; j < MAX_MON_MOVES; j++) {
if (MoveFlagExists(&leaderInfo->moves.moves[j])) {
if (leaderInfo->moves.moves[j].PP != 0)
break;
}
}
if (j == MAX_MON_MOVES) {
SetMonsterActionFields(&leaderInfo->action, 0x17);
break;
}
canUseMove = FALSE;
for (j = i; j < MAX_MON_MOVES; j++) {
if (j != i && !(leaderInfo->moves.moves[j].moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN)) {
break;
}
if (leaderInfo->moves.moves[j].PP != 0) {
canUseMove = TRUE;
break;
}
}
if (!canUseMove) {
SendMessage(leader, gUnknown_80F8A4C);
}
else {
SetMonsterActionFields(&leaderInfo->action, 0x14);
leaderInfo->action.unk4[0].actionUseIndex = GetTeamMemberEntityIndex(leader);
leaderInfo->action.unk4[1].actionUseIndex = i;
}
}
else {
if (!sub_805EF60(leader, leaderInfo)) {
SetMonsterActionFields(&leaderInfo->action, 0x32);
if (i == MAX_MON_MOVES) {
SendMessage(leader, gUnknown_80F8A28);
break;
}
for (j = 0; j < MAX_MON_MOVES; j++) {
if (MoveFlagExists(&leaderInfo->moves.moves[j])) {
if (leaderInfo->moves.moves[j].PP != 0)
break;
}
}
if (j == MAX_MON_MOVES) {
SetMonsterActionFields(&leaderInfo->action, 0x17);
break;
}
canUseMove = FALSE;
for (j = i; j < MAX_MON_MOVES; j++) {
if (j != i && !(leaderInfo->moves.moves[j].moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN)) {
break;
}
if (leaderInfo->moves.moves[j].PP != 0) {
canUseMove = TRUE;
break;
}
}
if (!canUseMove) {
SendMessage(leader, gUnknown_80F8A4C);
}
else {
SetMonsterActionFields(&leaderInfo->action, 0x14);
leaderInfo->action.unk4[0].actionUseIndex = GetTeamMemberEntityIndex(leader);
leaderInfo->action.unk4[1].actionUseIndex = i;
}
break;
}
else {
if (!sub_805EF60(leader, leaderInfo)) {
SetMonsterActionFields(&leaderInfo->action, 0x32);
}
break;
}
}
@ -355,28 +353,26 @@ void sub_805D8C8(void)
break;
}
else if (triggers[4]) { // Opens regular menu
r6.a0_8 = 1;
r6.a0_16 = 0;
r6.a0_24 = 1;
break;
}
else if (frames > 0x707) { // Opens simple menu when idling
r6.a0_8 = 1;
r6.a0_16 = 1;
r6.a0_24 = 0;
break;
}
r4 = gGameOptionsRef->unk9;
if (r4 == 0) {
if ((gRealInputs.pressed & B_BUTTON || (!unkBool && bPress)) && unkPtr->unk1821A != 0) {
sub_804AA60();
gUnknown_202F22D = r4;
ResetRepeatTimers();
ResetUnusedInputStruct();
}
if (gGameOptionsRef->unk9 == 0
&& (gRealInputs.pressed & B_BUTTON || (!unkBool && bPress))
&& unkPtr->unk1821A != 0)
{
sub_804AA60();
sInRotateMode = FALSE;
ResetRepeatTimers();
ResetUnusedInputStruct();
}
if (gRealInputs.held & L_BUTTON) {
@ -386,15 +382,16 @@ void sub_805D8C8(void)
ResetUnusedInputStruct();
}
}
tryItemThrow = FALSE;
if (gRealInputs.held & R_BUTTON) {
if (gUnknown_202F22C == 0) {
if (!sInDiagonalMode) {
gUnknown_202F22E = 0;
}
gUnknown_202F22C = 1;
sInDiagonalMode = TRUE;
}
else {
gUnknown_202F22C = 0;
sInDiagonalMode = FALSE;
}
highlightTiles = FALSE;
@ -405,7 +402,7 @@ void sub_805D8C8(void)
}
if (highlightTiles) {
sub_805E738(leader);
gUnknown_202F22D = 1;
sInRotateMode = TRUE;
unkPtr->unk1821B = leaderInfo->action.direction;
unkPtr->unk1821C = 0xFF;
ResetRepeatTimers();
@ -453,7 +450,7 @@ void sub_805D8C8(void)
break;
if (gRealInputs.pressed & A_BUTTON) {
gUnknown_202EE00 = (gUnknown_202EE00 == 0) ? 1 : 0;
gUnknown_202EE00 = (gUnknown_202EE00 == 0) ? 1 : 0; // Flip
sub_8040A84();
}
}
@ -466,39 +463,39 @@ void sub_805D8C8(void)
sub_803E46C(0x2F);
}
if (gDungeon->unk66D != 0 && gUnknown_202F22C == 0) {
buttonsR1 = buttonsR2 = gRealInputs.pressed;
if (gDungeon->unk66D != 0 && !sInDiagonalMode) {
dpadDiagonal = dpadSimple = gRealInputs.pressed;
}
else {
buttonsR1 = gRealInputs.held;
buttonsR2 = (unkPtr->unk1821A == 0) ? gRealInputs.held : gRealInputs.pressed;
dpadDiagonal = gRealInputs.held;
dpadSimple = (unkPtr->unk1821A == 0) ? gRealInputs.held : gRealInputs.pressed;
}
buttonsR1 &= DPAD_ANY;
buttonsR2 &= DPAD_ANY;
dpadDiagonal &= DPAD_ANY;
dpadSimple &= DPAD_ANY;
directionNew = -1;
if (buttonsR1 == (DPAD_UP | DPAD_RIGHT))
if (dpadDiagonal == (DPAD_UP | DPAD_RIGHT))
directionNew = DIRECTION_NORTHEAST;
if (buttonsR1 == (DPAD_UP | DPAD_LEFT))
if (dpadDiagonal == (DPAD_UP | DPAD_LEFT))
directionNew = DIRECTION_NORTHWEST;
if (buttonsR1 == (DPAD_DOWN | DPAD_RIGHT))
if (dpadDiagonal == (DPAD_DOWN | DPAD_RIGHT))
directionNew = DIRECTION_SOUTHEAST;
if (buttonsR1 == (DPAD_DOWN | DPAD_LEFT))
if (dpadDiagonal == (DPAD_DOWN | DPAD_LEFT))
directionNew = DIRECTION_SOUTHWEST;
if (buttonsR2 == DPAD_UP)
if (dpadSimple == DPAD_UP)
directionNew = DIRECTION_NORTH;
if (buttonsR2 == DPAD_DOWN)
if (dpadSimple == DPAD_DOWN)
directionNew = DIRECTION_SOUTH;
if (buttonsR2 == DPAD_RIGHT)
if (dpadSimple == DPAD_RIGHT)
directionNew = DIRECTION_EAST;
if (buttonsR2 == DPAD_LEFT)
if (dpadSimple == DPAD_LEFT)
directionNew = DIRECTION_WEST;
if (directionNew >= 0 && (gUnknown_202F22C == 0 || (directionNew & 1))) {
if (directionNew >= 0 && (!sInDiagonalMode || (directionNew & 1))) {
bool32 directionChanged = (leaderInfo->action.direction != directionNew);
leaderInfo->action.direction = directionNew & DIRECTION_MASK;
if (gUnknown_202F22D != 0) {
if (sInRotateMode) {
unkPtr->unk1821B = directionNew;
sub_806CDD4(leader, sub_806CEBC(leader), directionNew);
}
@ -589,7 +586,7 @@ void sub_805D8C8(void)
ShowFieldMenu((r6.a0_16 == 0) ? 1 : 0, r6.a0_24);
ResetRepeatTimers();
ResetUnusedInputStruct();
gUnknown_202F22D = 0;
sInRotateMode = FALSE;
unkPtr->unk1821A = 0;
sub_804AA60();
if (sub_8044B28())
@ -612,19 +609,195 @@ void sub_805D8C8(void)
}
}
/* TODO: leaving this for now as it uses weird sprite OAM logic
void sub_805E2C4(Entity *leader)
struct UnkStruct_8106AC8
{
unkDungeonGlobal_unk181E8_sub *unkPtr;
s16 unk0;
s16 unk2;
u8 unk4;
u8 unk5;
};
unkPtr = &gDungeon->unk181e8;
if (gUnknown_202F22C == 0) {
extern const struct UnkStruct_8106AC8 gUnknown_8106AC8[];
struct UnkStruct_8106AE8
{
s16 unk0;
s16 unk2;
u32 unk4;
u8 unk8;
u8 unk9;
u8 unkA;
};
extern const struct UnkStruct_8106AE8 gUnknown_8106AE8[];
#ifdef NONMATCHING
// Not even close in terms of matching, but functionally equivalent. Sprite OAM memes break the stack here.
// Creates arrow sprites which are used when in rotate or diagonal modes.
static void TryCreateModeArrows(Entity *leader)
{
UnkDungeonGlobal_unk181E8_sub *unkPtr = &gDungeon->unk181e8;
if (sInDiagonalMode) {
s32 i;
SpriteOAM sprite;
for (i = 0; i < 4; i++) {
u32 objMode, matrixNum, tileNum, prio, xSprite, unk6;
s32 x, xMul, x2;
s32 unk1, unk1Mul, unk2;
sprite.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE1;
sprite.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE2;
objMode = 1 << SPRITEOAM_SHIFT_OBJMODE;
sprite.attrib1 &= ~SPRITEOAM_MASK_OBJMODE;
sprite.attrib1 |= objMode;
sprite.attrib1 &= ~SPRITEOAM_MASK_MOSAIC;
sprite.attrib1 &= ~SPRITEOAM_MASK_BPP;
sprite.attrib1 &= ~SPRITEOAM_MASK_SHAPE;
if (gUnknown_8106AC8[i].unk4 != 0)
matrixNum = 8;
else
matrixNum = 0;
if (gUnknown_8106AC8[i].unk5)
matrixNum += 16;
matrixNum &= SPRITEOAM_MAX_MATRIXNUM;
matrixNum <<= SPRITEOAM_SHIFT_MATRIXNUM;
sprite.attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM;
sprite.attrib2 |= matrixNum;
sprite.attrib2 &= ~SPRITEOAM_MASK_SHAPE;
tileNum = 0x213 << SPRITEOAM_SHIFT_TILENUM;
sprite.attrib3 &= ~SPRITEOAM_MASK_TILENUM;
sprite.attrib3 |= tileNum;
prio = 2 << SPRITEOAM_SHIFT_PRIORITY;
sprite.attrib3 &= ~SPRITEOAM_MASK_PRIORITY;
sprite.attrib3 |= prio;
sprite.attrib3 &= ~SPRITEOAM_MASK_PALETTENUM;
sprite.unk6 &= ~SPRITEOAM_MASK_UNK6_0;
sprite.unk6 &= ~SPRITEOAM_MASK_UNK6_1;
x = gUnknown_8106AC8[i].unk0;
xMul = x * 10;
x2 = (gUnknown_202F22E / 2) & 7;
xSprite = xMul + 116 + (x2 * x);
xSprite &= SPRITEOAM_MAX_X;
xSprite <<= SPRITEOAM_SHIFT_X;
sprite.attrib2 &= ~SPRITEOAM_MASK_X;
sprite.attrib2 |= xSprite;
unk1 = gUnknown_8106AC8[i].unk2;
unk1Mul = unk1 * 10;
unk2 = (gUnknown_202F22E / 2) & 7;
unk6 = 82 + unk1Mul + (unk2 * unk1);
unk6 &= SPRITEOAM_MAX_UNK6_4;
unk6 <<= SPRITEOAM_SHIFT_UNK6_4;
sprite.unk6 &= ~SPRITEOAM_MASK_UNK6_4;
sprite.unk6 |= unk6;
AddSprite(&sprite, 0x100, NULL, NULL);
}
}
else if (unkPtr->unk1821A) {
s32 i, to;
SpriteOAM sprite;
s32 var_2C = unkPtr->unk1821B;
s32 x, y;
s32 x1, x2, xMul;
s32 y1, y2, yMul;
if (var_2C < 8u) {
to = (gUnknown_202F231 != 0 && gUnknown_202F230 != 0) ? 3 : 1;
x1 = gUnknown_8106AE8[var_2C].unk0;
xMul = x1 * 10;
x2 = (gUnknown_202F22E / 2) & 7;
x = xMul + 116 + (x1 * x2);
y1 = gUnknown_8106AE8[var_2C].unk2;
yMul = y1 * 10;
y2 = (gUnknown_202F22E / 2) & 7;
y = 82 + yMul + (y2 * y1);
for (i = 0; i < to; i++) {
u32 objMode, tileNum, prio, matrixNum, xSprite, ySprite;
sprite.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE1;
sprite.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE2;
objMode = 1 << SPRITEOAM_SHIFT_OBJMODE;
sprite.attrib1 &= ~SPRITEOAM_MASK_OBJMODE;
sprite.attrib1 |= objMode;
sprite.attrib1 &= ~SPRITEOAM_MASK_MOSAIC;
sprite.attrib1 &= ~SPRITEOAM_MASK_BPP;
sprite.attrib1 &= ~SPRITEOAM_MASK_SHAPE;
if (gUnknown_8106AE8[var_2C].unk8 != 0)
matrixNum = 8;
else
matrixNum = 0;
if (gUnknown_8106AE8[var_2C].unk9)
matrixNum += 16;
matrixNum &= SPRITEOAM_MAX_MATRIXNUM;
matrixNum <<= SPRITEOAM_SHIFT_MATRIXNUM;
sprite.attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM;
sprite.attrib2 |= matrixNum;
sprite.attrib2 &= ~SPRITEOAM_MASK_SIZE;
tileNum = gUnknown_8106AE8[var_2C].unk4;
sprite.attrib3 &= ~SPRITEOAM_MASK_TILENUM;
sprite.attrib3 |= tileNum;
prio = 2 << SPRITEOAM_SHIFT_PRIORITY;
sprite.attrib3 &= ~SPRITEOAM_MASK_PRIORITY;
sprite.attrib3 |= prio;
sprite.attrib3 &= ~SPRITEOAM_MASK_PALETTENUM;
sprite.unk6 &= ~SPRITEOAM_MASK_UNK6_0;
sprite.unk6 &= ~SPRITEOAM_MASK_UNK6_1;
xSprite = x;
xSprite &= SPRITEOAM_MAX_X;
xSprite <<= SPRITEOAM_SHIFT_X;
sprite.attrib2 &= ~SPRITEOAM_MASK_X;
sprite.attrib2 |= xSprite;
ySprite = y;
ySprite &= SPRITEOAM_MAX_UNK6_4;
ySprite <<= SPRITEOAM_SHIFT_UNK6_4;
sprite.unk6 &= ~SPRITEOAM_MASK_UNK6_4;
sprite.unk6 |= ySprite;
AddSprite(&sprite, 0x100, NULL, NULL);
x += gUnknown_8106AE8[var_2C].unk0 * 4;
y += gUnknown_8106AE8[var_2C].unk2 * 4;
}
}
}
if (sInRotateMode && unkPtr->unk1821C != unkPtr->unk1821B) {
unkPtr->unk1821C = unkPtr->unk1821B;
sub_804A728(&leader->pos, unkPtr->unk1821B, 0, sInRotateMode);
}
}
*/
NAKED void sub_805E2C4(Entity *leader)
#else
NAKED static void TryCreateModeArrows(Entity *leader)
{
asm_unified( "\n"
" push {r4-r7,lr}\n"
@ -853,7 +1026,7 @@ NAKED void sub_805E2C4(Entity *leader)
" .align 2, 0\n"
"_0805E47C: .4byte gDungeon\n"
"_0805E480: .4byte 0x000181e8\n"
"_0805E484: .4byte gUnknown_202F22C\n"
"_0805E484: .4byte sInDiagonalMode\n"
"_0805E488: .4byte 0xffff0000\n"
"_0805E48C: .4byte 0x0000feff\n"
"_0805E490: .4byte 0x0000fdff\n"
@ -1163,16 +1336,18 @@ NAKED void sub_805E2C4(Entity *leader)
"_0805E710: .4byte 0x0000dfff\n"
"_0805E714: .4byte 0x00003fff\n"
"_0805E718: .4byte 0x0000c1ff\n"
"_0805E71C: .4byte gUnknown_8106AEC\n"
"_0805E71C: .4byte gUnknown_8106AE8 + 4\n"
"_0805E720: .4byte 0x000003ff\n"
"_0805E724: .4byte 0x00000fff\n"
"_0805E728: .4byte 0x0000fffe\n"
"_0805E72C: .4byte 0x0000fffd\n"
"_0805E730: .4byte 0x000001ff\n"
"_0805E734: .4byte gUnknown_202F22D"
"_0805E734: .4byte sInRotateMode"
);
}
#endif // NONMATCHING
void sub_805E738(Entity *a0)
{
Tile *tile;

View File

@ -25,7 +25,7 @@ extern void sub_8086AC0(void);
extern void sub_8043ED0(u32);
extern void sub_8071DA4(Entity *);
extern void TriggerWeatherAbilities(void);
extern void sub_805D8C8(void);
extern void DungeonHandlePlayerInput(void);
extern void sub_805F02C(void);
static void sub_8044454(void);
@ -140,7 +140,7 @@ static bool8 xxx_dungeon_80442D0(bool8 param_1)
if (sub_8044B28()) return FALSE;
sub_8071DA4(entity);
gDungeon->noActionInProgress = TRUE;
sub_805D8C8();
DungeonHandlePlayerInput();
gDungeon->noActionInProgress = FALSE;
if (sub_8044B28()) break;
sub_8072CF4(entity);

View File

@ -433,9 +433,9 @@ gUnknown_202F224: /* 202F224 (sub_8040DA0 - sub_805B264) */
gUnknown_202F228: /* 202F228 (sub_8055FA0 - sub_805B618) */
.space 0x4
gUnknown_202F22C: /* 202F22C (sub_805D8C8 - sub_805E2C4) */
sInDiagonalMode: /* 202F22C (sub_805D8C8 - sub_805E2C4) */
.space 0x1
gUnknown_202F22D: /* 202F22D (sub_805D8C8 - sub_805E2C4) */
sInRotateMode: /* 202F22D (sub_805D8C8 - sub_805E2C4) */
.space 0x1
gUnknown_202F22E: /* 202F22E (sub_805D8C8 - sub_805E2C4) */
.space 0x2