From 557a9db0e2770da5d90636a8e450bddad404cfde Mon Sep 17 00:00:00 2001 From: dark-samus Date: Fri, 15 Jan 2021 15:35:39 -0500 Subject: [PATCH] more --- include/functions.h | 2 + src/code_109660_len_1270.c | 136 ++++++++++++++++++++++++++++++++----- src/code_B9D60.c | 2 - 3 files changed, 121 insertions(+), 19 deletions(-) diff --git a/include/functions.h b/include/functions.h index 38a0f18172..3be49b962e 100644 --- a/include/functions.h +++ b/include/functions.h @@ -142,6 +142,8 @@ void sort_items(void); s32 is_ability_active(s32 arg0); f32 update_lerp(Easing easing, f32 start, f32 end, s32 elapsed, s32 duration); +s32 make_item_entity(s32 itemID, f32 x, f32 y, f32 z, s32 itemSpawnMode, s32 pickupDelay, s32 facingAngleSign, + s32 pickupVar); s32 make_item_entity_delayed(s32 itemID, f32 x, f32 y, f32 z, s32 itemSpawnMode, s32 pickupDelay, s32 pickupVar); void set_item_entity_position(s32 itemEntityIndex, f32 x, f32 y, f32 z); ItemEntity* get_item_entity(s32 itemEntityIndex); diff --git a/src/code_109660_len_1270.c b/src/code_109660_len_1270.c index a3e549b1df..d079c699cd 100644 --- a/src/code_109660_len_1270.c +++ b/src/code_109660_len_1270.c @@ -36,12 +36,11 @@ typedef struct struct802E7F40 { } struct802E7F40; void func_802E7F40(Entity* entity) { - struct802E7F40* temp_v1; + struct802E7F40* temp = entity->dataBuf; - temp_v1 = entity->dataBuf; entity->scale.y = 0.85714287f; - temp_v1->unk_04 = 0xFFFF; - temp_v1->unk_00 = D_8015C7D0; + temp->unk_04 = 0xFFFF; + temp->unk_00 = D_8015C7D0; } void func_802E7F6C(Entity* entity) { @@ -53,6 +52,8 @@ void func_802E7F6C(Entity* entity) { INCLUDE_ASM(s32, "code_109660_len_1270", func_802E7FA0); +extern f64 D_802EB370; + INCLUDE_ASM(s32, "code_109660_len_1270", func_802E854C); s32 func_802E8858(Entity* entity) { @@ -75,38 +76,139 @@ s32 func_802E8858(Entity* entity) { } } -INCLUDE_ASM(s32, "code_109660_len_1270", func_802E88EC); +f32 func_800E546C(void); -INCLUDE_ASM(s32, "code_109660_len_1270", func_802E89B0); +void func_802E88EC(Entity* entity, f32 arg1) { + struct802E7F40* temp = entity->dataBuf; -INCLUDE_ASM(s32, "code_109660_len_1270", func_802E89F8); + if (temp->unk_00 != -1) { + s32 flag = 0; -INCLUDE_ASM(s32, "code_109660_len_1270", func_802E8A58); + // can't do || here, or gcc realizes it can reuse the temp->unk_04 load + if ((temp->unk_04 == 0xFFFF)) { + flag = 1; + } else if((get_global_flag(temp->unk_04) == 0)) { + flag = 1; + } + if (flag != 0) { + make_item_entity(temp->unk_00, entity->position.x, entity->position.y + D_802EB370, entity->position.z, 0xA, 0, func_800E546C(), temp->unk_04); + } + } +} + +typedef struct struct802E89B0 { + /* 0x00 */ s32 unk_00; + /* 0x04 */ s32 unk_04; + /* 0x08 */ s32 unk_08; + /* 0x0C */ s32 unk_0C; + /* 0x10 */ char unk_10[4]; + /* 0x14 */ s32 unk_14; +} struct802E89B0; + +void func_802E89B0(Entity *entity) { + struct802E89B0* temp_s0; + + temp_s0 = entity->dataBuf; + if (get_global_flag(temp_s0->unk_14) != 0) { + temp_s0->unk_04 = 0x10; + func_8010FD68(entity); + } +} + +extern f64 D_802EB380; + +void func_802E89F8(Entity *entity) { + s32 temp_v0; + struct802E89B0* temp; + + temp = entity->dataBuf; + temp->unk_04--; + if ((temp->unk_04 != -1) && (temp->unk_08 == 0)) { + entity->position.y += D_802EB380; + return; + } + temp->unk_04 = 0; + func_8010FD68(entity); +} + +void func_802E8A58(Entity *entity) { + struct802E89B0* temp = entity->dataBuf; + + if (temp->unk_0C == GAME_STATUS->entryID) { + switch(temp->unk_04) { + case 0: + if (gCollisionStatus.currentFloor > 0) { + temp->unk_04 = 1; + } + return; + case 1: + if (gCollisionStatus.currentFloor < 0) { + temp->unk_04 = 2; + } + return; + default: + func_8010FD68(entity); + return; + } + } else { + func_8010FD68(entity); + return; + } +} + +#ifdef NON_MATCHING +// small regalloc issue +void func_802E8ADC(Entity *entity) { + PlayerStatus* playerStatus = &gPlayerStatus; + + if ((entity->unk_06 & 1) != 0) { + *D_8009A650 |= 0x40; + if ((playerStatus->flags & 0x3000) == 0) { + s32 phi_v0 = playerStatus->stickAxis[0]; + s32 temp_a0 = playerStatus->stickAxis[1]; + + if (phi_v0 < 0) { + phi_v0 = -phi_v0; + } + + if ((phi_v0 != 0) || (temp_a0 != 0)) { + if (atan2(0.0f, 0.0f, phi_v0, temp_a0) < 60.0f) { + func_8010FD68(entity); + return; + } + } + } + } else { + *D_8009A650 &= ~0x40; + } +} +#else INCLUDE_ASM(s32, "code_109660_len_1270", func_802E8ADC); +#endif void func_802E8BC0(Entity* entity) { PlayerStatus* playerStatus = &gPlayerStatus; PlayerStatus* playerStatus2 = &gPlayerStatus; - struct802E7DE0* temp = (struct802E7DE0*)entity->dataBuf; + struct802E89B0* temp = entity->dataBuf; MapConfig* mapConfig = get_current_map_header(); f32 temp_f20; f32 entryX; f32 entryZ; - entryX = GET_MAP_ENTRY(mapConfig, temp->unk_00C)->x; - entryZ = GET_MAP_ENTRY(mapConfig, temp->unk_00C)->z; - temp->unk_004 = func_800E0088(entryX, entryZ) / playerStatus->runSpeed; - if (temp->unk_004 == 0) { - temp->unk_004 = 1; + entryX = GET_MAP_ENTRY(mapConfig, temp->unk_0C)->x; + entryZ = GET_MAP_ENTRY(mapConfig, temp->unk_0C)->z; + temp->unk_04 = func_800E0088(entryX, entryZ) / playerStatus->runSpeed; + if (temp->unk_04 == 0) { + temp->unk_04 = 1; } - entryX = GET_MAP_ENTRY(mapConfig, temp->unk_00C)->x; - entryZ = GET_MAP_ENTRY(mapConfig, temp->unk_00C)->z; + entryX = GET_MAP_ENTRY(mapConfig, temp->unk_0C)->x; + entryZ = GET_MAP_ENTRY(mapConfig, temp->unk_0C)->z; temp_f20 = atan2(playerStatus2->position.x, playerStatus2->position.z, entryX, entryZ); disable_player_input(); disable_player_static_collisions(); - move_player(temp->unk_004, temp_f20, playerStatus2->runSpeed); + move_player(temp->unk_04, temp_f20, playerStatus2->runSpeed); } void func_802E8C94(Entity* entity) { diff --git a/src/code_B9D60.c b/src/code_B9D60.c index 533f74a71a..4b358178ad 100644 --- a/src/code_B9D60.c +++ b/src/code_B9D60.c @@ -142,8 +142,6 @@ INCLUDE_ASM(s32, "code_B9D60", init_item_entity_list); INCLUDE_ASM(s32, "code_B9D60", func_80131128); -s32 make_item_entity(s32 itemID, f32 x, f32 y, f32 z, s32 itemSpawnMode, s32 pickupDelay, s32 facingAngleSign, - s32 pickupVar); INCLUDE_ASM(s32, "code_B9D60", make_item_entity, s32 itemID, f32 x, f32 y, f32 z, s32 itemSpawnMode, s32 pickupDelay, s32 facingAngleSign, s32 pickupVar);