EnItem00 OK (#519)

* Match three nonmatchings

* Remove duplicate parens

* turn u32 into s32

* fix thiefbird

* Remove some unnessesary casts

* Fix merge
This commit is contained in:
Derek Hensley 2022-01-03 21:44:57 -08:00 committed by GitHub
parent 06a08a3322
commit 8cd978585e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 90 additions and 112 deletions

View File

@ -493,8 +493,8 @@ void* __osMemcpy(void* dst, void* src, size_t size);
// void EnItem00_DrawHeartContainer(EnItem00* this, GlobalContext* globalCtx);
// void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx);
// s16 func_800A7650(s16 dropId);
EnItem00* Item_DropCollectible(GlobalContext* globalCtx, Vec3f* spawnPos, u32 params);
Actor* Item_DropCollectible2(GlobalContext* globalCtx, Vec3f* spawnPos, u32 params);
Actor* Item_DropCollectible(GlobalContext* globalCtx, Vec3f* spawnPos, u32 params);
Actor* Item_DropCollectible2(GlobalContext* globalCtx, Vec3f* spawnPos, s32 params);
void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3f* spawnPos, s16 params);
s32 func_800A8150(s32 index);
s32 func_800A817C(s32 index);

View File

@ -828,29 +828,22 @@ s16 func_800A7650(s16 dropId) {
return dropId;
}
#ifdef NON_MATCHING
// Reordering issues
EnItem00* Item_DropCollectible(GlobalContext* globalCtx, Vec3f* spawnPos, u32 params) {
Actor* Item_DropCollectible(GlobalContext* globalCtx, Vec3f* spawnPos, u32 params) {
s32 pad;
EnItem00* spawnedActor = NULL;
s32 pad2;
s32 param10000;
s16 param8000;
s16 param7F00;
s32 param20000;
s32 paramFF;
Actor* spawnedActor = NULL;
s32 newParamFF;
s32 param10000 = params & 0x10000;
s16 param8000 = params & 0x8000;
s16 param7F00 = params & 0x7F00;
s32 param20000 = params & 0x20000;
s32 paramFF = params & 0xFF;
s32 i;
param10000 = params & 0x10000;
param8000 = params & 0x8000;
param7F00 = params & 0x7F00;
param20000 = params & 0x20000;
paramFF = params & 0xFF;
params &= 0x7FFF;
newParamFF = params & 0xFF;
if (paramFF == ITEM00_3_HEARTS) {
for (i = 0; i != 3; i++) {
for (i = 0; i < 3; i++) {
spawnedActor = Item_DropCollectible(globalCtx, spawnPos, param7F00 | ITEM00_HEART | param8000);
}
} else if (paramFF == ITEM00_MUSHROOM_CLOUD) {
@ -859,20 +852,18 @@ EnItem00* Item_DropCollectible(GlobalContext* globalCtx, Vec3f* spawnPos, u32 pa
Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_OBJ_KINOKO, spawnPos->x, spawnPos->y, spawnPos->z, 0, 0,
0, param7F00);
}
} else if (((paramFF == ITEM00_FLEXIBLE) || ((params & 0xFF) == ITEM00_BIG_FAIRY)) && (param10000 == 0)) {
if ((params & 0xFF) == ITEM00_FLEXIBLE) {
// TODO: fix cast, this actor is not an EnItem00
spawnedActor =
(EnItem00*)Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f,
} else if (((paramFF == ITEM00_FLEXIBLE) || (newParamFF == ITEM00_BIG_FAIRY)) && (param10000 == 0)) {
newParamFF = params & 0xFF;
if (newParamFF == ITEM00_FLEXIBLE) {
spawnedActor = Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f,
spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) << 9) & 0xFE00) | 0x102);
if (!Actor_GetCollectibleFlag(globalCtx, (param7F00 >> 8) & 0x7F)) {
Audio_PlaySoundAtPosition(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
}
} else {
// TODO: fix cast, this actor is not an EnItem00
spawnedActor = (EnItem00*)Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELFORG, spawnPos->x,
spawnPos->y + 40.0f, spawnPos->z, 0, 0, 0,
((((param7F00 >> 8) & 0x7F) & 0x7F) << 9) | 7);
spawnedActor =
Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELFORG, spawnPos->x, spawnPos->y + 40.0f,
spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) & 0x7F) << 9) | 7);
if (param20000 == 0) {
if (!Actor_GetCollectibleFlag(globalCtx, (param7F00 >> 8) & 0x7F)) {
Audio_PlaySoundAtPosition(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
@ -881,59 +872,50 @@ EnItem00* Item_DropCollectible(GlobalContext* globalCtx, Vec3f* spawnPos, u32 pa
}
} else {
if (param8000 == 0) {
params = func_800A7650(params & 0xFF);
params = func_800A7650(newParamFF);
}
if (params != (u32)ITEM00_NO_DROP) {
spawnedActor = (EnItem00*)Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ITEM00, spawnPos->x,
spawnPos->y, spawnPos->z, 0, 0, 0, params | param8000 | param7F00);
if ((s32)params != ITEM00_NO_DROP) {
spawnedActor = Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ITEM00, spawnPos->x, spawnPos->y,
spawnPos->z, 0, 0, 0, (s32)params | param8000 | param7F00);
if ((spawnedActor != NULL) && (param8000 == 0)) {
if (param10000 == 0) {
spawnedActor->actor.velocity.y = 8.0f;
spawnedActor->velocity.y = 8.0f;
} else {
spawnedActor->actor.velocity.y = -2.0f;
spawnedActor->velocity.y = -2.0f;
}
spawnedActor->actor.speedXZ = 2.0f;
spawnedActor->actor.gravity = -0.9f;
spawnedActor->actor.world.rot.y = randPlusMinusPoint5Scaled(65536.0f);
Actor_SetScale(&spawnedActor->actor, 0.0f);
spawnedActor->actionFunc = func_800A6780;
spawnedActor->unk152 = 0xDC;
if ((spawnedActor->actor.params != ITEM00_SMALL_KEY) &&
(spawnedActor->actor.params != ITEM00_HEART_PIECE) &&
(spawnedActor->actor.params != ITEM00_HEART_CONTAINER)) {
spawnedActor->actor.room = -1;
spawnedActor->speedXZ = 2.0f;
spawnedActor->gravity = -0.9f;
spawnedActor->world.rot.y = randPlusMinusPoint5Scaled(65536.0f);
Actor_SetScale(spawnedActor, 0.0f);
((EnItem00*)spawnedActor)->actionFunc = func_800A6780;
((EnItem00*)spawnedActor)->unk152 = 0xDC;
if ((spawnedActor->params != ITEM00_SMALL_KEY) && (spawnedActor->params != ITEM00_HEART_PIECE) &&
(spawnedActor->params != ITEM00_HEART_CONTAINER)) {
spawnedActor->room = -1;
}
spawnedActor->actor.flags |= 0x0010;
spawnedActor->flags |= 0x0010;
}
}
}
return spawnedActor;
}
#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_en_item00/Item_DropCollectible.s")
#endif
#ifdef NON_MATCHING
// Regalloc, minor reordering
Actor* Item_DropCollectible2(GlobalContext* globalCtx, Vec3f* spawnPos, u32 params) {
Actor* Item_DropCollectible2(GlobalContext* globalCtx, Vec3f* spawnPos, s32 params) {
Actor* spawnedActor = NULL;
u32 pad;
u32 param10000;
s16 param8000;
s16 param7F00;
s32 pad;
s32 param10000 = params & 0x10000;
s16 param8000 = params & 0x8000;
s16 param7F00 = params & 0x7F00;
param10000 = params & 0x10000;
param8000 = params & 0x8000;
param7F00 = params & 0x7F00;
params &= 0xFF;
if (params == ITEM00_3_HEARTS) {
if ((params & 0xFF) == ITEM00_3_HEARTS) {
return NULL;
}
if (((params == ITEM00_FLEXIBLE) || (params == ITEM00_BIG_FAIRY)) && (param10000 == 0)) {
if (params == ITEM00_FLEXIBLE) {
if ((((params & 0xFF) == ITEM00_FLEXIBLE) || ((params & 0xFF) == ITEM00_BIG_FAIRY)) && (param10000 == 0)) {
if ((params & 0xFF) == ITEM00_FLEXIBLE) {
spawnedActor = Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f,
spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) << 9) & 0xFE00) | 0x102);
} else {
@ -945,10 +927,10 @@ Actor* Item_DropCollectible2(GlobalContext* globalCtx, Vec3f* spawnPos, u32 para
Audio_PlaySoundAtPosition(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
}
} else {
params = func_800A7650(params);
if (params != (u32)ITEM00_NO_DROP) {
params = func_800A7650(params & 0xFF);
if (params != ITEM00_NO_DROP) {
spawnedActor = Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ITEM00, spawnPos->x, spawnPos->y,
spawnPos->z, 0, 0, 0, params | param8000 | param7F00);
spawnPos->z, 0, 0, 0, (s32)params | param8000 | param7F00);
if (spawnedActor != NULL) {
if (param8000 == 0) {
spawnedActor->velocity.y = 0.0f;
@ -967,9 +949,6 @@ Actor* Item_DropCollectible2(GlobalContext* globalCtx, Vec3f* spawnPos, u32 para
return spawnedActor;
}
#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_en_item00/Item_DropCollectible2.s")
#endif
u8 sDropTable[DROP_TABLE_SIZE * DROP_TABLE_NUMBER] = {
ITEM00_RUPEE_GREEN, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_NO_DROP, ITEM00_NO_DROP,
@ -1047,17 +1026,14 @@ u8 sDropTableAmounts[DROP_TABLE_SIZE * DROP_TABLE_NUMBER] = {
0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
};
#ifdef NON_MATCHING
// Many regalloc and reordering issues
void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3f* spawnPos, s16 params) {
EnItem00* spawnedActor;
u8 dropId;
s32 dropQuantity;
s16 dropTableIndex;
s16 param8000;
s16 dropTableIndex = Rand_ZeroOne() * 16.0f;
s16 param8000 = params & 0x8000;
u8 dropFlag;
dropTableIndex = Rand_ZeroOne() * 16.0f;
param8000 = params & 0x8000;
params &= 0x1F0;
if (params < 0x101) {
@ -1065,50 +1041,54 @@ void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3
dropQuantity = sDropTableAmounts[params + dropTableIndex];
if (dropId == ITEM00_MASK) {
dropQuantity = 1;
if (gSaveContext.playerForm != PLAYER_FORM_GORON) {
if (gSaveContext.playerForm != PLAYER_FORM_ZORA) {
if (gSaveContext.playerForm != PLAYER_FORM_HUMAN) {
dropId = ITEM00_RUPEE_GREEN;
} else {
dropId = ITEM00_ARROWS_10;
}
} else {
switch (gSaveContext.playerForm) {
case PLAYER_FORM_HUMAN:
dropId = ITEM00_ARROWS_10;
break;
case PLAYER_FORM_ZORA:
dropId = ITEM00_HEART;
}
} else {
dropId = ITEM00_MAGIC_SMALL;
break;
case PLAYER_FORM_GORON:
dropId = ITEM00_MAGIC_SMALL;
break;
default:
dropId = ITEM00_RUPEE_GREEN;
break;
}
dropQuantity = 1;
}
if (fromActor != NULL) {
if (fromActor->dropFlag != 0) {
if ((fromActor->dropFlag & 1) != 0) {
dropFlag = fromActor->dropFlag;
if (dropFlag != 0) {
if (fromActor->dropFlag & 1) {
params = 0x10;
dropId = ITEM00_ARROWS_30;
dropQuantity = 1;
} else if (fromActor->dropFlag & 2) {
params = 0x10;
} else if ((fromActor->dropFlag & 2) != 0) {
dropId = ITEM00_HEART;
params = 0x10;
} else if ((fromActor->dropFlag & 0x20) != 0) {
dropQuantity = 1;
} else if (fromActor->dropFlag & 0x20) {
dropId = ITEM00_RUPEE_PURPLE;
dropQuantity = 1;
}
dropQuantity = 1;
}
}
if (dropId == ITEM00_FLEXIBLE) {
if (gSaveContext.health < 0x11) {
if (gSaveContext.health <= 0x10) {
Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f,
spawnPos->z, 0, 0, 0, 2);
Audio_PlaySoundAtPosition(globalCtx, spawnPos, 40, NA_SE_EV_BUTTERFRY_TO_FAIRY);
return;
}
if (gSaveContext.health < 0x31) {
if (gSaveContext.health <= 0x30) {
params = 0x10;
dropId = ITEM00_HEART;
dropQuantity = 3;
} else if (gSaveContext.health < 0x51) {
} else if (gSaveContext.health <= 0x50) {
params = 0x10;
dropId = ITEM00_HEART;
dropQuantity = 1;
@ -1132,6 +1112,8 @@ void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3
params = 0xA0;
dropId = ITEM00_RUPEE_RED;
dropQuantity = 1;
} else {
return;
}
}
@ -1167,18 +1149,16 @@ void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3
}
}
}
#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_en_item00/Item_DropCollectibleRandom.s")
#endif
s32 D_801AE194[32] = { ITEM00_NO_DROP, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_NO_DROP,
ITEM00_RUPEE_RED, ITEM00_RUPEE_PURPLE, ITEM00_NO_DROP, ITEM00_RUPEE_HUGE,
ITEM00_COMPASS, ITEM00_MUSHROOM_CLOUD, ITEM00_HEART, ITEM00_3_HEARTS,
ITEM00_HEART_PIECE, ITEM00_HEART_CONTAINER, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE,
ITEM00_FLEXIBLE, ITEM00_BIG_FAIRY, ITEM00_NO_DROP, ITEM00_NUTS_10,
ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_NO_DROP, ITEM00_NO_DROP,
ITEM00_NO_DROP, ITEM00_STICK, ITEM00_NO_DROP, ITEM00_NO_DROP,
ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_ARROWS_10, ITEM00_ARROWS_30 };
s32 D_801AE194[32] = {
ITEM00_NO_DROP, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_NO_DROP, ITEM00_RUPEE_RED,
ITEM00_RUPEE_PURPLE, ITEM00_NO_DROP, ITEM00_RUPEE_HUGE, ITEM00_COMPASS, ITEM00_MUSHROOM_CLOUD,
ITEM00_HEART, ITEM00_3_HEARTS, ITEM00_HEART_PIECE, ITEM00_HEART_CONTAINER, ITEM00_MAGIC_SMALL,
ITEM00_MAGIC_LARGE, ITEM00_FLEXIBLE, ITEM00_BIG_FAIRY, ITEM00_NO_DROP, ITEM00_NUTS_10,
ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
ITEM00_STICK, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP,
ITEM00_ARROWS_10, ITEM00_ARROWS_30,
};
s32 func_800A8150(s32 index) {
if ((index < 0) || (index >= ARRAY_COUNT(D_801AE194))) {
@ -1188,9 +1168,7 @@ s32 func_800A8150(s32 index) {
return D_801AE194[index];
}
u8 D_801AE214[32] = {
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
u8 D_801AE214[32] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
s32 func_800A817C(s32 index) {
if ((index < 0) || (index >= ARRAY_COUNT(D_801AE214))) {

View File

@ -401,12 +401,12 @@ s32 func_80C10E98(GlobalContext* globalCtx) {
sp64.y = player->actor.world.pos.y + 20.0f;
sp64.z = (Math_CosS(phi_s3) * 40.0f) + player->actor.world.pos.z;
if (dropItem00Ids[i] != ITEM00_NO_DROP) {
EnItem00* temp_s1_5 = Item_DropCollectible(globalCtx, &sp64, dropItem00Ids[i]);
Actor* temp_s1_5 = Item_DropCollectible(globalCtx, &sp64, dropItem00Ids[i]);
if (temp_s1_5 != NULL) {
temp_s1_5->actor.velocity.y = Rand_ZeroFloat(3.0f) + 6.0f;
temp_s1_5->actor.speedXZ = Rand_ZeroFloat(3.0f) + 3.0f;
temp_s1_5->actor.world.rot.y = phi_s3;
temp_s1_5->velocity.y = Rand_ZeroFloat(3.0f) + 6.0f;
temp_s1_5->speedXZ = Rand_ZeroFloat(3.0f) + 3.0f;
temp_s1_5->world.rot.y = phi_s3;
}
phi_s3 += (s16)(0x10000 / (spB0 + spAC + phi_s0_2 + spA0 + phi_s2 + spA8));
}