From 1039c9f753da66b839e1078be37c2f7a8bd18d45 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Mon, 15 May 2023 19:20:10 +0100 Subject: [PATCH] Clean up particles a bit (#391) * Update object_functions.c * step 1 * stage 2 * stage 3 * Update particles.h * stage 3 * Update particles.h * Update particles.h * gave preliminary names to things that have obvious looking properties * rename camera strusct cars * last minute changes --- include/structs.h | 63 ++-- src/object_functions.c | 10 +- src/objects.c | 6 +- src/particles.c | 738 ++++++++++++++++++++--------------------- src/particles.h | 263 ++++----------- src/racer.c | 30 +- src/racer.h | 6 +- 7 files changed, 498 insertions(+), 618 deletions(-) diff --git a/include/structs.h b/include/structs.h index 46963da3..f41aa713 100644 --- a/include/structs.h +++ b/include/structs.h @@ -1515,40 +1515,41 @@ typedef struct ParticleBehavior { f32 unk3C; s16 unk40; s16 unk42; - s16 unk44; - s16 unk46; - s16 unk48; + // These names are pretty bad, but they're better than nothing. + s16 angleVelY; + s16 angleVelX; + s16 angleVelZ; s16 unk4A; s16 unk4C; s16 unk4E; f32 unk50; f32 unk54; - f32 unk58; + f32 forwardVel; s32 unk5C; - s32 unk60; - s16 unk64; - s16 unk66; - s16 unk68; - s16 unk6A; - s16 unk6C; - s16 unk6E; - s32 unk70; - s32 unk74; - s32 unk78; - s32 unk7C; - s16 unk80; - s16 unk82; - s16 unk84; + s32 gravityRange1; + s16 angleRangeY1; + s16 angleRangeX1; + s16 angleRangeZ1; + s16 angleRangeY2; + s16 angleRangeX2; + s16 angleRangeZ2; + s32 gravityRange2; + s32 velocityRangeX1; + s32 velocityRangeY1; + s32 velocityRangeZ1; + s16 angleRangeY3; + s16 angleRangeX3; + s16 angleRangeZ3; s16 unk86; s16 unk88; s16 unk8A; - s32 unk8C; - s32 unk90; - s32 unk94; - u8 unk98; - u8 unk99; - u8 unk9A; - u8 unk9B; + s32 unk8C; // Something to do with scale + s32 unk90; // Something to do with scale + s32 velocityRange; + u8 colourRangeR; + u8 colourRangeG; + u8 colourRangeB; + u8 colourRangeA; s32 *unk9C; } ParticleBehavior; @@ -1607,6 +1608,16 @@ typedef struct SegmentPropertiesObject { /* 0x003B */ s8 animationID; } SegmentPropertiesObject; +typedef struct SegmentPropertiesParticle { + /* 0x002C */ s16 unk2C; + /* 0x002E */ s16 unk2E; + /* 0x0030 */ f32 unk30; + /* 0x0034 */ f32 unk34; + /* 0x0038 */ u8 unk38; + /* 0x0039 */ u8 unk39; + /* 0x003A */ s16 unk3A; +} SegmentPropertiesParticle; + typedef struct SegmentPropertiesCamera { /* 0x002C */ f32 unk2C; /* 0x0030 */ f32 distanceToCamera; @@ -1626,6 +1637,7 @@ typedef struct ObjectSegment { /* 0x0028 */ f32 unk28; union { SegmentPropertiesObject object; + SegmentPropertiesParticle particle; SegmentPropertiesCamera camera; }; /* 0x003C */ LevelObjectEntry* level_entry; @@ -1641,6 +1653,7 @@ typedef struct unk800B0698_44 { union { unk800B0698_44_0 *unk0Ptr; s16 unk0; + struct unk800B0698_44_0 unk0struct; }; } unk800B0698_44; diff --git a/src/object_functions.c b/src/object_functions.c index 9047d9cc..9bb56df6 100644 --- a/src/object_functions.c +++ b/src/object_functions.c @@ -2538,7 +2538,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { if (obj->segment.object.opacity < (255 - var_a2)) { obj->segment.object.opacity += var_a2; } else { - obj->segment.object.opacity = 0xFF; + obj->segment.object.opacity = 255; obj->properties.npc.action = TAJ_MODE_APPROACH_PLAYER; } break; @@ -2606,17 +2606,17 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { taj->animFrameF = 0.0f; } var_a2 = updateRate * 4; - if (obj->segment.object.opacity < (0xFF - var_a2)) { + if (obj->segment.object.opacity < (255 - var_a2)) { obj->segment.object.opacity += var_a2; } else { - obj->segment.object.opacity = 0xFF; + obj->segment.object.opacity = 255; obj->properties.npc.action = TAJ_MODE_ROAM; } break; case TAJ_MODE_RACE: obj->interactObj->flags = INTERACT_FLAGS_NONE; obj->segment.object.animationID = 6; - obj->segment.object.opacity = 0xFF; + obj->segment.object.opacity = 255; taj->animFrameF += updateRateF * 1.0; break; default: @@ -5195,7 +5195,7 @@ void obj_loop_levelname(Object *obj, s32 updateRate) { } assign_dialogue_box_id(4); set_current_dialogue_box_coords(4, x1, y1, x2, y2); - set_current_dialogue_background_colour(4, 128, 64, 128, (properties->opacity * SCREEN_WIDTH_HALF) >> 8); + set_current_dialogue_background_colour(4, 128, 64, 128, (properties->opacity * 160) >> 8); set_current_text_background_colour(4, 0, 0, 0, 0); set_dialogue_font(4, FONT_COLOURFUL); set_current_text_colour(4, 255, 255, 255, 0, (properties->opacity * 255) >> 8); diff --git a/src/objects.c b/src/objects.c index f911e589..275844e3 100644 --- a/src/objects.c +++ b/src/objects.c @@ -1051,8 +1051,8 @@ void func_80010994(s32 updateRate) { for (i = D_8011AE60; i < tempVal; i++) { obj = gObjPtrList[i]; if (obj->segment.trans.flags & 0x8000) { - //Why is this object being treated as a Particle2? - func_800B22FC((Particle2 *) obj, updateRate); + //Why is this object being treated as a Particle? + func_800B22FC((Particle *) obj, updateRate); } } } @@ -1961,7 +1961,7 @@ GLOBAL_ASM("asm/non_matchings/objects/func_80012F94.s") void render_object(Object *this) { func_80012F94(this); if (this->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) { - func_800B3740(this, &gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, 0x8000); + func_800B3740((Particle *) this, &gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, 0x8000); } else { if (this->segment.header->modelType == OBJECT_MODEL_TYPE_3D_MODEL) render_3d_model(this); diff --git a/src/particles.c b/src/particles.c index e2ae9873..708c5da2 100644 --- a/src/particles.c +++ b/src/particles.c @@ -47,19 +47,19 @@ const char D_800E8B44[] = "\nError :: particle %x is not indexed correctly in tr // I woundn't be suprised if most of these zeroes are really just null pointers. s32 D_800E2CA0 = 0; s32 D_800E2CA4 = 0; -unk800B1CB8 *D_800E2CA8 = NULL; +ParticleType *D_800E2CA8 = NULL; s32 D_800E2CAC = 0; s32 D_800E2CB0 = 0; -unk800B1CB8 *D_800E2CB4 = NULL; +ParticleType *D_800E2CB4 = NULL; s32 D_800E2CB8 = 0; s32 D_800E2CBC = 0; -unk800B1CB8 *D_800E2CC0 = NULL; +ParticleType *D_800E2CC0 = NULL; s32 D_800E2CC4 = 0; s32 D_800E2CC8 = 0; -unk800B1CB8 *D_800E2CCC = NULL; +ParticleType *D_800E2CCC = NULL; s32 D_800E2CD0 = 0; s32 D_800E2CD4 = 0; -unk800E2CD8 *D_800E2CD8 = NULL; +Particle *D_800E2CD8 = NULL; s32 D_800E2CDC = 0; s32 *D_800E2CE0 = NULL; s32 *D_800E2CE4 = NULL; @@ -393,13 +393,13 @@ void func_800AF024(unk800AF024 *arg0, Vertex **arg1, Triangle **arg2) { *arg1 = temp; } -void func_800AF0A4(Object *obj) { +void func_800AF0A4(Particle *particle) { Object_44 *temp_v0; Object_44_C *temp_v1; s16 temp_t1, temp_t8_0; s32 temp_t8; - temp_v0 = (Object_44 *) obj->unk44; + temp_v0 = (Object_44 *) particle->unk44; temp_v1 = temp_v0->unkC; temp_t8_0 = (temp_v0->unk0->unk0 - 1) << 5; temp_t8 = (s32)temp_t8_0; @@ -412,12 +412,12 @@ void func_800AF0A4(Object *obj) { temp_v1->unkE = temp_t1; } -void func_800AF0F0(Object *obj) { +void func_800AF0F0(Particle *particle) { Object_44 *temp_v0; Object_44_C *temp_v1; s16 temp_t8, temp_t1; - temp_v0 = (Object_44 *) obj->unk44; + temp_v0 = (Object_44 *) particle->unk44; temp_v1 = temp_v0->unkC; temp_t8 = (temp_v0->unk0->unk0 - 1) << 5; temp_t1 = (temp_v0->unk0->unk1 - 1) << 5; @@ -438,7 +438,7 @@ void func_800AF134(Particle *arg0, s32 arg1, s32 arg2, s16 arg3, s16 arg4, s16 a arg1 = 0; } temp = gParticleBehavioursAssetTable[arg1]; - if (arg0->unk8 != arg2 || temp != arg0->behaviour) { + if (arg0->data.unk8 != arg2 || temp != arg0->data.behaviour) { func_800B2260(arg0); func_800AF29C(arg0, arg1, arg2, arg3, arg4, arg5); } @@ -459,43 +459,43 @@ void func_800AF29C(Particle *arg0, s32 arg1, s32 arg2, s16 arg3, s16 arg4, s16 a s32 flags; temp_v1 = gParticleBehavioursAssetTable[arg1]; - arg0->unk8 = arg2; - arg0->unk18 = arg3; - arg0->behaviour = temp_v1; - arg0->unk1A = arg4; - arg0->unk1C = arg5; - arg0->unk1E = 0; + arg0->data.unk8 = arg2; + arg0->data.unk18 = arg3; + arg0->data.behaviour = temp_v1; + arg0->data.unk1A = arg4; + arg0->data.unk1C = arg5; + arg0->data.unk1E = 0; flags = temp_v1->flags; if (flags & 0x4000) { - arg0->flags = 0x4000; - arg0->unk6 = 0; - arg0->pos.x = 0.0f; - arg0->pos.y = 0.0f; - arg0->pos.z = 0.0f; + arg0->data.flags = 0x4000; + arg0->data.unk6 = 0; + arg0->data.pos.x = 0.0f; + arg0->data.pos.y = 0.0f; + arg0->data.pos.z = 0.0f; } else if (flags & 0x400) { - arg0->unk6 = 0; - arg0->flags = 0x400; + arg0->data.unk6 = 0; + arg0->data.flags = 0x400; temp_v0_2 = gParticlesAssetTable[arg2]->unk8; if (temp_v0_2 < 0x100) { - arg0->unk7 = temp_v0_2; + arg0->data.unk7 = temp_v0_2; } else { - arg0->unk7 = 0xFF; + arg0->data.unk7 = 0xFF; } - arg0->unkC_400.unkC = (s32 *) allocate_from_main_pool_safe(arg0->unk7 * 4, COLOUR_TAG_SEMITRANS_GREY); - arg0->unkC_400.unk10 = temp_v1->unk14; - arg0->unkC_400.unk12 = temp_v1->unk16; - arg0->unkC_400.unk14 = temp_v1->unk22; - arg0->unkC_400.unk16 = temp_v1->unk24; + arg0->data.unkC_400.unkC = (s32 *) allocate_from_main_pool_safe(arg0->data.unk7 * 4, COLOUR_TAG_SEMITRANS_GREY); + arg0->data.unkC_400.unk10 = temp_v1->unk14; + arg0->data.unkC_400.unk12 = temp_v1->unk16; + arg0->data.unkC_400.unk14 = temp_v1->unk22; + arg0->data.unkC_400.unk16 = temp_v1->unk24; } else { - arg0->flags = 0; - arg0->unkC.unkC = temp_v1->unk14; - arg0->unkC.unkE = temp_v1->unk16; - arg0->unkC.unk10 = temp_v1->unk18; - arg0->unkC.unk12 = temp_v1->unk22; - arg0->unkC.unk14 = temp_v1->unk24; - arg0->unkC.unk16 = temp_v1->unk26; + arg0->data.flags = 0; + arg0->data.unkC.unkC = temp_v1->unk14; + arg0->data.unkC.unkE = temp_v1->unk16; + arg0->data.unkC.unk10 = temp_v1->unk18; + arg0->data.unkC.unk12 = temp_v1->unk22; + arg0->data.unkC.unk14 = temp_v1->unk24; + arg0->data.unkC.unk16 = temp_v1->unk26; } } @@ -526,48 +526,48 @@ void func_800AF52C(Object *obj, s32 arg1) { s32 i; Particle *temp_v0; ParticleBehavior *temp_v1; - Particle2 *temp; + Particle *temp; temp_v0 = (Particle *) &obj->unk6C[arg1]; - temp_v1 = temp_v0->behaviour; - temp_v0->unkA = 0; - if (temp_v0->flags & 0x4000) { + temp_v1 = temp_v0->data.behaviour; + temp_v0->data.unkA = 0; + if (temp_v0->data.flags & 0x4000) { ((ObjectSegment *) temp_v0)->trans.x_position = obj->segment.trans.x_position; ((ObjectSegment *) temp_v0)->trans.y_position = obj->segment.trans.y_position; ((ObjectSegment *) temp_v0)->trans.z_position = obj->segment.trans.z_position; - } else if (temp_v0->flags & 0x400) { - temp_v0->unkA = gParticlesAssetTable[temp_v0->unk8]->unk17 << 8; + } else if (temp_v0->data.flags & 0x400) { + temp_v0->data.unkA = gParticlesAssetTable[temp_v0->data.unk8]->colour.a << 8; - if (temp_v0->unk6 > 0) { // Useless if statement, since the loop already does this. - for (i = 0; i < temp_v0->unk6; i++){ - temp = temp_v0->unkC_60[i]; - temp->segment.unk38.half.unk3A = 0; + if (temp_v0->data.unk6 > 0) { // Useless if statement, since the loop already does this. + for (i = 0; i < temp_v0->data.unk6; i++){ + temp = temp_v0->data.unkC_60[i]; + temp->segment.particle.unk3A = 0; } } if (temp_v1->flags & 1) { - temp_v0->unkC.unk10 = temp_v1->unk14; - temp_v0->unkC.unk12 = temp_v1->unk16; + temp_v0->data.unkC.unk10 = temp_v1->unk14; + temp_v0->data.unkC.unk12 = temp_v1->unk16; } if (temp_v1->flags & 4) { - temp_v0->unkC.unk14 = temp_v1->unk22; - temp_v0->unkC.unk16 = temp_v1->unk24; + temp_v0->data.unkC.unk14 = temp_v1->unk22; + temp_v0->data.unkC.unk16 = temp_v1->unk24; } } else { if (temp_v1->flags & 1) { - temp_v0->unk6 = 0; - temp_v0->unkC.unkC = temp_v1->unk14; - temp_v0->unkC.unkE = temp_v1->unk16; - temp_v0->unkC.unk10 = temp_v1->unk18; + temp_v0->data.unk6 = 0; + temp_v0->data.unkC.unkC = temp_v1->unk14; + temp_v0->data.unkC.unkE = temp_v1->unk16; + temp_v0->data.unkC.unk10 = temp_v1->unk18; } if (temp_v1->flags & 4) { - temp_v0->unk7 = 0; - temp_v0->unkC.unk12 = temp_v1->unk22; - temp_v0->unkC.unk14 = temp_v1->unk24; - temp_v0->unkC.unk16 = temp_v1->unk26; + temp_v0->data.unk7 = 0; + temp_v0->data.unkC.unk12 = temp_v1->unk22; + temp_v0->data.unkC.unk14 = temp_v1->unk24; + temp_v0->data.unkC.unk16 = temp_v1->unk26; } } - temp_v0->flags &= 0xFDFF; - temp_v0->flags |= 0xA000; + temp_v0->data.flags &= 0xFDFF; + temp_v0->data.flags |= 0xA000; obj->segment.unk1A++; } @@ -583,56 +583,56 @@ void func_800AF6E4(Object *obj, s32 arg1) { GLOBAL_ASM("asm/non_matchings/particles/func_800AF714.s") GLOBAL_ASM("asm/non_matchings/particles/func_800AFC3C.s") -void func_800AFE5C(unk800B1CB8 *arg0, Particle *arg1) { - Particle2 *temp_s0; - Object *tempObj; - Particle2 *tempObj2; +void func_800AFE5C(Particle *arg0, Particle *arg1) { + Particle *temp_s0; + Particle *tempObj; + Particle *tempObj2; s32 i; ParticleBehavior *temp_s4; - temp_s4 = arg1->behaviour; - if (arg1->flags & 0x4000) { + temp_s4 = arg1->data.behaviour; + if (arg1->data.flags & 0x4000) { tempObj = func_800B0BAC(); if (tempObj != NULL) { - func_8000E9D0(tempObj); + func_8000E9D0((Object *) tempObj); } - arg1->flags &= 0xDFFF; - if (arg1->unk6 + 64 > 255) { - arg1->unk6 = 255; + arg1->data.flags &= 0xDFFF; + if (arg1->data.unk6 + 64 > 255) { + arg1->data.unk6 = 255; } else { - arg1->unk6 += 64; + arg1->data.unk6 += 64; } - } else if (arg1->flags & 0x400) { - if (arg1->unk6 < arg1->unk7) { + } else if (arg1->data.flags & 0x400) { + if (arg1->data.unk6 < arg1->data.unk7) { temp_s0 = func_800B0698(arg0, arg1); - arg1->flags &= 0xDFFF; + arg1->data.flags &= 0xDFFF; if (temp_s0 != NULL) { func_8000E9D0((Object *) temp_s0); - temp_s0->unk74 = arg1->unk6; + temp_s0->unk74 = arg1->data.unk6; temp_s0->segment.unk40 |= 0x2000; - arg1->unkC_60[arg1->unk6] = temp_s0; - arg1->unk6++; + arg1->data.unkC_60[arg1->data.unk6] = temp_s0; + arg1->data.unk6++; } } } else { - while (arg1->unkA >= temp_s4->unk40) { - arg1->unkA -= temp_s4->unk40; + while (arg1->data.unkA >= temp_s4->unk40) { + arg1->data.unkA -= temp_s4->unk40; for (i = 0; i < temp_s4->unk42; i++) { tempObj2 = func_800B1130(arg0, arg1); if (tempObj2 != NULL) { func_8000E9D0((Object *) tempObj2); - func_800B22FC(tempObj2, arg1->unkA); + func_800B22FC(tempObj2, arg1->data.unkA); } - arg1->flags &= ~0x2000; + arg1->data.flags &= ~0x2000; } } } } -void func_800B0010(Particle2 *arg0, Particle2 *arg1, unk800B03C0_arg2 *arg2, ParticleBehavior *arg3) { - s32 sp3C; - Vec3f sp30; - Vec3s sp28; +void func_800B0010(Particle *arg0, Particle *arg1, Particle *arg2, ParticleBehavior *arg3) { + s32 flags; + Vec3f velocityPos; + Vec3s angle; if (arg3->flags & 0x70) { arg0->segment.x_velocity = arg3->unk30; @@ -643,19 +643,19 @@ void func_800B0010(Particle2 *arg0, Particle2 *arg1, unk800B03C0_arg2 *arg2, Par arg0->segment.y_velocity = 0.0f; arg0->segment.z_velocity = 0.0f; } - sp3C = arg3->unk5C & 0x700; - if (sp3C) { - if (sp3C & 0x100) { - arg0->segment.x_velocity += (f32) get_random_number_from_range(-arg3->unk74, arg3->unk74) * 0.00001525878906; + flags = arg3->unk5C & (0x400 | 0x200 | 0x100); + if (flags) { + if (flags & 0x100) { + arg0->segment.x_velocity += (f32) get_random_number_from_range(-arg3->velocityRangeX1, arg3->velocityRangeX1) * 0.00001525878906; } - if (sp3C & 0x200) { - arg0->segment.y_velocity += (f32) get_random_number_from_range(-arg3->unk78, arg3->unk78) * 0.00001525878906; + if (flags & 0x200) { + arg0->segment.y_velocity += (f32) get_random_number_from_range(-arg3->velocityRangeY1, arg3->velocityRangeY1) * 0.00001525878906; } - if (sp3C & 0x400) { - arg0->segment.z_velocity += (f32) get_random_number_from_range(-arg3->unk7C, arg3->unk7C) * 0.00001525878906; + if (flags & 0x400) { + arg0->segment.z_velocity += (f32) get_random_number_from_range(-arg3->velocityRangeZ1, arg3->velocityRangeZ1) * 0.00001525878906; } } - switch (arg3->flags & 0x70) { + switch (arg3->flags & (0x40 | 0x20 | 0x10)) { case 0x10: arg0->segment.x_velocity += arg1->segment.x_velocity; arg0->segment.y_velocity += arg1->segment.y_velocity; @@ -668,186 +668,186 @@ void func_800B0010(Particle2 *arg0, Particle2 *arg1, unk800B03C0_arg2 *arg2, Par break; } if (arg3->flags & 4) { - sp30.x = 0.0f; - sp30.y = 0.0f; - sp30.z = -arg3->unk3C; - sp3C = arg3->unk5C; - if (sp3C & 0x10) { - sp30.z += (f32) get_random_number_from_range(-arg3->unk70, arg3->unk70) * 0.00001525878906; + velocityPos.x = 0.0f; + velocityPos.y = 0.0f; + velocityPos.z = -arg3->unk3C; + flags = arg3->unk5C; + if (flags & 0x10) { + velocityPos.z += (f32) get_random_number_from_range(-arg3->gravityRange2, arg3->gravityRange2) * 0.00001525878906; } - if (sp3C & 0x60) { - sp28.y_rotation = arg2->unk12; - if (sp3C & 0x20) { - sp28.y_rotation += get_random_number_from_range(-arg3->unk6A, arg3->unk6A); + if (flags & (0x40 | 0x20)) { + angle.y_rotation = arg2->data.angle.unk12; + if (flags & 0x20) { + angle.y_rotation += get_random_number_from_range(-arg3->angleRangeY2, arg3->angleRangeY2); } - sp28.x_rotation = arg2->unk14; - if (sp3C & 0x40) { - sp28.x_rotation += get_random_number_from_range((s32) -arg3->unk6C, (s32) arg3->unk6C); + angle.x_rotation = arg2->data.angle.unk14; + if (flags & 0x40) { + angle.x_rotation += get_random_number_from_range(-arg3->angleRangeX2, arg3->angleRangeX2); } - f32_vec3_apply_object_rotation3((ObjectTransform* ) &sp28, (f32*) &sp30); + f32_vec3_apply_object_rotation3((ObjectTransform* ) &angle, (f32*) &velocityPos); } else { - f32_vec3_apply_object_rotation3((ObjectTransform* ) &arg2->unk12, (f32*) &sp30); + f32_vec3_apply_object_rotation3((ObjectTransform* ) &arg2->data.angle.unk12, (f32*) &velocityPos); } - f32_vec3_apply_object_rotation((ObjectTransform* ) arg0->segment.unk3C_a.unk3C_ptr, (f32*) &sp30); - arg0->segment.x_velocity += sp30.x; - arg0->segment.y_velocity += sp30.y; - arg0->segment.z_velocity += sp30.z; + f32_vec3_apply_object_rotation((ObjectTransform* ) arg0->segment.unk3C, (f32*) &velocityPos); + arg0->segment.x_velocity += velocityPos.x; + arg0->segment.y_velocity += velocityPos.y; + arg0->segment.z_velocity += velocityPos.z; } } -void func_800B03C0(Particle2 *arg0, ObjectTransform *arg1, unk800B03C0_arg2 *arg2, ParticleBehavior *arg3) { - s32 sp3C; - Vec3f sp30; - Vec3s sp28; +void func_800B03C0(Particle *arg0, Particle *arg1, Particle *arg2, ParticleBehavior *behaviour) { + s32 flags; + Vec3f posVel; + Vec3s angle; - arg0->unk4C_f32 = arg2->unk18; - arg0->unk50_f32 = arg2->unk1A; - arg0->unk54_f32 = arg2->unk1C; - arg0->unk58_f32 = arg3->unk58; - if (arg3->unk5C & 0x80000) { - arg0->unk58_f32 += (f32) get_random_number_from_range(-arg3->unk94, arg3->unk94) * 0.00001525878906; // 0.00001525878906 ~= 1.0/65536.0 + arg0->somePosX = arg2->data.unk18; + arg0->somePosY = arg2->data.unk1A; + arg0->somePosZ = arg2->data.unk1C; + arg0->forwardVel = behaviour->forwardVel; + if (behaviour->unk5C & 0x80000) { + arg0->forwardVel += (f32) get_random_number_from_range(-behaviour->velocityRange, behaviour->velocityRange) * 0.00001525878906; // 0.00001525878906 ~= 1.0/65536.0 } - if (arg3->flags & 1) { - sp30.x = 0.0f; - sp30.y = 0.0f; - sp30.z = -arg3->unk10; - sp3C = arg3->unk5C; - if (sp3C & 1) { - sp30.z += (f32) get_random_number_from_range(-arg3->unk60, arg3->unk60) * 0.00001525878906; + if (behaviour->flags & 1) { + posVel.x = 0.0f; + posVel.y = 0.0f; + posVel.z = -behaviour->unk10; + flags = behaviour->unk5C; + if (flags & 1) { + posVel.z += (f32) get_random_number_from_range(-behaviour->gravityRange1, behaviour->gravityRange1) * 0.00001525878906; } - if (sp3C & 6) { - sp28.y_rotation = arg2->y_rotation; - if (sp3C & 2) { - sp28.y_rotation += get_random_number_from_range(-arg3->unk64, arg3->unk64); + if (flags & (4 | 2)) { + angle.y_rotation = arg2->data.angle.y_rotation; + if (flags & 2) { + angle.y_rotation += get_random_number_from_range(-behaviour->angleRangeY1, behaviour->angleRangeY1); } - sp28.x_rotation = arg2->x_rotation; - if (sp3C & 4) { - sp28.x_rotation += get_random_number_from_range(-arg3->unk66, arg3->unk66); + angle.x_rotation = arg2->data.angle.x_rotation; + if (flags & 4) { + angle.x_rotation += get_random_number_from_range(-behaviour->angleRangeX1, behaviour->angleRangeX1); } - f32_vec3_apply_object_rotation3((ObjectTransform* ) &sp28, (f32 *) &sp30); + f32_vec3_apply_object_rotation3((ObjectTransform* ) &angle, (f32 *) &posVel); } else { - f32_vec3_apply_object_rotation((ObjectTransform* ) &arg2->y_rotation, (f32 *) &sp30); + f32_vec3_apply_object_rotation((ObjectTransform* ) &arg2->data.angle.y_rotation, (f32 *) &posVel); } - arg0->unk4C_f32 += sp30.x; - arg0->unk50_f32 += sp30.y; - arg0->unk54_f32 += sp30.z; + arg0->somePosX += posVel.x; + arg0->somePosY += posVel.y; + arg0->somePosZ += posVel.z; } - if (arg0->segment.unk38.byte.unk39 != 4) { - f32_vec3_apply_object_rotation(arg1, &arg0->unk4C_f32); + if (arg0->segment.particle.unk39 != 4) { + f32_vec3_apply_object_rotation((ObjectTransform *) arg1, &arg0->somePosX); } - arg0->segment.trans.x_position = arg0->unk4C_f32; - arg0->segment.trans.y_position = arg0->unk50_f32; - arg0->segment.trans.z_position = arg0->unk54_f32; - if (arg0->segment.unk38.byte.unk39 == 4) { - f32_vec3_apply_object_rotation(arg1, &arg0->segment.trans.x_position); + arg0->segment.trans.x_position = arg0->somePosX; + arg0->segment.trans.y_position = arg0->somePosY; + arg0->segment.trans.z_position = arg0->somePosZ; + if (arg0->segment.particle.unk39 == 4) { + f32_vec3_apply_object_rotation((ObjectTransform *) arg1, &arg0->segment.trans.x_position); } - arg0->segment.trans.x_position += arg1->x_position; - arg0->segment.trans.y_position += arg1->y_position; - arg0->segment.trans.z_position += arg1->z_position; + arg0->segment.trans.x_position += arg1->segment.trans.x_position; + arg0->segment.trans.y_position += arg1->segment.trans.y_position; + arg0->segment.trans.z_position += arg1->segment.trans.z_position; } -Particle2 *func_800B0698(unk800B1CB8 *arg0, Particle *arg1) { +Particle *func_800B0698(Particle *arg0, Particle *arg1) { unk800E2CF0 *sp2C; - unk800E2CD8 *var_v0; + Particle *var_v0; TextureHeader **sp24; ParticleBehavior *sp20; f32 temp_f0; f32 temp_f14; f32 temp_f2; - sp2C = gParticlesAssetTable[arg1->unk8]; + sp2C = gParticlesAssetTable[arg1->data.unk8]; if (sp2C->unk0 != 4) { return NULL; } - sp20 = arg1->behaviour; - var_v0 = (unk800E2CD8 *) func_800B1CB8(4); + sp20 = arg1->data.behaviour; + var_v0 = func_800B1CB8(4); if (var_v0 == NULL) { - return (Particle2 *) var_v0; + return var_v0; } - var_v0->unk0.unk2E = arg0->unk2E; - var_v0->unk0.unk6 = -0x8000; - var_v0->unk0.unk39 = sp2C->unk1; - var_v0->unk0.unk40 = sp2C->unk2; - var_v0->unk0.unk3C = arg0; + var_v0->segment.particle.unk2E = arg0->segment.particle.unk2E; + var_v0->segment.trans.flags = -0x8000; + var_v0->segment.particle.unk39 = sp2C->unk1; + var_v0->segment.unk40 = sp2C->unk2; + var_v0->segment.unk3C = arg0; var_v0->unk70 = arg1; - var_v0->unk0.unk8 = sp2C->unk10 * sp20->unk50; - var_v0->unk0.unk28 = sp2C->unk10 * sp20->unk54; - var_v0->unk0.unk3A = sp2C->unk8; - var_v0->unk0.unk34 = 0.0f; - var_v0->unk0.unk38 = 0; - var_v0->unk0.unk6C.r = sp2C->unk14; - var_v0->unk0.unk6C.g = sp2C->unk15; - var_v0->unk0.unk6C.b = sp2C->unk16; - var_v0->unk0.unk6C.a = sp2C->unk17; - if (var_v0->unk0.unk40 & 0x800 && arg0->unk54 != NULL) { - var_v0->unk0.unk4A = *arg0->unk54 * 255.0f; + var_v0->segment.trans.scale = sp2C->scale * sp20->unk50; + var_v0->segment.unk28 = sp2C->scale * sp20->unk54; + var_v0->segment.particle.unk3A = sp2C->unk8; + var_v0->segment.particle.unk34 = 0.0f; + var_v0->segment.particle.unk38 = 0.0f; + var_v0->colour.r = sp2C->colour.r; + var_v0->colour.g = sp2C->colour.g; + var_v0->colour.b = sp2C->colour.b; + var_v0->colour.a = sp2C->colour.a; + if (var_v0->segment.unk40 & 0x800 && arg0->unk54_ptr != NULL) { + var_v0->unk4A = *arg0->unk54_ptr * 255.0f; } else { - var_v0->unk0.unk4A = 0xFF; + var_v0->unk4A = 0xFF; } - var_v0->unk0.unk60 = sp2C->unkE; - if (arg1->flags & 0x100) { - var_v0->unk0.unk5C = arg1->unkA; + var_v0->unk60 = sp2C->unkE; + if (arg1->data.flags & 0x100) { + var_v0->unk5C = arg1->data.unkA; } else { - var_v0->unk0.unk5C = sp2C->unkC << 8; + var_v0->unk5C = sp2C->unkC << 8; } if (sp2C->unkC < 255) { - if (var_v0->unk0.unk40 & 0x1000) { - var_v0->unk0.unk6 |= 0x100; + if (var_v0->segment.unk40 & 0x1000) { + var_v0->segment.trans.flags |= 0x100; } else { - var_v0->unk0.unk6 |= 0x80; + var_v0->segment.trans.flags |= 0x80; } } - if (var_v0->unk0.unk60 < var_v0->unk0.unk3A) { - var_v0->unk0.unk5E = ((sp2C->unkD << 8) - (var_v0->unk0.unk5C & 0xFFFF)) / (var_v0->unk0.unk3A - var_v0->unk0.unk60); + if (var_v0->unk60 < var_v0->segment.particle.unk3A) { + var_v0->unk5E = ((sp2C->unkD << 8) - (var_v0->unk5C & 0xFFFF)) / (var_v0->segment.particle.unk3A - var_v0->unk60); } else { - var_v0->unk0.unk5E = 0; + var_v0->unk5E = 0; } - func_800B03C0((Particle2 *) var_v0, (ObjectTransform *) arg0, (unk800B03C0_arg2 *) arg1, (ParticleBehavior *)sp20); + func_800B03C0(var_v0, arg0, arg1, sp20); if (sp20->flags & 0x80) { - var_v0->unk0.unk0 = sp20->unk44; - var_v0->unk0.unk2 = sp20->unk46; - var_v0->unk0.unk4 = sp20->unk48; + var_v0->segment.trans.y_rotation = sp20->angleVelY; + var_v0->segment.trans.x_rotation = sp20->angleVelX; + var_v0->segment.trans.z_rotation = sp20->angleVelZ; } else { - var_v0->unk0.unk0 = arg0->unk0 + sp20->unk44; - var_v0->unk0.unk2 = arg0->unk2 + sp20->unk46; - var_v0->unk0.unk4 = arg0->unk4 + sp20->unk48; + var_v0->segment.trans.y_rotation = arg0->segment.trans.y_rotation + sp20->angleVelY; + var_v0->segment.trans.x_rotation = arg0->segment.trans.x_rotation + sp20->angleVelX; + var_v0->segment.trans.z_rotation = arg0->segment.trans.z_rotation + sp20->angleVelZ; } - var_v0->unk0.unk62 = sp20->unk4A; - var_v0->unk0.unk64 = sp20->unk4C; - var_v0->unk0.unk66 = sp20->unk4E; - func_800B0010((Particle2 *) var_v0, (Particle2 *) arg0, (unk800B03C0_arg2 *) arg1, (ParticleBehavior *)sp20); - var_v0->unk0.unk68 = D_800E2E2C[(var_v0->unk0.unk40 >> 4) & 7]; - if (var_v0->unk0.unk39 == 5) { - temp_f0 = var_v0->unk0.unk1C; - temp_f2 = var_v0->unk0.unk20; - temp_f14 = var_v0->unk0.unk24; - var_v0->unk0.unk58 = sqrtf((temp_f0 * temp_f0) + (temp_f2 * temp_f2) + (temp_f14 * temp_f14)); + var_v0->unk62 = sp20->unk4A; + var_v0->unk64 = sp20->unk4C; + var_v0->unk66 = sp20->unk4E; + func_800B0010(var_v0, arg0, arg1, sp20); + var_v0->unk68f = D_800E2E2C[(var_v0->segment.unk40 >> 4) & 7]; + if (var_v0->segment.particle.unk39 == 5) { + temp_f0 = var_v0->segment.x_velocity; + temp_f2 = var_v0->segment.y_velocity; + temp_f14 = var_v0->segment.z_velocity; + var_v0->forwardVel = sqrtf((temp_f0 * temp_f0) + (temp_f2 * temp_f2) + (temp_f14 * temp_f14)); } if (sp20->flags & 2) { - arg1->unkC.unk10 += sp20->unk1C; - arg1->unkC.unk12 += sp20->unk1E; + arg1->data.unkC.unk10 += sp20->unk1C; + arg1->data.unkC.unk12 += sp20->unk1E; } if (sp20->flags & 8) { - arg1->unkC.unk14 += sp20->unk2A; - arg1->unkC.unk16 += sp20->unk2C; + arg1->data.unkC.unk14 += sp20->unk2A; + arg1->data.unkC.unk16 += sp20->unk2C; } - var_v0->unk0.unk1A = sp2C->unk6; - var_v0->unk0.unk18 = 0; - sp24 = (TextureHeader **) var_v0->unk0.unk44; + var_v0->segment.unk1A = sp2C->unk6; + var_v0->segment.unk18 = 0; + sp24 = (TextureHeader **) var_v0->unk44; if (sp2C->unk4 == -1) { *sp24 = NULL; } else { *sp24 = load_texture(sp2C->unk4); if ((*sp24) != NULL) { if ((*sp24)->flags & 4) { - if (var_v0->unk0.unk40 & 0x1000) { - var_v0->unk0.unk6 |= 0x100; + if (var_v0->segment.unk40 & 0x1000) { + var_v0->segment.trans.flags |= 0x100; } else { - var_v0->unk0.unk6 |= 0x80; + var_v0->segment.trans.flags |= 0x80; } } - if ((var_v0->unk0.unk40 & 3) == 2) { - var_v0->unk0.unk18 = (*sp24)->numOfTextures - 1; + if ((var_v0->segment.unk40 & 3) == 2) { + var_v0->segment.unk18 = (*sp24)->numOfTextures - 1; } } } @@ -855,42 +855,42 @@ Particle2 *func_800B0698(unk800B1CB8 *arg0, Particle *arg1) { var_v0->unk76 = ((u32) (u16) sp2C->unkA) >> 10; var_v0->unk77 = 0; if (*sp24 == NULL) { - func_800B2040((Particle2 *) var_v0); + func_800B2040(var_v0); return NULL; } - return (Particle2 *) var_v0; + return var_v0; } GLOBAL_ASM("asm/non_matchings/particles/func_800B0BAC.s") -Particle2 *func_800B1130(unk800B1CB8 *arg0, Particle *arg1) { +Particle *func_800B1130(Particle *arg0, Particle *arg1) { s32 sp3C; unk800E2CF0 *sp38; - unk800B1CB8* var_v0; + Particle* var_v0; TextureHeader **sp30; ParticleBehavior *partBeh; unk800B1130_SP28 *sp28; f32 sp24; s8 sp23; - sp38 = gParticlesAssetTable[arg1->unk8]; + sp38 = gParticlesAssetTable[arg1->data.unk8]; if (sp38->unk0 == 3 || sp38->unk0 == 4) { return NULL; } - partBeh = arg1->behaviour; + partBeh = arg1->data.behaviour; sp28 = (unk800B1130_SP28 *) partBeh->unk9C; var_v0 = func_800B1CB8(sp38->unk0); if (var_v0 == NULL) { - return (Particle2 *) var_v0; + return var_v0; } - var_v0->unk2E = arg0->unk2E; - var_v0->unk6 = -0x8000; - var_v0->unk39 = sp38->unk1; - var_v0->unk40 = sp38->unk2; - var_v0->unk3C = arg0; - if (var_v0->unk40 & 0x800 && arg0->unk54 != NULL) { - var_v0->unk4A = *arg0->unk54 * 255.0f; + var_v0->segment.particle.unk2E = arg0->segment.particle.unk2E; + var_v0->segment.trans.flags = -0x8000; + var_v0->segment.particle.unk39 = sp38->unk1; + var_v0->segment.unk40 = sp38->unk2; + var_v0->segment.unk3C = arg0; + if (var_v0->segment.unk40 & 0x800 && arg0->unk54_ptr != NULL) { + var_v0->unk4A = *arg0->unk54_ptr * 255.0f; } else { var_v0->unk4A = 255; } @@ -898,111 +898,111 @@ Particle2 *func_800B1130(unk800B1CB8 *arg0, Particle *arg1) { if (partBeh->unk5C & 0x20000) { sp24 += (f32) get_random_number_from_range(-partBeh->unk8C, partBeh->unk8C) * 0.00001525878906; } - var_v0->unk8 = sp38->unk10 * sp24; + var_v0->segment.trans.scale = sp38->scale * sp24; sp24 = partBeh->unk54; if (partBeh->unk5C & 0x40000) { sp24 += (f32) get_random_number_from_range(-partBeh->unk90, partBeh->unk90) * 0.00001525878906; } if (partBeh->flags & 0x1000) { - var_v0->unk28 = sqrtf((arg0->unk1C * arg0->unk1C) + (arg0->unk20 * arg0->unk20) + (arg0->unk24 * arg0->unk24)) * sp24 * 0.1f; + var_v0->segment.unk28 = sqrtf((arg0->segment.x_velocity * arg0->segment.x_velocity) + (arg0->segment.y_velocity * arg0->segment.y_velocity) + (arg0->segment.z_velocity * arg0->segment.z_velocity)) * sp24 * 0.1f; } else { - var_v0->unk28 = sp38->unk10 * sp24; + var_v0->segment.unk28 = sp38->scale * sp24; } - var_v0->unk3A = get_random_number_from_range(-sp38->unkA, sp38->unkA) + sp38->unk8; - var_v0->unk38 = 0; - var_v0->unk34 = 0.0f; + var_v0->segment.particle.unk3A = get_random_number_from_range(-sp38->unkA, sp38->unkA) + sp38->unk8; + var_v0->segment.particle.unk38 = 0.0f; + var_v0->segment.particle.unk34 = 0.0f; if (D_800E2D00[0].word != 0) { - var_v0->unk6C.word = D_800E2D00[0].word; + var_v0->colour.word = D_800E2D00[0].word; } else if ((s32) sp28 != -1) { - arg1->unk1E++; - if (arg1->unk1E >= sp28->unk0) { - arg1->unk1E = 0; + arg1->data.unk1E++; + if (arg1->data.unk1E >= sp28->unk0) { + arg1->data.unk1E = 0; } - var_v0->unk6C.r = sp28[arg1->unk1E + 2].r; - var_v0->unk6C.g = sp28[arg1->unk1E + 2].g; - var_v0->unk6C.b = sp28[arg1->unk1E + 2].b; - var_v0->unk6C.a = sp28[arg1->unk1E + 2].a; + var_v0->colour.r = sp28[arg1->data.unk1E + 2].r; + var_v0->colour.g = sp28[arg1->data.unk1E + 2].g; + var_v0->colour.b = sp28[arg1->data.unk1E + 2].b; + var_v0->colour.a = sp28[arg1->data.unk1E + 2].a; } else { - var_v0->unk6C.r = sp38->unk14; - var_v0->unk6C.g = sp38->unk15; - var_v0->unk6C.b = sp38->unk16; - var_v0->unk6C.a = sp38->unk17; + var_v0->colour.r = sp38->colour.r; + var_v0->colour.g = sp38->colour.g; + var_v0->colour.b = sp38->colour.b; + var_v0->colour.a = sp38->colour.a; } sp3C = partBeh->unk5C & 0xF00000; if (sp3C != 0) { if (sp3C & 0x100000) { - var_v0->unk6C.r += get_random_number_from_range(-partBeh->unk98, partBeh->unk98); + var_v0->colour.r += get_random_number_from_range(-partBeh->colourRangeR, partBeh->colourRangeR); } if ((sp3C << 10) < 0) { - var_v0->unk6C.g += get_random_number_from_range(-partBeh->unk99, partBeh->unk99); + var_v0->colour.g += get_random_number_from_range(-partBeh->colourRangeG, partBeh->colourRangeG); } if ((sp3C << 9) < 0) { - var_v0->unk6C.b += get_random_number_from_range(-partBeh->unk9A, partBeh->unk9A); + var_v0->colour.b += get_random_number_from_range(-partBeh->colourRangeB, partBeh->colourRangeB); } if ((sp3C << 8) < 0) { - var_v0->unk6C.a += get_random_number_from_range(-partBeh->unk9B, partBeh->unk9B); + var_v0->colour.a += get_random_number_from_range(-partBeh->colourRangeA, partBeh->colourRangeA); } } var_v0->unk60 = sp38->unkE; var_v0->unk5C = sp38->unkC * D_800E2EEC; if (sp38->unkC < 0xFF) { - if (var_v0->unk40 & 0x1000) { - var_v0->unk6 |= 0x100; + if (var_v0->segment.unk40 & 0x1000) { + var_v0->segment.trans.flags |= 0x100; } else { - var_v0->unk6 |= 0x80; + var_v0->segment.trans.flags |= 0x80; } } - if (var_v0->unk60 < var_v0->unk3A) { - var_v0->unk5E = (s16) (((sp38->unkD - sp38->unkC) * D_800E2EEC) / (var_v0->unk3A - var_v0->unk60)); + if (var_v0->unk60 < var_v0->segment.particle.unk3A) { + var_v0->unk5E = (s16) (((sp38->unkD - sp38->unkC) * D_800E2EEC) / (var_v0->segment.particle.unk3A - var_v0->unk60)); } else { var_v0->unk5E = 0; } sp23 = 0; - var_v0->unk1A = sp38->unk6; - if (var_v0->unk2C == 0x80) { - var_v0->unk44 = (unk800B1CB8_44 *) func_8007C12C(sp38->unk4, 0); + var_v0->segment.unk1A = sp38->unk6; + if (var_v0->segment.particle.unk2C == 0x80) { + var_v0->unk44 = (unk800B0698_44 *) func_8007C12C(sp38->unk4, 0); if (var_v0->unk44 != 0) { - if ((*var_v0->unk44->unk8)->unk6 & 4) { - if (var_v0->unk40 & 0x1000) { - var_v0->unk6 |= 0x100; + if ((*var_v0->unk44_2->unk8)->unk6 & 4) { + if (var_v0->segment.unk40 & 0x1000) { + var_v0->segment.trans.flags |= OBJ_FLAGS_UNK_0100; } else { - var_v0->unk6 |= 0x80; + var_v0->segment.trans.flags |= OBJ_FLAGS_UNK_0080; } } if (partBeh->flags & 0x800) { - var_v0->unk18 = get_random_number_from_range(0, var_v0->unk44->unk0 - 1) << 8; - if ((var_v0->unk40 & 3) == 2) { - var_v0->unk18 |= 0xFF; + var_v0->segment.unk18 = get_random_number_from_range(0, var_v0->unk44->unk0 - 1) << 8; + if ((var_v0->segment.unk40 & 3) == 2) { + var_v0->segment.unk18 |= 0xFF; } - } else if ((var_v0->unk40 & 3) == 2) { - var_v0->unk18 = (var_v0->unk44->unk0 << 8) - 1; + } else if ((var_v0->segment.unk40 & 3) == 2) { + var_v0->segment.unk18 = (var_v0->unk44->unk0 << 8) - 1; } else { - var_v0->unk18 = 0; + var_v0->segment.unk18 = 0; } } else { sp23 = 1; } - } else if ((var_v0->unk2C == 2) || (var_v0->unk2C == 1)) { + } else if ((var_v0->segment.particle.unk2C == 2) || (var_v0->segment.particle.unk2C == 1)) { sp30 = (TextureHeader **) var_v0->unk44; if (sp30 != 0) { (*sp30) = load_texture(sp38->unk4); if ((*sp30) != NULL) { if ((*sp30)->flags & 4) { - if (var_v0->unk40 & 0x1000) { - var_v0->unk6 |= 0x100; + if (var_v0->segment.unk40 & 0x1000) { + var_v0->segment.trans.flags |= OBJ_FLAGS_UNK_0100; } else { - var_v0->unk6 |= 0x80; + var_v0->segment.trans.flags |= OBJ_FLAGS_UNK_0080; } } if (partBeh->flags & 0x800) { - var_v0->unk18 = get_random_number_from_range(0, ((*sp30)->numOfTextures >> 8) - 1) << 8; - if ((var_v0->unk40 & 3) == 2) { - var_v0->unk18 |= 0xFF; + var_v0->segment.unk18 = get_random_number_from_range(0, ((*sp30)->numOfTextures >> 8) - 1) << 8; + if ((var_v0->segment.unk40 & 3) == 2) { + var_v0->segment.unk18 |= 0xFF; } - } else if ((var_v0->unk40 & 3) == 2) { - var_v0->unk18 = (*sp30)->numOfTextures - 1; + } else if ((var_v0->segment.unk40 & 3) == 2) { + var_v0->segment.unk18 = (*sp30)->numOfTextures - 1; } else { - var_v0->unk18 = 0; + var_v0->segment.unk18 = 0; } } else { sp23 = 1; @@ -1010,39 +1010,39 @@ Particle2 *func_800B1130(unk800B1CB8 *arg0, Particle *arg1) { } } if (sp23 == 0) { - if (var_v0->unk2C == 1) { - func_800AF0A4((Object* ) var_v0); + if (var_v0->segment.particle.unk2C == 1) { + func_800AF0A4(var_v0); } - if (var_v0->unk2C == 2) { - func_800AF0F0((Object* ) var_v0); + if (var_v0->segment.particle.unk2C == 2) { + func_800AF0F0(var_v0); } } - func_800B03C0((Particle2 *) var_v0, (ObjectTransform *) arg0, (unk800B03C0_arg2 *) arg1, (ParticleBehavior *) partBeh); + func_800B03C0(var_v0, arg0, arg1, partBeh); if (partBeh->flags & 0x80) { - var_v0->unk0 = partBeh->unk44; - var_v0->unk2 = partBeh->unk46; - var_v0->unk4 = partBeh->unk48; + var_v0->segment.trans.y_rotation = partBeh->angleVelY; + var_v0->segment.trans.x_rotation = partBeh->angleVelX; + var_v0->segment.trans.z_rotation = partBeh->angleVelZ; } else { - var_v0->unk0 = arg0->unk0 + partBeh->unk44; - var_v0->unk2 = arg0->unk2 + partBeh->unk46; - var_v0->unk4 = arg0->unk4 + partBeh->unk48; + var_v0->segment.trans.y_rotation = arg0->segment.trans.y_rotation + partBeh->angleVelY; + var_v0->segment.trans.x_rotation = arg0->segment.trans.x_rotation + partBeh->angleVelX; + var_v0->segment.trans.z_rotation = arg0->segment.trans.z_rotation + partBeh->angleVelZ; } sp3C = partBeh->unk5C & 0x3800; if (sp3C != 0) { if (sp3C & 0x800) { - var_v0->unk0 += get_random_number_from_range(-partBeh->unk80, partBeh->unk80); + var_v0->segment.trans.y_rotation += get_random_number_from_range(-partBeh->angleRangeY3, partBeh->angleRangeY3); } if (sp3C & 0x1000) { - var_v0->unk2 += get_random_number_from_range(-partBeh->unk82, partBeh->unk82); + var_v0->segment.trans.x_rotation += get_random_number_from_range(-partBeh->angleRangeX3, partBeh->angleRangeX3); } if (sp3C & 0x2000) { - var_v0->unk4 += get_random_number_from_range(-partBeh->unk84, partBeh->unk84); + var_v0->segment.trans.z_rotation += get_random_number_from_range(-partBeh->angleRangeZ3, partBeh->angleRangeZ3); } } var_v0->unk62 = partBeh->unk4A; var_v0->unk64 = partBeh->unk4C; var_v0->unk66 = partBeh->unk4E; - sp3C = partBeh->unk5C & 0x1C000; + sp3C = partBeh->unk5C & (0x10000 | 0x8000 | 0x4000); if (sp3C != 0) { if (sp3C & 0x4000) { var_v0->unk62 += get_random_number_from_range(-partBeh->unk86, partBeh->unk86); @@ -1054,41 +1054,41 @@ Particle2 *func_800B1130(unk800B1CB8 *arg0, Particle *arg1) { var_v0->unk66 += get_random_number_from_range(-partBeh->unk8A, partBeh->unk8A); } } - func_800B0010((Particle2 *) var_v0, (Particle2 *) arg0, (unk800B03C0_arg2 *) arg1, (ParticleBehavior *) partBeh); - var_v0->unk68 = D_800E2E2C[(var_v0->unk40 >> 4) & 7]; - if (var_v0->unk39 == 5) { - var_v0->unk58 = sqrtf((var_v0->unk1C * var_v0->unk1C) + (var_v0->unk20 * var_v0->unk20) + (var_v0->unk24 * var_v0->unk24)); + func_800B0010(var_v0, arg0, arg1, partBeh); + var_v0->unk68f = D_800E2E2C[(var_v0->segment.unk40 >> 4) & 7]; + if (var_v0->segment.particle.unk39 == 5) { + var_v0->forwardVel = sqrtf((var_v0->segment.x_velocity * var_v0->segment.x_velocity) + (var_v0->segment.y_velocity * var_v0->segment.y_velocity) + (var_v0->segment.z_velocity * var_v0->segment.z_velocity)); } if (partBeh->flags & 2) { - arg1->unk6++; - if (arg1->unk6 >= partBeh->unk1A) { - arg1->unkC.unkC += partBeh->unk1C; - arg1->unkC.unkE += partBeh->unk1E; - arg1->unkC.unk10 += partBeh->unk18; - arg1->unk6 -= partBeh->unk1A; + arg1->data.unk6++; + if (arg1->data.unk6 >= partBeh->unk1A) { + arg1->data.unkC.unkC += partBeh->unk1C; + arg1->data.unkC.unkE += partBeh->unk1E; + arg1->data.unkC.unk10 += partBeh->unk18; + arg1->data.unk6 -= partBeh->unk1A; } } if (partBeh->flags & 8) { - arg1->unk7++; - if (arg1->unk7 >= partBeh->unk28) { - arg1->unkC.unk12 += partBeh->unk2A; - arg1->unkC.unk14 += partBeh->unk2C; - arg1->unkC.unk16 += partBeh->unk2E; - arg1->unk7 -= partBeh->unk28; + arg1->data.unk7++; + if (arg1->data.unk7 >= partBeh->unk28) { + arg1->data.unkC.unk12 += partBeh->unk2A; + arg1->data.unkC.unk14 += partBeh->unk2C; + arg1->data.unkC.unk16 += partBeh->unk2E; + arg1->data.unk7 -= partBeh->unk28; } } if (var_v0->unk44 == 0) { - func_800B2040((Particle2 *) var_v0); + func_800B2040(var_v0); return NULL; } else { - return (Particle2 *) var_v0; + return var_v0; } } -unk800B1CB8 *func_800B1CB8(s32 arg0) { +Particle *func_800B1CB8(s32 arg0) { s32 i; - unk800B1CB8 *var_v1; + Particle *var_v1; var_v1 = NULL; i = 0; @@ -1106,7 +1106,7 @@ unk800B1CB8 *func_800B1CB8(s32 arg0) { } D_800E2CC0[i].unk2C = 0x80; D_800E2CB8++; - var_v1 = &D_800E2CC0[i]; + var_v1 = (Particle *) &D_800E2CC0[i]; } } break; @@ -1122,7 +1122,7 @@ unk800B1CB8 *func_800B1CB8(s32 arg0) { } D_800E2CA8[i].unk2C = 1; D_800E2CA0++; - var_v1 = &D_800E2CA8[i]; + var_v1 = (Particle *) &D_800E2CA8[i]; } } break; @@ -1138,7 +1138,7 @@ unk800B1CB8 *func_800B1CB8(s32 arg0) { } D_800E2CB4[i].unk2C = 2; D_800E2CAC++; - var_v1 = &D_800E2CB4[i]; + var_v1 = (Particle *) &D_800E2CB4[i]; } } break; @@ -1154,7 +1154,7 @@ unk800B1CB8 *func_800B1CB8(s32 arg0) { } D_800E2CCC[i].unk2C = 3; D_800E2CC4++; - var_v1 = &D_800E2CCC[i]; + var_v1 = (Particle *) &D_800E2CCC[i]; } } break; @@ -1165,33 +1165,33 @@ unk800B1CB8 *func_800B1CB8(s32 arg0) { D_800E2CD4 = 1; } } else { - while (D_800E2CD8[i].unk0.unk2C != 0) { + while (D_800E2CD8[i].segment.particle.unk2C != 0) { i++; } - D_800E2CD8[i].unk0.unk2C = 4; + D_800E2CD8[i].segment.particle.unk2C = 4; D_800E2CD0++; - var_v1 = &D_800E2CD8[i].unk0; + var_v1 = (Particle *) &D_800E2CD8[i]; } } break; } if (var_v1 != NULL) { - var_v1->unk48 = -1; + var_v1->behaviorId = -1; } return var_v1; } -void func_800B2040(Particle2 *arg0) { +void func_800B2040(Particle *arg0) { TextureHeader *tex; - switch (arg0->segment.unk2C) { + switch (arg0->segment.particle.unk2C) { case 0x80: if (D_800E2CB8 > 0) { if (arg0->unk44 != NULL) { free_sprite((Sprite *) arg0->unk44); } D_800E2CB8--; - arg0->segment.unk2C = 0; + arg0->segment.particle.unk2C = 0; } break; case 0: @@ -1202,7 +1202,7 @@ void func_800B2040(Particle2 *arg0) { free_texture(arg0->unk44_1->texture); } D_800E2CA0--; - arg0->segment.unk2C = 0; + arg0->segment.particle.unk2C = 0; } break; case 2: @@ -1212,7 +1212,7 @@ void func_800B2040(Particle2 *arg0) { free_texture(tex); } D_800E2CAC--; - arg0->segment.unk2C = 0; + arg0->segment.particle.unk2C = 0; } break; case 3: @@ -1222,7 +1222,7 @@ void func_800B2040(Particle2 *arg0) { free_texture(tex); } D_800E2CC4--; - arg0->segment.unk2C = 0; + arg0->segment.particle.unk2C = 0; } break; case 4: @@ -1233,7 +1233,7 @@ void func_800B2040(Particle2 *arg0) { free_texture(tex); } D_800E2CD0--; - arg0->segment.unk2C = 0; + arg0->segment.particle.unk2C = 0; } break; } @@ -1241,29 +1241,29 @@ void func_800B2040(Particle2 *arg0) { void func_800B2260(Particle *arg0) { - Particle2 *temp_v0; + Particle *temp_v0; s32 i; - if (arg0->flags & 0x400) { - if (arg0->unkC_60 != NULL) { - for (i = 0; i < arg0->unk6; i++) { - temp_v0 = arg0->unkC_60[i]; - temp_v0->segment.unk38.half.unk3A = 0; + if (arg0->data.flags & 0x400) { + if (arg0->data.unkC_60 != NULL) { + for (i = 0; i < arg0->data.unk6; i++) { + temp_v0 = arg0->data.unkC_60[i]; + temp_v0->segment.particle.unk3A = 0; temp_v0->unk70 = 0; } - free_from_memory_pool(arg0->unkC_60); - arg0->unkC_60 = NULL; + free_from_memory_pool(arg0->data.unkC_60); + arg0->data.unkC_60 = NULL; } } } -void func_800B22FC(Particle2 *arg0, s32 arg1) { +void func_800B22FC(Particle *arg0, s32 arg1) { LevelModelSegmentBoundingBox *temp_v0_2; - Particle2 *sp20; + Particle *sp20; D_80127C80 = arg1; sp20 = NULL; - if (arg0->segment.unk2C == 3) { + if (arg0->segment.particle.unk2C == 3) { func_800B26E0(); } else { if (arg0->segment.unk40 & 3) { @@ -1273,41 +1273,41 @@ void func_800B22FC(Particle2 *arg0, s32 arg1) { sp20 = NULL; } } - if (arg0->segment.unk2C == 4) { + if (arg0->segment.particle.unk2C == 4) { sp20 = arg0; arg0->unk75 = 1 - arg0->unk75; arg0->unk77 = 0; } if (sp20 == NULL || (sp20 != NULL && sp20->unk70 != 0)) { - if (arg0->segment.unk38.byte.unk39 == 2) { + if (arg0->segment.particle.unk39 == 2) { func_800B3358(arg0); - } else if (arg0->segment.unk38.byte.unk39 == 3) { + } else if (arg0->segment.particle.unk39 == 3) { func_800B3240(arg0); - } else if (arg0->segment.unk38.byte.unk39 == 4) { + } else if (arg0->segment.particle.unk39 == 4) { func_800B3140(arg0); - } else if (arg0->segment.unk38.byte.unk39 == 5) { + } else if (arg0->segment.particle.unk39 == 5) { func_800B3564(arg0); } else { func_800B34B0(arg0); } } - temp_v0_2 = get_segment_bounding_box(arg0->segment.unk2E); + temp_v0_2 = get_segment_bounding_box(arg0->segment.particle.unk2E); if (temp_v0_2 != NULL) { if (arg0->segment.trans.x_position < temp_v0_2->x1 || temp_v0_2->x2 < arg0->segment.trans.x_position || arg0->segment.trans.y_position < temp_v0_2->y1 || temp_v0_2->y2 < arg0->segment.trans.y_position || arg0->segment.trans.z_position < temp_v0_2->z1 || temp_v0_2->z2 < arg0->segment.trans.z_position) { - arg0->segment.unk2E = get_level_segment_index_from_position(arg0->segment.trans.x_position, arg0->segment.trans.y_position, arg0->segment.trans.z_position); + arg0->segment.particle.unk2E = get_level_segment_index_from_position(arg0->segment.trans.x_position, arg0->segment.trans.y_position, arg0->segment.trans.z_position); } } else { - arg0->segment.unk2E = get_level_segment_index_from_position(arg0->segment.trans.x_position, arg0->segment.trans.y_position, arg0->segment.trans.z_position); + arg0->segment.particle.unk2E = get_level_segment_index_from_position(arg0->segment.trans.x_position, arg0->segment.trans.y_position, arg0->segment.trans.z_position); } - arg0->segment.unk38.half.unk3A -= D_80127C80; - if (arg0->segment.unk38.half.unk3A <= 0) { + arg0->segment.particle.unk3A -= D_80127C80; + if (arg0->segment.particle.unk3A <= 0) { gParticlePtrList_addObject((Object*) arg0); } else { - if (arg0->unk60_halfs.unk60 == 0) { - arg0->unk5C_halfs.unk5C += D_80127C80 * arg0->unk5C_halfs.unk5E; - if (arg0->unk5C_halfs.unk5C < 0xFF) { + if (arg0->unk60 == 0) { + arg0->unk5C += D_80127C80 * arg0->unk5E; + if (arg0->unk5C < 0xFF) { if (arg0->segment.unk40 & 0x1000) { arg0->segment.trans.flags |= OBJ_FLAGS_UNK_0100; } else { @@ -1315,10 +1315,10 @@ void func_800B22FC(Particle2 *arg0, s32 arg1) { } } } else { - arg0->unk60_halfs.unk60 -= D_80127C80; - if (arg0->unk60_halfs.unk60 < 0) { - arg0->unk5C_halfs.unk5C -= (arg0->unk60_halfs.unk60 * arg0->unk5C_halfs.unk5E); - arg0->unk60_halfs.unk60 = 0; + arg0->unk60 -= D_80127C80; + if (arg0->unk60 < 0) { + arg0->unk5C -= (arg0->unk60 * arg0->unk5E); + arg0->unk60 = 0; } } } @@ -1326,21 +1326,21 @@ void func_800B22FC(Particle2 *arg0, s32 arg1) { } -void func_800B263C(Particle2 *arg0) { +void func_800B263C(Particle *arg0) { Particle *new_var; - Particle2 *new_var2; + Particle *new_var2; Particle *temp_v0; s32 i; - temp_v0 = (Particle *) arg0->unk70; + temp_v0 = arg0->unk70; if (temp_v0 != NULL) { new_var = temp_v0; - if (temp_v0->unk6 != 0) { - if (arg0 == temp_v0->unkC_60[arg0->unk74]) { - temp_v0->unk6--; - for (i = arg0->unk74; i < temp_v0->unk6; i++) { - new_var->unkC_60[i] = new_var->unkC_60[i + 1]; - new_var2 = new_var->unkC_60[i]; + if (temp_v0->data.unk6 != 0) { + if (arg0 == temp_v0->data.unkC_60[arg0->unk74]) { + temp_v0->data.unk6--; + for (i = arg0->unk74; i < temp_v0->data.unk6; i++) { + new_var->data.unkC_60[i] = new_var->data.unkC_60[i + 1]; + new_var2 = new_var->data.unkC_60[i]; new_var2->unk74 = i; } } @@ -1350,7 +1350,7 @@ void func_800B263C(Particle2 *arg0) { GLOBAL_ASM("asm/non_matchings/particles/func_800B26E0.s") -void func_800B2FBC(Particle2 *arg0) { +void func_800B2FBC(Particle *arg0) { s32 someFlag; s32 keepGoing; s32 i; @@ -1362,7 +1362,7 @@ void func_800B2FBC(Particle2 *arg0) { keepGoing = -1; i = 128; // This is needed to match. - if (arg0->segment.unk2C == i) { + if (arg0->segment.particle.unk2C == i) { var_a1 = arg0->unk44->unk0 * 256; } else { var_a1 = arg0->unk44->unk0Ptr->unk12; @@ -1426,7 +1426,7 @@ UNUSED void func_800B3678(Gfx **arg0, MatrixS **arg1, Vertex **arg2) { for (; iObj < nObjs; iObj++) { if (objects[iObj]->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) { if ((s32) objects[iObj]->segment.header & 0x8000) { - func_800B3740(objects[iObj], arg0, arg1, arg2, 0); + func_800B3740((Particle *) objects[iObj], arg0, arg1, arg2, 0); } } } diff --git a/src/particles.h b/src/particles.h index 36e0e87d..6be99579 100644 --- a/src/particles.h +++ b/src/particles.h @@ -16,11 +16,8 @@ typedef struct unk800E2CF0 { u8 unkC; u8 unkD; s16 unkE; - f32 unk10; - u8 unk14; - u8 unk15; - u8 unk16; - u8 unk17; + f32 scale; + ColourRGBA colour; } unk800E2CF0; /* Size: 0x10 bytes */ @@ -40,19 +37,6 @@ typedef struct XYStruct { s16 x, y; } XYStruct; -typedef struct unk800B03C0_arg2 { - u8 pad0[0xC]; - s16 y_rotation; - s16 x_rotation; - s16 z_rotation; - s16 unk12; - s16 unk14; - s16 unk16; - s16 unk18; - s16 unk1A; - s16 unk1C; -} unk800B03C0_arg2; - typedef struct unk800B2260_C_44 { TextureHeader *texture; } unk800B2260_C_44; @@ -67,54 +51,6 @@ typedef struct unk800B1CB8_44 { unk800B1CB8_44_8 **unk8; } unk800B1CB8_44; -typedef struct unk800B1CB8 { - s16 unk0; - s16 unk2; - s16 unk4; - s16 unk6; - f32 unk8; - u8 padC[0xC]; - s16 unk18; - s16 unk1A; - f32 unk1C; - f32 unk20; - f32 unk24; - f32 unk28; - s16 unk2C; - s16 unk2E; - u8 pad30[0x4]; - f32 unk34; - u8 unk38; - u8 unk39; - s16 unk3A; - struct unk800B1CB8 *unk3C; - s32 unk40; - struct unk800B1CB8_44 *unk44; - s16 unk48; - s16 unk4A; - u8 pad4C[0x8]; - f32 *unk54; - f32 unk58; - s16 unk5C; - s16 unk5E; - s16 unk60; - s16 unk62; - s16 unk64; - s16 unk66; - f32 unk68; - ColourRGBA unk6C; -} unk800B1CB8; - -/* Size: 0x78 bytes */ -typedef struct unk800E2CD8 { - unk800B1CB8 unk0; - struct Particle *unk70; - u8 pad74; - u8 unk75; - u8 unk76; - u8 unk77; -} unk800E2CD8; - typedef struct unk800B1130_8 { u8 pad0[6]; s16 unk6; @@ -135,7 +71,16 @@ typedef struct unk800B1130_SP28 { u8 a; } unk800B1130_SP28; -typedef struct Particle { +typedef struct ParticleAngle { + s16 y_rotation; + s16 x_rotation; + s16 z_rotation; + s16 unk12; + s16 unk14; + s16 unk16; +} ParticleAngle; + +typedef struct ParticleData { union { /* 0x0000 */ ParticleBehavior *behaviour; /* 0x0000 */ s32 unk0; @@ -147,76 +92,21 @@ typedef struct Particle { /* 0x000A */ s16 unkA; union { /* 0x000C */ Vec3f pos; + /* 0x000C */ ParticleAngle angle; /* 0x000C */ unk800AF29C_C unkC; - /* 0x000C */ struct Particle2 **unkC_60; + /* 0x000C */ struct Particle **unkC_60; /* 0x000C */ unk800AF29C_C_400 unkC_400; }; /* 0x0018 */ s16 unk18; /* 0x0018 */ s16 unk1A; /* 0x001C */ s16 unk1C; /* 0x001E */ s16 unk1E; - /* 0x0020 */ s16 unk20; - /* 0x0022 */ s16 unk22; - /* 0x0024 */ s16 unk24; - /* 0x0026 */ s16 unk26; - /* 0x0028 */ s16 unk28; - /* 0x002A */ s16 unk2A; + /* 0x0020 */ s32 unk20; + /* 0x0024 */ s32 unk24; + /* 0x0028 */ s32 unk28; /* 0x002C */ s16 unk2C; /* 0x002E */ s16 unk2E; - /* 0x0030 */ f32 unk30; - /* 0x0034 */ f32 unk34; - union { - struct { - /* 0x0038 */ u8 unk38; - /* 0x0039 */ u8 unk39; - /* 0x003A */ s8 unk3A; - /* 0x003B */ s8 unk3B; - } byte; - struct { - /* 0x0038 */ s16 unk38; - /* 0x003A */ s16 unk3A; - } half; - f32 unk38_f32; - } unk38; - /* 0x003C */ f32 unk3C; - /* 0x0040 */ s32 unk40; - - union { - /* 0x0044 */ unk800B0698_44 *unk44; - /* 0x0044 */ TextureHeader *unk44_0; - }; - /* 0x0048 */ s16 behaviorId; - /* 0x004A */ s16 unk4A; - /* 0x004C */ f32 unk4C_f32; - /* 0x0050 */ f32 unk50_f32; - /* 0x0054 */ f32 unk54_f32; - /* 0x0058 */ f32 unk58_f32; - union { - struct { - /* 0x005C */ s16 unk5C; - /* 0x005E */ s16 unk5E; - } unk5C_halfs; - /* 0x005C */ s32 unk5C_s32; - }; - union { - struct { - /* 0x0060 */ s16 unk60; - /* 0x0062 */ s16 unk62; - } unk60_halfs; - /* 0x0060 */ s32 unk60_s32; - }; - /* 0x0064 */ s16 unk64; - /* 0x0066 */ s16 unk66; - union { - /* 0x0068 */ Object_68 **gfxData; - struct { - /* 0x0068 */ s16 unk68; - /* 0x006A */ s16 unk6A; - } unk68_halfs; - }; - /* 0x006C */ s16 unk6C; - /* 0x006E */ s16 unk6E; -} Particle; +} ParticleData; typedef struct ParticleSegment { /* 0x0000 */ ObjectTransform trans; @@ -226,82 +116,59 @@ typedef struct ParticleSegment { /* 0x0020 */ f32 y_velocity; /* 0x0024 */ f32 z_velocity; /* 0x0028 */ f32 unk28; - /* 0x002C */ s16 unk2C; - /* 0x002E */ s16 unk2E; - /* 0x0030 */ f32 unk30; - union { - /* 0x0034 */ f32 unk34; - struct { - /* 0x0034 */ s16 levelSegmentIndex; - /* 0x0036 */ s16 unk36; - }; - } unk34_a; - - union { - struct { - /* 0x0038 */ u8 unk38; - /* 0x0039 */ u8 unk39; - /* 0x003A */ s8 unk3A; // Index value for unk68 array - /* 0x003B */ s8 unk3B; - } byte; - struct { - /* 0x0038 */ s16 unk38; - /* 0x003A */ s16 unk3A; - } half; - } unk38; - - union { - /* 0x003C */ void *unk3C_ptr; - /* 0x003C */ f32 unk3C_f; - } unk3C_a; + SegmentPropertiesObject object; + SegmentPropertiesParticle particle; + SegmentPropertiesCamera camera; + }; + /* 0x003C */ void *unk3C; /* 0x0040 */ s32 unk40; } ParticleSegment; -typedef struct Particle2 { +typedef struct Particle { + union { /* 0x0000 */ ParticleSegment segment; + /* 0x0000 */ ParticleData data; + }; union { /* 0x0044 */ unk800B0698_44 *unk44; /* 0x0044 */ TextureHeader *unk44_0; /* 0x0044 */ unk800B2260_C_44 *unk44_1; + /* 0x0044 */ struct unk800B1CB8_44 *unk44_2; }; /* 0x0048 */ s16 behaviorId; /* 0x004A */ s16 unk4A; - /* 0x004C */ f32 unk4C_f32; - /* 0x0050 */ f32 unk50_f32; - /* 0x0054 */ f32 unk54_f32; - /* 0x0058 */ f32 unk58_f32; + /* 0x004C */ f32 somePosX; + /* 0x0050 */ f32 somePosY; union { - struct { + /* 0x0054 */ f32 somePosZ; + /* 0x0054 */ f32 *unk54_ptr; + }; + /* 0x0058 */ f32 forwardVel; /* 0x005C */ s16 unk5C; /* 0x005E */ s16 unk5E; - } unk5C_halfs; - /* 0x005C */ s32 unk5C_s32; - }; - union { - struct { /* 0x0060 */ s16 unk60; /* 0x0062 */ s16 unk62; - } unk60_halfs; - /* 0x0060 */ s32 unk60_s32; - }; /* 0x0064 */ s16 unk64; /* 0x0066 */ s16 unk66; union { - /* 0x0068 */ Object_68 **gfxData; - struct { - /* 0x0068 */ s16 unk68; - /* 0x006A */ s16 unk6A; - } unk68_halfs; + /* 0x0068 */ u8 unk68b; + /* 0x0068 */ f32 unk68f; }; - /* 0x006C */ s16 unk6C; - /* 0x006E */ s16 unk6E; + /* 0x006C */ ColourRGBA colour; /* 0x0070 */ struct Particle *unk70; /* 0x0074 */ u8 unk74; /* 0x0075 */ u8 unk75; /* 0x0076 */ u8 unk76; - /* 0x0077 */ u8 unk77; -} Particle2; + /* 0x0077 */ s8 unk77; +} Particle; + +// Almost an identical copy of Particle, but a few bytes shorter. Exists to make sure func_800B1CB8 matches. +typedef struct ParticleType { + u8 pad[0x2C]; + s16 unk2C; + u8 pad2[0x42]; +} ParticleType; void func_800AE270(void); void func_800AE2A0(void); @@ -313,23 +180,23 @@ void func_800AEE14(unk800AF024 *arg0, Vertex **arg1, Triangle **arg2); void func_800AEEB8(unk800AF024 *arg0, Vertex **arg1, Triangle **arg2); void func_800AEF88(unk800AF024 *arg0, Vertex **arg1, Triangle **arg2); void func_800AF024(unk800AF024 *arg0, Vertex **arg1, Triangle **arg2); -void func_800AF0A4(Object *obj); -void func_800AF0F0(Object *obj); +void func_800AF0A4(Particle *particle); +void func_800AF0F0(Particle *particle); void partInitTrigger(Particle *arg0, s32 arg1, s32 arg2); void func_800AF29C(Particle *arg0, s32 arg1, s32 arg2, s16 arg3, s16 arg4, s16 arg5); void func_800AF6E4(Object *obj, s32 arg1); void func_800B2260(Particle *arg0); -void func_800B263C(Particle2 *arg0); +void func_800B263C(Particle *arg0); void init_particle_assets(void); -void func_800B2FBC(Particle2 *arg0); -void func_800B03C0(Particle2 *arg0, ObjectTransform *arg1, unk800B03C0_arg2 *arg2, ParticleBehavior *arg3); -void func_800B2040(Particle2 *arg0); -void func_800B22FC(Particle2 *arg0, s32 arg1); -void func_800B0010(Particle2 *arg0, Particle2 *arg1, unk800B03C0_arg2 *arg2, ParticleBehavior *arg3); -Particle2 *func_800B0698(unk800B1CB8 *arg0, Particle *arg1); -unk800B1CB8 *func_800B1CB8(s32 arg0); -void func_800AFE5C(unk800B1CB8 *arg0, Particle *arg1); -Particle2 *func_800B1130(unk800B1CB8 *arg0, Particle *arg1); +void func_800B2FBC(Particle *arg0); +void func_800B03C0(Particle *arg0, Particle *arg1, Particle *arg2, ParticleBehavior *arg3); +void func_800B2040(Particle *arg0); +void func_800B22FC(Particle *arg0, s32 arg1); +void func_800B0010(Particle *arg0, Particle *arg1, Particle *arg2, ParticleBehavior *arg3); +Particle *func_800B0698(Particle *arg0, Particle *arg1); +Particle *func_800B1CB8(s32 arg0); +void func_800AFE5C(Particle *arg0, Particle *arg1); +Particle *func_800B1130(Particle *arg0, Particle *arg1); void func_800AF52C(Object *obj, s32 arg1); void func_800AF134(Particle *arg0, s32 arg1, s32 arg2, s16 arg3, s16 arg4, s16 arg5); @@ -337,14 +204,14 @@ void func_800AF404(s32 arg0); // Non Matching void func_800AFC3C(Object *, s32); // Non Matching void func_800AE728(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5); // Non Matching void func_800AF714(Object*, s32); // Non matching -Object *func_800B0BAC(); +Particle *func_800B0BAC(); void func_800B26E0(); -void func_800B3140(Particle2 *); -void func_800B3240(Particle2 *); -void func_800B3358(Particle2 *); -void func_800B34B0(Particle2 *); -void func_800B3564(Particle2 *); -void func_800B3740(Object *, Gfx **, MatrixS **, Vertex **, s32); // Non Matching +void func_800B3140(Particle *); +void func_800B3240(Particle *); +void func_800B3358(Particle *); +void func_800B34B0(Particle *); +void func_800B3564(Particle *); +void func_800B3740(Particle *, Gfx **, MatrixS **, Vertex **, s32); // Non Matching void func_800B4668(Object*, s32, s32, s32); void func_800B46BC(Object*, s32, s32, s32); diff --git a/src/racer.c b/src/racer.c index 806d9a7e..e5c96d3e 100644 --- a/src/racer.c +++ b/src/racer.c @@ -2039,9 +2039,9 @@ void update_camera_loop(f32 updateRateF, Object *obj, Object_Racer *racer) { gCameraObject->segmentIndex = segmentIndex; } racer->unk196 = gCameraObject->trans.y_rotation; - gCameraObject->trans.x_position += gCameraObject->x_velocity; - gCameraObject->trans.y_position += gCameraObject->y_velocity; - gCameraObject->trans.z_position += gCameraObject->z_velocity; + gCameraObject->trans.x_position += gCameraObject->offsetX; + gCameraObject->trans.y_position += gCameraObject->offsetY; + gCameraObject->trans.z_position += gCameraObject->offsetZ; } /** @@ -5022,17 +5022,17 @@ void update_player_camera(Object *obj, Object_Racer *racer, f32 updateRateF) { break; } dialogueAngle = gDialogueCameraAngle / 10240.0f; // Goes between 0-1 - gCameraObject->x_velocity = (((obj->segment.trans.x_position + (91.75 * racer->ox1) + (90.0 * racer->ox3)) - gCameraObject->trans.x_position) * dialogueAngle); - gCameraObject->z_velocity = (((obj->segment.trans.z_position + (91.75 * racer->oz1) + (90.0 * racer->oz3)) - gCameraObject->trans.z_position) * dialogueAngle); - gCameraObject->y_velocity = (((get_npc_pos_y() + 48.5) - gCameraObject->trans.y_position) * dialogueAngle); + gCameraObject->offsetX = (((obj->segment.trans.x_position + (91.75 * racer->ox1) + (90.0 * racer->ox3)) - gCameraObject->trans.x_position) * dialogueAngle); + gCameraObject->offsetZ = (((obj->segment.trans.z_position + (91.75 * racer->oz1) + (90.0 * racer->oz3)) - gCameraObject->trans.z_position) * dialogueAngle); + gCameraObject->offsetY = (((get_npc_pos_y() + 48.5) - gCameraObject->trans.y_position) * dialogueAngle); gCameraObject->unk38 = -gCameraObject->trans.x_rotation * dialogueAngle; - gCameraObject->trans.x_position += gCameraObject->x_velocity; - gCameraObject->trans.y_position += gCameraObject->y_velocity + gCameraObject->unk30; - gCameraObject->trans.z_position += gCameraObject->z_velocity; + gCameraObject->trans.x_position += gCameraObject->offsetX; + gCameraObject->trans.y_position += gCameraObject->offsetY + gCameraObject->unk30; + gCameraObject->trans.z_position += gCameraObject->offsetZ; if (!gRaceStartTimer && !gDialogueCameraAngle) { - gCameraObject->x_velocity = gCameraObject->x_velocity * 0.95; - gCameraObject->y_velocity = gCameraObject->y_velocity * 0.95; - gCameraObject->z_velocity = gCameraObject->z_velocity * 0.95; + gCameraObject->offsetX *= 0.95; + gCameraObject->offsetY *= 0.95; + gCameraObject->offsetZ *= 0.95; } angle = gDialogueCameraAngle; if (angle > 0x1400) { @@ -5077,9 +5077,9 @@ void second_racer_camera_update(Object *obj, Object_Racer *racer, s32 mode, f32 gCameraObject->mode = mode; update_player_camera(obj, racer, updateRateF); if (gRaceStartTimer == 0 && D_8011D582 == 0) { - gCameraObject->x_velocity = xPos - gCameraObject->trans.x_position; - gCameraObject->y_velocity = yPos - (gCameraObject->trans.y_position + gCameraObject->unk30); - gCameraObject->z_velocity = zPos - gCameraObject->trans.z_position; + gCameraObject->offsetX = xPos - gCameraObject->trans.x_position; + gCameraObject->offsetY = yPos - (gCameraObject->trans.y_position + gCameraObject->unk30); + gCameraObject->offsetZ = zPos - gCameraObject->trans.z_position; } } } diff --git a/src/racer.h b/src/racer.h index a67d4771..c8f6f032 100644 --- a/src/racer.h +++ b/src/racer.h @@ -107,9 +107,9 @@ typedef struct ObjectCamera { /* 0x0018 */ f32 unk18; /* 0x001C */ f32 unk1C; /* 0x0020 */ f32 unk20; - /* 0x0024 */ f32 x_velocity; - /* 0x0028 */ f32 y_velocity; - /* 0x002C */ f32 z_velocity; + /* 0x0024 */ f32 offsetX; + /* 0x0028 */ f32 offsetY; + /* 0x002C */ f32 offsetZ; /* 0x0030 */ f32 unk30; /* 0x0034 */ s16 segmentIndex; /* 0x0036 */ s16 mode;