diff --git a/include/structs.h b/include/structs.h index 2a21a89e..e110f718 100644 --- a/include/structs.h +++ b/include/structs.h @@ -816,32 +816,6 @@ typedef struct ObjectHeader { u8 pad73[0x5]; } ObjectHeader; -typedef struct Object_44_0 { - u8 unk0; - u8 unk1; -} Object_44_0; - -typedef struct Object_44_C { - u8 pad0[0x4]; - s16 unk4; - s16 unk6; - s16 unk8; - s16 unkA; - s16 unkC; - s16 unkE; - u8 pad10[0x6]; - s16 unk16; - s16 unk18; - s16 unk1A; - s16 unk1C; -} Object_44_C; - -typedef struct Object_44 { - Object_44_0 *unk0; - u8 pad4[8]; - Object_44_C *unkC; -} Object_44; - typedef struct ObjectInteraction { /* 0x00 */ struct Object *obj; /* 0x04 */ f32 x_position; @@ -1722,70 +1696,6 @@ typedef struct Object_68 { /* 0x50 */ s16 unk50; } Object_68; -/* Size: 0xA0 bytes */ -typedef struct ParticleBehavior { - s32 flags; - f32 velX; - f32 velY; - f32 velZ; - f32 unk10; - s16 unk14; - s16 unk16; - s16 unk18; - s16 unk1A; - s16 unk1C; - s16 unk1E; - s16 unk20; - s16 unk22; - s16 unk24; - s16 unk26; - s16 unk28; - s16 unk2A; - s16 unk2C; - s16 unk2E; - f32 unk30; - f32 unk34; - f32 unk38; - f32 unk3C; - s16 unk40; - s16 unk42; - s16 angleOffsetY; - s16 angleOffsetX; - s16 angleOffsetZ; - s16 angleVelY; - s16 angleVelX; - s16 angleVelZ; - f32 unk50; - f32 unk54; - f32 forwardVel; - s32 behaviourFlags; - 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; // 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; - typedef struct unk800AF29C_C_400 { s32 *unkC; s16 unk10; @@ -1831,8 +1741,8 @@ typedef struct SegmentPropertiesObject { } SegmentPropertiesObject; typedef struct SegmentPropertiesParticle { - /* 0x002C */ s16 unk2C; - /* 0x002E */ s16 blockID; + /* 0x002C */ s16 kind; + /* 0x002E */ s16 segmentID; /* 0x0030 */ f32 unk30; /* 0x0034 */ f32 unk34; /* 0x0038 */ u8 unk38; @@ -1912,7 +1822,7 @@ typedef struct Object { /* 0x0068 */ Object_68 **unk68; //player + 0x80 /* 0x006C */ struct ParticleEmitter *particleEmitter; //player + 0x370 /* 0x0070 */ Object_LightData **lightData; - /* 0x0074 */ u32 particleEmitFlags; + /* 0x0074 */ u32 particleEmittersEnabled; /* 0x0078 */ ObjProperties properties; /* 0x0080 */ void *unk80; /* 0x0084 */ u32 unk84; diff --git a/src/game_ui.c b/src/game_ui.c index dab1bfc9..03bc33b5 100644 --- a/src/game_ui.c +++ b/src/game_ui.c @@ -3490,13 +3490,13 @@ void hud_draw_model(ObjectModel *objModel) { s32 textureEnabled; s32 i; s32 texIndex; - s32 flags; + s32 randomizationFlags; numBatches = objModel->numberOfBatches; for (i = 0; i < numBatches; i++) { - flags = objModel->batches[i].flags; - if (!(flags & RENDER_Z_UPDATE)) { + randomizationFlags = objModel->batches[i].flags; + if (!(randomizationFlags & RENDER_Z_UPDATE)) { vertOffset = objModel->batches[i].verticesOffset; triOffset = objModel->batches[i].facesOffset; numVerts = objModel->batches[i + 1].verticesOffset - vertOffset; @@ -3510,7 +3510,7 @@ void hud_draw_model(ObjectModel *objModel) { } else { texPtr = objModel->textures[texIndex].texture; } - load_and_set_texture_no_offset(&gHudDL, texPtr, flags & ~RENDER_Z_COMPARE); + load_and_set_texture_no_offset(&gHudDL, texPtr, randomizationFlags & ~RENDER_Z_COMPARE); gSPVertexDKR(gHudDL++, OS_PHYSICAL_TO_K0(verts), numVerts, 0); if (texPtr == NULL) { textureEnabled = TRIN_DISABLE_TEXTURE; diff --git a/src/menu.c b/src/menu.c index c7661253..78462819 100644 --- a/src/menu.c +++ b/src/menu.c @@ -13844,7 +13844,7 @@ void menu_element_render(s32 elementID) { */ void render_track_selection_viewport_border(ObjectModel *objMdl) { UNUSED s32 pad1[4]; - s32 flags; + s32 randomizationFlags; UNUSED s32 pad2[4]; TextureHeader *tex; Triangle *tris; @@ -13857,9 +13857,9 @@ void render_track_selection_viewport_border(ObjectModel *objMdl) { s32 texEnabled; s32 i; - flags = RENDER_FOG_ACTIVE | RENDER_ANTI_ALIASING; + randomizationFlags = RENDER_FOG_ACTIVE | RENDER_ANTI_ALIASING; if (sMenuGuiOpacity != 255) { - flags = RENDER_FOG_ACTIVE | RENDER_SEMI_TRANSPARENT | RENDER_ANTI_ALIASING; + randomizationFlags = RENDER_FOG_ACTIVE | RENDER_SEMI_TRANSPARENT | RENDER_ANTI_ALIASING; } for (i = 0; i < objMdl->numberOfBatches; i++) { if (!(objMdl->batches[i].flags & RENDER_Z_UPDATE)) { @@ -13879,7 +13879,7 @@ void render_track_selection_viewport_border(ObjectModel *objMdl) { texEnabled = TRUE; texOffset = objMdl->batches[i].unk7 << 14; } - load_and_set_texture(&sMenuCurrDisplayList, tex, flags, texOffset); + load_and_set_texture(&sMenuCurrDisplayList, tex, randomizationFlags, texOffset); gSPVertexDKR(sMenuCurrDisplayList++, OS_PHYSICAL_TO_K0(verts), numVerts, 0); gSPPolygon(sMenuCurrDisplayList++, OS_PHYSICAL_TO_K0(tris), numTris, texEnabled); diff --git a/src/object_functions.c b/src/object_functions.c index e0eec29e..7af9162e 100644 --- a/src/object_functions.c +++ b/src/object_functions.c @@ -162,7 +162,7 @@ void obj_loop_scenery(Object *obj, s32 updateRate) { } else { particleFlagShift = get_random_number_from_range(0, obj->segment.header->particleCount - 1); } - obj->particleEmitFlags = OBJ_EMIT_1 << particleFlagShift; + obj->particleEmittersEnabled = OBJ_EMIT_1 << particleFlagShift; obj_spawn_particle(obj, LOGIC_30FPS); } } @@ -277,7 +277,7 @@ void obj_loop_fireball_octoweapon(Object *obj, s32 updateRate) { } } if (obj->behaviorId == BHV_FIREBALL_OCTOWEAPON) { - obj->particleEmitFlags = OBJ_EMIT_1; + obj->particleEmittersEnabled = OBJ_EMIT_1; obj_spawn_particle(obj, updateRate); obj->properties.fireball.timer -= updateRate; if (obj->properties.fireball.timer < 0) { @@ -1907,7 +1907,7 @@ void obj_loop_wizpigship(Object *wizShipObj, s32 updateRate) { wizShipObj->properties.fireball.timer = 0; } if ((wizShipObj->unk60 != NULL) && (wizShipObj->properties.fireball.timer == 0)) { - if (wizShipObj->particleEmitFlags & OBJ_EMIT_1) { + if (wizShipObj->particleEmittersEnabled & OBJ_EMIT_1) { wizShipObj->properties.fireball.timer = 20; object_transform_to_matrix(shipMtx, &wizShipObj->segment.trans); trans.x_position = 0.0f; @@ -2055,7 +2055,7 @@ void obj_loop_char_select(Object *charSelectObj, s32 updateRate) { var_s0 = 0; func_8001F460(charSelectObj, updateRate, NULL); charSelect = &charSelectObj->unk64->characterSelect; - charSelectObj->particleEmitFlags = OBJ_EMIT_NONE; + charSelectObj->particleEmittersEnabled = OBJ_EMIT_NONE; if (charSelect != NULL) { gfxData = charSelectObj->unk68[charSelectObj->segment.object.modelIndex]; if (gfxData != NULL) { @@ -2101,7 +2101,7 @@ void obj_loop_char_select(Object *charSelectObj, s32 updateRate) { status = charselect_status(); for (i2 = 0; i2 < sp4F; i2++) { if (status[sp50[i2]] == 1) { - charSelectObj->particleEmitFlags = OBJ_EMIT_1; + charSelectObj->particleEmittersEnabled = OBJ_EMIT_1; obj_spawn_particle(charSelectObj, LOGIC_30FPS); } } @@ -2286,7 +2286,7 @@ void obj_init_bombexplosion(Object *obj, LevelObjectEntry_BombExplosion *entry) if (entry->unk8) { obj->properties.bombExplosion.unk4 |= (entry2->unk8 << 8) & 0xFF00; } - obj->particleEmitFlags = OBJ_EMIT_1; + obj->particleEmittersEnabled = OBJ_EMIT_1; } void obj_loop_bombexplosion(Object *obj, s32 updateRate) { @@ -2309,10 +2309,10 @@ void obj_loop_bombexplosion(Object *obj, s32 updateRate) { free_object(obj); } - if (obj->particleEmitFlags) { + if (obj->particleEmittersEnabled) { if (get_number_of_active_players() < THREE_PLAYERS) { obj_spawn_particle(obj, LOGIC_30FPS); - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; } } } @@ -2572,7 +2572,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { } taj = (Object_NPC *) obj->unk64; levelHeader = get_current_level_header(); - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; if (obj->segment.animFrame == 0 && taj->animFrameF > 1.0) { taj->animFrameF = 0.0f; } @@ -2811,10 +2811,10 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { racer_set_dialogue_camera(); taj->animFrameF += updateRateF * 2.0; if (taj->animFrameF > 25.0) { - obj->particleEmitFlags = OBJ_EMIT_1 | OBJ_EMIT_2 | OBJ_EMIT_4; + obj->particleEmittersEnabled = OBJ_EMIT_1 | OBJ_EMIT_2 | OBJ_EMIT_4; } if (taj->animFrameF > 50.0) { - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; } if (taj->animFrameF > 60.0) { taj->animFrameF = 60.0f; @@ -3420,7 +3420,7 @@ void obj_loop_goldenballoon(Object *obj, s32 updateRate) { flag = 0x10000 << levelEntry->goldenBalloon.balloonID; if (settings->courseFlagsPtr[settings->courseId] & flag) { if (obj->properties.npc.timer > 0) { - obj->particleEmitFlags = OBJ_EMIT_2; + obj->particleEmittersEnabled = OBJ_EMIT_2; obj_spawn_particle(obj, updateRate); obj->properties.npc.timer -= updateRate; } else { @@ -3452,7 +3452,7 @@ void obj_loop_goldenballoon(Object *obj, s32 updateRate) { sound_play_spatial(SOUND_COLLECT_BALLOON, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, NULL); obj->properties.npc.timer = 16; - obj->particleEmitFlags = OBJ_EMIT_2; + obj->particleEmittersEnabled = OBJ_EMIT_2; obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; obj_spawn_particle(obj, updateRate); } @@ -3899,7 +3899,7 @@ void obj_loop_trigger(Object *obj, UNUSED s32 updateRate) { f32 diffY; f32 diffZ; f32 radiusF; - s32 flags; + s32 randomizationFlags; f32 distance; s32 courseFlags; @@ -3909,9 +3909,9 @@ void obj_loop_trigger(Object *obj, UNUSED s32 updateRate) { courseFlags = settings->courseFlagsPtr[settings->courseId]; curRaceType = get_current_level_race_type(); if (triggerEntry->index >= 0) { - flags = 0x10000 << triggerEntry->index; + randomizationFlags = 0x10000 << triggerEntry->index; if (obj->interactObj->distance < trigger->radius) { - if (((u8) curRaceType != RACETYPE_HUBWORLD) || !(courseFlags & flags)) { + if (((u8) curRaceType != RACETYPE_HUBWORLD) || !(courseFlags & randomizationFlags)) { radiusF = trigger->radius; racers = get_racer_objects(&numRacers); for (i = 0; i < numRacers; i++) { @@ -3928,7 +3928,7 @@ void obj_loop_trigger(Object *obj, UNUSED s32 updateRate) { (trigger->directionZ * racerObj->segment.trans.z_position) + trigger->rotationDiff; if (distance < 0.0f) { - settings->courseFlagsPtr[settings->courseId] |= flags; + settings->courseFlagsPtr[settings->courseId] |= randomizationFlags; if (triggerEntry->unkB != 0xFF) { set_current_text(triggerEntry->unkB); } @@ -4352,7 +4352,7 @@ void obj_loop_banana(Object *obj, s32 updateRate) { if (properties->status == BANANA_COLLECTED) { obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; properties->destroyTimer -= updateRate; - obj->particleEmitFlags = OBJ_EMIT_1; + obj->particleEmittersEnabled = OBJ_EMIT_1; obj_spawn_particle(obj, updateRate); if (properties->destroyTimer <= 0) { free_object(obj); @@ -4451,7 +4451,7 @@ void obj_loop_banana(Object *obj, s32 updateRate) { free_object(obj); } else { properties->status = BANANA_COLLECTED; - obj->particleEmitFlags = OBJ_EMIT_1; + obj->particleEmittersEnabled = OBJ_EMIT_1; obj_spawn_particle(obj, updateRate); } } @@ -4545,7 +4545,7 @@ void obj_loop_silvercoin(Object *obj, s32 updateRate) { } if (obj->properties.npc.timer > 0) { obj->properties.npc.timer -= updateRate; - obj->particleEmitFlags = OBJ_EMIT_1; + obj->particleEmittersEnabled = OBJ_EMIT_1; obj_spawn_particle(obj, updateRate); } } @@ -4687,7 +4687,7 @@ void obj_loop_weaponballoon(Object *weaponBalloonObj, s32 updateRate) { weaponBalloonObj->segment.trans.flags &= ~OBJ_FLAGS_INVISIBLE; } if (weaponBalloonObj->properties.weaponBalloon.particleTimer > 0) { - weaponBalloonObj->particleEmitFlags = OBJ_EMIT_1; + weaponBalloonObj->particleEmittersEnabled = OBJ_EMIT_1; obj_spawn_particle(weaponBalloonObj, updateRate); weaponBalloonObj->properties.weaponBalloon.particleTimer -= updateRate; } @@ -4766,7 +4766,7 @@ void obj_loop_weaponballoon(Object *weaponBalloonObj, s32 updateRate) { sound_play(SOUND_COLLECT_ITEM + racer->balloon_level, NULL); } } - weaponBalloonObj->particleEmitFlags = OBJ_EMIT_1; + weaponBalloonObj->particleEmittersEnabled = OBJ_EMIT_1; obj_spawn_particle(weaponBalloonObj, updateRate); weaponBalloon->respawnTime = 90; } @@ -5081,7 +5081,7 @@ void homing_rocket_prevent_overshoot(Object *obj, s32 updateRate, Object_Weapon } play_rocket_trailing_sound(obj, rocket, SOUND_HOMING_ROCKET); if (get_number_of_active_players() < 3) { - obj->particleEmitFlags |= OBJ_EMIT_1; + obj->particleEmittersEnabled |= OBJ_EMIT_1; obj_spawn_particle(obj, updateRate); } } @@ -5264,7 +5264,7 @@ void weapon_trap(Object *weaponObj, s32 updateRate) { } } if (weaponProperties->status == WEAPON_DESTROY) { - weaponObj->particleEmitFlags = OBJ_EMIT_1; + weaponObj->particleEmittersEnabled = OBJ_EMIT_1; obj_spawn_particle(weaponObj, updateRate); weaponObj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; weaponProperties->scale -= updateRate; @@ -6289,9 +6289,9 @@ void obj_init_bubbler(Object *obj, LevelObjectEntry_Bubbler *entry) { */ void obj_loop_bubbler(Object *obj, s32 updateRate) { if (obj->properties.common.unk0 >= get_random_number_from_range(0, 1024)) { - obj->particleEmitFlags = OBJ_EMIT_1; + obj->particleEmittersEnabled = OBJ_EMIT_1; } else { - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; } if (get_number_of_active_players() < 2) { obj_spawn_particle(obj, updateRate); @@ -6328,9 +6328,9 @@ void obj_loop_rangetrigger(Object *obj, s32 updateRate) { entry = &obj->segment.level_entry->rangeTrigger; if (obj_dist_racer(obj->segment.trans.x_position, 0, obj->segment.trans.z_position, entry->radius, 1, objs) > 0) { - obj->particleEmitFlags = entry->particleFlags; + obj->particleEmittersEnabled = entry->particleFlags; } else { - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; } obj_spawn_particle(obj, updateRate); } diff --git a/src/objects.c b/src/objects.c index 043e9698..bcd63b99 100644 --- a/src/objects.c +++ b/src/objects.c @@ -1630,7 +1630,7 @@ UNUSED s32 particle_count(void) { return gParticleCount; } -void func_8000E9D0(Object *obj) { +void add_particle_to_entity_list(Object *obj) { obj->segment.trans.flags |= OBJ_FLAGS_DEACTIVATED; func_800245B4(obj->segment.object.unk2C | (OBJ_FLAGS_DEACTIVATED | OBJ_FLAGS_INVISIBLE)); gObjPtrList[gObjectCount++] = obj; @@ -2754,7 +2754,7 @@ void render_3d_misc(Object *obj) { */ void render_3d_billboard(Object *obj) { s32 intensity; - s32 flags; + s32 randomizationFlags; s32 alpha; s32 hasPrimCol; s32 hasEnvCol; @@ -2765,7 +2765,7 @@ void render_3d_billboard(Object *obj) { intensity = 255; hasPrimCol = FALSE; hasEnvCol = FALSE; - flags = obj->segment.trans.flags | RENDER_Z_UPDATE | RENDER_FOG_ACTIVE; + randomizationFlags = obj->segment.trans.flags | RENDER_Z_UPDATE | RENDER_FOG_ACTIVE; if (obj->shading != NULL) { hasPrimCol = TRUE; hasEnvCol = TRUE; @@ -2793,7 +2793,7 @@ void render_3d_billboard(Object *obj) { } if (alpha < 255) { - flags |= RENDER_SEMI_TRANSPARENT; + randomizationFlags |= RENDER_SEMI_TRANSPARENT; hasPrimCol = TRUE; } if ((obj->behaviorId == 5) && (obj->segment.trans.scale == 6.0f)) { @@ -2846,7 +2846,7 @@ void render_3d_billboard(Object *obj) { RENDER_Z_COMPARE | RENDER_SEMI_TRANSPARENT | RENDER_Z_UPDATE); } else { render_sprite_billboard(&gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, obj, - (unk80068514_arg4 *) gfxData, flags); + (unk80068514_arg4 *) gfxData, randomizationFlags); } if (hasPrimCol) { gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, 255, 255, 255, 255); @@ -2870,7 +2870,7 @@ void render_3d_model(Object *obj) { s32 obj60_unk0; s32 hasOpacity; s32 hasEnvCol; - s32 flags; + s32 randomizationFlags; s32 meshBatch; s32 cicFailed; f32 vtxX; @@ -2907,18 +2907,18 @@ void render_3d_model(Object *obj) { obj_animate(obj); } if (obj68->modelType != MODELTYPE_BASIC && objModel->unk40 != NULL) { - flags = TRUE; + randomizationFlags = TRUE; if (racerObj != NULL && racerObj->vehicleID < VEHICLE_BOSSES && racerObj->playerIndex == PLAYER_COMPUTER) { - flags = FALSE; + randomizationFlags = FALSE; } if (get_viewport_count() != VIEWPORTS_COUNT_1_PLAYER) { - flags = FALSE; + randomizationFlags = FALSE; } obj->curVertData = (Vertex *) obj68->vertices[obj68->animationTaskNum]; if (obj->behaviorId == BHV_UNK_3F) { // 63 = stopwatchicon, stopwatchhand obj_shade_fancy(objModel, obj, 0, gCurrentLightIntensity); - } else if (flags) { + } else if (randomizationFlags) { obj_shade_fancy(objModel, obj, -1, gCurrentLightIntensity); } else { obj_shade_fast(objModel, obj, gCurrentLightIntensity); @@ -3008,12 +3008,12 @@ void render_3d_model(Object *obj) { loopObj->segment.trans.y_position += vtxY; loopObj->segment.trans.z_position += vtxZ; if (loopObj->segment.header->modelType == OBJECT_MODEL_TYPE_SPRITE_BILLBOARD) { - flags = (RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_Z_UPDATE); + randomizationFlags = (RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_Z_UPDATE); } else { - flags = (RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_Z_UPDATE | RENDER_ANTI_ALIASING); + randomizationFlags = (RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_Z_UPDATE | RENDER_ANTI_ALIASING); } if (alpha < 255) { - flags |= RENDER_SEMI_TRANSPARENT; + randomizationFlags |= RENDER_SEMI_TRANSPARENT; } #ifdef ANTI_TAMPER cicFailed = FALSE; @@ -3036,7 +3036,7 @@ void render_3d_model(Object *obj) { } loopObj->properties.common.unk0 = render_sprite_billboard( &gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, loopObj, - (unk80068514_arg4 *) something, flags); + (unk80068514_arg4 *) something, randomizationFlags); if (var_v0_2) { gDkrInsertMatrix(gObjectCurrDisplayList++, 0, 0); func_80012CE8(&gObjectCurrDisplayList); @@ -3055,7 +3055,7 @@ void render_3d_model(Object *obj) { if (loopObj != NULL) { index = obj->segment.header->unk58; if (index >= 0 && index < objModel->unk18) { - flags = (RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_Z_UPDATE); + randomizationFlags = (RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_Z_UPDATE); something = loopObj->unk68[loopObj->segment.object.modelIndex]; vtxX = obj->curVertData[objModel->unk14[index]].x; vtxY = obj->curVertData[objModel->unk14[index]].y; @@ -3065,7 +3065,7 @@ void render_3d_model(Object *obj) { loopObj->segment.trans.z_position += (vtxZ - loopObj->segment.trans.z_position) * 0.25; if (loopObj->segment.header->modelType == OBJECT_MODEL_TYPE_SPRITE_BILLBOARD) { render_sprite_billboard(&gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, - loopObj, (unk80068514_arg4 *) something, flags); + loopObj, (unk80068514_arg4 *) something, randomizationFlags); } } } @@ -3347,7 +3347,7 @@ void func_80012F94(Object *obj) { void render_object_parts(Object *obj) { func_80012F94(obj); if (obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) { - render_particle((Particle *) obj, &gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, 0x8000); + render_particle((Particle *) obj, &gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, PARTICLE_F40_8000); } else { if (obj->segment.header->modelType == OBJECT_MODEL_TYPE_3D_MODEL) { render_3d_model(obj); @@ -6435,7 +6435,7 @@ void obj_taj_create_balloon(s32 blockID, f32 x, f32 y, f32 z) { * Has a different response depending on whether the challenge was aborted or finished. */ void mode_end_taj_race(s32 reason) { - s32 flags; + s32 randomizationFlags; s32 i; Object_Racer *racer; Settings *settings; @@ -6476,13 +6476,13 @@ void mode_end_taj_race(s32 reason) { if (reason == CHALLENGE_END_FINISH) { if (racer->finishPosition == 1) { settings = get_settings(); - flags = racer->vehicleID; - flags = 1 << (flags + 3); - if (settings->tajFlags & flags) { + randomizationFlags = racer->vehicleID; + randomizationFlags = 1 << (randomizationFlags + 3); + if (settings->tajFlags & randomizationFlags) { set_next_taj_challenge_menu(5); } else { set_next_taj_challenge_menu(racer->vehicleID + 6); - settings->tajFlags |= flags; + settings->tajFlags |= randomizationFlags; safe_mark_write_save_file(get_save_file_index()); } } else { @@ -7065,74 +7065,74 @@ void run_object_init_func(Object *obj, void *entry, s32 param) { * This includes things like shadow data, interaction and visuals. */ s32 obj_init_property_flags(s32 behaviorId) { - s32 flags = OBJECT_SPAWN_NONE; + s32 randomizationFlags = OBJECT_SPAWN_NONE; switch (behaviorId) { case BHV_RACER: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_UNK04 | OBJECT_SPAWN_ANIMATION | + randomizationFlags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_UNK04 | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE; break; case BHV_SCENERY: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_INTERACTIVE; + randomizationFlags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_INTERACTIVE; break; case BHV_WEAPON: - flags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_UNK04 | OBJECT_SPAWN_INTERACTIVE; + randomizationFlags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_UNK04 | OBJECT_SPAWN_INTERACTIVE; break; case BHV_DINO_WHALE: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE; + randomizationFlags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE; break; case BHV_DOOR: case BHV_TT_DOOR: - flags = OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_UNK20; + randomizationFlags = OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_UNK20; break; case BHV_WEAPON_BALLOON: case BHV_GOLDEN_BALLOON: - flags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_INTERACTIVE; + randomizationFlags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_INTERACTIVE; break; case BHV_HIT_TESTER: case BHV_HIT_TESTER_2: case BHV_SNOWBALL: case BHV_SNOWBALL_2: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE | + randomizationFlags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_UNK20; break; case BHV_SNOWBALL_3: case BHV_SNOWBALL_4: case BHV_HIT_TESTER_3: case BHV_HIT_TESTER_4: - flags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_UNK20; + randomizationFlags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_UNK20; break; case BHV_UNK_18: - flags = OBJECT_SPAWN_UNK04; + randomizationFlags = OBJECT_SPAWN_UNK04; break; case BHV_STOPWATCH_MAN: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE; + randomizationFlags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE; break; case BHV_BANANA: case BHV_WORLD_KEY: case BHV_SILVER_COIN: case BHV_SILVER_COIN_2: - flags = OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_SHADOW; + randomizationFlags = OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_SHADOW; break; case BHV_LOG: - flags = OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_UNK20; + randomizationFlags = OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_UNK20; break; case BHV_BRIDGE_WHALE_RAMP: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_UNK20; + randomizationFlags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_UNK20; break; case BHV_RAMP_SWITCH: - flags = OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_SHADOW; + randomizationFlags = OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_SHADOW; break; case BHV_SEA_MONSTER: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_ANIMATION; + randomizationFlags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_ANIMATION; break; case BHV_COLLECT_EGG: - flags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_INTERACTIVE; + randomizationFlags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_INTERACTIVE; break; case BHV_UNK_30: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_ANIMATION; + randomizationFlags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_ANIMATION; break; case BHV_UNK_3F: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_ANIMATION; + randomizationFlags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_ANIMATION; break; case BHV_ANIMATED_OBJECT: case BHV_VEHICLE_ANIMATION: @@ -7140,22 +7140,22 @@ s32 obj_init_property_flags(s32 behaviorId) { case BHV_WIZPIG_SHIP: case BHV_ANIMATED_OBJECT_4: case BHV_PIG_ROCKETEER: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION; + randomizationFlags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION; break; case BHV_CHARACTER_SELECT: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION; + randomizationFlags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION; break; case BHV_TROPHY_CABINET: case BHV_DYNAMIC_LIGHT_OBJECT_2: case BHV_ROCKET_SIGNPOST: case BHV_ROCKET_SIGNPOST_2: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_UNK20; + randomizationFlags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_UNK20; break; case BHV_UNK_5B: - flags = OBJECT_SPAWN_UNK01; + randomizationFlags = OBJECT_SPAWN_UNK01; break; case BHV_ANIMATED_OBJECT_2: - flags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION; + randomizationFlags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION; break; case BHV_EXIT: case BHV_CHECKPOINT: @@ -7174,27 +7174,27 @@ s32 obj_init_property_flags(s32 behaviorId) { case BHV_TELEPORT: case BHV_FIREBALL_OCTOWEAPON: case BHV_FIREBALL_OCTOWEAPON_2: - flags = OBJECT_SPAWN_INTERACTIVE; + randomizationFlags = OBJECT_SPAWN_INTERACTIVE; break; case BHV_ZIPPER_GROUND: - flags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_INTERACTIVE; + randomizationFlags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_INTERACTIVE; break; case BHV_ANIMATION: case BHV_CAMERA_ANIMATION: case BHV_BUTTERFLY: - flags = OBJECT_SPAWN_SHADOW; + randomizationFlags = OBJECT_SPAWN_SHADOW; break; case BHV_PARK_WARDEN: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE; + randomizationFlags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE; break; case BHV_FROG: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION; + randomizationFlags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION; break; case BHV_UNK_72: - flags = OBJECT_SPAWN_UNK01; + randomizationFlags = OBJECT_SPAWN_UNK01; break; } - return flags; + return randomizationFlags; } /** diff --git a/src/objects.h b/src/objects.h index c9fad43a..d234a55c 100644 --- a/src/objects.h +++ b/src/objects.h @@ -362,7 +362,7 @@ Object *get_object(s32 index); Object **objGetObjList(s32 *arg0, s32 *cnt); s32 obj_count(void); s32 particle_count(void); -void func_8000E9D0(Object *obj); +void add_particle_to_entity_list(Object *obj); void free_object(Object *); s32 obj_table_ids(void); s32 obj_id_valid(s32 arg0); diff --git a/src/particles.c b/src/particles.c index 78f7c7dd..2490cd48 100644 --- a/src/particles.c +++ b/src/particles.c @@ -42,15 +42,15 @@ Particle *gTriangleParticleBuffer = NULL; s32 gNumRectangleParticles = 0; s32 D_800E2CB0 = 0; Particle *gRectangleParticleBuffer = NULL; -s32 gNumPointParticles = 0; +s32 gNumSpriteParticles = 0; s32 D_800E2CBC = 0; -Particle *gPointParticleBuffer = NULL; +Particle *gSpriteParticleBuffer = NULL; s32 gNumLineParticles = 0; s32 D_800E2CC8 = 0; Particle *gLineParticleBuffer = NULL; -s32 gNumSpriteParticles = 0; +s32 gNumPointParticles = 0; s32 D_800E2CD4 = 0; -SpriteParticle *gSpriteParticleBuffer = NULL; +PointParticle *gPointParticleBuffer = NULL; UNUSED s32 D_800E2CDC = 0; // Only ever and checked for being less than 512. Vertex *gParticleVertexBuffer = NULL; Triangle *gParticleTriangleBuffer = NULL; @@ -99,9 +99,9 @@ f32 gParticleGravityTable[8] = { 0.0f, 0.1, 0.2f, 0.3f, 0.45f, 0.525f, 0.6f, 0.8 s32 gMaxTriangleParticles = 0; s32 gMaxRectangleParticles = 0; -s32 gMaxPointParticles = 0; -s32 gMaxLineParticles = 0; s32 gMaxSpriteParticles = 0; +s32 gMaxLineParticles = 0; +s32 gMaxPointParticles = 0; Sprite **D_800E2E60 = NULL; s32 D_800E2E64 = 0; @@ -147,13 +147,13 @@ s16 D_80127C88[12]; void func_800AE270(void) { free_particle_buffers(); - free_particle_vertex_triangles(); + free_particle_vertices_triangles(); func_800AE2D8(); } void func_800AE2A0(void) { free_particle_buffers(); - free_particle_vertex_triangles(); + free_particle_vertices_triangles(); free_particle_assets(); func_800AE2D8(); } @@ -179,21 +179,21 @@ void free_particle_buffers(void) { mempool_free(gRectangleParticleBuffer); gRectangleParticleBuffer = NULL; } - if (gPointParticleBuffer != NULL) { - mempool_free(gPointParticleBuffer); - gPointParticleBuffer = NULL; + if (gSpriteParticleBuffer != NULL) { + mempool_free(gSpriteParticleBuffer); + gSpriteParticleBuffer = NULL; } if (gLineParticleBuffer != NULL) { mempool_free(gLineParticleBuffer); gLineParticleBuffer = NULL; } - if (gSpriteParticleBuffer != NULL) { - mempool_free(gSpriteParticleBuffer); - gSpriteParticleBuffer = NULL; + if (gPointParticleBuffer != NULL) { + mempool_free(gPointParticleBuffer); + gPointParticleBuffer = NULL; } } -void free_particle_vertex_triangles(void) { +void free_particle_vertices_triangles(void) { if (gParticleVertexBuffer != NULL) { mempool_free(gParticleVertexBuffer); gParticleVertexBuffer = NULL; @@ -256,7 +256,8 @@ void init_particle_assets(void) { } #ifdef NON_EQUIVALENT -void init_particle_buffers(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5) { +void init_particle_buffers(s32 maxTriangleParticles, s32 maxRectangleParticles, s32 maxSpriteParticles, + s32 maxLineParticles, s32 maxPointParticles, s32 unused_arg) { unsigned int new_var2; Vertex *sp54; Triangle *sp50; @@ -267,115 +268,118 @@ void init_particle_buffers(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 D_800E2D00->word = 0; - if (arg0 < 0) { - arg0 = 0x10; + if (maxTriangleParticles < 0) { + maxTriangleParticles = 0x10; } - if (arg1 < 0) { - arg1 = 0x10; + if (maxRectangleParticles < 0) { + maxRectangleParticles = 0x10; } - if (arg2 < 0) { - arg2 = 0xD0; + if (maxSpriteParticles < 0) { + maxSpriteParticles = 0xD0; } - if (arg3 < 0) { - arg3 = 0xA0; + if (maxLineParticles < 0) { + maxLineParticles = 0xA0; } - if (arg4 < 0) { - arg4 = 0x40; + if (maxPointParticles < 0) { + maxPointParticles = 0x40; } - gMaxTriangleParticles = arg0; + gMaxTriangleParticles = maxTriangleParticles; D_800E2CA4 = 0; - gMaxRectangleParticles = arg1; + gMaxRectangleParticles = maxRectangleParticles; D_800E2CB0 = 0; - gMaxPointParticles = arg2; + gMaxSpriteParticles = maxSpriteParticles; D_800E2CBC = 0; - gMaxLineParticles = arg3; + gMaxLineParticles = maxLineParticles; D_800E2CC8 = 0; - gMaxSpriteParticles = arg4; + gMaxPointParticles = maxPointParticles; D_800E2CD4 = 0; - free_particle_vertex_triangles(); - gParticleVertexBuffer = - mempool_alloc_safe((3 * arg0 + 4 * arg1 + 6 * arg3 + 16 * arg4) * sizeof(Vertex), COLOUR_TAG_SEMITRANS_GREY); - gParticleTriangleBuffer = mempool_alloc_safe((arg0 + 2 * arg1) * sizeof(Triangle), COLOUR_TAG_SEMITRANS_GREY); + free_particle_vertices_triangles(); + gParticleVertexBuffer = mempool_alloc_safe( + (3 * maxTriangleParticles + 4 * maxRectangleParticles + 6 * maxLineParticles + 16 * maxPointParticles) * + sizeof(Vertex), + COLOUR_TAG_SEMITRANS_GREY); + gParticleTriangleBuffer = mempool_alloc_safe((maxTriangleParticles + 2 * maxRectangleParticles) * sizeof(Triangle), + COLOUR_TAG_SEMITRANS_GREY); D_800E2CDC = 0; free_particle_buffers(); if (gMaxTriangleParticles > 0) { gNumTriangleParticles = 0; - gTriangleParticleBuffer = - mempool_alloc_safe(arg0 * (sizeof(Particle) + sizeof(ParticleModel)), COLOUR_TAG_SEMITRANS_GREY); + gTriangleParticleBuffer = mempool_alloc_safe(maxTriangleParticles * (sizeof(Particle) + sizeof(ParticleModel)), + COLOUR_TAG_SEMITRANS_GREY); } if (gMaxRectangleParticles > 0) { gNumRectangleParticles = 0; - gRectangleParticleBuffer = - mempool_alloc_safe(arg1 * (sizeof(Particle) + sizeof(ParticleModel)), COLOUR_TAG_SEMITRANS_GREY); - } - if (gMaxPointParticles > 0) { - gNumPointParticles = 0; - gPointParticleBuffer = mempool_alloc_safe(arg2 * sizeof(Particle), COLOUR_TAG_SEMITRANS_GREY); - } - if (gMaxLineParticles > 0) { - gNumLineParticles = 0; - gLineParticleBuffer = - mempool_alloc_safe(arg3 * (sizeof(Particle) + sizeof(ParticleModel)), COLOUR_TAG_SEMITRANS_GREY); + gRectangleParticleBuffer = mempool_alloc_safe( + maxRectangleParticles * (sizeof(Particle) + sizeof(ParticleModel)), COLOUR_TAG_SEMITRANS_GREY); } if (gMaxSpriteParticles > 0) { gNumSpriteParticles = 0; - gSpriteParticleBuffer = - mempool_alloc_safe(arg4 * (sizeof(SpriteParticle) + sizeof(ParticleModel)), COLOUR_TAG_SEMITRANS_GREY); + gSpriteParticleBuffer = mempool_alloc_safe(maxSpriteParticles * sizeof(Particle), COLOUR_TAG_SEMITRANS_GREY); + } + if (gMaxLineParticles > 0) { + gNumLineParticles = 0; + gLineParticleBuffer = mempool_alloc_safe(maxLineParticles * (sizeof(Particle) + sizeof(ParticleModel)), + COLOUR_TAG_SEMITRANS_GREY); + } + if (gMaxPointParticles > 0) { + gNumPointParticles = 0; + gPointParticleBuffer = mempool_alloc_safe(maxPointParticles * (sizeof(PointParticle) + sizeof(ParticleModel)), + COLOUR_TAG_SEMITRANS_GREY); } sp54 = &gParticleVertexBuffer[zero]; sp50 = &gParticleTriangleBuffer[zero]; - modelPtr = &gTriangleParticleBuffer[gMaxTriangleParticles]; + modelPtr = (ParticleModel*)&gTriangleParticleBuffer[gMaxTriangleParticles]; for (i = 0; i < gMaxTriangleParticles; i++) { gTriangleParticleBuffer[i].modelData = &modelPtr[i]; generate_particle_shape_triangle(gTriangleParticleBuffer[i].modelData, &sp54, &sp50); } - modelPtr = &gRectangleParticleBuffer[gMaxRectangleParticles]; + modelPtr = (ParticleModel*)&gRectangleParticleBuffer[gMaxRectangleParticles]; for (i = 0; i < gMaxRectangleParticles; i++) { gRectangleParticleBuffer[i].modelData = &modelPtr[i]; generate_particle_shape_quad(gRectangleParticleBuffer[i].modelData, &sp54, &sp50); } - modelPtr = &gLineParticleBuffer[gMaxLineParticles]; + modelPtr = (ParticleModel*)&gLineParticleBuffer[gMaxLineParticles]; for (i = 0; i < gMaxLineParticles; i++) { gLineParticleBuffer[i].modelData = &modelPtr[i]; sp50 = D_800E2D08; generate_particle_shape_line(gLineParticleBuffer[i].modelData, &sp54, &sp50); } - modelPtr = &gSpriteParticleBuffer[gMaxSpriteParticles]; - for (i = 0; i < gMaxSpriteParticles; i++) { - gSpriteParticleBuffer[i].base.modelData = &modelPtr[i]; + modelPtr = (ParticleModel*)&gPointParticleBuffer[gMaxPointParticles]; + for (i = 0; i < gMaxPointParticles; i++) { + gPointParticleBuffer[i].base.modelData = &modelPtr[i]; sp50 = D_800E2D78; - generate_particle_shape_sprite(gSpriteParticleBuffer[i].base.modelData, &sp54, &sp50); + generate_particle_shape_point(gPointParticleBuffer[i].base.modelData, &sp54, &sp50); } for (i = 0; i < gMaxTriangleParticles; i++) { - gTriangleParticleBuffer[i].segment.particle.unk2C = 0; + gTriangleParticleBuffer[i].segment.particle.kind = PARTICLE_KIND_NONE; } for (i = 0; i < gMaxRectangleParticles; i++) { - gRectangleParticleBuffer[i].segment.particle.unk2C = 0; - } - - for (i = 0; i < gMaxPointParticles; i++) { - gPointParticleBuffer[i].segment.particle.unk2C = 0; - } - - for (i = 0; i < gMaxLineParticles; i++) { - gLineParticleBuffer[i].segment.particle.unk2C = 0; + gRectangleParticleBuffer[i].segment.particle.kind = PARTICLE_KIND_NONE; } for (i = 0; i < gMaxSpriteParticles; i++) { - gSpriteParticleBuffer[i].base.segment.particle.unk2C = 0; + gSpriteParticleBuffer[i].segment.particle.kind = PARTICLE_KIND_NONE; + } + + for (i = 0; i < gMaxLineParticles; i++) { + gLineParticleBuffer[i].segment.particle.kind = PARTICLE_KIND_NONE; + } + + for (i = 0; i < gMaxPointParticles; i++) { + gPointParticleBuffer[i].base.segment.particle.kind = PARTICLE_KIND_NONE; } if (D_800E2E60 == NULL) { - asset2F = load_asset_section_from_rom(ASSET_BINARY_47); + asset2F = (s16*)load_asset_section_from_rom(ASSET_BINARY_47); D_800E2E64 = 0; while (asset2F[D_800E2E64] != -1) { D_800E2E64++; @@ -496,7 +500,7 @@ void generate_particle_shape_line(ParticleModel *model, Vertex **vtx, Triangle * *vtx = tempVtx; } -void generate_particle_shape_sprite(ParticleModel *model, Vertex **vtx, Triangle **triangles) { +void generate_particle_shape_point(ParticleModel *model, Vertex **vtx, Triangle **triangles) { s32 i; Vertex *tempVtx; @@ -516,39 +520,39 @@ void generate_particle_shape_sprite(ParticleModel *model, Vertex **vtx, Triangle } void func_800AF0A4(Particle *particle) { - Object_44 *temp_v0; - Object_44_C *temp_v1; - s16 temp_t1, temp_t8_0; - s32 temp_t8; + ParticleModel *model; + Triangle *tri; + s16 texV, texU; - temp_v0 = (Object_44 *) particle->modelData; - temp_v1 = temp_v0->unkC; - temp_t8_0 = (temp_v0->unk0->unk0 - 1) << 5; - temp_t8 = (s32) temp_t8_0; - temp_t1 = (temp_v0->unk0->unk1 - 1) << 5; - temp_v1->unk4 = temp_t8 >> 1; - temp_v1->unk6 = 0; - temp_v1->unk8 = 0; - temp_v1->unkA = temp_t1; - temp_v1->unkC = temp_t8; - temp_v1->unkE = temp_t1; + model = particle->modelData; + tri = model->triangles; + texU = (model->texture->width - 1) << 5; + texV = (model->texture->height - 1) << 5; + + tri->uv0.u = texU >> 1; + tri->uv0.v = 0; + tri->uv1.u = 0; + tri->uv1.v = texV; + tri->uv2.u = texU; + tri->uv2.v = texV; } void func_800AF0F0(Particle *particle) { - Object_44 *temp_v0; - Object_44_C *temp_v1; - s16 temp_t8, temp_t1; + ParticleModel *model; + Triangle *tri; + s16 texV, texU; - temp_v0 = (Object_44 *) particle->modelData; - temp_v1 = temp_v0->unkC; - temp_t8 = (temp_v0->unk0->unk0 - 1) << 5; - temp_t1 = (temp_v0->unk0->unk1 - 1) << 5; - temp_v1->unk6 = temp_t1; - temp_v1->unk8 = temp_t8; - temp_v1->unk16 = temp_t8; - temp_v1->unk18 = temp_t8; - temp_v1->unk1A = temp_t1; - temp_v1->unk1C = temp_t8; + model = particle->modelData; + tri = model->triangles; + texU = (model->texture->width - 1) << 5; + texV = (model->texture->height - 1) << 5; + + tri[0].uv0.v = texV; + tri[0].uv1.u = texU; + tri[1].uv0.v = texU; + tri[1].uv1.u = texU; + tri[1].uv1.v = texV; + tri[1].uv2.u = texU; } void func_800AF134(ParticleEmitter *emitter, s32 behaviourID, s32 propertyID, s16 velX, s16 velY, s16 velZ) { @@ -575,47 +579,48 @@ void partInitTrigger(ParticleEmitter *emitter, s32 behaviourID, s32 propertyID) } } -void func_800AF29C(ParticleEmitter *arg0, s32 behaviourID, s32 propertyID, s16 velX, s16 velY, s16 velZ) { +void func_800AF29C(ParticleEmitter *emitter, s32 behaviourID, s32 propertyID, s16 velX, s16 velY, s16 velZ) { ParticleBehavior *behaviour; s32 flags; behaviour = gParticleBehavioursAssetTable[behaviourID]; - arg0->propertyID = propertyID; - arg0->behaviour = behaviour; - arg0->baseVelX = velX; - arg0->baseVelY = velY; - arg0->baseVelZ = velZ; - arg0->unk1E = 0; + emitter->propertyID = propertyID; + emitter->behaviour = behaviour; + emitter->baseVelX = velX; + emitter->baseVelY = velY; + emitter->baseVelZ = velZ; + emitter->unk1E = 0; - flags = behaviour->flags; + flags = behaviour->emitterFlags; - if (flags & 0x4000) { - arg0->flags = 0x4000; - arg0->unk6 = 0; - arg0->pos.x = 0.0f; - arg0->pos.y = 0.0f; - arg0->pos.z = 0.0f; - } else if (flags & 0x400) { - arg0->unk6 = 0; - arg0->flags = 0x400; + if (flags & PARTICLE_BEHAVIOR_FLAG_4000) { + emitter->emmmflags = PARTICLE_BEHAVIOR_FLAG_4000; + emitter->unk6 = 0; + emitter->pos.x = 0.0f; + emitter->pos.y = 0.0f; + emitter->pos.z = 0.0f; + } else if (flags & PARTICLE_BEHAVIOR_FLAG_400) { + emitter->unk6 = 0; + emitter->emmmflags = PARTICLE_BEHAVIOR_FLAG_400; if (gParticlesAssetTable[propertyID]->lifeTime <= 255) { - arg0->lifeTime = gParticlesAssetTable[propertyID]->lifeTime; + emitter->lifeTime = gParticlesAssetTable[propertyID]->lifeTime; } else { - arg0->lifeTime = 255; + emitter->lifeTime = 255; } - arg0->unkC_400.unkC = (s32 *) mempool_alloc_safe(arg0->lifeTime * sizeof(uintptr_t), COLOUR_TAG_SEMITRANS_GREY); - arg0->unkC_400.unk10 = behaviour->unk14; - arg0->unkC_400.unk12 = behaviour->unk16; - arg0->unkC_400.unk14 = behaviour->unk22; - arg0->unkC_400.unk16 = behaviour->unk24; + emitter->unkC_400.unkC = + (s32 *) mempool_alloc_safe(emitter->lifeTime * sizeof(uintptr_t), COLOUR_TAG_SEMITRANS_GREY); + emitter->unkC_400.unk10 = behaviour->unk14; + emitter->unkC_400.unk12 = behaviour->unk16; + emitter->unkC_400.unk14 = behaviour->unk22; + emitter->unkC_400.unk16 = behaviour->unk24; } else { - arg0->flags = 0; - arg0->angle.rotation.y_rotation = behaviour->unk14; - arg0->angle.rotation.x_rotation = behaviour->unk16; - arg0->angle.rotation.z_rotation = behaviour->unk18; - arg0->angle.direction.y_rotation = behaviour->unk22; - arg0->angle.direction.x_rotation = behaviour->unk24; - arg0->angle.direction.z_rotation = behaviour->unk26; + emitter->emmmflags = PARTICLE_BEHAVIOR_FLAGS_NONE; + emitter->angle.rotation.y_rotation = behaviour->unk14; + emitter->angle.rotation.x_rotation = behaviour->unk16; + emitter->angle.rotation.z_rotation = behaviour->unk18; + emitter->angle.direction.y_rotation = behaviour->unk22; + emitter->angle.direction.x_rotation = behaviour->unk24; + emitter->angle.direction.z_rotation = behaviour->unk26; } } @@ -641,61 +646,62 @@ void func_800AF404(s32 updateRate) { #pragma GLOBAL_ASM("asm/nonmatchings/particles/func_800AF404.s") #endif -void func_800AF52C(Object *obj, s32 arg1) { +void func_800AF52C(Object *obj, s32 emitterIndex) { s32 i; - ParticleEmitter *temp_v0; + ParticleEmitter *emitter; ParticleBehavior *behaviour; Particle *temp; - temp_v0 = &obj->particleEmitter[arg1]; - behaviour = temp_v0->behaviour; - temp_v0->opacity = 0; - if (temp_v0->flags & 0x4000) { - temp_v0->pos.x = obj->segment.trans.x_position; - temp_v0->pos.y = obj->segment.trans.y_position; - temp_v0->pos.z = obj->segment.trans.z_position; - } else if (temp_v0->flags & 0x400) { - temp_v0->opacity = gParticlesAssetTable[temp_v0->propertyID]->colour.a << 8; + emitter = &obj->particleEmitter[emitterIndex]; + behaviour = emitter->behaviour; + emitter->opacity = 0; - 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]; + if (emitter->emmmflags & PARTICLE_BEHAVIOR_FLAG_4000) { + emitter->pos.x = obj->segment.trans.x_position; + emitter->pos.y = obj->segment.trans.y_position; + emitter->pos.z = obj->segment.trans.z_position; + } else if (emitter->emmmflags & PARTICLE_BEHAVIOR_FLAG_400) { + emitter->opacity = gParticlesAssetTable[emitter->propertyID]->colour.a << 8; + + if (emitter->unk6 > 0) { // Useless if statement, since the loop already does this. + for (i = 0; i < emitter->unk6; i++) { + temp = emitter->unkC_60[i]; temp->segment.particle.destroyTimer = 0; } } - if (behaviour->flags & 1) { - temp_v0->angle.rotation.z_rotation = behaviour->unk14; - temp_v0->angle.direction.y_rotation = behaviour->unk16; + if (behaviour->emitterFlags & PARTICLE_BEHAVIOR_FLAG_1) { + emitter->angle.rotation.z_rotation = behaviour->unk14; + emitter->angle.direction.y_rotation = behaviour->unk16; } - if (behaviour->flags & 4) { - temp_v0->angle.direction.x_rotation = behaviour->unk22; - temp_v0->angle.direction.z_rotation = behaviour->unk24; + if (behaviour->emitterFlags & PARTICLE_BEHAVIOR_FLAG_4) { + emitter->angle.direction.x_rotation = behaviour->unk22; + emitter->angle.direction.z_rotation = behaviour->unk24; } } else { - if (behaviour->flags & 1) { - temp_v0->unk6 = 0; - temp_v0->angle.rotation.y_rotation = behaviour->unk14; - temp_v0->angle.rotation.x_rotation = behaviour->unk16; - temp_v0->angle.rotation.z_rotation = behaviour->unk18; + if (behaviour->emitterFlags & PARTICLE_BEHAVIOR_FLAG_1) { + emitter->unk6 = 0; + emitter->angle.rotation.y_rotation = behaviour->unk14; + emitter->angle.rotation.x_rotation = behaviour->unk16; + emitter->angle.rotation.z_rotation = behaviour->unk18; } - if (behaviour->flags & 4) { - temp_v0->lifeTime = 0; - temp_v0->angle.direction.y_rotation = behaviour->unk22; - temp_v0->angle.direction.x_rotation = behaviour->unk24; - temp_v0->angle.direction.z_rotation = behaviour->unk26; + if (behaviour->emitterFlags & PARTICLE_BEHAVIOR_FLAG_4) { + emitter->lifeTime = 0; + emitter->angle.direction.y_rotation = behaviour->unk22; + emitter->angle.direction.x_rotation = behaviour->unk24; + emitter->angle.direction.z_rotation = behaviour->unk26; } } - temp_v0->flags &= 0xFDFF; - temp_v0->flags |= 0xA000; + emitter->emmmflags &= ~PARTICLE_BEHAVIOR_FLAG_200; + emitter->emmmflags |= PARTICLE_BEHAVIOR_FLAG_8000 | PARTICLE_BEHAVIOR_FLAG_2000; obj->segment.unk1A++; } -void func_800AF6E4(Object *obj, s32 arg1) { +void func_800AF6E4(Object *obj, s32 emitterIndex) { ParticleEmitter *emitter; - emitter = &obj->particleEmitter[arg1]; + emitter = &obj->particleEmitter[emitterIndex]; - emitter->flags &= 0x7FFF; + emitter->emmmflags &= ~PARTICLE_BEHAVIOR_FLAG_8000; obj->segment.unk1A--; } @@ -714,7 +720,7 @@ void func_800AF714(Object *racerObj, s32 updateRate) { u8 *alphaPtr; racer = &racerObj->unk64->racer; - var_s7 = racerObj->particleEmitFlags; + var_s7 = racerObj->particleEmittersEnabled; vehicleId = racer->vehicleID; i = 0; object_do_player_tumble(racerObj); @@ -803,12 +809,12 @@ void func_800AF714(Object *racerObj, s32 updateRate) { } if (someBool) { - if (!(racerObj->particleEmitter[i].flags & 0x8000)) { + if (!(racerObj->particleEmitter[i].emmmflags & PARTICLE_BEHAVIOR_FLAG_8000)) { func_800AF52C(racerObj, i); } - if (racerObj->particleEmitter[i].flags & 0x4000) { + if (racerObj->particleEmitter[i].emmmflags & PARTICLE_BEHAVIOR_FLAG_4000) { func_800AFE5C(racerObj, &racerObj->particleEmitter[i]); - } else if (racerObj->particleEmitter[i].flags & 0x400) { + } else if (racerObj->particleEmitter[i].emmmflags & PARTICLE_BEHAVIOR_FLAG_400) { func_800AFE5C(racerObj, &racerObj->particleEmitter[i]); } else { racerObj->particleEmitter[i].opacity += updateRate; @@ -817,15 +823,15 @@ void func_800AF714(Object *racerObj, s32 updateRate) { } } } - } else if (racerObj->particleEmitter[i].flags & 0x8000) { - if (racerObj->particleEmitter[i].flags & 0x4000) { + } else if (racerObj->particleEmitter[i].emmmflags & PARTICLE_BEHAVIOR_FLAG_8000) { + if (racerObj->particleEmitter[i].emmmflags & PARTICLE_BEHAVIOR_FLAG_4000) { new_var2 = &racerObj->particleEmitter[i]; new_var2->unk6 = 0; func_800AF6E4(racerObj, i); } else { - if (racerObj->particleEmitter[i].flags & 0x400) { + if (racerObj->particleEmitter[i].emmmflags & PARTICLE_BEHAVIOR_FLAG_400) { new_var = &racerObj->particleEmitter[i]; - racerObj->particleEmitter[i].flags |= 0x200; + racerObj->particleEmitter[i].emmmflags |= PARTICLE_BEHAVIOR_FLAG_200; if (new_var->unk6 == 0) { func_800AF6E4(racerObj, i); } @@ -846,21 +852,19 @@ void func_800AF714(Object *racerObj, s32 updateRate) { } void obj_spawn_particle(Object *obj, s32 updateRate) { - ParticleEmitter *temp_s1; - ParticleEmitter *temp_s1_2; s32 var_s0; s32 i; u32 bits; - bits = obj->particleEmitFlags; + bits = obj->particleEmittersEnabled; for (i = 0; i < obj->segment.header->particleCount; i++) { if (bits & 1) { - if (!(obj->particleEmitter[i].flags & 0x8000)) { + if (!(obj->particleEmitter[i].emmmflags & PARTICLE_BEHAVIOR_FLAG_8000)) { func_800AF52C(obj, i); } - if (obj->particleEmitter[i].flags & 0x4000) { + if (obj->particleEmitter[i].emmmflags & PARTICLE_BEHAVIOR_FLAG_4000) { func_800AFE5C(obj, &obj->particleEmitter[i]); - } else if ((obj->particleEmitter[i].flags & 0x400)) { + } else if ((obj->particleEmitter[i].emmmflags & PARTICLE_BEHAVIOR_FLAG_400)) { func_800AFE5C(obj, &obj->particleEmitter[i]); } else { obj->particleEmitter[i].opacity += updateRate; @@ -869,9 +873,9 @@ void obj_spawn_particle(Object *obj, s32 updateRate) { } } } else { - if (obj->particleEmitter[i].flags & 0x8000) { - if (obj->particleEmitter[i].flags & 0x4000) { - temp_s1 = &obj->particleEmitter[i]; + if (obj->particleEmitter[i].emmmflags & PARTICLE_BEHAVIOR_FLAG_8000) { + if (obj->particleEmitter[i].emmmflags & PARTICLE_BEHAVIOR_FLAG_4000) { + ParticleEmitter *temp_s1 = &obj->particleEmitter[i]; var_s0 = temp_s1->unk6 - 0x40; if (var_s0 < 0) { var_s0 = 0; @@ -882,9 +886,9 @@ void obj_spawn_particle(Object *obj, s32 updateRate) { if (var_s0 == 0) { func_800AF6E4(obj, i); } - } else if ((obj->particleEmitter[i].flags & 0x400)) { - temp_s1_2 = &obj->particleEmitter[i]; - obj->particleEmitter[i].flags |= 0x200; + } else if ((obj->particleEmitter[i].emmmflags & PARTICLE_BEHAVIOR_FLAG_400)) { + ParticleEmitter *temp_s1_2 = &obj->particleEmitter[i]; + obj->particleEmitter[i].emmmflags |= PARTICLE_BEHAVIOR_FLAG_200; if (temp_s1_2->unk6 == 0) { func_800AF6E4(obj, i); } @@ -897,553 +901,568 @@ void obj_spawn_particle(Object *obj, s32 updateRate) { } } -void func_800AFE5C(Object *arg0, ParticleEmitter *arg1) { - SpriteParticle *temp_s0; +void func_800AFE5C(Object *obj, ParticleEmitter *emitter) { + PointParticle *temp_s0; Particle *tempObj; Particle *tempObj2; s32 i; - ParticleBehavior *temp_s4; + ParticleBehavior *behavior; - temp_s4 = arg1->behaviour; - if (arg1->flags & 0x4000) { - tempObj = func_800B0BAC(arg0, arg1); + behavior = emitter->behaviour; + if (emitter->emmmflags & PARTICLE_BEHAVIOR_FLAG_4000) { + tempObj = init_line_particle(obj, emitter); if (tempObj != NULL) { - func_8000E9D0((Object *) tempObj); + add_particle_to_entity_list((Object *) tempObj); } - arg1->flags &= 0xDFFF; - if (arg1->unk6 + 64 > 255) { - arg1->unk6 = 255; + emitter->emmmflags &= ~PARTICLE_BEHAVIOR_FLAG_2000; + if (emitter->unk6 + 64 > 255) { + emitter->unk6 = 255; } else { - arg1->unk6 += 64; + emitter->unk6 += 64; } - } else if (arg1->flags & 0x400) { - if (arg1->unk6 < arg1->lifeTime) { - temp_s0 = func_800B0698(arg0, arg1); - arg1->flags &= 0xDFFF; + } else if (emitter->emmmflags & PARTICLE_BEHAVIOR_FLAG_400) { + if (emitter->unk6 < emitter->lifeTime) { + temp_s0 = init_point_particle(obj, emitter); + emitter->emmmflags &= ~PARTICLE_BEHAVIOR_FLAG_2000; if (temp_s0 != NULL) { - func_8000E9D0((Object *) temp_s0); - temp_s0->unk74 = arg1->unk6; - temp_s0->base.segment.unk40 |= 0x2000; - arg1->unkC_60[arg1->unk6] = temp_s0; - arg1->unk6++; + add_particle_to_entity_list((Object *) temp_s0); + temp_s0->unk74 = emitter->unk6; + temp_s0->base.segment.unk40 |= PARTICLE_F40_2000; + emitter->unkC_60[emitter->unk6] = temp_s0; + emitter->unk6++; } } } else { - while (arg1->opacity >= temp_s4->unk40) { - arg1->opacity -= temp_s4->unk40; - for (i = 0; i < temp_s4->unk42; i++) { - tempObj2 = func_800B1130(arg0, arg1); + while (emitter->opacity >= behavior->unk40) { + emitter->opacity -= behavior->unk40; + for (i = 0; i < behavior->unk42; i++) { + tempObj2 = init_general_particle(obj, emitter); if (tempObj2 != NULL) { - func_8000E9D0((Object *) tempObj2); - handle_particle_movement(tempObj2, arg1->opacity); + add_particle_to_entity_list((Object *) tempObj2); + handle_particle_movement(tempObj2, emitter->opacity); } - arg1->flags &= ~0x2000; + emitter->emmmflags &= ~PARTICLE_BEHAVIOR_FLAG_2000; } } } } -void func_800B0010(Particle *arg0, Object *arg1, ParticleEmitter *arg2, ParticleBehavior *arg3) { - s32 flags; +void setup_particle_velocity(Particle *particle, Object *obj, ParticleEmitter *emitter, ParticleBehavior *behavior) { + s32 randomizationFlags; Vec3f velocityPos; Vec3s angle; - if (arg3->flags & 0x70) { - arg0->segment.x_velocity = arg3->unk30; - arg0->segment.y_velocity = arg3->unk34; - arg0->segment.z_velocity = arg3->unk38; + if (behavior->emitterFlags & (PARTICLE_BEHAVIOR_FLAG_10 | PARTICLE_BEHAVIOR_FLAG_20 | PARTICLE_BEHAVIOR_FLAG_40)) { + particle->segment.x_velocity = behavior->unk30; + particle->segment.y_velocity = behavior->unk34; + particle->segment.z_velocity = behavior->unk38; } else { - arg0->segment.x_velocity = 0.0f; - arg0->segment.y_velocity = 0.0f; - arg0->segment.z_velocity = 0.0f; + particle->segment.x_velocity = 0.0f; + particle->segment.y_velocity = 0.0f; + particle->segment.z_velocity = 0.0f; } - flags = arg3->behaviourFlags & (PARTICLE_VEL_Z | PARTICLE_VEL_Y | PARTICLE_VEL_X); - if (flags) { - if (flags & PARTICLE_VEL_X) { - arg0->segment.x_velocity += - (f32) get_random_number_from_range(-arg3->velocityRangeX1, arg3->velocityRangeX1) * 0.00001525878906; + + randomizationFlags = behavior->randomizationFlags & (PARTICLE_RANDOM_VEL_Z | PARTICLE_RANDOM_VEL_Y | PARTICLE_RANDOM_VEL_X); + if (randomizationFlags) { + if (randomizationFlags & PARTICLE_RANDOM_VEL_X) { + particle->segment.x_velocity += + (f32) get_random_number_from_range(-behavior->velocityRangeX1, behavior->velocityRangeX1) * + 0.00001525878906; } - if (flags & PARTICLE_VEL_Y) { - arg0->segment.y_velocity += - (f32) get_random_number_from_range(-arg3->velocityRangeY1, arg3->velocityRangeY1) * 0.00001525878906; + if (randomizationFlags & PARTICLE_RANDOM_VEL_Y) { + particle->segment.y_velocity += + (f32) get_random_number_from_range(-behavior->velocityRangeY1, behavior->velocityRangeY1) * + 0.00001525878906; } - if (flags & PARTICLE_VEL_Z) { - arg0->segment.z_velocity += - (f32) get_random_number_from_range(-arg3->velocityRangeZ1, arg3->velocityRangeZ1) * 0.00001525878906; + if (randomizationFlags & PARTICLE_RANDOM_VEL_Z) { + particle->segment.z_velocity += + (f32) get_random_number_from_range(-behavior->velocityRangeZ1, behavior->velocityRangeZ1) * + 0.00001525878906; } } - switch (arg3->flags & (0x40 | 0x20 | 0x10)) { - case 0x10: - arg0->segment.x_velocity += arg1->segment.x_velocity; - arg0->segment.y_velocity += arg1->segment.y_velocity; - arg0->segment.z_velocity += arg1->segment.z_velocity; + + switch (behavior->emitterFlags & + (PARTICLE_BEHAVIOR_FLAG_10 | PARTICLE_BEHAVIOR_FLAG_20 | PARTICLE_BEHAVIOR_FLAG_40)) { + case PARTICLE_BEHAVIOR_FLAG_10: + particle->segment.x_velocity += obj->segment.x_velocity; + particle->segment.y_velocity += obj->segment.y_velocity; + particle->segment.z_velocity += obj->segment.z_velocity; break; - case 0x40: - arg0->segment.x_velocity *= arg1->segment.x_velocity; - arg0->segment.y_velocity *= arg1->segment.y_velocity; - arg0->segment.z_velocity *= arg1->segment.z_velocity; + case PARTICLE_BEHAVIOR_FLAG_40: + particle->segment.x_velocity *= obj->segment.x_velocity; + particle->segment.y_velocity *= obj->segment.y_velocity; + particle->segment.z_velocity *= obj->segment.z_velocity; break; } - if (arg3->flags & 4) { + + if (behavior->emitterFlags & PARTICLE_BEHAVIOR_FLAG_4) { velocityPos.x = 0.0f; velocityPos.y = 0.0f; - velocityPos.z = -arg3->unk3C; - flags = arg3->behaviourFlags; - if (flags & PARTICLE_UNK00000010) { - velocityPos.z += - (f32) get_random_number_from_range(-arg3->gravityRange2, arg3->gravityRange2) * 0.00001525878906; + velocityPos.z = -behavior->unk3C; + + randomizationFlags = behavior->randomizationFlags; + if (randomizationFlags & PARTICLE_UNK00000010) { + velocityPos.z += (f32) get_random_number_from_range(-behavior->gravityRange2, behavior->gravityRange2) * + 0.00001525878906; } - if (flags & (PARTICLE_UNK00000040 | PARTICLE_UNK00000020)) { - angle.y_rotation = arg2->angle.direction.y_rotation; - if (flags & PARTICLE_UNK00000020) { - angle.y_rotation += get_random_number_from_range(-arg3->angleRangeY2, arg3->angleRangeY2); + + if (randomizationFlags & (PARTICLE_UNK00000040 | PARTICLE_UNK00000020)) { + angle.y_rotation = emitter->angle.direction.y_rotation; + if (randomizationFlags & PARTICLE_UNK00000020) { + angle.y_rotation += get_random_number_from_range(-behavior->angleRangeY2, behavior->angleRangeY2); } - angle.x_rotation = arg2->angle.direction.x_rotation; - if (flags & PARTICLE_UNK00000040) { - angle.x_rotation += get_random_number_from_range(-arg3->angleRangeX2, arg3->angleRangeX2); + angle.x_rotation = emitter->angle.direction.x_rotation; + if (randomizationFlags & PARTICLE_UNK00000040) { + angle.x_rotation += get_random_number_from_range(-behavior->angleRangeX2, behavior->angleRangeX2); } f32_vec3_apply_object_rotation3(&angle, &velocityPos.x); } else { - f32_vec3_apply_object_rotation3(&arg2->angle.direction, &velocityPos.x); + f32_vec3_apply_object_rotation3(&emitter->angle.direction, &velocityPos.x); } - f32_vec3_apply_object_rotation((ObjectTransform *) arg0->segment.unk3C, &velocityPos.x); - arg0->segment.x_velocity += velocityPos.x; - arg0->segment.y_velocity += velocityPos.y; - arg0->segment.z_velocity += velocityPos.z; + f32_vec3_apply_object_rotation((ObjectTransform *) particle->segment.parentObj, &velocityPos.x); + + particle->segment.x_velocity += velocityPos.x; + particle->segment.y_velocity += velocityPos.y; + particle->segment.z_velocity += velocityPos.z; } } -void func_800B03C0(Particle *particle, Object *arg1, ParticleEmitter *arg2, ParticleBehavior *behaviour) { - s32 flags; +void setup_particle_position(Particle *particle, Object *obj, ParticleEmitter *emitter, ParticleBehavior *behaviour) { + s32 randomizationFlags; Vec3f posVel; Vec3s angle; - particle->baseVelX = arg2->baseVelX; - particle->baseVelY = arg2->baseVelY; - particle->baseVelZ = arg2->baseVelZ; + particle->localPosX = emitter->baseVelX; + particle->localPosY = emitter->baseVelY; + particle->localPosZ = emitter->baseVelZ; particle->forwardVel = behaviour->forwardVel; - if (behaviour->behaviourFlags & PARTICLE_FORWARDVEL) { + if (behaviour->randomizationFlags & PARTICLE_FORWARDVEL) { particle->forwardVel += (f32) get_random_number_from_range(-behaviour->velocityRange, behaviour->velocityRange) * 0.00001525878906; // 0.00001525878906 ~= 1.0/65536.0 } - if (behaviour->flags & 1) { + if (behaviour->emitterFlags & PARTICLE_BEHAVIOR_FLAG_1) { posVel.x = 0.0f; posVel.y = 0.0f; posVel.z = -behaviour->unk10; - flags = behaviour->behaviourFlags; - if (flags & PARTICLE_GRAVITY) { + randomizationFlags = behaviour->randomizationFlags; + if (randomizationFlags & PARTICLE_GRAVITY) { posVel.z += (f32) get_random_number_from_range(-behaviour->gravityRange1, behaviour->gravityRange1) * 0.00001525878906; } - if (flags & (PARTICLE_UNK00000004 | PARTICLE_UNK00000002)) { - angle.y_rotation = arg2->angle.rotation.y_rotation; - if (flags & PARTICLE_UNK00000002) { + if (randomizationFlags & (PARTICLE_UNK00000004 | PARTICLE_UNK00000002)) { + angle.y_rotation = emitter->angle.rotation.y_rotation; + if (randomizationFlags & PARTICLE_UNK00000002) { angle.y_rotation += get_random_number_from_range(-behaviour->angleRangeY1, behaviour->angleRangeY1); } - angle.x_rotation = arg2->angle.rotation.x_rotation; - if (flags & PARTICLE_UNK00000004) { + angle.x_rotation = emitter->angle.rotation.x_rotation; + if (randomizationFlags & PARTICLE_UNK00000004) { angle.x_rotation += get_random_number_from_range(-behaviour->angleRangeX1, behaviour->angleRangeX1); } f32_vec3_apply_object_rotation3(&angle, (f32 *) &posVel); } else { - f32_vec3_apply_object_rotation((ObjectTransform *) &arg2->angle.rotation, (f32 *) &posVel); + f32_vec3_apply_object_rotation((ObjectTransform *) &emitter->angle.rotation, (f32 *) &posVel); } - particle->baseVelX += posVel.x; - particle->baseVelY += posVel.y; - particle->baseVelZ += posVel.z; + particle->localPosX += posVel.x; + particle->localPosY += posVel.y; + particle->localPosZ += posVel.z; } if (particle->segment.particle.movementType != PARTICLE_MOVEMENT_BASIC_PARENT) { - f32_vec3_apply_object_rotation((ObjectTransform *) arg1, &particle->baseVelX); + f32_vec3_apply_object_rotation((ObjectTransform *) obj, &particle->localPosX); } - particle->segment.trans.x_position = particle->baseVelX; - particle->segment.trans.y_position = particle->baseVelY; - particle->segment.trans.z_position = particle->baseVelZ; + particle->segment.trans.x_position = particle->localPosX; + particle->segment.trans.y_position = particle->localPosY; + particle->segment.trans.z_position = particle->localPosZ; if (particle->segment.particle.movementType == PARTICLE_MOVEMENT_BASIC_PARENT) { - f32_vec3_apply_object_rotation((ObjectTransform *) arg1, &particle->segment.trans.x_position); + f32_vec3_apply_object_rotation((ObjectTransform *) obj, &particle->segment.trans.x_position); } - particle->segment.trans.x_position += arg1->segment.trans.x_position; - particle->segment.trans.y_position += arg1->segment.trans.y_position; - particle->segment.trans.z_position += arg1->segment.trans.z_position; + particle->segment.trans.x_position += obj->segment.trans.x_position; + particle->segment.trans.y_position += obj->segment.trans.y_position; + particle->segment.trans.z_position += obj->segment.trans.z_position; } -SpriteParticle *func_800B0698(Object *arg0, ParticleEmitter *arg1) { +PointParticle *init_point_particle(Object *obj, ParticleEmitter *emitter) { ParticleProperties *properties; - SpriteParticle *var_v0; - TextureHeader **texture; - ParticleBehavior *sp20; - f32 temp_f0; - f32 temp_f14; - f32 temp_f2; + PointParticle *particle; + ParticleModel *model; + ParticleBehavior *behavior; - properties = gParticlesAssetTable[arg1->propertyID]; - if (properties->unk0 != 4) { + properties = gParticlesAssetTable[emitter->propertyID]; + if (properties->kind != PARTICLE_KIND_POINT) { return NULL; } - sp20 = arg1->behaviour; - var_v0 = func_800B1CB8(4); - if (var_v0 == NULL) { - return var_v0; + behavior = emitter->behaviour; + particle = particle_allocate(PARTICLE_KIND_POINT); + if (particle == NULL) { + return particle; } - var_v0->base.segment.particle.blockID = arg0->segment.object.segmentID; - var_v0->base.segment.trans.flags = -OBJ_FLAGS_DEACTIVATED; - var_v0->base.segment.particle.movementType = properties->movementType; - var_v0->base.segment.unk40 = properties->unk2; - var_v0->base.segment.unk3C = arg0; - var_v0->unk70 = arg1; - var_v0->base.segment.trans.scale = properties->scale * sp20->unk50; - var_v0->base.segment.scaleVel = properties->scale * sp20->unk54; - var_v0->base.segment.particle.destroyTimer = properties->lifeTime; - var_v0->base.segment.particle.unk34 = 0.0f; - var_v0->base.segment.particle.unk38 = 0.0f; - var_v0->base.colour.r = properties->colour.r; - var_v0->base.colour.g = properties->colour.g; - var_v0->base.colour.b = properties->colour.b; - var_v0->base.colour.a = properties->colour.a; - if (var_v0->base.segment.unk40 & 0x800 && arg0->shading != NULL) { - var_v0->base.brightness = arg0->shading->unk0 * 255.0f; + + particle->base.segment.particle.segmentID = obj->segment.object.segmentID; + particle->base.segment.trans.flags = OBJ_FLAGS_DEACTIVATED; + particle->base.segment.particle.movementType = properties->movementType; + particle->base.segment.unk40 = properties->unk2; + particle->base.segment.parentObj = obj; + particle->pointEmitter = emitter; + particle->base.segment.trans.scale = properties->scale * behavior->unk50; + particle->base.segment.scaleVel = properties->scale * behavior->unk54; + particle->base.segment.particle.destroyTimer = properties->lifeTime; + particle->base.segment.particle.unk34 = 0.0f; + particle->base.segment.particle.unk38 = 0; + particle->base.colour.r = properties->colour.r; + particle->base.colour.g = properties->colour.g; + particle->base.colour.b = properties->colour.b; + particle->base.colour.a = properties->colour.a; + + if (particle->base.segment.unk40 & PARTICLE_F40_800 && obj->shading != NULL) { + particle->base.brightness = obj->shading->unk0 * 255.0f; } else { - var_v0->base.brightness = 255; + particle->base.brightness = 255; } - var_v0->base.opacityTimer = properties->opacityTimer; - if (arg1->flags & 0x100) { - var_v0->base.opacity = arg1->opacity; + particle->base.opacityTimer = properties->opacityTimer; + if (emitter->emmmflags & PARTICLE_BEHAVIOR_FLAG_100) { + particle->base.opacity = emitter->opacity; } else { - var_v0->base.opacity = properties->opacity << 8; + particle->base.opacity = properties->opacity << 8; } if (properties->opacity < 255) { - if (var_v0->base.segment.unk40 & 0x1000) { - var_v0->base.segment.trans.flags |= OBJ_FLAGS_UNK_0100; + if (particle->base.segment.unk40 & PARTICLE_F40_1000) { + particle->base.segment.trans.flags |= OBJ_FLAGS_UNK_0100; } else { - var_v0->base.segment.trans.flags |= OBJ_FLAGS_UNK_0080; + particle->base.segment.trans.flags |= OBJ_FLAGS_UNK_0080; } } - if (var_v0->base.opacityTimer < var_v0->base.segment.particle.destroyTimer) { - var_v0->base.opacityVel = ((properties->opacityVel << 8) - (var_v0->base.opacity & 0xFFFF)) / - (var_v0->base.segment.particle.destroyTimer - var_v0->base.opacityTimer); + if (particle->base.opacityTimer < particle->base.segment.particle.destroyTimer) { + particle->base.opacityVel = ((properties->opacityVel << 8) - (particle->base.opacity & 0xFFFF)) / + (particle->base.segment.particle.destroyTimer - particle->base.opacityTimer); } else { - var_v0->base.opacityVel = 0; + particle->base.opacityVel = 0; } - func_800B03C0(var_v0, arg0, arg1, sp20); - if (sp20->flags & 0x80) { - var_v0->base.segment.trans.rotation.y_rotation = sp20->angleOffsetY; - var_v0->base.segment.trans.rotation.x_rotation = sp20->angleOffsetX; - var_v0->base.segment.trans.rotation.z_rotation = sp20->angleOffsetZ; + + setup_particle_position(particle, obj, emitter, behavior); + + // Setup particle rotation + if (behavior->emitterFlags & PARTICLE_BEHAVIOR_FLAG_80) { + particle->base.segment.trans.rotation.y_rotation = behavior->angleOffsetY; + particle->base.segment.trans.rotation.x_rotation = behavior->angleOffsetX; + particle->base.segment.trans.rotation.z_rotation = behavior->angleOffsetZ; } else { - var_v0->base.segment.trans.rotation.y_rotation = arg0->segment.trans.rotation.y_rotation + sp20->angleOffsetY; - var_v0->base.segment.trans.rotation.x_rotation = arg0->segment.trans.rotation.x_rotation + sp20->angleOffsetX; - var_v0->base.segment.trans.rotation.z_rotation = arg0->segment.trans.rotation.z_rotation + sp20->angleOffsetZ; + particle->base.segment.trans.rotation.y_rotation = + obj->segment.trans.rotation.y_rotation + behavior->angleOffsetY; + particle->base.segment.trans.rotation.x_rotation = + obj->segment.trans.rotation.x_rotation + behavior->angleOffsetX; + particle->base.segment.trans.rotation.z_rotation = + obj->segment.trans.rotation.z_rotation + behavior->angleOffsetZ; } - var_v0->base.angleVelY = sp20->angleVelY; - var_v0->base.angleVelX = sp20->angleVelX; - var_v0->base.angleVelZ = sp20->angleVelZ; - func_800B0010(var_v0, arg0, arg1, sp20); - var_v0->base.gravity = gParticleGravityTable[(var_v0->base.segment.unk40 >> 4) & 7]; - if (var_v0->base.segment.particle.movementType == PARTICLE_MOVEMENT_VELOCITY) { - temp_f0 = var_v0->base.segment.x_velocity; - temp_f2 = var_v0->base.segment.y_velocity; - temp_f14 = var_v0->base.segment.z_velocity; - var_v0->base.forwardVel = sqrtf((temp_f0 * temp_f0) + (temp_f2 * temp_f2) + (temp_f14 * temp_f14)); + particle->base.angleVelY = behavior->angleVelY; + particle->base.angleVelX = behavior->angleVelX; + particle->base.angleVelZ = behavior->angleVelZ; + + setup_particle_velocity(particle, obj, emitter, behavior); + + particle->base.gravity = gParticleGravityTable[(particle->base.segment.unk40 >> 4) & 7]; + if (particle->base.segment.particle.movementType == PARTICLE_MOVEMENT_VELOCITY) { + particle->base.forwardVel = sqrtf((particle->base.segment.x_velocity * particle->base.segment.x_velocity) + (particle->base.segment.y_velocity * particle->base.segment.y_velocity) + (particle->base.segment.z_velocity * particle->base.segment.z_velocity)); } - if (sp20->flags & 2) { - arg1->angle.rotation.z_rotation += sp20->unk1C; - arg1->angle.direction.y_rotation += sp20->unk1E; + if (behavior->emitterFlags & PARTICLE_BEHAVIOR_FLAG_2) { + emitter->angle.rotation.z_rotation += behavior->unk1C; + emitter->angle.direction.y_rotation += behavior->unk1E; } - if (sp20->flags & 8) { - arg1->angle.direction.x_rotation += sp20->unk2A; - arg1->angle.direction.z_rotation += sp20->unk2C; + if (behavior->emitterFlags & PARTICLE_BEHAVIOR_FLAG_8) { + emitter->angle.direction.x_rotation += behavior->unk2A; + emitter->angle.direction.z_rotation += behavior->unk2C; } - var_v0->base.segment.unk1A = properties->unk6; - var_v0->base.segment.textureFrame = 0; - texture = &var_v0->base.modelData->texture; + particle->base.segment.unk1A = properties->unk6; + particle->base.segment.textureFrame = 0; + model = particle->base.modelData; if (properties->textureID == -1) { - *texture = NULL; + model->texture = NULL; } else { - *texture = load_texture(properties->textureID); - if ((*texture) != NULL) { - if ((*texture)->flags & 4) { - if (var_v0->base.segment.unk40 & 0x1000) { - var_v0->base.segment.trans.flags |= OBJ_FLAGS_UNK_0100; + model->texture = load_texture(properties->textureID); + if (model->texture != NULL) { + if (model->texture->flags & 4) { + if (particle->base.segment.unk40 & PARTICLE_F40_1000) { + particle->base.segment.trans.flags |= OBJ_FLAGS_UNK_0100; } else { - var_v0->base.segment.trans.flags |= OBJ_FLAGS_UNK_0080; + particle->base.segment.trans.flags |= OBJ_FLAGS_UNK_0080; } } - if ((var_v0->base.segment.unk40 & 3) == 2) { - var_v0->base.segment.textureFrame = (*texture)->numOfTextures - 1; + if ((particle->base.segment.unk40 & (PARTICLE_F40_1 | PARTICLE_F40_2)) == PARTICLE_F40_2) { + particle->base.segment.textureFrame = model->texture->numOfTextures - 1; } } } - var_v0->modelFrame = 0; - var_v0->unk76 = ((u32) (u16) properties->lifeTimeRange) >> 10; - var_v0->unk77 = 0; - if (*texture == NULL) { - func_800B2040(var_v0); + particle->modelFrame = 0; + particle->unk76 = ((u32) (u16) properties->lifeTimeRange) >> 10; + particle->unk77 = 0; + if (model->texture == NULL) { + particle_deallocate(particle); return NULL; } - return var_v0; + return particle; } -Particle *func_800B0BAC(Object *arg0, ParticleEmitter *arg1) { +Particle *init_line_particle(Object *obj, ParticleEmitter *emitter) { ParticleProperties *sp34; - Particle *sp30; - ParticleModel *sp2C; + Particle *particle; + ParticleModel *model; ParticleBehavior *sp28; unkParticleBehaviorUnk9C *sp24; - sp34 = gParticlesAssetTable[arg1->propertyID]; - if (sp34->unk0 != 3) { + sp34 = gParticlesAssetTable[emitter->propertyID]; + if (sp34->kind != PARTICLE_KIND_LINE) { return NULL; } - sp28 = arg1->behaviour; + sp28 = emitter->behaviour; sp24 = (unkParticleBehaviorUnk9C *) sp28->unk9C; - sp30 = func_800B1CB8(3); - if (sp30 == NULL) { + particle = particle_allocate(PARTICLE_KIND_LINE); + if (particle == NULL) { return NULL; } - sp30->segment.object.segmentID = arg0->segment.object.segmentID; - sp30->segment.trans.flags = -0x8000; - sp30->segment.object.opacity = sp34->movementType; - sp30->segment.unk40 = sp34->unk2; - sp30->segment.unk3C = (ParticleSegment_3C *) arg0; - sp30->unk58_ptr = (Particle_58 **) arg1; - sp30->segment.trans.scale = sp34->scale * sp28->unk50; - sp30->segment.scaleVel = sp34->scale * sp28->unk54; - sp30->segment.particle.destroyTimer = sp34->lifeTime; - sp30->segment.particle.unk34 = 0.0f; - sp30->segment.object.unk38 = 0; + particle->segment.particle.segmentID = obj->segment.object.segmentID; + particle->segment.trans.flags = OBJ_FLAGS_DEACTIVATED; + particle->segment.particle.movementType = sp34->movementType; + particle->segment.unk40 = sp34->unk2; + particle->segment.parentObj = obj; + particle->lineEmitter = emitter; + particle->segment.trans.scale = sp34->scale * sp28->unk50; + particle->segment.scaleVel = sp34->scale * sp28->unk54; + particle->segment.particle.destroyTimer = sp34->lifeTime; + particle->segment.particle.unk34 = 0.0f; + particle->segment.particle.unk38 = 0; if (D_800E2D00->word != 0) { - sp30->colour.word = D_800E2D00->word; + particle->colour.word = D_800E2D00->word; } else { - sp30->colour.r = sp34->colour.r; - sp30->colour.g = sp34->colour.g; - sp30->colour.b = sp34->colour.b; + particle->colour.r = sp34->colour.r; + particle->colour.g = sp34->colour.g; + particle->colour.b = sp34->colour.b; } - sp30->colour.a = sp34->colour.a; - if (sp30->segment.unk40 & 0x800 && arg0->shading != NULL) { - sp30->brightness = arg0->shading->unk0 * 255.0f; + particle->colour.a = sp34->colour.a; + if (particle->segment.unk40 & PARTICLE_F40_800 && obj->shading != NULL) { + particle->brightness = obj->shading->unk0 * 255.0f; } else { - sp30->brightness = 0xFF; + particle->brightness = 0xFF; } - sp30->opacityTimer = sp34->opacityTimer; - sp30->opacity = sp34->opacity << 8; + particle->opacityTimer = sp34->opacityTimer; + particle->opacity = sp34->opacity << 8; if (sp34->opacity < 0xFF) { - if (sp30->segment.unk40 & 0x1000) { - sp30->segment.trans.flags |= OBJ_FLAGS_UNK_0100; + if (particle->segment.unk40 & PARTICLE_F40_1000) { + particle->segment.trans.flags |= OBJ_FLAGS_UNK_0100; } else { - sp30->segment.trans.flags |= OBJ_FLAGS_UNK_0080; + particle->segment.trans.flags |= OBJ_FLAGS_UNK_0080; } } - if (sp30->opacityTimer < sp30->segment.particle.destroyTimer) { - sp30->opacityVel = - (((sp34->opacityVel - sp34->opacity) << 8) / (sp30->segment.particle.destroyTimer - sp30->opacityTimer)); + if (particle->opacityTimer < particle->segment.particle.destroyTimer) { + particle->opacityVel = + (((sp34->opacityVel - sp34->opacity) << 8) / (particle->segment.particle.destroyTimer - particle->opacityTimer)); } else { - sp30->opacityVel = 0; + particle->opacityVel = 0; } // TODO check union member - arg1->pos.x = arg1->baseVelX; - arg1->pos.y = arg1->baseVelY; - arg1->pos.z = arg1->baseVelZ; - f32_vec3_apply_object_rotation(&arg0->segment.trans, &arg1->pos.x); - arg1->pos.x += arg0->segment.trans.x_position; - arg1->pos.y += arg0->segment.trans.y_position; - arg1->pos.z += arg0->segment.trans.z_position; - sp30->unk68b = 0; - sp30->unk6Ab = 0; - sp30->unk6Bb = -1; - sp30->segment.unk1A = sp34->unk6; - sp30->segment.textureFrame = 0; - sp2C = sp30->modelData; + emitter->pos.x = emitter->baseVelX; + emitter->pos.y = emitter->baseVelY; + emitter->pos.z = emitter->baseVelZ; + f32_vec3_apply_object_rotation(&obj->segment.trans, &emitter->pos.x); + emitter->pos.x += obj->segment.trans.x_position; + emitter->pos.y += obj->segment.trans.y_position; + emitter->pos.z += obj->segment.trans.z_position; + particle->unk68b = 0; + particle->unk6Ab = 0; + particle->unk6Bb = -1; + particle->segment.unk1A = sp34->unk6; + particle->segment.textureFrame = 0; + model = particle->modelData; if (sp34->textureID == -1) { - sp2C->texture = NULL; + model->texture = NULL; } else { - sp2C->texture = load_texture(sp34->textureID); - if (sp2C->texture != NULL) { - if (sp2C->texture->flags & 4) { - if (sp30->segment.unk40 & 0x1000) { - sp30->segment.trans.flags |= OBJ_FLAGS_UNK_0100; + model->texture = load_texture(sp34->textureID); + if (model->texture != NULL) { + if (model->texture->flags & 4) { + if (particle->segment.unk40 & PARTICLE_F40_1000) { + particle->segment.trans.flags |= OBJ_FLAGS_UNK_0100; } else { - sp30->segment.trans.flags |= OBJ_FLAGS_UNK_0080; + particle->segment.trans.flags |= OBJ_FLAGS_UNK_0080; } } - if ((sp30->segment.unk40 & 3) == 2) { - sp30->segment.textureFrame = sp2C->texture->numOfTextures - 1; + if ((particle->segment.unk40 & (PARTICLE_F40_1 | PARTICLE_F40_2)) == PARTICLE_F40_2) { + particle->segment.textureFrame = model->texture->numOfTextures - 1; } } } - sp2C->vertices->x = arg1->pos.x; - sp2C->vertices->y = arg1->pos.y; - sp2C->vertices->z = arg1->pos.z; + model->vertices->x = emitter->pos.x; + model->vertices->y = emitter->pos.y; + model->vertices->z = emitter->pos.z; if ((u32) sp24 != -1U) { - arg1->unk1E += 1; - if (arg1->unk1E >= sp24[0].unk0) { - arg1->unk1E = 0; + emitter->unk1E += 1; + if (emitter->unk1E >= sp24[0].unk0) { + emitter->unk1E = 0; } - sp2C->vertices->r = sp24[arg1->unk1E + 2].r; - sp2C->vertices->g = sp24[arg1->unk1E + 2].g; - sp2C->vertices->b = sp24[arg1->unk1E + 2].b; - sp2C->vertices->a = arg1->unk6; + model->vertices->r = sp24[emitter->unk1E + 2].r; + model->vertices->g = sp24[emitter->unk1E + 2].g; + model->vertices->b = sp24[emitter->unk1E + 2].b; + model->vertices->a = emitter->unk6; } else { - sp2C->vertices->r = sp30->colour.r; - sp2C->vertices->g = sp30->colour.g; - sp2C->vertices->b = sp30->colour.b; - sp2C->vertices->a = arg1->unk6; + model->vertices->r = particle->colour.r; + model->vertices->g = particle->colour.g; + model->vertices->b = particle->colour.b; + model->vertices->a = emitter->unk6; } - sp30->unk6Ab = ((u32) sp34->lifeTimeRangeUnsigned >> 10); - sp30->unk6Bb = ((u32) (sp34->lifeTimeWord << 22) >> 26); - sp30->segment.trans.x_position = arg0->segment.trans.x_position; - sp30->segment.trans.y_position = arg0->segment.trans.y_position; - sp30->segment.trans.z_position = arg0->segment.trans.z_position; - arg1->opacity = 0; - return sp30; + particle->unk6Ab = ((u32) sp34->lifeTimeRangeUnsigned >> 10); + particle->unk6Bb = ((u32) (sp34->lifeTimeWord << 22) >> 26); + particle->segment.trans.x_position = obj->segment.trans.x_position; + particle->segment.trans.y_position = obj->segment.trans.y_position; + particle->segment.trans.z_position = obj->segment.trans.z_position; + emitter->opacity = 0; + return particle; } -Particle *func_800B1130(Object *arg0, ParticleEmitter *arg1) { - s32 flags; +Particle *init_general_particle(Object *obj, ParticleEmitter *emitter) { + s32 randomizationFlags; ParticleProperties *properties; - Particle *var_v0; + Particle *particle; TextureHeader **texture; ParticleBehavior *behaviour; unk800B1130_SP28 *sp28; f32 sp24; s8 sp23; - properties = gParticlesAssetTable[arg1->propertyID]; - if (properties->unk0 == 3 || properties->unk0 == 4) { + properties = gParticlesAssetTable[emitter->propertyID]; + if (properties->kind == PARTICLE_KIND_LINE || properties->kind == PARTICLE_KIND_POINT) { return NULL; } - behaviour = arg1->behaviour; + behaviour = emitter->behaviour; sp28 = (unk800B1130_SP28 *) behaviour->unk9C; - var_v0 = func_800B1CB8(properties->unk0); - if (var_v0 == NULL) { - return var_v0; + particle = particle_allocate(properties->kind); + if (particle == NULL) { + return particle; } - var_v0->segment.particle.blockID = arg0->segment.particle.blockID; - var_v0->segment.trans.flags = -OBJ_FLAGS_DEACTIVATED; - var_v0->segment.particle.movementType = properties->movementType; - var_v0->segment.unk40 = properties->unk2; - var_v0->segment.unk3C = arg0; - if (var_v0->segment.unk40 & 0x800 && arg0->shading != NULL) { - var_v0->brightness = arg0->shading->unk0 * 255.0f; + particle->segment.particle.segmentID = obj->segment.particle.segmentID; + particle->segment.trans.flags = OBJ_FLAGS_DEACTIVATED; + particle->segment.particle.movementType = properties->movementType; + particle->segment.unk40 = properties->unk2; + particle->segment.parentObj = obj; + if ((particle->segment.unk40 & PARTICLE_F40_800) && obj->shading != NULL) { + particle->brightness = obj->shading->unk0 * 255.0f; } else { - var_v0->brightness = 255; + particle->brightness = 255; } sp24 = behaviour->unk50; - if (behaviour->behaviourFlags & PARTICLE_UNK00020000) { + if (behaviour->randomizationFlags & PARTICLE_UNK00020000) { sp24 += (f32) get_random_number_from_range(-behaviour->unk8C, behaviour->unk8C) * 0.00001525878906; } - var_v0->segment.trans.scale = properties->scale * sp24; + particle->segment.trans.scale = properties->scale * sp24; sp24 = behaviour->unk54; - if (behaviour->behaviourFlags & PARTICLE_UNK00040000) { + if (behaviour->randomizationFlags & PARTICLE_UNK00040000) { sp24 += (f32) get_random_number_from_range(-behaviour->unk90, behaviour->unk90) * 0.00001525878906; } - if (behaviour->flags & 0x1000) { - var_v0->segment.scaleVel = 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)) * + if (behaviour->emitterFlags & PARTICLE_BEHAVIOR_FLAG_1000) { + particle->segment.scaleVel = sqrtf((obj->segment.x_velocity * obj->segment.x_velocity) + + (obj->segment.y_velocity * obj->segment.y_velocity) + + (obj->segment.z_velocity * obj->segment.z_velocity)) * sp24 * 0.1f; } else { - var_v0->segment.scaleVel = properties->scale * sp24; + particle->segment.scaleVel = properties->scale * sp24; } - var_v0->segment.particle.destroyTimer = + particle->segment.particle.destroyTimer = get_random_number_from_range(-properties->lifeTimeRange, properties->lifeTimeRange) + properties->lifeTime; - var_v0->segment.particle.unk38 = 0.0f; - var_v0->segment.particle.unk34 = 0.0f; + particle->segment.particle.unk38 = 0.0f; + particle->segment.particle.unk34 = 0.0f; if (D_800E2D00[0].word != 0) { - var_v0->colour.word = D_800E2D00[0].word; + particle->colour.word = D_800E2D00[0].word; } else if ((s32) sp28 != -1) { - arg1->unk1E++; - if (arg1->unk1E >= sp28->unk0) { - arg1->unk1E = 0; + emitter->unk1E++; + if (emitter->unk1E >= sp28->unk0) { + emitter->unk1E = 0; } - var_v0->colour.r = sp28[arg1->unk1E + 2].r; - var_v0->colour.g = sp28[arg1->unk1E + 2].g; - var_v0->colour.b = sp28[arg1->unk1E + 2].b; - var_v0->colour.a = sp28[arg1->unk1E + 2].a; + particle->colour.r = sp28[emitter->unk1E + 2].r; + particle->colour.g = sp28[emitter->unk1E + 2].g; + particle->colour.b = sp28[emitter->unk1E + 2].b; + particle->colour.a = sp28[emitter->unk1E + 2].a; } else { - var_v0->colour.r = properties->colour.r; - var_v0->colour.g = properties->colour.g; - var_v0->colour.b = properties->colour.b; - var_v0->colour.a = properties->colour.a; + particle->colour.r = properties->colour.r; + particle->colour.g = properties->colour.g; + particle->colour.b = properties->colour.b; + particle->colour.a = properties->colour.a; } - flags = behaviour->behaviourFlags & + randomizationFlags = behaviour->randomizationFlags & (PARTICLE_COLOURVEL_ALPHA | PARTICLE_COLOURVEL_BLUE | PARTICLE_COLOURVEL_GREEN | PARTICLE_COLOURVEL_RED); - if (flags) { - if (flags & PARTICLE_COLOURVEL_RED) { - var_v0->colour.r += get_random_number_from_range(-behaviour->colourRangeR, behaviour->colourRangeR); + if (randomizationFlags) { + if (randomizationFlags & PARTICLE_COLOURVEL_RED) { + particle->colour.r += get_random_number_from_range(-behaviour->colourRangeR, behaviour->colourRangeR); } - if (flags & PARTICLE_COLOURVEL_GREEN) { - var_v0->colour.g += get_random_number_from_range(-behaviour->colourRangeG, behaviour->colourRangeG); + if (randomizationFlags & PARTICLE_COLOURVEL_GREEN) { + particle->colour.g += get_random_number_from_range(-behaviour->colourRangeG, behaviour->colourRangeG); } - if (flags & PARTICLE_COLOURVEL_BLUE) { - var_v0->colour.b += get_random_number_from_range(-behaviour->colourRangeB, behaviour->colourRangeB); + if (randomizationFlags & PARTICLE_COLOURVEL_BLUE) { + particle->colour.b += get_random_number_from_range(-behaviour->colourRangeB, behaviour->colourRangeB); } - if (flags & PARTICLE_COLOURVEL_ALPHA) { - var_v0->colour.a += get_random_number_from_range(-behaviour->colourRangeA, behaviour->colourRangeA); + if (randomizationFlags & PARTICLE_COLOURVEL_ALPHA) { + particle->colour.a += get_random_number_from_range(-behaviour->colourRangeA, behaviour->colourRangeA); } } - var_v0->opacityTimer = properties->opacityTimer; - var_v0->opacity = properties->opacity * gParticleOpacity; + particle->opacityTimer = properties->opacityTimer; + particle->opacity = properties->opacity * gParticleOpacity; if (properties->opacity < 255) { - if (var_v0->segment.unk40 & 0x1000) { - var_v0->segment.trans.flags |= OBJ_FLAGS_UNK_0100; + if (particle->segment.unk40 & PARTICLE_F40_1000) { + particle->segment.trans.flags |= OBJ_FLAGS_UNK_0100; } else { - var_v0->segment.trans.flags |= OBJ_FLAGS_UNK_0080; + particle->segment.trans.flags |= OBJ_FLAGS_UNK_0080; } } - if (var_v0->opacityTimer < var_v0->segment.particle.destroyTimer) { - var_v0->opacityVel = (s16) (((properties->opacityVel - properties->opacity) * gParticleOpacity) / - (var_v0->segment.particle.destroyTimer - var_v0->opacityTimer)); + if (particle->opacityTimer < particle->segment.particle.destroyTimer) { + particle->opacityVel = (s16) (((properties->opacityVel - properties->opacity) * gParticleOpacity) / + (particle->segment.particle.destroyTimer - particle->opacityTimer)); } else { - var_v0->opacityVel = 0; + particle->opacityVel = 0; } sp23 = 0; - var_v0->segment.unk1A = properties->unk6; - if (var_v0->segment.particle.unk2C == 0x80) { - var_v0->modelData = (ParticleModel *) func_8007C12C(properties->textureID, 0); - if (var_v0->modelData) { - if ((*var_v0->unk44_1->unk8)->unk6 & 4) { - if (var_v0->segment.unk40 & 0x1000) { - var_v0->segment.trans.flags |= OBJ_FLAGS_UNK_0100; + particle->segment.unk1A = properties->unk6; + if (particle->segment.particle.kind == PARTICLE_KIND_SPRITE) { + particle->modelData = (ParticleModel *) func_8007C12C(properties->textureID, 0); + if (particle->modelData != NULL) { + if ((*particle->unk44_1->unk8)->unk6 & 4) { + if (particle->segment.unk40 & PARTICLE_F40_1000) { + particle->segment.trans.flags |= OBJ_FLAGS_UNK_0100; } else { - var_v0->segment.trans.flags |= OBJ_FLAGS_UNK_0080; + particle->segment.trans.flags |= OBJ_FLAGS_UNK_0080; } } - if (behaviour->flags & PARTICLE_ANGLE_Y) { - var_v0->segment.textureFrame = get_random_number_from_range(0, var_v0->unk44_1->textureCount - 1) << 8; - if ((var_v0->segment.unk40 & 3) == 2) { - var_v0->segment.textureFrame |= 0xFF; + if (behaviour->emitterFlags & PARTICLE_ANGLE_Y) { + particle->segment.textureFrame = get_random_number_from_range(0, particle->unk44_1->textureCount - 1) << 8; + if ((particle->segment.unk40 & (PARTICLE_F40_1 | PARTICLE_F40_2)) == PARTICLE_F40_2) { + particle->segment.textureFrame |= 0xFF; } - } else if ((var_v0->segment.unk40 & 3) == 2) { - var_v0->segment.textureFrame = (var_v0->unk44_1->textureCount << 8) - 1; + } else if ((particle->segment.unk40 & (PARTICLE_F40_1 | PARTICLE_F40_2)) == PARTICLE_F40_2) { + particle->segment.textureFrame = (particle->unk44_1->textureCount << 8) - 1; } else { - var_v0->segment.textureFrame = 0; + particle->segment.textureFrame = 0; } } else { sp23 = 1; } - } else if ((var_v0->segment.particle.unk2C == 2) || (var_v0->segment.particle.unk2C == 1)) { - texture = &var_v0->modelData->texture; + } else if ((particle->segment.particle.kind == PARTICLE_KIND_RECTANGLE) || + (particle->segment.particle.kind == PARTICLE_KIND_TRIANGLE)) { + texture = &particle->modelData->texture; if (texture) { *texture = load_texture(properties->textureID); if (*texture != NULL) { if ((*texture)->flags & 4) { - if (var_v0->segment.unk40 & 0x1000) { - var_v0->segment.trans.flags |= OBJ_FLAGS_UNK_0100; + if (particle->segment.unk40 & PARTICLE_F40_1000) { + particle->segment.trans.flags |= OBJ_FLAGS_UNK_0100; } else { - var_v0->segment.trans.flags |= OBJ_FLAGS_UNK_0080; + particle->segment.trans.flags |= OBJ_FLAGS_UNK_0080; } } - if (behaviour->flags & 0x800) { - var_v0->segment.textureFrame = get_random_number_from_range(0, ((*texture)->numOfTextures >> 8) - 1) + if (behaviour->emitterFlags & PARTICLE_BEHAVIOR_FLAG_800) { + particle->segment.textureFrame = get_random_number_from_range(0, ((*texture)->numOfTextures >> 8) - 1) << 8; - if ((var_v0->segment.unk40 & 3) == 2) { - var_v0->segment.textureFrame |= 0xFF; + if ((particle->segment.unk40 & (PARTICLE_F40_1 | PARTICLE_F40_2)) == PARTICLE_F40_2) { + particle->segment.textureFrame |= 0xFF; } - } else if ((var_v0->segment.unk40 & 3) == 2) { - var_v0->segment.textureFrame = (*texture)->numOfTextures - 1; + } else if ((particle->segment.unk40 & (PARTICLE_F40_1 | PARTICLE_F40_2)) == PARTICLE_F40_2) { + particle->segment.textureFrame = (*texture)->numOfTextures - 1; } else { - var_v0->segment.textureFrame = 0; + particle->segment.textureFrame = 0; } } else { sp23 = 1; @@ -1451,250 +1470,250 @@ Particle *func_800B1130(Object *arg0, ParticleEmitter *arg1) { } } if (sp23 == 0) { - if (var_v0->segment.particle.unk2C == 1) { - func_800AF0A4(var_v0); + if (particle->segment.particle.kind == PARTICLE_KIND_TRIANGLE) { + func_800AF0A4(particle); } - if (var_v0->segment.particle.unk2C == 2) { - func_800AF0F0(var_v0); + if (particle->segment.particle.kind == PARTICLE_KIND_RECTANGLE) { + func_800AF0F0(particle); } } - func_800B03C0(var_v0, arg0, arg1, behaviour); - if (behaviour->flags & 0x80) { - var_v0->segment.trans.rotation.y_rotation = behaviour->angleOffsetY; - var_v0->segment.trans.rotation.x_rotation = behaviour->angleOffsetX; - var_v0->segment.trans.rotation.z_rotation = behaviour->angleOffsetZ; + setup_particle_position(particle, obj, emitter, behaviour); + if (behaviour->emitterFlags & PARTICLE_BEHAVIOR_FLAG_80) { + particle->segment.trans.rotation.y_rotation = behaviour->angleOffsetY; + particle->segment.trans.rotation.x_rotation = behaviour->angleOffsetX; + particle->segment.trans.rotation.z_rotation = behaviour->angleOffsetZ; } else { - var_v0->segment.trans.rotation.y_rotation = arg0->segment.trans.rotation.y_rotation + behaviour->angleOffsetY; - var_v0->segment.trans.rotation.x_rotation = arg0->segment.trans.rotation.x_rotation + behaviour->angleOffsetX; - var_v0->segment.trans.rotation.z_rotation = arg0->segment.trans.rotation.z_rotation + behaviour->angleOffsetZ; + particle->segment.trans.rotation.y_rotation = obj->segment.trans.rotation.y_rotation + behaviour->angleOffsetY; + particle->segment.trans.rotation.x_rotation = obj->segment.trans.rotation.x_rotation + behaviour->angleOffsetX; + particle->segment.trans.rotation.z_rotation = obj->segment.trans.rotation.z_rotation + behaviour->angleOffsetZ; } - flags = behaviour->behaviourFlags & (PARTICLE_ANGLE_Z | PARTICLE_ANGLE_X | PARTICLE_ANGLE_Y); - if (flags != 0) { - if (flags & PARTICLE_ANGLE_Y) { - var_v0->segment.trans.rotation.y_rotation += + randomizationFlags = behaviour->randomizationFlags & (PARTICLE_ANGLE_Z | PARTICLE_ANGLE_X | PARTICLE_ANGLE_Y); + if (randomizationFlags != 0) { + if (randomizationFlags & PARTICLE_ANGLE_Y) { + particle->segment.trans.rotation.y_rotation += get_random_number_from_range(-behaviour->angleRangeY3, behaviour->angleRangeY3); } - if (flags & PARTICLE_ANGLE_X) { - var_v0->segment.trans.rotation.x_rotation += + if (randomizationFlags & PARTICLE_ANGLE_X) { + particle->segment.trans.rotation.x_rotation += get_random_number_from_range(-behaviour->angleRangeX3, behaviour->angleRangeX3); } - if (flags & PARTICLE_ANGLE_Z) { - var_v0->segment.trans.rotation.z_rotation += + if (randomizationFlags & PARTICLE_ANGLE_Z) { + particle->segment.trans.rotation.z_rotation += get_random_number_from_range(-behaviour->angleRangeZ3, behaviour->angleRangeZ3); } } - var_v0->angleVelY = behaviour->angleVelY; - var_v0->angleVelX = behaviour->angleVelX; - var_v0->angleVelZ = behaviour->angleVelZ; - flags = behaviour->behaviourFlags & (PARTICLE_ANGLEVEL_Z | PARTICLE_ANGLEVEL_X | PARTICLE_ANGLEVEL_Y); - if (flags) { - if (flags & PARTICLE_ANGLEVEL_Y) { - var_v0->angleVelY += get_random_number_from_range(-behaviour->unk86, behaviour->unk86); + particle->angleVelY = behaviour->angleVelY; + particle->angleVelX = behaviour->angleVelX; + particle->angleVelZ = behaviour->angleVelZ; + randomizationFlags = behaviour->randomizationFlags & (PARTICLE_ANGLEVEL_Z | PARTICLE_ANGLEVEL_X | PARTICLE_ANGLEVEL_Y); + if (randomizationFlags) { + if (randomizationFlags & PARTICLE_ANGLEVEL_Y) { + particle->angleVelY += get_random_number_from_range(-behaviour->unk86, behaviour->unk86); } - if (flags & PARTICLE_ANGLEVEL_X) { - var_v0->angleVelX += get_random_number_from_range(-behaviour->unk88, behaviour->unk88); + if (randomizationFlags & PARTICLE_ANGLEVEL_X) { + particle->angleVelX += get_random_number_from_range(-behaviour->unk88, behaviour->unk88); } - if (flags & PARTICLE_ANGLEVEL_Z) { - var_v0->angleVelZ += get_random_number_from_range(-behaviour->unk8A, behaviour->unk8A); + if (randomizationFlags & PARTICLE_ANGLEVEL_Z) { + particle->angleVelZ += get_random_number_from_range(-behaviour->unk8A, behaviour->unk8A); } } - func_800B0010(var_v0, arg0, arg1, behaviour); - var_v0->gravity = gParticleGravityTable[(var_v0->segment.unk40 >> 4) & 7]; - if (var_v0->segment.particle.movementType == PARTICLE_MOVEMENT_VELOCITY) { - 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)); + setup_particle_velocity(particle, obj, emitter, behaviour); + particle->gravity = gParticleGravityTable[(particle->segment.unk40 >> 4) & 7]; + if (particle->segment.particle.movementType == PARTICLE_MOVEMENT_VELOCITY) { + particle->forwardVel = sqrtf((particle->segment.x_velocity * particle->segment.x_velocity) + + (particle->segment.y_velocity * particle->segment.y_velocity) + + (particle->segment.z_velocity * particle->segment.z_velocity)); } - if (behaviour->flags & 2) { - arg1->unk6++; - if (arg1->unk6 >= behaviour->unk1A) { - arg1->angle.rotation.y_rotation += behaviour->unk1C; - arg1->angle.rotation.x_rotation += behaviour->unk1E; - arg1->angle.rotation.z_rotation += behaviour->unk18; - arg1->unk6 -= behaviour->unk1A; + if (behaviour->emitterFlags & PARTICLE_BEHAVIOR_FLAG_2) { + emitter->unk6++; + if (emitter->unk6 >= behaviour->unk1A) { + emitter->angle.rotation.y_rotation += behaviour->unk1C; + emitter->angle.rotation.x_rotation += behaviour->unk1E; + emitter->angle.rotation.z_rotation += behaviour->unk18; + emitter->unk6 -= behaviour->unk1A; } } - if (behaviour->flags & 8) { - arg1->lifeTime++; - if (arg1->lifeTime >= behaviour->unk28) { - arg1->angle.direction.y_rotation += behaviour->unk2A; - arg1->angle.direction.x_rotation += behaviour->unk2C; - arg1->angle.direction.z_rotation += behaviour->unk2E; - arg1->lifeTime -= behaviour->unk28; + if (behaviour->emitterFlags & PARTICLE_BEHAVIOR_FLAG_8) { + emitter->lifeTime++; + if (emitter->lifeTime >= behaviour->unk28) { + emitter->angle.direction.y_rotation += behaviour->unk2A; + emitter->angle.direction.x_rotation += behaviour->unk2C; + emitter->angle.direction.z_rotation += behaviour->unk2E; + emitter->lifeTime -= behaviour->unk28; } } - if (var_v0->modelData == NULL) { - func_800B2040(var_v0); + if (particle->modelData == NULL) { + particle_deallocate(particle); return NULL; } else { - return var_v0; + return particle; } } -Particle *func_800B1CB8(s32 arg0) { +Particle *particle_allocate(s32 kind) { s32 i; - Particle *var_v1; + Particle *particle; - var_v1 = NULL; + particle = NULL; i = 0; - switch (arg0) { - case 0x80: - if ((gPointParticleBuffer != NULL)) { - if (gNumPointParticles >= gMaxPointParticles - 1) { + switch (kind) { + case PARTICLE_KIND_SPRITE: + if ((gSpriteParticleBuffer != NULL)) { + if (gNumSpriteParticles >= gMaxSpriteParticles - 1) { if (D_800E2CBC == 0) { D_800E2CBC = 1; } } else { - while (gPointParticleBuffer[i].segment.particle.unk2C != 0) { + while (gSpriteParticleBuffer[i].segment.particle.kind != PARTICLE_KIND_NONE) { i++; } - gPointParticleBuffer[i].segment.particle.unk2C = 0x80; - gNumPointParticles++; - var_v1 = (Particle *) &gPointParticleBuffer[i]; + gSpriteParticleBuffer[i].segment.particle.kind = PARTICLE_KIND_SPRITE; + gNumSpriteParticles++; + particle = &gSpriteParticleBuffer[i]; } } break; - case 1: + case PARTICLE_KIND_TRIANGLE: if (gTriangleParticleBuffer != NULL) { if (gNumTriangleParticles >= gMaxTriangleParticles - 1) { if (D_800E2CA4 == 0) { D_800E2CA4 = 1; } } else { - while (gTriangleParticleBuffer[i].segment.particle.unk2C != 0) { + while (gTriangleParticleBuffer[i].segment.particle.kind != PARTICLE_KIND_NONE) { i++; } - gTriangleParticleBuffer[i].segment.particle.unk2C = 1; + gTriangleParticleBuffer[i].segment.particle.kind = PARTICLE_KIND_TRIANGLE; gNumTriangleParticles++; - var_v1 = (Particle *) &gTriangleParticleBuffer[i]; + particle = &gTriangleParticleBuffer[i]; } } break; - case 2: + case PARTICLE_KIND_RECTANGLE: if (gRectangleParticleBuffer != NULL) { if (gNumRectangleParticles >= gMaxRectangleParticles - 1) { if (D_800E2CB0 == 0) { D_800E2CB0 = 1; } } else { - while (gRectangleParticleBuffer[i].segment.particle.unk2C != 0) { + while (gRectangleParticleBuffer[i].segment.particle.kind != PARTICLE_KIND_NONE) { i++; } - gRectangleParticleBuffer[i].segment.particle.unk2C = 2; + gRectangleParticleBuffer[i].segment.particle.kind = PARTICLE_KIND_RECTANGLE; gNumRectangleParticles++; - var_v1 = (Particle *) &gRectangleParticleBuffer[i]; + particle = &gRectangleParticleBuffer[i]; } } break; - case 3: + case PARTICLE_KIND_LINE: if (gLineParticleBuffer != NULL) { if (gNumLineParticles >= gMaxLineParticles - 1) { if (D_800E2CC8 == 0) { D_800E2CC8 = 1; } } else { - while (gLineParticleBuffer[i].segment.particle.unk2C != 0) { + while (gLineParticleBuffer[i].segment.particle.kind != PARTICLE_KIND_NONE) { i++; } - gLineParticleBuffer[i].segment.particle.unk2C = 3; + gLineParticleBuffer[i].segment.particle.kind = PARTICLE_KIND_LINE; gNumLineParticles++; - var_v1 = (Particle *) &gLineParticleBuffer[i]; + particle = &gLineParticleBuffer[i]; } } break; - case 4: - if (gSpriteParticleBuffer != NULL) { - if (gNumSpriteParticles >= gMaxSpriteParticles - 1) { + case PARTICLE_KIND_POINT: + if (gPointParticleBuffer != NULL) { + if (gNumPointParticles >= gMaxPointParticles - 1) { if (D_800E2CD4 == 0) { D_800E2CD4 = 1; } } else { - while (gSpriteParticleBuffer[i].base.segment.particle.unk2C != 0) { + while (gPointParticleBuffer[i].base.segment.particle.kind != PARTICLE_KIND_NONE) { i++; } - gSpriteParticleBuffer[i].base.segment.particle.unk2C = 4; - gNumSpriteParticles++; - var_v1 = (Particle *) &gSpriteParticleBuffer[i]; + gPointParticleBuffer[i].base.segment.particle.kind = PARTICLE_KIND_POINT; + gNumPointParticles++; + particle = &gPointParticleBuffer[i]; } } break; } - if (var_v1 != NULL) { - var_v1->behaviorId = -1; + if (particle != NULL) { + particle->behaviorId = -1; } - return var_v1; + return particle; } -void func_800B2040(Particle *arg0) { +void particle_deallocate(Particle *particle) { TextureHeader *tex; - switch (arg0->segment.particle.unk2C) { - case 0x80: - if (gNumPointParticles > 0) { - if (arg0->modelData) { - free_sprite((Sprite *) &arg0->modelData->texture); + switch (particle->segment.particle.kind) { + case PARTICLE_KIND_SPRITE: + if (gNumSpriteParticles > 0) { + if (particle->modelData) { + free_sprite((Sprite *) particle->unk44_1); } - gNumPointParticles--; - arg0->segment.particle.unk2C = 0; + gNumSpriteParticles--; + particle->segment.particle.kind = PARTICLE_KIND_NONE; } break; - case 0: + case PARTICLE_KIND_NONE: return; - case 1: + case PARTICLE_KIND_TRIANGLE: if (gNumTriangleParticles > 0) { - tex = arg0->modelData->texture; + tex = particle->modelData->texture; if (tex != NULL) { free_texture(tex); } gNumTriangleParticles--; - arg0->segment.particle.unk2C = 0; + particle->segment.particle.kind = PARTICLE_KIND_NONE; } break; - case 2: + case PARTICLE_KIND_RECTANGLE: if (gNumRectangleParticles > 0) { - tex = arg0->modelData->texture; + tex = particle->modelData->texture; if (tex != NULL) { free_texture(tex); } gNumRectangleParticles--; - arg0->segment.particle.unk2C = 0; + particle->segment.particle.kind = PARTICLE_KIND_NONE; } break; - case 3: + case PARTICLE_KIND_LINE: if (gNumLineParticles > 0) { - tex = arg0->modelData->texture; + tex = particle->modelData->texture; if (tex != NULL) { free_texture(tex); } gNumLineParticles--; - arg0->segment.particle.unk2C = 0; + particle->segment.particle.kind = PARTICLE_KIND_NONE; } break; - case 4: - if (gNumSpriteParticles > 0) { - func_800B263C(arg0); - tex = arg0->modelData->texture; + case PARTICLE_KIND_POINT: + if (gNumPointParticles > 0) { + func_800B263C(particle); + tex = particle->modelData->texture; if (tex != NULL) { free_texture(tex); } - gNumSpriteParticles--; - arg0->segment.particle.unk2C = 0; + gNumPointParticles--; + particle->segment.particle.kind = PARTICLE_KIND_NONE; } break; } } void func_800B2260(ParticleEmitter *emitter) { - SpriteParticle *temp_v0; + PointParticle *temp_v0; s32 i; - if (emitter->flags & 0x400) { + if (emitter->emmmflags & PARTICLE_BEHAVIOR_FLAG_400) { if (emitter->unkC_60 != NULL) { for (i = 0; i < emitter->unk6; i++) { temp_v0 = emitter->unkC_60[i]; temp_v0->base.segment.particle.destroyTimer = 0; - temp_v0->unk70 = 0; + temp_v0->pointEmitter = 0; } mempool_free(emitter->unkC_60); emitter->unkC_60 = NULL; @@ -1708,26 +1727,26 @@ void func_800B2260(ParticleEmitter *emitter) { */ void handle_particle_movement(Particle *particle, s32 updateRate) { LevelModelSegmentBoundingBox *boundingBox; - SpriteParticle *tempParticle; + PointParticle *pointParticle; gParticleUpdateRate = updateRate; - tempParticle = NULL; - if (particle->segment.particle.unk2C == 3) { - func_800B26E0(particle); + pointParticle = NULL; + if (particle->segment.particle.kind == PARTICLE_KIND_LINE) { + move_line_particle(particle); } else { - if (particle->segment.unk40 & 3) { + if (particle->segment.unk40 & (PARTICLE_F40_1 | PARTICLE_F40_2)) { if (gParticleUpdateRate > 0) { set_particle_texture_frame(particle); } } - if (particle->segment.particle.unk2C == 4) { - tempParticle = particle; - ((SpriteParticle *) particle)->modelFrame = 1 - ((SpriteParticle *) particle)->modelFrame; - ((SpriteParticle *) particle)->unk77 = 0; + if (particle->segment.particle.kind == PARTICLE_KIND_POINT) { + pointParticle = particle; + pointParticle->modelFrame = 1 - pointParticle->modelFrame; + pointParticle->unk77 = 0; } - if (tempParticle == NULL || (tempParticle && tempParticle->unk70)) { - if (particle->segment.particle.movementType == PARTICLE_MOVEMENT_VELOCITIES) { - move_particle_with_velocities(particle); + if (pointParticle == NULL || (pointParticle != NULL && pointParticle->pointEmitter != NULL)) { + if (particle->segment.particle.movementType == PARTICLE_MOVEMENT_ACCELERATION) { + move_particle_with_acceleration(particle); } else if (particle->segment.particle.movementType == PARTICLE_MOVEMENT_VELOCITY_PARENT) { move_particle_velocity_parent(particle); } else if (particle->segment.particle.movementType == PARTICLE_MOVEMENT_BASIC_PARENT) { @@ -1738,7 +1757,7 @@ void handle_particle_movement(Particle *particle, s32 updateRate) { move_particle_basic(particle); } } - boundingBox = get_segment_bounding_box(particle->segment.particle.blockID); + boundingBox = get_segment_bounding_box(particle->segment.particle.segmentID); if (boundingBox != NULL) { if (particle->segment.trans.x_position < boundingBox->x1 || boundingBox->x2 < particle->segment.trans.x_position || @@ -1746,12 +1765,12 @@ void handle_particle_movement(Particle *particle, s32 updateRate) { boundingBox->y2 < particle->segment.trans.y_position || particle->segment.trans.z_position < boundingBox->z1 || boundingBox->z2 < particle->segment.trans.z_position) { - particle->segment.particle.blockID = get_level_segment_index_from_position( + particle->segment.particle.segmentID = get_level_segment_index_from_position( particle->segment.trans.x_position, particle->segment.trans.y_position, particle->segment.trans.z_position); } } else { - particle->segment.particle.blockID = get_level_segment_index_from_position( + particle->segment.particle.segmentID = get_level_segment_index_from_position( particle->segment.trans.x_position, particle->segment.trans.y_position, particle->segment.trans.z_position); } @@ -1762,7 +1781,7 @@ void handle_particle_movement(Particle *particle, s32 updateRate) { if (particle->opacityTimer == 0) { particle->opacity += gParticleUpdateRate * particle->opacityVel; if (particle->opacity < 0xFF) { - if (particle->segment.unk40 & 0x1000) { + if (particle->segment.unk40 & PARTICLE_F40_1000) { particle->segment.trans.flags |= OBJ_FLAGS_UNK_0100; } else { particle->segment.trans.flags |= OBJ_FLAGS_UNK_0080; @@ -1779,13 +1798,13 @@ void handle_particle_movement(Particle *particle, s32 updateRate) { } } -void func_800B263C(SpriteParticle *arg0) { +void func_800B263C(PointParticle *arg0) { ParticleEmitter *new_var; - SpriteParticle *new_var2; + PointParticle *new_var2; ParticleEmitter *temp_v0; s32 i; - temp_v0 = arg0->unk70; + temp_v0 = arg0->pointEmitter; if (temp_v0 != NULL) { new_var = temp_v0; if (temp_v0->unk6 != 0) { @@ -1801,32 +1820,33 @@ void func_800B263C(SpriteParticle *arg0) { } } -void func_800B26E0(Particle *particle) { +void move_line_particle(Particle *particle) { Vec3f sp44; f32 tempf; f32 scale; ParticleModel *particleModel; - ParticleSegment_3C *sp34; - Particle_58 *sp30; - Particle_58_0_9C *sp2C; - Particle_58_0_9C **sp2C_ptr; + Object *sp34; + ParticleEmitter *sp30; + unk800B1130_SP28 *sp2C; + unk800B1130_SP28 **sp2C_ptr; - sp34 = particle->segment.unk3C; - particleModel = 0; + sp34 = particle->segment.parentObj; + particleModel = NULL; sp2C_ptr = &sp2C; + if (sp34 != NULL) { - sp30 = (Particle_58 *) particle->unk58_ptr; - sp2C = sp30->unk0->unk9C; + sp30 = particle->lineEmitter; + sp2C = sp30->behaviour->unk9C; particleModel = particle->modelData; } if (particle->unk68b < 2 && sp34 != NULL) { - if (sp30->unk0->unk0 & 0x1000) { - scale = sqrtf((sp34->unk1C * sp34->unk1C) + (sp34->unk20 * sp34->unk20) + (sp34->unk24 * sp34->unk24)); + if (sp30->behaviour->emitterFlags & PARTICLE_BEHAVIOR_FLAG_1000) { + scale = sqrtf((sp34->segment.x_velocity * sp34->segment.x_velocity) + (sp34->segment.y_velocity * sp34->segment.y_velocity) + (sp34->segment.z_velocity * sp34->segment.z_velocity)); scale = scale * particle->segment.trans.scale * 0.1f; } else { scale = particle->segment.trans.scale; } - if (!(particle->segment.unk40 & 0x4000)) { + if (!(particle->segment.unk40 & PARTICLE_F40_4000)) { sp44.x = 0.0f; sp44.y = 0.0f; sp44.z = 0.0f; @@ -1843,9 +1863,9 @@ void func_800B26E0(Particle *particle) { } f32_vec3_apply_object_rotation((ObjectTransform *) sp34, &sp44.x); } else { - sp44.x = sp34->unk1C; - sp44.y = sp34->unk20; - sp44.z = sp34->unk24; + sp44.x = sp34->segment.x_velocity; + sp44.y = sp34->segment.y_velocity; + sp44.z = sp34->segment.z_velocity; tempf = ((sp44.x * sp44.x) + (sp44.y * sp44.y)) + (sp44.z * sp44.f[2]); if (tempf < 0.01f) { tempf = 1.0f; @@ -1869,20 +1889,21 @@ void func_800B26E0(Particle *particle) { } } if (particleModel != NULL && particle->unk68b == 0) { - particleModel->vertices[1].x = sp44.f[0] + sp30->unkC; - particleModel->vertices[1].y = sp44.f[1] + sp30->unk10; - particleModel->vertices[1].z = sp44.f[2] + sp30->unk14; + particleModel->vertices[1].x = sp44.f[0] + sp30->pos.x; + particleModel->vertices[1].y = sp44.f[1] + sp30->pos.y; + particleModel->vertices[1].z = sp44.f[2] + sp30->pos.z; particleModel->vertices[1].r = particleModel->vertices->r; particleModel->vertices[1].g = particleModel->vertices->g; particleModel->vertices[1].b = particleModel->vertices->b; particleModel->vertices[1].a = sp30->unk6; - particleModel->vertices[2].x = sp30->unkC; - particleModel->vertices[2].y = sp30->unk10; - particleModel->vertices[2].z = sp30->unk14; + + particleModel->vertices[2].x = sp30->pos.x; + particleModel->vertices[2].y = sp30->pos.y; + particleModel->vertices[2].z = sp30->pos.z; if ((s32) *sp2C_ptr != -1) { - particleModel->vertices[2].r = (*sp2C_ptr)[sp30->unk1E + 2].unk4; - particleModel->vertices[2].g = (*sp2C_ptr)[sp30->unk1E + 2].unk5; - particleModel->vertices[2].b = (*sp2C_ptr)[sp30->unk1E + 2].unk6; + particleModel->vertices[2].r = (*sp2C_ptr)[sp30->unk1E + 2].r; + particleModel->vertices[2].g = (*sp2C_ptr)[sp30->unk1E + 2].g; + particleModel->vertices[2].b = (*sp2C_ptr)[sp30->unk1E + 2].b; particleModel->vertices[2].a = sp30->unk6; } else { particleModel->vertices[2].r = particle->colour.r; @@ -1890,25 +1911,25 @@ void func_800B26E0(Particle *particle) { particleModel->vertices[2].b = particle->colour.b; particleModel->vertices[2].a = sp30->unk6; } - particleModel->vertices[3].x = sp30->unkC - sp44.f[0]; - particleModel->vertices[3].y = sp30->unk10 - sp44.f[1]; - particleModel->vertices[3].z = sp30->unk14 - sp44.f[2]; + particleModel->vertices[3].x = sp30->pos.x - sp44.f[0]; + particleModel->vertices[3].y = sp30->pos.y - sp44.f[1]; + particleModel->vertices[3].z = sp30->pos.z - sp44.f[2]; particleModel->vertices[3].r = particleModel->vertices->r; particleModel->vertices[3].g = particleModel->vertices->g; particleModel->vertices[3].b = particleModel->vertices->b; particleModel->vertices[3].a = sp30->unk6; particle->unk68b = 1; } else if (particleModel != NULL) { - particleModel->vertices[4].x = sp44.f[0] + sp30->unkC; - particleModel->vertices[4].y = sp44.f[1] + sp30->unk10; - particleModel->vertices[4].z = sp44.f[2] + sp30->unk14; + particleModel->vertices[4].x = sp44.f[0] + sp30->pos.x; + particleModel->vertices[4].y = sp44.f[1] + sp30->pos.y; + particleModel->vertices[4].z = sp44.f[2] + sp30->pos.z; particleModel->vertices[4].r = particleModel->vertices[2].r; particleModel->vertices[4].g = particleModel->vertices[2].g; particleModel->vertices[4].b = particleModel->vertices[2].b; particleModel->vertices[4].a = sp30->unk6; - particleModel->vertices[5].x = sp30->unkC - sp44.f[0]; - particleModel->vertices[5].y = sp30->unk10 - sp44.f[1]; - particleModel->vertices[5].z = sp30->unk14 - sp44.f[2]; + particleModel->vertices[5].x = sp30->pos.x - sp44.f[0]; + particleModel->vertices[5].y = sp30->pos.y - sp44.f[1]; + particleModel->vertices[5].z = sp30->pos.z - sp44.f[2]; particleModel->vertices[5].r = particleModel->vertices[2].r; particleModel->vertices[5].g = particleModel->vertices[2].g; particleModel->vertices[5].b = particleModel->vertices[2].b; @@ -1921,8 +1942,8 @@ void func_800B26E0(Particle *particle) { free_object((Object *) particle); } else if (particle->opacityTimer == 0) { particle->opacity += gParticleUpdateRate * particle->opacityVel; - if (particle->opacity < 0xFF) { - if (particle->segment.unk40 & 0x1000) { + if (particle->opacity < 255) { + if (particle->segment.unk40 & PARTICLE_F40_1000) { particle->segment.trans.flags |= OBJ_FLAGS_UNK_0100; } else { particle->segment.trans.flags |= OBJ_FLAGS_UNK_0080; @@ -1936,8 +1957,8 @@ void func_800B26E0(Particle *particle) { } } } - if (particleModel != NULL && particleModel->texture != NULL && particle->segment.unk40 & 3 && - gParticleUpdateRate > 0) { + if (particleModel != NULL && particleModel->texture != NULL && + (particle->segment.unk40 & (PARTICLE_F40_1 | PARTICLE_F40_2)) && gParticleUpdateRate > 0) { set_particle_texture_frame(particle); } } @@ -1953,17 +1974,17 @@ void set_particle_texture_frame(Particle *particle) { keepGoing = -1; - i = 128; // This is needed to match. - if (particle->segment.particle.unk2C == i) { + i = PARTICLE_KIND_SPRITE; // This is needed to match. + if (particle->segment.particle.kind == PARTICLE_KIND_SPRITE) { textureCount = particle->unk44_1->textureCount * 256; } else { textureCount = particle->modelData->texture->numOfTextures; } - someFlag4 = particle->segment.unk40 & 1; - someFlag2 = particle->segment.unk40 & 2; - someFlag3 = particle->segment.unk40 & 4; - someFlag = particle->segment.unk40 & 8; + someFlag4 = particle->segment.unk40 & PARTICLE_F40_1; + someFlag2 = particle->segment.unk40 & PARTICLE_F40_2; + someFlag3 = particle->segment.unk40 & PARTICLE_F40_4; + someFlag = particle->segment.unk40 & PARTICLE_F40_8; for (i = 0; (i++ < gParticleUpdateRate) && keepGoing;) { if (!someFlag) { particle->segment.textureFrame += particle->segment.unk1A; @@ -1971,13 +1992,13 @@ void set_particle_texture_frame(Particle *particle) { if (someFlag2) { particle->segment.textureFrame = ((textureCount * 2) - particle->segment.textureFrame) - 1; someFlag = TRUE; - particle->segment.unk40 |= 8; + particle->segment.unk40 |= PARTICLE_F40_8; } else if (someFlag3) { particle->segment.textureFrame -= textureCount; } else { particle->segment.textureFrame = textureCount - 1; keepGoing = FALSE; - particle->segment.unk40 &= ~3; + particle->segment.unk40 &= ~(PARTICLE_F40_1 | PARTICLE_F40_2); } } } else { @@ -1987,14 +2008,14 @@ void set_particle_texture_frame(Particle *particle) { if (someFlag4) { particle->segment.textureFrame = -particle->segment.textureFrame; someFlag = FALSE; - particle->segment.unk40 &= ~8; + particle->segment.unk40 &= ~PARTICLE_F40_8; } else { particle->segment.textureFrame += textureCount; } } else { particle->segment.textureFrame = 0; keepGoing = FALSE; - particle->segment.unk40 &= ~3; + particle->segment.unk40 &= ~(PARTICLE_F40_1 | PARTICLE_F40_2); } } } @@ -2011,19 +2032,19 @@ void move_particle_basic_parent(Particle *particle) { i = gParticleUpdateRate; while (i-- > 0) { - particle->baseVelX += particle->segment.x_velocity; - particle->baseVelY += particle->segment.y_velocity; + particle->localPosX += particle->segment.x_velocity; + particle->localPosY += particle->segment.y_velocity; particle->segment.y_velocity -= particle->gravity; - particle->baseVelZ += particle->segment.z_velocity; + particle->localPosZ += particle->segment.z_velocity; particle->segment.trans.rotation.y_rotation += particle->angleVelY; particle->segment.trans.rotation.x_rotation += particle->angleVelX; particle->segment.trans.rotation.z_rotation += particle->angleVelZ; particle->segment.trans.scale += particle->segment.scaleVel; } - particle->segment.trans.x_position = particle->baseVelX; - particle->segment.trans.y_position = particle->baseVelY; - particle->segment.trans.z_position = particle->baseVelZ; - parent = particle->segment.unk3C; + particle->segment.trans.x_position = particle->localPosX; + particle->segment.trans.y_position = particle->localPosY; + particle->segment.trans.z_position = particle->localPosZ; + parent = particle->segment.parentObj; if (parent) { particle->segment.trans.x_position += parent->trans.x_position; particle->segment.trans.y_position += parent->trans.y_position; @@ -2037,10 +2058,9 @@ void move_particle_basic_parent(Particle *particle) { * Applies further translation based on the position of the parent. */ void move_particle_velocity_parent(Particle *particle) { - s32 i; - ObjectSegment *parent; + s32 i = gParticleUpdateRate; + Object *parent; - i = gParticleUpdateRate; while (i-- > 0) { particle->segment.trans.rotation.y_rotation += particle->angleVelY; particle->segment.trans.rotation.x_rotation += particle->angleVelX; @@ -2048,29 +2068,30 @@ void move_particle_velocity_parent(Particle *particle) { particle->segment.trans.scale += particle->segment.scaleVel; } particle->segment.trans.x_position = 0.0f; - particle->segment.trans.y_position = -particle->forwardVel; + particle->segment.trans.y_position = -particle->downOffset; particle->segment.trans.z_position = 0.0f; f32_vec3_apply_object_rotation(&particle->segment.trans, &particle->segment.trans.x_position); - particle->segment.trans.x_position += particle->baseVelX; - particle->segment.trans.y_position += particle->baseVelY; - particle->segment.trans.z_position += particle->baseVelZ; - parent = particle->segment.unk3C; - if (parent) { - particle->segment.trans.x_position += parent->trans.x_position; - particle->segment.trans.y_position += parent->trans.y_position; - particle->segment.trans.z_position += parent->trans.z_position; + particle->segment.trans.x_position += particle->localPosX; + particle->segment.trans.y_position += particle->localPosY; + particle->segment.trans.z_position += particle->localPosZ; + + parent = particle->segment.parentObj; + if (parent != NULL) { + particle->segment.trans.x_position += parent->segment.trans.x_position; + particle->segment.trans.y_position += parent->segment.trans.y_position; + particle->segment.trans.z_position += parent->segment.trans.z_position; } } /** * Apply translation, rotation and scale based off the velocities of the particle. - * Uses base velocity, then applies additional velocity based off the forward moving direction. + * Apply additional acceleration always directed downward in the local coordinate system */ -void move_particle_with_velocities(Particle *particle) { - s32 i; - Vec3f vel; +void move_particle_with_acceleration(Particle *particle) { + s32 i = 0; + Vec3f acceleration; - for (i = 0; gParticleUpdateRate > i++;) { + while (i++ < gParticleUpdateRate) { particle->segment.trans.x_position += particle->segment.x_velocity; particle->segment.trans.y_position += particle->segment.y_velocity; particle->segment.trans.z_position += particle->segment.z_velocity; @@ -2078,14 +2099,15 @@ void move_particle_with_velocities(Particle *particle) { particle->segment.trans.rotation.y_rotation += particle->angleVelY; particle->segment.trans.rotation.x_rotation += particle->angleVelX; particle->segment.trans.rotation.z_rotation += particle->angleVelZ; - vel.x = 0.0f; - vel.y = -particle->forwardVel; - vel.z = 0.0f; - f32_vec3_apply_object_rotation(&particle->segment.trans, vel.f); - particle->segment.x_velocity += vel.x; - particle->segment.y_velocity += vel.y; + + acceleration.x = 0.0f; + acceleration.y = -particle->downAcceleration; + acceleration.z = 0.0f; + f32_vec3_apply_object_rotation(&particle->segment.trans, acceleration.f); + particle->segment.x_velocity += acceleration.x; + particle->segment.y_velocity += acceleration.y; particle->segment.y_velocity -= particle->gravity; - particle->segment.z_velocity += vel.z; + particle->segment.z_velocity += acceleration.z; } } @@ -2093,12 +2115,12 @@ void move_particle_with_velocities(Particle *particle) { * Apply translation, rotation and scale based off the velocities of the particle. */ void move_particle_basic(Particle *particle) { - s32 i; + s32 i = 0; - for (i = 0; gParticleUpdateRate > i++;) { + while (i++ < gParticleUpdateRate) { particle->segment.trans.x_position += particle->segment.x_velocity; particle->segment.trans.y_position += particle->segment.y_velocity; - particle->segment.y_velocity = particle->segment.y_velocity - particle->gravity; + particle->segment.y_velocity -= particle->gravity; particle->segment.trans.z_position += particle->segment.z_velocity; particle->segment.trans.scale += particle->segment.scaleVel; particle->segment.trans.rotation.y_rotation += particle->angleVelY; @@ -2110,11 +2132,12 @@ void move_particle_basic(Particle *particle) { /** * Apply translation, rotation and scale based off the velocities of the particle. * Velocity is set from forward velocity. + * The particle always moves forward in the local coordinate system */ void move_particle_with_velocity(Particle *particle) { - s32 i; + s32 i = 0; - for (i = 0; gParticleUpdateRate > i++;) { + while (i++ < gParticleUpdateRate) { particle->segment.x_velocity = 0.0f; particle->segment.y_velocity = 0.0f; particle->segment.z_velocity = -particle->forwardVel; @@ -2135,15 +2158,15 @@ void move_particle_with_velocity(Particle *particle) { UNUSED void render_active_particles(Gfx **dList, MatrixS **arg1, Vertex **arg2) { UNUSED s32 pad; UNUSED s32 pad2; - Object **objects; + Particle **objects; s32 iObj; s32 nObjs; objects = objGetObjList(&iObj, &nObjs); for (; iObj < nObjs; iObj++) { if (objects[iObj]->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) { - if ((s32) objects[iObj]->segment.header & 0x8000) { - render_particle((Particle *) objects[iObj], dList, arg1, arg2, 0); + if (objects[iObj]->segment.unk40 & PARTICLE_F40_8000) { + render_particle(objects[iObj], dList, arg1, arg2, 0); } } } @@ -2162,14 +2185,14 @@ void render_particle(Particle *particle, Gfx **dList, MatrixS **mtx, Vertex **vt renderFlags = (RENDER_FOG_ACTIVE | RENDER_Z_COMPARE); // Never true - if (particle->segment.unk40 & flags && D_800E2CDC < 512) { + if ((particle->segment.unk40 & flags) && D_800E2CDC < 512) { return; } alpha = (particle->opacity >> 8) & 0xFF; if (alpha <= 0) { return; } - if (particle->segment.object.unk2C != 4 && particle->segment.object.unk2C != 3) { + if (particle->segment.particle.kind != PARTICLE_KIND_POINT && particle->segment.particle.kind != PARTICLE_KIND_LINE) { gDPSetEnvColor((*dList)++, particle->colour.r, particle->colour.g, particle->colour.b, particle->colour.a); if (alpha != 255) { renderFlags = (RENDER_Z_UPDATE | RENDER_FOG_ACTIVE | RENDER_SEMI_TRANSPARENT | RENDER_Z_COMPARE); @@ -2177,7 +2200,7 @@ void render_particle(Particle *particle, Gfx **dList, MatrixS **mtx, Vertex **vt } else { gDPSetPrimColor((*dList)++, 0, 0, 255, 255, 255, 255); } - if (particle->segment.object.unk2C == 0x80) { + if (particle->segment.particle.kind == PARTICLE_KIND_SPRITE) { temp = particle->segment.textureFrame; particle->segment.textureFrame >>= 8; particle->segment.textureFrame = (particle->segment.textureFrame * 255) / (particle->unk44_1->textureCount); @@ -2206,15 +2229,15 @@ void render_particle(Particle *particle, Gfx **dList, MatrixS **mtx, Vertex **vt renderFlags = (RENDER_VTX_ALPHA | RENDER_Z_UPDATE | RENDER_FOG_ACTIVE | RENDER_Z_COMPARE | RENDER_ANTI_ALIASING); gDPSetEnvColor((*dList)++, 255, 255, 255, 0); - if (particle->segment.object.unk2C == 4) { - if (particle->segment.camera.unk3A > 0) { + if (particle->segment.particle.kind == PARTICLE_KIND_POINT) { + if (particle->segment.particle.destroyTimer > 0) { gDPSetPrimColor((*dList)++, 0, 0, particle->brightness, particle->brightness, particle->brightness, 255); - if (((SpriteParticle *) particle)->unk77 == 0) { - func_800B3E64((Object *) particle); + if (((PointParticle *) particle)->unk77 == 0) { + func_800B3E64((PointParticle*)particle); } modelData = particle->modelData; - temp = ((SpriteParticle *) particle)->modelFrame; + temp = ((PointParticle *) particle)->modelFrame; temp <<= 3; tempvtx = &modelData->vertices[temp]; load_and_set_texture(dList, modelData->texture, renderFlags, particle->segment.textureFrame << 8); @@ -2225,7 +2248,7 @@ void render_particle(Particle *particle, Gfx **dList, MatrixS **mtx, Vertex **vt gDPSetPrimColor((*dList)++, 0, 0, 255, 255, 255, 255); } } - } else if (particle->segment.object.unk2C == 3) { + } else if (particle->segment.particle.kind == PARTICLE_KIND_LINE) { gDPSetPrimColor((*dList)++, 0, 0, particle->brightness, particle->brightness, particle->brightness, alpha); if (particle->unk68b >= 2) { modelData = particle->modelData; @@ -2246,40 +2269,40 @@ void render_particle(Particle *particle, Gfx **dList, MatrixS **mtx, Vertex **vt } } -void func_800B3E64(Object *obj) { +void func_800B3E64(PointParticle *obj) { UNUSED s32 pad; s32 index; Vec3f vec3_1; Vec3f vec3_0; - Object_LightData_UnkC *temp_s0; - Object_LightData_UnkC *prev_s0; - Object_LightData *lightData; - Object_LightData_UnkC_Unk44 *temp_s1; + Particle *temp_s0; + Particle *prev_s0; + ParticleEmitter *emitter; + ParticleModel *temp_s1; Vertex *otherVerts; Vertex *verts; - Object_LightData_UnkC_Unk44 *prev_s1; + ParticleModel *prev_s1; - lightData = (Object_LightData *) obj->lightData; + emitter = obj->pointEmitter; prev_s0 = NULL; prev_s1 = NULL; - if (lightData != NULL) { - if (lightData->unkC != NULL) { - index = (lightData->unk6 - 1); + if (emitter != NULL) { + if (emitter->unkC_60 != NULL) { + index = emitter->unk6 - 1; while (index >= 0) { - temp_s0 = lightData->unkC[index]; - if (temp_s0->unk3A != 0) { - temp_s1 = temp_s0->unk44; - vec3_0.f[0] = temp_s0->trans.scale; - vec3_0.f[1] = 0.0f; - vec3_0.f[2] = 0.0f; - f32_vec3_apply_object_rotation(&temp_s0->trans, &vec3_0.f[0]); - vec3_1.f[0] = 0.0f; - vec3_1.f[1] = temp_s0->trans.scale; - vec3_1.f[2] = 0.0f; - f32_vec3_apply_object_rotation(&temp_s0->trans, &vec3_1.f[0]); + temp_s0 = emitter->unkC_60[index]; + if (temp_s0->segment.particle.destroyTimer != 0) { + temp_s1 = temp_s0->modelData; + vec3_0.x = temp_s0->segment.trans.scale; + vec3_0.y = 0.0f; + vec3_0.z = 0.0f; + f32_vec3_apply_object_rotation(&temp_s0->segment.trans, &vec3_0.f[0]); + vec3_1.x = 0.0f; + vec3_1.y = temp_s0->segment.trans.scale; + vec3_1.z = 0.0f; + f32_vec3_apply_object_rotation(&temp_s0->segment.trans, &vec3_1.f[0]); // It seems super odd to do negative indices. Why not just increment by 4 and add up from there? - verts = &temp_s1->unk8[temp_s0->unk75 << 3]; + verts = &temp_s1->vertices[((PointParticle*) temp_s0)->modelFrame << 3]; if (1) {} if (1) {} if (1) {} @@ -2287,43 +2310,46 @@ void func_800B3E64(Object *obj) { if (1) {} if (1) {} // Fake verts += 7; - verts[-3].x = temp_s0->trans.x_position + vec3_0.f[0]; - verts[-3].y = temp_s0->trans.y_position + vec3_0.f[1]; - verts[-3].z = temp_s0->trans.z_position + vec3_0.f[2]; - verts[-3].r = temp_s0->unk6C; - verts[-3].g = temp_s0->unk6D; - verts[-3].b = temp_s0->unk6E; - verts[-3].a = temp_s0->unk5C >> 8; - verts[-2].x = temp_s0->trans.x_position + vec3_1.f[0]; - verts[-2].y = temp_s0->trans.y_position + vec3_1.f[1]; - verts[-2].z = temp_s0->trans.z_position + vec3_1.f[2]; - verts[-2].r = temp_s0->unk6C; - verts[-2].g = temp_s0->unk6D; - verts[-2].b = temp_s0->unk6E; - verts[-2].a = temp_s0->unk5C >> 8; - verts[-1].x = temp_s0->trans.x_position - vec3_0.f[0]; - verts[-1].y = temp_s0->trans.y_position - vec3_0.f[1]; - verts[-1].z = temp_s0->trans.z_position - vec3_0.f[2]; - verts[-1].r = temp_s0->unk6C; - verts[-1].g = temp_s0->unk6D; - verts[-1].b = temp_s0->unk6E; - verts[-1].a = temp_s0->unk5C >> 8; - verts[0].x = temp_s0->trans.x_position - vec3_1.f[0]; - verts[0].y = temp_s0->trans.y_position - vec3_1.f[1]; - verts[0].z = temp_s0->trans.z_position - vec3_1.f[2]; - verts[0].r = temp_s0->unk6C; - verts[0].g = temp_s0->unk6D; - verts[0].b = temp_s0->unk6E; - verts[0].a = temp_s0->unk5C >> 8; + verts[-3].x = temp_s0->segment.trans.x_position + vec3_0.f[0]; + verts[-3].y = temp_s0->segment.trans.y_position + vec3_0.f[1]; + verts[-3].z = temp_s0->segment.trans.z_position + vec3_0.f[2]; + verts[-3].r = temp_s0->colour.r; + verts[-3].g = temp_s0->colour.g; + verts[-3].b = temp_s0->colour.b; + verts[-3].a = temp_s0->opacity >> 8; - verts = &temp_s1->unk8[temp_s0->unk75 << 3]; + verts[-2].x = temp_s0->segment.trans.x_position + vec3_1.f[0]; + verts[-2].y = temp_s0->segment.trans.y_position + vec3_1.f[1]; + verts[-2].z = temp_s0->segment.trans.z_position + vec3_1.f[2]; + verts[-2].r = temp_s0->colour.r; + verts[-2].g = temp_s0->colour.g; + verts[-2].b = temp_s0->colour.b; + verts[-2].a = temp_s0->opacity >> 8; + + verts[-1].x = temp_s0->segment.trans.x_position - vec3_0.f[0]; + verts[-1].y = temp_s0->segment.trans.y_position - vec3_0.f[1]; + verts[-1].z = temp_s0->segment.trans.z_position - vec3_0.f[2]; + verts[-1].r = temp_s0->colour.r; + verts[-1].g = temp_s0->colour.g; + verts[-1].b = temp_s0->colour.b; + verts[-1].a = temp_s0->opacity >> 8; + + verts[0].x = temp_s0->segment.trans.x_position - vec3_1.f[0]; + verts[0].y = temp_s0->segment.trans.y_position - vec3_1.f[1]; + verts[0].z = temp_s0->segment.trans.z_position - vec3_1.f[2]; + verts[0].r = temp_s0->colour.r; + verts[0].g = temp_s0->colour.g; + verts[0].b = temp_s0->colour.b; + verts[0].a = temp_s0->opacity >> 8; + + verts = &temp_s1->vertices[((PointParticle*) temp_s0)->modelFrame << 3]; if (prev_s1 != NULL) { if (1) { // Fake - otherVerts = &prev_s1->unk8[prev_s0->unk75 << 3]; + otherVerts = &prev_s1->vertices[((PointParticle*) prev_s0)->modelFrame << 3]; } otherVerts += 4; } else { - otherVerts = &temp_s1->unk8[temp_s0->unk75 << 3]; + otherVerts = &temp_s1->vertices[((PointParticle*) temp_s0)->modelFrame << 3]; otherVerts += 4; } @@ -2363,7 +2389,7 @@ void func_800B3E64(Object *obj) { verts[0].b = otherVerts[0].b; verts[0].a = otherVerts[0].a; - temp_s0->unk77 = -1; + ((PointParticle*)temp_s0)->unk77 = -1; continue; } @@ -2443,7 +2469,7 @@ void func_800B4668(Object *obj, s32 idx, s32 arg2, s32 arg3) { } else { obj->particleEmitter[idx].opacity = temp_v0; } - obj->particleEmitter[idx].flags |= 0x100; + obj->particleEmitter[idx].emmmflags |= PARTICLE_BEHAVIOR_FLAG_100; } void func_800B46BC(Object *obj, s32 idx, s32 arg2, s32 arg3) { @@ -2456,5 +2482,5 @@ void func_800B46BC(Object *obj, s32 idx, s32 arg2, s32 arg3) { } else { obj->particleEmitter[idx].opacity = temp_v0; } - obj->particleEmitter[idx].flags |= 0x100; + obj->particleEmitter[idx].emmmflags |= PARTICLE_BEHAVIOR_FLAG_100; } diff --git a/src/particles.h b/src/particles.h index 7063b5fe..cf415376 100644 --- a/src/particles.h +++ b/src/particles.h @@ -5,6 +5,15 @@ #include "structs.h" #include +enum ParticleKind { + PARTICLE_KIND_NONE = 0, + PARTICLE_KIND_TRIANGLE = 1, + PARTICLE_KIND_RECTANGLE = 2, + PARTICLE_KIND_LINE = 3, + PARTICLE_KIND_POINT = 4, + PARTICLE_KIND_SPRITE = 128 +}; + // Flags representing which particle emitters are active for a game object enum ObjectEmitterFlags { OBJ_EMIT_NONE, @@ -26,7 +35,7 @@ enum ObjectEmitterFlags { OBJ_EMIT_16 = (1 << 15), }; -enum ParticleFlags { +enum ParticleRandomizationFlags { PARTICLE_FLAGS_NONE, PARTICLE_GRAVITY = (1 << 0), PARTICLE_UNK00000002 = (1 << 1), @@ -36,9 +45,9 @@ enum ParticleFlags { PARTICLE_UNK00000020 = (1 << 5), PARTICLE_UNK00000040 = (1 << 6), PARTICLE_UNK00000080 = (1 << 7), - PARTICLE_VEL_X = (1 << 8), - PARTICLE_VEL_Y = (1 << 9), - PARTICLE_VEL_Z = (1 << 10), + PARTICLE_RANDOM_VEL_X = (1 << 8), + PARTICLE_RANDOM_VEL_Y = (1 << 9), + PARTICLE_RANDOM_VEL_Z = (1 << 10), PARTICLE_ANGLE_Y = (1 << 11), PARTICLE_ANGLE_X = (1 << 12), PARTICLE_ANGLE_Z = (1 << 13), @@ -62,18 +71,57 @@ enum ParticleFlags { PARTICLE_UNK80000000 = (1 << 31), }; +enum ParticleBehaviorFlags { + PARTICLE_BEHAVIOR_FLAGS_NONE = 0, + PARTICLE_BEHAVIOR_FLAG_1 = 0x1, + PARTICLE_BEHAVIOR_FLAG_2 = 0x2, + PARTICLE_BEHAVIOR_FLAG_4 = 0x4, + PARTICLE_BEHAVIOR_FLAG_8 = 0x8, + PARTICLE_BEHAVIOR_FLAG_10 = 0x10, + PARTICLE_BEHAVIOR_FLAG_20 = 0x20, + PARTICLE_BEHAVIOR_FLAG_40 = 0x40, + PARTICLE_BEHAVIOR_FLAG_80 = 0x80, + PARTICLE_BEHAVIOR_FLAG_100 = 0x100, + PARTICLE_BEHAVIOR_FLAG_200 = 0x200, + PARTICLE_BEHAVIOR_FLAG_400 = 0x400, + PARTICLE_BEHAVIOR_FLAG_800 = 0x800, + PARTICLE_BEHAVIOR_FLAG_1000 = 0x1000, + PARTICLE_BEHAVIOR_FLAG_2000 = 0x2000, + PARTICLE_BEHAVIOR_FLAG_4000 = 0x4000, + PARTICLE_BEHAVIOR_FLAG_8000 = 0x8000 +}; + enum ParticleMovement { PARTICLE_MOVEMENT_0, PARTICLE_MOVEMENT_1, - PARTICLE_MOVEMENT_VELOCITIES, + PARTICLE_MOVEMENT_ACCELERATION, PARTICLE_MOVEMENT_VELOCITY_PARENT, PARTICLE_MOVEMENT_BASIC_PARENT, PARTICLE_MOVEMENT_VELOCITY, }; +enum ParticleField40 { + PARTICLE_F40_1 = 0x1, + PARTICLE_F40_2 = 0x2, + PARTICLE_F40_4 = 0x4, + PARTICLE_F40_8 = 0x8, + PARTICLE_F40_GRAVITY_1 = 0x10, + PARTICLE_F40_GRAVITY_2 = 0x20, + PARTICLE_F40_GRAVITY_3 = 0x40, + PARTICLE_F40_80 = 0x80, + PARTICLE_F40_100 = 0x100, + PARTICLE_F40_200 = 0x200, + PARTICLE_F40_400 = 0x400, + PARTICLE_F40_800 = 0x800, + PARTICLE_F40_1000 = 0x1000, + PARTICLE_F40_2000 = 0x2000, + PARTICLE_F40_4000 = 0x4000, + PARTICLE_F40_8000 = 0x8000, +}; + typedef struct ParticleProperties { - /* 0x00 */ u8 unk0; - /* 0x01 */ u8 movementType; + /* 0x00 */ u8 kind; // ParticleKind + /* 0x01 */ u8 movementType; // ParticleMovement /* 0x02 */ u16 unk2; /* 0x04 */ s16 textureID; /* 0x06 */ s16 unk6; @@ -94,11 +142,6 @@ typedef struct ParticleProperties { /* 0x14 */ ColourRGBA colour; } ParticleProperties; -/* Size: 0x10 bytes */ -typedef struct unk800E2D08 { - s16 unk0, unk2, unk4, unk6, unk8, unkA, unkC, unkE; -} unk800E2D08; - typedef struct XYStruct { s16 x, y; } XYStruct; @@ -116,42 +159,6 @@ typedef struct unk800B1130_SP28 { u8 a; } unk800B1130_SP28; - -// Size: 8 bytes -typedef struct Particle_58_0_9C { - u8 pad0[4]; - u8 unk4; - u8 unk5; - u8 unk6; - u8 unk7; -} Particle_58_0_9C; - -typedef struct Particle_58_0 { - s32 unk0; - u8 pad4[0x2]; - u8 unk6; - u8 pad7[0x5]; - f32 unkC; - f32 unk10; - f32 unk14; - u8 pad18[0x6]; - s16 unk1E; - u8 pad20[0x7C]; - Particle_58_0_9C *unk9C; -} Particle_58_0; - -typedef struct Particle_58 { - Particle_58_0 *unk0; - u8 pad4[0x2]; - u8 unk6; - u8 pad7[0x5]; - f32 unkC; - f32 unk10; - f32 unk14; - u8 pad18[0x6]; - s16 unk1E; -} Particle_58; - typedef struct ParticleSegment_3C { u8 pad0[0x1C]; f32 unk1C; @@ -164,10 +171,74 @@ typedef struct ParticleAngle { Vec3s direction; } ParticleAngle; +/* Size: 0xA0 bytes */ +typedef struct ParticleBehavior { + s32 emitterFlags; + f32 velX; + f32 velY; + f32 velZ; + f32 unk10; + s16 unk14; + s16 unk16; + s16 unk18; + s16 unk1A; + s16 unk1C; + s16 unk1E; + s16 unk20; + s16 unk22; + s16 unk24; + s16 unk26; + s16 unk28; + s16 unk2A; + s16 unk2C; + s16 unk2E; + f32 unk30; + f32 unk34; + f32 unk38; + f32 unk3C; + s16 unk40; + s16 unk42; + s16 angleOffsetY; + s16 angleOffsetX; + s16 angleOffsetZ; + s16 angleVelY; + s16 angleVelX; + s16 angleVelZ; + f32 unk50; + f32 unk54; + f32 forwardVel; + s32 randomizationFlags; + 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; // 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; + /* Size: 0x20 bytes */ typedef struct ParticleEmitter { /* 0x00 */ ParticleBehavior *behaviour; - /* 0x04 */ s16 flags; + /* 0x04 */ s16 emmmflags; /* 0x06 */ u8 unk6; /* 0x07 */ u8 lifeTime; /* 0x08 */ s16 propertyID; @@ -184,6 +255,7 @@ typedef struct ParticleEmitter { /* 0x001E */ s16 unk1E; } ParticleEmitter; +// TODO merge this struct with ObjectSegment typedef struct ParticleSegment { /* 0x0000 */ ObjectTransform trans; /* 0x0018 */ s16 textureFrame; @@ -197,8 +269,8 @@ typedef struct ParticleSegment { SegmentPropertiesParticle particle; SegmentPropertiesCamera camera; }; - /* 0x003C */ void *unk3C; - /* 0x003C */ s32 unk40; + /* 0x003C */ Object *parentObj; + /* 0x0040 */ s32 unk40; } ParticleSegment; typedef struct ParticleModel { @@ -225,15 +297,14 @@ typedef struct Particle { }; /* 0x0048 */ s16 behaviorId; /* 0x004A */ s16 brightness; - /* 0x004C */ f32 baseVelX; - /* 0x0050 */ f32 baseVelY; + /* 0x004C */ f32 localPosX; + /* 0x0050 */ f32 localPosY; + /* 0x0054 */ f32 localPosZ; union { - /* 0x0054 */ f32 baseVelZ; - /* 0x0054 */ f32 *unk54_ptr; - }; - union { - /* 0x0058 */ Particle_58 **unk58_ptr; + /* 0x0058 */ ParticleEmitter **lineEmitter; /* 0x0058 */ f32 forwardVel; + /* 0x0058 */ f32 downAcceleration; + /* 0x0058 */ f32 downOffset; }; /* 0x005C */ s16 opacity; /* 0x005E */ s16 opacityVel; @@ -253,14 +324,14 @@ typedef struct Particle { /* 0x006C */ ColourRGBA colour; } Particle; -typedef struct SpriteParticle { +typedef struct PointParticle { /* 0x0000 */ Particle base; - /* 0x0070 */ struct Particle *unk70; + /* 0x0070 */ ParticleEmitter *pointEmitter; /* 0x0074 */ u8 unk74; /* 0x0075 */ u8 modelFrame; /* 0x0076 */ u8 unk76; /* 0x0077 */ s8 unk77; -} SpriteParticle; +} PointParticle; // Size: 8 bytes typedef struct unkParticleBehaviorUnk9C { @@ -275,45 +346,46 @@ void func_800AE270(void); void func_800AE2A0(void); void func_800AE2D8(void); void free_particle_buffers(void); -void free_particle_vertex_triangles(void); +void free_particle_vertices_triangles(void); void free_particle_assets(void); void generate_particle_shape_triangle(ParticleModel *model, Vertex **vtx, Triangle **triangles); void generate_particle_shape_quad(ParticleModel *model, Vertex **vtx, Triangle **triangles); void generate_particle_shape_line(ParticleModel *model, Vertex **vtx, Triangle **triangles); -void generate_particle_shape_sprite(ParticleModel *model, Vertex **vtx, Triangle **triangles); +void generate_particle_shape_point(ParticleModel *model, Vertex **vtx, Triangle **triangles); void func_800AF0A4(Particle *particle); void func_800AF0F0(Particle *particle); void partInitTrigger(ParticleEmitter *emitter, s32 behaviourID, s32 propertyID); -void func_800AF29C(ParticleEmitter *arg0, s32 behaviourID, s32 propertyID, s16 velX, s16 velY, s16 velZ); -void func_800AF6E4(Object *obj, s32 arg1); +void func_800AF29C(ParticleEmitter *emitter, s32 behaviourID, s32 propertyID, s16 velX, s16 velY, s16 velZ); +void func_800AF6E4(Object *obj, s32 emitterIndex); void func_800B2260(ParticleEmitter *emitter); -void func_800B263C(SpriteParticle *arg0); +void func_800B263C(PointParticle *arg0); void init_particle_assets(void); void set_particle_texture_frame(Particle *particle); -void func_800B03C0(Particle *particle, Object *arg1, ParticleEmitter *arg2, ParticleBehavior *behaviour); -void func_800B2040(Particle *arg0); +void setup_particle_position(Particle *particle, Object *arg1, ParticleEmitter *arg2, ParticleBehavior *behaviour); +void particle_deallocate(Particle *particle); void handle_particle_movement(Particle *particle, s32 updateRate); -void func_800B0010(Particle *arg0, Object *arg1, ParticleEmitter *arg2, ParticleBehavior *arg3); -SpriteParticle *func_800B0698(Object *arg0, ParticleEmitter *arg1); -Particle *func_800B1CB8(s32 arg0); -void func_800AFE5C(Object *arg0, ParticleEmitter *arg1); -Particle *func_800B1130(Object *arg0, ParticleEmitter *arg1); -void func_800AF52C(Object *obj, s32 arg1); +void setup_particle_velocity(Particle *particle, Object *obj, ParticleEmitter *emitter, ParticleBehavior *behavior); +PointParticle *init_point_particle(Object *obj, ParticleEmitter *emitter); +Particle *particle_allocate(s32 kind); +void func_800AFE5C(Object *arg0, ParticleEmitter *emitter); +Particle *init_general_particle(Object *arg0, ParticleEmitter *arg1); +void func_800AF52C(Object *obj, s32 emitterIndex); void func_800AF134(ParticleEmitter *emitter, s32 behaviourID, s32 propertyID, s16 velX, s16 velY, s16 velZ); void render_particle(Particle *particle, Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 flags); void func_800B4668(Object *obj, s32 idx, s32 arg2, s32 arg3); void func_800B46BC(Object *obj, s32 idx, s32 arg2, s32 arg3); void obj_spawn_particle(Object *obj, s32 updateRate); -void func_800B3E64(Object *obj); -void func_800B26E0(Particle *particle); +void func_800B3E64(PointParticle *particle); +void move_line_particle(Particle *particle); void func_800AF714(Object *racerObj, s32 updateRate); -Particle* func_800B0BAC(Object* arg0, ParticleEmitter* arg1); +Particle* init_line_particle(Object* arg0, ParticleEmitter* arg1); void func_800AF404(s32 updateRate); // Non Matching -void init_particle_buffers(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5); // Non Matching +void init_particle_buffers(s32 maxTriangleParticles, s32 maxRectangleParticles, s32 maxSpriteParticles, + s32 maxLineParticles, s32 maxPointParticles, s32 arg5); // Non Matching void move_particle_basic_parent(Particle *); void move_particle_velocity_parent(Particle *); -void move_particle_with_velocities(Particle *); +void move_particle_with_acceleration(Particle *); void move_particle_basic(Particle *); void move_particle_with_velocity(Particle *); diff --git a/src/racer.c b/src/racer.c index 906f36b4..eefeb27d 100644 --- a/src/racer.c +++ b/src/racer.c @@ -937,7 +937,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } playerObjectHasMoved = FALSE; if (racer->playerIndex >= PLAYER_ONE && gNumViewports < 2) { - obj->particleEmitFlags |= OBJ_EMIT_9; + obj->particleEmittersEnabled |= OBJ_EMIT_9; } D_8011D550 = 0; gCurrentCarSteerVel = 0; @@ -1208,7 +1208,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } } else if (racer->approachTarget == NULL) { racer_play_sound(obj, SOUND_UNK_AF); - obj->particleEmitFlags |= OBJ_EMIT_5 | OBJ_EMIT_6; + obj->particleEmittersEnabled |= OBJ_EMIT_5 | OBJ_EMIT_6; } var_f2 = racer->trickType; var_f2 -= 5.0f; @@ -1499,13 +1499,13 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r (obj->segment.z_velocity * obj->segment.z_velocity); if (var_f2 > 16.0f) { if (var_f2 < 80.0f) { - obj->particleEmitFlags |= OBJ_EMIT_3 | OBJ_EMIT_4; + obj->particleEmittersEnabled |= OBJ_EMIT_3 | OBJ_EMIT_4; } if (var_f2 > 28.0f) { - obj->particleEmitFlags |= OBJ_EMIT_1 | OBJ_EMIT_2; + obj->particleEmittersEnabled |= OBJ_EMIT_1 | OBJ_EMIT_2; } if (gNumViewports == 1 && var_f2 > 10.25f) { - obj->particleEmitFlags |= OBJ_EMIT_7; + obj->particleEmittersEnabled |= OBJ_EMIT_7; } } } else { @@ -1515,7 +1515,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r var_f2 = racer->velocity; } if (var_f2 > 4.0f) { - obj->particleEmitFlags |= OBJ_EMIT_3 | OBJ_EMIT_4; + obj->particleEmittersEnabled |= OBJ_EMIT_3 | OBJ_EMIT_4; } } } @@ -1525,16 +1525,16 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r iTemp = ((racer->boostType & EMPOWER_BOOST) >> 2) + 10; if (iTemp > 10) { if (asset20->unk70 > 0 || asset20->unk74 > 0.0) { - obj->particleEmitFlags |= 1 << iTemp; + obj->particleEmittersEnabled |= 1 << iTemp; } } else if (asset20->unk70 == 2 && asset20->unk74 < 0.5) { - obj->particleEmitFlags |= 1 << iTemp; + obj->particleEmittersEnabled |= 1 << iTemp; } else if (asset20->unk70 < 2 && asset20->unk74 > 0.0f) { - obj->particleEmitFlags |= 1 << iTemp; + obj->particleEmittersEnabled |= 1 << iTemp; } } if (racer->unk201 == 0) { - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; } else { obj->segment.y_velocity += updateRate * gCurrentRacerWeightStat; func_800AF714(obj, updateRate); @@ -2450,7 +2450,7 @@ void update_player_racer(Object *obj, s32 updateRate) { if (tempRacer->unk1F6 < 0) { tempRacer->unk1F6 = 0; } - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; if (tempRacer->unk201 > 0) { tempRacer->unk201 -= updateRate; } else { @@ -2994,7 +2994,7 @@ void func_8004F7F4(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac var_v1 = 0; } if (racer->unk1FE == 0) { - racerObj->particleEmitFlags |= PARTICLE_VEL_Z; + racerObj->particleEmittersEnabled |= PARTICLE_RANDOM_VEL_Z; } apply_vehicle_rotation_offset(racer, updateRate, 0, 0, var_v1); func_80053750(racerObj, racer, updateRateF); @@ -3212,24 +3212,24 @@ void func_8004F7F4(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac var_v1 = ((racer->boostType & EMPOWER_BOOST) >> 2) + 0x10; if (var_v1 > 0x10) { if (asset20->unk70 > 0 || asset20->unk74 > 0.0) { - racerObj->particleEmitFlags |= 1 << var_v1; + racerObj->particleEmittersEnabled |= 1 << var_v1; } } else { if (asset20->unk70 == 2 && asset20->unk74 < 0.5) { - racerObj->particleEmitFlags |= 1 << var_v1; + racerObj->particleEmittersEnabled |= 1 << var_v1; } else if (asset20->unk70 < 2 && asset20->unk74 > 0.0f) { - racerObj->particleEmitFlags |= 1 << var_v1; + racerObj->particleEmittersEnabled |= 1 << var_v1; } } } if (gCurrentPlayerIndex != PLAYER_COMPUTER && gNumViewports < 2) { if (racer->buoyancy > 14.0f) { if (get_random_number_from_range(0, 1) != 0) { - racerObj->particleEmitFlags |= PARTICLE_COLOURVEL_RED | PARTICLE_COLOURVEL_GREEN; + racerObj->particleEmittersEnabled |= PARTICLE_COLOURVEL_RED | PARTICLE_COLOURVEL_GREEN; } } else if (racer->buoyancy < 6.0f) { if (racer->velocity > -3.0 && racer->velocity < 0.5 && get_random_number_from_range(0, 1) != 0) { - racerObj->particleEmitFlags |= PARTICLE_UNK00040000 | PARTICLE_FORWARDVEL; + racerObj->particleEmittersEnabled |= PARTICLE_UNK00040000 | PARTICLE_FORWARDVEL; } } } @@ -3407,11 +3407,11 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR if (gCurrentPlayerIndex >= PLAYER_ONE) { if (gNumViewports < FOUR_PLAYERS) { if (racer->drift_direction > 0) { - obj->particleEmitFlags |= 0x1000 | 0x400; + obj->particleEmittersEnabled |= 0x1000 | 0x400; } else if (racer->drift_direction < 0) { - obj->particleEmitFlags |= 0x2000 | 0x800; + obj->particleEmittersEnabled |= 0x2000 | 0x800; } else { - obj->particleEmitFlags |= 0x2000 | 0x1000; + obj->particleEmittersEnabled |= 0x2000 | 0x1000; } } else { sp58 = 1; @@ -3438,7 +3438,7 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR gCurrentStickY = -70; sp60 = TRUE; if (gNumViewports < FOUR_PLAYERS) { - obj->particleEmitFlags |= 0x2000 | 0x1000 | 0x800 | 0x400; + obj->particleEmittersEnabled |= 0x2000 | 0x1000 | 0x800 | 0x400; } else { sp58 = TRUE; } @@ -3464,9 +3464,9 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR if (racer->drift_direction != 0 && gCurrentPlayerIndex >= PLAYER_ONE) { if (gNumViewports < FOUR_PLAYERS) { if (racer->drift_direction > 0) { - obj->particleEmitFlags |= 0x1000 | 0x400; + obj->particleEmittersEnabled |= 0x1000 | 0x400; } else { - obj->particleEmitFlags |= 0x2000 | 0x800; + obj->particleEmittersEnabled |= 0x2000 | 0x800; } } else { sp58 = TRUE; @@ -3509,9 +3509,9 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR rumble_set(racer->playerIndex, RUMBLE_TYPE_0); } if (racer->y_rotation_vel < 0) { - obj->particleEmitFlags |= 0x1000 | 0x400; + obj->particleEmittersEnabled |= 0x1000 | 0x400; } else { - obj->particleEmitFlags |= 0x2000 | 0x800; + obj->particleEmittersEnabled |= 0x2000 | 0x800; } if (racer->drift_direction != 0 || racer->drifting != 0 || racer->unk1FB != 0) { if (racer->unk10 == 0) { @@ -3692,18 +3692,18 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR if (get_viewport_count() < THREE_PLAYERS) { if ((sp60 != 0 && racer->velocity < -2.0) || sp58 != 0 || racer->unk1FB != 0) { if (racer->wheel_surfaces[2] < SURFACE_NONE) { - obj->particleEmitFlags |= gSurfaceFlagTable[racer->wheel_surfaces[2]]; + obj->particleEmittersEnabled |= gSurfaceFlagTable[racer->wheel_surfaces[2]]; } if (racer->wheel_surfaces[3] < SURFACE_NONE) { - obj->particleEmitFlags |= gSurfaceFlagTable[racer->wheel_surfaces[3]] * 2; + obj->particleEmittersEnabled |= gSurfaceFlagTable[racer->wheel_surfaces[3]] * 2; } } if (racer->velocity < -2.0) { if (racer->wheel_surfaces[2] < SURFACE_NONE) { - obj->particleEmitFlags |= gSurfaceFlagTable4P[racer->wheel_surfaces[2]]; + obj->particleEmittersEnabled |= gSurfaceFlagTable4P[racer->wheel_surfaces[2]]; } if (racer->wheel_surfaces[3] < SURFACE_NONE) { - obj->particleEmitFlags |= gSurfaceFlagTable4P[racer->wheel_surfaces[3]] * 2; + obj->particleEmittersEnabled |= gSurfaceFlagTable4P[racer->wheel_surfaces[3]] * 2; } } } @@ -3947,9 +3947,9 @@ void func_8005250C(Object *obj, Object_Racer *racer, s32 updateRate) { if (racer->unk1F3 & 8) { if (gNumViewports < 3) { if (gCurrentPlayerIndex >= PLAYER_ONE) { - obj->particleEmitFlags |= 0x100000; + obj->particleEmittersEnabled |= 0x100000; } else { - obj->particleEmitFlags |= 0x80000; + obj->particleEmittersEnabled |= 0x80000; } } racer->unk1F2 = 4; @@ -4109,13 +4109,13 @@ void racer_spinout_car(Object *obj, Object_Racer *racer, s32 updateRate, f32 upd angleVel = racer->y_rotation_vel; if (gCurrentPlayerIndex > PLAYER_COMPUTER) { if (gNumViewports < VIEWPORTS_COUNT_4_PLAYERS) { - obj->particleEmitFlags |= 0x4FC00; + obj->particleEmittersEnabled |= 0x4FC00; } else { if (racer->wheel_surfaces[2] < SURFACE_NONE) { - obj->particleEmitFlags |= 1 << (racer->wheel_surfaces[2] * 2); + obj->particleEmittersEnabled |= 1 << (racer->wheel_surfaces[2] * 2); } if (racer->wheel_surfaces[3] < SURFACE_NONE) { - obj->particleEmitFlags |= 2 << (racer->wheel_surfaces[3] * 2); + obj->particleEmittersEnabled |= 2 << (racer->wheel_surfaces[3] * 2); } } } @@ -4243,7 +4243,7 @@ void update_car_velocity_offground(Object *obj, Object_Racer *racer, s32 updateR canSteer = TRUE; } if (canSteer) { - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; racer->drift_direction = 0; racer->unk10C -= (racer->unk10C * updateRate) >> 4; gCurrentCarSteerVel = 0; @@ -4277,7 +4277,7 @@ void update_car_velocity_offground(Object *obj, Object_Racer *racer, s32 updateR } racer->trickType = steerAngle; } - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; } /** @@ -4356,7 +4356,7 @@ void func_80053750(Object *objRacer, Object_Racer *racer, f32 updateRateF) { f64 temp_f0; f32 velocity; s32 temp_v1; - s32 flags; + s32 randomizationFlags; s32 isNotHardBraking; s32 i; @@ -4428,7 +4428,7 @@ void func_80053750(Object *objRacer, Object_Racer *racer, f32 updateRateF) { } } } - flags = 1; + randomizationFlags = 1; if (racer->unk1FB != 0) { for (i = 0; i < 2; i++) { someObj = objRacer->unk60->unk4[i]; @@ -4444,12 +4444,12 @@ void func_80053750(Object *objRacer, Object_Racer *racer, f32 updateRateF) { } } } - objRacer->particleEmitFlags |= OBJ_EMIT_11 | OBJ_EMIT_12; + objRacer->particleEmittersEnabled |= OBJ_EMIT_11 | OBJ_EMIT_12; } temp_f0 = someObj->segment.trans.y_position; // Fake for (i = 0; i < 4; i++) { someObj = objRacer->unk60->unk4[i]; - if (!(racer->unk1E3 & flags)) { + if (!(racer->unk1E3 & randomizationFlags)) { someObj->segment.trans.y_position += ((-10.0f - someObj->segment.trans.y_position) * 0.125); if (racer->waterTimer != 0) { someObj->segment.trans.scale += @@ -4460,7 +4460,7 @@ void func_80053750(Object *objRacer, Object_Racer *racer, f32 updateRateF) { someObj->segment.trans.y_position = (temp_f0 - (temp_f0 * 0.125)); someObj->segment.trans.scale += ((someObj->segment.header->scale - someObj->segment.trans.scale) * 0.1); } - flags <<= 1; + randomizationFlags <<= 1; } someObj = objRacer->unk60->unk4[2]; someObj->segment.trans.rotation.y_rotation = gCurrentStickX * 100; @@ -4662,7 +4662,7 @@ void update_onscreen_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, func_80054FD0(obj, racer, updateRate); } if (!racer->unk201) { - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; } else if (racer->vehicleID < VEHICLE_BOSSES) { func_800AF714(obj, updateRate); } @@ -4792,10 +4792,10 @@ void update_car_velocity_ground(Object *obj, Object_Racer *racer, s32 updateRate } if (get_viewport_count() < 2 && sp38 && racer->velocity < -2.0) { if (racer->wheel_surfaces[2] < SURFACE_NONE) { - obj->particleEmitFlags |= 1 << (racer->wheel_surfaces[2] * 2); + obj->particleEmittersEnabled |= 1 << (racer->wheel_surfaces[2] * 2); } if (racer->wheel_surfaces[3] < SURFACE_NONE) { - obj->particleEmitFlags |= 2 << (racer->wheel_surfaces[3] * 2); + obj->particleEmittersEnabled |= 2 << (racer->wheel_surfaces[3] * 2); } } vel = racer->velocity; @@ -4862,7 +4862,7 @@ void update_car_velocity_ground(Object *obj, Object_Racer *racer, s32 updateRate void func_80054FD0(Object *racerObj, Object_Racer *racer, s32 updateRate) { s32 pad[3]; s32 sp190; - s32 flags; + s32 randomizationFlags; s32 mask; s32 sp184; f32 sp180; @@ -4909,11 +4909,11 @@ void func_80054FD0(Object *racerObj, Object_Racer *racer, s32 updateRate) { sp190 = 0; D_8011D548 = 0; D_8011D54C = 0; - flags = 0; + randomizationFlags = 0; if (racer->playerIndex != PLAYER_COMPUTER || racer->vehicleIDPrev < VEHICLE_BOSSES) { - flags = func_80017248(racerObj, 4, &sp190, &racer->unkD8, sp134, spE0, sp58); + randomizationFlags = func_80017248(racerObj, 4, &sp190, &racer->unkD8, sp134, spE0, sp58); } - if (flags & 0x80) { + if (randomizationFlags & 0x80) { for (i = 0; i < 4; i++) { D_8011D548 = D_8011D548 + sp134[i * 3 + 0]; D_8011D54C = D_8011D54C + sp134[i * 3 + 2]; @@ -4923,10 +4923,10 @@ void func_80054FD0(Object *racerObj, Object_Racer *racer, s32 updateRate) { D_8011D548 = D_8011D548 - racerObj->segment.trans.x_position; D_8011D54C = D_8011D54C - racerObj->segment.trans.z_position; sp130 = TRUE; - flags &= ~0x80; + randomizationFlags &= ~0x80; } sp5C = 0; - if (flags) { + if (randomizationFlags) { sp178 = 0; for (i = 0; i < 4; i++) { sp178 += sp134[i * 3 + 1]; @@ -4982,16 +4982,16 @@ void func_80054FD0(Object *racerObj, Object_Racer *racer, s32 updateRate) { racer->squish_timer = 60; } } - racer->unk1E4 = flags; - racer->unk1E3 |= flags; + racer->unk1E4 = randomizationFlags; + racer->unk1E3 |= randomizationFlags; racer->groundedWheels = 0; - flags = 1; + randomizationFlags = 1; for (j = 0; j < 4; j++) { - if (racer->unk1E3 & flags) { + if (racer->unk1E3 & randomizationFlags) { racer->groundedWheels++; } - flags <<= 1; + randomizationFlags <<= 1; } for (i = 0; i < 12; i++) { @@ -5081,7 +5081,7 @@ void onscreen_ai_racer_physics(Object *obj, Object_Racer *racer, UNUSED s32 upda f32 angleZ; f32 distance; s32 hasCollision; - s32 flags; + s32 randomizationFlags; s32 temp_v1_2; f32 xTemp; f32 yTemp; @@ -5107,24 +5107,24 @@ void onscreen_ai_racer_physics(Object *obj, Object_Racer *racer, UNUSED s32 upda D_8011D548 = 0.0f; D_8011D54C = 0.0f; hasCollision = FALSE; - flags = 0; + randomizationFlags = 0; if (racer->playerIndex != PLAYER_COMPUTER || racer->vehicleIDPrev < VEHICLE_BOSSES) { - flags = func_80017248(obj, 1, &hasCollision, &racer->unkD8, &tempPos.x, &radius, &surface); + randomizationFlags = func_80017248(obj, 1, &hasCollision, &racer->unkD8, &tempPos.x, &radius, &surface); } - if (flags & 0x80) { + if (randomizationFlags & 0x80) { D_8011D548 = tempPos.x - obj->segment.trans.x_position; D_8011D54C = tempPos.z - obj->segment.trans.z_position; - flags &= ~0x80; + randomizationFlags &= ~0x80; } shouldSquish = FALSE; - if (flags && tempPos.y < obj->segment.trans.y_position - 4.0) { + if (randomizationFlags && tempPos.y < obj->segment.trans.y_position - 4.0) { shouldSquish = TRUE; } func_80031130(1, &racer->unkD8.x, &tempPos.x, racer->vehicleID); hasCollision = FALSE; racer->unk1E3 = func_80031600(&racer->unkD8.x, &tempPos.x, &radius, &surface, TRUE, &hasCollision); - racer->unk1E4 = flags; - racer->unk1E3 |= flags; + racer->unk1E4 = randomizationFlags; + racer->unk1E3 |= randomizationFlags; racer->groundedWheels = 0; if (racer->unk1E3) { racer->unk1E3 = 0x8 | 0x4 | 0x2 | 0x1; @@ -6797,7 +6797,7 @@ s32 set_ghost_position_and_rotation(Object *obj) { } obj->segment.trans.rotation.z_rotation = rot + (s32) (rotDiff * catmullX); - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; obj->segment.object.segmentID = get_level_segment_index_from_position( obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position); if (ghostNodeCount == (commonUnk0s32 + 3)) { @@ -7489,7 +7489,7 @@ void func_8005B818(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR racer->unkFC.x = obj->segment.trans.x_position; racer->unkFC.y = obj->segment.trans.y_position; racer->unkFC.z = obj->segment.trans.z_position; - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; func_800AF714(obj, updateRate); } diff --git a/src/tracks.c b/src/tracks.c index dc57d646..a80f84fd 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -2587,7 +2587,7 @@ void render_object_shadow(Object *obj, ShadowData *shadow) { s32 numTris; Vertex *vtx; Triangle *tri; - s32 flags; + s32 randomizationFlags; UNUSED s32 offsetX_2; s32 offsetY_2; s32 offsetY; @@ -2605,16 +2605,16 @@ void render_object_shadow(Object *obj, ShadowData *shadow) { gCurrentShadowTris = gShadowHeapTris[D_8011B0CC]; gCurrentShadowVerts = gShadowHeapVerts[D_8011B0CC]; alpha = gCurrentShadowVerts[gCurrentShadowTexture[i].yOffset].a; - flags = RENDER_FOG_ACTIVE | RENDER_Z_COMPARE; + randomizationFlags = RENDER_FOG_ACTIVE | RENDER_Z_COMPARE; if (alpha == 0 || obj->segment.object.opacity == 0) { i = shadow->meshEnd; // It'd be easier to just return... } else if (alpha != 255 || obj->segment.object.opacity != 255) { - flags = RENDER_FOG_ACTIVE | RENDER_SEMI_TRANSPARENT | RENDER_Z_COMPARE; + randomizationFlags = RENDER_FOG_ACTIVE | RENDER_SEMI_TRANSPARENT | RENDER_Z_COMPARE; alpha = (obj->segment.object.opacity * alpha) >> 8; gDPSetPrimColor(gSceneCurrDisplayList++, 0, 0, 255, 255, 255, alpha); } while (i < shadow->meshEnd) { - load_and_set_texture_no_offset(&gSceneCurrDisplayList, gCurrentShadowTexture[i].texture, flags); + load_and_set_texture_no_offset(&gSceneCurrDisplayList, gCurrentShadowTexture[i].texture, randomizationFlags); // I hope we can clean this part up. offsetX_2 = offsetX = gCurrentShadowTexture[i].xOffset; // Fakematch offsetY_2 = offsetY = gCurrentShadowTexture[i].yOffset; @@ -2627,7 +2627,7 @@ void render_object_shadow(Object *obj, ShadowData *shadow) { i++; } - if (flags != RENDER_Z_COMPARE) { + if (randomizationFlags != RENDER_Z_COMPARE) { gDPSetPrimColor(gSceneCurrDisplayList++, 0, 0, 255, 255, 255, 255); } } @@ -2644,7 +2644,7 @@ void render_object_water_effects(Object *obj, WaterEffect *effect) { s32 numTris; Vertex *vtx; Triangle *tri; - s32 flags; + s32 randomizationFlags; UNUSED s32 offsetX; UNUSED s32 offsetY; @@ -2660,12 +2660,12 @@ void render_object_water_effects(Object *obj, WaterEffect *effect) { i = effect->meshEnd; // Just return. } } - flags = RENDER_FOG_ACTIVE | RENDER_Z_COMPARE; + randomizationFlags = RENDER_FOG_ACTIVE | RENDER_Z_COMPARE; gCurrentShadowTexture = gShadowHeapTextures[gShadowIndex]; gCurrentShadowTris = gShadowHeapTris[gShadowIndex]; gCurrentShadowVerts = gShadowHeapVerts[gShadowIndex]; while (i < effect->meshEnd) { - load_and_set_texture_no_offset(&gSceneCurrDisplayList, gCurrentShadowTexture[i].texture, flags); + load_and_set_texture_no_offset(&gSceneCurrDisplayList, gCurrentShadowTexture[i].texture, randomizationFlags); offsetX = gCurrentShadowTexture[i].xOffset; // Fakematch offsetY = gCurrentShadowTexture[i].yOffset; // Fakematch numTris = gCurrentShadowTexture[i + 1].xOffset - gCurrentShadowTexture[i].xOffset; diff --git a/src/vehicle_bluey.c b/src/vehicle_bluey.c index 4524de60..8319d9cf 100644 --- a/src/vehicle_bluey.c +++ b/src/vehicle_bluey.c @@ -168,10 +168,10 @@ void update_bluey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *ra } animFrame = obj->segment.animFrame; obj->segment.animFrame = racer->animationSpeed; - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; if (obj->segment.object.animationID == ANIM_BLUEY_RUN) { play_footstep_sounds(obj, 2, animFrame, SOUND_STOMP2, SOUND_STOMP3); - obj->particleEmitFlags |= OBJ_EMIT_1 | OBJ_EMIT_2; + obj->particleEmittersEnabled |= OBJ_EMIT_1 | OBJ_EMIT_2; } obj_spawn_particle(obj, updateRate); fade_when_near_camera(obj, racer, 40); diff --git a/src/vehicle_bubbler.c b/src/vehicle_bubbler.c index 9dd3236c..00bd4c42 100644 --- a/src/vehicle_bubbler.c +++ b/src/vehicle_bubbler.c @@ -139,7 +139,7 @@ void update_bubbler(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer * spawn_boss_hazard(obj, racer, 0.0f, objectID, SOUND_VOICE_BUBBLER_HOHO2); } } - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; obj_spawn_particle(obj, updateRate); fade_when_near_camera(obj, racer, 40); switch (obj->segment.object.animationID) { diff --git a/src/vehicle_rocket.c b/src/vehicle_rocket.c index 0747cd85..e75aa1b2 100644 --- a/src/vehicle_rocket.c +++ b/src/vehicle_rocket.c @@ -85,7 +85,7 @@ void update_rocket(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r func_80049794(updateRate, updateRateF, obj, racer); racer->vehicleID = racer->vehicleIDPrev; *startTimer = tempStartTimer; - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; racer->headAngle = tempHeadAngle; obj->segment.object.animationID = animID; obj->segment.animFrame = animFrame; @@ -128,7 +128,7 @@ void update_rocket(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->animationSpeed = 0.0f; } obj->segment.animFrame = racer->animationSpeed; - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; func_800AF714(obj, updateRate); fade_when_near_camera(obj, racer, 40); if (*startTimer != 100) { diff --git a/src/vehicle_smokey.c b/src/vehicle_smokey.c index c3d7543a..27fa6c18 100644 --- a/src/vehicle_smokey.c +++ b/src/vehicle_smokey.c @@ -100,7 +100,7 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r func_80049794(updateRate, updateRateF, obj, racer); racer->vehicleID = racer->vehicleIDPrev; *startTimer = headAngleRange; - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; racer->headAngle = tempHeadAngle; obj->segment.object.animationID = animID; obj->segment.animFrame = animFrame; @@ -219,7 +219,7 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r animFrame = obj->segment.animFrame; obj->segment.animFrame = racer->animationSpeed; stepFrame = obj->segment.animFrame >> 4; - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; if (obj->segment.object.animationID != ANIM_SMOKEY_RUN && obj->segment.object.animationID != 2) { animFrame >>= 4; stepFrame = 1; diff --git a/src/vehicle_tricky.c b/src/vehicle_tricky.c index 642e79dd..fff21263 100644 --- a/src/vehicle_tricky.c +++ b/src/vehicle_tricky.c @@ -160,10 +160,10 @@ void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } animFrame = obj->segment.animFrame; obj->segment.animFrame = racer->animationSpeed; - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; if (obj->segment.object.animationID == ANIM_TRICKY_RUN) { play_footstep_sounds(obj, 2, animFrame, SOUND_STOMP2, SOUND_STOMP3); - obj->particleEmitFlags |= OBJ_EMIT_1 | OBJ_EMIT_2; + obj->particleEmittersEnabled |= OBJ_EMIT_1 | OBJ_EMIT_2; } obj_spawn_particle(obj, updateRate); fade_when_near_camera(obj, racer, 120); diff --git a/src/vehicle_wizpig.c b/src/vehicle_wizpig.c index 71c6bc5d..dd5473c6 100644 --- a/src/vehicle_wizpig.c +++ b/src/vehicle_wizpig.c @@ -91,7 +91,7 @@ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r func_80049794(updateRate, updateRateF, obj, racer); racer->vehicleID = racer->vehicleIDPrev; *startTimer = tempStartTimer; - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; racer->headAngle = tempHeadAngle; obj->segment.object.animationID = animID; obj->segment.animFrame = animFrame; @@ -218,7 +218,7 @@ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } animFrame = obj->segment.animFrame; obj->segment.animFrame = racer->animationSpeed; - obj->particleEmitFlags = OBJ_EMIT_NONE; + obj->particleEmittersEnabled = OBJ_EMIT_NONE; if (obj->segment.object.animationID == ANIM_WIZPIG_RUN) { play_footstep_sounds(obj, 2, animFrame, SOUND_STOMP2, SOUND_STOMP3); } diff --git a/ver/symbols/symbol_addrs.jpn.v79.txt b/ver/symbols/symbol_addrs.jpn.v79.txt index 9f63fcc3..18100d1b 100644 --- a/ver/symbols/symbol_addrs.jpn.v79.txt +++ b/ver/symbols/symbol_addrs.jpn.v79.txt @@ -216,7 +216,7 @@ get_object = 0x8000E948; objGetObjList = 0x8000E988; obj_count = 0x8000E9B0; particle_count = 0x8000E9C0; -func_8000E9D0 = 0x8000E9D0; +add_particle_to_entity_list = 0x8000E9D0; spawn_object = 0x8000EA54; objFreeAssets = 0x8000F648; light_setup_light_sources = 0x8000F758; @@ -1626,14 +1626,14 @@ func_800AE270 = 0x800AE870; func_800AE2A0 = 0x800AE8A0; func_800AE2D8 = 0x800AE8D8; free_particle_buffers = 0x800AE974; -free_particle_vertex_triangles = 0x800AEA38; +free_particle_vertices_triangles = 0x800AEA38; free_particle_assets = 0x800AEA90; init_particle_assets = 0x800AEB30; init_particle_buffers = 0x800AED28; generate_particle_shape_triangle = 0x800AF414; generate_particle_shape_quad = 0x800AF4B8; generate_particle_shape_line = 0x800AF588; -generate_particle_shape_sprite = 0x800AF624; +generate_particle_shape_point = 0x800AF624; func_800AF0A4 = 0x800AF6A4; func_800AF0F0 = 0x800AF6F0; func_800AF134 = 0x800AF734; @@ -1645,21 +1645,21 @@ func_800AF6E4 = 0x800AFCE4; func_800AF714 = 0x800AFD14; obj_spawn_particle = 0x800B023C; func_800AFE5C = 0x800B045C; -func_800B0010 = 0x800B0610; -func_800B03C0 = 0x800B09C0; -func_800B0698 = 0x800B0C98; -func_800B0BAC = 0x800B11AC; -func_800B1130 = 0x800B1730; -func_800B1CB8 = 0x800B22B8; -func_800B2040 = 0x800B2640; +setup_particle_velocity = 0x800B0610; +setup_particle_position = 0x800B09C0; +init_point_particle = 0x800B0C98; +init_line_particle = 0x800B11AC; +init_general_particle = 0x800B1730; +particle_allocate = 0x800B22B8; +particle_deallocate = 0x800B2640; func_800B2260 = 0x800B2860; handle_particle_movement = 0x800B28FC; func_800B263C = 0x800B2C3C; -func_800B26E0 = 0x800B2CE0; +move_line_particle = 0x800B2CE0; set_particle_texture_frame = 0x800B35BC; move_particle_basic_parent = 0x800B3740; move_particle_velocity_parent = 0x800B3840; -move_particle_with_velocities = 0x800B3958; +move_particle_with_acceleration = 0x800B3958; move_particle_basic = 0x800B3AB0; move_particle_with_velocity = 0x800B3B64; render_active_particles = 0x800B3C78; @@ -2816,15 +2816,15 @@ gTriangleParticleBuffer = 0x800E4798; gNumRectangleParticles = 0x800E479C; D_800E2CB0 = 0x800E47A0; gRectangleParticleBuffer = 0x800E47A4; -gNumPointParticles = 0x800E47A8; +gNumSpriteParticles = 0x800E47A8; D_800E2CBC = 0x800E47AC; -gPointParticleBuffer = 0x800E47B0; +gSpriteParticleBuffer = 0x800E47B0; gNumLineParticles = 0x800E47B4; D_800E2CC8 = 0x800E47B8; gLineParticleBuffer = 0x800E47BC; -gNumSpriteParticles = 0x800E47C0; +gNumPointParticles = 0x800E47C0; D_800E2CD4 = 0x800E47C4; -gSpriteParticleBuffer = 0x800E47C8; +gPointParticleBuffer = 0x800E47C8; D_800E2CDC = 0x800E47CC; gParticleVertexBuffer = 0x800E47D0; gParticleTriangleBuffer = 0x800E47D4; @@ -2843,9 +2843,9 @@ D_800E2E28 = 0x800E4918; gParticleGravityTable = 0x800E491C; gMaxTriangleParticles = 0x800E493C; gMaxRectangleParticles = 0x800E4940; -gMaxPointParticles = 0x800E4944; +gMaxSpriteParticles = 0x800E4944; gMaxLineParticles = 0x800E4948; -gMaxSpriteParticles = 0x800E494C; +gMaxPointParticles = 0x800E494C; D_800E2E60 = 0x800E4950; D_800E2E64 = 0x800E4954; gParticleCoordListTri = 0x800E4958; diff --git a/ver/symbols/symbol_addrs.pal.v77.txt b/ver/symbols/symbol_addrs.pal.v77.txt index 2855ce76..2de11513 100644 --- a/ver/symbols/symbol_addrs.pal.v77.txt +++ b/ver/symbols/symbol_addrs.pal.v77.txt @@ -216,7 +216,7 @@ get_object = 0x8000E948; objGetObjList = 0x8000E988; obj_count = 0x8000E9B0; particle_count = 0x8000E9C0; -func_8000E9D0 = 0x8000E9D0; +add_particle_to_entity_list = 0x8000E9D0; spawn_object = 0x8000EA54; objFreeAssets = 0x8000F648; light_setup_light_sources = 0x8000F758; @@ -1615,14 +1615,14 @@ func_800AE270 = 0x800AE300; func_800AE2A0 = 0x800AE330; func_800AE2D8 = 0x800AE368; free_particle_buffers = 0x800AE404; -free_particle_vertex_triangles = 0x800AE4C8; +free_particle_vertices_triangles = 0x800AE4C8; free_particle_assets = 0x800AE520; init_particle_assets = 0x800AE5C0; init_particle_buffers = 0x800AE7B8; generate_particle_shape_triangle = 0x800AEEA4; generate_particle_shape_quad = 0x800AEF48; generate_particle_shape_line = 0x800AF018; -generate_particle_shape_sprite = 0x800AF0B4; +generate_particle_shape_point = 0x800AF0B4; func_800AF0A4 = 0x800AF134; func_800AF0F0 = 0x800AF180; func_800AF134 = 0x800AF1C4; @@ -1634,21 +1634,21 @@ func_800AF6E4 = 0x800AF774; func_800AF714 = 0x800AF7A4; obj_spawn_particle = 0x800AFCCC; func_800AFE5C = 0x800AFEEC; -func_800B0010 = 0x800B00A0; -func_800B03C0 = 0x800B0450; -func_800B0698 = 0x800B0728; -func_800B0BAC = 0x800B0C3C; -func_800B1130 = 0x800B11C0; -func_800B1CB8 = 0x800B1D48; -func_800B2040 = 0x800B20D0; +setup_particle_velocity = 0x800B00A0; +setup_particle_position = 0x800B0450; +init_point_particle = 0x800B0728; +init_line_particle = 0x800B0C3C; +init_general_particle = 0x800B11C0; +particle_allocate = 0x800B1D48; +particle_deallocate = 0x800B20D0; func_800B2260 = 0x800B22F0; handle_particle_movement = 0x800B238C; func_800B263C = 0x800B26CC; -func_800B26E0 = 0x800B2770; +move_line_particle = 0x800B2770; set_particle_texture_frame = 0x800B304C; move_particle_basic_parent = 0x800B31D0; move_particle_velocity_parent = 0x800B32D0; -move_particle_with_velocities = 0x800B33E8; +move_particle_with_acceleration = 0x800B33E8; move_particle_basic = 0x800B3540; move_particle_with_velocity = 0x800B35F4; render_active_particles = 0x800B3708; @@ -2656,15 +2656,15 @@ gTriangleParticleBuffer = 0x800E2D38; gNumRectangleParticles = 0x800E2D3C; D_800E2CB0 = 0x800E2D40; gRectangleParticleBuffer = 0x800E2D44; -gNumPointParticles = 0x800E2D48; +gNumSpriteParticles = 0x800E2D48; D_800E2CBC = 0x800E2D4C; -gPointParticleBuffer = 0x800E2D50; +gSpriteParticleBuffer = 0x800E2D50; gNumLineParticles = 0x800E2D54; D_800E2CC8 = 0x800E2D58; gLineParticleBuffer = 0x800E2D5C; -gNumSpriteParticles = 0x800E2D60; +gNumPointParticles = 0x800E2D60; D_800E2CD4 = 0x800E2D64; -gSpriteParticleBuffer = 0x800E2D68; +gPointParticleBuffer = 0x800E2D68; D_800E2CDC = 0x800E2D6C; gParticleVertexBuffer = 0x800E2D70; gParticleTriangleBuffer = 0x800E2D74; @@ -2683,9 +2683,9 @@ D_800E2E28 = 0x800E2EB8; gParticleGravityTable = 0x800E2EBC; gMaxTriangleParticles = 0x800E2EDC; gMaxRectangleParticles = 0x800E2EE0; -gMaxPointParticles = 0x800E2EE4; +gMaxSpriteParticles = 0x800E2EE4; gMaxLineParticles = 0x800E2EE8; -gMaxSpriteParticles = 0x800E2EEC; +gMaxPointParticles = 0x800E2EEC; D_800E2E60 = 0x800E2EF0; D_800E2E64 = 0x800E2EF4; gParticleCoordListTri = 0x800E2EF8; diff --git a/ver/symbols/symbol_addrs.pal.v80.txt b/ver/symbols/symbol_addrs.pal.v80.txt index e4bbdc95..80a2e3ba 100644 --- a/ver/symbols/symbol_addrs.pal.v80.txt +++ b/ver/symbols/symbol_addrs.pal.v80.txt @@ -216,7 +216,7 @@ get_object = 0x8000E948; objGetObjList = 0x8000E988; obj_count = 0x8000E9B0; particle_count = 0x8000E9C0; -func_8000E9D0 = 0x8000E9D0; +add_particle_to_entity_list = 0x8000E9D0; spawn_object = 0x8000EA54; objFreeAssets = 0x8000F648; light_setup_light_sources = 0x8000F758; @@ -1536,14 +1536,14 @@ func_800AE270 = 0x800AE860; func_800AE2A0 = 0x800AE890; func_800AE2D8 = 0x800AE8C8; free_particle_buffers = 0x800AE964; -free_particle_vertex_triangles = 0x800AEA28; +free_particle_vertices_triangles = 0x800AEA28; free_particle_assets = 0x800AEA80; init_particle_assets = 0x800AEB20; init_particle_buffers = 0x800AED18; generate_particle_shape_triangle = 0x800AF404; generate_particle_shape_quad = 0x800AF4A8; generate_particle_shape_line = 0x800AF578; -generate_particle_shape_sprite = 0x800AF614; +generate_particle_shape_point = 0x800AF614; func_800AF0A4 = 0x800AF694; func_800AF0F0 = 0x800AF6E0; func_800AF134 = 0x800AF724; @@ -1555,21 +1555,21 @@ func_800AF6E4 = 0x800AFCD4; func_800AF714 = 0x800AFD04; obj_spawn_particle = 0x800B022C; func_800AFE5C = 0x800B044C; -func_800B0010 = 0x800B0600; -func_800B03C0 = 0x800B09B0; -func_800B0698 = 0x800B0C88; -func_800B0BAC = 0x800B119C; -func_800B1130 = 0x800B1720; -func_800B1CB8 = 0x800B22A8; -func_800B2040 = 0x800B2630; +setup_particle_velocity = 0x800B0600; +setup_particle_position = 0x800B09B0; +init_point_particle = 0x800B0C88; +init_line_particle = 0x800B119C; +init_general_particle = 0x800B1720; +particle_allocate = 0x800B22A8; +particle_deallocate = 0x800B2630; func_800B2260 = 0x800B2850; handle_particle_movement = 0x800B28EC; func_800B263C = 0x800B2C2C; -func_800B26E0 = 0x800B2CD0; +move_line_particle = 0x800B2CD0; set_particle_texture_frame = 0x800B35AC; move_particle_basic_parent = 0x800B3730; move_particle_velocity_parent = 0x800B3830; -move_particle_with_velocities = 0x800B3948; +move_particle_with_acceleration = 0x800B3948; move_particle_basic = 0x800B3AA0; move_particle_with_velocity = 0x800B3B54; render_active_particles = 0x800B3C68; @@ -2585,15 +2585,15 @@ gTriangleParticleBuffer = 0x800E32C8; gNumRectangleParticles = 0x800E32CC; D_800E2CB0 = 0x800E32D0; gRectangleParticleBuffer = 0x800E32D4; -gNumPointParticles = 0x800E32D8; +gNumSpriteParticles = 0x800E32D8; D_800E2CBC = 0x800E32DC; -gPointParticleBuffer = 0x800E32E0; +gSpriteParticleBuffer = 0x800E32E0; gNumLineParticles = 0x800E32E4; D_800E2CC8 = 0x800E32E8; gLineParticleBuffer = 0x800E32EC; -gNumSpriteParticles = 0x800E32F0; +gNumPointParticles = 0x800E32F0; D_800E2CD4 = 0x800E32F4; -gSpriteParticleBuffer = 0x800E32F8; +gPointParticleBuffer = 0x800E32F8; D_800E2CDC = 0x800E32FC; gParticleVertexBuffer = 0x800E3300; gParticleTriangleBuffer = 0x800E3304; @@ -2612,9 +2612,9 @@ D_800E2E28 = 0x800E3448; gParticleGravityTable = 0x800E344C; gMaxTriangleParticles = 0x800E346C; gMaxRectangleParticles = 0x800E3470; -gMaxPointParticles = 0x800E3474; +gMaxSpriteParticles = 0x800E3474; gMaxLineParticles = 0x800E3478; -gMaxSpriteParticles = 0x800E347C; +gMaxPointParticles = 0x800E347C; D_800E2E60 = 0x800E3480; D_800E2E64 = 0x800E3484; gParticleCoordListTri = 0x800E3488; diff --git a/ver/symbols/symbol_addrs.us.v77.txt b/ver/symbols/symbol_addrs.us.v77.txt index 795e2dac..ba71da76 100644 --- a/ver/symbols/symbol_addrs.us.v77.txt +++ b/ver/symbols/symbol_addrs.us.v77.txt @@ -216,7 +216,7 @@ get_object = 0x8000E948; objGetObjList = 0x8000E988; obj_count = 0x8000E9B0; particle_count = 0x8000E9C0; -func_8000E9D0 = 0x8000E9D0; +add_particle_to_entity_list = 0x8000E9D0; spawn_object = 0x8000EA54; objFreeAssets = 0x8000F648; light_setup_light_sources = 0x8000F758; @@ -1621,14 +1621,14 @@ func_800AE270 = 0x800AE270; func_800AE2A0 = 0x800AE2A0; func_800AE2D8 = 0x800AE2D8; free_particle_buffers = 0x800AE374; -free_particle_vertex_triangles = 0x800AE438; +free_particle_vertices_triangles = 0x800AE438; free_particle_assets = 0x800AE490; init_particle_assets = 0x800AE530; init_particle_buffers = 0x800AE728; generate_particle_shape_triangle = 0x800AEE14; generate_particle_shape_quad = 0x800AEEB8; generate_particle_shape_line = 0x800AEF88; -generate_particle_shape_sprite = 0x800AF024; +generate_particle_shape_point = 0x800AF024; func_800AF0A4 = 0x800AF0A4; func_800AF0F0 = 0x800AF0F0; func_800AF134 = 0x800AF134; @@ -1640,21 +1640,21 @@ func_800AF6E4 = 0x800AF6E4; func_800AF714 = 0x800AF714; obj_spawn_particle = 0x800AFC3C; func_800AFE5C = 0x800AFE5C; -func_800B0010 = 0x800B0010; -func_800B03C0 = 0x800B03C0; -func_800B0698 = 0x800B0698; -func_800B0BAC = 0x800B0BAC; -func_800B1130 = 0x800B1130; -func_800B1CB8 = 0x800B1CB8; -func_800B2040 = 0x800B2040; +setup_particle_velocity = 0x800B0010; +setup_particle_position = 0x800B03C0; +init_point_particle = 0x800B0698; +init_line_particle = 0x800B0BAC; +init_general_particle = 0x800B1130; +particle_allocate = 0x800B1CB8; +particle_deallocate = 0x800B2040; func_800B2260 = 0x800B2260; handle_particle_movement = 0x800B22FC; func_800B263C = 0x800B263C; -func_800B26E0 = 0x800B26E0; +move_line_particle = 0x800B26E0; set_particle_texture_frame = 0x800B2FBC; move_particle_basic_parent = 0x800B3140; move_particle_velocity_parent = 0x800B3240; -move_particle_with_velocities = 0x800B3358; +move_particle_with_acceleration = 0x800B3358; move_particle_basic = 0x800B34B0; move_particle_with_velocity = 0x800B3564; render_active_particles = 0x800B3678; @@ -2807,15 +2807,15 @@ gTriangleParticleBuffer = 0x800E2CA8; gNumRectangleParticles = 0x800E2CAC; D_800E2CB0 = 0x800E2CB0; gRectangleParticleBuffer = 0x800E2CB4; -gNumPointParticles = 0x800E2CB8; +gNumSpriteParticles = 0x800E2CB8; D_800E2CBC = 0x800E2CBC; -gPointParticleBuffer = 0x800E2CC0; +gSpriteParticleBuffer = 0x800E2CC0; gNumLineParticles = 0x800E2CC4; D_800E2CC8 = 0x800E2CC8; gLineParticleBuffer = 0x800E2CCC; -gNumSpriteParticles = 0x800E2CD0; +gNumPointParticles = 0x800E2CD0; D_800E2CD4 = 0x800E2CD4; -gSpriteParticleBuffer = 0x800E2CD8; +gPointParticleBuffer = 0x800E2CD8; D_800E2CDC = 0x800E2CDC; gParticleVertexBuffer = 0x800E2CE0; gParticleTriangleBuffer = 0x800E2CE4; @@ -2834,9 +2834,9 @@ D_800E2E28 = 0x800E2E28; gParticleGravityTable = 0x800E2E2C; gMaxTriangleParticles = 0x800E2E4C; gMaxRectangleParticles = 0x800E2E50; -gMaxPointParticles = 0x800E2E54; +gMaxSpriteParticles = 0x800E2E54; gMaxLineParticles = 0x800E2E58; -gMaxSpriteParticles = 0x800E2E5C; +gMaxPointParticles = 0x800E2E5C; D_800E2E60 = 0x800E2E60; D_800E2E64 = 0x800E2E64; gParticleCoordListTri = 0x800E2E68; diff --git a/ver/symbols/symbol_addrs.us.v80.txt b/ver/symbols/symbol_addrs.us.v80.txt index bf51e179..34458b75 100644 --- a/ver/symbols/symbol_addrs.us.v80.txt +++ b/ver/symbols/symbol_addrs.us.v80.txt @@ -216,7 +216,7 @@ get_object = 0x8000E948; objGetObjList = 0x8000E988; obj_count = 0x8000E9B0; particle_count = 0x8000E9C0; -func_8000E9D0 = 0x8000E9D0; +add_particle_to_entity_list = 0x8000E9D0; spawn_object = 0x8000EA54; objFreeAssets = 0x8000F648; light_setup_light_sources = 0x8000F758; @@ -1535,14 +1535,14 @@ func_800AE270 = 0x800AE7D0; func_800AE2A0 = 0x800AE800; func_800AE2D8 = 0x800AE838; free_particle_buffers = 0x800AE8D4; -free_particle_vertex_triangles = 0x800AE998; +free_particle_vertices_triangles = 0x800AE998; free_particle_assets = 0x800AE9F0; init_particle_assets = 0x800AEA90; init_particle_buffers = 0x800AEC88; generate_particle_shape_triangle = 0x800AF374; generate_particle_shape_quad = 0x800AF418; generate_particle_shape_line = 0x800AF4E8; -generate_particle_shape_sprite = 0x800AF584; +generate_particle_shape_point = 0x800AF584; func_800AF0A4 = 0x800AF604; func_800AF0F0 = 0x800AF650; func_800AF134 = 0x800AF694; @@ -1554,21 +1554,21 @@ func_800AF6E4 = 0x800AFC44; func_800AF714 = 0x800AFC74; obj_spawn_particle = 0x800B019C; func_800AFE5C = 0x800B03BC; -func_800B0010 = 0x800B0570; -func_800B03C0 = 0x800B0920; -func_800B0698 = 0x800B0BF8; -func_800B0BAC = 0x800B110C; -func_800B1130 = 0x800B1690; -func_800B1CB8 = 0x800B2218; -func_800B2040 = 0x800B25A0; +setup_particle_velocity = 0x800B0570; +setup_particle_position = 0x800B0920; +init_point_particle = 0x800B0BF8; +init_line_particle = 0x800B110C; +init_general_particle = 0x800B1690; +particle_allocate = 0x800B2218; +particle_deallocate = 0x800B25A0; func_800B2260 = 0x800B27C0; handle_particle_movement = 0x800B285C; func_800B263C = 0x800B2B9C; -func_800B26E0 = 0x800B2C40; +move_line_particle = 0x800B2C40; set_particle_texture_frame = 0x800B351C; move_particle_basic_parent = 0x800B36A0; move_particle_velocity_parent = 0x800B37A0; -move_particle_with_velocities = 0x800B38B8; +move_particle_with_acceleration = 0x800B38B8; move_particle_basic = 0x800B3A10; move_particle_with_velocity = 0x800B3AC4; render_active_particles = 0x800B3BD8; @@ -2582,15 +2582,15 @@ gTriangleParticleBuffer = 0x800E3238; gNumRectangleParticles = 0x800E323C; D_800E2CB0 = 0x800E3240; gRectangleParticleBuffer = 0x800E3244; -gNumPointParticles = 0x800E3248; +gNumSpriteParticles = 0x800E3248; D_800E2CBC = 0x800E324C; -gPointParticleBuffer = 0x800E3250; +gSpriteParticleBuffer = 0x800E3250; gNumLineParticles = 0x800E3254; D_800E2CC8 = 0x800E3258; gLineParticleBuffer = 0x800E325C; -gNumSpriteParticles = 0x800E3260; +gNumPointParticles = 0x800E3260; D_800E2CD4 = 0x800E3264; -gSpriteParticleBuffer = 0x800E3268; +gPointParticleBuffer = 0x800E3268; D_800E2CDC = 0x800E326C; gParticleVertexBuffer = 0x800E3270; gParticleTriangleBuffer = 0x800E3274; @@ -2609,9 +2609,9 @@ D_800E2E28 = 0x800E33B8; gParticleGravityTable = 0x800E33BC; gMaxTriangleParticles = 0x800E33DC; gMaxRectangleParticles = 0x800E33E0; -gMaxPointParticles = 0x800E33E4; +gMaxSpriteParticles = 0x800E33E4; gMaxLineParticles = 0x800E33E8; -gMaxSpriteParticles = 0x800E33EC; +gMaxPointParticles = 0x800E33EC; D_800E2E60 = 0x800E33F0; D_800E2E64 = 0x800E33F4; gParticleCoordListTri = 0x800E33F8;